From owner-p4-projects@FreeBSD.ORG Sun Apr 10 10:35:02 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CA7361065673; Sun, 10 Apr 2011 10:35:01 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8CE33106564A for ; Sun, 10 Apr 2011 10:35:01 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 5C6838FC0C for ; Sun, 10 Apr 2011 10:35:01 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3AAZ1f0003934 for ; Sun, 10 Apr 2011 10:35:01 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3AAZ1Do003931 for perforce@freebsd.org; Sun, 10 Apr 2011 10:35:01 GMT (envelope-from trasz@freebsd.org) Date: Sun, 10 Apr 2011 10:35:01 GMT Message-Id: <201104101035.p3AAZ1Do003931@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191286 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 10 Apr 2011 10:35:02 -0000 http://p4web.freebsd.org/@@191286?ac=10 Change 191286 by trasz@trasz_victim on 2011/04/10 10:34:19 Fix mismerge. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/compat/svr4/imgact_svr4.c#14 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/compat/svr4/imgact_svr4.c#14 (text+ko) ==== @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include From owner-p4-projects@FreeBSD.ORG Tue Apr 12 05:43:37 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 26A2A106566C; Tue, 12 Apr 2011 05:43:37 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DD85E106564A for ; Tue, 12 Apr 2011 05:43:36 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id CC25C8FC0C for ; Tue, 12 Apr 2011 05:43:36 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3C5ha2V094163 for ; Tue, 12 Apr 2011 05:43:36 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3C5haBL094160 for perforce@freebsd.org; Tue, 12 Apr 2011 05:43:36 GMT (envelope-from jhb@freebsd.org) Date: Tue, 12 Apr 2011 05:43:36 GMT Message-Id: <201104120543.p3C5haBL094160@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191358 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Apr 2011 05:43:37 -0000 http://p4web.freebsd.org/@@191358?ac=10 Change 191358 by jhb@jhb_jhbbsd on 2011/04/12 05:43:32 Treat i5 CPUs the same as Nehalem/Westmere. Affected files ... .. //depot/projects/mcelog/intel.c#4 edit Differences ... ==== //depot/projects/mcelog/intel.c#4 (text) ==== @@ -38,7 +38,8 @@ return CPU_CORE2; else if (model == 0x1d) return CPU_DUNNINGTON; - else if (model == 0x1a || model == 0x2c) /* Nehalem/Westmere */ + else if (model == 0x1a || model == 0x2a || model == 0x2c) + /* Nehalem/i5/Westmere */ return CPU_NEHALEM; if (model >= 0x1a) From owner-p4-projects@FreeBSD.ORG Tue Apr 12 17:25:43 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C196C1065679; Tue, 12 Apr 2011 17:25:42 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 81B381065672 for ; Tue, 12 Apr 2011 17:25:42 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 552308FC14 for ; Tue, 12 Apr 2011 17:25:42 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3CHPgTb028616 for ; Tue, 12 Apr 2011 17:25:42 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3CHPgHH028613 for perforce@freebsd.org; Tue, 12 Apr 2011 17:25:42 GMT (envelope-from jhb@freebsd.org) Date: Tue, 12 Apr 2011 17:25:42 GMT Message-Id: <201104121725.p3CHPgHH028613@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191384 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Apr 2011 17:25:43 -0000 http://p4web.freebsd.org/@@191384?ac=10 Change 191384 by jhb@jhb_fiver on 2011/04/12 17:25:40 Oops, the PCI-PCI bridge driver needs a custom release resource method in the NEW_PCIB case. Affected files ... .. //depot/projects/pci/sys/dev/pci/pci_pci.c#12 edit .. //depot/projects/pci/sys/dev/pci/pcib_private.h#7 edit Differences ... ==== //depot/projects/pci/sys/dev/pci/pci_pci.c#12 (text+ko) ==== @@ -76,7 +76,11 @@ DEVMETHOD(bus_write_ivar, pcib_write_ivar), DEVMETHOD(bus_alloc_resource, pcib_alloc_resource), DEVMETHOD(bus_adjust_resource, pcib_adjust_resource), +#ifdef NEW_PCIB + DEVMETHOD(bus_release_resource, 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), @@ -1115,6 +1119,25 @@ #endif return (r); } + +int +pcib_release_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + struct pcib_softc *sc; + int error; + + sc = device_get_softc(dev); + if (pcib_is_resource_managed(sc, type, r)) { + if (rman_get_flags(r) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, r); + if (error) + return (error); + } + return (rman_release_resource(r)); + } + return (bus_generic_release_resource(dev, child, type, rid, r)); +} #else /* * We have to trap resource allocation requests and ensure that the bridge ==== //depot/projects/pci/sys/dev/pci/pcib_private.h#7 (text+ko) ==== @@ -100,6 +100,10 @@ u_long start, u_long end, u_long count, u_int flags); int pcib_adjust_resource(device_t bus, device_t child, int type, struct resource *r, u_long start, u_long end); +#ifdef NEW_PCIB +int pcib_release_resource(device_t dev, device_t child, int type, int rid, + struct resource *r); +#endif int pcib_maxslots(device_t dev); uint32_t pcib_read_config(device_t dev, u_int b, u_int s, u_int f, u_int reg, int width); void pcib_write_config(device_t dev, u_int b, u_int s, u_int f, u_int reg, uint32_t val, int width); From owner-p4-projects@FreeBSD.ORG Thu Apr 14 13:50:15 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id AF57A1065678; Thu, 14 Apr 2011 13:50:15 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 724EB1065675 for ; Thu, 14 Apr 2011 13:50:15 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 5B89E8FC16 for ; Thu, 14 Apr 2011 13:50:15 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3EDoF3q075080 for ; Thu, 14 Apr 2011 13:50:15 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3EDoFdT075077 for perforce@freebsd.org; Thu, 14 Apr 2011 13:50:15 GMT (envelope-from jhb@freebsd.org) Date: Thu, 14 Apr 2011 13:50:15 GMT Message-Id: <201104141350.p3EDoFdT075077@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191480 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Apr 2011 13:50:16 -0000 http://p4web.freebsd.org/@@191480?ac=10 Change 191480 by jhb@jhb_fiver on 2011/04/14 13:49:26 Handle the case where a CardBus card's CIS is stored in a BAR. Affected files ... .. //depot/projects/pci/sys/dev/cardbus/cardbus_cis.c#2 edit .. //depot/projects/pci/sys/dev/pci/pci.c#14 edit Differences ... ==== //depot/projects/pci/sys/dev/cardbus/cardbus_cis.c#2 (text+ko) ==== @@ -430,7 +430,10 @@ { if (res != CIS_CONFIG_SPACE) { bus_release_resource(child, SYS_RES_MEMORY, rid, res); +#if 0 + /* XXX: Not anymore. */ bus_delete_resource(child, SYS_RES_MEMORY, rid); +#endif } } ==== //depot/projects/pci/sys/dev/pci/pci.c#14 (text+ko) ==== @@ -2576,6 +2576,17 @@ uint16_t cmd; struct resource *res; + /* + * The BAR may already exist if the device is a CardBus card + * whose CIS is stored in this BAR. + */ + pm = pci_find_bar(dev, reg); + if (pm != NULL) { + maprange = pci_maprange(pm->value); + barlen = maprange == 64 ? 2 : 1; + return (barlen); + } + pci_read_bar(dev, reg, &map, &testval); if (PCI_BAR_MEM(map)) { type = SYS_RES_MEMORY; From owner-p4-projects@FreeBSD.ORG Thu Apr 14 13:51:20 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8B4531065673; Thu, 14 Apr 2011 13:51:20 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 49142106566C for ; Thu, 14 Apr 2011 13:51:20 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 319148FC19 for ; Thu, 14 Apr 2011 13:51:20 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3EDpKfs076706 for ; Thu, 14 Apr 2011 13:51:20 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3EDpKcN076703 for perforce@freebsd.org; Thu, 14 Apr 2011 13:51:20 GMT (envelope-from jhb@freebsd.org) Date: Thu, 14 Apr 2011 13:51:20 GMT Message-Id: <201104141351.p3EDpKcN076703@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191481 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Apr 2011 13:51:20 -0000 http://p4web.freebsd.org/@@191481?ac=10 Change 191481 by jhb@jhb_fiver on 2011/04/14 13:51:11 Various hacking on two fronts: - Support for PCI bus renumbering via PCI_RES_BUS resources. - Support for managing PCI resource windows in Host to PCI bridge drivers. Affected files ... .. //depot/projects/pci/sys/amd64/include/resource.h#2 edit .. //depot/projects/pci/sys/conf/files#3 edit .. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#4 edit .. //depot/projects/pci/sys/dev/pci/pci_domain.c#1 add .. //depot/projects/pci/sys/dev/pci/pcib_private.h#8 edit .. //depot/projects/pci/sys/x86/x86/nexus.c#4 edit Differences ... ==== //depot/projects/pci/sys/amd64/include/resource.h#2 (text+ko) ==== @@ -40,5 +40,8 @@ #define SYS_RES_DRQ 2 /* isa dma lines */ #define SYS_RES_MEMORY 3 /* i/o memory */ #define SYS_RES_IOPORT 4 /* i/o ports */ +#ifdef NEW_PCIB +#define PCI_RES_BUS 5 /* PCI bus numbers */ +#endif #endif /* !_MACHINE_RESOURCE_H_ */ ==== //depot/projects/pci/sys/conf/files#3 (text+ko) ==== @@ -1472,6 +1472,7 @@ dev/pci/ignore_pci.c optional pci dev/pci/isa_pci.c optional pci isa dev/pci/pci.c optional pci +dev/pci/pci_domain.c optional pci new_pcib dev/pci/pci_if.m standard dev/pci/pci_pci.c optional pci dev/pci/pci_user.c optional pci ==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#4 (text+ko) ==== @@ -62,6 +62,10 @@ int ap_bus; /* bios-assigned bus number */ ACPI_BUFFER ap_prt; /* interrupt routing table */ +#ifdef NEW_PCIB + struct pcib_host_resources ap_host_res; + struct resource *ap_bus_res; /* resource for 'ap_bus' */ +#endif }; static int acpi_pcib_acpi_probe(device_t bus); @@ -101,8 +105,13 @@ DEVMETHOD(bus_read_ivar, acpi_pcib_read_ivar), DEVMETHOD(bus_write_ivar, acpi_pcib_write_ivar), DEVMETHOD(bus_alloc_resource, acpi_pcib_acpi_alloc_resource), +#ifdef NEW_PCIB + DEVMETHOD(bus_adjust_resource, acpi_pcib_acpi_adjust_resource), + DEVMETHOD(bus_release_resource, acpi_pcib_acpi_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), @@ -149,6 +158,20 @@ return (0); } +#ifdef NEW_PCIB +static void +acpi_pcib_add_producers(struct acpi_hpcib_softc *sc) +{ + + if (pcib_host_res_init(sc->ap_dev, &sc->ap_host_res) != 0) + panic("failed to init hostb resources"); + /* + * XXX: Next use AcpiWalkResources() on _CRS calling + * pcib_host_res_manage() on each producer range. + */ +} +#endif + static int acpi_pcib_acpi_attach(device_t dev) { @@ -241,7 +264,16 @@ } } +#ifdef NEW_PCIB /* + * If we have a valid bus number, allocate it from our domain. If + * we do not have a valid bus number, hope that ACPI at least lays + * out the Host-PCI bridges in order and that as a result the next + * free bus number is our bus number. + */ +#else +#endif + /* * If nothing else worked, hope that ACPI at least lays out the * host-PCI bridges in order and that as a result our unit number * is actually our bus number. There are several reasons this @@ -269,7 +301,7 @@ switch (which) { case PCIB_IVAR_DOMAIN: - *result = 0; + *result = sc->ap_segment; return (0); case PCIB_IVAR_BUS: *result = sc->ap_bus; @@ -364,6 +396,17 @@ acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { +#ifdef NEW_PCIB + struct acpi_hpcib_softc *sc; + struct resource *r; + int error; + + sc = device_get_softc(dev); + error = pcib_host_res_alloc(&sc->ap_host_res, child, type, rid, start, end, + count, flags, &r); + if (error == 0) + return (r); +#endif /* * If no memory preference is given, use upper 32MB slot most * bioses use for their memory window. Typically other bridges @@ -371,7 +414,7 @@ * Hardcoding like this sucks, so a more MD/MI way needs to be * found to do it. This is typically only used on older laptops * that don't have pci busses behind pci bridge, so assuming > 32MB - * is liekly OK. + * is likely OK. */ if (type == SYS_RES_MEMORY && start == 0UL && end == ~0UL) start = acpi_host_mem_start; ==== //depot/projects/pci/sys/dev/pci/pcib_private.h#8 (text+ko) ==== @@ -33,6 +33,19 @@ #ifndef __PCIB_PRIVATE_H__ #define __PCIB_PRIVATE_H__ +#ifdef NEW_PCIB +/* + * Data structure and routines that Host to PCI bridge drivers can use + * to suballocate resources to PCI devices. + */ +struct pcib_host_resources { + device_t hr_pcib; + struct resource_list hr_rl; /* allocated resources from parent */ + struct rman hr_bus_rman; + struct rman hr_io_rman; + struct rman hr_mem_rman; +}; + /* * Export portions of generic PCI:PCI bridge support so that it can be * used by subclasses. @@ -45,15 +58,15 @@ #define WIN_PMEM 0x4 struct pcib_window { - pci_addr_t base; /* base address */ - pci_addr_t limit; /* topmost address */ - struct rman rman; - struct resource *res; - int reg; /* resource id from parent */ - int valid; - int mask; /* WIN_* bitmask of this window */ - int step; /* log_2 of window granularity */ - const char *name; + pci_addr_t base; /* base address */ + pci_addr_t limit; /* topmost address */ + struct rman rman; + struct resource *res; + int reg; /* resource id from parent */ + int valid; + int mask; /* WIN_* bitmask of this window */ + int step; /* log_2 of window granularity */ + const char *name; }; #endif @@ -90,6 +103,28 @@ typedef uint32_t pci_read_config_fn(int b, int s, int f, int reg, int width); +#ifdef NEW_PCIB +int pcib_host_res_init(device_t pcib, + struct pcib_host_resources *hr); +int pcib_host_res_free(device_t pcib, + struct pcib_host_resources *hr); +int pcib_host_res_manage(struct pcib_host_resources *hr, int type, + u_long start, u_long end); +int pcib_host_res_alloc(struct pcib_host_resources *hr, + device_t dev, int type, int *rid, u_long start, u_long end, + u_long count, u_int flags, struct resource **rp); +int pcib_host_res_adjust(struct pcib_host_resources *hr, + device_t dev, int type, struct resource *r, u_long start, + u_long end); +int pcib_host_res_release(struct pcib_host_resources *hr, + device_t dev, int type, int rid, struct resource *r); +struct resource *pci_domain_alloc_bus(int domain, device_t dev, int *rid, u_long start, + u_long end, u_long count, u_int flags); +int pci_domain_adjust_bus(int domain, device_t dev, struct resource *r, + u_long start, u_long end); +int pci_domain_release_bus(int domain, device_t dev, int rid, + struct resource *r); +#endif int host_pcib_get_busno(pci_read_config_fn read_config, int bus, int slot, int func, uint8_t *busnum); int pcib_attach(device_t dev); ==== //depot/projects/pci/sys/x86/x86/nexus.c#4 (text+ko) ==== @@ -70,6 +70,8 @@ #include #include +#include + #ifdef DEV_APIC #include "pcib_if.h" #endif @@ -383,6 +385,23 @@ count = rle->count; } +#ifdef NEW_PCIB + 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. + */ + rv = pci_domain_alloc_bus(pcib_get_domain(child), child, rid, + start, end, count, flags); + if (rv == NULL) + return (NULL); + rman_set_rid(rv, *rid); + return (rv); + } +#endif flags &= ~RF_ACTIVE; rm = nexus_rman(type); if (rm == NULL) @@ -409,6 +428,11 @@ { struct rman *rm; +#ifdef NEW_PCIB + 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); @@ -492,6 +516,12 @@ nexus_release_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { + +#ifdef NEW_PCIB + 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) From owner-p4-projects@FreeBSD.ORG Thu Apr 14 17:33:02 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EA87F1065670; Thu, 14 Apr 2011 17:33:01 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AD4011065673 for ; Thu, 14 Apr 2011 17:33:01 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 7C7148FC0A for ; Thu, 14 Apr 2011 17:33:01 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3EHX1Ie018383 for ; Thu, 14 Apr 2011 17:33:01 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3EHX1t8018380 for perforce@freebsd.org; Thu, 14 Apr 2011 17:33:01 GMT (envelope-from jhb@freebsd.org) Date: Thu, 14 Apr 2011 17:33:01 GMT Message-Id: <201104141733.p3EHX1t8018380@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191498 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Apr 2011 17:33:02 -0000 http://p4web.freebsd.org/@@191498?ac=10 Change 191498 by jhb@jhb_jhbbsd on 2011/04/14 17:31:58 Compile. Submitted by: bschmidt Affected files ... .. //depot/projects/pci/sys/dev/pci/pci.c#15 edit Differences ... ==== //depot/projects/pci/sys/dev/pci/pci.c#15 (text+ko) ==== @@ -2582,7 +2582,7 @@ */ pm = pci_find_bar(dev, reg); if (pm != NULL) { - maprange = pci_maprange(pm->value); + maprange = pci_maprange(pm->pm_value); barlen = maprange == 64 ? 2 : 1; return (barlen); } From owner-p4-projects@FreeBSD.ORG Fri Apr 15 03:36:40 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 62BB91065673; Fri, 15 Apr 2011 03:36:40 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 256A1106564A for ; Fri, 15 Apr 2011 03:36:39 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id D0F458FC14 for ; Fri, 15 Apr 2011 03:36:39 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3F3ad2P031637 for ; Fri, 15 Apr 2011 03:36:39 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3F3adlD031634 for perforce@freebsd.org; Fri, 15 Apr 2011 03:36:39 GMT (envelope-from jhb@freebsd.org) Date: Fri, 15 Apr 2011 03:36:39 GMT Message-Id: <201104150336.p3F3adlD031634@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191524 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Apr 2011 03:36:40 -0000 http://p4web.freebsd.org/@@191524?ac=10 Change 191524 by jhb@jhb_fiver on 2011/04/15 03:35:37 Add rman_is_empty() routine. Affected files ... .. //depot/projects/pci/sys/kern/subr_rman.c#7 edit .. //depot/projects/pci/sys/sys/rman.h#5 edit Differences ... ==== //depot/projects/pci/sys/kern/subr_rman.c#7 (text+ko) ==== @@ -1058,6 +1058,12 @@ } int +rman_is_empty(struct rman *rm) +{ + return (TAILQ_EMPTY(&rm->rm_list)); +} + +int rman_is_region_manager(struct resource *r, struct rman *rm) { ==== //depot/projects/pci/sys/sys/rman.h#5 (text+ko) ==== @@ -135,6 +135,7 @@ int rman_last_free_region(struct rman *rm, u_long *start, u_long *end); uint32_t rman_make_alignment_flags(uint32_t size); int rman_manage_region(struct rman *rm, u_long start, u_long end); +int rman_is_empty(struct rman *rm); int rman_is_region_manager(struct resource *r, struct rman *rm); int rman_release_region(struct rman *rm, u_long start, u_long end); int rman_release_resource(struct resource *r); From owner-p4-projects@FreeBSD.ORG Fri Apr 15 03:37:46 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9BFDF1065673; Fri, 15 Apr 2011 03:37:46 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5E75D1065672 for ; Fri, 15 Apr 2011 03:37:46 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 4BF248FC12 for ; Fri, 15 Apr 2011 03:37:46 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3F3bk0G031706 for ; Fri, 15 Apr 2011 03:37:46 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3F3bkbL031703 for perforce@freebsd.org; Fri, 15 Apr 2011 03:37:46 GMT (envelope-from jhb@freebsd.org) Date: Fri, 15 Apr 2011 03:37:46 GMT Message-Id: <201104150337.p3F3bkbL031703@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191526 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Apr 2011 03:37:46 -0000 http://p4web.freebsd.org/@@191526?ac=10 Change 191526 by jhb@jhb_fiver on 2011/04/15 03:36:45 Use AcpiWalkResources() to implement acpi_parse_resources(). While here, use common code for all of the address space resource types and add support for Address64 and ExtAddress64 types. Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_resource.c#2 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_resource.c#2 (text+ko) ==== @@ -139,6 +139,217 @@ INTR_POLARITY_HIGH : INTR_POLARITY_LOW); } +struct acpi_resource_context { + struct acpi_parse_resource_set *set; + void *context; +}; + +static ACPI_STATUS +acpi_parse_resource(ACPI_RESOURCE *res, void *context) +{ + struct acpi_parse_resource_set *set; + struct acpi_resource_context *arc; + UINT64 min, max, length, gran; + const char *name; + +#define ADDRESS_RANGE_NAME(type) \ + ((type) == ACPI_MEMORY_RANGE ? "Memory" : (type) == ACPI_IO_RANGE ? "IO" : \ + "Bus Number") + + arc = context; + set = arc->set; + + switch (res->Type) { + case ACPI_RESOURCE_TYPE_END_TAG: + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n")); + break; + case ACPI_RESOURCE_TYPE_FIXED_IO: + if (res->Data.FixedIo.AddressLength <= 0) + break; + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedIo 0x%x/%d\n", + res->Data.FixedIo.Address, res->Data.FixedIo.AddressLength)); + set->set_ioport(dev, arc->context, res->Data.FixedIo.Address, + res->Data.FixedIo.AddressLength); + break; + case ACPI_RESOURCE_TYPE_IO: + if (res->Data.Io.AddressLength <= 0) + break; + if (res->Data.Io.Minimum == res->Data.Io.Maximum) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x/%d\n", + res->Data.Io.Minimum, res->Data.Io.AddressLength)); + set->set_ioport(dev, arc->context, res->Data.Io.Minimum, + res->Data.Io.AddressLength); + } else { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x-0x%x/%d\n", + res->Data.Io.Minimum, res->Data.Io.Maximum, + res->Data.Io.AddressLength)); + set->set_iorange(dev, arc->context, res->Data.Io.Minimum, + res->Data.Io.Maximum, res->Data.Io.AddressLength, + res->Data.Io.Alignment); + } + break; + case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: + if (res->Data.FixedMemory32.AddressLength <= 0) + break; + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedMemory32 0x%x/%d\n", + res->Data.FixedMemory32.Address, + res->Data.FixedMemory32.AddressLength)); + set->set_memory(dev, arc->context, res->Data.FixedMemory32.Address, + res->Data.FixedMemory32.AddressLength); + break; + case ACPI_RESOURCE_TYPE_MEMORY32: + if (res->Data.Memory32.AddressLength <= 0) + break; + if (res->Data.Memory32.Minimum == res->Data.Memory32.Maximum) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x/%d\n", + res->Data.Memory32.Minimum, res->Data.Memory32.AddressLength)); + set->set_memory(dev, arc->context, res->Data.Memory32.Minimum, + res->Data.Memory32.AddressLength); + } else { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x-0x%x/%d\n", + res->Data.Memory32.Minimum, res->Data.Memory32.Maximum, + res->Data.Memory32.AddressLength)); + set->set_memoryrange(dev, arc->context, res->Data.Memory32.Minimum, + res->Data.Memory32.Maximum, res->Data.Memory32.AddressLength, + res->Data.Memory32.Alignment); + } + break; + case ACPI_RESOURCE_TYPE_MEMORY24: + if (res->Data.Memory24.AddressLength <= 0) + break; + if (res->Data.Memory24.Minimum == res->Data.Memory24.Maximum) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x/%d\n", + res->Data.Memory24.Minimum, res->Data.Memory24.AddressLength)); + set->set_memory(dev, arc->context, res->Data.Memory24.Minimum, + res->Data.Memory24.AddressLength); + } else { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x-0x%x/%d\n", + res->Data.Memory24.Minimum, res->Data.Memory24.Maximum, + res->Data.Memory24.AddressLength)); + set->set_memoryrange(dev, arc->context, res->Data.Memory24.Minimum, + res->Data.Memory24.Maximum, res->Data.Memory24.AddressLength, + res->Data.Memory24.Alignment); + } + break; + case ACPI_RESOURCE_TYPE_IRQ: + /* + * from 1.0b 6.4.2 + * "This structure is repeated for each separate interrupt + * required" + */ + set->set_irq(dev, arc->context, res->Data.Irq.Interrupts, + res->Data.Irq.InterruptCount, res->Data.Irq.Triggering, + res->Data.Irq.Polarity); + break; + case ACPI_RESOURCE_TYPE_DMA: + /* + * from 1.0b 6.4.3 + * "This structure is repeated for each separate DMA channel + * required" + */ + set->set_drq(dev, arc->context, res->Data.Dma.Channels, + res->Data.Dma.ChannelCount); + break; + case ACPI_RESOURCE_TYPE_START_DEPENDENT: + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "start dependent functions\n")); + set->set_start_dependent(dev, arc->context, + res->Data.StartDpf.CompatibilityPriority); + break; + case ACPI_RESOURCE_TYPE_END_DEPENDENT: + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "end dependent functions\n")); + set->set_end_dependent(dev, arc->context); + break; + case ACPI_RESOURCE_TYPE_ADDRESS16: + case ACPI_RESOURCE_TYPE_ADDRESS32: + case ACPI_RESOURCE_TYPE_ADDRESS64: + case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + switch (res->type) { + case ACPI_RESOURCE_TYPE_ADDRESS16: + gran = res->Data.Address16.Granularity; + min = res->Data.Address16.Minimum; + max = res->Data.Address16.Maximum; + length = res->Data.Address16.AddressLength; + name = "Address16"; + break; + case ACPI_RESOURCE_TYPE_ADDRESS32: + gran = res->Data.Address32.Granularity; + min = res->Data.Address32.Minimum; + max = res->Data.Address32.Maximum; + length = res->Data.Address32.AddressLength; + name = "Address32"; + break; + case ACPI_RESOURCE_TYPE_ADDRESS64: + gran = res->Data.Address64.Granularity; + min = res->Data.Address64.Minimum; + max = res->Data.Address64.Maximum; + length = res->Data.Address64.AddressLength; + name = "Address64"; + break; + case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + gran = res->Data.ExtAddress64.Granularity; + min = res->Data.ExtAddress64.Minimum; + max = res->Data.ExtAddress64.Maximum; + length = res->Data.ExtAddress64.AddressLength; + name = "ExtAddress64"; + break; + } + if (len <= 0) + break; + if (res->Data.Address.ProducerConsumer != ACPI_CONSUMER) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "ignored %s %s producer\n", name, + ADDRESS_RANGE_NAME(res->Data.Address.ResourceType))); + break; + } + if (res->Data.Address.ResourceType != ACPI_MEMORY_RANGE && + res->Data.Address.ResourceType != ACPI_IO_RANGE) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "ignored %s for non-memory, non-I/O\n", name)); + break; + } + + if (res->Data.Address.MinAddressFixed == ACPI_ADDRESS_FIXED && + res->Data.Address.MaxAddressFixed == ACPI_ADDRESS_FIXED) { + if (res->Data.Address.ResourceType == ACPI_MEMORY_RANGE) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/Memory 0x%x/%d\n", + name, min, length)); + set->set_memory(dev, arc->context, min, length); + } else { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%x/%d\n", name, + min, length)); + set->set_ioport(dev, arc->context, min, length); + } + } else { + if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/Memory 0x%x-0x%x/%d\n", + name, min, max, length)); + set->set_memoryrange(dev, arc->context, min, max, length, gran); + } else { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%x-0x%x/%d\n", + name, min, max, length)); + set->set_iorange(dev, arc->context, min, max, length, gran); + } + } + break; + case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: + if (res->Data.ExtendedIrq.ProducerConsumer != ACPI_CONSUMER) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "ignored ExtIRQ producer\n")); + break; + } + set->set_ext_irq(dev, arc->context, res->Data.ExtendedIrq.Interrupts, + res->Data.ExtendedIrq.InterruptCount, + res->Data.ExtendedIrq.Triggering, res->Data.ExtendedIrq.Polarity); + break; + case ACPI_RESOURCE_TYPE_VENDOR: + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, + "unimplemented VendorSpecific resource\n")); + break; + default: + break; + } + return (AE_OK); +} + /* * Fetch a device's resources and associate them with the device. * @@ -157,314 +368,19 @@ ACPI_RESOURCE *res; char *curr, *last; ACPI_STATUS status; - void *context; + struct acpi_resource_context arc; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - /* - * Special-case some devices that abuse _PRS/_CRS to mean - * something other than "I consume this resource". - * - * XXX do we really need this? It's only relevant once - * we start always-allocating these resources, and even - * then, the only special-cased device is likely to be - * the PCI interrupt link. - */ - - /* Fetch the device's current resources. */ - buf.Length = ACPI_ALLOCATE_BUFFER; - if (ACPI_FAILURE((status = AcpiGetCurrentResources(handle, &buf)))) { - if (status != AE_NOT_FOUND && status != AE_TYPE) - printf("can't fetch resources for %s - %s\n", - acpi_name(handle), AcpiFormatException(status)); + set->set_init(dev, arg, &arc.context); + arc.set = set; + status = AcpiWalkResources(handle, "_CRS", acpi_parse_resource, &arc); + if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { + printf("can't fetch resources for %s - %s\n", + acpi_name(handle), AcpiFormatException(status)); return_ACPI_STATUS (status); } - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s - got %ld bytes of resources\n", - acpi_name(handle), (long)buf.Length)); - set->set_init(dev, arg, &context); - - /* Iterate through the resources */ - curr = buf.Pointer; - last = (char *)buf.Pointer + buf.Length; - while (curr < last) { - res = (ACPI_RESOURCE *)curr; - curr += res->Length; - - /* Handle the individual resource types */ - switch(res->Type) { - case ACPI_RESOURCE_TYPE_END_TAG: - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n")); - curr = last; - break; - case ACPI_RESOURCE_TYPE_FIXED_IO: - if (res->Data.FixedIo.AddressLength <= 0) - break; - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedIo 0x%x/%d\n", - res->Data.FixedIo.Address, - res->Data.FixedIo.AddressLength)); - set->set_ioport(dev, context, - res->Data.FixedIo.Address, - res->Data.FixedIo.AddressLength); - break; - case ACPI_RESOURCE_TYPE_IO: - if (res->Data.Io.AddressLength <= 0) - break; - if (res->Data.Io.Minimum == res->Data.Io.Maximum) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x/%d\n", - res->Data.Io.Minimum, - res->Data.Io.AddressLength)); - set->set_ioport(dev, context, - res->Data.Io.Minimum, - res->Data.Io.AddressLength); - } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x-0x%x/%d\n", - res->Data.Io.Minimum, - res->Data.Io.Maximum, - res->Data.Io.AddressLength)); - set->set_iorange(dev, context, - res->Data.Io.Minimum, - res->Data.Io.Maximum, - res->Data.Io.AddressLength, - res->Data.Io.Alignment); - } - break; - case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: - if (res->Data.FixedMemory32.AddressLength <= 0) - break; - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedMemory32 0x%x/%d\n", - res->Data.FixedMemory32.Address, - res->Data.FixedMemory32.AddressLength)); - set->set_memory(dev, context, - res->Data.FixedMemory32.Address, - res->Data.FixedMemory32.AddressLength); - break; - case ACPI_RESOURCE_TYPE_MEMORY32: - if (res->Data.Memory32.AddressLength <= 0) - break; - if (res->Data.Memory32.Minimum == - res->Data.Memory32.Maximum) { - - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x/%d\n", - res->Data.Memory32.Minimum, - res->Data.Memory32.AddressLength)); - set->set_memory(dev, context, - res->Data.Memory32.Minimum, - res->Data.Memory32.AddressLength); - } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x-0x%x/%d\n", - res->Data.Memory32.Minimum, - res->Data.Memory32.Maximum, - res->Data.Memory32.AddressLength)); - set->set_memoryrange(dev, context, - res->Data.Memory32.Minimum, - res->Data.Memory32.Maximum, - res->Data.Memory32.AddressLength, - res->Data.Memory32.Alignment); - } - break; - case ACPI_RESOURCE_TYPE_MEMORY24: - if (res->Data.Memory24.AddressLength <= 0) - break; - if (res->Data.Memory24.Minimum == - res->Data.Memory24.Maximum) { - - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x/%d\n", - res->Data.Memory24.Minimum, - res->Data.Memory24.AddressLength)); - set->set_memory(dev, context, res->Data.Memory24.Minimum, - res->Data.Memory24.AddressLength); - } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x-0x%x/%d\n", - res->Data.Memory24.Minimum, - res->Data.Memory24.Maximum, - res->Data.Memory24.AddressLength)); - set->set_memoryrange(dev, context, - res->Data.Memory24.Minimum, - res->Data.Memory24.Maximum, - res->Data.Memory24.AddressLength, - res->Data.Memory24.Alignment); - } - break; - case ACPI_RESOURCE_TYPE_IRQ: - /* - * from 1.0b 6.4.2 - * "This structure is repeated for each separate interrupt - * required" - */ - set->set_irq(dev, context, res->Data.Irq.Interrupts, - res->Data.Irq.InterruptCount, res->Data.Irq.Triggering, - res->Data.Irq.Polarity); - break; - case ACPI_RESOURCE_TYPE_DMA: - /* - * from 1.0b 6.4.3 - * "This structure is repeated for each separate dma channel - * required" - */ - set->set_drq(dev, context, res->Data.Dma.Channels, - res->Data.Dma.ChannelCount); - break; - case ACPI_RESOURCE_TYPE_START_DEPENDENT: - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "start dependent functions\n")); - set->set_start_dependent(dev, context, - res->Data.StartDpf.CompatibilityPriority); - break; - case ACPI_RESOURCE_TYPE_END_DEPENDENT: - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "end dependent functions\n")); - set->set_end_dependent(dev, context); - break; - case ACPI_RESOURCE_TYPE_ADDRESS32: - if (res->Data.Address32.AddressLength <= 0) - break; - if (res->Data.Address32.ProducerConsumer != ACPI_CONSUMER) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "ignored Address32 %s producer\n", - res->Data.Address32.ResourceType == ACPI_IO_RANGE ? - "IO" : "Memory")); - break; - } - if (res->Data.Address32.ResourceType != ACPI_MEMORY_RANGE && - res->Data.Address32.ResourceType != ACPI_IO_RANGE) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "ignored Address32 for non-memory, non-I/O\n")); - break; - } - - if (res->Data.Address32.MinAddressFixed == ACPI_ADDRESS_FIXED && - res->Data.Address32.MaxAddressFixed == ACPI_ADDRESS_FIXED) { - - if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address32/Memory 0x%x/%d\n", - res->Data.Address32.Minimum, - res->Data.Address32.AddressLength)); - set->set_memory(dev, context, - res->Data.Address32.Minimum, - res->Data.Address32.AddressLength); - } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address32/IO 0x%x/%d\n", - res->Data.Address32.Minimum, - res->Data.Address32.AddressLength)); - set->set_ioport(dev, context, - res->Data.Address32.Minimum, - res->Data.Address32.AddressLength); - } - } else { - if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address32/Memory 0x%x-0x%x/%d\n", - res->Data.Address32.Minimum, - res->Data.Address32.Maximum, - res->Data.Address32.AddressLength)); - set->set_memoryrange(dev, context, - res->Data.Address32.Minimum, - res->Data.Address32.Maximum, - res->Data.Address32.AddressLength, - res->Data.Address32.Granularity); - } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address32/IO 0x%x-0x%x/%d\n", - res->Data.Address32.Minimum, - res->Data.Address32.Maximum, - res->Data.Address32.AddressLength)); - set->set_iorange(dev, context, - res->Data.Address32.Minimum, - res->Data.Address32.Maximum, - res->Data.Address32.AddressLength, - res->Data.Address32.Granularity); - } - } - break; - case ACPI_RESOURCE_TYPE_ADDRESS16: - if (res->Data.Address16.AddressLength <= 0) - break; - if (res->Data.Address16.ProducerConsumer != ACPI_CONSUMER) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "ignored Address16 %s producer\n", - res->Data.Address16.ResourceType == ACPI_IO_RANGE ? - "IO" : "Memory")); - break; - } - if (res->Data.Address16.ResourceType != ACPI_MEMORY_RANGE && - res->Data.Address16.ResourceType != ACPI_IO_RANGE) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "ignored Address16 for non-memory, non-I/O\n")); - break; - } - - if (res->Data.Address16.MinAddressFixed == ACPI_ADDRESS_FIXED && - res->Data.Address16.MaxAddressFixed == ACPI_ADDRESS_FIXED) { - - if (res->Data.Address16.ResourceType == ACPI_MEMORY_RANGE) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address16/Memory 0x%x/%d\n", - res->Data.Address16.Minimum, - res->Data.Address16.AddressLength)); - set->set_memory(dev, context, - res->Data.Address16.Minimum, - res->Data.Address16.AddressLength); - } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address16/IO 0x%x/%d\n", - res->Data.Address16.Minimum, - res->Data.Address16.AddressLength)); - set->set_ioport(dev, context, - res->Data.Address16.Minimum, - res->Data.Address16.AddressLength); - } - } else { - if (res->Data.Address16.ResourceType == ACPI_MEMORY_RANGE) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address16/Memory 0x%x-0x%x/%d\n", - res->Data.Address16.Minimum, - res->Data.Address16.Maximum, - res->Data.Address16.AddressLength)); - set->set_memoryrange(dev, context, - res->Data.Address16.Minimum, - res->Data.Address16.Maximum, - res->Data.Address16.AddressLength, - res->Data.Address16.Granularity); - } else { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "Address16/IO 0x%x-0x%x/%d\n", - res->Data.Address16.Minimum, - res->Data.Address16.Maximum, - res->Data.Address16.AddressLength)); - set->set_iorange(dev, context, - res->Data.Address16.Minimum, - res->Data.Address16.Maximum, - res->Data.Address16.AddressLength, - res->Data.Address16.Granularity); - } - } - break; - case ACPI_RESOURCE_TYPE_ADDRESS64: - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "unimplemented Address64 resource\n")); - break; - case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: - if (res->Data.ExtendedIrq.ProducerConsumer != ACPI_CONSUMER) { - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "ignored ExtIRQ producer\n")); - break; - } - set->set_ext_irq(dev, context, res->Data.ExtendedIrq.Interrupts, - res->Data.ExtendedIrq.InterruptCount, - res->Data.ExtendedIrq.Triggering, - res->Data.ExtendedIrq.Polarity); - break; - case ACPI_RESOURCE_TYPE_VENDOR: - ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, - "unimplemented VendorSpecific resource\n")); - break; - default: - break; - } - } - - AcpiOsFree(buf.Pointer); - set->set_done(dev, context); + set->set_done(dev, arc.context); return_ACPI_STATUS (AE_OK); } From owner-p4-projects@FreeBSD.ORG Fri Apr 15 03:38:54 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 121121065675; Fri, 15 Apr 2011 03:38:52 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 699BA106566B for ; Fri, 15 Apr 2011 03:38:52 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 58CFD8FC0C for ; Fri, 15 Apr 2011 03:38:52 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3F3cq6v031829 for ; Fri, 15 Apr 2011 03:38:52 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3F3cqKK031826 for perforce@freebsd.org; Fri, 15 Apr 2011 03:38:52 GMT (envelope-from jhb@freebsd.org) Date: Fri, 15 Apr 2011 03:38:52 GMT Message-Id: <201104150338.p3F3cqKK031826@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191527 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Apr 2011 03:38:54 -0000 http://p4web.freebsd.org/@@191527?ac=10 Change 191527 by jhb@jhb_fiver on 2011/04/15 03:37:51 Missed a todo. Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_resource.c#3 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_resource.c#3 (text+ko) ==== @@ -308,6 +308,9 @@ break; } +#ifdef __i386__ + /* XXX: TODO: check for ULONG_MAX issues. */ +#endif if (res->Data.Address.MinAddressFixed == ACPI_ADDRESS_FIXED && res->Data.Address.MaxAddressFixed == ACPI_ADDRESS_FIXED) { if (res->Data.Address.ResourceType == ACPI_MEMORY_RANGE) { From owner-p4-projects@FreeBSD.ORG Fri Apr 15 03:39:58 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id ABEA61065672; Fri, 15 Apr 2011 03:39:58 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6E8B2106566C for ; Fri, 15 Apr 2011 03:39:58 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 5CB878FC13 for ; Fri, 15 Apr 2011 03:39:58 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3F3dwkK031848 for ; Fri, 15 Apr 2011 03:39:58 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3F3dwmj031845 for perforce@freebsd.org; Fri, 15 Apr 2011 03:39:58 GMT (envelope-from jhb@freebsd.org) Date: Fri, 15 Apr 2011 03:39:58 GMT Message-Id: <201104150339.p3F3dwmj031845@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191528 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Apr 2011 03:39:58 -0000 http://p4web.freebsd.org/@@191528?ac=10 Change 191528 by jhb@jhb_fiver on 2011/04/15 03:39:06 More hacking. I think the host bridge resource stuff first pass is done. Still need to tackle bus number allocation in the host bridge driver and then in the PCI-PCI bridge driver. Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#5 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#5 (text+ko) ==== @@ -91,6 +91,14 @@ device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags); +#ifdef NEW_PCIB +static int acpi_pcib_acpi_adjust_resource(device_t dev, + device_t child, int type, struct resource *r, + u_long start, u_long end); +static int acpi_pcib_acpi_release_resource(device_t dev, + device_t child, int type, int rid, + struct resource *r); +#endif static device_method_t acpi_pcib_acpi_methods[] = { /* Device interface */ @@ -159,16 +167,95 @@ } #ifdef NEW_PCIB -static void -acpi_pcib_add_producers(struct acpi_hpcib_softc *sc) +static ACPI_STATUS +acpi_pcib_producer_handler(ACPI_RESOURCE *res, void *context) { + struct acpi_hpcib_softc *sc; + UINT64 length, min, max; + int error, type; - if (pcib_host_res_init(sc->ap_dev, &sc->ap_host_res) != 0) - panic("failed to init hostb resources"); - /* - * XXX: Next use AcpiWalkResources() on _CRS calling - * pcib_host_res_manage() on each producer range. - */ + sc = context; + switch (res->Type) { + case ACPI_RESOURCE_TYPE_START_DEPENDENT: + case ACPI_RESOURCE_TYPE_END_DEPENDENT: + panic("host bridge has depenedent resources"); + case ACPI_RESOURCE_TYPE_ADDRESS16: + case ACPI_RESOURCE_TYPE_ADDRESS32: + case ACPI_RESOURCE_TYPE_ADDRESS64: + case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + if (res->Data.Address.ProducerConsumer != ACPI_PRODUCER) + break; + switch (res->Type) { + case ACPI_RESOURCE_TYPE_ADDRESS16: + min = res->Data.Address16.Minimum; + max = res->Data.Address16.Maximum; + length = res->Data.Address16.AddressLength; + break; + case ACPI_RESOURCE_TYPE_ADDRESS32: + min = res->Data.Address32.Minimum; + max = res->Data.Address32.Maximum; + length = res->Data.Address32.AddressLength; + break; + case ACPI_RESOURCE_TYPE_ADDRESS64: + min = res->Data.Address64.Minimum; + max = res->Data.Address64.Maximum; + length = res->Data.Address64.AddressLength; + break; + case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + min = res->Data.ExtAddress64.Minimum; + max = res->Data.ExtAddress64.Maximum; + length = res->Data.ExtAddress64.AddressLength; + break; + } + if (length == 0 || + res->Data.Address.MinAddressFixed != ACPI_ADDRESS_FIXED || + res->Data.Address.MaxAddressFixed != ACPI_ADDRESS_FIXED) + break; + KASSERT(min + length - 1 == max, ("invalid range")); + switch (res->Data.Address.ResourceType) { + case ACPI_MEMORY_RANGE: + type = SYS_RES_MEMORY; + break; + case ACPI_IO_RANGE: + type = SYS_RES_IOPORT; + break; + case ACPI_BUS_NUMBER_RANGE: + type = PCI_RES_BUS; + break; + default: + return (AE_OK); + } + + /* XXX: Not sure this is correct? */ + if (res->Data.Address.Decode != ACPI_POS_DECODE) { + device_printf(sc->ap_dev, + "Ignoring %d range (%#jx-%#jx) due to negative decode\n", + type, (uintmax_t)min, (uintmax_t)max); + break; + } +#ifdef __i386__ + if (min > ULONG_MAX) { + device_printf(sc->ap_dev, + "Ignoring %d range above 4GB (%#jx-%#jx)\n", + type, (uintmax_t)min, (uintmax_t)max); + break; + } + if (max > ULONG_MAX) { + device_printf(sc->ap_dev, + "Truncating end of range above 4GB (%#jx-%#jx)\n", + type, (uintmax_t)min, (uintmax_t)max); + max = ULONG_MAX; + } +#endif + error = pcib_host_res_manage(&sc->ap_host_res, type, min, max); + if (error) + panic("Failed to manage %d range (%#jx-%#jx): %d", type, + (uintmax_t)min, (uintmax_t)max, error); + break; + default: + break; + } + return (AE_OK); } #endif @@ -202,6 +289,20 @@ sc->ap_segment = 0; } +#ifdef NEW_PCIB + /* + * Determine which address ranges this bridge decodes and setup + * resource managers for those ranges. + */ + if (pcib_host_res_init(sc->ap_dev, &sc->ap_host_res) != 0) + panic("failed to init hostb resources"); + status = AcpiWalkResources(sc->ap_handle, "_CRS", + acpi_pcib_producer_handler, sc); + if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) + device_printf(sc->ap_dev, "failed to parse resources: %s\n", + AcpiFormatException(status)); +#endif + /* * Get our base bus number by evaluating _BBN. * If this doesn't work, we assume we're bus number 0. @@ -271,8 +372,10 @@ * out the Host-PCI bridges in order and that as a result the next * free bus number is our bus number. */ + if (busok) { + } else { + } #else -#endif /* * If nothing else worked, hope that ACPI at least lays out the * host-PCI bridges in order and that as a result our unit number @@ -283,6 +386,7 @@ sc->ap_bus = device_get_unit(dev); device_printf(dev, "trying bus number %d\n", sc->ap_bus); } +#endif /* If this is bus 0 on segment 0, note that it has been seen already. */ if (sc->ap_segment == 0 && sc->ap_bus == 0) @@ -423,3 +527,26 @@ return (bus_generic_alloc_resource(dev, child, type, rid, start, end, count, flags)); } + +#ifdef NEW_PCIB +int +acpi_pcib_acpi_adjust_resource(device_t dev, device_t child, int type, + struct resource *r, u_long start, u_long end) +{ + struct acpi_hpcib_softc *sc; + + sc = device_get_softc(dev); + return (pcib_host_res_adjust(&sc->ap_host_res, child, type, r, start, + end)); +} + +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); + return (pcib_host_res_release(&sc->ap_host_res, child, type, rid, r)); +} +#endif From owner-p4-projects@FreeBSD.ORG Sat Apr 16 03:08:35 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 558791065670; Sat, 16 Apr 2011 03:08:35 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0E213106566B for ; Sat, 16 Apr 2011 03:08:35 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id EEEF18FC13 for ; Sat, 16 Apr 2011 03:08:34 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3G38Yfg095825 for ; Sat, 16 Apr 2011 03:08:34 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3G38Y9x095822 for perforce@freebsd.org; Sat, 16 Apr 2011 03:08:34 GMT (envelope-from jhb@freebsd.org) Date: Sat, 16 Apr 2011 03:08:34 GMT Message-Id: <201104160308.p3G38Y9x095822@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191575 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Apr 2011 03:08:35 -0000 http://p4web.freebsd.org/@@191575?ac=10 Change 191575 by jhb@jhb_fiver on 2011/04/16 03:08:21 Finish making the resource set stuff handle 64-bit addresses. Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_resource.c#4 edit .. //depot/projects/pci/sys/dev/acpica/acpivar.h#3 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_resource.c#4 (text+ko) ==== @@ -309,7 +309,14 @@ } #ifdef __i386__ - /* XXX: TODO: check for ULONG_MAX issues. */ + if (min > ULONG_MAX || res->Data.Address.MaxAddressFixed && max > + ULONG_MAX) { + ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "ignored %s above 4G\n", + name)); + break; + } + if (max > ULONG_MAX) + max = ULONG_MAX; #endif if (res->Data.Address.MinAddressFixed == ACPI_ADDRESS_FIXED && res->Data.Address.MaxAddressFixed == ACPI_ADDRESS_FIXED) { @@ -394,20 +401,20 @@ static void acpi_res_set_init(device_t dev, void *arg, void **context); static void acpi_res_set_done(device_t dev, void *context); static void acpi_res_set_ioport(device_t dev, void *context, - u_int32_t base, u_int32_t length); + uint64_t base, uint64_t length); static void acpi_res_set_iorange(device_t dev, void *context, - u_int32_t low, u_int32_t high, - u_int32_t length, u_int32_t align); + uint64_t low, uint64_t high, + uint64_t length, uint64_t align); static void acpi_res_set_memory(device_t dev, void *context, - u_int32_t base, u_int32_t length); + uint64_t base, uint64_t length); static void acpi_res_set_memoryrange(device_t dev, void *context, - u_int32_t low, u_int32_t high, - u_int32_t length, u_int32_t align); -static void acpi_res_set_irq(device_t dev, void *context, u_int8_t *irq, + uint64_t low, uint64_t high, + uint64_t length, uint64_t align); +static void acpi_res_set_irq(device_t dev, void *context, uint8_t *irq, int count, int trig, int pol); static void acpi_res_set_ext_irq(device_t dev, void *context, - u_int32_t *irq, int count, int trig, int pol); -static void acpi_res_set_drq(device_t dev, void *context, u_int8_t *drq, + uint32_t *irq, int count, int trig, int pol); +static void acpi_res_set_drq(device_t dev, void *context, uint8_t *drq, int count); static void acpi_res_set_start_dependent(device_t dev, void *context, int preference); @@ -458,8 +465,8 @@ } static void -acpi_res_set_ioport(device_t dev, void *context, u_int32_t base, - u_int32_t length) +acpi_res_set_ioport(device_t dev, void *context, uint64_t base, + uint64_t length) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -469,8 +476,8 @@ } static void -acpi_res_set_iorange(device_t dev, void *context, u_int32_t low, - u_int32_t high, u_int32_t length, u_int32_t align) +acpi_res_set_iorange(device_t dev, void *context, uint64_t low, + uint64_t high, uint64_t length, uint64_t align) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -480,8 +487,8 @@ } static void -acpi_res_set_memory(device_t dev, void *context, u_int32_t base, - u_int32_t length) +acpi_res_set_memory(device_t dev, void *context, uint64_t base, + uint64_t length) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -492,8 +499,8 @@ } static void -acpi_res_set_memoryrange(device_t dev, void *context, u_int32_t low, - u_int32_t high, u_int32_t length, u_int32_t align) +acpi_res_set_memoryrange(device_t dev, void *context, uint64_t low, + uint64_t high, uint64_t length, uint64_t align) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -503,7 +510,7 @@ } static void -acpi_res_set_irq(device_t dev, void *context, u_int8_t *irq, int count, +acpi_res_set_irq(device_t dev, void *context, uint8_t *irq, int count, int trig, int pol) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -519,7 +526,7 @@ } static void -acpi_res_set_ext_irq(device_t dev, void *context, u_int32_t *irq, int count, +acpi_res_set_ext_irq(device_t dev, void *context, uint32_t *irq, int count, int trig, int pol) { struct acpi_res_context *cp = (struct acpi_res_context *)context; @@ -535,7 +542,7 @@ } static void -acpi_res_set_drq(device_t dev, void *context, u_int8_t *drq, int count) +acpi_res_set_drq(device_t dev, void *context, uint8_t *drq, int count) { struct acpi_res_context *cp = (struct acpi_res_context *)context; ==== //depot/projects/pci/sys/dev/acpica/acpivar.h#3 (text+ko) ==== @@ -355,19 +355,19 @@ struct acpi_parse_resource_set { void (*set_init)(device_t dev, void *arg, void **context); void (*set_done)(device_t dev, void *context); - void (*set_ioport)(device_t dev, void *context, uint32_t base, - uint32_t length); - void (*set_iorange)(device_t dev, void *context, uint32_t low, - uint32_t high, uint32_t length, uint32_t align); - void (*set_memory)(device_t dev, void *context, uint32_t base, - uint32_t length); - void (*set_memoryrange)(device_t dev, void *context, uint32_t low, - uint32_t high, uint32_t length, uint32_t align); - void (*set_irq)(device_t dev, void *context, u_int8_t *irq, + void (*set_ioport)(device_t dev, void *context, uint64_t base, + uint64_t length); + void (*set_iorange)(device_t dev, void *context, uint64_t low, + uint64_t high, uint64_t length, uint64_t align); + void (*set_memory)(device_t dev, void *context, uint64_t base, + uint64_t length); + void (*set_memoryrange)(device_t dev, void *context, uint64_t low, + uint64_t high, uint64_t length, uint64_t align); + void (*set_irq)(device_t dev, void *context, uint8_t *irq, int count, int trig, int pol); - void (*set_ext_irq)(device_t dev, void *context, u_int32_t *irq, + void (*set_ext_irq)(device_t dev, void *context, uint32_t *irq, int count, int trig, int pol); - void (*set_drq)(device_t dev, void *context, u_int8_t *drq, + void (*set_drq)(device_t dev, void *context, uint8_t *drq, int count); void (*set_start_dependent)(device_t dev, void *context, int preference); From owner-p4-projects@FreeBSD.ORG Sat Apr 16 03:46:59 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5C04F1065672; Sat, 16 Apr 2011 03:46:59 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1EEC5106564A for ; Sat, 16 Apr 2011 03:46:59 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 0BEBF8FC15 for ; Sat, 16 Apr 2011 03:46:59 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3G3kwce004012 for ; Sat, 16 Apr 2011 03:46:58 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3G3kwOj004009 for perforce@freebsd.org; Sat, 16 Apr 2011 03:46:58 GMT (envelope-from jhb@freebsd.org) Date: Sat, 16 Apr 2011 03:46:58 GMT Message-Id: <201104160346.p3G3kwOj004009@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191578 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Apr 2011 03:46:59 -0000 http://p4web.freebsd.org/@@191578?ac=10 Change 191578 by jhb@jhb_fiver on 2011/04/16 03:46:09 Make bus number code conditional on PCI_RES_BUS, not NEW_PCIB. Affected files ... .. //depot/projects/pci/sys/dev/pci/pci_domain.c#2 edit .. //depot/projects/pci/sys/x86/x86/nexus.c#5 edit Differences ... ==== //depot/projects/pci/sys/dev/pci/pci_domain.c#2 (text+ko) ==== @@ -141,7 +141,9 @@ hr->hr_pcib = pcib; resource_list_init(&hr->hr_rl); +#ifdef PCI_RES_BUS pcib_host_res_init_rman(hr, &hr->hr_bus_rman, 0, 255, "bus numbers"); +#endif pcib_host_res_init_rman(hr, &hr->hr_io_rman, 0, 0xffffffff, "I/O ports"); pcib_host_res_init_rman(hr, &hr->hr_mem_rman, 0, ~0ul, "memory"); @@ -164,11 +166,13 @@ device_printf(pcib, "I/O port resources busy\n"); return (error); } +#ifdef PCI_RES_BUS error = rman_fini(&hr->hr_bus_rman); if (error) { device_printf(pcib, "bus numbers busy\n"); return (error); } +#endif /* * Release all allocated resources and remove them from the @@ -194,8 +198,10 @@ return (&hr->hr_io_rman); case SYS_RES_MEMORY: return (&hr->hr_mem_rman); +#ifdef PCI_RES_BUS case PCI_RES_BUS: return (&hr->hr_bus_rman); +#endif default: return (NULL); } ==== //depot/projects/pci/sys/x86/x86/nexus.c#5 (text+ko) ==== @@ -385,7 +385,7 @@ count = rle->count; } -#ifdef NEW_PCIB +#ifdef PCI_RES_BUS if (type == PCI_RES_BUS) { /* * PCI bus number resources are allocated from a @@ -428,7 +428,7 @@ { struct rman *rm; -#ifdef NEW_PCIB +#ifdef PCI_RES_BUS if (type == PCI_RES_BUS) return (pci_domain_adjust_bus(pcib_get_domain(child), child, r, start, end)); @@ -517,7 +517,7 @@ struct resource *r) { -#ifdef NEW_PCIB +#ifdef PCI_RES_BUS if (type == PCI_RES_BUS) { return (pci_domain_release_bus(pcib_get_domain(child), child, rid, r)); From owner-p4-projects@FreeBSD.ORG Sat Apr 16 03:49:11 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 60115106566C; Sat, 16 Apr 2011 03:49:11 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 22603106564A for ; Sat, 16 Apr 2011 03:49:11 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 0EF8E8FC0A for ; Sat, 16 Apr 2011 03:49:11 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3G3nA2r004039 for ; Sat, 16 Apr 2011 03:49:10 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3G3nAmw004036 for perforce@freebsd.org; Sat, 16 Apr 2011 03:49:10 GMT (envelope-from jhb@freebsd.org) Date: Sat, 16 Apr 2011 03:49:10 GMT Message-Id: <201104160349.p3G3nAmw004036@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191579 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Apr 2011 03:49:11 -0000 http://p4web.freebsd.org/@@191579?ac=10 Change 191579 by jhb@jhb_fiver on 2011/04/16 03:48:31 Make the PCI bus driver allocate a resource for its bus number. I'm a bit torn on who should own the resource for the bus number, the bridge or the bus, but this approach makes things far less convoluted (otherwise bridges have to allocate bus numbers from themselves, etc.). Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_pci.c#2 edit .. //depot/projects/pci/sys/dev/pci/pci.c#16 edit .. //depot/projects/pci/sys/dev/pci/pci_private.h#5 edit .. //depot/projects/pci/sys/powerpc/ofw/ofw_pcibus.c#2 edit .. //depot/projects/pci/sys/sparc64/pci/ofw_pcibus.c#3 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_pci.c#2 (text+ko) ==== @@ -99,7 +99,8 @@ static devclass_t pci_devclass; -DEFINE_CLASS_1(pci, acpi_pci_driver, acpi_pci_methods, 0, pci_driver); +DEFINE_CLASS_1(pci, acpi_pci_driver, acpi_pci_methods, sizeof(struct pci_softc), + pci_driver); DRIVER_MODULE(acpi_pci, pcib, acpi_pci_driver, pci_devclass, 0, 0); MODULE_DEPEND(acpi_pci, acpi, 1, 1, 1); MODULE_DEPEND(acpi_pci, pci, 1, 1, 1); @@ -290,7 +291,11 @@ static int acpi_pci_attach(device_t dev) { - int busno, domain; + int busno, domain, error; + + error = pci_attach_common(dev); + if (error) + return (error); /* * Since there can be multiple independantly numbered PCI @@ -300,9 +305,6 @@ */ domain = pcib_get_domain(dev); busno = pcib_get_bus(dev); - if (bootverbose) - device_printf(dev, "domain=%d, physical bus=%d\n", - domain, busno); /* * First, PCI devices are added as in the normal PCI bus driver. ==== //depot/projects/pci/sys/dev/pci/pci.c#16 (text+ko) ==== @@ -91,6 +91,9 @@ struct resource_list *rl, int force, int prefetch); static int pci_probe(device_t dev); static int pci_attach(device_t dev); +#ifdef PCI_RES_BUS +static int pci_detach(device_t dev); +#endif static void pci_load_vendor_data(void); static int pci_describe_parse_line(char **ptr, int *vendor, int *device, char **desc); @@ -123,7 +126,11 @@ /* Device interface */ DEVMETHOD(device_probe, pci_probe), DEVMETHOD(device_attach, pci_attach), +#ifdef PCI_RES_BUS + DEVMETHOD(device_detach, pci_detach), +#else DEVMETHOD(device_detach, bus_generic_detach), +#endif DEVMETHOD(device_shutdown, bus_generic_shutdown), DEVMETHOD(device_suspend, pci_suspend), DEVMETHOD(device_resume, pci_resume), @@ -173,7 +180,7 @@ { 0, 0 } }; -DEFINE_CLASS_0(pci, pci_driver, pci_methods, 0); +DEFINE_CLASS_0(pci, pci_driver, pci_methods, sizeof(struct pci_softc)); static devclass_t pci_devclass; DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, 0); @@ -3047,10 +3054,41 @@ return (BUS_PROBE_GENERIC); } +int +pci_attach_common(device_t dev) +{ +#ifdef PCI_RES_BUS + struct pci_softc *sc; + int rid; +#endif + int busno, domain; + + domain = pcib_get_domain(dev); + busno = pcib_get_bus(dev); +#ifdef PCI_RES_BUS + sc = device_get_softc(dev); + rid = 0; + sc->sc_bus = bus_alloc_resource(dev, PCI_RES_BUS, &rid, busno, busno, + 1, 0); + if (sc->sc_bus == NULL) { + device_printf(dev, "failed to allocate bus number\n"); + return (ENXIO); + } +#endif + if (bootverbose) + device_printf(dev, "domain=%d, physical bus=%d\n", + domain, busno); + return (0); +} + static int pci_attach(device_t dev) { - int busno, domain; + int busno, domain, error; + + error = pci_attach_common(dev); + if (error) + return (error); /* * Since there can be multiple independantly numbered PCI @@ -3060,13 +3098,25 @@ */ domain = pcib_get_domain(dev); busno = pcib_get_bus(dev); - if (bootverbose) - device_printf(dev, "domain=%d, physical bus=%d\n", - domain, busno); pci_add_children(dev, domain, busno, sizeof(struct pci_devinfo)); return (bus_generic_attach(dev)); } +#ifdef PCI_RES_BUS +static int +pci_detach(device_t dev) +{ + struct pci_softc *sc; + int error; + + error = bus_generic_detach(dev); + if (error) + return (error); + sc = device_get_softc(dev); + return (bus_release_resource(dev, PCI_RES_BUS, 0, sc->sc_bus)); +} +#endif + static void pci_set_power_children(device_t dev, device_t *devlist, int numdevs, int state) ==== //depot/projects/pci/sys/dev/pci/pci_private.h#5 (text+ko) ==== @@ -38,6 +38,12 @@ */ DECLARE_CLASS(pci_driver); +struct pci_softc { +#ifdef PCI_RES_BUS + struct resource *sc_bus; +#endif +}; + extern int pci_do_power_resume; extern int pci_do_power_suspend; @@ -46,6 +52,7 @@ void pci_add_child(device_t bus, struct pci_devinfo *dinfo); void pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask); +int pci_attach_common(device_t dev); void pci_delete_child(device_t dev, device_t child); void pci_driver_added(device_t dev, driver_t *driver); int pci_print_child(device_t dev, device_t child); ==== //depot/projects/pci/sys/powerpc/ofw/ofw_pcibus.c#2 (text+ko) ==== @@ -95,8 +95,8 @@ static devclass_t pci_devclass; -DEFINE_CLASS_1(pci, ofw_pcibus_driver, ofw_pcibus_methods, 1 /* no softc */, - pci_driver); +DEFINE_CLASS_1(pci, ofw_pcibus_driver, ofw_pcibus_methods, + sizeof(struct pci_softc), pci_driver); DRIVER_MODULE(ofw_pcibus, pcib, ofw_pcibus_driver, pci_devclass, 0, 0); MODULE_VERSION(ofw_pcibus, 1); MODULE_DEPEND(ofw_pcibus, pci, 1, 1, 1); @@ -116,12 +116,13 @@ ofw_pcibus_attach(device_t dev) { u_int busno, domain; + int error; + error = pci_attach_common(dev); + if (error) + return (error); domain = pcib_get_domain(dev); busno = pcib_get_bus(dev); - if (bootverbose) - device_printf(dev, "domain=%d, physical bus=%d\n", - domain, busno); /* * Attach those children represented in the device tree. ==== //depot/projects/pci/sys/sparc64/pci/ofw_pcibus.c#3 (text+ko) ==== @@ -100,8 +100,8 @@ static devclass_t pci_devclass; -DEFINE_CLASS_1(pci, ofw_pcibus_driver, ofw_pcibus_methods, 1 /* no softc */, - pci_driver); +DEFINE_CLASS_1(pci, ofw_pcibus_driver, ofw_pcibus_methods, + sizeof(struct pci_softc), pci_driver); EARLY_DRIVER_MODULE(ofw_pcibus, pcib, ofw_pcibus_driver, pci_devclass, 0, 0, BUS_PASS_BUS); MODULE_VERSION(ofw_pcibus, 1); @@ -230,13 +230,14 @@ phandle_t node, child; uint32_t clock; u_int busno, domain, func, slot; + int error; + error = pci_attach_common(dev); + if (error) + return (error); pcib = device_get_parent(dev); domain = pcib_get_domain(dev); busno = pcib_get_bus(dev); - if (bootverbose) - device_printf(dev, "domain=%d, physical bus=%d\n", - domain, busno); node = ofw_bus_get_node(dev); /* From owner-p4-projects@FreeBSD.ORG Sat Apr 16 04:08:58 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 99635106566C; Sat, 16 Apr 2011 04:08:57 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 51658106564A for ; Sat, 16 Apr 2011 04:08:57 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 243EB8FC08 for ; Sat, 16 Apr 2011 04:08:57 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3G48v8C007433 for ; Sat, 16 Apr 2011 04:08:57 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3G48vl7007430 for perforce@freebsd.org; Sat, 16 Apr 2011 04:08:57 GMT (envelope-from jhb@freebsd.org) Date: Sat, 16 Apr 2011 04:08:57 GMT Message-Id: <201104160408.p3G48vl7007430@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191580 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Apr 2011 04:08:58 -0000 http://p4web.freebsd.org/@@191580?ac=10 Change 191580 by jhb@jhb_fiver on 2011/04/16 04:07:53 Update the ACPI Host-PCI bridge driver to properly handle bus number resources (I think). Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#6 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#6 (text+ko) ==== @@ -64,7 +64,6 @@ ACPI_BUFFER ap_prt; /* interrupt routing table */ #ifdef NEW_PCIB struct pcib_host_resources ap_host_res; - struct resource *ap_bus_res; /* resource for 'ap_bus' */ #endif }; @@ -219,9 +218,11 @@ case ACPI_IO_RANGE: type = SYS_RES_IOPORT; break; +#ifdef PCI_RES_BUS case ACPI_BUS_NUMBER_RANGE: type = PCI_RES_BUS; break; +#endif default: return (AE_OK); } @@ -266,6 +267,11 @@ ACPI_STATUS status; static int bus0_seen = 0; u_int addr, slot, func, busok; +#if defined(NEW_PCIB) && defined(PCI_RES_BUS) + struct resource *bus_res; + u_long start, end; + int rid; +#endif uint8_t busno; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -365,15 +371,38 @@ } } -#ifdef NEW_PCIB +#if defined(NEW_PCIB) && defined(PCI_RES_BUS) /* - * If we have a valid bus number, allocate it from our domain. If - * we do not have a valid bus number, hope that ACPI at least lays - * out the Host-PCI bridges in order and that as a result the next - * free bus number is our bus number. + * If nothing else worked, hope that ACPI at least lays out the + * Host-PCI bridges in order and that as a result the next free + * bus number is our bus number. */ - if (busok) { + if (busok == 0) { + /* + * If we have a region of bus numbers, use the first + * number for our bus. + */ + if (rman_first_free_region(&sc->ap_host_res.hr_bus_rman, &start, + &end) == 0) + sc->ap_bus = start; + else { + rid = 0; + bus_res = bus_alloc_resource(dev, PCI_RES_BUS, &rid, 0, + PCI_BUSMAX, 1, 0); + if (bus_res == NULL) { + 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); + } } else { +#ifdef INVARIANTS + if (rman_first_free_region(&sc->ap_host_res.hr_bus_rman, &start, + &end) == 0) + KASSERT(start == sc->ap_bus, ("bus number mismatch")); +#endif } #else /* From owner-p4-projects@FreeBSD.ORG Sat Apr 16 19:20:50 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EAD90106567B; Sat, 16 Apr 2011 19:20:49 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AC7C91065677 for ; Sat, 16 Apr 2011 19:20:49 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 7FD7F8FC12 for ; Sat, 16 Apr 2011 19:20:49 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3GJKneN076378 for ; Sat, 16 Apr 2011 19:20:49 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3GJKn4c076374 for perforce@freebsd.org; Sat, 16 Apr 2011 19:20:49 GMT (envelope-from jhb@freebsd.org) Date: Sat, 16 Apr 2011 19:20:49 GMT Message-Id: <201104161920.p3GJKn4c076374@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191629 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Apr 2011 19:20:50 -0000 http://p4web.freebsd.org/@@191629?ac=10 Change 191629 by jhb@jhb_fiver on 2011/04/16 19:20:19 Compile. Affected files ... .. //depot/projects/pci/sys/dev/pci/pcib_private.h#9 edit Differences ... ==== //depot/projects/pci/sys/dev/pci/pcib_private.h#9 (text+ko) ==== @@ -45,6 +45,7 @@ struct rman hr_io_rman; struct rman hr_mem_rman; }; +#endif /* * Export portions of generic PCI:PCI bridge support so that it can be From owner-p4-projects@FreeBSD.ORG Sat Apr 16 21:33:39 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 45DAB1065673; Sat, 16 Apr 2011 21:33:39 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 086BF1065670 for ; Sat, 16 Apr 2011 21:33:39 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id E92028FC12 for ; Sat, 16 Apr 2011 21:33:38 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p3GLXcW8002898 for ; Sat, 16 Apr 2011 21:33:38 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p3GLXcit002895 for perforce@freebsd.org; Sat, 16 Apr 2011 21:33:38 GMT (envelope-from jhb@freebsd.org) Date: Sat, 16 Apr 2011 21:33:38 GMT Message-Id: <201104162133.p3GLXcit002895@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 191632 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Apr 2011 21:33:39 -0000 http://p4web.freebsd.org/@@191632?ac=10 Change 191632 by jhb@jhb_jhbbsd on 2011/04/16 21:33:25 Compile. Affected files ... .. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#7 edit .. //depot/projects/pci/sys/dev/acpica/acpi_resource.c#5 edit .. //depot/projects/pci/sys/dev/pci/pci_domain.c#3 edit .. //depot/projects/pci/sys/dev/pci/pci_pci.c#13 edit .. //depot/projects/pci/sys/dev/pci/pcib_private.h#10 edit .. //depot/projects/pci/sys/x86/x86/nexus.c#6 edit Differences ... ==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#7 (text+ko) ==== @@ -200,7 +200,10 @@ max = res->Data.Address64.Maximum; length = res->Data.Address64.AddressLength; break; - case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + default: + KASSERT(res->Type == + ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, + ("should never happen")); min = res->Data.ExtAddress64.Minimum; max = res->Data.ExtAddress64.Maximum; length = res->Data.ExtAddress64.AddressLength; ==== //depot/projects/pci/sys/dev/acpica/acpi_resource.c#5 (text+ko) ==== @@ -141,9 +141,30 @@ struct acpi_resource_context { struct acpi_parse_resource_set *set; + device_t dev; void *context; }; +#ifdef ACPI_DEBUG_OUTPUT +static const char * +acpi_address_range_name(UINT8 ResourceType) +{ + static char buf[16]; + + switch (ResourceType) { + case ACPI_MEMORY_RANGE: + return ("Memory"); + case ACPI_IO_RANGE: + return ("IO"); + case ACPI_BUS_NUMBER_RANGE: + return ("Bus Number"); + default: + snprintf(buf, sizeof(buf), "type %u", ResourceType); + return (buf); + } +} +#endif + static ACPI_STATUS acpi_parse_resource(ACPI_RESOURCE *res, void *context) { @@ -151,12 +172,10 @@ struct acpi_resource_context *arc; UINT64 min, max, length, gran; const char *name; + device_t dev; -#define ADDRESS_RANGE_NAME(type) \ - ((type) == ACPI_MEMORY_RANGE ? "Memory" : (type) == ACPI_IO_RANGE ? "IO" : \ - "Bus Number") - arc = context; + dev = arc->dev; set = arc->set; switch (res->Type) { @@ -263,7 +282,7 @@ case ACPI_RESOURCE_TYPE_ADDRESS32: case ACPI_RESOURCE_TYPE_ADDRESS64: case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: - switch (res->type) { + switch (res->Type) { case ACPI_RESOURCE_TYPE_ADDRESS16: gran = res->Data.Address16.Granularity; min = res->Data.Address16.Minimum; @@ -285,7 +304,9 @@ length = res->Data.Address64.AddressLength; name = "Address64"; break; - case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + default: + KASSERT(res->Type == ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, + ("should never happen")); gran = res->Data.ExtAddress64.Granularity; min = res->Data.ExtAddress64.Minimum; max = res->Data.ExtAddress64.Maximum; @@ -293,12 +314,12 @@ name = "ExtAddress64"; break; } - if (len <= 0) + if (length <= 0) break; if (res->Data.Address.ProducerConsumer != ACPI_CONSUMER) { ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "ignored %s %s producer\n", name, - ADDRESS_RANGE_NAME(res->Data.Address.ResourceType))); + acpi_address_range_name(res->Data.Address.ResourceType))); break; } if (res->Data.Address.ResourceType != ACPI_MEMORY_RANGE && @@ -374,16 +395,14 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resource_set *set, void *arg) { - ACPI_BUFFER buf; - ACPI_RESOURCE *res; - char *curr, *last; + struct acpi_resource_context arc; ACPI_STATUS status; - struct acpi_resource_context arc; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); set->set_init(dev, arg, &arc.context); arc.set = set; + arc.dev = dev; status = AcpiWalkResources(handle, "_CRS", acpi_parse_resource, &arc); if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { printf("can't fetch resources for %s - %s\n", ==== //depot/projects/pci/sys/dev/pci/pci_domain.c#3 (text+ko) ==== @@ -4,8 +4,13 @@ * Support utilities for Host to PCI bridge drivers. */ +#include +#include +#include +#include #include #include +#include #include struct pci_domain { @@ -37,12 +42,12 @@ snprintf(buf, sizeof(buf), "PCI domain %d", domain); d = malloc(sizeof(*d) + strlen(buf) + 1, M_DEVBUF, M_WAITOK | M_ZERO); d->pd_domain = domain; - d->pd_rman.rm_start = 0; - d->pd_rman.rm_end = PCI_BUSMAX; - d->pd_rman.rm_type = RMAN_ARRAY; - d->pd_rman.rm_descr = (char *)(d + 1); - strcpy(d->pd_rman.rm_descr, buf); - error = rman_init(&d->pd_rman); + d->pd_bus_rman.rm_start = 0; + d->pd_bus_rman.rm_end = PCI_BUSMAX; + d->pd_bus_rman.rm_type = RMAN_ARRAY; + strcpy((char *)(d + 1), buf); + d->pd_bus_rman.rm_descr = (char *)(d + 1); + error = rman_init(&d->pd_bus_rman); if (error) panic("Failed to initialize PCI domain %d rman", domain); TAILQ_INSERT_TAIL(&domains, d, pd_link); @@ -50,8 +55,8 @@ } struct resource * -pci_domain_alloc_bus(int domain, device_t dev, int *rid, u_long start, u_long end, - u_long count, u_int flags) +pci_domain_alloc_bus(int domain, device_t dev, int *rid, u_long start, + u_long end, u_long count, u_int flags) { struct pci_domain *d; struct resource *res; @@ -59,7 +64,8 @@ if (domain < 0 || domain > PCI_DOMAINMAX) return (NULL); d = pci_find_domain(domain); - res = rman_reserve_resource(&d->pd_rman, start, end, count, flags, dev); + res = rman_reserve_resource(&d->pd_bus_rman, start, end, count, flags, + dev); if (res == NULL) return (NULL); @@ -68,8 +74,8 @@ } int -pci_domain_adjust_bus(int domain, device_t dev, struct resource *r, u_long start, - u_long end) +pci_domain_adjust_bus(int domain, device_t dev, struct resource *r, + u_long start, u_long end) { #ifdef INVARIANTS struct pci_domain *d; @@ -79,7 +85,7 @@ return (EINVAL); #ifdef INVARIANTS d = pci_find_domain(domain); - KASSERT(rman_is_region_manager(r, &d->pd_rman), "bad resource"); + KASSERT(rman_is_region_manager(r, &d->pd_bus_rman), ("bad resource")); #endif return (rman_adjust_resource(r, start, end)); } @@ -95,7 +101,7 @@ return (EINVAL); #ifdef INVARIANTS d = pci_find_domain(domain); - KASSERT(rman_is_region_manager(r, &d->pd_rman), "bad resource"); + KASSERT(rman_is_region_manager(r, &d->pd_bus_rman), ("bad resource")); #endif return (rman_release_resource(r)); } @@ -178,7 +184,7 @@ * Release all allocated resources and remove them from the * parent's resource list. */ - STAILQ_FOREACH(rle, rl, link) { + STAILQ_FOREACH(rle, &hr->hr_rl, link) { if (rle->res != NULL) { bus_release_resource(pcib, rle->type, rle->rid, rle->res); @@ -186,7 +192,8 @@ } bus_delete_resource(pcib, rle->type, rle->rid); } - resource_list_delete(&hr->hr_rl); + resource_list_free(&hr->hr_rl); + return (0); } static struct rman * @@ -239,20 +246,21 @@ return (error); r = bus_alloc_resource_any(hr->hr_pcib, type, &rid, 0); if (r == NULL) { - device_printf(pcib, "Failed to allocate %d res %#lx-%#lx\n", - type, start, end); + device_printf(hr->hr_pcib, + "Failed to allocate %d res %#lx-%#lx\n", type, start, end); return (ENXIO); } KASSERT(rman_get_start(r) == start && rman_get_end(r) == end, ("resource mismatch")); error = rman_manage_region(rm, start, end); if (error) { - device_printf(pcib, "Failed to add %d res %#lx-%#lx to rman\n", - type, start, end); + device_printf(hr->hr_pcib, + "Failed to add %d res %#lx-%#lx to rman\n", type, start, + end); bus_release_resource(hr->hr_pcib, type, rid, r); return (error); } - rle = resource_list_add(&hr->hr_rl, type, start, end, count); + rle = resource_list_add(&hr->hr_rl, type, rid, start, end, count); rle->res = r; return (0); } @@ -264,7 +272,6 @@ { struct resource *r; struct rman *rm; - int error; rm = pcib_host_res_rman(hr, type); if (rm == NULL) @@ -280,7 +287,7 @@ } if (bootverbose) - device_printf(sc->dev, + device_printf(hr->hr_pcib, "allocated type %d (%#lx-%#lx) for rid %x of %s\n", type, rman_get_start(r), rman_get_end(r), *rid, pcib_child_name(dev)); @@ -292,7 +299,7 @@ * activating sub-allocated resources. */ if (flags & RF_ACTIVE) { - if (bus_activate_resource(child, type, *rid, r) != 0) { + if (bus_activate_resource(dev, type, *rid, r) != 0) { rman_release_resource(r); *rp = NULL; return (0); @@ -310,7 +317,8 @@ if (pcib_host_res_is_resource_managed(hr, type, r)) return (rman_adjust_resource(r, start, end)); - return (bus_generic_adjust_resource(bus, child, type, r, start, end)); + return (bus_generic_adjust_resource(hr->hr_pcib, dev, type, r, start, + end)); } int @@ -321,12 +329,11 @@ if (pcib_host_res_is_resource_managed(hr, type, r)) { if (rman_get_flags(r) & RF_ACTIVE) { - error = bus_deactivate_resource(child, type, rid, r); + error = bus_deactivate_resource(dev, type, rid, r); if (error) return (error); } return (rman_release_resource(r)); } - return (bus_generic_release_resource(dev, child, type, rid, r)); + return (bus_generic_release_resource(hr->hr_pcib, dev, type, rid, r)); } - ==== //depot/projects/pci/sys/dev/pci/pci_pci.c#13 (text+ko) ==== @@ -770,7 +770,7 @@ } #ifdef NEW_PCIB -static const char * +const char * pcib_child_name(device_t child) { static char buf[64]; ==== //depot/projects/pci/sys/dev/pci/pcib_private.h#10 (text+ko) ==== @@ -105,6 +105,7 @@ typedef uint32_t pci_read_config_fn(int b, int s, int f, int reg, int width); #ifdef NEW_PCIB +const char *pcib_child_name(device_t child); int pcib_host_res_init(device_t pcib, struct pcib_host_resources *hr); int pcib_host_res_free(device_t pcib, ==== //depot/projects/pci/sys/x86/x86/nexus.c#6 (text+ko) ==== @@ -70,7 +70,10 @@ #include #include +#ifdef PCI_RES_BUS +#include #include +#endif #ifdef DEV_APIC #include "pcib_if.h"