|
@@ -178,6 +178,35 @@ bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(acpi_dev_resource_io);
|
|
EXPORT_SYMBOL_GPL(acpi_dev_resource_io);
|
|
|
|
|
|
|
|
+static bool acpi_decode_space(struct resource *res,
|
|
|
|
+ struct acpi_resource_address *addr,
|
|
|
|
+ struct acpi_address64_attribute *attr)
|
|
|
|
+{
|
|
|
|
+ u8 iodec = attr->granularity == 0xfff ? ACPI_DECODE_10 : ACPI_DECODE_16;
|
|
|
|
+ bool window = addr->producer_consumer == ACPI_PRODUCER;
|
|
|
|
+ bool wp = addr->info.mem.write_protect;
|
|
|
|
+ u64 len = attr->address_length;
|
|
|
|
+
|
|
|
|
+ res->start = attr->minimum;
|
|
|
|
+ res->end = attr->maximum;
|
|
|
|
+
|
|
|
|
+ switch (addr->resource_type) {
|
|
|
|
+ case ACPI_MEMORY_RANGE:
|
|
|
|
+ acpi_dev_memresource_flags(res, len, wp, window);
|
|
|
|
+ break;
|
|
|
|
+ case ACPI_IO_RANGE:
|
|
|
|
+ acpi_dev_ioresource_flags(res, len, iodec, window);
|
|
|
|
+ break;
|
|
|
|
+ case ACPI_BUS_NUMBER_RANGE:
|
|
|
|
+ res->flags = IORESOURCE_BUS;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return !(res->flags & IORESOURCE_DISABLED);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* acpi_dev_resource_address_space - Extract ACPI address space information.
|
|
* acpi_dev_resource_address_space - Extract ACPI address space information.
|
|
* @ares: Input ACPI resource object.
|
|
* @ares: Input ACPI resource object.
|
|
@@ -190,39 +219,13 @@ EXPORT_SYMBOL_GPL(acpi_dev_resource_io);
|
|
bool acpi_dev_resource_address_space(struct acpi_resource *ares,
|
|
bool acpi_dev_resource_address_space(struct acpi_resource *ares,
|
|
struct resource *res)
|
|
struct resource *res)
|
|
{
|
|
{
|
|
- acpi_status status;
|
|
|
|
struct acpi_resource_address64 addr;
|
|
struct acpi_resource_address64 addr;
|
|
- bool window;
|
|
|
|
- u8 io_decode;
|
|
|
|
-
|
|
|
|
- status = acpi_resource_to_address64(ares, &addr);
|
|
|
|
- if (ACPI_FAILURE(status))
|
|
|
|
- return false;
|
|
|
|
|
|
|
|
- res->start = addr.address.minimum;
|
|
|
|
- res->end = addr.address.maximum;
|
|
|
|
- window = addr.producer_consumer == ACPI_PRODUCER;
|
|
|
|
-
|
|
|
|
- switch(addr.resource_type) {
|
|
|
|
- case ACPI_MEMORY_RANGE:
|
|
|
|
- acpi_dev_memresource_flags(res, addr.address.address_length,
|
|
|
|
- addr.info.mem.write_protect,
|
|
|
|
- window);
|
|
|
|
- break;
|
|
|
|
- case ACPI_IO_RANGE:
|
|
|
|
- io_decode = addr.address.granularity == 0xfff ?
|
|
|
|
- ACPI_DECODE_10 : ACPI_DECODE_16;
|
|
|
|
- acpi_dev_ioresource_flags(res, addr.address.address_length,
|
|
|
|
- io_decode, window);
|
|
|
|
- break;
|
|
|
|
- case ACPI_BUS_NUMBER_RANGE:
|
|
|
|
- res->flags = IORESOURCE_BUS;
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
|
|
+ if (ACPI_FAILURE(acpi_resource_to_address64(ares, &addr)))
|
|
return false;
|
|
return false;
|
|
- }
|
|
|
|
|
|
|
|
- return !(res->flags & IORESOURCE_DISABLED);
|
|
|
|
|
|
+ return acpi_decode_space(res, (struct acpi_resource_address *)&addr,
|
|
|
|
+ &addr.address);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(acpi_dev_resource_address_space);
|
|
EXPORT_SYMBOL_GPL(acpi_dev_resource_address_space);
|
|
|
|
|
|
@@ -239,39 +242,14 @@ bool acpi_dev_resource_ext_address_space(struct acpi_resource *ares,
|
|
struct resource *res)
|
|
struct resource *res)
|
|
{
|
|
{
|
|
struct acpi_resource_extended_address64 *ext_addr;
|
|
struct acpi_resource_extended_address64 *ext_addr;
|
|
- bool window;
|
|
|
|
- u8 io_decode;
|
|
|
|
|
|
|
|
if (ares->type != ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64)
|
|
if (ares->type != ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
ext_addr = &ares->data.ext_address64;
|
|
ext_addr = &ares->data.ext_address64;
|
|
|
|
|
|
- res->start = ext_addr->address.minimum;
|
|
|
|
- res->end = ext_addr->address.maximum;
|
|
|
|
- window = ext_addr->producer_consumer == ACPI_PRODUCER;
|
|
|
|
-
|
|
|
|
- switch(ext_addr->resource_type) {
|
|
|
|
- case ACPI_MEMORY_RANGE:
|
|
|
|
- acpi_dev_memresource_flags(res,
|
|
|
|
- ext_addr->address.address_length,
|
|
|
|
- ext_addr->info.mem.write_protect,
|
|
|
|
- window);
|
|
|
|
- break;
|
|
|
|
- case ACPI_IO_RANGE:
|
|
|
|
- io_decode = ext_addr->address.granularity == 0xfff ?
|
|
|
|
- ACPI_DECODE_10 : ACPI_DECODE_16;
|
|
|
|
- acpi_dev_ioresource_flags(res, ext_addr->address.address_length,
|
|
|
|
- io_decode, window);
|
|
|
|
- break;
|
|
|
|
- case ACPI_BUS_NUMBER_RANGE:
|
|
|
|
- res->flags = IORESOURCE_BUS;
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return !(res->flags & IORESOURCE_DISABLED);
|
|
|
|
|
|
+ return acpi_decode_space(res, (struct acpi_resource_address *)ext_addr,
|
|
|
|
+ &ext_addr->address);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(acpi_dev_resource_ext_address_space);
|
|
EXPORT_SYMBOL_GPL(acpi_dev_resource_ext_address_space);
|
|
|
|
|