Revert "drm/i915: Make intel_display_suspend atomic, v2."
[deliverable/linux.git] / drivers / gpu / drm / i915 / i915_drv.c
index e70adfd3b2d1dbf6f06a894a70c79ac8ca46547c..78ef0bb53c36a51b25a23df2082e3f1693ce543a 100644 (file)
@@ -545,15 +545,35 @@ void intel_hpd_cancel_work(struct drm_i915_private *dev_priv)
 {
        spin_lock_irq(&dev_priv->irq_lock);
 
-       dev_priv->long_hpd_port_mask = 0;
-       dev_priv->short_hpd_port_mask = 0;
-       dev_priv->hpd_event_bits = 0;
+       dev_priv->hotplug.long_port_mask = 0;
+       dev_priv->hotplug.short_port_mask = 0;
+       dev_priv->hotplug.event_bits = 0;
 
        spin_unlock_irq(&dev_priv->irq_lock);
 
-       cancel_work_sync(&dev_priv->dig_port_work);
-       cancel_work_sync(&dev_priv->hotplug_work);
-       cancel_delayed_work_sync(&dev_priv->hotplug_reenable_work);
+       cancel_work_sync(&dev_priv->hotplug.dig_port_work);
+       cancel_work_sync(&dev_priv->hotplug.hotplug_work);
+       cancel_delayed_work_sync(&dev_priv->hotplug.reenable_work);
+}
+
+void i915_firmware_load_error_print(const char *fw_path, int err)
+{
+       DRM_ERROR("failed to load firmware %s (%d)\n", fw_path, err);
+
+       /*
+        * If the reason is not known assume -ENOENT since that's the most
+        * usual failure mode.
+        */
+       if (!err)
+               err = -ENOENT;
+
+       if (!(IS_BUILTIN(CONFIG_DRM_I915) && err == -ENOENT))
+               return;
+
+       DRM_ERROR(
+         "The driver is built-in, so to load the firmware you need to\n"
+         "include it either in the kernel (see CONFIG_EXTRA_FIRMWARE) or\n"
+         "in your initrd/initramfs image.\n");
 }
 
 static void intel_suspend_encoders(struct drm_i915_private *dev_priv)
@@ -574,11 +594,13 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv)
 static int intel_suspend_complete(struct drm_i915_private *dev_priv);
 static int vlv_resume_prepare(struct drm_i915_private *dev_priv,
                              bool rpm_resume);
+static int skl_resume_prepare(struct drm_i915_private *dev_priv);
+static int bxt_resume_prepare(struct drm_i915_private *dev_priv);
+
 
 static int i915_drm_suspend(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_crtc *crtc;
        pci_power_t opregion_target_state;
        int error;
 
@@ -609,8 +631,7 @@ static int i915_drm_suspend(struct drm_device *dev)
         * for _thaw. Also, power gate the CRTC power wells.
         */
        drm_modeset_lock_all(dev);
-       for_each_crtc(dev, crtc)
-               intel_crtc_control(crtc, false);
+       intel_display_suspend(dev);
        drm_modeset_unlock_all(dev);
 
        intel_dp_mst_suspend(dev);
@@ -712,6 +733,16 @@ static int i915_drm_resume(struct drm_device *dev)
        intel_init_pch_refclk(dev);
        drm_mode_config_reset(dev);
 
+       /*
+        * Interrupts have to be enabled before any batches are run. If not the
+        * GPU will hang. i915_gem_init_hw() will initiate batches to
+        * update/restore the context.
+        *
+        * Modeset enabling in intel_modeset_init_hw() also needs working
+        * interrupts.
+        */
+       intel_runtime_pm_enable_interrupts(dev_priv);
+
        mutex_lock(&dev->struct_mutex);
        if (i915_gem_init_hw(dev)) {
                DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
@@ -719,9 +750,6 @@ static int i915_drm_resume(struct drm_device *dev)
        }
        mutex_unlock(&dev->struct_mutex);
 
-       /* We need working interrupts for modeset enabling ... */
-       intel_runtime_pm_enable_interrupts(dev_priv);
-
        intel_modeset_init_hw(dev);
 
        spin_lock_irq(&dev_priv->irq_lock);
@@ -782,11 +810,16 @@ static int i915_drm_resume_early(struct drm_device *dev)
        if (IS_VALLEYVIEW(dev_priv))
                ret = vlv_resume_prepare(dev_priv, false);
        if (ret)
-               DRM_ERROR("Resume prepare failed: %d,Continuing resume\n", ret);
+               DRM_ERROR("Resume prepare failed: %d, continuing anyway\n",
+                         ret);
 
        intel_uncore_early_sanitize(dev, true);
 
-       if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
+       if (IS_BROXTON(dev))
+               ret = bxt_resume_prepare(dev_priv);
+       else if (IS_SKYLAKE(dev_priv))
+               ret = skl_resume_prepare(dev_priv);
+       else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
                hsw_disable_pc8(dev_priv);
 
        intel_uncore_sanitize(dev);
@@ -958,7 +991,7 @@ static int i915_pm_suspend_late(struct device *dev)
        struct drm_device *drm_dev = dev_to_i915(dev)->dev;
 
        /*
-        * We have a suspedn ordering issue with the snd-hda driver also
+        * We have a suspend ordering issue with the snd-hda driver also
         * requiring our device to be power up. Due to the lack of a
         * parent/child relationship we currently solve this with an late
         * suspend hook.
@@ -1002,6 +1035,21 @@ static int i915_pm_resume(struct device *dev)
        return i915_drm_resume(drm_dev);
 }
 
+static int skl_suspend_complete(struct drm_i915_private *dev_priv)
+{
+       /* Enabling DC6 is not a hard requirement to enter runtime D3 */
+
+       /*
+        * This is to ensure that CSR isn't identified as loaded before
+        * CSR-loading program is called during runtime-resume.
+        */
+       intel_csr_load_status_set(dev_priv, FW_UNINITIALIZED);
+
+       skl_uninit_cdclk(dev_priv);
+
+       return 0;
+}
+
 static int hsw_suspend_complete(struct drm_i915_private *dev_priv)
 {
        hsw_enable_pc8(dev_priv);
@@ -1041,6 +1089,16 @@ static int bxt_resume_prepare(struct drm_i915_private *dev_priv)
        return 0;
 }
 
+static int skl_resume_prepare(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = dev_priv->dev;
+
+       skl_init_cdclk(dev_priv);
+       intel_csr_load_program(dev);
+
+       return 0;
+}
+
 /*
  * Save all Gunit registers that may be lost after a D3 and a subsequent
  * S0i[R123] transition. The list of registers needing a save/restore is
@@ -1502,6 +1560,8 @@ static int intel_runtime_resume(struct device *device)
 
        if (IS_BROXTON(dev))
                ret = bxt_resume_prepare(dev_priv);
+       else if (IS_SKYLAKE(dev))
+               ret = skl_resume_prepare(dev_priv);
        else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
                hsw_disable_pc8(dev_priv);
        else if (IS_VALLEYVIEW(dev_priv))
@@ -1531,14 +1591,15 @@ static int intel_runtime_resume(struct device *device)
  */
 static int intel_suspend_complete(struct drm_i915_private *dev_priv)
 {
-       struct drm_device *dev = dev_priv->dev;
        int ret;
 
-       if (IS_BROXTON(dev))
+       if (IS_BROXTON(dev_priv))
                ret = bxt_suspend_complete(dev_priv);
-       else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
+       else if (IS_SKYLAKE(dev_priv))
+               ret = skl_suspend_complete(dev_priv);
+       else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
                ret = hsw_suspend_complete(dev_priv);
-       else if (IS_VALLEYVIEW(dev))
+       else if (IS_VALLEYVIEW(dev_priv))
                ret = vlv_suspend_complete(dev_priv);
        else
                ret = 0;
This page took 0.030751 seconds and 5 git commands to generate.