diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 2cf10d17acfb..5170a8ea83d4 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -372,9 +372,8 @@ static int i915_getparam(struct drm_device *dev, void *data, | |||
372 | value |= I915_SCHEDULER_CAP_ENABLED; | 372 | value |= I915_SCHEDULER_CAP_ENABLED; |
373 | value |= I915_SCHEDULER_CAP_PRIORITY; | 373 | value |= I915_SCHEDULER_CAP_PRIORITY; |
374 | 374 | ||
375 | if (INTEL_INFO(dev_priv)->has_logical_ring_preemption && | 375 | if (HAS_LOGICAL_RING_PREEMPTION(dev_priv) && |
376 | i915_modparams.enable_execlists && | 376 | i915_modparams.enable_execlists) |
377 | !i915_modparams.enable_guc_submission) | ||
378 | value |= I915_SCHEDULER_CAP_PREEMPTION; | 377 | value |= I915_SCHEDULER_CAP_PREEMPTION; |
379 | } | 378 | } |
380 | break; | 379 | break; |
@@ -407,6 +406,9 @@ static int i915_getparam(struct drm_device *dev, void *data, | |||
407 | */ | 406 | */ |
408 | value = 1; | 407 | value = 1; |
409 | break; | 408 | break; |
409 | case I915_PARAM_HAS_CONTEXT_ISOLATION: | ||
410 | value = intel_engines_has_context_isolation(dev_priv); | ||
411 | break; | ||
410 | case I915_PARAM_SLICE_MASK: | 412 | case I915_PARAM_SLICE_MASK: |
411 | value = INTEL_INFO(dev_priv)->sseu.slice_mask; | 413 | value = INTEL_INFO(dev_priv)->sseu.slice_mask; |
412 | if (!value) | 414 | if (!value) |
@@ -417,6 +419,9 @@ static int i915_getparam(struct drm_device *dev, void *data, | |||
417 | if (!value) | 419 | if (!value) |
418 | return -ENODEV; | 420 | return -ENODEV; |
419 | break; | 421 | break; |
422 | case I915_PARAM_CS_TIMESTAMP_FREQUENCY: | ||
423 | value = 1000 * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz; | ||
424 | break; | ||
420 | default: | 425 | default: |
421 | DRM_DEBUG("Unknown parameter %d\n", param->param); | 426 | DRM_DEBUG("Unknown parameter %d\n", param->param); |
422 | return -EINVAL; | 427 | return -EINVAL; |
@@ -677,7 +682,7 @@ static int i915_load_modeset_init(struct drm_device *dev) | |||
677 | if (ret) | 682 | if (ret) |
678 | goto cleanup_uc; | 683 | goto cleanup_uc; |
679 | 684 | ||
680 | intel_modeset_gem_init(dev); | 685 | intel_setup_overlay(dev_priv); |
681 | 686 | ||
682 | if (INTEL_INFO(dev_priv)->num_pipes == 0) | 687 | if (INTEL_INFO(dev_priv)->num_pipes == 0) |
683 | return 0; | 688 | return 0; |
@@ -838,6 +843,11 @@ static void i915_workqueues_cleanup(struct drm_i915_private *dev_priv) | |||
838 | * We don't keep the workarounds for pre-production hardware, so we expect our | 843 | * We don't keep the workarounds for pre-production hardware, so we expect our |
839 | * driver to fail on these machines in one way or another. A little warning on | 844 | * driver to fail on these machines in one way or another. A little warning on |
840 | * dmesg may help both the user and the bug triagers. | 845 | * dmesg may help both the user and the bug triagers. |
846 | * | ||
847 | * Our policy for removing pre-production workarounds is to keep the | ||
848 | * current gen workarounds as a guide to the bring-up of the next gen | ||
849 | * (workarounds have a habit of persisting!). Anything older than that | ||
850 | * should be removed along with the complications they introduce. | ||
841 | */ | 851 | */ |
842 | static void intel_detect_preproduction_hw(struct drm_i915_private *dev_priv) | 852 | static void intel_detect_preproduction_hw(struct drm_i915_private *dev_priv) |
843 | { | 853 | { |
@@ -892,7 +902,6 @@ static int i915_driver_init_early(struct drm_i915_private *dev_priv, | |||
892 | mutex_init(&dev_priv->backlight_lock); | 902 | mutex_init(&dev_priv->backlight_lock); |
893 | spin_lock_init(&dev_priv->uncore.lock); | 903 | spin_lock_init(&dev_priv->uncore.lock); |
894 | 904 | ||
895 | spin_lock_init(&dev_priv->mm.object_stat_lock); | ||
896 | mutex_init(&dev_priv->sb_lock); | 905 | mutex_init(&dev_priv->sb_lock); |
897 | mutex_init(&dev_priv->modeset_restore_lock); | 906 | mutex_init(&dev_priv->modeset_restore_lock); |
898 | mutex_init(&dev_priv->av_mutex); | 907 | mutex_init(&dev_priv->av_mutex); |
@@ -1682,8 +1691,6 @@ static int i915_drm_resume(struct drm_device *dev) | |||
1682 | 1691 | ||
1683 | intel_csr_ucode_resume(dev_priv); | 1692 | intel_csr_ucode_resume(dev_priv); |
1684 | 1693 | ||
1685 | i915_gem_resume(dev_priv); | ||
1686 | |||
1687 | i915_restore_state(dev_priv); | 1694 | i915_restore_state(dev_priv); |
1688 | intel_pps_unlock_regs_wa(dev_priv); | 1695 | intel_pps_unlock_regs_wa(dev_priv); |
1689 | intel_opregion_setup(dev_priv); | 1696 | intel_opregion_setup(dev_priv); |
@@ -1704,14 +1711,7 @@ static int i915_drm_resume(struct drm_device *dev) | |||
1704 | 1711 | ||
1705 | drm_mode_config_reset(dev); | 1712 | drm_mode_config_reset(dev); |
1706 | 1713 | ||
1707 | mutex_lock(&dev->struct_mutex); | 1714 | i915_gem_resume(dev_priv); |
1708 | if (i915_gem_init_hw(dev_priv)) { | ||
1709 | DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n"); | ||
1710 | i915_gem_set_wedged(dev_priv); | ||
1711 | } | ||
1712 | mutex_unlock(&dev->struct_mutex); | ||
1713 | |||
1714 | intel_guc_resume(dev_priv); | ||
1715 | 1715 | ||
1716 | intel_modeset_init_hw(dev); | 1716 | intel_modeset_init_hw(dev); |
1717 | intel_init_clock_gating(dev_priv); | 1717 | intel_init_clock_gating(dev_priv); |
@@ -1745,8 +1745,6 @@ static int i915_drm_resume(struct drm_device *dev) | |||
1745 | 1745 | ||
1746 | intel_opregion_notify_adapter(dev_priv, PCI_D0); | 1746 | intel_opregion_notify_adapter(dev_priv, PCI_D0); |
1747 | 1747 | ||
1748 | intel_autoenable_gt_powersave(dev_priv); | ||
1749 | |||
1750 | enable_rpm_wakeref_asserts(dev_priv); | 1748 | enable_rpm_wakeref_asserts(dev_priv); |
1751 | 1749 | ||
1752 | return 0; | 1750 | return 0; |
@@ -1952,6 +1950,12 @@ error: | |||
1952 | goto finish; | 1950 | goto finish; |
1953 | } | 1951 | } |
1954 | 1952 | ||
1953 | static inline int intel_gt_reset_engine(struct drm_i915_private *dev_priv, | ||
1954 | struct intel_engine_cs *engine) | ||
1955 | { | ||
1956 | return intel_gpu_reset(dev_priv, intel_engine_flag(engine)); | ||
1957 | } | ||
1958 | |||
1955 | /** | 1959 | /** |
1956 | * i915_reset_engine - reset GPU engine to recover from a hang | 1960 | * i915_reset_engine - reset GPU engine to recover from a hang |
1957 | * @engine: engine to reset | 1961 | * @engine: engine to reset |
@@ -1986,10 +1990,14 @@ int i915_reset_engine(struct intel_engine_cs *engine, unsigned int flags) | |||
1986 | goto out; | 1990 | goto out; |
1987 | } | 1991 | } |
1988 | 1992 | ||
1989 | ret = intel_gpu_reset(engine->i915, intel_engine_flag(engine)); | 1993 | if (!engine->i915->guc.execbuf_client) |
1994 | ret = intel_gt_reset_engine(engine->i915, engine); | ||
1995 | else | ||
1996 | ret = intel_guc_reset_engine(&engine->i915->guc, engine); | ||
1990 | if (ret) { | 1997 | if (ret) { |
1991 | /* If we fail here, we expect to fallback to a global reset */ | 1998 | /* If we fail here, we expect to fallback to a global reset */ |
1992 | DRM_DEBUG_DRIVER("Failed to reset %s, ret=%d\n", | 1999 | DRM_DEBUG_DRIVER("%sFailed to reset %s, ret=%d\n", |
2000 | engine->i915->guc.execbuf_client ? "GuC " : "", | ||
1993 | engine->name, ret); | 2001 | engine->name, ret); |
1994 | goto out; | 2002 | goto out; |
1995 | } | 2003 | } |
@@ -2524,6 +2532,8 @@ static int intel_runtime_suspend(struct device *kdev) | |||
2524 | 2532 | ||
2525 | intel_runtime_pm_disable_interrupts(dev_priv); | 2533 | intel_runtime_pm_disable_interrupts(dev_priv); |
2526 | 2534 | ||
2535 | intel_uncore_suspend(dev_priv); | ||
2536 | |||
2527 | ret = 0; | 2537 | ret = 0; |
2528 | if (IS_GEN9_LP(dev_priv)) { | 2538 | if (IS_GEN9_LP(dev_priv)) { |
2529 | bxt_display_core_uninit(dev_priv); | 2539 | bxt_display_core_uninit(dev_priv); |
@@ -2536,6 +2546,8 @@ static int intel_runtime_suspend(struct device *kdev) | |||
2536 | 2546 | ||
2537 | if (ret) { | 2547 | if (ret) { |
2538 | DRM_ERROR("Runtime suspend failed, disabling it (%d)\n", ret); | 2548 | DRM_ERROR("Runtime suspend failed, disabling it (%d)\n", ret); |
2549 | intel_uncore_runtime_resume(dev_priv); | ||
2550 | |||
2539 | intel_runtime_pm_enable_interrupts(dev_priv); | 2551 | intel_runtime_pm_enable_interrupts(dev_priv); |
2540 | 2552 | ||
2541 | enable_rpm_wakeref_asserts(dev_priv); | 2553 | enable_rpm_wakeref_asserts(dev_priv); |
@@ -2543,8 +2555,6 @@ static int intel_runtime_suspend(struct device *kdev) | |||
2543 | return ret; | 2555 | return ret; |
2544 | } | 2556 | } |
2545 | 2557 | ||
2546 | intel_uncore_suspend(dev_priv); | ||
2547 | |||
2548 | enable_rpm_wakeref_asserts(dev_priv); | 2558 | enable_rpm_wakeref_asserts(dev_priv); |
2549 | WARN_ON_ONCE(atomic_read(&dev_priv->runtime_pm.wakeref_count)); | 2559 | WARN_ON_ONCE(atomic_read(&dev_priv->runtime_pm.wakeref_count)); |
2550 | 2560 | ||