diff options
author | Leif Lindholm <leif.lindholm@linaro.org> | 2013-09-05 06:34:55 -0400 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2013-09-05 08:29:29 -0400 |
commit | 258f6fd738221766b512cd8c7120563b78d62829 (patch) | |
tree | f2796181d313ef0cb9f0d516fd6a63e910d8b9a7 /drivers/firmware/efi | |
parent | 272686bf46a34f86d270cf192f68769667792026 (diff) |
efi: x86: make efi_lookup_mapped_addr() a common function
efi_lookup_mapped_addr() is a handy utility for other platforms than
x86. Move it from arch/x86 to drivers/firmware. Add memmap pointer
to global efi structure, and initialise it on x86.
Signed-off-by: Leif Lindholm <leif.lindholm@linaro.org>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'drivers/firmware/efi')
-rw-r--r-- | drivers/firmware/efi/efi.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index e1010d450b65..2e2fbdec0845 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c | |||
@@ -150,6 +150,38 @@ err_put: | |||
150 | subsys_initcall(efisubsys_init); | 150 | subsys_initcall(efisubsys_init); |
151 | 151 | ||
152 | 152 | ||
153 | /* | ||
154 | * We can't ioremap data in EFI boot services RAM, because we've already mapped | ||
155 | * it as RAM. So, look it up in the existing EFI memory map instead. Only | ||
156 | * callable after efi_enter_virtual_mode and before efi_free_boot_services. | ||
157 | */ | ||
158 | void __iomem *efi_lookup_mapped_addr(u64 phys_addr) | ||
159 | { | ||
160 | struct efi_memory_map *map; | ||
161 | void *p; | ||
162 | map = efi.memmap; | ||
163 | if (!map) | ||
164 | return NULL; | ||
165 | if (WARN_ON(!map->map)) | ||
166 | return NULL; | ||
167 | for (p = map->map; p < map->map_end; p += map->desc_size) { | ||
168 | efi_memory_desc_t *md = p; | ||
169 | u64 size = md->num_pages << EFI_PAGE_SHIFT; | ||
170 | u64 end = md->phys_addr + size; | ||
171 | if (!(md->attribute & EFI_MEMORY_RUNTIME) && | ||
172 | md->type != EFI_BOOT_SERVICES_CODE && | ||
173 | md->type != EFI_BOOT_SERVICES_DATA) | ||
174 | continue; | ||
175 | if (!md->virt_addr) | ||
176 | continue; | ||
177 | if (phys_addr >= md->phys_addr && phys_addr < end) { | ||
178 | phys_addr += md->virt_addr - md->phys_addr; | ||
179 | return (__force void __iomem *)(unsigned long)phys_addr; | ||
180 | } | ||
181 | } | ||
182 | return NULL; | ||
183 | } | ||
184 | |||
153 | static __initdata efi_config_table_type_t common_tables[] = { | 185 | static __initdata efi_config_table_type_t common_tables[] = { |
154 | {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20}, | 186 | {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20}, |
155 | {ACPI_TABLE_GUID, "ACPI", &efi.acpi}, | 187 | {ACPI_TABLE_GUID, "ACPI", &efi.acpi}, |