Merge tag 'drm-for-v4.15' of git://people.freedesktop.org/~airlied/linux
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / i915_drv.c
index f124de3a0668d5f02f3b0015bdacd4c78177f8cc..960d3d8b95b8e5d647b85b2baed7b2c5b68d83cf 100644 (file)
@@ -58,12 +58,12 @@ static unsigned int i915_load_fail_count;
 
 bool __i915_inject_load_failure(const char *func, int line)
 {
-       if (i915_load_fail_count >= i915.inject_load_failure)
+       if (i915_load_fail_count >= i915_modparams.inject_load_failure)
                return false;
 
-       if (++i915_load_fail_count == i915.inject_load_failure) {
+       if (++i915_load_fail_count == i915_modparams.inject_load_failure) {
                DRM_INFO("Injecting failure at checkpoint %u [%s:%d]\n",
-                        i915.inject_load_failure, func, line);
+                        i915_modparams.inject_load_failure, func, line);
                return true;
        }
 
@@ -106,8 +106,8 @@ __i915_printk(struct drm_i915_private *dev_priv, const char *level,
 
 static bool i915_error_injected(struct drm_i915_private *dev_priv)
 {
-       return i915.inject_load_failure &&
-              i915_load_fail_count == i915.inject_load_failure;
+       return i915_modparams.inject_load_failure &&
+              i915_load_fail_count == i915_modparams.inject_load_failure;
 }
 
 #define i915_load_error(dev_priv, fmt, ...)                                 \
@@ -239,7 +239,8 @@ static void intel_detect_pch(struct drm_i915_private *dev_priv)
                                dev_priv->pch_type = PCH_KBP;
                                DRM_DEBUG_KMS("Found Kaby Lake PCH (KBP)\n");
                                WARN_ON(!IS_SKYLAKE(dev_priv) &&
-                                       !IS_KABYLAKE(dev_priv));
+                                       !IS_KABYLAKE(dev_priv) &&
+                                       !IS_COFFEELAKE(dev_priv));
                        } else if (id == INTEL_PCH_CNP_DEVICE_ID_TYPE) {
                                dev_priv->pch_type = PCH_CNP;
                                DRM_DEBUG_KMS("Found Cannon Lake PCH (CNP)\n");
@@ -320,7 +321,7 @@ static int i915_getparam(struct drm_device *dev, void *data,
                value = USES_PPGTT(dev_priv);
                break;
        case I915_PARAM_HAS_SEMAPHORES:
-               value = i915.semaphores;
+               value = i915_modparams.semaphores;
                break;
        case I915_PARAM_HAS_SECURE_BATCHES:
                value = capable(CAP_SYS_ADMIN);
@@ -339,7 +340,8 @@ static int i915_getparam(struct drm_device *dev, void *data,
                        return -ENODEV;
                break;
        case I915_PARAM_HAS_GPU_RESET:
-               value = i915.enable_hangcheck && intel_has_gpu_reset(dev_priv);
+               value = i915_modparams.enable_hangcheck &&
+                       intel_has_gpu_reset(dev_priv);
                if (value && intel_has_reset_engine(dev_priv))
                        value = 2;
                break;
@@ -365,9 +367,18 @@ static int i915_getparam(struct drm_device *dev, void *data,
                value = i915_gem_mmap_gtt_version();
                break;
        case I915_PARAM_HAS_SCHEDULER:
-               value = dev_priv->engine[RCS] &&
-                       dev_priv->engine[RCS]->schedule;
+               value = 0;
+               if (dev_priv->engine[RCS] && dev_priv->engine[RCS]->schedule) {
+                       value |= I915_SCHEDULER_CAP_ENABLED;
+                       value |= I915_SCHEDULER_CAP_PRIORITY;
+
+                       if (INTEL_INFO(dev_priv)->has_logical_ring_preemption &&
+                           i915_modparams.enable_execlists &&
+                           !i915_modparams.enable_guc_submission)
+                               value |= I915_SCHEDULER_CAP_PREEMPTION;
+               }
                break;
+
        case I915_PARAM_MMAP_VERSION:
                /* Remember to bump this if the version changes! */
        case I915_PARAM_HAS_GEM:
@@ -604,9 +615,10 @@ static void i915_gem_fini(struct drm_i915_private *dev_priv)
        intel_uc_fini_hw(dev_priv);
        i915_gem_cleanup_engines(dev_priv);
        i915_gem_contexts_fini(dev_priv);
-       i915_gem_cleanup_userptr(dev_priv);
        mutex_unlock(&dev_priv->drm.struct_mutex);
 
+       i915_gem_cleanup_userptr(dev_priv);
+
        i915_gem_drain_freed_objects(dev_priv);
 
        WARN_ON(!list_empty(&dev_priv->contexts.list));
@@ -868,6 +880,10 @@ static int i915_driver_init_early(struct drm_i915_private *dev_priv,
        memcpy(device_info, match_info, sizeof(*device_info));
        device_info->device_id = dev_priv->drm.pdev->device;
 
+       BUILD_BUG_ON(INTEL_MAX_PLATFORMS >
+                    sizeof(device_info->platform_mask) * BITS_PER_BYTE);
+       device_info->platform_mask = BIT(device_info->platform);
+
        BUG_ON(device_info->gen > sizeof(device_info->gen_mask) * BITS_PER_BYTE);
        device_info->gen_mask = BIT(device_info->gen - 1);
 
@@ -1001,6 +1017,8 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
 
        intel_uncore_init(dev_priv);
 
+       intel_uc_init_mmio(dev_priv);
+
        ret = intel_engines_init_mmio(dev_priv);
        if (ret)
                goto err_uncore;
@@ -1030,9 +1048,9 @@ static void i915_driver_cleanup_mmio(struct drm_i915_private *dev_priv)
 
 static void intel_sanitize_options(struct drm_i915_private *dev_priv)
 {
-       i915.enable_execlists =
+       i915_modparams.enable_execlists =
                intel_sanitize_enable_execlists(dev_priv,
-                                               i915.enable_execlists);
+                                               i915_modparams.enable_execlists);
 
        /*
         * i915.enable_ppgtt is read-only, so do an early pass to validate the
@@ -1040,12 +1058,15 @@ static void intel_sanitize_options(struct drm_i915_private *dev_priv)
         * do this now so that we can print out any log messages once rather
         * than every time we check intel_enable_ppgtt().
         */
-       i915.enable_ppgtt =
-               intel_sanitize_enable_ppgtt(dev_priv, i915.enable_ppgtt);
-       DRM_DEBUG_DRIVER("ppgtt mode: %i\n", i915.enable_ppgtt);
+       i915_modparams.enable_ppgtt =
+               intel_sanitize_enable_ppgtt(dev_priv,
+                                           i915_modparams.enable_ppgtt);
+       DRM_DEBUG_DRIVER("ppgtt mode: %i\n", i915_modparams.enable_ppgtt);
 
-       i915.semaphores = intel_sanitize_semaphores(dev_priv, i915.semaphores);
-       DRM_DEBUG_DRIVER("use GPU semaphores? %s\n", yesno(i915.semaphores));
+       i915_modparams.semaphores =
+               intel_sanitize_semaphores(dev_priv, i915_modparams.semaphores);
+       DRM_DEBUG_DRIVER("use GPU semaphores? %s\n",
+                        yesno(i915_modparams.semaphores));
 
        intel_uc_sanitize_options(dev_priv);
 
@@ -1276,7 +1297,7 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
        int ret;
 
        /* Enable nuclear pageflip on ILK+ */
-       if (!i915.nuclear_pageflip && match_info->gen < 5)
+       if (!i915_modparams.nuclear_pageflip && match_info->gen < 5)
                driver.driver_features &= ~DRIVER_ATOMIC;
 
        ret = -ENOMEM;
@@ -1340,7 +1361,7 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        intel_runtime_pm_enable(dev_priv);
 
-       dev_priv->ipc_enabled = false;
+       intel_init_ipc(dev_priv);
 
        if (IS_ENABLED(CONFIG_DRM_I915_DEBUG))
                DRM_INFO("DRM_I915_DEBUG enabled\n");
@@ -1571,7 +1592,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
 
        intel_display_set_init_power(dev_priv, false);
 
-       fw_csr = !IS_GEN9_LP(dev_priv) &&
+       fw_csr = !IS_GEN9_LP(dev_priv) && !hibernation &&
                suspend_to_idle(dev_priv) && dev_priv->csr.dmc_payload;
        /*
         * In case of firmware assisted context save/restore don't manually
@@ -2061,11 +2082,14 @@ static int i915_pm_resume(struct device *kdev)
 /* freeze: before creating the hibernation_image */
 static int i915_pm_freeze(struct device *kdev)
 {
+       struct drm_device *dev = &kdev_to_i915(kdev)->drm;
        int ret;
 
-       ret = i915_pm_suspend(kdev);
-       if (ret)
-               return ret;
+       if (dev->switch_power_state != DRM_SWITCH_POWER_OFF) {
+               ret = i915_drm_suspend(dev);
+               if (ret)
+                       return ret;
+       }
 
        ret = i915_gem_freeze(kdev_to_i915(kdev));
        if (ret)
@@ -2076,11 +2100,14 @@ static int i915_pm_freeze(struct device *kdev)
 
 static int i915_pm_freeze_late(struct device *kdev)
 {
+       struct drm_device *dev = &kdev_to_i915(kdev)->drm;
        int ret;
 
-       ret = i915_pm_suspend_late(kdev);
-       if (ret)
-               return ret;
+       if (dev->switch_power_state != DRM_SWITCH_POWER_OFF) {
+               ret = i915_drm_suspend_late(dev, true);
+               if (ret)
+                       return ret;
+       }
 
        ret = i915_gem_freeze_late(kdev_to_i915(kdev));
        if (ret)
@@ -2476,7 +2503,7 @@ static int intel_runtime_suspend(struct device *kdev)
        struct drm_i915_private *dev_priv = to_i915(dev);
        int ret;
 
-       if (WARN_ON_ONCE(!(dev_priv->rps.enabled && intel_enable_rc6())))
+       if (WARN_ON_ONCE(!(dev_priv->gt_pm.rc6.enabled && intel_rc6_enabled())))
                return -ENODEV;
 
        if (WARN_ON_ONCE(!HAS_RUNTIME_PM(dev_priv)))
@@ -2518,12 +2545,12 @@ static int intel_runtime_suspend(struct device *kdev)
        intel_uncore_suspend(dev_priv);
 
        enable_rpm_wakeref_asserts(dev_priv);
-       WARN_ON_ONCE(atomic_read(&dev_priv->pm.wakeref_count));
+       WARN_ON_ONCE(atomic_read(&dev_priv->runtime_pm.wakeref_count));
 
        if (intel_uncore_arm_unclaimed_mmio_detection(dev_priv))
                DRM_ERROR("Unclaimed access detected prior to suspending\n");
 
-       dev_priv->pm.suspended = true;
+       dev_priv->runtime_pm.suspended = true;
 
        /*
         * FIXME: We really should find a document that references the arguments
@@ -2569,11 +2596,11 @@ static int intel_runtime_resume(struct device *kdev)
 
        DRM_DEBUG_KMS("Resuming device\n");
 
-       WARN_ON_ONCE(atomic_read(&dev_priv->pm.wakeref_count));
+       WARN_ON_ONCE(atomic_read(&dev_priv->runtime_pm.wakeref_count));
        disable_rpm_wakeref_asserts(dev_priv);
 
        intel_opregion_notify_adapter(dev_priv, PCI_D0);
-       dev_priv->pm.suspended = false;
+       dev_priv->runtime_pm.suspended = false;
        if (intel_uncore_unclaimed_mmio(dev_priv))
                DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n");
 
@@ -2608,6 +2635,8 @@ static int intel_runtime_resume(struct device *kdev)
        if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
                intel_hpd_init(dev_priv);
 
+       intel_enable_ipc(dev_priv);
+
        enable_rpm_wakeref_asserts(dev_priv);
 
        if (ret)