mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
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>
This commit is contained in:
committed by
Rafael J. Wysocki
parent
92985ef1db
commit
a238317ce8
@@ -202,7 +202,7 @@ static void check_vendor_extension(u64 paddr,
|
||||
|
||||
if (!offset)
|
||||
return;
|
||||
v = acpi_os_map_memory(paddr + offset, sizeof(*v));
|
||||
v = acpi_os_map_iomem(paddr + offset, sizeof(*v));
|
||||
if (!v)
|
||||
return;
|
||||
sbdf = v->pcie_sbdf;
|
||||
@@ -210,7 +210,7 @@ static void check_vendor_extension(u64 paddr,
|
||||
sbdf >> 24, (sbdf >> 16) & 0xff,
|
||||
(sbdf >> 11) & 0x1f, (sbdf >> 8) & 0x7,
|
||||
v->vendor_id, v->device_id, v->rev_id);
|
||||
acpi_os_unmap_memory(v, sizeof(*v));
|
||||
acpi_os_unmap_iomem(v, sizeof(*v));
|
||||
}
|
||||
|
||||
static void *einj_get_parameter_address(void)
|
||||
@@ -236,7 +236,7 @@ static void *einj_get_parameter_address(void)
|
||||
if (pa_v5) {
|
||||
struct set_error_type_with_address *v5param;
|
||||
|
||||
v5param = acpi_os_map_memory(pa_v5, sizeof(*v5param));
|
||||
v5param = acpi_os_map_iomem(pa_v5, sizeof(*v5param));
|
||||
if (v5param) {
|
||||
acpi5 = 1;
|
||||
check_vendor_extension(pa_v5, v5param);
|
||||
@@ -246,11 +246,11 @@ static void *einj_get_parameter_address(void)
|
||||
if (param_extension && pa_v4) {
|
||||
struct einj_parameter *v4param;
|
||||
|
||||
v4param = acpi_os_map_memory(pa_v4, sizeof(*v4param));
|
||||
v4param = acpi_os_map_iomem(pa_v4, sizeof(*v4param));
|
||||
if (!v4param)
|
||||
return NULL;
|
||||
if (v4param->reserved1 || v4param->reserved2) {
|
||||
acpi_os_unmap_memory(v4param, sizeof(*v4param));
|
||||
acpi_os_unmap_iomem(v4param, sizeof(*v4param));
|
||||
return NULL;
|
||||
}
|
||||
return v4param;
|
||||
@@ -794,7 +794,7 @@ err_unmap:
|
||||
sizeof(struct set_error_type_with_address) :
|
||||
sizeof(struct einj_parameter);
|
||||
|
||||
acpi_os_unmap_memory(einj_param, size);
|
||||
acpi_os_unmap_iomem(einj_param, size);
|
||||
}
|
||||
apei_exec_post_unmap_gars(&ctx);
|
||||
err_release:
|
||||
@@ -816,7 +816,7 @@ static void __exit einj_exit(void)
|
||||
sizeof(struct set_error_type_with_address) :
|
||||
sizeof(struct einj_parameter);
|
||||
|
||||
acpi_os_unmap_memory(einj_param, size);
|
||||
acpi_os_unmap_iomem(einj_param, size);
|
||||
}
|
||||
einj_exec_ctx_init(&ctx);
|
||||
apei_exec_post_unmap_gars(&ctx);
|
||||
|
Reference in New Issue
Block a user