diff options
author | Huang, Ying <ying.huang@intel.com> | 2008-02-25 02:18:37 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-19 13:19:54 -0400 |
commit | 4a3575fd436aa98957184afd745e4ada8f1542d8 (patch) | |
tree | 786585e3d89af847c126d0b4577e212288a134fe /arch/x86/kernel/efi_64.c | |
parent | f8dfd5ed149ae340451f25847b434297c20d4645 (diff) |
x86: EFI_PAGE_SHIFT fix
Make x86 EFI code works when EFI_PAGE_SHIFT != PAGE_SHIFT. The
memrage_efi_to_native() provided in this patch can be used on other
EFI platform such as IA64 too.
This patch has been tested on Intel x86_64 platform with EFI 64/32
firmware.
Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/efi_64.c')
-rw-r--r-- | arch/x86/kernel/efi_64.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/x86/kernel/efi_64.c b/arch/x86/kernel/efi_64.c index d143a1e76b30..d0060fdcccac 100644 --- a/arch/x86/kernel/efi_64.c +++ b/arch/x86/kernel/efi_64.c | |||
@@ -105,14 +105,14 @@ void __init efi_reserve_bootmem(void) | |||
105 | 105 | ||
106 | void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size) | 106 | void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size) |
107 | { | 107 | { |
108 | static unsigned pages_mapped; | 108 | static unsigned pages_mapped __initdata; |
109 | unsigned i, pages; | 109 | unsigned i, pages; |
110 | unsigned long offset; | ||
110 | 111 | ||
111 | /* phys_addr and size must be page aligned */ | 112 | pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr); |
112 | if ((phys_addr & ~PAGE_MASK) || (size & ~PAGE_MASK)) | 113 | offset = phys_addr & ~PAGE_MASK; |
113 | return NULL; | 114 | phys_addr &= PAGE_MASK; |
114 | 115 | ||
115 | pages = size >> PAGE_SHIFT; | ||
116 | if (pages_mapped + pages > MAX_EFI_IO_PAGES) | 116 | if (pages_mapped + pages > MAX_EFI_IO_PAGES) |
117 | return NULL; | 117 | return NULL; |
118 | 118 | ||
@@ -124,5 +124,5 @@ void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size) | |||
124 | } | 124 | } |
125 | 125 | ||
126 | return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \ | 126 | return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \ |
127 | (pages_mapped - pages)); | 127 | (pages_mapped - pages)) + offset; |
128 | } | 128 | } |