From patchwork Mon Nov 25 19:54:41 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Bruno_Pr=C3=A9mont?= X-Patchwork-Id: 294078 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 322A52C00C8 for ; Tue, 26 Nov 2013 07:05:34 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932190Ab3KYUFc (ORCPT ); Mon, 25 Nov 2013 15:05:32 -0500 Received: from hygieia.santi-shop.eu ([78.46.175.2]:34281 "EHLO hygieia.santi-shop.eu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932120Ab3KYUFc convert rfc822-to-8bit (ORCPT ); Mon, 25 Nov 2013 15:05:32 -0500 X-Greylist: delayed 645 seconds by postgrey-1.27 at vger.kernel.org; Mon, 25 Nov 2013 15:05:32 EST Received: from neptune.home (unknown [IPv6:2001:960:7ab:0:2c0:9fff:fe2d:39d]) by hygieia.santi-shop.eu (Postfix) with ESMTPSA id 055FD40C12E1; Mon, 25 Nov 2013 20:54:42 +0100 (CET) Date: Mon, 25 Nov 2013 20:54:41 +0100 From: Bruno =?UTF-8?B?UHLDqW1vbnQ=?= To: Dave Airlie , Bjorn Helgaas , Peter Jones Cc: DRI mailing list , Linux PCI Subject: [RFC patch] PCI: Extend boot_vga sysfs attribute lookup to fix X on MBA+EFI Message-ID: <20131125205441.5046e0cb@neptune.home> X-Mailer: Claws Mail 3.9.0 (GTK+ 2.24.17; i686-pc-linux-gnu) Mime-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On a MacBookAir2,1, booting to Linux with EFI though having no efifb built-in Xorg refuses to start with "no devices detected" because for the only VGA device available (NVidia Geforce 9400M) the sysfs attribute boot_vga is zero (instead of expected 1). When CONFIG_FB_EFI is selected, efifb does provide its own vga_default_device() to report the PCI device matching global screen_info as determined during efifb setup. Otherwise there is just a dummy or VGA_ARB's vga_default_device() that does not provide the right information. On the other hand, boot_vga_show() falls back to poking PCI resources to flag a PCI device as boot_vga if vga_default_device() returned no PCI device (NULL). To complement this PCI resource poking, this patch copies the validation code used to determine which PCI device to report as default VGA device by efifb into boot_vga_show(). Signed-off-by: Bruno Prémont --- Would it make sense to kill the corresponding code from efifb as it covers only a single case? The other EFI capable system I have (AMD Ilano based, Gigabyte mainboard does report boot_vga=1, possibly through the resources poking and there Xorg starts properly without efifb built in. Selecting CONFIG_X86_SYSFB (combined with CONFIG_FB_SIMPLE) does not help by itself, patching that one instead of PCI's boot_vga attribute directly would still not cover the case when neither of them is enabled. drivers/pci/pci-sysfs.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 7128cfd..91cac71 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "pci.h" @@ -540,6 +541,26 @@ boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf) if (vga_dev) return sprintf(buf, "%u\n", (pdev == vga_dev)); + if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) { + resource_size_t start, end; + int i; + + for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { + if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM)) + continue; + + start = pci_resource_start(pdev, i); + end = pci_resource_end(pdev, i); + + if (!start || !end) + continue; + + if (screen_info.lfb_base >= start && + (screen_info.lfb_base + screen_info.lfb_size) < end) + return sprintf(buf, "1\n"); + } + } + return sprintf(buf, "%u\n", !!(pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW));