Commit 9472d8ce authored by Tony Luck's avatar Tony Luck

Pull acpi-produce-consume into release branch

parents 3168c31a 463eb297
...@@ -168,6 +168,29 @@ add_io_space (struct acpi_resource_address64 *addr) ...@@ -168,6 +168,29 @@ add_io_space (struct acpi_resource_address64 *addr)
return IO_SPACE_BASE(i); return IO_SPACE_BASE(i);
} }
static acpi_status __devinit resource_to_window(struct acpi_resource *resource,
struct acpi_resource_address64 *addr)
{
acpi_status status;
/*
* We're only interested in _CRS descriptors that are
* - address space descriptors for memory or I/O space
* - non-zero size
* - producers, i.e., the address space is routed downstream,
* not consumed by the bridge itself
*/
status = acpi_resource_to_address64(resource, addr);
if (ACPI_SUCCESS(status) &&
(addr->resource_type == ACPI_MEMORY_RANGE ||
addr->resource_type == ACPI_IO_RANGE) &&
addr->address_length &&
addr->producer_consumer == ACPI_PRODUCER)
return AE_OK;
return AE_ERROR;
}
static acpi_status __devinit static acpi_status __devinit
count_window (struct acpi_resource *resource, void *data) count_window (struct acpi_resource *resource, void *data)
{ {
...@@ -175,11 +198,9 @@ count_window (struct acpi_resource *resource, void *data) ...@@ -175,11 +198,9 @@ count_window (struct acpi_resource *resource, void *data)
struct acpi_resource_address64 addr; struct acpi_resource_address64 addr;
acpi_status status; acpi_status status;
status = acpi_resource_to_address64(resource, &addr); status = resource_to_window(resource, &addr);
if (ACPI_SUCCESS(status)) if (ACPI_SUCCESS(status))
if (addr.resource_type == ACPI_MEMORY_RANGE || (*windows)++;
addr.resource_type == ACPI_IO_RANGE)
(*windows)++;
return AE_OK; return AE_OK;
} }
...@@ -198,13 +219,11 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data) ...@@ -198,13 +219,11 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
unsigned long flags, offset = 0; unsigned long flags, offset = 0;
struct resource *root; struct resource *root;
status = acpi_resource_to_address64(res, &addr); /* Return AE_OK for non-window resources to keep scanning for more */
status = resource_to_window(res, &addr);
if (!ACPI_SUCCESS(status)) if (!ACPI_SUCCESS(status))
return AE_OK; return AE_OK;
if (!addr.address_length)
return AE_OK;
if (addr.resource_type == ACPI_MEMORY_RANGE) { if (addr.resource_type == ACPI_MEMORY_RANGE) {
flags = IORESOURCE_MEM; flags = IORESOURCE_MEM;
root = &iomem_resource; root = &iomem_resource;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment