On Tue, Apr 23, 2019 at 4:44 PM Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> wrote: > > Commit 38ac0287b7f4 > > ("fbdev/efifb: Honour UEFI memory map attributes when mapping the FB") > > updated the EFI framebuffer code to use memory mappings for the linear > framebuffer that are permitted by the memory attributes described by the > EFI memory map for the particular region, if the framebuffer happens to > be covered by the EFI memory map (which is typically only the case for > framebuffers in shared memory). This is required since non-X86 systems > may require cacheable attributes for memory mappings that are shared > with other masters (such as GPUs), and this information cannot be > described by the Graphics Output Protocol (GOP) EFI protocol itself, > and so we rely on the EFI memory map for this. > > As reported by James, this breaks some x86 systems: > > [ 1.173368] efifb: probing for efifb > [ 1.173386] efifb: abort, cannot remap video memory 0x1d5000 @ 0xcf800000 > [ 1.173395] Trying to free nonexistent resource <00000000cf800000-00000000cf9d4bff> > [ 1.173413] efi-framebuffer: probe of efi-framebuffer.0 failed with error -5 > > The problem turns out to be that the memory map entry that describes the > framebuffer has no memory attributes listed at all, and so we end up with > a mem_flags value of 0x0. > > So work around this by ensuring that the memory map entry's attribute field > has a sane value before using it to mask the set of usable attributes. > > Reported-by: James Hilliard <james.hilliard1@xxxxxxxxx> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> > --- > > James, could you give this a try please? Thanks. I can confirm this fixes the regression on my system, thanks. > > drivers/video/fbdev/efifb.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c > index ba906876cc45..1f9949f50900 100644 > --- a/drivers/video/fbdev/efifb.c > +++ b/drivers/video/fbdev/efifb.c > @@ -476,8 +476,11 @@ static int efifb_probe(struct platform_device *dev) > * If the UEFI memory map covers the efifb region, we may only > * remap it using the attributes the memory map prescribes. > */ > - mem_flags |= EFI_MEMORY_WT | EFI_MEMORY_WB; > - mem_flags &= md.attribute; > + md.attribute &= EFI_MEMORY_WC | EFI_MEMORY_WT | EFI_MEMORY_WB; > + if (md.attribute) { > + mem_flags |= EFI_MEMORY_WT | EFI_MEMORY_WB; > + mem_flags &= md.attribute; > + } > } > if (mem_flags & EFI_MEMORY_WC) > info->screen_base = ioremap_wc(efifb_fix.smem_start, > -- > 2.20.1 >