Date: Thu, 11 Jul 2013 04:00:33 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 230999 for review Message-ID: <201307110400.r6B40XdQ037252@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@230999?ac=10 Change 230999 by jhb@jhb_pippin on 2013/07/11 04:00:22 Move pci_domain_*() calls out of the x86 nexus and down into the Host-PCI bridge drivers. Trying to use an ivar in the nexus to infer the right domain to allocate from was error-prone. However, each Host-PCI bridge knows which PCI domain/segment it belongs to. Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#34 edit .. //depot/projects/pci/sys/x86/include/legacyvar.h#2 edit .. //depot/projects/pci/sys/x86/pci/pci_bus.c#4 edit .. //depot/projects/pci/sys/x86/x86/mptable_pci.c#18 edit .. //depot/projects/pci/sys/x86/x86/nexus.c#14 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#34 (text+ko) ==== @@ -97,6 +97,11 @@ static int acpi_pcib_acpi_adjust_resource(device_t dev, device_t child, int type, struct resource *r, u_long start, u_long end); +#ifdef PCI_RES_BUS +static int acpi_pcib_acpi_release_resource(device_t dev, + device_t child, int type, int rid, + struct resource *r); +#endif #endif static device_method_t acpi_pcib_acpi_methods[] = { @@ -116,7 +121,11 @@ #else DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource), #endif +#if defined(NEW_PCIB) && defined(PCI_RES_BUS) + DEVMETHOD(bus_release_resource, acpi_pcib_acpi_release_resource), +#else DEVMETHOD(bus_release_resource, bus_generic_release_resource), +#endif DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), @@ -424,15 +433,16 @@ sc->ap_bus = start; else { rid = 0; - bus_res = bus_alloc_resource(dev, PCI_RES_BUS, &rid, 0, + bus_res = pci_domain_alloc_bus(sc->ap_segment, dev, &rid, 0, PCI_BUSMAX, 1, 0); if (bus_res == NULL) { - device_printf(dev, "could not allocate bus number\n"); + device_printf(dev, + "could not allocate bus number\n"); pcib_host_res_free(dev, &sc->ap_host_res); return (ENXIO); } sc->ap_bus = rman_get_start(bus_res); - bus_release_resource(dev, PCI_RES_BUS, rid, bus_res); + pci_domain_release_bus(sc->ap_segment, dev, rid, bus_res); } } else { #ifdef INVARIANTS @@ -587,6 +597,11 @@ #ifdef NEW_PCIB sc = device_get_softc(dev); +#ifdef PCI_RES_BUS + if (type == PCI_RES_BUS) + return (pci_domain_alloc_bus(sc->ap_segment, child, rid, start, end, + count, flags)); +#endif res = pcib_host_res_alloc(&sc->ap_host_res, child, type, rid, start, end, count, flags); @@ -615,7 +630,26 @@ struct acpi_hpcib_softc *sc; sc = device_get_softc(dev); +#ifdef PCI_RES_BUS + if (type == PCI_RES_BUS) + return (pci_domain_adjust_bus(sc->ap_segment, child, r, start, + end)); +#endif return (pcib_host_res_adjust(&sc->ap_host_res, child, type, r, start, end)); } + +#ifdef PCI_RES_BUS +int +acpi_pcib_acpi_release_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + struct acpi_hpcib_softc *sc; + + sc = device_get_softc(dev); + if (type == PCI_RES_BUS) + return (pci_domain_release_bus(sc->ap_segment, child, rid, r)); + return (bus_generic_release_resource(dev, child, type, rid, r)); +} +#endif #endif ==== //depot/projects/pci/sys/x86/include/legacyvar.h#2 (text+ko) ==== @@ -57,6 +57,8 @@ uintptr_t value); struct resource *legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags); +int legacy_pcib_release_resource(device_t dev, device_t child, int type, + int rid, struct resource *r); int legacy_pcib_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, uint32_t *data); ==== //depot/projects/pci/sys/x86/pci/pci_bus.c#4 (text+ko) ==== @@ -597,11 +597,39 @@ u_long start, u_long end, u_long count, u_int flags) { - start = hostb_alloc_start(type, start, end, count); - return (bus_generic_alloc_resource(dev, child, type, rid, start, end, - count, flags)); +#if defined(NEW_PCIB) && defined(PCI_RES_BUS) + if (type == PCI_RES_BUS) + return (pci_domain_alloc_bus(0, child, rid, start, end, count, + flags)); +#endif + start = hostb_alloc_start(type, start, end, count); + return (bus_generic_alloc_resource(dev, child, type, rid, start, end, + count, flags)); +} + +#if defined(NEW_PCIB) && defined(PCI_RES_BUS) +static int +legacy_pcib_adjust_resource(device_t dev, device_t child, int type, + struct resource *r, u_long start, u_long end) +{ + + if (type == PCI_RES_BUS) + return (pci_domain_adjust_bus(0, child, r, start, end)); + return (bus_generic_adjust_resource(dev, child, type, r, start, end)); +} + +int +legacy_pcib_release_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + + if (type == PCI_RES_BUS) + return (pci_domain_release_bus(0, child, rid, r)); + return (bus_generic_release_resource(dev, child, type, rid, r)); } +#endif + static device_method_t legacy_pcib_methods[] = { /* Device interface */ DEVMETHOD(device_identify, legacy_pcib_identify), @@ -615,8 +643,13 @@ DEVMETHOD(bus_read_ivar, legacy_pcib_read_ivar), DEVMETHOD(bus_write_ivar, legacy_pcib_write_ivar), DEVMETHOD(bus_alloc_resource, legacy_pcib_alloc_resource), +#if defined(NEW_PCIB) && defined(PCI_RES_BUS) + DEVMETHOD(bus_adjust_resource, legacy_pcib_adjust_resource), + DEVMETHOD(bus_release_resource, legacy_pcib_release_resource), +#else DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource), DEVMETHOD(bus_release_resource, bus_generic_release_resource), +#endif DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), ==== //depot/projects/pci/sys/x86/x86/mptable_pci.c#18 (text+ko) ==== @@ -129,6 +129,11 @@ { struct mptable_hostb_softc *sc; +#ifdef PCI_RES_BUS + if (type == PCI_RES_BUS) + return (pci_domain_alloc_bus(0, child, rid, start, end, count, + flags)); +#endif sc = device_get_softc(dev); if (type == SYS_RES_IOPORT && start + count - 1 == end) { if (mptable_is_isa_range(start, end)) { @@ -165,6 +170,10 @@ { struct mptable_hostb_softc *sc; +#ifdef PCI_RES_BUS + if (type == PCI_RES_BUS) + return (pci_domain_adjust_bus(0, child, r, start, end)); +#endif sc = device_get_softc(dev); return (pcib_host_res_adjust(&sc->sc_host_res, child, type, r, start, end)); @@ -189,7 +198,11 @@ DEVMETHOD(bus_alloc_resource, legacy_pcib_alloc_resource), DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource), #endif +#if defined(NEW_PCIB) && defined(PCI_RES_BUS) + DEVMETHOD(bus_release_resource, legacy_pcib_release_resource), +#else DEVMETHOD(bus_release_resource, bus_generic_release_resource), +#endif DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), ==== //depot/projects/pci/sys/x86/x86/nexus.c#14 (text+ko) ==== @@ -70,11 +70,6 @@ #include <machine/resource.h> #include <machine/pc/bios.h> -#ifdef PCI_RES_BUS -#include <dev/pci/pcivar.h> -#include <dev/pci/pcib_private.h> -#endif - #ifdef DEV_APIC #include "pcib_if.h" #endif @@ -372,20 +367,6 @@ struct rman *rm; int needactivate = flags & RF_ACTIVE; -#ifdef PCI_RES_BUS - if (type == PCI_RES_BUS) { - /* - * PCI bus number resources are allocated from a - * specific PCI domain. The child device must be a - * 'pcib' device which implements the pcib ivars. We - * depend on that to determine which PCI domain to - * allocate from. - */ - return (pci_domain_alloc_bus(pcib_get_domain(child), child, rid, - start, end, count, flags)); - } -#endif - /* * If this is an allocation of the "default" range for a given * RID, and we know what the resources for this device are @@ -429,11 +410,6 @@ { struct rman *rm; -#ifdef PCI_RES_BUS - if (type == PCI_RES_BUS) - return (pci_domain_adjust_bus(pcib_get_domain(child), child, r, - start, end)); -#endif rm = nexus_rman(type); if (rm == NULL) return (ENXIO); @@ -518,11 +494,6 @@ struct resource *r) { -#ifdef PCI_RES_BUS - if (type == PCI_RES_BUS) - return (pci_domain_release_bus(pcib_get_domain(child), child, - rid, r)); -#endif if (rman_get_flags(r) & RF_ACTIVE) { int error = bus_deactivate_resource(child, type, rid, r); if (error)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307110400.r6B40XdQ037252>