diff options
author | Jiang Liu <jiang.liu@linux.intel.com> | 2015-02-02 10:42:59 +0800 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-02-03 22:27:21 +0100 |
commit | 2ea3d266bab3b497238113b20136f7c3f69ad9c0 (patch) | |
tree | d58f31464a40ec722efce3791a74e70e0e16b5f3 /drivers/acpi/resource.c | |
parent | a49170b552423a3e85fc4f0d778c707402ee4863 (diff) | |
download | linux-2ea3d266bab3b497238113b20136f7c3f69ad9c0.tar.gz linux-2ea3d266bab3b497238113b20136f7c3f69ad9c0.tar.bz2 linux-2ea3d266bab3b497238113b20136f7c3f69ad9c0.zip |
ACPI: Translate resource into master side address for bridge window resources
Add translation_offset into the result address for bridge window
resources to form the master side address.
Currently acpi_dev_resource_{ext_}address_space() are only used for
devices instead of bridges, so it won't break current users. Later
it will be used to support PCI host bridge drivers.
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/resource.c')
-rw-r--r-- | drivers/acpi/resource.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index c902c8eece81..4dc8cfb2e94e 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c @@ -205,6 +205,21 @@ static bool acpi_decode_space(struct resource_win *win, res->start = attr->minimum; res->end = attr->maximum; + /* + * For bridges that translate addresses across the bridge, + * translation_offset is the offset that must be added to the + * address on the secondary side to obtain the address on the + * primary side. Non-bridge devices must list 0 for all Address + * Translation offset bits. + */ + if (addr->producer_consumer == ACPI_PRODUCER) { + res->start += attr->translation_offset; + res->end += attr->translation_offset; + } else if (attr->translation_offset) { + pr_debug("ACPI: translation_offset(%lld) is invalid for non-bridge device.\n", + attr->translation_offset); + } + switch (addr->resource_type) { case ACPI_MEMORY_RANGE: acpi_dev_memresource_flags(res, len, wp); |