]> rtime.felk.cvut.cz Git - linux-imx.git/blobdiff - drivers/gpu/drm/i915/i915_drv.c
drm/i915: create functions for the "unclaimed register" checks
[linux-imx.git] / drivers / gpu / drm / i915 / i915_drv.c
index 117265840b1ff2fcbd845c618acf8d3b592cd4a5..07ac769d73139041d0e843bb55c48a7ed6eb5fec 100644 (file)
@@ -121,9 +121,7 @@ MODULE_PARM_DESC(i915_enable_ppgtt,
 unsigned int i915_preliminary_hw_support __read_mostly = 0;
 module_param_named(preliminary_hw_support, i915_preliminary_hw_support, int, 0600);
 MODULE_PARM_DESC(preliminary_hw_support,
-               "Enable preliminary hardware support. "
-               "Enable Haswell and ValleyView Support. "
-               "(default: false)");
+               "Enable preliminary hardware support. (default: false)");
 
 static struct drm_driver driver;
 extern int intel_agp_enabled;
@@ -276,6 +274,7 @@ static const struct intel_device_info intel_valleyview_m_info = {
        .has_bsd_ring = 1,
        .has_blt_ring = 1,
        .is_valleyview = 1,
+       .display_mmio_offset = VLV_DISPLAY_BASE,
 };
 
 static const struct intel_device_info intel_valleyview_d_info = {
@@ -285,6 +284,7 @@ static const struct intel_device_info intel_valleyview_d_info = {
        .has_bsd_ring = 1,
        .has_blt_ring = 1,
        .is_valleyview = 1,
+       .display_mmio_offset = VLV_DISPLAY_BASE,
 };
 
 static const struct intel_device_info intel_haswell_d_info = {
@@ -468,6 +468,13 @@ static int i915_drm_freeze(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
+       /* ignore lid events during suspend */
+       mutex_lock(&dev_priv->modeset_restore_lock);
+       dev_priv->modeset_restore = MODESET_SUSPENDED;
+       mutex_unlock(&dev_priv->modeset_restore_lock);
+
+       intel_set_power_well(dev, true);
+
        drm_kms_helper_poll_disable(dev);
 
        pci_save_state(dev->pdev);
@@ -492,9 +499,6 @@ static int i915_drm_freeze(struct drm_device *dev)
 
        intel_opregion_fini(dev);
 
-       /* Modeset on resume, not lid events */
-       dev_priv->modeset_on_lid = 0;
-
        console_lock();
        intel_fbdev_set_suspend(dev, 1);
        console_unlock();
@@ -565,12 +569,11 @@ static int __i915_drm_thaw(struct drm_device *dev)
                intel_modeset_init_hw(dev);
                intel_modeset_setup_hw_state(dev, false);
                drm_irq_install(dev);
+               intel_hpd_init(dev);
        }
 
        intel_opregion_init(dev);
 
-       dev_priv->modeset_on_lid = 0;
-
        /*
         * The console lock can be pretty contented on resume due
         * to all the printk activity.  Try to keep it out of the hot
@@ -583,6 +586,9 @@ static int __i915_drm_thaw(struct drm_device *dev)
                schedule_work(&dev_priv->console_resume_work);
        }
 
+       mutex_lock(&dev_priv->modeset_restore_lock);
+       dev_priv->modeset_restore = MODESET_DONE;
+       mutex_unlock(&dev_priv->modeset_restore_lock);
        return error;
 }
 
@@ -778,9 +784,9 @@ int intel_gpu_reset(struct drm_device *dev)
        }
 
        /* Also reset the gpu hangman. */
-       if (dev_priv->stop_rings) {
+       if (dev_priv->gpu_error.stop_rings) {
                DRM_DEBUG("Simulated gpu hang, resetting stop_rings\n");
-               dev_priv->stop_rings = 0;
+               dev_priv->gpu_error.stop_rings = 0;
                if (ret == -ENODEV) {
                        DRM_ERROR("Reset not implemented, but ignoring "
                                  "error for simulated gpu hangs\n");
@@ -819,12 +825,12 @@ int i915_reset(struct drm_device *dev)
        i915_gem_reset(dev);
 
        ret = -ENODEV;
-       if (get_seconds() - dev_priv->last_gpu_reset < 5)
+       if (get_seconds() - dev_priv->gpu_error.last_reset < 5)
                DRM_ERROR("GPU hanging too fast, declaring wedged!\n");
        else
                ret = intel_gpu_reset(dev);
 
-       dev_priv->last_gpu_reset = get_seconds();
+       dev_priv->gpu_error.last_reset = get_seconds();
        if (ret) {
                DRM_ERROR("Failed to reset chip.\n");
                mutex_unlock(&dev->struct_mutex);
@@ -870,6 +876,7 @@ int i915_reset(struct drm_device *dev)
 
                drm_irq_uninstall(dev);
                drm_irq_install(dev);
+               intel_hpd_init(dev);
        } else {
                mutex_unlock(&dev->struct_mutex);
        }
@@ -1113,102 +1120,6 @@ MODULE_LICENSE("GPL and additional rights");
        ((HAS_FORCE_WAKE((dev_priv)->dev)) && \
         ((reg) < 0x40000) &&            \
         ((reg) != FORCEWAKE))
-
-static bool IS_DISPLAYREG(u32 reg)
-{
-       /*
-        * This should make it easier to transition modules over to the
-        * new register block scheme, since we can do it incrementally.
-        */
-       if (reg >= VLV_DISPLAY_BASE)
-               return false;
-
-       if (reg >= RENDER_RING_BASE &&
-           reg < RENDER_RING_BASE + 0xff)
-               return false;
-       if (reg >= GEN6_BSD_RING_BASE &&
-           reg < GEN6_BSD_RING_BASE + 0xff)
-               return false;
-       if (reg >= BLT_RING_BASE &&
-           reg < BLT_RING_BASE + 0xff)
-               return false;
-
-       if (reg == PGTBL_ER)
-               return false;
-
-       if (reg >= IPEIR_I965 &&
-           reg < HWSTAM)
-               return false;
-
-       if (reg == MI_MODE)
-               return false;
-
-       if (reg == GFX_MODE_GEN7)
-               return false;
-
-       if (reg == RENDER_HWS_PGA_GEN7 ||
-           reg == BSD_HWS_PGA_GEN7 ||
-           reg == BLT_HWS_PGA_GEN7)
-               return false;
-
-       if (reg == GEN6_BSD_SLEEP_PSMI_CONTROL ||
-           reg == GEN6_BSD_RNCID)
-               return false;
-
-       if (reg == GEN6_BLITTER_ECOSKPD)
-               return false;
-
-       if (reg >= 0x4000c &&
-           reg <= 0x4002c)
-               return false;
-
-       if (reg >= 0x4f000 &&
-           reg <= 0x4f08f)
-               return false;
-
-       if (reg >= 0x4f100 &&
-           reg <= 0x4f11f)
-               return false;
-
-       if (reg >= VLV_MASTER_IER &&
-           reg <= GEN6_PMIER)
-               return false;
-
-       if (reg >= FENCE_REG_SANDYBRIDGE_0 &&
-           reg < (FENCE_REG_SANDYBRIDGE_0 + (16*8)))
-               return false;
-
-       if (reg >= VLV_IIR_RW &&
-           reg <= VLV_ISR)
-               return false;
-
-       if (reg == FORCEWAKE_VLV ||
-           reg == FORCEWAKE_ACK_VLV)
-               return false;
-
-       if (reg == GEN6_GDRST)
-               return false;
-
-       switch (reg) {
-       case _3D_CHICKEN3:
-       case IVB_CHICKEN3:
-       case GEN7_COMMON_SLICE_CHICKEN1:
-       case GEN7_L3CNTLREG1:
-       case GEN7_L3_CHICKEN_MODE_REGISTER:
-       case GEN7_ROW_CHICKEN2:
-       case GEN7_L3SQCREG4:
-       case GEN7_SQ_CHICKEN_MBCUNIT_CONFIG:
-       case GEN7_HALF_SLICE_CHICKEN1:
-       case GEN6_MBCTL:
-       case GEN6_UCGCTL2:
-               return false;
-       default:
-               break;
-       }
-
-       return true;
-}
-
 static void
 ilk_dummy_write(struct drm_i915_private *dev_priv)
 {
@@ -1218,6 +1129,27 @@ ilk_dummy_write(struct drm_i915_private *dev_priv)
        I915_WRITE_NOTRACE(MI_MODE, 0);
 }
 
+static void
+hsw_unclaimed_reg_clear(struct drm_i915_private *dev_priv, u32 reg)
+{
+       if (IS_HASWELL(dev_priv->dev) &&
+           (I915_READ_NOTRACE(GEN7_ERR_INT) & ERR_INT_MMIO_UNCLAIMED)) {
+               DRM_ERROR("Unknown unclaimed register before writing to %x\n",
+                         reg);
+               I915_WRITE_NOTRACE(GEN7_ERR_INT, ERR_INT_MMIO_UNCLAIMED);
+       }
+}
+
+static void
+hsw_unclaimed_reg_check(struct drm_i915_private *dev_priv, u32 reg)
+{
+       if (IS_HASWELL(dev_priv->dev) &&
+           (I915_READ_NOTRACE(GEN7_ERR_INT) & ERR_INT_MMIO_UNCLAIMED)) {
+               DRM_ERROR("Unclaimed write to %x\n", reg);
+               writel(ERR_INT_MMIO_UNCLAIMED, dev_priv->regs + GEN7_ERR_INT);
+       }
+}
+
 #define __i915_read(x, y) \
 u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
        u##x val = 0; \
@@ -1232,8 +1164,6 @@ u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
                if (dev_priv->forcewake_count == 0) \
                        dev_priv->gt.force_wake_put(dev_priv); \
                spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); \
-       } else if (IS_VALLEYVIEW(dev_priv->dev) && IS_DISPLAYREG(reg)) { \
-               val = read##y(dev_priv->regs + reg + 0x180000);         \
        } else { \
                val = read##y(dev_priv->regs + reg); \
        } \
@@ -1256,22 +1186,12 @@ void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \
        } \
        if (IS_GEN5(dev_priv->dev)) \
                ilk_dummy_write(dev_priv); \
-       if (IS_HASWELL(dev_priv->dev) && (I915_READ_NOTRACE(GEN7_ERR_INT) & ERR_INT_MMIO_UNCLAIMED)) { \
-               DRM_ERROR("Unknown unclaimed register before writing to %x\n", reg); \
-               I915_WRITE_NOTRACE(GEN7_ERR_INT, ERR_INT_MMIO_UNCLAIMED); \
-       } \
-       if (IS_VALLEYVIEW(dev_priv->dev) && IS_DISPLAYREG(reg)) { \
-               write##y(val, dev_priv->regs + reg + 0x180000);         \
-       } else {                                                        \
-               write##y(val, dev_priv->regs + reg);                    \
-       }                                                               \
+       hsw_unclaimed_reg_clear(dev_priv, reg); \
+       write##y(val, dev_priv->regs + reg); \
        if (unlikely(__fifo_ret)) { \
                gen6_gt_check_fifodbg(dev_priv); \
        } \
-       if (IS_HASWELL(dev_priv->dev) && (I915_READ_NOTRACE(GEN7_ERR_INT) & ERR_INT_MMIO_UNCLAIMED)) { \
-               DRM_ERROR("Unclaimed write to %x\n", reg); \
-               writel(ERR_INT_MMIO_UNCLAIMED, dev_priv->regs + GEN7_ERR_INT);  \
-       } \
+       hsw_unclaimed_reg_check(dev_priv, reg); \
 }
 __i915_write(8, b)
 __i915_write(16, w)