x86/efi: earlyprintk=efi,keep fix
authorDave Young <dyoung@redhat.com>
Thu, 1 May 2014 13:15:48 +0000 (21:15 +0800)
committerMatt Fleming <matt.fleming@intel.com>
Sat, 3 May 2014 05:39:06 +0000 (06:39 +0100)
commit5f35eb0e29ca26da82febe49d7698dbeb8882ea0
tree6f98a3b3ef40a3ec8d35867f1e5668349b0a8d81
parent47514c996fac5e6f13ef3a4c5e23f1c5cffabb7b
x86/efi: earlyprintk=efi,keep fix

earlyprintk=efi,keep will cause kernel hangs while freeing initmem like
below:

  VFS: Mounted root (ext4 filesystem) readonly on device 254:2.
  devtmpfs: mounted
  Freeing unused kernel memory: 880K (ffffffff817d4000 - ffffffff818b0000)

It is caused by efi earlyprintk use __init function which will be freed
later.  Such as early_efi_write is marked as __init, also it will use
early_ioremap which is init function as well.

To fix this issue, I added early initcall early_efi_map_fb which maps
the whole efi fb for later use. OTOH, adding a wrapper function
early_efi_map which calls early_ioremap before ioremap is available.

With this patch applied efi boot ok with earlyprintk=efi,keep console=efi

Signed-off-by: Dave Young <dyoung@redhat.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
arch/x86/platform/efi/early_printk.c