diff options
| -rw-r--r-- | arch/x86/include/asm/efi.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/fixmap_64.h | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/efi.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/efi_64.c | 21 |
4 files changed, 9 insertions, 25 deletions
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index ca5ffb2856b6..edc90f23e708 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
| @@ -37,8 +37,6 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...); | |||
| 37 | 37 | ||
| 38 | #else /* !CONFIG_X86_32 */ | 38 | #else /* !CONFIG_X86_32 */ |
| 39 | 39 | ||
| 40 | #define MAX_EFI_IO_PAGES 100 | ||
| 41 | |||
| 42 | extern u64 efi_call0(void *fp); | 40 | extern u64 efi_call0(void *fp); |
| 43 | extern u64 efi_call1(void *fp, u64 arg1); | 41 | extern u64 efi_call1(void *fp, u64 arg1); |
| 44 | extern u64 efi_call2(void *fp, u64 arg1, u64 arg2); | 42 | extern u64 efi_call2(void *fp, u64 arg1, u64 arg2); |
diff --git a/arch/x86/include/asm/fixmap_64.h b/arch/x86/include/asm/fixmap_64.h index 00a30ab9b1a5..8be740977db8 100644 --- a/arch/x86/include/asm/fixmap_64.h +++ b/arch/x86/include/asm/fixmap_64.h | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | #include <asm/apicdef.h> | 16 | #include <asm/apicdef.h> |
| 17 | #include <asm/page.h> | 17 | #include <asm/page.h> |
| 18 | #include <asm/vsyscall.h> | 18 | #include <asm/vsyscall.h> |
| 19 | #include <asm/efi.h> | ||
| 20 | 19 | ||
| 21 | /* | 20 | /* |
| 22 | * Here we define all the compile-time 'special' virtual | 21 | * Here we define all the compile-time 'special' virtual |
| @@ -43,9 +42,6 @@ enum fixed_addresses { | |||
| 43 | FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ | 42 | FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ |
| 44 | FIX_IO_APIC_BASE_0, | 43 | FIX_IO_APIC_BASE_0, |
| 45 | FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1, | 44 | FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1, |
| 46 | FIX_EFI_IO_MAP_LAST_PAGE, | ||
| 47 | FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE | ||
| 48 | + MAX_EFI_IO_PAGES - 1, | ||
| 49 | #ifdef CONFIG_PARAVIRT | 45 | #ifdef CONFIG_PARAVIRT |
| 50 | FIX_PARAVIRT_BOOTMAP, | 46 | FIX_PARAVIRT_BOOTMAP, |
| 51 | #endif | 47 | #endif |
diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c index 1119d247fe11..eb1ef3b67dd5 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/kernel/efi.c | |||
| @@ -467,7 +467,7 @@ void __init efi_enter_virtual_mode(void) | |||
| 467 | efi_memory_desc_t *md; | 467 | efi_memory_desc_t *md; |
| 468 | efi_status_t status; | 468 | efi_status_t status; |
| 469 | unsigned long size; | 469 | unsigned long size; |
| 470 | u64 end, systab, addr, npages; | 470 | u64 end, systab, addr, npages, end_pfn; |
| 471 | void *p, *va; | 471 | void *p, *va; |
| 472 | 472 | ||
| 473 | efi.systab = NULL; | 473 | efi.systab = NULL; |
| @@ -479,7 +479,10 @@ void __init efi_enter_virtual_mode(void) | |||
| 479 | size = md->num_pages << EFI_PAGE_SHIFT; | 479 | size = md->num_pages << EFI_PAGE_SHIFT; |
| 480 | end = md->phys_addr + size; | 480 | end = md->phys_addr + size; |
| 481 | 481 | ||
| 482 | if (PFN_UP(end) <= max_low_pfn_mapped) | 482 | end_pfn = PFN_UP(end); |
| 483 | if (end_pfn <= max_low_pfn_mapped | ||
| 484 | || (end_pfn > (1UL << (32 - PAGE_SHIFT)) | ||
| 485 | && end_pfn <= max_pfn_mapped)) | ||
| 483 | va = __va(md->phys_addr); | 486 | va = __va(md->phys_addr); |
| 484 | else | 487 | else |
| 485 | va = efi_ioremap(md->phys_addr, size); | 488 | va = efi_ioremap(md->phys_addr, size); |
diff --git a/arch/x86/kernel/efi_64.c b/arch/x86/kernel/efi_64.c index 652c5287215f..cb783b92c50c 100644 --- a/arch/x86/kernel/efi_64.c +++ b/arch/x86/kernel/efi_64.c | |||
| @@ -99,24 +99,11 @@ void __init efi_call_phys_epilog(void) | |||
| 99 | 99 | ||
| 100 | void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size) | 100 | void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size) |
| 101 | { | 101 | { |
| 102 | static unsigned pages_mapped __initdata; | 102 | unsigned long last_map_pfn; |
| 103 | unsigned i, pages; | ||
| 104 | unsigned long offset; | ||
| 105 | 103 | ||
| 106 | pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr); | 104 | last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size); |
| 107 | offset = phys_addr & ~PAGE_MASK; | 105 | if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size) |
| 108 | phys_addr &= PAGE_MASK; | ||
| 109 | |||
| 110 | if (pages_mapped + pages > MAX_EFI_IO_PAGES) | ||
| 111 | return NULL; | 106 | return NULL; |
| 112 | 107 | ||
| 113 | for (i = 0; i < pages; i++) { | 108 | return (void __iomem *)__va(phys_addr); |
| 114 | __set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped, | ||
| 115 | phys_addr, PAGE_KERNEL); | ||
| 116 | phys_addr += PAGE_SIZE; | ||
| 117 | pages_mapped++; | ||
| 118 | } | ||
| 119 | |||
| 120 | return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \ | ||
| 121 | (pages_mapped - pages)) + offset; | ||
| 122 | } | 109 | } |
