Date: Sun, 3 Sep 2006 20:15:56 GMT From: John-Mark Gurney <jmg@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 105612 for review Message-ID: <200609032015.k83KFumZ049245@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=105612 Change 105612 by jmg@jmg_csjp on 2006/09/03 20:15:13 route interrupts using the interrupt-map in hv_pci.c... just pass through the setup_intr and teardown_intr... get the immediate subordinate device for setuping up the interrupt in nexus now that hv_pci passes the calls through... This gets mpt working on the T1k: mpt0: MPI Version=1.5.10.0 mpt0: mpt_cam_event: MPI_EVENT_SAS_DEVICE_STATUS_CHANGE da0 at mpt0 bus 0 target 0 lun 0 da0: <ATA HITACHI HDS7280S A6CA> Fixed Direct Access SCSI-5 device da0: 300.000MB/s transfers, Tagged Queueing Enabled da0: 76319MB (156301488 512 byte sectors: 255H 63S/T 9729C) Though apprently doesn't fix ata on the T2k... Affected files ... .. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/hv_pcivar.h#2 edit .. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/hv_pci.c#2 edit .. //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/nexus.c#3 edit Differences ... ==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/include/hv_pcivar.h#2 (text+ko) ==== @@ -31,23 +31,20 @@ #define _HV_PCIVAR_H_ struct hvpci_softc { - devhandle_t hs_devhandle; - phandle_t hs_node; - uint8_t hs_busnum; + devhandle_t hs_devhandle; + phandle_t hs_node; + uint8_t hs_busnum; + + struct ofw_bus_iinfo hs_pci_iinfo; struct bus_dma_tag hs_dmatag; - struct resource *hs_intr[4]; - int hs_intrrefcnt[4]; - - struct rman hs_pci_intr_rman; - - struct rman hs_pci_mem_rman; - bus_space_tag_t hs_pci_memt; + struct rman hs_pci_mem_rman; + bus_space_tag_t hs_pci_memt; bus_space_handle_t hs_pci_memh; - struct rman hs_pci_io_rman; - bus_space_tag_t hs_pci_iot; + struct rman hs_pci_io_rman; + bus_space_tag_t hs_pci_iot; bus_space_handle_t hs_pci_ioh; }; ==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/hv_pci.c#2 (text+ko) ==== @@ -48,6 +48,7 @@ #include <dev/ofw/ofw_bus.h> #include <dev/ofw/ofw_bus_subr.h> +#include <dev/ofw/ofw_pci.h> #include <dev/ofw/openfirm.h> #include <sparc64/pci/ofw_pci.h> @@ -71,8 +72,6 @@ static device_attach_t hvpci_attach; static bus_read_ivar_t hvpci_read_ivar; static bus_write_ivar_t hvpci_write_ivar; -static bus_setup_intr_t hvpci_setup_intr; -static bus_teardown_intr_t hvpci_teardown_intr; static bus_alloc_resource_t hvpci_alloc_resource; static bus_activate_resource_t hvpci_activate_resource; static bus_deactivate_resource_t hvpci_deactivate_resource; @@ -98,8 +97,8 @@ DEVMETHOD(bus_print_child, bus_generic_print_child), DEVMETHOD(bus_read_ivar, hvpci_read_ivar), DEVMETHOD(bus_write_ivar, hvpci_write_ivar), - DEVMETHOD(bus_setup_intr, hvpci_setup_intr), - DEVMETHOD(bus_teardown_intr, hvpci_teardown_intr), + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), DEVMETHOD(bus_alloc_resource, hvpci_alloc_resource), DEVMETHOD(bus_activate_resource, hvpci_activate_resource), DEVMETHOD(bus_deactivate_resource, hvpci_deactivate_resource), @@ -176,14 +175,6 @@ /* Setup the HyperVisor devhandle for this bus */ sc->hs_devhandle = nexus_get_devhandle(dev); - /* initalize intr resources */ - sc->hs_pci_intr_rman.rm_type = RMAN_ARRAY; - sc->hs_pci_intr_rman.rm_descr = "HyperVisor PCI Interrupts"; - if (rman_init(&sc->hs_pci_intr_rman) != 0 || - /* We use 1 (INTA) through 4 (INTD) */ - rman_manage_region(&sc->hs_pci_intr_rman, 1, 4) != 0) - panic("%s: failed to set up intr rman", __func__); - /* Pull in the ra addresses out of OFW */ nrange = OF_getprop_alloc(node, "ranges", sizeof *range, (void **)&range); @@ -248,6 +239,9 @@ free(dvma, M_OFWPROP); + /* Setup ofw imap */ + ofw_bus_setup_iinfo(node, &sc->hs_pci_iinfo, sizeof(ofw_pci_intr_t)); + device_add_child(dev, "pci", -1); return (bus_generic_attach(dev)); @@ -341,8 +335,24 @@ static int hvpci_route_interrupt(device_t bridge, device_t dev, int pin) { + struct hvpci_softc *sc; + struct ofw_pci_register reg; + phandle_t node; + ofw_pci_intr_t pintr, mintr; + int obli; + uint8_t maskbuf[sizeof(reg) + sizeof(pintr)]; - return (pin); + sc = device_get_softc(bridge); + node = ofw_bus_get_node(dev); + pintr = pin; + obli = ofw_bus_lookup_imap(node, &sc->hs_pci_iinfo, ®, sizeof(reg), + &pintr, sizeof(pintr), &mintr, sizeof(mintr), maskbuf); + device_printf(dev, "called hvpci_route_intr: %d, got: mintr: %#x\n", + obli, mintr); + if (obli) + return (mintr); + + panic("pin %d not found in imap of %s", pin, device_get_nameunit(bridge)); } static phandle_t @@ -419,74 +429,6 @@ return (ENOENT); } -static int -hvpci_setup_intr(device_t dev, device_t child, struct resource *ires, - int flags, driver_intr_t *intr, void *arg, void **cookiep) -{ - struct hvpci_softc *sc; - int pciintr, rid; - int error; - - - sc = device_get_softc(dev); - - rid = rman_get_start(ires); - KASSERT(rid >= 1 && rid <= 4, ("interrupt out of range")); - - pciintr = rid - 1; - if (sc->hs_intr[pciintr] == NULL) { - if ((sc->hs_intr[pciintr] = bus_alloc_resource_any(dev, - SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(dev, "couldn't alloc interrupt\n"); - return (ENXIO); - } - sc->hs_intrrefcnt[pciintr] = 1; - } else - sc->hs_intrrefcnt[pciintr]++; - - error = bus_setup_intr(dev, sc->hs_intr[pciintr], flags, intr, arg, - cookiep); - if (error) { - sc->hs_intrrefcnt[pciintr]--; - if (sc->hs_intrrefcnt[pciintr] == 0) { - bus_release_resource(dev, SYS_RES_IRQ, - rman_get_rid(sc->hs_intr[pciintr]), - sc->hs_intr[pciintr]); - sc->hs_intr[pciintr] = NULL; - } - device_printf(dev, "bus_setup_intr: %d\n", error); - return (error); - } - return (0); -} - -static int -hvpci_teardown_intr(device_t dev, device_t child, struct resource *vec, - void *cookie) -{ - struct hvpci_softc *sc; - int pciintr; - int error; - - sc = device_get_softc(dev); - pciintr = rman_get_start(vec); - KASSERT(pciintr >= 1 && pciintr <= 4, ("interrupt out of range")); - pciintr--; - - error = bus_teardown_intr(dev, sc->hs_intr[pciintr], cookie); - if (error) - return (error); - - sc->hs_intrrefcnt[pciintr]--; - if (sc->hs_intrrefcnt[pciintr] == 0) { - bus_release_resource(dev, SYS_RES_IRQ, - rman_get_rid(sc->hs_intr[pciintr]), sc->hs_intr[pciintr]); - sc->hs_intr[pciintr] = NULL; - } - - return (0); -} - static struct resource * hvpci_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -505,11 +447,8 @@ switch (type) { case SYS_RES_IRQ: - if (end - start != 0) - return NULL; - rm = &sc->hs_pci_intr_rman; - bt = NULL; - bh = 0; + return BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, + rid, start, end, count, flags); break; case SYS_RES_MEMORY: @@ -532,12 +471,6 @@ } rv = rman_reserve_resource(rm, start, end, count, flags, child); -#ifdef DEBUG - if (type == SYS_RES_IRQ) { - printf("%s: reserve_resource: start: %ld, end: %ld, flags: %#x, rv: %p\n", - __func__, start, end, flags, rv); - } -#endif if (rv == NULL) return (NULL); ==== //depot/projects/kmacy_sun4v_stable/src/sys/sun4v/sun4v/nexus.c#3 (text+ko) ==== @@ -306,11 +306,17 @@ driver_intr_t *intr, void *arg, void **cookiep) { struct nexus_devinfo *ndi; + device_t ichild; uint64_t ihdl; uint64_t ino; int error, cpuid; - ndi = device_get_ivars(child); + /* we need the devinfo from the immediate child */ + ichild = child; + while (device_get_parent(ichild) != dev) + ichild = device_get_parent(ichild); + + ndi = device_get_ivars(ichild); if (res == NULL) panic("%s: NULL interrupt resource!", __func__);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200609032015.k83KFumZ049245>
