diff options
author | Lv Zheng <lv.zheng@intel.com> | 2014-05-20 03:39:41 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-05-27 12:13:08 -0400 |
commit | a238317ce8185519ed083e81e84260907fbbcf7f (patch) | |
tree | f5b228ac40941946db2e7427b1085a90c78c85b5 /drivers/acpi/osl.c | |
parent | 92985ef1db428cc6129a1d375a68c277aa05820b (diff) |
ACPI: Clean up acpi_os_map/unmap_memory() to eliminate __iomem.
ACPICA doesn't include protections around address space checking, Linux
build tests always complain increased sparse warnings around ACPICA
internal acpi_os_map/unmap_memory() invocations. This patch tries to fix
this issue permanently.
There are 2 choices left for us to solve this issue:
1. Add __iomem address space awareness into ACPICA.
2. Remove sparse checker of __iomem from ACPICA source code.
This patch chooses solution 2, because:
1. Most of the acpi_os_map/unmap_memory() invocations are used for ACPICA.
table mappings, which in fact are not IO addresses.
2. The only IO addresses usage is for "system memory space" mapping code in:
drivers/acpi/acpica/exregion.c
drivers/acpi/acpica/evrgnini.c
drivers/acpi/acpica/exregion.c
The mapped address is accessed in the handler of "system memory space"
- acpi_ex_system_memory_space_handler(). This function in fact can be
changed to invoke acpi_os_read/write_memory() so that __iomem can
always be type-casted in the OSL layer.
According to the above investigation, we drew the following conclusion:
It is not a good idea to introduce __iomem address space awareness into
ACPICA mostly in order to protect non-IO addresses.
We can simply remove __iomem for acpi_os_map/unmap_memory() to remove
__iomem checker for ACPICA code. Then we need to enforce external usages
to invoke other APIs that are aware of __iomem address space.
The external usages are:
drivers/acpi/apei/einj.c
drivers/acpi/acpi_extlog.c
drivers/char/tpm/tpm_acpi.c
drivers/acpi/nvs.c
This patch thus performs cleanups in this way:
1. Add acpi_os_map/unmap_iomem() to be invoked by non-ACPICA code.
2. Remove __iomem from acpi_os_map/unmap_memory().
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/osl.c')
-rw-r--r-- | drivers/acpi/osl.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 9aeae41e22fb..147bc1b91b42 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -355,7 +355,7 @@ static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr) | |||
355 | } | 355 | } |
356 | 356 | ||
357 | void __iomem *__init_refok | 357 | void __iomem *__init_refok |
358 | acpi_os_map_memory(acpi_physical_address phys, acpi_size size) | 358 | acpi_os_map_iomem(acpi_physical_address phys, acpi_size size) |
359 | { | 359 | { |
360 | struct acpi_ioremap *map; | 360 | struct acpi_ioremap *map; |
361 | void __iomem *virt; | 361 | void __iomem *virt; |
@@ -401,10 +401,17 @@ acpi_os_map_memory(acpi_physical_address phys, acpi_size size) | |||
401 | 401 | ||
402 | list_add_tail_rcu(&map->list, &acpi_ioremaps); | 402 | list_add_tail_rcu(&map->list, &acpi_ioremaps); |
403 | 403 | ||
404 | out: | 404 | out: |
405 | mutex_unlock(&acpi_ioremap_lock); | 405 | mutex_unlock(&acpi_ioremap_lock); |
406 | return map->virt + (phys - map->phys); | 406 | return map->virt + (phys - map->phys); |
407 | } | 407 | } |
408 | EXPORT_SYMBOL_GPL(acpi_os_map_iomem); | ||
409 | |||
410 | void *__init_refok | ||
411 | acpi_os_map_memory(acpi_physical_address phys, acpi_size size) | ||
412 | { | ||
413 | return (void *)acpi_os_map_iomem(phys, size); | ||
414 | } | ||
408 | EXPORT_SYMBOL_GPL(acpi_os_map_memory); | 415 | EXPORT_SYMBOL_GPL(acpi_os_map_memory); |
409 | 416 | ||
410 | static void acpi_os_drop_map_ref(struct acpi_ioremap *map) | 417 | static void acpi_os_drop_map_ref(struct acpi_ioremap *map) |
@@ -422,7 +429,7 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map) | |||
422 | } | 429 | } |
423 | } | 430 | } |
424 | 431 | ||
425 | void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size) | 432 | void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size) |
426 | { | 433 | { |
427 | struct acpi_ioremap *map; | 434 | struct acpi_ioremap *map; |
428 | 435 | ||
@@ -443,6 +450,12 @@ void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size) | |||
443 | 450 | ||
444 | acpi_os_map_cleanup(map); | 451 | acpi_os_map_cleanup(map); |
445 | } | 452 | } |
453 | EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem); | ||
454 | |||
455 | void __ref acpi_os_unmap_memory(void *virt, acpi_size size) | ||
456 | { | ||
457 | return acpi_os_unmap_iomem((void __iomem *)virt, size); | ||
458 | } | ||
446 | EXPORT_SYMBOL_GPL(acpi_os_unmap_memory); | 459 | EXPORT_SYMBOL_GPL(acpi_os_unmap_memory); |
447 | 460 | ||
448 | void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size) | 461 | void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size) |
@@ -464,7 +477,7 @@ int acpi_os_map_generic_address(struct acpi_generic_address *gas) | |||
464 | if (!addr || !gas->bit_width) | 477 | if (!addr || !gas->bit_width) |
465 | return -EINVAL; | 478 | return -EINVAL; |
466 | 479 | ||
467 | virt = acpi_os_map_memory(addr, gas->bit_width / 8); | 480 | virt = acpi_os_map_iomem(addr, gas->bit_width / 8); |
468 | if (!virt) | 481 | if (!virt) |
469 | return -EIO; | 482 | return -EIO; |
470 | 483 | ||