[PATCH] PNPACPI: Use _CRS buffer directly as _SRS template

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Previously we went to a lot of trouble to count the supported descriptors
in _CRS, allocate a new buffer, copy the descriptor types to the new
buffer, and encode resources into the new buffer.  This will fail if _CRS
contains a descriptor type we don't support, even if we don't need to
change that descriptor.

I think it's simpler and more correct to just use the buffer returned from
_CRS directly, as suggested by the ACPI spec rev 5.0, sec 6.2.15.

Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
---
 drivers/pnp/pnpacpi/core.c     |   10 +++--
 drivers/pnp/pnpacpi/rsparser.c |   85 ----------------------------------------
 2 files changed, 6 insertions(+), 89 deletions(-)

diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index 72e822e..701e00e 100644
--- a/drivers/pnp/pnpacpi/core.c
+++ b/drivers/pnp/pnpacpi/core.c
@@ -84,7 +84,8 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)
 {
 	struct acpi_device *acpi_dev;
 	acpi_handle handle;
-	struct acpi_buffer buffer;
+	struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
+	acpi_status status;
 	int ret;
 
 	pnp_dbg(&dev->dev, "set resources\n");
@@ -98,9 +99,10 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)
 	if (WARN_ON_ONCE(acpi_dev != dev->data))
 		dev->data = acpi_dev;
 
-	ret = pnpacpi_build_resource_template(dev, &buffer);
-	if (ret)
-		return ret;
+	status = acpi_evaluate_object(handle, METHOD_NAME__CRS, NULL, &buffer);
+	if (ACPI_FAILURE(status))
+		return -EINVAL;
+
 	ret = pnpacpi_encode_resources(dev, &buffer);
 	if (ret) {
 		kfree(buffer.pointer);
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c
index b8f4ea7..629710a 100644
--- a/drivers/pnp/pnpacpi/rsparser.c
+++ b/drivers/pnp/pnpacpi/rsparser.c
@@ -553,91 +553,6 @@ int __init pnpacpi_parse_resource_option_data(struct pnp_dev *dev)
 	return 0;
 }
 
-static int pnpacpi_supported_resource(struct acpi_resource *res)
-{
-	switch (res->type) {
-	case ACPI_RESOURCE_TYPE_IRQ:
-	case ACPI_RESOURCE_TYPE_DMA:
-	case ACPI_RESOURCE_TYPE_IO:
-	case ACPI_RESOURCE_TYPE_FIXED_IO:
-	case ACPI_RESOURCE_TYPE_MEMORY24:
-	case ACPI_RESOURCE_TYPE_MEMORY32:
-	case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
-	case ACPI_RESOURCE_TYPE_ADDRESS16:
-	case ACPI_RESOURCE_TYPE_ADDRESS32:
-	case ACPI_RESOURCE_TYPE_ADDRESS64:
-	case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
-	case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
-		return 1;
-	}
-	return 0;
-}
-
-/*
- * Set resource
- */
-static acpi_status pnpacpi_count_resources(struct acpi_resource *res,
-					   void *data)
-{
-	int *res_cnt = data;
-
-	if (pnpacpi_supported_resource(res))
-		(*res_cnt)++;
-	return AE_OK;
-}
-
-static acpi_status pnpacpi_type_resources(struct acpi_resource *res, void *data)
-{
-	struct acpi_resource **resource = data;
-
-	if (pnpacpi_supported_resource(res)) {
-		(*resource)->type = res->type;
-		(*resource)->length = sizeof(struct acpi_resource);
-		if (res->type == ACPI_RESOURCE_TYPE_IRQ)
-			(*resource)->data.irq.descriptor_length =
-					res->data.irq.descriptor_length;
-		(*resource)++;
-	}
-
-	return AE_OK;
-}
-
-int pnpacpi_build_resource_template(struct pnp_dev *dev,
-				    struct acpi_buffer *buffer)
-{
-	struct acpi_device *acpi_dev = dev->data;
-	acpi_handle handle = acpi_dev->handle;
-	struct acpi_resource *resource;
-	int res_cnt = 0;
-	acpi_status status;
-
-	status = acpi_walk_resources(handle, METHOD_NAME__CRS,
-				     pnpacpi_count_resources, &res_cnt);
-	if (ACPI_FAILURE(status)) {
-		dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
-		return -EINVAL;
-	}
-	if (!res_cnt)
-		return -EINVAL;
-	buffer->length = sizeof(struct acpi_resource) * (res_cnt + 1) + 1;
-	buffer->pointer = kzalloc(buffer->length - 1, GFP_KERNEL);
-	if (!buffer->pointer)
-		return -ENOMEM;
-
-	resource = (struct acpi_resource *)buffer->pointer;
-	status = acpi_walk_resources(handle, METHOD_NAME__CRS,
-				     pnpacpi_type_resources, &resource);
-	if (ACPI_FAILURE(status)) {
-		kfree(buffer->pointer);
-		dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
-		return -EINVAL;
-	}
-	/* resource will pointer the end resource now */
-	resource->type = ACPI_RESOURCE_TYPE_END_TAG;
-
-	return 0;
-}
-
 static void pnpacpi_encode_irq(struct pnp_dev *dev,
 			       struct acpi_resource *resource,
 			       struct resource *p)

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux