示例#1
0
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;
		}
	}
}
示例#2
0
文件: isa.c 项目: MarginC/kame
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);
}