From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Hutchings Subject: [PATCH] agpgart: Reprobe VGA devices when a new GART device is added Date: Sun, 28 Feb 2010 03:30:51 +0000 Message-ID: <1267327851.2282.8.camel@localhost> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Return-path: Sender: linux-pci-owner@vger.kernel.org To: David Airlie Cc: linux-pci@vger.kernel.org, dri-devel@lists.sourceforge.net, zhenyuw@linux.intel.com, Greg Kroah-Hartman List-Id: dri-devel@lists.freedesktop.org This addresses . DRM drivers may fail to probe their devices when the associated AGP GART does not yet have a driver, so we reprobe unbound VGA devices when a GART device is added. Signed-off-by: Ben Hutchings --- This is intended to address the dependency problem highlighted in the above bug report. That specific bug can be fixed by adding a module dependency from i915 to intel_agp, but in general there is no fixed relationship betweem DRM and GART drivers. There is a narrow race between the check for a current driver binding and the call to device_reprobe(). This could be closed by adding a variant on device_attach() and device_reprobe() that is a no-op for bound devices. Ben. drivers/char/agp/backend.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index c3ab46d..f9680bf 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include "agp.h" @@ -281,6 +282,24 @@ void agp_put_bridge(struct agp_bridge_data *bridge) EXPORT_SYMBOL(agp_put_bridge); +/* + * DRM drivers may fail to probe their devices when the associated AGP + * GART does not yet have a driver, so we reprobe unbound VGA devices + * when a GART device is added. This problem applies not only to true + * AGP devices which would be children of the affected bridge, but + * also to PCI Express devices that may be siblings of the GART + * device. Therefore iterate over all PCI VGA devices. + */ +static void agp_probe_video(struct work_struct *work) +{ + struct pci_dev *pdev = NULL; + + while ((pdev = pci_get_class(0x030000, pdev)) != NULL) { + if (!pdev->dev.driver && device_reprobe(&pdev->dev)) + pr_err(PFX "failed to reprobe %s\n", pci_name(pdev)); +} +static DECLARE_WORK(agp_probe_video_work, agp_probe_video); + int agp_add_bridge(struct agp_bridge_data *bridge) { int error; @@ -324,6 +343,7 @@ int agp_add_bridge(struct agp_bridge_data *bridge) } list_add(&bridge->list, &agp_bridges); + schedule_work(&agp_probe_video_work); return 0; frontend_err: -- 1.6.6.2