Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

Pull acpi-produce-consume into release branch

parents 3168c31a 463eb297
Loading
Loading
Loading
Loading
+27 −8
Original line number Diff line number Diff line
@@ -168,6 +168,29 @@ add_io_space (struct acpi_resource_address64 *addr)
	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
count_window (struct acpi_resource *resource, void *data)
{
@@ -175,10 +198,8 @@ count_window (struct acpi_resource *resource, void *data)
	struct acpi_resource_address64 addr;
	acpi_status status;

	status = acpi_resource_to_address64(resource, &addr);
	status = resource_to_window(resource, &addr);
	if (ACPI_SUCCESS(status))
		if (addr.resource_type == ACPI_MEMORY_RANGE ||
		    addr.resource_type == ACPI_IO_RANGE)
		(*windows)++;

	return AE_OK;
@@ -198,13 +219,11 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
	unsigned long flags, offset = 0;
	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))
		return AE_OK;

	if (!addr.address_length)
		return AE_OK;

	if (addr.resource_type == ACPI_MEMORY_RANGE) {
		flags = IORESOURCE_MEM;
		root = &iomem_resource;