From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753784AbcDJTiN (ORCPT ); Sun, 10 Apr 2016 15:38:13 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:36730 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751226AbcDJTiJ (ORCPT ); Sun, 10 Apr 2016 15:38:09 -0400 Date: Mon, 11 Apr 2016 11:22:21 +0800 From: Wang YanQing To: tomi.valkeinen@ti.com Cc: pjones@redhat.com, dh.herrmann@gmail.com, hpa@zytor.com, linux-kernel@vger.kernel.org, x86@kernel.org Subject: [PATCH] x86:sysfb_efi:efifb_set_system: fix miss valid address range in later BARs Message-ID: <20160411032221.GA13983@udknight> Mail-Followup-To: Wang YanQing , tomi.valkeinen@ti.com, pjones@redhat.com, dh.herrmann@gmail.com, hpa@zytor.com, linux-kernel@vger.kernel.org, x86@kernel.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.22 (2013-10-16) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We can't just break out when meet start is equal to zero, this will cause we miss valid address range in later BARs. On the other hand, it isn't enough to test start only for below situation: 0(start) <= lfb_base < end Signed-off-by: Wang YanQing --- arch/x86/kernel/sysfb_efi.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/sysfb_efi.c b/arch/x86/kernel/sysfb_efi.c index b285d4e..ac0b521 100644 --- a/arch/x86/kernel/sysfb_efi.c +++ b/arch/x86/kernel/sysfb_efi.c @@ -106,10 +106,19 @@ 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) { -- 1.8.5.6.2.g3d8a54e.dirty