void isa_init(device_t dev) { device_t bridge; int i; /* The parent of the bus must be a PCI-ISA bridge. */ bridge = device_get_parent(dev); isab_node = ofw_bus_get_node(bridge); isab_nrange = OF_getprop_alloc(isab_node, "ranges", sizeof(*isab_ranges), (void **)&isab_ranges); if (isab_nrange <= 0) panic("isa_init: cannot get bridge range property"); ofw_bus_setup_iinfo(isab_node, &isa_iinfo, sizeof(ofw_isa_intr_t)); isa_setup_children(dev, isab_node); for (i = isab_nrange - 1; i >= 0; i--) { switch(ISAB_RANGE_SPACE(&isab_ranges[i])) { case ISAR_SPACE_IO: /* This is probably always 0. */ isa_io_base = ISAB_RANGE_PHYS(&isab_ranges[i]); isa_io_limit = isab_ranges[i].size; break; case ISAR_SPACE_MEM: /* This is probably always 0. */ isa_mem_base = ISAB_RANGE_PHYS(&isab_ranges[i]); isa_mem_limit = isab_ranges[i].size; break; } } }
void isa_init(device_t dev) { device_t bridge; phandle_t node; u_int32_t ino; struct isa_ranges *br; int nbr, i; /* The parent of the bus must be a PCI-ISA bridge. */ bridge = device_get_parent(dev); isab_node = ofw_pci_node(bridge); nbr = OF_getprop_alloc(isab_node, "ranges", sizeof(*br), (void **)&br); if (nbr <= 0) panic("isa_init: cannot get bridge range property"); /* * This is really a bad kluge; however, it is needed to provide * isa_irq_pending(). */ for (i = 0; i < 8; i++) isa_ino[i] = ORIR_NOTFOUND; for (node = OF_child(isab_node); node != 0; node = OF_peer(node)) { if (OF_getprop(node, "interrupts", &ino, sizeof(ino)) == -1) continue; if (ino > 7) panic("isa_init: XXX: ino too large"); isa_ino[ino] = ofw_bus_route_intr(node, ino, ofw_pci_orb_callback); } for (nbr -= 1; nbr >= 0; nbr--) { switch(ISAB_RANGE_SPACE(br + nbr)) { case ISAR_SPACE_IO: /* This is probably always 0. */ isa_io_base = ISAB_RANGE_PHYS(&br[nbr]); isa_io_limit = br[nbr].size; isa_io_hdl = SPARCBUS_GET_BUS_HANDLE(bridge, SBBT_IO, isa_io_base, &isa_io_bt); break; case ISAR_SPACE_MEM: /* This is probably always 0. */ isa_mem_base = ISAB_RANGE_PHYS(&br[nbr]); isa_mem_limit = br[nbr].size; isa_mem_hdl = SPARCBUS_GET_BUS_HANDLE(bridge, SBBT_MEM, isa_mem_base, &isa_mem_bt); break; } } free(br, M_OFWPROP); }