Merge drm/drm-next into drm-misc-next
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / i915_drv.c
index b15d206dca3adbca5f43fdad4cbe576fff1baff0..f2389ba49c69b753380aff4fde182aead96afba7 100644 (file)
@@ -84,6 +84,7 @@
 #include "intel_gvt.h"
 #include "intel_memory_region.h"
 #include "intel_pm.h"
+#include "intel_sideband.h"
 #include "vlv_suspend.h"
 
 static const struct drm_driver driver;
@@ -616,6 +617,8 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
         */
        intel_dram_detect(dev_priv);
 
+       intel_pcode_init(dev_priv);
+
        intel_bw_init_hw(dev_priv);
 
        return 0;
@@ -668,7 +671,8 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
        /* Reveal our presence to userspace */
        if (drm_dev_register(dev, 0) == 0) {
                i915_debugfs_register(dev_priv);
-               intel_display_debugfs_register(dev_priv);
+               if (HAS_DISPLAY(dev_priv))
+                       intel_display_debugfs_register(dev_priv);
                i915_setup_sysfs(dev_priv);
 
                /* Depends on sysfs having been initialized */
@@ -840,9 +844,7 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                    i915->params.fake_lmem_start) {
                        mkwrite_device_info(i915)->memory_regions =
                                REGION_SMEM | REGION_LMEM | REGION_STOLEN;
-                       mkwrite_device_info(i915)->is_dgfx = true;
                        GEM_BUG_ON(!HAS_LMEM(i915));
-                       GEM_BUG_ON(!IS_DGFX(i915));
                }
        }
 #endif
@@ -1036,6 +1038,35 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv)
        drm_modeset_unlock_all(dev);
 }
 
+static void intel_shutdown_encoders(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = &dev_priv->drm;
+       struct intel_encoder *encoder;
+
+       drm_modeset_lock_all(dev);
+       for_each_intel_encoder(dev, encoder)
+               if (encoder->shutdown)
+                       encoder->shutdown(encoder);
+       drm_modeset_unlock_all(dev);
+}
+
+void i915_driver_shutdown(struct drm_i915_private *i915)
+{
+       i915_gem_suspend(i915);
+
+       drm_kms_helper_poll_disable(&i915->drm);
+
+       drm_atomic_helper_shutdown(&i915->drm);
+
+       intel_dp_mst_suspend(i915);
+
+       intel_runtime_pm_disable_interrupts(i915);
+       intel_hpd_cancel_work(i915);
+
+       intel_suspend_encoders(i915);
+       intel_shutdown_encoders(i915);
+}
+
 static bool suspend_to_idle(struct drm_i915_private *dev_priv)
 {
 #if IS_ENABLED(CONFIG_ACPI_SLEEP)
@@ -1089,7 +1120,7 @@ static int i915_drm_suspend(struct drm_device *dev)
 
        i915_ggtt_suspend(&dev_priv->ggtt);
 
-       i915_save_state(dev_priv);
+       i915_save_display(dev_priv);
 
        opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
        intel_opregion_suspend(dev_priv, opregion_target_state);
@@ -1202,7 +1233,7 @@ static int i915_drm_resume(struct drm_device *dev)
 
        intel_csr_ucode_resume(dev_priv);
 
-       i915_restore_state(dev_priv);
+       i915_restore_display(dev_priv);
        intel_pps_unlock_regs_wa(dev_priv);
 
        intel_init_pch_refclk(dev_priv);
@@ -1225,26 +1256,15 @@ static int i915_drm_resume(struct drm_device *dev)
 
        intel_modeset_init_hw(dev_priv);
        intel_init_clock_gating(dev_priv);
+       intel_hpd_init(dev_priv);
 
-       spin_lock_irq(&dev_priv->irq_lock);
-       if (dev_priv->display.hpd_irq_setup)
-               dev_priv->display.hpd_irq_setup(dev_priv);
-       spin_unlock_irq(&dev_priv->irq_lock);
-
+       /* MST sideband requires HPD interrupts enabled */
        intel_dp_mst_resume(dev_priv);
-
        intel_display_resume(dev);
 
+       intel_hpd_poll_disable(dev_priv);
        drm_kms_helper_poll_enable(dev);
 
-       /*
-        * ... but also need to make sure that hotplug processing
-        * doesn't cause havoc. Like in the driver load code we don't
-        * bother with the tiny race here where we might lose hotplug
-        * notifications.
-        * */
-       intel_hpd_init(dev_priv);
-
        intel_opregion_resume(dev_priv);
 
        intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false);
@@ -1556,7 +1576,7 @@ static int intel_runtime_suspend(struct device *kdev)
        assert_forcewakes_inactive(&dev_priv->uncore);
 
        if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
-               intel_hpd_poll_init(dev_priv);
+               intel_hpd_poll_enable(dev_priv);
 
        drm_dbg_kms(&dev_priv->drm, "Device suspended\n");
        return 0;
@@ -1601,8 +1621,10 @@ static int intel_runtime_resume(struct device *kdev)
         * power well, so hpd is reinitialized from there. For
         * everyone else do it here.
         */
-       if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
+       if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) {
                intel_hpd_init(dev_priv);
+               intel_hpd_poll_disable(dev_priv);
+       }
 
        intel_enable_ipc(dev_priv);