diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-12-16 10:57:40 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-07-23 01:05:22 -0400 |
commit | f96de58fc7e7d3d717c7c63975c3b896c906b5e3 (patch) | |
tree | e6d9d7067fe6b8a09d6cca33fb63cb0dc0499b62 | |
parent | b6d547791fd3ef4ccc89ad2556ab01045640aef7 (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.c | 18 |
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) |
1430 | static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) | 1430 | static 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 |
1451 | static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) | 1454 | static 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); |