svn commit: r227397 - stable/9/sys/dev/acpica
John Baldwin
jhb at FreeBSD.org
Wed Nov 9 18:12:43 UTC 2011
Author: jhb
Date: Wed Nov 9 18:12:42 2011
New Revision: 227397
URL: http://svn.freebsd.org/changeset/base/227397
Log:
MFC 226302:
If an allocation for a specific resource range fails because it is not in
a decoded range for an ACPI Host-PCI bridge, try to allocate it from the
ACPI system resource range. If that works, permit the resource allocation
regardless.
Approved by: re (kib)
Modified:
stable/9/sys/dev/acpica/acpi.c
stable/9/sys/dev/acpica/acpi_pcib_acpi.c
stable/9/sys/dev/acpica/acpivar.h
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/amd64/include/xen/ (props changed)
stable/9/sys/boot/ (props changed)
stable/9/sys/boot/i386/efi/ (props changed)
stable/9/sys/boot/ia64/efi/ (props changed)
stable/9/sys/boot/ia64/ski/ (props changed)
stable/9/sys/boot/powerpc/boot1.chrp/ (props changed)
stable/9/sys/boot/powerpc/ofw/ (props changed)
stable/9/sys/cddl/contrib/opensolaris/ (props changed)
stable/9/sys/conf/ (props changed)
stable/9/sys/contrib/dev/acpica/ (props changed)
stable/9/sys/contrib/octeon-sdk/ (props changed)
stable/9/sys/contrib/pf/ (props changed)
stable/9/sys/contrib/x86emu/ (props changed)
Modified: stable/9/sys/dev/acpica/acpi.c
==============================================================================
--- stable/9/sys/dev/acpica/acpi.c Wed Nov 9 18:11:29 2011 (r227396)
+++ stable/9/sys/dev/acpica/acpi.c Wed Nov 9 18:12:42 2011 (r227397)
@@ -1238,7 +1238,6 @@ acpi_alloc_resource(device_t bus, device
struct resource_list_entry *rle;
struct resource_list *rl;
struct resource *res;
- struct rman *rm;
int isdefault = (start == 0UL && end == ~0UL);
/*
@@ -1291,15 +1290,29 @@ acpi_alloc_resource(device_t bus, device
} else
res = BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, rid,
start, end, count, flags);
- if (res != NULL || start + count - 1 != end)
- return (res);
/*
* If the first attempt failed and this is an allocation of a
* specific range, try to satisfy the request via a suballocation
- * from our system resource regions. Note that we only handle
- * memory and I/O port system resources.
+ * from our system resource regions.
*/
+ if (res == NULL && start + count - 1 == end)
+ res = acpi_alloc_sysres(child, type, rid, start, end, count, flags);
+ return (res);
+}
+
+/*
+ * Attempt to allocate a specific resource range from the system
+ * resource ranges. Note that we only handle memory and I/O port
+ * system resources.
+ */
+struct resource *
+acpi_alloc_sysres(device_t child, int type, int *rid, u_long start, u_long end,
+ u_long count, u_int flags)
+{
+ struct rman *rm;
+ struct resource *res;
+
switch (type) {
case SYS_RES_IOPORT:
rm = &acpi_rman_io;
@@ -1311,6 +1324,7 @@ acpi_alloc_resource(device_t bus, device
return (NULL);
}
+ KASSERT(start + count - 1 == end, ("wildcard resource range"));
res = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE,
child);
if (res == NULL)
Modified: stable/9/sys/dev/acpica/acpi_pcib_acpi.c
==============================================================================
--- stable/9/sys/dev/acpica/acpi_pcib_acpi.c Wed Nov 9 18:11:29 2011 (r227396)
+++ stable/9/sys/dev/acpica/acpi_pcib_acpi.c Wed Nov 9 18:12:42 2011 (r227397)
@@ -501,6 +501,7 @@ acpi_pcib_acpi_alloc_resource(device_t d
{
#ifdef NEW_PCIB
struct acpi_hpcib_softc *sc;
+ struct resource *res;
#endif
#if defined(__i386__) || defined(__amd64__)
@@ -509,8 +510,11 @@ acpi_pcib_acpi_alloc_resource(device_t d
#ifdef NEW_PCIB
sc = device_get_softc(dev);
- return (pcib_host_res_alloc(&sc->ap_host_res, child, type, rid, start, end,
- count, flags));
+ res = pcib_host_res_alloc(&sc->ap_host_res, child, type, rid, start, end,
+ count, flags);
+ if (res == NULL && start + count - 1 == end)
+ res = acpi_alloc_sysres(child, type, rid, start, end, count, flags);
+ return (res);
#else
return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
count, flags));
Modified: stable/9/sys/dev/acpica/acpivar.h
==============================================================================
--- stable/9/sys/dev/acpica/acpivar.h Wed Nov 9 18:11:29 2011 (r227396)
+++ stable/9/sys/dev/acpica/acpivar.h Wed Nov 9 18:12:42 2011 (r227397)
@@ -382,6 +382,8 @@ ACPI_STATUS acpi_lookup_irq_resource(dev
struct resource *res, ACPI_RESOURCE *acpi_res);
ACPI_STATUS acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
struct acpi_parse_resource_set *set, void *arg);
+struct resource *acpi_alloc_sysres(device_t child, int type, int *rid,
+ u_long start, u_long end, u_long count, u_int flags);
/* ACPI event handling */
UINT32 acpi_event_power_button_sleep(void *context);
More information about the svn-src-stable-9
mailing list