Merge tag 'drm-intel-next-fixes-2015-04-25' of git://anongit.freedesktop.org/drm...
[cascardo/linux.git] / drivers / gpu / drm / i915 / i915_drv.c
index 5c66b56..c302ffb 100644 (file)
@@ -346,7 +346,6 @@ static const struct intel_device_info intel_broadwell_gt3m_info = {
 };
 
 static const struct intel_device_info intel_cherryview_info = {
-       .is_preliminary = 1,
        .gen = 8, .num_pipes = 3,
        .need_gfx_hws = 1, .has_hotplug = 1,
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
@@ -369,6 +368,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 +418,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 +567,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 +582,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);
 
@@ -679,53 +689,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);
 
@@ -861,38 +866,29 @@ 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;
-               }
+       dev_priv->gpu_error.reload_in_reset = false;
 
-               /*
-                * 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);
-       } 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;
        }
 
+       /*
+        * 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;
 }
 
@@ -1042,7 +1038,7 @@ static void vlv_save_gunit_s0ix_state(struct drm_i915_private *dev_priv)
                s->lra_limits[i] = I915_READ(GEN7_LRA_LIMITS_BASE + i * 4);
 
        s->media_max_req_count  = I915_READ(GEN7_MEDIA_MAX_REQ_COUNT);
-       s->gfx_max_req_count    = I915_READ(GEN7_MEDIA_MAX_REQ_COUNT);
+       s->gfx_max_req_count    = I915_READ(GEN7_GFX_MAX_REQ_COUNT);
 
        s->render_hwsp          = I915_READ(RENDER_HWS_PGA_GEN7);
        s->ecochk               = I915_READ(GAM_ECOCHK);
@@ -1124,7 +1120,7 @@ static void vlv_restore_gunit_s0ix_state(struct drm_i915_private *dev_priv)
                I915_WRITE(GEN7_LRA_LIMITS_BASE + i * 4, s->lra_limits[i]);
 
        I915_WRITE(GEN7_MEDIA_MAX_REQ_COUNT, s->media_max_req_count);
-       I915_WRITE(GEN7_MEDIA_MAX_REQ_COUNT, s->gfx_max_req_count);
+       I915_WRITE(GEN7_GFX_MAX_REQ_COUNT, s->gfx_max_req_count);
 
        I915_WRITE(RENDER_HWS_PGA_GEN7, s->render_hwsp);
        I915_WRITE(GAM_ECOCHK,          s->ecochk);
@@ -1640,11 +1636,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
        }
 
        /*
@@ -1660,10 +1654,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);
 }