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. > 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! > > + 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