|
@@ -66,13 +66,44 @@ resource_to_addr(struct acpi_resource *resource,
|
|
|
struct acpi_resource_address64 *addr)
|
|
|
{
|
|
|
acpi_status status;
|
|
|
-
|
|
|
- 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 > 0) {
|
|
|
+ struct acpi_resource_memory24 *memory24;
|
|
|
+ struct acpi_resource_memory32 *memory32;
|
|
|
+ struct acpi_resource_fixed_memory32 *fixed_memory32;
|
|
|
+
|
|
|
+ memset(addr, 0, sizeof(*addr));
|
|
|
+ switch (resource->type) {
|
|
|
+ case ACPI_RESOURCE_TYPE_MEMORY24:
|
|
|
+ memory24 = &resource->data.memory24;
|
|
|
+ addr->resource_type = ACPI_MEMORY_RANGE;
|
|
|
+ addr->minimum = memory24->minimum;
|
|
|
+ addr->address_length = memory24->address_length;
|
|
|
+ addr->maximum = addr->minimum + addr->address_length - 1;
|
|
|
+ return AE_OK;
|
|
|
+ case ACPI_RESOURCE_TYPE_MEMORY32:
|
|
|
+ memory32 = &resource->data.memory32;
|
|
|
+ addr->resource_type = ACPI_MEMORY_RANGE;
|
|
|
+ addr->minimum = memory32->minimum;
|
|
|
+ addr->address_length = memory32->address_length;
|
|
|
+ addr->maximum = addr->minimum + addr->address_length - 1;
|
|
|
return AE_OK;
|
|
|
+ case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
|
|
|
+ fixed_memory32 = &resource->data.fixed_memory32;
|
|
|
+ addr->resource_type = ACPI_MEMORY_RANGE;
|
|
|
+ addr->minimum = fixed_memory32->address;
|
|
|
+ addr->address_length = fixed_memory32->address_length;
|
|
|
+ addr->maximum = addr->minimum + addr->address_length - 1;
|
|
|
+ return AE_OK;
|
|
|
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
|
|
|
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
|
|
|
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
|
|
|
+ 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 > 0) {
|
|
|
+ return AE_OK;
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
return AE_ERROR;
|
|
|
}
|