Merge tag 'drm-intel-next-2015-02-27' of git://anongit.freedesktop.org/drm-intel...
[cascardo/linux.git] / drivers / gpu / drm / i915 / i915_drv.c
index 8039cec..875b1b7 100644 (file)
@@ -369,6 +369,19 @@ static const struct intel_device_info intel_skylake_info = {
        IVB_CURSOR_OFFSETS,
 };
 
+static const struct intel_device_info intel_skylake_gt3_info = {
+       .is_preliminary = 1,
+       .is_skylake = 1,
+       .gen = 9, .num_pipes = 3,
+       .need_gfx_hws = 1, .has_hotplug = 1,
+       .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
+       .has_llc = 1,
+       .has_ddi = 1,
+       .has_fbc = 1,
+       GEN_DEFAULT_PIPEOFFSETS,
+       IVB_CURSOR_OFFSETS,
+};
+
 /*
  * Make sure any device matches here are from most specific to most
  * general.  For example, since the Quanta match is based on the subsystem
@@ -406,7 +419,9 @@ static const struct intel_device_info intel_skylake_info = {
        INTEL_BDW_GT3M_IDS(&intel_broadwell_gt3m_info), \
        INTEL_BDW_GT3D_IDS(&intel_broadwell_gt3d_info), \
        INTEL_CHV_IDS(&intel_cherryview_info),  \
-       INTEL_SKL_IDS(&intel_skylake_info)
+       INTEL_SKL_GT1_IDS(&intel_skylake_info), \
+       INTEL_SKL_GT2_IDS(&intel_skylake_info), \
+       INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info)      \
 
 static const struct pci_device_id pciidlist[] = {              /* aka */
        INTEL_PCI_IDS,
@@ -553,6 +568,7 @@ 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;
 
        /* ignore lid events during suspend */
        mutex_lock(&dev_priv->modeset_restore_lock);
@@ -567,37 +583,32 @@ static int i915_drm_suspend(struct drm_device *dev)
 
        pci_save_state(dev->pdev);
 
-       /* If KMS is active, we do the leavevt stuff here */
-       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-               int error;
-
-               error = i915_gem_suspend(dev);
-               if (error) {
-                       dev_err(&dev->pdev->dev,
-                               "GEM idle failed, resume might fail\n");
-                       return error;
-               }
+       error = i915_gem_suspend(dev);
+       if (error) {
+               dev_err(&dev->pdev->dev,
+                       "GEM idle failed, resume might fail\n");
+               return error;
+       }
 
-               intel_suspend_gt_powersave(dev);
+       intel_suspend_gt_powersave(dev);
 
-               /*
-                * Disable CRTCs directly since we want to preserve sw state
-                * for _thaw. Also, power gate the CRTC power wells.
-                */
-               drm_modeset_lock_all(dev);
-               for_each_crtc(dev, crtc)
-                       intel_crtc_control(crtc, false);
-               drm_modeset_unlock_all(dev);
+       /*
+        * Disable CRTCs directly since we want to preserve sw state
+        * for _thaw. Also, power gate the CRTC power wells.
+        */
+       drm_modeset_lock_all(dev);
+       for_each_crtc(dev, crtc)
+               intel_crtc_control(crtc, false);
+       drm_modeset_unlock_all(dev);
 
-               intel_dp_mst_suspend(dev);
+       intel_dp_mst_suspend(dev);
 
-               intel_runtime_pm_disable_interrupts(dev_priv);
-               intel_hpd_cancel_work(dev_priv);
+       intel_runtime_pm_disable_interrupts(dev_priv);
+       intel_hpd_cancel_work(dev_priv);
 
-               intel_suspend_encoders(dev_priv);
+       intel_suspend_encoders(dev_priv);
 
-               intel_suspend_hw(dev);
-       }
+       intel_suspend_hw(dev);
 
        i915_gem_suspend_gtt_mappings(dev);
 
@@ -669,53 +680,48 @@ static int i915_drm_resume(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-               mutex_lock(&dev->struct_mutex);
-               i915_gem_restore_gtt_mappings(dev);
-               mutex_unlock(&dev->struct_mutex);
-       }
+       mutex_lock(&dev->struct_mutex);
+       i915_gem_restore_gtt_mappings(dev);
+       mutex_unlock(&dev->struct_mutex);
 
        i915_restore_state(dev);
        intel_opregion_setup(dev);
 
-       /* KMS EnterVT equivalent */
-       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-               intel_init_pch_refclk(dev);
-               drm_mode_config_reset(dev);
+       intel_init_pch_refclk(dev);
+       drm_mode_config_reset(dev);
 
-               mutex_lock(&dev->struct_mutex);
-               if (i915_gem_init_hw(dev)) {
-                       DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
-                       atomic_set_mask(I915_WEDGED, &dev_priv->gpu_error.reset_counter);
-               }
-               mutex_unlock(&dev->struct_mutex);
+       mutex_lock(&dev->struct_mutex);
+       if (i915_gem_init_hw(dev)) {
+               DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
+               atomic_set_mask(I915_WEDGED, &dev_priv->gpu_error.reset_counter);
+       }
+       mutex_unlock(&dev->struct_mutex);
 
-               /* We need working interrupts for modeset enabling ... */
-               intel_runtime_pm_enable_interrupts(dev_priv);
+       /* We need working interrupts for modeset enabling ... */
+       intel_runtime_pm_enable_interrupts(dev_priv);
 
-               intel_modeset_init_hw(dev);
+       intel_modeset_init_hw(dev);
 
-               spin_lock_irq(&dev_priv->irq_lock);
-               if (dev_priv->display.hpd_irq_setup)
-                       dev_priv->display.hpd_irq_setup(dev);
-               spin_unlock_irq(&dev_priv->irq_lock);
+       spin_lock_irq(&dev_priv->irq_lock);
+       if (dev_priv->display.hpd_irq_setup)
+               dev_priv->display.hpd_irq_setup(dev);
+       spin_unlock_irq(&dev_priv->irq_lock);
 
-               drm_modeset_lock_all(dev);
-               intel_modeset_setup_hw_state(dev, true);
-               drm_modeset_unlock_all(dev);
+       drm_modeset_lock_all(dev);
+       intel_modeset_setup_hw_state(dev, true);
+       drm_modeset_unlock_all(dev);
 
-               intel_dp_mst_resume(dev);
+       intel_dp_mst_resume(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 loose hotplug
-                * notifications.
-                * */
-               intel_hpd_init(dev_priv);
-               /* Config may have changed between suspend and resume */
-               drm_helper_hpd_irq_event(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 loose hotplug
+        * notifications.
+        * */
+       intel_hpd_init(dev_priv);
+       /* Config may have changed between suspend and resume */
+       drm_helper_hpd_irq_event(dev);
 
        intel_opregion_init(dev);
 
@@ -851,38 +857,35 @@ int i915_reset(struct drm_device *dev)
         * was running at the time of the reset (i.e. we weren't VT
         * switched away).
         */
-       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-               /* Used to prevent gem_check_wedged returning -EAGAIN during gpu reset */
-               dev_priv->gpu_error.reload_in_reset = true;
 
-               ret = i915_gem_init_hw(dev);
+       /* Used to prevent gem_check_wedged returning -EAGAIN during gpu reset */
+       dev_priv->gpu_error.reload_in_reset = true;
 
-               dev_priv->gpu_error.reload_in_reset = false;
+       ret = i915_gem_init_hw(dev);
 
-               mutex_unlock(&dev->struct_mutex);
-               if (ret) {
-                       DRM_ERROR("Failed hw init on reset %d\n", ret);
-                       return ret;
-               }
-
-               /*
-                * FIXME: This races pretty badly against concurrent holders of
-                * ring interrupts. This is possible since we've started to drop
-                * dev->struct_mutex in select places when waiting for the gpu.
-                */
+       dev_priv->gpu_error.reload_in_reset = false;
 
-               /*
-                * rps/rc6 re-init is necessary to restore state lost after the
-                * reset and the re-install of gt irqs. Skip for ironlake per
-                * previous concerns that it doesn't respond well to some forms
-                * of re-init after reset.
-                */
-               if (INTEL_INFO(dev)->gen > 5)
-                       intel_enable_gt_powersave(dev);
-       } else {
-               mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev->struct_mutex);
+       if (ret) {
+               DRM_ERROR("Failed hw init on reset %d\n", ret);
+               return ret;
        }
 
+       /*
+        * FIXME: This races pretty badly against concurrent holders of
+        * ring interrupts. This is possible since we've started to drop
+        * dev->struct_mutex in select places when waiting for the gpu.
+        */
+
+       /*
+        * rps/rc6 re-init is necessary to restore state lost after the
+        * reset and the re-install of gt irqs. Skip for ironlake per
+        * previous concerns that it doesn't respond well to some forms
+        * of re-init after reset.
+        */
+       if (INTEL_INFO(dev)->gen > 5)
+               intel_enable_gt_powersave(dev);
+
        return 0;
 }
 
@@ -1630,11 +1633,9 @@ static int __init i915_init(void)
 
        if (!(driver.driver_features & DRIVER_MODESET)) {
                driver.get_vblank_timestamp = NULL;
-#ifndef CONFIG_DRM_I915_UMS
                /* Silently fail loading to not upset userspace. */
                DRM_DEBUG_DRIVER("KMS and UMS disabled.\n");
                return 0;
-#endif
        }
 
        /*
@@ -1650,10 +1651,8 @@ static int __init i915_init(void)
 
 static void __exit i915_exit(void)
 {
-#ifndef CONFIG_DRM_I915_UMS
        if (!(driver.driver_features & DRIVER_MODESET))
                return; /* Never loaded a driver. */
-#endif
 
        drm_pci_exit(&driver, &i915_pci_driver);
 }