aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/osl.c
diff options
context:
space:
mode:
authorLv Zheng <lv.zheng@intel.com>2014-05-20 03:39:41 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-05-27 12:13:08 -0400
commita238317ce8185519ed083e81e84260907fbbcf7f (patch)
treef5b228ac40941946db2e7427b1085a90c78c85b5 /drivers/acpi/osl.c
parent92985ef1db428cc6129a1d375a68c277aa05820b (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.c21
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
357void __iomem *__init_refok 357void __iomem *__init_refok
358acpi_os_map_memory(acpi_physical_address phys, acpi_size size) 358acpi_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: 404out:
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}
408EXPORT_SYMBOL_GPL(acpi_os_map_iomem);
409
410void *__init_refok
411acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
412{
413 return (void *)acpi_os_map_iomem(phys, size);
414}
408EXPORT_SYMBOL_GPL(acpi_os_map_memory); 415EXPORT_SYMBOL_GPL(acpi_os_map_memory);
409 416
410static void acpi_os_drop_map_ref(struct acpi_ioremap *map) 417static 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
425void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size) 432void __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}
453EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem);
454
455void __ref acpi_os_unmap_memory(void *virt, acpi_size size)
456{
457 return acpi_os_unmap_iomem((void __iomem *)virt, size);
458}
446EXPORT_SYMBOL_GPL(acpi_os_unmap_memory); 459EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);
447 460
448void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size) 461void __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