Skip to content

Commit

Permalink
x86/sysfb_efi: Fix valid BAR address range check
Browse files Browse the repository at this point in the history
The code for checking whether a BAR address range is valid will break
out of the loop when a start address of 0x0 is encountered.

This behaviour is wrong since by breaking out of the loop we may miss
the BAR that describes the EFI frame buffer in a later iteration.

Because of this bug I can't use video=efifb: boot parameter to get
efifb on my new ThinkPad E550 for my old linux system hard disk with
3.10 kernel. In 3.10, efifb is the only choice due to DRM/I915 not
supporting the GPU.

This patch also add a trivial optimization to break out after we find
the frame buffer address range without testing later BARs.

Signed-off-by: Wang YanQing <[email protected]>
[ Rewrote changelog. ]
Signed-off-by: Matt Fleming <[email protected]>
Reviewed-by: Peter Jones <[email protected]>
Cc: <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
Cc: David Herrmann <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Tomi Valkeinen <[email protected]>
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
wyqkp authored and Ingo Molnar committed May 5, 2016
1 parent 7f9b474 commit c10fcb1
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions arch/x86/kernel/sysfb_efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,24 @@ static int __init efifb_set_system(const struct dmi_system_id *id)
continue;
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
resource_size_t start, end;
unsigned long flags;

flags = pci_resource_flags(dev, i);
if (!(flags & IORESOURCE_MEM))
continue;

if (flags & IORESOURCE_UNSET)
continue;

if (pci_resource_len(dev, i) == 0)
continue;

start = pci_resource_start(dev, i);
if (start == 0)
break;
end = pci_resource_end(dev, i);
if (screen_info.lfb_base >= start &&
screen_info.lfb_base < end) {
found_bar = 1;
break;
}
}
}
Expand Down

0 comments on commit c10fcb1

Please sign in to comment.