| From 4592ac229a5d00d20180b8745b00b7186fde50c4 Mon Sep 17 00:00:00 2001 |
| From: Greg Pearson <greg.pearson@hp.com> |
| Date: Mon, 30 Jul 2012 14:39:05 -0700 |
| Subject: [PATCH] pcdp: use early_ioremap/early_iounmap to access pcdp table |
| |
| commit 6c4088ac3a4d82779903433bcd5f048c58fb1aca upstream. |
| |
| efi_setup_pcdp_console() is called during boot to parse the HCDP/PCDP |
| EFI system table and setup an early console for printk output. The |
| routine uses ioremap/iounmap to setup access to the HCDP/PCDP table |
| information. |
| |
| The call to ioremap is happening early in the boot process which leads |
| to a panic on x86_64 systems: |
| |
| panic+0x01ca |
| do_exit+0x043c |
| oops_end+0x00a7 |
| no_context+0x0119 |
| __bad_area_nosemaphore+0x0138 |
| bad_area_nosemaphore+0x000e |
| do_page_fault+0x0321 |
| page_fault+0x0020 |
| reserve_memtype+0x02a1 |
| __ioremap_caller+0x0123 |
| ioremap_nocache+0x0012 |
| efi_setup_pcdp_console+0x002b |
| setup_arch+0x03a9 |
| start_kernel+0x00d4 |
| x86_64_start_reservations+0x012c |
| x86_64_start_kernel+0x00fe |
| |
| This replaces the calls to ioremap/iounmap in efi_setup_pcdp_console() |
| with calls to early_ioremap/early_iounmap which can be called during |
| early boot. |
| |
| This patch was tested on an x86_64 prototype system which uses the |
| HCDP/PCDP table for early console setup. |
| |
| Signed-off-by: Greg Pearson <greg.pearson@hp.com> |
| Acked-by: Khalid Aziz <khalid.aziz@hp.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| drivers/firmware/pcdp.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/firmware/pcdp.c b/drivers/firmware/pcdp.c |
| index 51e0e2d8fac6..a330492e06f9 100644 |
| --- a/drivers/firmware/pcdp.c |
| +++ b/drivers/firmware/pcdp.c |
| @@ -95,7 +95,7 @@ efi_setup_pcdp_console(char *cmdline) |
| if (efi.hcdp == EFI_INVALID_TABLE_ADDR) |
| return -ENODEV; |
| |
| - pcdp = ioremap(efi.hcdp, 4096); |
| + pcdp = early_ioremap(efi.hcdp, 4096); |
| printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, efi.hcdp); |
| |
| if (strstr(cmdline, "console=hcdp")) { |
| @@ -131,6 +131,6 @@ efi_setup_pcdp_console(char *cmdline) |
| } |
| |
| out: |
| - iounmap(pcdp); |
| + early_iounmap(pcdp, 4096); |
| return rc; |
| } |
| -- |
| 1.8.5.2 |
| |