Merge tag 'v3.18-rc7' into drm-next
authorDave Airlie <airlied@redhat.com>
Tue, 2 Dec 2014 00:58:33 +0000 (10:58 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 2 Dec 2014 00:58:33 +0000 (10:58 +1000)
This fixes a bunch of conflicts prior to merging i915 tree.

Linux 3.18-rc7

Conflicts:
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/tegra/dc.c

23 files changed:
1  2 
Documentation/devicetree/bindings/vendor-prefixes.txt
MAINTAINERS
arch/arm/boot/dts/r8a7790.dtsi
arch/arm/mach-shmobile/clock-r8a7740.c
arch/arm/mach-shmobile/clock-r8a7790.c
arch/arm/mach-shmobile/setup-sh73a0.c
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_tiling.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_panel.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/nouveau/nv50_display.c
drivers/gpu/drm/radeon/cik.c
drivers/gpu/drm/radeon/cik_sdma.c
drivers/gpu/drm/radeon/r600_dma.c
drivers/gpu/drm/radeon/r600_dpm.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/si.c
drivers/gpu/drm/tegra/dc.c
kernel/events/uprobes.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
@@@ -626,26 -744,20 +626,38 @@@ static struct platform_driver exynos_dr
  
  static int exynos_drm_init(void)
  {
 -      int ret;
 +      bool is_exynos = false;
 +      int ret, i, j;
 +
 +      /*
 +       * Register device object only in case of Exynos SoC.
 +       *
 +       * Below codes resolves temporarily infinite loop issue incurred
 +       * by Exynos drm driver when using multi-platform kernel.
 +       * So these codes will be replaced with more generic way later.
 +       */
 +      for (i = 0; i < ARRAY_SIZE(strings); i++) {
 +              if (of_machine_is_compatible(strings[i])) {
 +                      is_exynos = true;
 +                      break;
 +              }
 +      }
 +
 +      if (!is_exynos)
 +              return -ENODEV;
  
+       /*
+        * Register device object only in case of Exynos SoC.
+        *
+        * Below codes resolves temporarily infinite loop issue incurred
+        * by Exynos drm driver when using multi-platform kernel.
+        * So these codes will be replaced with more generic way later.
+        */
+       if (!of_machine_is_compatible("samsung,exynos3") &&
+                       !of_machine_is_compatible("samsung,exynos4") &&
+                       !of_machine_is_compatible("samsung,exynos5"))
+               return -ENODEV;
        exynos_drm_pdev = platform_device_register_simple("exynos-drm", -1,
                                                                NULL, 0);
        if (IS_ERR(exynos_drm_pdev))
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -6361,744 -6027,1146 +6361,739 @@@ static void ibx_init_clock_gating(struc
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      dev_priv->display.init_clock_gating(dev);
 +      /*
 +       * On Ibex Peak and Cougar Point, we need to disable clock
 +       * gating for the panel power sequencer or it will fail to
 +       * start up when no ports are active.
 +       */
 +      I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE);
  }
  
 -void intel_suspend_hw(struct drm_device *dev)
 +static void g4x_disable_trickle_feed(struct drm_device *dev)
  {
 -      if (HAS_PCH_LPT(dev))
 -              lpt_suspend_hw(dev);
 -}
 -
 -#define for_each_power_well(i, power_well, domain_mask, power_domains)        \
 -      for (i = 0;                                                     \
 -           i < (power_domains)->power_well_count &&                   \
 -               ((power_well) = &(power_domains)->power_wells[i]);     \
 -           i++)                                                       \
 -              if ((power_well)->domains & (domain_mask))
 -
 -#define for_each_power_well_rev(i, power_well, domain_mask, power_domains) \
 -      for (i = (power_domains)->power_well_count - 1;                  \
 -           i >= 0 && ((power_well) = &(power_domains)->power_wells[i]);\
 -           i--)                                                        \
 -              if ((power_well)->domains & (domain_mask))
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      int pipe;
  
 -/**
 - * We should only use the power well if we explicitly asked the hardware to
 - * enable it, so check if it's enabled and also check if we've requested it to
 - * be enabled.
 - */
 -static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,
 -                                 struct i915_power_well *power_well)
 -{
 -      return I915_READ(HSW_PWR_WELL_DRIVER) ==
 -                   (HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED);
 +      for_each_pipe(dev_priv, pipe) {
 +              I915_WRITE(DSPCNTR(pipe),
 +                         I915_READ(DSPCNTR(pipe)) |
 +                         DISPPLANE_TRICKLE_FEED_DISABLE);
 +              intel_flush_primary_plane(dev_priv, pipe);
 +      }
  }
  
 -bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv,
 -                                        enum intel_display_power_domain domain)
 +static void ilk_init_lp_watermarks(struct drm_device *dev)
  {
 -      struct i915_power_domains *power_domains;
 -      struct i915_power_well *power_well;
 -      bool is_enabled;
 -      int i;
 -
 -      if (dev_priv->pm.suspended)
 -              return false;
 -
 -      power_domains = &dev_priv->power_domains;
 -
 -      is_enabled = true;
 -
 -      for_each_power_well_rev(i, power_well, BIT(domain), power_domains) {
 -              if (power_well->always_on)
 -                      continue;
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -              if (!power_well->hw_enabled) {
 -                      is_enabled = false;
 -                      break;
 -              }
 -      }
 +      I915_WRITE(WM3_LP_ILK, I915_READ(WM3_LP_ILK) & ~WM1_LP_SR_EN);
 +      I915_WRITE(WM2_LP_ILK, I915_READ(WM2_LP_ILK) & ~WM1_LP_SR_EN);
 +      I915_WRITE(WM1_LP_ILK, I915_READ(WM1_LP_ILK) & ~WM1_LP_SR_EN);
  
 -      return is_enabled;
 +      /*
 +       * Don't touch WM1S_LP_EN here.
 +       * Doing so could cause underruns.
 +       */
  }
  
 -bool intel_display_power_enabled(struct drm_i915_private *dev_priv,
 -                               enum intel_display_power_domain domain)
 +static void ironlake_init_clock_gating(struct drm_device *dev)
  {
 -      struct i915_power_domains *power_domains;
 -      bool ret;
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      uint32_t dspclk_gate = ILK_VRHUNIT_CLOCK_GATE_DISABLE;
  
 -      power_domains = &dev_priv->power_domains;
 +      /*
 +       * Required for FBC
 +       * WaFbcDisableDpfcClockGating:ilk
 +       */
 +      dspclk_gate |= ILK_DPFCRUNIT_CLOCK_GATE_DISABLE |
 +                 ILK_DPFCUNIT_CLOCK_GATE_DISABLE |
 +                 ILK_DPFDUNIT_CLOCK_GATE_ENABLE;
  
 -      mutex_lock(&power_domains->lock);
 -      ret = intel_display_power_enabled_unlocked(dev_priv, domain);
 -      mutex_unlock(&power_domains->lock);
 +      I915_WRITE(PCH_3DCGDIS0,
 +                 MARIUNIT_CLOCK_GATE_DISABLE |
 +                 SVSMUNIT_CLOCK_GATE_DISABLE);
 +      I915_WRITE(PCH_3DCGDIS1,
 +                 VFMUNIT_CLOCK_GATE_DISABLE);
  
 -      return ret;
 -}
 +      /*
 +       * According to the spec the following bits should be set in
 +       * order to enable memory self-refresh
 +       * The bit 22/21 of 0x42004
 +       * The bit 5 of 0x42020
 +       * The bit 15 of 0x45000
 +       */
 +      I915_WRITE(ILK_DISPLAY_CHICKEN2,
 +                 (I915_READ(ILK_DISPLAY_CHICKEN2) |
 +                  ILK_DPARB_GATE | ILK_VSDPFD_FULL));
 +      dspclk_gate |= ILK_DPARBUNIT_CLOCK_GATE_ENABLE;
 +      I915_WRITE(DISP_ARB_CTL,
 +                 (I915_READ(DISP_ARB_CTL) |
 +                  DISP_FBC_WM_DIS));
  
 -/*
 - * Starting with Haswell, we have a "Power Down Well" that can be turned off
 - * when not needed anymore. We have 4 registers that can request the power well
 - * to be enabled, and it will only be disabled if none of the registers is
 - * requesting it to be enabled.
 - */
 -static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
 -{
 -      struct drm_device *dev = dev_priv->dev;
 +      ilk_init_lp_watermarks(dev);
  
        /*
 -       * After we re-enable the power well, if we touch VGA register 0x3d5
 -       * we'll get unclaimed register interrupts. This stops after we write
 -       * anything to the VGA MSR register. The vgacon module uses this
 -       * register all the time, so if we unbind our driver and, as a
 -       * consequence, bind vgacon, we'll get stuck in an infinite loop at
 -       * console_unlock(). So make here we touch the VGA MSR register, making
 -       * sure vgacon can keep working normally without triggering interrupts
 -       * and error messages.
 +       * Based on the document from hardware guys the following bits
 +       * should be set unconditionally in order to enable FBC.
 +       * The bit 22 of 0x42000
 +       * The bit 22 of 0x42004
 +       * The bit 7,8,9 of 0x42020.
         */
 -      vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
 -      outb(inb(VGA_MSR_READ), VGA_MSR_WRITE);
 -      vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
 +      if (IS_IRONLAKE_M(dev)) {
 +              /* WaFbcAsynchFlipDisableFbcQueue:ilk */
 +              I915_WRITE(ILK_DISPLAY_CHICKEN1,
 +                         I915_READ(ILK_DISPLAY_CHICKEN1) |
 +                         ILK_FBCQ_DIS);
 +              I915_WRITE(ILK_DISPLAY_CHICKEN2,
 +                         I915_READ(ILK_DISPLAY_CHICKEN2) |
 +                         ILK_DPARB_GATE);
 +      }
  
 -      if (IS_BROADWELL(dev))
 -              gen8_irq_power_well_post_enable(dev_priv);
 -}
 +      I915_WRITE(ILK_DSPCLK_GATE_D, dspclk_gate);
  
 -static void hsw_set_power_well(struct drm_i915_private *dev_priv,
 -                             struct i915_power_well *power_well, bool enable)
 -{
 -      bool is_enabled, enable_requested;
 -      uint32_t tmp;
 +      I915_WRITE(ILK_DISPLAY_CHICKEN2,
 +                 I915_READ(ILK_DISPLAY_CHICKEN2) |
 +                 ILK_ELPIN_409_SELECT);
 +      I915_WRITE(_3D_CHICKEN2,
 +                 _3D_CHICKEN2_WM_READ_PIPELINED << 16 |
 +                 _3D_CHICKEN2_WM_READ_PIPELINED);
  
 -      tmp = I915_READ(HSW_PWR_WELL_DRIVER);
 -      is_enabled = tmp & HSW_PWR_WELL_STATE_ENABLED;
 -      enable_requested = tmp & HSW_PWR_WELL_ENABLE_REQUEST;
 +      /* WaDisableRenderCachePipelinedFlush:ilk */
 +      I915_WRITE(CACHE_MODE_0,
 +                 _MASKED_BIT_ENABLE(CM0_PIPELINED_RENDER_FLUSH_DISABLE));
  
 -      if (enable) {
 -              if (!enable_requested)
 -                      I915_WRITE(HSW_PWR_WELL_DRIVER,
 -                                 HSW_PWR_WELL_ENABLE_REQUEST);
 +      /* WaDisable_RenderCache_OperationalFlush:ilk */
 +      I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
  
 -              if (!is_enabled) {
 -                      DRM_DEBUG_KMS("Enabling power well\n");
 -                      if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) &
 -                                    HSW_PWR_WELL_STATE_ENABLED), 20))
 -                              DRM_ERROR("Timeout enabling power well\n");
 -              }
 +      g4x_disable_trickle_feed(dev);
  
 -              hsw_power_well_post_enable(dev_priv);
 -      } else {
 -              if (enable_requested) {
 -                      I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
 -                      POSTING_READ(HSW_PWR_WELL_DRIVER);
 -                      DRM_DEBUG_KMS("Requesting to disable the power well\n");
 -              }
 -      }
 +      ibx_init_clock_gating(dev);
  }
  
 -static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv,
 -                                 struct i915_power_well *power_well)
 +static void cpt_init_clock_gating(struct drm_device *dev)
  {
 -      hsw_set_power_well(dev_priv, power_well, power_well->count > 0);
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      int pipe;
 +      uint32_t val;
  
        /*
 -       * We're taking over the BIOS, so clear any requests made by it since
 -       * the driver is in charge now.
 +       * On Ibex Peak and Cougar Point, we need to disable clock
 +       * gating for the panel power sequencer or it will fail to
 +       * start up when no ports are active.
 +       */
 +      I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE |
 +                 PCH_DPLUNIT_CLOCK_GATE_DISABLE |
 +                 PCH_CPUNIT_CLOCK_GATE_DISABLE);
 +      I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) |
 +                 DPLS_EDP_PPS_FIX_DIS);
 +      /* The below fixes the weird display corruption, a few pixels shifted
 +       * downward, on (only) LVDS of some HP laptops with IVY.
         */
 -      if (I915_READ(HSW_PWR_WELL_BIOS) & HSW_PWR_WELL_ENABLE_REQUEST)
 -              I915_WRITE(HSW_PWR_WELL_BIOS, 0);
 +      for_each_pipe(dev_priv, pipe) {
 +              val = I915_READ(TRANS_CHICKEN2(pipe));
 +              val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
 +              val &= ~TRANS_CHICKEN2_FDI_POLARITY_REVERSED;
 +              if (dev_priv->vbt.fdi_rx_polarity_inverted)
 +                      val |= TRANS_CHICKEN2_FDI_POLARITY_REVERSED;
 +              val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK;
 +              val &= ~TRANS_CHICKEN2_DISABLE_DEEP_COLOR_COUNTER;
 +              val &= ~TRANS_CHICKEN2_DISABLE_DEEP_COLOR_MODESWITCH;
 +              I915_WRITE(TRANS_CHICKEN2(pipe), val);
 +      }
 +      /* WADP0ClockGatingDisable */
 +      for_each_pipe(dev_priv, pipe) {
 +              I915_WRITE(TRANS_CHICKEN1(pipe),
 +                         TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);
 +      }
  }
  
 -static void hsw_power_well_enable(struct drm_i915_private *dev_priv,
 -                                struct i915_power_well *power_well)
 +static void gen6_check_mch_setup(struct drm_device *dev)
  {
 -      hsw_set_power_well(dev_priv, power_well, true);
 -}
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      uint32_t tmp;
  
 -static void hsw_power_well_disable(struct drm_i915_private *dev_priv,
 -                                 struct i915_power_well *power_well)
 -{
 -      hsw_set_power_well(dev_priv, power_well, false);
 +      tmp = I915_READ(MCH_SSKPD);
 +      if ((tmp & MCH_SSKPD_WM0_MASK) != MCH_SSKPD_WM0_VAL)
 +              DRM_DEBUG_KMS("Wrong MCH_SSKPD value: 0x%08x This can cause underruns.\n",
 +                            tmp);
  }
  
 -static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv,
 -                                         struct i915_power_well *power_well)
 +static void gen6_init_clock_gating(struct drm_device *dev)
  {
 -}
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      uint32_t dspclk_gate = ILK_VRHUNIT_CLOCK_GATE_DISABLE;
  
 -static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv,
 -                                           struct i915_power_well *power_well)
 -{
 -      return true;
 -}
 +      I915_WRITE(ILK_DSPCLK_GATE_D, dspclk_gate);
  
 -static void vlv_set_power_well(struct drm_i915_private *dev_priv,
 -                             struct i915_power_well *power_well, bool enable)
 -{
 -      enum punit_power_well power_well_id = power_well->data;
 -      u32 mask;
 -      u32 state;
 -      u32 ctrl;
 +      I915_WRITE(ILK_DISPLAY_CHICKEN2,
 +                 I915_READ(ILK_DISPLAY_CHICKEN2) |
 +                 ILK_ELPIN_409_SELECT);
  
 -      mask = PUNIT_PWRGT_MASK(power_well_id);
 -      state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) :
 -                       PUNIT_PWRGT_PWR_GATE(power_well_id);
 +      /* WaDisableHiZPlanesWhenMSAAEnabled:snb */
 +      I915_WRITE(_3D_CHICKEN,
 +                 _MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB));
  
-       /* WaSetupGtModeTdRowDispatch:snb */
-       if (IS_SNB_GT1(dev))
-               I915_WRITE(GEN6_GT_MODE,
-                          _MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE));
 -      mutex_lock(&dev_priv->rps.hw_lock);
 +      /* WaDisable_RenderCache_OperationalFlush:snb */
 +      I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
 +
 +      /*
 +       * BSpec recoomends 8x4 when MSAA is used,
 +       * however in practice 16x4 seems fastest.
 +       *
 +       * Note that PS/WM thread counts depend on the WIZ hashing
 +       * disable bit, which we don't touch here, but it's good
 +       * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM).
 +       */
 +      I915_WRITE(GEN6_GT_MODE,
 +                 GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4);
  
 -#define COND \
 -      ((vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask) == state)
 +      ilk_init_lp_watermarks(dev);
  
 -      if (COND)
 -              goto out;
 +      I915_WRITE(CACHE_MODE_0,
 +                 _MASKED_BIT_DISABLE(CM0_STC_EVICT_DISABLE_LRA_SNB));
 +
 +      I915_WRITE(GEN6_UCGCTL1,
 +                 I915_READ(GEN6_UCGCTL1) |
 +                 GEN6_BLBUNIT_CLOCK_GATE_DISABLE |
 +                 GEN6_CSUNIT_CLOCK_GATE_DISABLE);
  
 -      ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL);
 -      ctrl &= ~mask;
 -      ctrl |= state;
 -      vlv_punit_write(dev_priv, PUNIT_REG_PWRGT_CTRL, ctrl);
 +      /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock
 +       * gating disable must be set.  Failure to set it results in
 +       * flickering pixels due to Z write ordering failures after
 +       * some amount of runtime in the Mesa "fire" demo, and Unigine
 +       * Sanctuary and Tropics, and apparently anything else with
 +       * alpha test or pixel discard.
 +       *
 +       * According to the spec, bit 11 (RCCUNIT) must also be set,
 +       * but we didn't debug actual testcases to find it out.
 +       *
 +       * WaDisableRCCUnitClockGating:snb
 +       * WaDisableRCPBUnitClockGating:snb
 +       */
 +      I915_WRITE(GEN6_UCGCTL2,
 +                 GEN6_RCPBUNIT_CLOCK_GATE_DISABLE |
 +                 GEN6_RCCUNIT_CLOCK_GATE_DISABLE);
  
 -      if (wait_for(COND, 100))
 -              DRM_ERROR("timout setting power well state %08x (%08x)\n",
 -                        state,
 -                        vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL));
 +      /* WaStripsFansDisableFastClipPerformanceFix:snb */
 +      I915_WRITE(_3D_CHICKEN3,
 +                 _MASKED_BIT_ENABLE(_3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL));
  
 -#undef COND
 +      /*
 +       * Bspec says:
 +       * "This bit must be set if 3DSTATE_CLIP clip mode is set to normal and
 +       * 3DSTATE_SF number of SF output attributes is more than 16."
 +       */
 +      I915_WRITE(_3D_CHICKEN3,
 +                 _MASKED_BIT_ENABLE(_3D_CHICKEN3_SF_DISABLE_PIPELINED_ATTR_FETCH));
  
 -out:
 -      mutex_unlock(&dev_priv->rps.hw_lock);
 -}
 +      /*
 +       * According to the spec the following bits should be
 +       * set in order to enable memory self-refresh and fbc:
 +       * The bit21 and bit22 of 0x42000
 +       * The bit21 and bit22 of 0x42004
 +       * The bit5 and bit7 of 0x42020
 +       * The bit14 of 0x70180
 +       * The bit14 of 0x71180
 +       *
 +       * WaFbcAsynchFlipDisableFbcQueue:snb
 +       */
 +      I915_WRITE(ILK_DISPLAY_CHICKEN1,
 +                 I915_READ(ILK_DISPLAY_CHICKEN1) |
 +                 ILK_FBCQ_DIS | ILK_PABSTRETCH_DIS);
 +      I915_WRITE(ILK_DISPLAY_CHICKEN2,
 +                 I915_READ(ILK_DISPLAY_CHICKEN2) |
 +                 ILK_DPARB_GATE | ILK_VSDPFD_FULL);
 +      I915_WRITE(ILK_DSPCLK_GATE_D,
 +                 I915_READ(ILK_DSPCLK_GATE_D) |
 +                 ILK_DPARBUNIT_CLOCK_GATE_ENABLE  |
 +                 ILK_DPFDUNIT_CLOCK_GATE_ENABLE);
  
 -static void vlv_power_well_sync_hw(struct drm_i915_private *dev_priv,
 -                                 struct i915_power_well *power_well)
 -{
 -      vlv_set_power_well(dev_priv, power_well, power_well->count > 0);
 -}
 +      g4x_disable_trickle_feed(dev);
  
 -static void vlv_power_well_enable(struct drm_i915_private *dev_priv,
 -                                struct i915_power_well *power_well)
 -{
 -      vlv_set_power_well(dev_priv, power_well, true);
 -}
 +      cpt_init_clock_gating(dev);
  
 -static void vlv_power_well_disable(struct drm_i915_private *dev_priv,
 -                                 struct i915_power_well *power_well)
 -{
 -      vlv_set_power_well(dev_priv, power_well, false);
 +      gen6_check_mch_setup(dev);
  }
  
 -static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv,
 -                                 struct i915_power_well *power_well)
 +static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv)
  {
 -      int power_well_id = power_well->data;
 -      bool enabled = false;
 -      u32 mask;
 -      u32 state;
 -      u32 ctrl;
 -
 -      mask = PUNIT_PWRGT_MASK(power_well_id);
 -      ctrl = PUNIT_PWRGT_PWR_ON(power_well_id);
 -
 -      mutex_lock(&dev_priv->rps.hw_lock);
 -
 -      state = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask;
 -      /*
 -       * We only ever set the power-on and power-gate states, anything
 -       * else is unexpected.
 -       */
 -      WARN_ON(state != PUNIT_PWRGT_PWR_ON(power_well_id) &&
 -              state != PUNIT_PWRGT_PWR_GATE(power_well_id));
 -      if (state == ctrl)
 -              enabled = true;
 +      uint32_t reg = I915_READ(GEN7_FF_THREAD_MODE);
  
        /*
 -       * A transient state at this point would mean some unexpected party
 -       * is poking at the power controls too.
 +       * WaVSThreadDispatchOverride:ivb,vlv
 +       *
 +       * This actually overrides the dispatch
 +       * mode for all thread types.
         */
 -      ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL) & mask;
 -      WARN_ON(ctrl != state);
 -
 -      mutex_unlock(&dev_priv->rps.hw_lock);
 +      reg &= ~GEN7_FF_SCHED_MASK;
 +      reg |= GEN7_FF_TS_SCHED_HW;
 +      reg |= GEN7_FF_VS_SCHED_HW;
 +      reg |= GEN7_FF_DS_SCHED_HW;
  
 -      return enabled;
 +      I915_WRITE(GEN7_FF_THREAD_MODE, reg);
  }
  
 -static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv,
 -                                        struct i915_power_well *power_well)
 +static void lpt_init_clock_gating(struct drm_device *dev)
  {
 -      WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D);
 -
 -      vlv_set_power_well(dev_priv, power_well, true);
 -
 -      spin_lock_irq(&dev_priv->irq_lock);
 -      valleyview_enable_display_irqs(dev_priv);
 -      spin_unlock_irq(&dev_priv->irq_lock);
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
        /*
 -       * During driver initialization/resume we can avoid restoring the
 -       * part of the HW/SW state that will be inited anyway explicitly.
 +       * TODO: this bit should only be enabled when really needed, then
 +       * disabled when not needed anymore in order to save power.
         */
 -      if (dev_priv->power_domains.initializing)
 -              return;
 -
 -      intel_hpd_init(dev_priv->dev);
 -
 -      i915_redisable_vga_power_on(dev_priv->dev);
 -}
 -
 -static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv,
 -                                         struct i915_power_well *power_well)
 -{
 -      WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D);
 -
 -      spin_lock_irq(&dev_priv->irq_lock);
 -      valleyview_disable_display_irqs(dev_priv);
 -      spin_unlock_irq(&dev_priv->irq_lock);
 -
 -      vlv_set_power_well(dev_priv, power_well, false);
 +      if (dev_priv->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE)
 +              I915_WRITE(SOUTH_DSPCLK_GATE_D,
 +                         I915_READ(SOUTH_DSPCLK_GATE_D) |
 +                         PCH_LP_PARTITION_LEVEL_DISABLE);
  
 -      vlv_power_sequencer_reset(dev_priv);
 +      /* WADPOClockGatingDisable:hsw */
 +      I915_WRITE(_TRANSA_CHICKEN1,
 +                 I915_READ(_TRANSA_CHICKEN1) |
 +                 TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);
  }
  
 -static void vlv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
 -                                         struct i915_power_well *power_well)
 +static void lpt_suspend_hw(struct drm_device *dev)
  {
 -      WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC);
 -
 -      /*
 -       * Enable the CRI clock source so we can get at the
 -       * display and the reference clock for VGA
 -       * hotplug / manual detection.
 -       */
 -      I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
 -                 DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV);
 -      udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      vlv_set_power_well(dev_priv, power_well, true);
 +      if (dev_priv->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) {
 +              uint32_t val = I915_READ(SOUTH_DSPCLK_GATE_D);
  
 -      /*
 -       * From VLV2A0_DP_eDP_DPIO_driver_vbios_notes_10.docx -
 -       *  6.  De-assert cmn_reset/side_reset. Same as VLV X0.
 -       *   a. GUnit 0x2110 bit[0] set to 1 (def 0)
 -       *   b. The other bits such as sfr settings / modesel may all
 -       *      be set to 0.
 -       *
 -       * This should only be done on init and resume from S3 with
 -       * both PLLs disabled, or we risk losing DPIO and PLL
 -       * synchronization.
 -       */
 -      I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) | DPIO_CMNRST);
 +              val &= ~PCH_LP_PARTITION_LEVEL_DISABLE;
 +              I915_WRITE(SOUTH_DSPCLK_GATE_D, val);
 +      }
  }
  
 -static void vlv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
 -                                          struct i915_power_well *power_well)
 +static void broadwell_init_clock_gating(struct drm_device *dev)
  {
 +      struct drm_i915_private *dev_priv = dev->dev_private;
        enum pipe pipe;
  
 -      WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC);
 -
 -      for_each_pipe(dev_priv, pipe)
 -              assert_pll_disabled(dev_priv, pipe);
 +      I915_WRITE(WM3_LP_ILK, 0);
 +      I915_WRITE(WM2_LP_ILK, 0);
 +      I915_WRITE(WM1_LP_ILK, 0);
  
 -      /* Assert common reset */
 -      I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) & ~DPIO_CMNRST);
 +      /* WaSwitchSolVfFArbitrationPriority:bdw */
 +      I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
  
 -      vlv_set_power_well(dev_priv, power_well, false);
 -}
 +      /* WaPsrDPAMaskVBlankInSRD:bdw */
 +      I915_WRITE(CHICKEN_PAR1_1,
 +                 I915_READ(CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD);
  
 -static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
 -                                         struct i915_power_well *power_well)
 -{
 -      enum dpio_phy phy;
 +      /* WaPsrDPRSUnmaskVBlankInSRD:bdw */
 +      for_each_pipe(dev_priv, pipe) {
 +              I915_WRITE(CHICKEN_PIPESL_1(pipe),
 +                         I915_READ(CHICKEN_PIPESL_1(pipe)) |
 +                         BDW_DPRS_MASK_VBLANK_SRD);
 +      }
  
 -      WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC &&
 -                   power_well->data != PUNIT_POWER_WELL_DPIO_CMN_D);
 +      /* WaVSRefCountFullforceMissDisable:bdw */
 +      /* WaDSRefCountFullforceMissDisable:bdw */
 +      I915_WRITE(GEN7_FF_THREAD_MODE,
 +                 I915_READ(GEN7_FF_THREAD_MODE) &
 +                 ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME));
  
 -      /*
 -       * Enable the CRI clock source so we can get at the
 -       * display and the reference clock for VGA
 -       * hotplug / manual detection.
 -       */
 -      if (power_well->data == PUNIT_POWER_WELL_DPIO_CMN_BC) {
 -              phy = DPIO_PHY0;
 -              I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
 -                         DPLL_REFA_CLK_ENABLE_VLV);
 -              I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
 -                         DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV);
 -      } else {
 -              phy = DPIO_PHY1;
 -              I915_WRITE(DPLL(PIPE_C), I915_READ(DPLL(PIPE_C)) |
 -                         DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV);
 -      }
 -      udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
 -      vlv_set_power_well(dev_priv, power_well, true);
 +      I915_WRITE(GEN6_RC_SLEEP_PSMI_CONTROL,
 +                 _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));
  
 -      /* Poll for phypwrgood signal */
 -      if (wait_for(I915_READ(DISPLAY_PHY_STATUS) & PHY_POWERGOOD(phy), 1))
 -              DRM_ERROR("Display PHY %d is not power up\n", phy);
 +      /* WaDisableSDEUnitClockGating:bdw */
 +      I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
 +                 GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
 -      I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) |
 -                 PHY_COM_LANE_RESET_DEASSERT(phy));
 +      lpt_init_clock_gating(dev);
  }
  
 -static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
 -                                          struct i915_power_well *power_well)
 +static void haswell_init_clock_gating(struct drm_device *dev)
  {
 -      enum dpio_phy phy;
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC &&
 -                   power_well->data != PUNIT_POWER_WELL_DPIO_CMN_D);
 +      ilk_init_lp_watermarks(dev);
  
 -      if (power_well->data == PUNIT_POWER_WELL_DPIO_CMN_BC) {
 -              phy = DPIO_PHY0;
 -              assert_pll_disabled(dev_priv, PIPE_A);
 -              assert_pll_disabled(dev_priv, PIPE_B);
 -      } else {
 -              phy = DPIO_PHY1;
 -              assert_pll_disabled(dev_priv, PIPE_C);
 -      }
 +      /* L3 caching of data atomics doesn't work -- disable it. */
 +      I915_WRITE(HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE);
 +      I915_WRITE(HSW_ROW_CHICKEN3,
 +                 _MASKED_BIT_ENABLE(HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE));
  
 -      I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) &
 -                 ~PHY_COM_LANE_RESET_DEASSERT(phy));
 +      /* This is required by WaCatErrorRejectionIssue:hsw */
 +      I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
 +                      I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
 +                      GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
 -      vlv_set_power_well(dev_priv, power_well, false);
 -}
 +      /* WaVSRefCountFullforceMissDisable:hsw */
 +      I915_WRITE(GEN7_FF_THREAD_MODE,
 +                 I915_READ(GEN7_FF_THREAD_MODE) & ~GEN7_FF_VS_REF_CNT_FFME);
  
 -static bool chv_pipe_power_well_enabled(struct drm_i915_private *dev_priv,
 -                                      struct i915_power_well *power_well)
 -{
 -      enum pipe pipe = power_well->data;
 -      bool enabled;
 -      u32 state, ctrl;
 +      /* WaDisable_RenderCache_OperationalFlush:hsw */
 +      I915_WRITE(CACHE_MODE_0_GEN7, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
  
 -      mutex_lock(&dev_priv->rps.hw_lock);
 +      /* enable HiZ Raw Stall Optimization */
 +      I915_WRITE(CACHE_MODE_0_GEN7,
 +                 _MASKED_BIT_DISABLE(HIZ_RAW_STALL_OPT_DISABLE));
  
 -      state = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSS_MASK(pipe);
 -      /*
 -       * We only ever set the power-on and power-gate states, anything
 -       * else is unexpected.
 -       */
 -      WARN_ON(state != DP_SSS_PWR_ON(pipe) && state != DP_SSS_PWR_GATE(pipe));
 -      enabled = state == DP_SSS_PWR_ON(pipe);
 +      /* WaDisable4x2SubspanOptimization:hsw */
 +      I915_WRITE(CACHE_MODE_1,
 +                 _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE));
  
        /*
 -       * A transient state at this point would mean some unexpected party
 -       * is poking at the power controls too.
 +       * BSpec recommends 8x4 when MSAA is used,
 +       * however in practice 16x4 seems fastest.
 +       *
 +       * Note that PS/WM thread counts depend on the WIZ hashing
 +       * disable bit, which we don't touch here, but it's good
 +       * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM).
         */
 -      ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSC_MASK(pipe);
 -      WARN_ON(ctrl << 16 != state);
 -
 -      mutex_unlock(&dev_priv->rps.hw_lock);
 -
 -      return enabled;
 -}
 -
 -static void chv_set_pipe_power_well(struct drm_i915_private *dev_priv,
 -                                  struct i915_power_well *power_well,
 -                                  bool enable)
 -{
 -      enum pipe pipe = power_well->data;
 -      u32 state;
 -      u32 ctrl;
 -
 -      state = enable ? DP_SSS_PWR_ON(pipe) : DP_SSS_PWR_GATE(pipe);
 -
 -      mutex_lock(&dev_priv->rps.hw_lock);
 -
 -#define COND \
 -      ((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSS_MASK(pipe)) == state)
 -
 -      if (COND)
 -              goto out;
 -
 -      ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
 -      ctrl &= ~DP_SSC_MASK(pipe);
 -      ctrl |= enable ? DP_SSC_PWR_ON(pipe) : DP_SSC_PWR_GATE(pipe);
 -      vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, ctrl);
 +      I915_WRITE(GEN7_GT_MODE,
 +                 GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4);
  
 -      if (wait_for(COND, 100))
 -              DRM_ERROR("timout setting power well state %08x (%08x)\n",
 -                        state,
 -                        vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ));
 +      /* WaSwitchSolVfFArbitrationPriority:hsw */
 +      I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
  
 -#undef COND
 +      /* WaRsPkgCStateDisplayPMReq:hsw */
 +      I915_WRITE(CHICKEN_PAR1_1,
 +                 I915_READ(CHICKEN_PAR1_1) | FORCE_ARB_IDLE_PLANES);
  
 -out:
 -      mutex_unlock(&dev_priv->rps.hw_lock);
 +      lpt_init_clock_gating(dev);
  }
  
 -static void chv_pipe_power_well_sync_hw(struct drm_i915_private *dev_priv,
 -                                      struct i915_power_well *power_well)
 +static void ivybridge_init_clock_gating(struct drm_device *dev)
  {
 -      chv_set_pipe_power_well(dev_priv, power_well, power_well->count > 0);
 -}
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      uint32_t snpcr;
  
 -static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv,
 -                                     struct i915_power_well *power_well)
 -{
 -      WARN_ON_ONCE(power_well->data != PIPE_A &&
 -                   power_well->data != PIPE_B &&
 -                   power_well->data != PIPE_C);
 +      ilk_init_lp_watermarks(dev);
  
 -      chv_set_pipe_power_well(dev_priv, power_well, true);
 -}
 +      I915_WRITE(ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);
  
 -static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv,
 -                                      struct i915_power_well *power_well)
 -{
 -      WARN_ON_ONCE(power_well->data != PIPE_A &&
 -                   power_well->data != PIPE_B &&
 -                   power_well->data != PIPE_C);
 +      /* WaDisableEarlyCull:ivb */
 +      I915_WRITE(_3D_CHICKEN3,
 +                 _MASKED_BIT_ENABLE(_3D_CHICKEN_SF_DISABLE_OBJEND_CULL));
  
 -      chv_set_pipe_power_well(dev_priv, power_well, false);
 -}
 +      /* WaDisableBackToBackFlipFix:ivb */
 +      I915_WRITE(IVB_CHICKEN3,
 +                 CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE |
 +                 CHICKEN3_DGMG_DONE_FIX_DISABLE);
  
 -static void check_power_well_state(struct drm_i915_private *dev_priv,
 -                                 struct i915_power_well *power_well)
 -{
 -      bool enabled = power_well->ops->is_enabled(dev_priv, power_well);
 +      /* WaDisablePSDDualDispatchEnable:ivb */
 +      if (IS_IVB_GT1(dev))
 +              I915_WRITE(GEN7_HALF_SLICE_CHICKEN1,
 +                         _MASKED_BIT_ENABLE(GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE));
  
 -      if (power_well->always_on || !i915.disable_power_well) {
 -              if (!enabled)
 -                      goto mismatch;
 +      /* WaDisable_RenderCache_OperationalFlush:ivb */
 +      I915_WRITE(CACHE_MODE_0_GEN7, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
  
 -              return;
 +      /* Apply the WaDisableRHWOOptimizationForRenderHang:ivb workaround. */
 +      I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1,
 +                 GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC);
 +
 +      /* WaApplyL3ControlAndL3ChickenMode:ivb */
 +      I915_WRITE(GEN7_L3CNTLREG1,
 +                      GEN7_WA_FOR_GEN7_L3_CONTROL);
 +      I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER,
 +                 GEN7_WA_L3_CHICKEN_MODE);
 +      if (IS_IVB_GT1(dev))
 +              I915_WRITE(GEN7_ROW_CHICKEN2,
 +                         _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
 +      else {
 +              /* must write both registers */
 +              I915_WRITE(GEN7_ROW_CHICKEN2,
 +                         _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
 +              I915_WRITE(GEN7_ROW_CHICKEN2_GT2,
 +                         _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
        }
  
 -      if (enabled != (power_well->count > 0))
 -              goto mismatch;
 +      /* WaForceL3Serialization:ivb */
 +      I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) &
 +                 ~L3SQ_URB_READ_CAM_MATCH_DISABLE);
  
 -      return;
 +      /*
 +       * According to the spec, bit 13 (RCZUNIT) must be set on IVB.
 +       * This implements the WaDisableRCZUnitClockGating:ivb workaround.
 +       */
 +      I915_WRITE(GEN6_UCGCTL2,
 +                 GEN6_RCZUNIT_CLOCK_GATE_DISABLE);
  
 -mismatch:
 -      WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n",
 -                power_well->name, power_well->always_on, enabled,
 -                power_well->count, i915.disable_power_well);
 -}
 +      /* This is required by WaCatErrorRejectionIssue:ivb */
 +      I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
 +                      I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
 +                      GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
 -void intel_display_power_get(struct drm_i915_private *dev_priv,
 -                           enum intel_display_power_domain domain)
 -{
 -      struct i915_power_domains *power_domains;
 -      struct i915_power_well *power_well;
 -      int i;
 +      g4x_disable_trickle_feed(dev);
  
 -      intel_runtime_pm_get(dev_priv);
 +      gen7_setup_fixed_func_scheduler(dev_priv);
  
 -      power_domains = &dev_priv->power_domains;
 +      if (0) { /* causes HiZ corruption on ivb:gt1 */
 +              /* enable HiZ Raw Stall Optimization */
 +              I915_WRITE(CACHE_MODE_0_GEN7,
 +                         _MASKED_BIT_DISABLE(HIZ_RAW_STALL_OPT_DISABLE));
 +      }
  
 -      mutex_lock(&power_domains->lock);
 +      /* WaDisable4x2SubspanOptimization:ivb */
 +      I915_WRITE(CACHE_MODE_1,
 +                 _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE));
  
 -      for_each_power_well(i, power_well, BIT(domain), power_domains) {
 -              if (!power_well->count++) {
 -                      DRM_DEBUG_KMS("enabling %s\n", power_well->name);
 -                      power_well->ops->enable(dev_priv, power_well);
 -                      power_well->hw_enabled = true;
 -              }
 +      /*
 +       * BSpec recommends 8x4 when MSAA is used,
 +       * however in practice 16x4 seems fastest.
 +       *
 +       * Note that PS/WM thread counts depend on the WIZ hashing
 +       * disable bit, which we don't touch here, but it's good
 +       * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM).
 +       */
 +      I915_WRITE(GEN7_GT_MODE,
 +                 GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4);
  
 -              check_power_well_state(dev_priv, power_well);
 -      }
 +      snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
 +      snpcr &= ~GEN6_MBC_SNPCR_MASK;
 +      snpcr |= GEN6_MBC_SNPCR_MED;
 +      I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
  
 -      power_domains->domain_use_count[domain]++;
 +      if (!HAS_PCH_NOP(dev))
 +              cpt_init_clock_gating(dev);
  
 -      mutex_unlock(&power_domains->lock);
 +      gen6_check_mch_setup(dev);
  }
  
 -void intel_display_power_put(struct drm_i915_private *dev_priv,
 -                           enum intel_display_power_domain domain)
 +static void valleyview_init_clock_gating(struct drm_device *dev)
  {
 -      struct i915_power_domains *power_domains;
 -      struct i915_power_well *power_well;
 -      int i;
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      power_domains = &dev_priv->power_domains;
 +      I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
  
 -      mutex_lock(&power_domains->lock);
 +      /* WaDisableEarlyCull:vlv */
 +      I915_WRITE(_3D_CHICKEN3,
 +                 _MASKED_BIT_ENABLE(_3D_CHICKEN_SF_DISABLE_OBJEND_CULL));
  
 -      WARN_ON(!power_domains->domain_use_count[domain]);
 -      power_domains->domain_use_count[domain]--;
 +      /* WaDisableBackToBackFlipFix:vlv */
 +      I915_WRITE(IVB_CHICKEN3,
 +                 CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE |
 +                 CHICKEN3_DGMG_DONE_FIX_DISABLE);
  
 -      for_each_power_well_rev(i, power_well, BIT(domain), power_domains) {
 -              WARN_ON(!power_well->count);
 +      /* WaPsdDispatchEnable:vlv */
 +      /* WaDisablePSDDualDispatchEnable:vlv */
 +      I915_WRITE(GEN7_HALF_SLICE_CHICKEN1,
 +                 _MASKED_BIT_ENABLE(GEN7_MAX_PS_THREAD_DEP |
 +                                    GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE));
  
 -              if (!--power_well->count && i915.disable_power_well) {
 -                      DRM_DEBUG_KMS("disabling %s\n", power_well->name);
 -                      power_well->hw_enabled = false;
 -                      power_well->ops->disable(dev_priv, power_well);
 -              }
 +      /* WaDisable_RenderCache_OperationalFlush:vlv */
 +      I915_WRITE(CACHE_MODE_0_GEN7, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
  
 -              check_power_well_state(dev_priv, power_well);
 -      }
 +      /* WaForceL3Serialization:vlv */
 +      I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) &
 +                 ~L3SQ_URB_READ_CAM_MATCH_DISABLE);
  
 -      mutex_unlock(&power_domains->lock);
 +      /* WaDisableDopClockGating:vlv */
 +      I915_WRITE(GEN7_ROW_CHICKEN2,
 +                 _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
  
 -      intel_runtime_pm_put(dev_priv);
 -}
 +      /* This is required by WaCatErrorRejectionIssue:vlv */
 +      I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
 +                 I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
 +                 GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
 -static struct i915_power_domains *hsw_pwr;
 +      gen7_setup_fixed_func_scheduler(dev_priv);
  
 -/* Display audio driver power well request */
 -int i915_request_power_well(void)
 -{
 -      struct drm_i915_private *dev_priv;
 +      /*
 +       * According to the spec, bit 13 (RCZUNIT) must be set on IVB.
 +       * This implements the WaDisableRCZUnitClockGating:vlv workaround.
 +       */
 +      I915_WRITE(GEN6_UCGCTL2,
 +                 GEN6_RCZUNIT_CLOCK_GATE_DISABLE);
  
 -      if (!hsw_pwr)
 -              return -ENODEV;
 +      /* WaDisableL3Bank2xClockGate:vlv
 +       * Disabling L3 clock gating- MMIO 940c[25] = 1
 +       * Set bit 25, to disable L3_BANK_2x_CLK_GATING */
 +      I915_WRITE(GEN7_UCGCTL4,
 +                 I915_READ(GEN7_UCGCTL4) | GEN7_L3BANK2X_CLOCK_GATE_DISABLE);
  
 -      dev_priv = container_of(hsw_pwr, struct drm_i915_private,
 -                              power_domains);
 -      intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
 -      return 0;
 -}
 -EXPORT_SYMBOL_GPL(i915_request_power_well);
 +      I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);
  
 -/* Display audio driver power well release */
 -int i915_release_power_well(void)
 -{
 -      struct drm_i915_private *dev_priv;
 +      /*
 +       * BSpec says this must be set, even though
 +       * WaDisable4x2SubspanOptimization isn't listed for VLV.
 +       */
 +      I915_WRITE(CACHE_MODE_1,
 +                 _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE));
  
 -      if (!hsw_pwr)
 -              return -ENODEV;
 +      /*
 +       * WaIncreaseL3CreditsForVLVB0:vlv
 +       * This is the hardware default actually.
 +       */
 +      I915_WRITE(GEN7_L3SQCREG1, VLV_B0_WA_L3SQCREG1_VALUE);
  
 -      dev_priv = container_of(hsw_pwr, struct drm_i915_private,
 -                              power_domains);
 -      intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
 -      return 0;
 +      /*
 +       * WaDisableVLVClockGating_VBIIssue:vlv
 +       * Disable clock gating on th GCFG unit to prevent a delay
 +       * in the reporting of vblank events.
 +       */
 +      I915_WRITE(VLV_GUNIT_CLOCK_GATE, GCFG_DIS);
  }
 -EXPORT_SYMBOL_GPL(i915_release_power_well);
  
 -/*
 - * Private interface for the audio driver to get CDCLK in kHz.
 - *
 - * Caller must request power well using i915_request_power_well() prior to
 - * making the call.
 - */
 -int i915_get_cdclk_freq(void)
 +static void cherryview_init_clock_gating(struct drm_device *dev)
  {
 -      struct drm_i915_private *dev_priv;
 -
 -      if (!hsw_pwr)
 -              return -ENODEV;
 -
 -      dev_priv = container_of(hsw_pwr, struct drm_i915_private,
 -                              power_domains);
 -
 -      return intel_ddi_get_cdclk_freq(dev_priv);
 -}
 -EXPORT_SYMBOL_GPL(i915_get_cdclk_freq);
 -
 -
 -#define POWER_DOMAIN_MASK (BIT(POWER_DOMAIN_NUM) - 1)
 -
 -#define HSW_ALWAYS_ON_POWER_DOMAINS (                 \
 -      BIT(POWER_DOMAIN_PIPE_A) |                      \
 -      BIT(POWER_DOMAIN_TRANSCODER_EDP) |              \
 -      BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |          \
 -      BIT(POWER_DOMAIN_PORT_CRT) |                    \
 -      BIT(POWER_DOMAIN_PLLS) |                        \
 -      BIT(POWER_DOMAIN_INIT))
 -#define HSW_DISPLAY_POWER_DOMAINS (                           \
 -      (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) |    \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define BDW_ALWAYS_ON_POWER_DOMAINS (                 \
 -      HSW_ALWAYS_ON_POWER_DOMAINS |                   \
 -      BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER))
 -#define BDW_DISPLAY_POWER_DOMAINS (                           \
 -      (POWER_DOMAIN_MASK & ~BDW_ALWAYS_ON_POWER_DOMAINS) |    \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define VLV_ALWAYS_ON_POWER_DOMAINS   BIT(POWER_DOMAIN_INIT)
 -#define VLV_DISPLAY_POWER_DOMAINS     POWER_DOMAIN_MASK
 -
 -#define VLV_DPIO_CMN_BC_POWER_DOMAINS (               \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_CRT) |            \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS (        \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS (        \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS (        \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS (        \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define CHV_PIPE_A_POWER_DOMAINS (    \
 -      BIT(POWER_DOMAIN_PIPE_A) |      \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define CHV_PIPE_B_POWER_DOMAINS (    \
 -      BIT(POWER_DOMAIN_PIPE_B) |      \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define CHV_PIPE_C_POWER_DOMAINS (    \
 -      BIT(POWER_DOMAIN_PIPE_C) |      \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define CHV_DPIO_CMN_BC_POWER_DOMAINS (               \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define CHV_DPIO_CMN_D_POWER_DOMAINS (                \
 -      BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS (        \
 -      BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) |  \
 -      BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -#define CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS (        \
 -      BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |  \
 -      BIT(POWER_DOMAIN_INIT))
 -
 -static const struct i915_power_well_ops i9xx_always_on_power_well_ops = {
 -      .sync_hw = i9xx_always_on_power_well_noop,
 -      .enable = i9xx_always_on_power_well_noop,
 -      .disable = i9xx_always_on_power_well_noop,
 -      .is_enabled = i9xx_always_on_power_well_enabled,
 -};
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -static const struct i915_power_well_ops chv_pipe_power_well_ops = {
 -      .sync_hw = chv_pipe_power_well_sync_hw,
 -      .enable = chv_pipe_power_well_enable,
 -      .disable = chv_pipe_power_well_disable,
 -      .is_enabled = chv_pipe_power_well_enabled,
 -};
 +      I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
  
 -static const struct i915_power_well_ops chv_dpio_cmn_power_well_ops = {
 -      .sync_hw = vlv_power_well_sync_hw,
 -      .enable = chv_dpio_cmn_power_well_enable,
 -      .disable = chv_dpio_cmn_power_well_disable,
 -      .is_enabled = vlv_power_well_enabled,
 -};
 +      I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);
  
 -static struct i915_power_well i9xx_always_on_power_well[] = {
 -      {
 -              .name = "always-on",
 -              .always_on = 1,
 -              .domains = POWER_DOMAIN_MASK,
 -              .ops = &i9xx_always_on_power_well_ops,
 -      },
 -};
 +      /* WaVSRefCountFullforceMissDisable:chv */
 +      /* WaDSRefCountFullforceMissDisable:chv */
 +      I915_WRITE(GEN7_FF_THREAD_MODE,
 +                 I915_READ(GEN7_FF_THREAD_MODE) &
 +                 ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME));
  
 -static const struct i915_power_well_ops hsw_power_well_ops = {
 -      .sync_hw = hsw_power_well_sync_hw,
 -      .enable = hsw_power_well_enable,
 -      .disable = hsw_power_well_disable,
 -      .is_enabled = hsw_power_well_enabled,
 -};
 +      /* WaDisableSemaphoreAndSyncFlipWait:chv */
 +      I915_WRITE(GEN6_RC_SLEEP_PSMI_CONTROL,
 +                 _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));
  
 -static struct i915_power_well hsw_power_wells[] = {
 -      {
 -              .name = "always-on",
 -              .always_on = 1,
 -              .domains = HSW_ALWAYS_ON_POWER_DOMAINS,
 -              .ops = &i9xx_always_on_power_well_ops,
 -      },
 -      {
 -              .name = "display",
 -              .domains = HSW_DISPLAY_POWER_DOMAINS,
 -              .ops = &hsw_power_well_ops,
 -      },
 -};
 +      /* WaDisableCSUnitClockGating:chv */
 +      I915_WRITE(GEN6_UCGCTL1, I915_READ(GEN6_UCGCTL1) |
 +                 GEN6_CSUNIT_CLOCK_GATE_DISABLE);
  
 -static struct i915_power_well bdw_power_wells[] = {
 -      {
 -              .name = "always-on",
 -              .always_on = 1,
 -              .domains = BDW_ALWAYS_ON_POWER_DOMAINS,
 -              .ops = &i9xx_always_on_power_well_ops,
 -      },
 -      {
 -              .name = "display",
 -              .domains = BDW_DISPLAY_POWER_DOMAINS,
 -              .ops = &hsw_power_well_ops,
 -      },
 -};
 +      /* WaDisableSDEUnitClockGating:chv */
 +      I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
 +                 GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
 -static const struct i915_power_well_ops vlv_display_power_well_ops = {
 -      .sync_hw = vlv_power_well_sync_hw,
 -      .enable = vlv_display_power_well_enable,
 -      .disable = vlv_display_power_well_disable,
 -      .is_enabled = vlv_power_well_enabled,
 -};
 +      /* WaDisableGunitClockGating:chv (pre-production hw) */
 +      I915_WRITE(VLV_GUNIT_CLOCK_GATE, I915_READ(VLV_GUNIT_CLOCK_GATE) |
 +                 GINT_DIS);
  
 -static const struct i915_power_well_ops vlv_dpio_cmn_power_well_ops = {
 -      .sync_hw = vlv_power_well_sync_hw,
 -      .enable = vlv_dpio_cmn_power_well_enable,
 -      .disable = vlv_dpio_cmn_power_well_disable,
 -      .is_enabled = vlv_power_well_enabled,
 -};
 +      /* WaDisableFfDopClockGating:chv (pre-production hw) */
 +      I915_WRITE(GEN6_RC_SLEEP_PSMI_CONTROL,
 +                 _MASKED_BIT_ENABLE(GEN8_FF_DOP_CLOCK_GATE_DISABLE));
  
 -static const struct i915_power_well_ops vlv_dpio_power_well_ops = {
 -      .sync_hw = vlv_power_well_sync_hw,
 -      .enable = vlv_power_well_enable,
 -      .disable = vlv_power_well_disable,
 -      .is_enabled = vlv_power_well_enabled,
 -};
 +      /* WaDisableDopClockGating:chv (pre-production hw) */
 +      I915_WRITE(GEN6_UCGCTL1, I915_READ(GEN6_UCGCTL1) |
 +                 GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE);
 +}
  
 -static struct i915_power_well vlv_power_wells[] = {
 -      {
 -              .name = "always-on",
 -              .always_on = 1,
 -              .domains = VLV_ALWAYS_ON_POWER_DOMAINS,
 -              .ops = &i9xx_always_on_power_well_ops,
 -      },
 -      {
 -              .name = "display",
 -              .domains = VLV_DISPLAY_POWER_DOMAINS,
 -              .data = PUNIT_POWER_WELL_DISP2D,
 -              .ops = &vlv_display_power_well_ops,
 -      },
 -      {
 -              .name = "dpio-tx-b-01",
 -              .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01,
 -      },
 -      {
 -              .name = "dpio-tx-b-23",
 -              .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23,
 -      },
 -      {
 -              .name = "dpio-tx-c-01",
 -              .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01,
 -      },
 -      {
 -              .name = "dpio-tx-c-23",
 -              .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23,
 -      },
 -      {
 -              .name = "dpio-common",
 -              .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
 -              .data = PUNIT_POWER_WELL_DPIO_CMN_BC,
 -              .ops = &vlv_dpio_cmn_power_well_ops,
 -      },
 -};
 +static void g4x_init_clock_gating(struct drm_device *dev)
 +{
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      uint32_t dspclk_gate;
  
 -static struct i915_power_well chv_power_wells[] = {
 -      {
 -              .name = "always-on",
 -              .always_on = 1,
 -              .domains = VLV_ALWAYS_ON_POWER_DOMAINS,
 -              .ops = &i9xx_always_on_power_well_ops,
 -      },
 -#if 0
 -      {
 -              .name = "display",
 -              .domains = VLV_DISPLAY_POWER_DOMAINS,
 -              .data = PUNIT_POWER_WELL_DISP2D,
 -              .ops = &vlv_display_power_well_ops,
 -      },
 -      {
 -              .name = "pipe-a",
 -              .domains = CHV_PIPE_A_POWER_DOMAINS,
 -              .data = PIPE_A,
 -              .ops = &chv_pipe_power_well_ops,
 -      },
 -      {
 -              .name = "pipe-b",
 -              .domains = CHV_PIPE_B_POWER_DOMAINS,
 -              .data = PIPE_B,
 -              .ops = &chv_pipe_power_well_ops,
 -      },
 -      {
 -              .name = "pipe-c",
 -              .domains = CHV_PIPE_C_POWER_DOMAINS,
 -              .data = PIPE_C,
 -              .ops = &chv_pipe_power_well_ops,
 -      },
 -#endif
 -      {
 -              .name = "dpio-common-bc",
 -              /*
 -               * XXX: cmnreset for one PHY seems to disturb the other.
 -               * As a workaround keep both powered on at the same
 -               * time for now.
 -               */
 -              .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | CHV_DPIO_CMN_D_POWER_DOMAINS,
 -              .data = PUNIT_POWER_WELL_DPIO_CMN_BC,
 -              .ops = &chv_dpio_cmn_power_well_ops,
 -      },
 -      {
 -              .name = "dpio-common-d",
 -              /*
 -               * XXX: cmnreset for one PHY seems to disturb the other.
 -               * As a workaround keep both powered on at the same
 -               * time for now.
 -               */
 -              .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | CHV_DPIO_CMN_D_POWER_DOMAINS,
 -              .data = PUNIT_POWER_WELL_DPIO_CMN_D,
 -              .ops = &chv_dpio_cmn_power_well_ops,
 -      },
 -#if 0
 -      {
 -              .name = "dpio-tx-b-01",
 -              .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01,
 -      },
 -      {
 -              .name = "dpio-tx-b-23",
 -              .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23,
 -      },
 -      {
 -              .name = "dpio-tx-c-01",
 -              .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01,
 -      },
 -      {
 -              .name = "dpio-tx-c-23",
 -              .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
 -                         VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23,
 -      },
 -      {
 -              .name = "dpio-tx-d-01",
 -              .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS |
 -                         CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_01,
 -      },
 -      {
 -              .name = "dpio-tx-d-23",
 -              .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS |
 -                         CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS,
 -              .ops = &vlv_dpio_power_well_ops,
 -              .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_23,
 -      },
 -#endif
 -};
 +      I915_WRITE(RENCLK_GATE_D1, 0);
 +      I915_WRITE(RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE |
 +                 GS_UNIT_CLOCK_GATE_DISABLE |
 +                 CL_UNIT_CLOCK_GATE_DISABLE);
 +      I915_WRITE(RAMCLK_GATE_D, 0);
 +      dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE |
 +              OVRUNIT_CLOCK_GATE_DISABLE |
 +              OVCUNIT_CLOCK_GATE_DISABLE;
 +      if (IS_GM45(dev))
 +              dspclk_gate |= DSSUNIT_CLOCK_GATE_DISABLE;
 +      I915_WRITE(DSPCLK_GATE_D, dspclk_gate);
  
 -static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_priv,
 -                                               enum punit_power_well power_well_id)
 -{
 -      struct i915_power_domains *power_domains = &dev_priv->power_domains;
 -      struct i915_power_well *power_well;
 -      int i;
 +      /* WaDisableRenderCachePipelinedFlush */
 +      I915_WRITE(CACHE_MODE_0,
 +                 _MASKED_BIT_ENABLE(CM0_PIPELINED_RENDER_FLUSH_DISABLE));
  
 -      for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) {
 -              if (power_well->data == power_well_id)
 -                      return power_well;
 -      }
 +      /* WaDisable_RenderCache_OperationalFlush:g4x */
 +      I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
  
 -      return NULL;
 +      g4x_disable_trickle_feed(dev);
  }
  
 -#define set_power_wells(power_domains, __power_wells) ({              \
 -      (power_domains)->power_wells = (__power_wells);                 \
 -      (power_domains)->power_well_count = ARRAY_SIZE(__power_wells);  \
 -})
 -
 -int intel_power_domains_init(struct drm_i915_private *dev_priv)
 +static void crestline_init_clock_gating(struct drm_device *dev)
  {
 -      struct i915_power_domains *power_domains = &dev_priv->power_domains;
 -
 -      mutex_init(&power_domains->lock);
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      /*
 -       * The enabling order will be from lower to higher indexed wells,
 -       * the disabling order is reversed.
 -       */
 -      if (IS_HASWELL(dev_priv->dev)) {
 -              set_power_wells(power_domains, hsw_power_wells);
 -              hsw_pwr = power_domains;
 -      } else if (IS_BROADWELL(dev_priv->dev)) {
 -              set_power_wells(power_domains, bdw_power_wells);
 -              hsw_pwr = power_domains;
 -      } else if (IS_CHERRYVIEW(dev_priv->dev)) {
 -              set_power_wells(power_domains, chv_power_wells);
 -      } else if (IS_VALLEYVIEW(dev_priv->dev)) {
 -              set_power_wells(power_domains, vlv_power_wells);
 -      } else {
 -              set_power_wells(power_domains, i9xx_always_on_power_well);
 -      }
 +      I915_WRITE(RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE);
 +      I915_WRITE(RENCLK_GATE_D2, 0);
 +      I915_WRITE(DSPCLK_GATE_D, 0);
 +      I915_WRITE(RAMCLK_GATE_D, 0);
 +      I915_WRITE16(DEUC, 0);
 +      I915_WRITE(MI_ARB_STATE,
 +                 _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE));
  
 -      return 0;
 +      /* WaDisable_RenderCache_OperationalFlush:gen4 */
 +      I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
  }
  
 -void intel_power_domains_remove(struct drm_i915_private *dev_priv)
 +static void broadwater_init_clock_gating(struct drm_device *dev)
  {
 -      hsw_pwr = NULL;
 -}
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -static void intel_power_domains_resume(struct drm_i915_private *dev_priv)
 -{
 -      struct i915_power_domains *power_domains = &dev_priv->power_domains;
 -      struct i915_power_well *power_well;
 -      int i;
 +      I915_WRITE(RENCLK_GATE_D1, I965_RCZ_CLOCK_GATE_DISABLE |
 +                 I965_RCC_CLOCK_GATE_DISABLE |
 +                 I965_RCPB_CLOCK_GATE_DISABLE |
 +                 I965_ISC_CLOCK_GATE_DISABLE |
 +                 I965_FBC_CLOCK_GATE_DISABLE);
 +      I915_WRITE(RENCLK_GATE_D2, 0);
 +      I915_WRITE(MI_ARB_STATE,
 +                 _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE));
  
 -      mutex_lock(&power_domains->lock);
 -      for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) {
 -              power_well->ops->sync_hw(dev_priv, power_well);
 -              power_well->hw_enabled = power_well->ops->is_enabled(dev_priv,
 -                                                                   power_well);
 -      }
 -      mutex_unlock(&power_domains->lock);
 +      /* WaDisable_RenderCache_OperationalFlush:gen4 */
 +      I915_WRITE(CACHE_MODE_0, _MASKED_BIT_DISABLE(RC_OP_FLUSH_ENABLE));
  }
  
 -static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)
 +static void gen3_init_clock_gating(struct drm_device *dev)
  {
 -      struct i915_power_well *cmn =
 -              lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC);
 -      struct i915_power_well *disp2d =
 -              lookup_power_well(dev_priv, PUNIT_POWER_WELL_DISP2D);
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      u32 dstate = I915_READ(D_STATE);
  
 -      /* nothing to do if common lane is already off */
 -      if (!cmn->ops->is_enabled(dev_priv, cmn))
 -              return;
 +      dstate |= DSTATE_PLL_D3_OFF | DSTATE_GFX_CLOCK_GATING |
 +              DSTATE_DOT_CLOCK_GATING;
 +      I915_WRITE(D_STATE, dstate);
  
 -      /* If the display might be already active skip this */
 -      if (disp2d->ops->is_enabled(dev_priv, disp2d) &&
 -          I915_READ(DPIO_CTL) & DPIO_CMNRST)
 -              return;
 +      if (IS_PINEVIEW(dev))
 +              I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY));
  
 -      DRM_DEBUG_KMS("toggling display PHY side reset\n");
 +      /* IIR "flip pending" means done if this bit is set */
 +      I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));
  
 -      /* cmnlane needs DPLL registers */
 -      disp2d->ops->enable(dev_priv, disp2d);
 +      /* interrupts should cause a wake up from C3 */
 +      I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_AGPBUSY_INT_EN));
  
 -      /*
 -       * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx:
 -       * Need to assert and de-assert PHY SB reset by gating the
 -       * common lane power, then un-gating it.
 -       * Simply ungating isn't enough to reset the PHY enough to get
 -       * ports and lanes running.
 -       */
 -      cmn->ops->disable(dev_priv, cmn);
 +      /* On GEN3 we really need to make sure the ARB C3 LP bit is set */
 +      I915_WRITE(MI_ARB_STATE, _MASKED_BIT_ENABLE(MI_ARB_C3_LP_WRITE_ENABLE));
 +
 +      I915_WRITE(MI_ARB_STATE,
 +                 _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE));
  }
  
 -void intel_power_domains_init_hw(struct drm_i915_private *dev_priv)
 +static void i85x_init_clock_gating(struct drm_device *dev)
  {
 -      struct drm_device *dev = dev_priv->dev;
 -      struct i915_power_domains *power_domains = &dev_priv->power_domains;
 -
 -      power_domains->initializing = true;
 -
 -      if (IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev)) {
 -              mutex_lock(&power_domains->lock);
 -              vlv_cmnlane_wa(dev_priv);
 -              mutex_unlock(&power_domains->lock);
 -      }
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      /* For now, we need the power well to be always enabled. */
 -      intel_display_set_init_power(dev_priv, true);
 -      intel_power_domains_resume(dev_priv);
 -      power_domains->initializing = false;
 -}
 +      I915_WRITE(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
  
 -void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv)
 -{
 -      intel_runtime_pm_get(dev_priv);
 -}
 +      /* interrupts should cause a wake up from C3 */
 +      I915_WRITE(MI_STATE, _MASKED_BIT_ENABLE(MI_AGPBUSY_INT_EN) |
 +                 _MASKED_BIT_DISABLE(MI_AGPBUSY_830_MODE));
  
 -void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv)
 -{
 -      intel_runtime_pm_put(dev_priv);
 +      I915_WRITE(MEM_MODE,
 +                 _MASKED_BIT_ENABLE(MEM_DISPLAY_TRICKLE_FEED_DISABLE));
  }
  
 -void intel_runtime_pm_get(struct drm_i915_private *dev_priv)
 +static void i830_init_clock_gating(struct drm_device *dev)
  {
 -      struct drm_device *dev = dev_priv->dev;
 -      struct device *device = &dev->pdev->dev;
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      if (!HAS_RUNTIME_PM(dev))
 -              return;
 +      I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE);
  
 -      pm_runtime_get_sync(device);
 -      WARN(dev_priv->pm.suspended, "Device still suspended.\n");
 +      I915_WRITE(MEM_MODE,
 +                 _MASKED_BIT_ENABLE(MEM_DISPLAY_A_TRICKLE_FEED_DISABLE) |
 +                 _MASKED_BIT_ENABLE(MEM_DISPLAY_B_TRICKLE_FEED_DISABLE));
  }
  
 -void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv)
 +void intel_init_clock_gating(struct drm_device *dev)
  {
 -      struct drm_device *dev = dev_priv->dev;
 -      struct device *device = &dev->pdev->dev;
 -
 -      if (!HAS_RUNTIME_PM(dev))
 -              return;
 +      struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      WARN(dev_priv->pm.suspended, "Getting nosync-ref while suspended.\n");
 -      pm_runtime_get_noresume(device);
 +      dev_priv->display.init_clock_gating(dev);
  }
  
 -void intel_runtime_pm_put(struct drm_i915_private *dev_priv)
 +void intel_suspend_hw(struct drm_device *dev)
  {
 -      struct drm_device *dev = dev_priv->dev;
 -      struct device *device = &dev->pdev->dev;
 -
 -      if (!HAS_RUNTIME_PM(dev))
 -              return;
 -
 -      pm_runtime_mark_last_busy(device);
 -      pm_runtime_put_autosuspend(device);
 +      if (HAS_PCH_LPT(dev))
 +              lpt_suspend_hw(dev);
  }
  
 -void intel_init_runtime_pm(struct drm_i915_private *dev_priv)
 +static void intel_init_fbc(struct drm_i915_private *dev_priv)
  {
 -      struct drm_device *dev = dev_priv->dev;
 -      struct device *device = &dev->pdev->dev;
 -
 -      if (!HAS_RUNTIME_PM(dev))
 -              return;
 -
 -      pm_runtime_set_active(device);
 -
 -      /*
 -       * RPM depends on RC6 to save restore the GT HW context, so make RC6 a
 -       * requirement.
 -       */
 -      if (!intel_enable_rc6(dev)) {
 -              DRM_INFO("RC6 disabled, disabling runtime PM support\n");
 +      if (!HAS_FBC(dev_priv)) {
 +              dev_priv->fbc.enabled = false;
                return;
        }
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -906,8 -751,7 +906,8 @@@ static void tegra_crtc_disable(struct d
                }
        }
  
-       drm_vblank_off(drm, dc->pipe);
+       drm_crtc_vblank_off(crtc);
 +      tegra_dc_commit(dc);
  }
  
  static bool tegra_crtc_mode_fixup(struct drm_crtc *crtc,
@@@ -1090,9 -934,15 +1090,9 @@@ static void tegra_crtc_prepare(struct d
  static void tegra_crtc_commit(struct drm_crtc *crtc)
  {
        struct tegra_dc *dc = to_tegra_dc(crtc);
 -      unsigned long value;
 -
 -      value = GENERAL_UPDATE | WIN_A_UPDATE;
 -      tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
 -
 -      value = GENERAL_ACT_REQ | WIN_A_ACT_REQ;
 -      tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
  
-       drm_vblank_post_modeset(crtc->dev, dc->pipe);
+       drm_crtc_vblank_on(crtc);
 +      tegra_dc_commit(dc);
  }
  
  static void tegra_crtc_load_lut(struct drm_crtc *crtc)
Simple merge