Changeset 0b414b5 in mainline for kernel/genarch/src/ofw/ebus.c
- Timestamp:
- 2006-10-02T21:07:23Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 233af8c5
- Parents:
- 36db5ac
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/ofw/ebus.c
r36db5ac r0b414b5 40 40 #include <func.h> 41 41 #include <panic.h> 42 #include <debug.h> 42 43 #include <macros.h> 43 44 … … 74 75 } 75 76 77 bool ofw_ebus_map_interrupts(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uint32_t interrupt, int *ino) 78 { 79 ofw_tree_property_t *prop; 80 ofw_tree_node_t *controller; 81 82 prop = ofw_tree_getprop(node, "interrupt-map"); 83 if (!prop || !prop->value) 84 return false; 85 86 ofw_ebus_intr_map_t *intr_map = prop->value; 87 count_t count = prop->size / sizeof(ofw_ebus_intr_map_t); 88 89 ASSERT(count); 90 91 prop = ofw_tree_getprop(node, "interrupt-map-mask"); 92 if (!prop || !prop->value) 93 return false; 94 95 ofw_ebus_intr_mask_t *intr_mask = prop->value; 96 97 ASSERT(prop->size == sizeof(ofw_ebus_intr_mask_t)); 98 99 uint32_t space = reg->space & intr_mask->space_mask; 100 uint32_t addr = reg->addr & intr_mask->addr_mask; 101 uint32_t intr = interrupt & intr_mask->intr_mask; 102 103 int i; 104 for (i = 0; i < count; i++) { 105 if ((intr_map[i].space == space) && (intr_map[i].addr == addr) 106 && (intr_map[i].intr == intr)) 107 goto found; 108 } 109 return false; 110 111 found: 112 /* 113 * We found the device that functions as an interrupt controller 114 * for the interrupt. We also found mapping from interrupt to INO. 115 */ 116 117 controller = ofw_tree_find_node_by_handle(ofw_tree_lookup("/"), intr_map[i].controller_handle); 118 119 *ino = intr_map[i].controller_ino; 120 return true; 121 } 122 76 123 /** @} 77 124 */
Note:
See TracChangeset
for help on using the changeset viewer.