diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_dma.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index b3873c945d1b..437886641d90 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1416,6 +1416,7 @@ void i915_master_destroy(struct drm_device *dev, struct drm_master *master) | |||
1416 | master->driver_priv = NULL; | 1416 | master->driver_priv = NULL; |
1417 | } | 1417 | } |
1418 | 1418 | ||
1419 | #ifdef CONFIG_DRM_I915_FBDEV | ||
1419 | static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) | 1420 | static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) |
1420 | { | 1421 | { |
1421 | struct apertures_struct *ap; | 1422 | struct apertures_struct *ap; |
@@ -1436,6 +1437,11 @@ static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) | |||
1436 | 1437 | ||
1437 | kfree(ap); | 1438 | kfree(ap); |
1438 | } | 1439 | } |
1440 | #else | ||
1441 | static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) | ||
1442 | { | ||
1443 | } | ||
1444 | #endif | ||
1439 | 1445 | ||
1440 | static void i915_dump_device_info(struct drm_i915_private *dev_priv) | 1446 | static void i915_dump_device_info(struct drm_i915_private *dev_priv) |
1441 | { | 1447 | { |
@@ -1477,8 +1483,11 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1477 | info = (struct intel_device_info *) flags; | 1483 | info = (struct intel_device_info *) flags; |
1478 | 1484 | ||
1479 | /* Refuse to load on gen6+ without kms enabled. */ | 1485 | /* Refuse to load on gen6+ without kms enabled. */ |
1480 | if (info->gen >= 6 && !drm_core_check_feature(dev, DRIVER_MODESET)) | 1486 | if (info->gen >= 6 && !drm_core_check_feature(dev, DRIVER_MODESET)) { |
1487 | DRM_INFO("Your hardware requires kernel modesetting (KMS)\n"); | ||
1488 | DRM_INFO("See CONFIG_DRM_I915_KMS, nomodeset, and i915.modeset parameters\n"); | ||
1481 | return -ENODEV; | 1489 | return -ENODEV; |
1490 | } | ||
1482 | 1491 | ||
1483 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); | 1492 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); |
1484 | if (dev_priv == NULL) | 1493 | if (dev_priv == NULL) |
@@ -1505,6 +1514,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1505 | dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */ | 1514 | dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */ |
1506 | INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work); | 1515 | INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work); |
1507 | 1516 | ||
1517 | intel_display_crc_init(dev); | ||
1518 | |||
1508 | i915_dump_device_info(dev_priv); | 1519 | i915_dump_device_info(dev_priv); |
1509 | 1520 | ||
1510 | /* Not all pre-production machines fall into this category, only the | 1521 | /* Not all pre-production machines fall into this category, only the |
@@ -1542,15 +1553,10 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1542 | 1553 | ||
1543 | intel_uncore_early_sanitize(dev); | 1554 | intel_uncore_early_sanitize(dev); |
1544 | 1555 | ||
1545 | if (IS_HASWELL(dev) && (I915_READ(HSW_EDRAM_PRESENT) == 1)) { | 1556 | /* This must be called before any calls to HAS_PCH_* */ |
1546 | /* The docs do not explain exactly how the calculation can be | 1557 | intel_detect_pch(dev); |
1547 | * made. It is somewhat guessable, but for now, it's always | 1558 | |
1548 | * 128MB. | 1559 | intel_uncore_init(dev); |
1549 | * NB: We can't write IDICR yet because we do not have gt funcs | ||
1550 | * set up */ | ||
1551 | dev_priv->ellc_size = 128; | ||
1552 | DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size); | ||
1553 | } | ||
1554 | 1560 | ||
1555 | ret = i915_gem_gtt_init(dev); | 1561 | ret = i915_gem_gtt_init(dev); |
1556 | if (ret) | 1562 | if (ret) |
@@ -1609,13 +1615,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1609 | goto out_mtrrfree; | 1615 | goto out_mtrrfree; |
1610 | } | 1616 | } |
1611 | 1617 | ||
1612 | /* This must be called before any calls to HAS_PCH_* */ | ||
1613 | intel_detect_pch(dev); | ||
1614 | |||
1615 | intel_irq_init(dev); | 1618 | intel_irq_init(dev); |
1616 | intel_pm_init(dev); | 1619 | intel_pm_init(dev); |
1617 | intel_uncore_sanitize(dev); | 1620 | intel_uncore_sanitize(dev); |
1618 | intel_uncore_init(dev); | ||
1619 | 1621 | ||
1620 | /* Try to make sure MCHBAR is enabled before poking at it */ | 1622 | /* Try to make sure MCHBAR is enabled before poking at it */ |
1621 | intel_setup_mchbar(dev); | 1623 | intel_setup_mchbar(dev); |
@@ -1699,6 +1701,7 @@ out_gtt: | |||
1699 | drm_mm_takedown(&dev_priv->gtt.base.mm); | 1701 | drm_mm_takedown(&dev_priv->gtt.base.mm); |
1700 | dev_priv->gtt.base.cleanup(&dev_priv->gtt.base); | 1702 | dev_priv->gtt.base.cleanup(&dev_priv->gtt.base); |
1701 | out_regs: | 1703 | out_regs: |
1704 | intel_uncore_fini(dev); | ||
1702 | pci_iounmap(dev->pdev, dev_priv->regs); | 1705 | pci_iounmap(dev->pdev, dev_priv->regs); |
1703 | put_bridge: | 1706 | put_bridge: |
1704 | pci_dev_put(dev_priv->bridge_dev); | 1707 | pci_dev_put(dev_priv->bridge_dev); |
@@ -1729,15 +1732,9 @@ int i915_driver_unload(struct drm_device *dev) | |||
1729 | if (dev_priv->mm.inactive_shrinker.scan_objects) | 1732 | if (dev_priv->mm.inactive_shrinker.scan_objects) |
1730 | unregister_shrinker(&dev_priv->mm.inactive_shrinker); | 1733 | unregister_shrinker(&dev_priv->mm.inactive_shrinker); |
1731 | 1734 | ||
1732 | mutex_lock(&dev->struct_mutex); | 1735 | ret = i915_gem_suspend(dev); |
1733 | ret = i915_gpu_idle(dev); | ||
1734 | if (ret) | 1736 | if (ret) |
1735 | DRM_ERROR("failed to idle hardware: %d\n", ret); | 1737 | DRM_ERROR("failed to idle hardware: %d\n", ret); |
1736 | i915_gem_retire_requests(dev); | ||
1737 | mutex_unlock(&dev->struct_mutex); | ||
1738 | |||
1739 | /* Cancel the retire work handler, which should be idle now. */ | ||
1740 | cancel_delayed_work_sync(&dev_priv->mm.retire_work); | ||
1741 | 1738 | ||
1742 | io_mapping_free(dev_priv->gtt.mappable); | 1739 | io_mapping_free(dev_priv->gtt.mappable); |
1743 | arch_phys_wc_del(dev_priv->gtt.mtrr); | 1740 | arch_phys_wc_del(dev_priv->gtt.mtrr); |
@@ -1852,7 +1849,7 @@ void i915_driver_lastclose(struct drm_device * dev) | |||
1852 | return; | 1849 | return; |
1853 | 1850 | ||
1854 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | 1851 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
1855 | intel_fb_restore_mode(dev); | 1852 | intel_fbdev_restore_mode(dev); |
1856 | vga_switcheroo_process_delayed_switch(); | 1853 | vga_switcheroo_process_delayed_switch(); |
1857 | return; | 1854 | return; |
1858 | } | 1855 | } |