aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-12-16 10:57:40 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-23 01:05:22 -0400
commitf96de58fc7e7d3d717c7c63975c3b896c906b5e3 (patch)
treee6d9d7067fe6b8a09d6cca33fb63cb0dc0499b62
parentb6d547791fd3ef4ccc89ad2556ab01045640aef7 (diff)
drm/i915: Handle failure to kick out a conflicting fb driver
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 2c0bad6ebce0..eb3d9c0b83dd 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1427,15 +1427,16 @@ void i915_master_destroy(struct drm_device *dev, struct drm_master *master)
1427} 1427}
1428 1428
1429#if IS_ENABLED(CONFIG_FB) 1429#if IS_ENABLED(CONFIG_FB)
1430static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) 1430static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
1431{ 1431{
1432 struct apertures_struct *ap; 1432 struct apertures_struct *ap;
1433 struct pci_dev *pdev = dev_priv->dev->pdev; 1433 struct pci_dev *pdev = dev_priv->dev->pdev;
1434 bool primary; 1434 bool primary;
1435 int ret;
1435 1436
1436 ap = alloc_apertures(1); 1437 ap = alloc_apertures(1);
1437 if (!ap) 1438 if (!ap)
1438 return; 1439 return -ENOMEM;
1439 1440
1440 ap->ranges[0].base = dev_priv->gtt.mappable_base; 1441 ap->ranges[0].base = dev_priv->gtt.mappable_base;
1441 ap->ranges[0].size = dev_priv->gtt.mappable_end; 1442 ap->ranges[0].size = dev_priv->gtt.mappable_end;
@@ -1443,13 +1444,16 @@ static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
1443 primary = 1444 primary =
1444 pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; 1445 pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
1445 1446
1446 remove_conflicting_framebuffers(ap, "inteldrmfb", primary); 1447 ret = remove_conflicting_framebuffers(ap, "inteldrmfb", primary);
1447 1448
1448 kfree(ap); 1449 kfree(ap);
1450
1451 return ret;
1449} 1452}
1450#else 1453#else
1451static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) 1454static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
1452{ 1455{
1456 return 0;
1453} 1457}
1454#endif 1458#endif
1455 1459
@@ -1667,7 +1671,11 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1667 goto out_gtt; 1671 goto out_gtt;
1668 } 1672 }
1669 1673
1670 i915_kick_out_firmware_fb(dev_priv); 1674 ret = i915_kick_out_firmware_fb(dev_priv);
1675 if (ret) {
1676 DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
1677 goto out_gtt;
1678 }
1671 } 1679 }
1672 1680
1673 pci_set_master(dev->pdev); 1681 pci_set_master(dev->pdev);