x86: EFI: Back efi_ioremap with init_memory_mapping instead of FIX_MAP
Impact: Fix boot failure on EFI system with large runtime memory range Brian Maly reported that some EFI system with large runtime memory range can not boot. Because the FIX_MAP used to map runtime memory range is smaller than run time memory range. This patch fixes this issue by re-implement efi_ioremap() with init_memory_mapping(). Reported-and-tested-by: Brian Maly <bmaly@redhat.com> Signed-off-by: Huang Ying <ying.huang@intel.com> Cc: Brian Maly <bmaly@redhat.com> Cc: Yinghai Lu <yinghai@kernel.org> LKML-Reference: <1236135513.6204.306.camel@yhuang-dev.sh.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -99,24 +99,11 @@ void __init efi_call_phys_epilog(void)
|
||||
|
||||
void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)
|
||||
{
|
||||
static unsigned pages_mapped __initdata;
|
||||
unsigned i, pages;
|
||||
unsigned long offset;
|
||||
unsigned long last_map_pfn;
|
||||
|
||||
pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr);
|
||||
offset = phys_addr & ~PAGE_MASK;
|
||||
phys_addr &= PAGE_MASK;
|
||||
|
||||
if (pages_mapped + pages > MAX_EFI_IO_PAGES)
|
||||
last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size);
|
||||
if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < pages; i++) {
|
||||
__set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped,
|
||||
phys_addr, PAGE_KERNEL);
|
||||
phys_addr += PAGE_SIZE;
|
||||
pages_mapped++;
|
||||
}
|
||||
|
||||
return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \
|
||||
(pages_mapped - pages)) + offset;
|
||||
return (void __iomem *)__va(phys_addr);
|
||||
}
|
||||
|
Reference in New Issue
Block a user