On Mon, 18 Nov 2019 at 12:45, Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> wrote: > > On Fri, Nov 15, 2019 at 04:28:10PM +0000, Ard Biesheuvel wrote: > > On Fri, 15 Nov 2019 at 15:31, Andy Shevchenko > > <andriy.shevchenko@xxxxxxxxxxxxxxx> wrote: > > > > > > When the commit 69c1f396f25b ("efi/x86: Convert x86 EFI earlyprintk > > > into generic earlycon implementation") moved x86 specific EFI earlyprintk > > > implementation to shared location it also tweaked the behaviour. In particular > > > it dropped a trick with full framebuffer remapping after page initialization. > > > This lead to two regressions: > > > 1) very slow scrolling after page initialization; > > > 2) kernel hang when keep_bootcon parameter is being provided. > > > > > > Returning the trick back fixes #2 and mitigates, i.e. reduces the window when > > > slowness appears, #1 presumably due to eliminating heavy map()/unmap() > > > operations per each pixel line on the screen. > > > > +/* > > > + * efi earlycon needs to use early_memremap() to map the framebuffer. > > > + * But early_memremap() is not usable for 'earlycon=efifb keep_bootcon', > > > + * memremap() should be used instead. memremap() will be available after > > > + * paging_init() which is earlier than initcall callbacks. Thus adding this > > > + * early initcall function early_efi_map_fb() to map the whole efi framebuffer. > > > + */ > > > +static int __init early_efi_map_fb(void) > > > +{ > > > + if (!fb_base || !fb_size) > > > + return NULL; > > > + > > > > 'return 0' please. > > Ah, sorry. Though I think we rather return -ENOVEV here. > fb_base and fb_size will only be set if earlycon=efifb is passed, so this is not an error condition, and so returning an error is incorrect. > > I'll test this on actual arm64 hardware somewhere next week, and queue > > it if it doesn't break anything (no need to resend for the above) > > Thanks! > Works fine for me Tested-by: Ard Biesheuvel <ardb@xxxxxxxxxx> # arm64 > > > + if (pgprot_val(fb_prot) == pgprot_val(PAGE_KERNEL)) > > > + efi_fb = memremap(fb_base, fb_size, MEMREMAP_WB); > > > + else > > > + efi_fb = memremap(fb_base, fb_size, MEMREMAP_WC); > > > + > > > + return efi_fb ? 0 : -ENOMEM; > > > +} > > > +early_initcall(early_efi_map_fb); > > -- > With Best Regards, > Andy Shevchenko > >