]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/i915/intel_pm.c
Merge remote-tracking branch 'drm/drm-next'
[karo-tx-linux.git] / drivers / gpu / drm / i915 / intel_pm.c
index 5e91e795fd99493d9909fe40ffd6cfd2c24d1b94..1a741f3697558efc2be44dad3bf4cbbee1fecdf0 100644 (file)
 #define INTEL_RC6p_ENABLE                      (1<<1)
 #define INTEL_RC6pp_ENABLE                     (1<<2)
 
-static void gen9_init_clock_gating(struct drm_device *dev)
-{
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       /* WaEnableLbsSlaRetryTimerDecrement:skl */
-       I915_WRITE(BDW_SCRATCH1, I915_READ(BDW_SCRATCH1) |
-                  GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE);
-
-       /* WaDisableKillLogic:bxt,skl */
-       I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) |
-                  ECOCHK_DIS_TLB);
-}
-
-static void skl_init_clock_gating(struct drm_device *dev)
-{
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       gen9_init_clock_gating(dev);
-
-       if (INTEL_REVID(dev) <= SKL_REVID_B0) {
-               /*
-                * WaDisableSDEUnitClockGating:skl
-                * WaSetGAPSunitClckGateDisable:skl
-                */
-               I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
-                          GEN8_GAPSUNIT_CLOCK_GATE_DISABLE |
-                          GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
-
-               /* WaDisableVFUnitClockGating:skl */
-               I915_WRITE(GEN6_UCGCTL2, I915_READ(GEN6_UCGCTL2) |
-                          GEN6_VFUNIT_CLOCK_GATE_DISABLE);
-       }
-
-       if (INTEL_REVID(dev) <= SKL_REVID_D0) {
-               /* WaDisableHDCInvalidation:skl */
-               I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) |
-                          BDW_DISABLE_HDC_INVALIDATION);
-
-               /* WaDisableChickenBitTSGBarrierAckForFFSliceCS:skl */
-               I915_WRITE(FF_SLICE_CS_CHICKEN2,
-                          _MASKED_BIT_ENABLE(GEN9_TSG_BARRIER_ACK_DISABLE));
-       }
-
-       /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes
-        * involving this register should also be added to WA batch as required.
-        */
-       if (INTEL_REVID(dev) <= SKL_REVID_E0)
-               /* WaDisableLSQCROPERFforOCL:skl */
-               I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) |
-                          GEN8_LQSC_RO_PERF_DIS);
-
-       /* WaEnableGapsTsvCreditFix:skl */
-       if (IS_SKYLAKE(dev) && (INTEL_REVID(dev) >= SKL_REVID_C0)) {
-               I915_WRITE(GEN8_GARBCNTL, (I915_READ(GEN8_GARBCNTL) |
-                                          GEN9_GAPS_TSV_CREDIT_DISABLE));
-       }
-}
-
 static void bxt_init_clock_gating(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       gen9_init_clock_gating(dev);
+       /* WaDisableSDEUnitClockGating:bxt */
+       I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
+                  GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
 
        /*
         * FIXME:
-        * GEN8_SDEUNIT_CLOCK_GATE_DISABLE applies on A0 only.
         * GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ applies on 3x6 GT SKUs only.
         */
-        /* WaDisableSDEUnitClockGating:bxt */
        I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
-                  GEN8_SDEUNIT_CLOCK_GATE_DISABLE |
                   GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ);
-
-       /* FIXME: apply on A0 only */
-       I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_TLBPF);
 }
 
 static void i915_pineview_get_mem_freq(struct drm_device *dev)
@@ -691,12 +629,9 @@ static void pineview_update_wm(struct drm_crtc *unused_crtc)
 
        crtc = single_enabled_crtc(dev);
        if (crtc) {
-               const struct drm_display_mode *adjusted_mode;
+               const struct drm_display_mode *adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
                int pixel_size = crtc->primary->state->fb->bits_per_pixel / 8;
-               int clock;
-
-               adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
-               clock = adjusted_mode->crtc_clock;
+               int clock = adjusted_mode->crtc_clock;
 
                /* Display SR */
                wm = intel_calculate_wm(clock, &pineview_display_wm,
@@ -1490,8 +1425,7 @@ static void i965_update_wm(struct drm_crtc *unused_crtc)
        if (crtc) {
                /* self-refresh has much higher latency */
                static const int sr_latency_ns = 12000;
-               const struct drm_display_mode *adjusted_mode =
-                       &to_intel_crtc(crtc)->config->base.adjusted_mode;
+               const struct drm_display_mode *adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
                int clock = adjusted_mode->crtc_clock;
                int htotal = adjusted_mode->crtc_htotal;
                int hdisplay = to_intel_crtc(crtc)->config->pipe_src_w;
@@ -1638,8 +1572,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
        if (HAS_FW_BLC(dev) && enabled) {
                /* self-refresh has much higher latency */
                static const int sr_latency_ns = 6000;
-               const struct drm_display_mode *adjusted_mode =
-                       &to_intel_crtc(enabled)->config->base.adjusted_mode;
+               const struct drm_display_mode *adjusted_mode = &to_intel_crtc(enabled)->config->base.adjusted_mode;
                int clock = adjusted_mode->crtc_clock;
                int htotal = adjusted_mode->crtc_htotal;
                int hdisplay = to_intel_crtc(enabled)->config->pipe_src_w;
@@ -1780,16 +1713,6 @@ struct skl_pipe_wm_parameters {
        uint32_t pipe_htotal;
        uint32_t pixel_rate; /* in KHz */
        struct intel_plane_wm_parameters plane[I915_MAX_PLANES];
-       struct intel_plane_wm_parameters cursor;
-};
-
-struct ilk_pipe_wm_parameters {
-       bool active;
-       uint32_t pipe_htotal;
-       uint32_t pixel_rate;
-       struct intel_plane_wm_parameters pri;
-       struct intel_plane_wm_parameters spr;
-       struct intel_plane_wm_parameters cur;
 };
 
 struct ilk_wm_maximums {
@@ -1810,26 +1733,26 @@ struct intel_wm_config {
  * For both WM_PIPE and WM_LP.
  * mem_value must be in 0.1us units.
  */
-static uint32_t ilk_compute_pri_wm(const struct ilk_pipe_wm_parameters *params,
+static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
+                                  const struct intel_plane_state *pstate,
                                   uint32_t mem_value,
                                   bool is_lp)
 {
+       int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
        uint32_t method1, method2;
 
-       if (!params->active || !params->pri.enabled)
+       if (!cstate->base.active || !pstate->visible)
                return 0;
 
-       method1 = ilk_wm_method1(params->pixel_rate,
-                                params->pri.bytes_per_pixel,
-                                mem_value);
+       method1 = ilk_wm_method1(ilk_pipe_pixel_rate(cstate), bpp, mem_value);
 
        if (!is_lp)
                return method1;
 
-       method2 = ilk_wm_method2(params->pixel_rate,
-                                params->pipe_htotal,
-                                params->pri.horiz_pixels,
-                                params->pri.bytes_per_pixel,
+       method2 = ilk_wm_method2(ilk_pipe_pixel_rate(cstate),
+                                cstate->base.adjusted_mode.crtc_htotal,
+                                drm_rect_width(&pstate->dst),
+                                bpp,
                                 mem_value);
 
        return min(method1, method2);
@@ -1839,21 +1762,21 @@ static uint32_t ilk_compute_pri_wm(const struct ilk_pipe_wm_parameters *params,
  * For both WM_PIPE and WM_LP.
  * mem_value must be in 0.1us units.
  */
-static uint32_t ilk_compute_spr_wm(const struct ilk_pipe_wm_parameters *params,
+static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
+                                  const struct intel_plane_state *pstate,
                                   uint32_t mem_value)
 {
+       int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
        uint32_t method1, method2;
 
-       if (!params->active || !params->spr.enabled)
+       if (!cstate->base.active || !pstate->visible)
                return 0;
 
-       method1 = ilk_wm_method1(params->pixel_rate,
-                                params->spr.bytes_per_pixel,
-                                mem_value);
-       method2 = ilk_wm_method2(params->pixel_rate,
-                                params->pipe_htotal,
-                                params->spr.horiz_pixels,
-                                params->spr.bytes_per_pixel,
+       method1 = ilk_wm_method1(ilk_pipe_pixel_rate(cstate), bpp, mem_value);
+       method2 = ilk_wm_method2(ilk_pipe_pixel_rate(cstate),
+                                cstate->base.adjusted_mode.crtc_htotal,
+                                drm_rect_width(&pstate->dst),
+                                bpp,
                                 mem_value);
        return min(method1, method2);
 }
@@ -1862,29 +1785,33 @@ static uint32_t ilk_compute_spr_wm(const struct ilk_pipe_wm_parameters *params,
  * For both WM_PIPE and WM_LP.
  * mem_value must be in 0.1us units.
  */
-static uint32_t ilk_compute_cur_wm(const struct ilk_pipe_wm_parameters *params,
+static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
+                                  const struct intel_plane_state *pstate,
                                   uint32_t mem_value)
 {
-       if (!params->active || !params->cur.enabled)
+       int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
+
+       if (!cstate->base.active || !pstate->visible)
                return 0;
 
-       return ilk_wm_method2(params->pixel_rate,
-                             params->pipe_htotal,
-                             params->cur.horiz_pixels,
-                             params->cur.bytes_per_pixel,
+       return ilk_wm_method2(ilk_pipe_pixel_rate(cstate),
+                             cstate->base.adjusted_mode.crtc_htotal,
+                             drm_rect_width(&pstate->dst),
+                             bpp,
                              mem_value);
 }
 
 /* Only for WM_LP. */
-static uint32_t ilk_compute_fbc_wm(const struct ilk_pipe_wm_parameters *params,
+static uint32_t ilk_compute_fbc_wm(const struct intel_crtc_state *cstate,
+                                  const struct intel_plane_state *pstate,
                                   uint32_t pri_val)
 {
-       if (!params->active || !params->pri.enabled)
+       int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
+
+       if (!cstate->base.active || !pstate->visible)
                return 0;
 
-       return ilk_wm_fbc(pri_val,
-                         params->pri.horiz_pixels,
-                         params->pri.bytes_per_pixel);
+       return ilk_wm_fbc(pri_val, drm_rect_width(&pstate->dst), bpp);
 }
 
 static unsigned int ilk_display_fifo_size(const struct drm_device *dev)
@@ -2049,10 +1976,12 @@ static bool ilk_validate_wm_level(int level,
 }
 
 static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
+                                const struct intel_crtc *intel_crtc,
                                 int level,
-                                const struct ilk_pipe_wm_parameters *p,
+                                struct intel_crtc_state *cstate,
                                 struct intel_wm_level *result)
 {
+       struct intel_plane *intel_plane;
        uint16_t pri_latency = dev_priv->wm.pri_latency[level];
        uint16_t spr_latency = dev_priv->wm.spr_latency[level];
        uint16_t cur_latency = dev_priv->wm.cur_latency[level];
@@ -2064,10 +1993,29 @@ static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
                cur_latency *= 5;
        }
 
-       result->pri_val = ilk_compute_pri_wm(p, pri_latency, level);
-       result->spr_val = ilk_compute_spr_wm(p, spr_latency);
-       result->cur_val = ilk_compute_cur_wm(p, cur_latency);
-       result->fbc_val = ilk_compute_fbc_wm(p, result->pri_val);
+       for_each_intel_plane_on_crtc(dev_priv->dev, intel_crtc, intel_plane) {
+               struct intel_plane_state *pstate =
+                       to_intel_plane_state(intel_plane->base.state);
+
+               switch (intel_plane->base.type) {
+               case DRM_PLANE_TYPE_PRIMARY:
+                       result->pri_val = ilk_compute_pri_wm(cstate, pstate,
+                                                            pri_latency,
+                                                            level);
+                       result->fbc_val = ilk_compute_fbc_wm(cstate, pstate,
+                                                            result->pri_val);
+                       break;
+               case DRM_PLANE_TYPE_OVERLAY:
+                       result->spr_val = ilk_compute_spr_wm(cstate, pstate,
+                                                            spr_latency);
+                       break;
+               case DRM_PLANE_TYPE_CURSOR:
+                       result->cur_val = ilk_compute_cur_wm(cstate, pstate,
+                                                            cur_latency);
+                       break;
+               }
+       }
+
        result->enable = true;
 }
 
@@ -2076,7 +2024,7 @@ hsw_compute_linetime_wm(struct drm_device *dev, struct drm_crtc *crtc)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct drm_display_mode *mode = &intel_crtc->config->base.adjusted_mode;
+       const struct drm_display_mode *adjusted_mode = &intel_crtc->config->base.adjusted_mode;
        u32 linetime, ips_linetime;
 
        if (!intel_crtc->active)
@@ -2085,9 +2033,9 @@ hsw_compute_linetime_wm(struct drm_device *dev, struct drm_crtc *crtc)
        /* The WM are computed with base on how long it takes to fill a single
         * row at the given clock rate, multiplied by 8.
         * */
-       linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8,
-                                    mode->crtc_clock);
-       ips_linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8,
+       linetime = DIV_ROUND_CLOSEST(adjusted_mode->crtc_htotal * 1000 * 8,
+                                    adjusted_mode->crtc_clock);
+       ips_linetime = DIV_ROUND_CLOSEST(adjusted_mode->crtc_htotal * 1000 * 8,
                                         dev_priv->cdclk_freq);
 
        return PIPE_WM_LINETIME_IPS_LINETIME(ips_linetime) |
@@ -2326,48 +2274,6 @@ static void skl_setup_wm_latency(struct drm_device *dev)
        intel_print_wm_latency(dev, "Gen9 Plane", dev_priv->wm.skl_latency);
 }
 
-static void ilk_compute_wm_parameters(struct drm_crtc *crtc,
-                                     struct ilk_pipe_wm_parameters *p)
-{
-       struct drm_device *dev = crtc->dev;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       enum pipe pipe = intel_crtc->pipe;
-       struct drm_plane *plane;
-
-       if (!intel_crtc->active)
-               return;
-
-       p->active = true;
-       p->pipe_htotal = intel_crtc->config->base.adjusted_mode.crtc_htotal;
-       p->pixel_rate = ilk_pipe_pixel_rate(intel_crtc->config);
-
-       if (crtc->primary->state->fb)
-               p->pri.bytes_per_pixel =
-                       crtc->primary->state->fb->bits_per_pixel / 8;
-       else
-               p->pri.bytes_per_pixel = 4;
-
-       p->cur.bytes_per_pixel = 4;
-       /*
-        * TODO: for now, assume primary and cursor planes are always enabled.
-        * Setting them to false makes the screen flicker.
-        */
-       p->pri.enabled = true;
-       p->cur.enabled = true;
-
-       p->pri.horiz_pixels = intel_crtc->config->pipe_src_w;
-       p->cur.horiz_pixels = intel_crtc->base.cursor->state->crtc_w;
-
-       drm_for_each_legacy_plane(plane, dev) {
-               struct intel_plane *intel_plane = to_intel_plane(plane);
-
-               if (intel_plane->pipe == pipe) {
-                       p->spr = intel_plane->wm;
-                       break;
-               }
-       }
-}
-
 static void ilk_compute_wm_config(struct drm_device *dev,
                                  struct intel_wm_config *config)
 {
@@ -2387,34 +2293,47 @@ static void ilk_compute_wm_config(struct drm_device *dev,
 }
 
 /* Compute new watermarks for the pipe */
-static bool intel_compute_pipe_wm(struct drm_crtc *crtc,
-                                 const struct ilk_pipe_wm_parameters *params,
+static bool intel_compute_pipe_wm(struct intel_crtc_state *cstate,
                                  struct intel_pipe_wm *pipe_wm)
 {
+       struct drm_crtc *crtc = cstate->base.crtc;
        struct drm_device *dev = crtc->dev;
        const struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_plane *intel_plane;
+       struct intel_plane_state *sprstate = NULL;
        int level, max_level = ilk_wm_max_level(dev);
        /* LP0 watermark maximums depend on this pipe alone */
        struct intel_wm_config config = {
                .num_pipes_active = 1,
-               .sprites_enabled = params->spr.enabled,
-               .sprites_scaled = params->spr.scaled,
        };
        struct ilk_wm_maximums max;
 
-       pipe_wm->pipe_enabled = params->active;
-       pipe_wm->sprites_enabled = params->spr.enabled;
-       pipe_wm->sprites_scaled = params->spr.scaled;
+       for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
+               if (intel_plane->base.type == DRM_PLANE_TYPE_OVERLAY) {
+                       sprstate = to_intel_plane_state(intel_plane->base.state);
+                       break;
+               }
+       }
+
+       config.sprites_enabled = sprstate->visible;
+       config.sprites_scaled = sprstate->visible &&
+               (drm_rect_width(&sprstate->dst) != drm_rect_width(&sprstate->src) >> 16 ||
+               drm_rect_height(&sprstate->dst) != drm_rect_height(&sprstate->src) >> 16);
+
+       pipe_wm->pipe_enabled = cstate->base.active;
+       pipe_wm->sprites_enabled = sprstate->visible;
+       pipe_wm->sprites_scaled = config.sprites_scaled;
 
        /* ILK/SNB: LP2+ watermarks only w/o sprites */
-       if (INTEL_INFO(dev)->gen <= 6 && params->spr.enabled)
+       if (INTEL_INFO(dev)->gen <= 6 && sprstate->visible)
                max_level = 1;
 
        /* ILK/SNB/IVB: LP1+ watermarks only w/o scaling */
-       if (params->spr.scaled)
+       if (config.sprites_scaled)
                max_level = 0;
 
-       ilk_compute_wm_level(dev_priv, 0, params, &pipe_wm->wm[0]);
+       ilk_compute_wm_level(dev_priv, intel_crtc, 0, cstate, &pipe_wm->wm[0]);
 
        if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                pipe_wm->linetime = hsw_compute_linetime_wm(dev, crtc);
@@ -2431,7 +2350,7 @@ static bool intel_compute_pipe_wm(struct drm_crtc *crtc,
        for (level = 1; level <= max_level; level++) {
                struct intel_wm_level wm = {};
 
-               ilk_compute_wm_level(dev_priv, level, params, &wm);
+               ilk_compute_wm_level(dev_priv, intel_crtc, level, cstate, &wm);
 
                /*
                 * Disable any watermark level that exceeds the
@@ -2912,7 +2831,8 @@ void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
                }
 
                val = I915_READ(CUR_BUF_CFG(pipe));
-               skl_ddb_entry_init_from_hw(&ddb->cursor[pipe], val);
+               skl_ddb_entry_init_from_hw(&ddb->plane[pipe][PLANE_CURSOR],
+                                          val);
        }
 }
 
@@ -2981,13 +2901,14 @@ skl_allocate_pipe_ddb(struct drm_crtc *crtc,
        alloc_size = skl_ddb_entry_size(alloc);
        if (alloc_size == 0) {
                memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe]));
-               memset(&ddb->cursor[pipe], 0, sizeof(ddb->cursor[pipe]));
+               memset(&ddb->plane[pipe][PLANE_CURSOR], 0,
+                      sizeof(ddb->plane[pipe][PLANE_CURSOR]));
                return;
        }
 
        cursor_blocks = skl_cursor_allocation(config);
-       ddb->cursor[pipe].start = alloc->end - cursor_blocks;
-       ddb->cursor[pipe].end = alloc->end;
+       ddb->plane[pipe][PLANE_CURSOR].start = alloc->end - cursor_blocks;
+       ddb->plane[pipe][PLANE_CURSOR].end = alloc->end;
 
        alloc_size -= cursor_blocks;
        alloc->end -= cursor_blocks;
@@ -3126,8 +3047,8 @@ static bool skl_ddb_allocation_changed(const struct skl_ddb_allocation *new_ddb,
                   sizeof(new_ddb->plane[pipe])))
                return true;
 
-       if (memcmp(&new_ddb->cursor[pipe], &cur_ddb->cursor[pipe],
-                   sizeof(new_ddb->cursor[pipe])))
+       if (memcmp(&new_ddb->plane[pipe][PLANE_CURSOR], &cur_ddb->plane[pipe][PLANE_CURSOR],
+                   sizeof(new_ddb->plane[pipe][PLANE_CURSOR])))
                return true;
 
        return false;
@@ -3171,7 +3092,8 @@ static void skl_compute_wm_pipe_parameters(struct drm_crtc *crtc,
                if (fb) {
                        p->plane[0].enabled = true;
                        p->plane[0].bytes_per_pixel = fb->pixel_format == DRM_FORMAT_NV12 ?
-                               drm_format_plane_cpp(fb->pixel_format, 1) : fb->bits_per_pixel / 8;
+                               drm_format_plane_cpp(fb->pixel_format, 1) :
+                               drm_format_plane_cpp(fb->pixel_format, 0);
                        p->plane[0].y_bytes_per_pixel = fb->pixel_format == DRM_FORMAT_NV12 ?
                                drm_format_plane_cpp(fb->pixel_format, 0) : 0;
                        p->plane[0].tiling = fb->modifier[0];
@@ -3186,17 +3108,17 @@ static void skl_compute_wm_pipe_parameters(struct drm_crtc *crtc,
                p->plane[0].rotation = crtc->primary->state->rotation;
 
                fb = crtc->cursor->state->fb;
-               p->cursor.y_bytes_per_pixel = 0;
+               p->plane[PLANE_CURSOR].y_bytes_per_pixel = 0;
                if (fb) {
-                       p->cursor.enabled = true;
-                       p->cursor.bytes_per_pixel = fb->bits_per_pixel / 8;
-                       p->cursor.horiz_pixels = crtc->cursor->state->crtc_w;
-                       p->cursor.vert_pixels = crtc->cursor->state->crtc_h;
+                       p->plane[PLANE_CURSOR].enabled = true;
+                       p->plane[PLANE_CURSOR].bytes_per_pixel = fb->bits_per_pixel / 8;
+                       p->plane[PLANE_CURSOR].horiz_pixels = crtc->cursor->state->crtc_w;
+                       p->plane[PLANE_CURSOR].vert_pixels = crtc->cursor->state->crtc_h;
                } else {
-                       p->cursor.enabled = false;
-                       p->cursor.bytes_per_pixel = 0;
-                       p->cursor.horiz_pixels = 64;
-                       p->cursor.vert_pixels = 64;
+                       p->plane[PLANE_CURSOR].enabled = false;
+                       p->plane[PLANE_CURSOR].bytes_per_pixel = 0;
+                       p->plane[PLANE_CURSOR].horiz_pixels = 64;
+                       p->plane[PLANE_CURSOR].vert_pixels = 64;
                }
        }
 
@@ -3310,11 +3232,12 @@ static void skl_compute_wm_level(const struct drm_i915_private *dev_priv,
                                                &result->plane_res_l[i]);
        }
 
-       ddb_blocks = skl_ddb_entry_size(&ddb->cursor[pipe]);
-       result->cursor_en = skl_compute_plane_wm(dev_priv, p, &p->cursor,
+       ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][PLANE_CURSOR]);
+       result->plane_en[PLANE_CURSOR] = skl_compute_plane_wm(dev_priv, p,
+                                                &p->plane[PLANE_CURSOR],
                                                 ddb_blocks, level,
-                                                &result->cursor_res_b,
-                                                &result->cursor_res_l);
+                                                &result->plane_res_b[PLANE_CURSOR],
+                                                &result->plane_res_l[PLANE_CURSOR]);
 }
 
 static uint32_t
@@ -3342,7 +3265,7 @@ static void skl_compute_transition_wm(struct drm_crtc *crtc,
        /* Until we know more, just disable transition WMs */
        for (i = 0; i < intel_num_planes(intel_crtc); i++)
                trans_wm->plane_en[i] = false;
-       trans_wm->cursor_en = false;
+       trans_wm->plane_en[PLANE_CURSOR] = false;
 }
 
 static void skl_compute_pipe_wm(struct drm_crtc *crtc,
@@ -3391,13 +3314,13 @@ static void skl_compute_wm_results(struct drm_device *dev,
 
                temp = 0;
 
-               temp |= p_wm->wm[level].cursor_res_l << PLANE_WM_LINES_SHIFT;
-               temp |= p_wm->wm[level].cursor_res_b;
+               temp |= p_wm->wm[level].plane_res_l[PLANE_CURSOR] << PLANE_WM_LINES_SHIFT;
+               temp |= p_wm->wm[level].plane_res_b[PLANE_CURSOR];
 
-               if (p_wm->wm[level].cursor_en)
+               if (p_wm->wm[level].plane_en[PLANE_CURSOR])
                        temp |= PLANE_WM_EN;
 
-               r->cursor[pipe][level] = temp;
+               r->plane[pipe][PLANE_CURSOR][level] = temp;
 
        }
 
@@ -3413,12 +3336,12 @@ static void skl_compute_wm_results(struct drm_device *dev,
        }
 
        temp = 0;
-       temp |= p_wm->trans_wm.cursor_res_l << PLANE_WM_LINES_SHIFT;
-       temp |= p_wm->trans_wm.cursor_res_b;
-       if (p_wm->trans_wm.cursor_en)
+       temp |= p_wm->trans_wm.plane_res_l[PLANE_CURSOR] << PLANE_WM_LINES_SHIFT;
+       temp |= p_wm->trans_wm.plane_res_b[PLANE_CURSOR];
+       if (p_wm->trans_wm.plane_en[PLANE_CURSOR])
                temp |= PLANE_WM_EN;
 
-       r->cursor_trans[pipe] = temp;
+       r->plane_trans[pipe][PLANE_CURSOR] = temp;
 
        r->wm_linetime[pipe] = p_wm->linetime;
 }
@@ -3452,12 +3375,13 @@ static void skl_write_wm_values(struct drm_i915_private *dev_priv,
                                I915_WRITE(PLANE_WM(pipe, i, level),
                                           new->plane[pipe][i][level]);
                        I915_WRITE(CUR_WM(pipe, level),
-                                  new->cursor[pipe][level]);
+                                  new->plane[pipe][PLANE_CURSOR][level]);
                }
                for (i = 0; i < intel_num_planes(crtc); i++)
                        I915_WRITE(PLANE_WM_TRANS(pipe, i),
                                   new->plane_trans[pipe][i]);
-               I915_WRITE(CUR_WM_TRANS(pipe), new->cursor_trans[pipe]);
+               I915_WRITE(CUR_WM_TRANS(pipe),
+                          new->plane_trans[pipe][PLANE_CURSOR]);
 
                for (i = 0; i < intel_num_planes(crtc); i++) {
                        skl_ddb_entry_write(dev_priv,
@@ -3469,7 +3393,7 @@ static void skl_write_wm_values(struct drm_i915_private *dev_priv,
                }
 
                skl_ddb_entry_write(dev_priv, CUR_BUF_CFG(pipe),
-                                   &new->ddb.cursor[pipe]);
+                                   &new->ddb.plane[pipe][PLANE_CURSOR]);
        }
 }
 
@@ -3677,6 +3601,26 @@ static void skl_update_other_pipe_wm(struct drm_device *dev,
        }
 }
 
+static void skl_clear_wm(struct skl_wm_values *watermarks, enum pipe pipe)
+{
+       watermarks->wm_linetime[pipe] = 0;
+       memset(watermarks->plane[pipe], 0,
+              sizeof(uint32_t) * 8 * I915_MAX_PLANES);
+       memset(watermarks->plane_trans[pipe],
+              0, sizeof(uint32_t) * I915_MAX_PLANES);
+       watermarks->plane_trans[pipe][PLANE_CURSOR] = 0;
+
+       /* Clear ddb entries for pipe */
+       memset(&watermarks->ddb.pipe[pipe], 0, sizeof(struct skl_ddb_entry));
+       memset(&watermarks->ddb.plane[pipe], 0,
+              sizeof(struct skl_ddb_entry) * I915_MAX_PLANES);
+       memset(&watermarks->ddb.y_plane[pipe], 0,
+              sizeof(struct skl_ddb_entry) * I915_MAX_PLANES);
+       memset(&watermarks->ddb.plane[pipe][PLANE_CURSOR], 0,
+              sizeof(struct skl_ddb_entry));
+
+}
+
 static void skl_update_wm(struct drm_crtc *crtc)
 {
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -3687,7 +3631,11 @@ static void skl_update_wm(struct drm_crtc *crtc)
        struct skl_pipe_wm pipe_wm = {};
        struct intel_wm_config config = {};
 
-       memset(results, 0, sizeof(*results));
+
+       /* Clear all dirty flags */
+       memset(results->dirty, 0, sizeof(bool) * I915_MAX_PIPES);
+
+       skl_clear_wm(results, intel_crtc->pipe);
 
        skl_compute_wm_global_parameters(dev, &config);
 
@@ -3742,19 +3690,19 @@ skl_update_sprite_wm(struct drm_plane *plane, struct drm_crtc *crtc,
 static void ilk_update_wm(struct drm_crtc *crtc)
 {
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct ilk_wm_maximums max;
-       struct ilk_pipe_wm_parameters params = {};
        struct ilk_wm_values results = {};
        enum intel_ddb_partitioning partitioning;
        struct intel_pipe_wm pipe_wm = {};
        struct intel_pipe_wm lp_wm_1_2 = {}, lp_wm_5_6 = {}, *best_lp_wm;
        struct intel_wm_config config = {};
 
-       ilk_compute_wm_parameters(crtc, &params);
+       WARN_ON(cstate->base.active != intel_crtc->active);
 
-       intel_compute_pipe_wm(crtc, &params, &pipe_wm);
+       intel_compute_pipe_wm(cstate, &pipe_wm);
 
        if (!memcmp(&intel_crtc->wm.active, &pipe_wm, sizeof(pipe_wm)))
                return;
@@ -3794,12 +3742,6 @@ ilk_update_sprite_wm(struct drm_plane *plane,
        struct drm_device *dev = plane->dev;
        struct intel_plane *intel_plane = to_intel_plane(plane);
 
-       intel_plane->wm.enabled = enabled;
-       intel_plane->wm.scaled = scaled;
-       intel_plane->wm.horiz_pixels = sprite_width;
-       intel_plane->wm.vert_pixels = sprite_width;
-       intel_plane->wm.bytes_per_pixel = pixel_size;
-
        /*
         * IVB workaround: must disable low power watermarks for at least
         * one frame before enabling scaling.  LP watermarks can be re-enabled
@@ -3831,10 +3773,10 @@ static void skl_pipe_wm_active_state(uint32_t val,
                                        (val >> PLANE_WM_LINES_SHIFT) &
                                                PLANE_WM_LINES_MASK;
                } else {
-                       active->wm[level].cursor_en = is_enabled;
-                       active->wm[level].cursor_res_b =
+                       active->wm[level].plane_en[PLANE_CURSOR] = is_enabled;
+                       active->wm[level].plane_res_b[PLANE_CURSOR] =
                                        val & PLANE_WM_BLOCKS_MASK;
-                       active->wm[level].cursor_res_l =
+                       active->wm[level].plane_res_l[PLANE_CURSOR] =
                                        (val >> PLANE_WM_LINES_SHIFT) &
                                                PLANE_WM_LINES_MASK;
                }
@@ -3847,10 +3789,10 @@ static void skl_pipe_wm_active_state(uint32_t val,
                                        (val >> PLANE_WM_LINES_SHIFT) &
                                                PLANE_WM_LINES_MASK;
                } else {
-                       active->trans_wm.cursor_en = is_enabled;
-                       active->trans_wm.cursor_res_b =
+                       active->trans_wm.plane_en[PLANE_CURSOR] = is_enabled;
+                       active->trans_wm.plane_res_b[PLANE_CURSOR] =
                                        val & PLANE_WM_BLOCKS_MASK;
-                       active->trans_wm.cursor_res_l =
+                       active->trans_wm.plane_res_l[PLANE_CURSOR] =
                                        (val >> PLANE_WM_LINES_SHIFT) &
                                                PLANE_WM_LINES_MASK;
                }
@@ -3876,12 +3818,12 @@ static void skl_pipe_wm_get_hw_state(struct drm_crtc *crtc)
                for (i = 0; i < intel_num_planes(intel_crtc); i++)
                        hw->plane[pipe][i][level] =
                                        I915_READ(PLANE_WM(pipe, i, level));
-               hw->cursor[pipe][level] = I915_READ(CUR_WM(pipe, level));
+               hw->plane[pipe][PLANE_CURSOR][level] = I915_READ(CUR_WM(pipe, level));
        }
 
        for (i = 0; i < intel_num_planes(intel_crtc); i++)
                hw->plane_trans[pipe][i] = I915_READ(PLANE_WM_TRANS(pipe, i));
-       hw->cursor_trans[pipe] = I915_READ(CUR_WM_TRANS(pipe));
+       hw->plane_trans[pipe][PLANE_CURSOR] = I915_READ(CUR_WM_TRANS(pipe));
 
        if (!intel_crtc->active)
                return;
@@ -3896,7 +3838,7 @@ static void skl_pipe_wm_get_hw_state(struct drm_crtc *crtc)
                        skl_pipe_wm_active_state(temp, active, false,
                                                false, i, level);
                }
-               temp = hw->cursor[pipe][level];
+               temp = hw->plane[pipe][PLANE_CURSOR][level];
                skl_pipe_wm_active_state(temp, active, false, true, i, level);
        }
 
@@ -3905,7 +3847,7 @@ static void skl_pipe_wm_get_hw_state(struct drm_crtc *crtc)
                skl_pipe_wm_active_state(temp, active, true, false, i, 0);
        }
 
-       temp = hw->cursor_trans[pipe];
+       temp = hw->plane_trans[pipe][PLANE_CURSOR];
        skl_pipe_wm_active_state(temp, active, true, true, i, 0);
 }
 
@@ -4266,7 +4208,7 @@ static void ironlake_enable_drps(struct drm_device *dev)
        fstart = (rgvmodectl & MEMMODE_FSTART_MASK) >>
                MEMMODE_FSTART_SHIFT;
 
-       vstart = (I915_READ(PXVFREQ_BASE + (fstart * 4)) & PXVFREQ_PX_MASK) >>
+       vstart = (I915_READ(PXVFREQ(fstart)) & PXVFREQ_PX_MASK) >>
                PXVFREQ_PX_SHIFT;
 
        dev_priv->ips.fmax = fmax; /* IPS callback will increase this */
@@ -4297,10 +4239,10 @@ static void ironlake_enable_drps(struct drm_device *dev)
 
        ironlake_set_drps(dev, fstart);
 
-       dev_priv->ips.last_count1 = I915_READ(0x112e4) + I915_READ(0x112e8) +
-               I915_READ(0x112e0);
+       dev_priv->ips.last_count1 = I915_READ(DMIEC) +
+               I915_READ(DDREC) + I915_READ(CSIEC);
        dev_priv->ips.last_time1 = jiffies_to_msecs(jiffies);
-       dev_priv->ips.last_count2 = I915_READ(0x112f4);
+       dev_priv->ips.last_count2 = I915_READ(GFXEC);
        dev_priv->ips.last_time2 = ktime_get_raw_ns();
 
        spin_unlock_irq(&mchdev_lock);
@@ -4471,6 +4413,10 @@ static void gen6_set_rps(struct drm_device *dev, u8 val)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
+       /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */
+       if (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0))
+               return;
+
        WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
        WARN_ON(val > dev_priv->rps.max_freq);
        WARN_ON(val < dev_priv->rps.min_freq);
@@ -4791,6 +4737,12 @@ static void gen9_enable_rps(struct drm_device *dev)
 
        gen6_init_rps_frequencies(dev);
 
+       /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */
+       if (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) {
+               intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
+               return;
+       }
+
        /* Program defaults and thresholds for RPS*/
        I915_WRITE(GEN6_RC_VIDEO_FREQ,
                GEN9_FREQUENCY(dev_priv->rps.rp1_freq));
@@ -4828,13 +4780,22 @@ static void gen9_enable_rc6(struct drm_device *dev)
        I915_WRITE(GEN6_RC_CONTROL, 0);
 
        /* 2b: Program RC6 thresholds.*/
-       I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16);
+
+       /* WaRsDoubleRc6WrlWithCoarsePowerGating: Doubling WRL only when CPG is enabled */
+       if (IS_SKYLAKE(dev) && !((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) &&
+                                (INTEL_REVID(dev) <= SKL_REVID_E0)))
+               I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 108 << 16);
+       else
+               I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16);
        I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
        I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */
        for_each_ring(ring, dev_priv, unused)
                I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
+
+       if (HAS_GUC_UCODE(dev))
+               I915_WRITE(GUC_MAX_IDLE_COUNT, 0xA);
+
        I915_WRITE(GEN6_RC_SLEEP, 0);
-       I915_WRITE(GEN6_RC6_THRESHOLD, 37500); /* 37.5/125ms per EI */
 
        /* 2c: Program Coarse Power Gating Policies. */
        I915_WRITE(GEN9_MEDIA_PG_IDLE_HYSTERESIS, 25);
@@ -4845,17 +4806,30 @@ static void gen9_enable_rc6(struct drm_device *dev)
                rc6_mask = GEN6_RC_CTL_RC6_ENABLE;
        DRM_INFO("RC6 %s\n", (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ?
                        "on" : "off");
-       I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
-                                  GEN6_RC_CTL_EI_MODE(1) |
-                                  rc6_mask);
+       /* WaRsUseTimeoutMode */
+       if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_D0) ||
+           (IS_BROXTON(dev) && INTEL_REVID(dev) <= BXT_REVID_A0)) {
+               I915_WRITE(GEN6_RC6_THRESHOLD, 625); /* 800us */
+               I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
+                          GEN7_RC_CTL_TO_MODE |
+                          rc6_mask);
+       } else {
+               I915_WRITE(GEN6_RC6_THRESHOLD, 37500); /* 37.5/125ms per EI */
+               I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
+                          GEN6_RC_CTL_EI_MODE(1) |
+                          rc6_mask);
+       }
 
        /*
         * 3b: Enable Coarse Power Gating only when RC6 is enabled.
-        * WaDisableRenderPowerGating:skl,bxt - Render PG need to be disabled with RC6.
+        * WaRsDisableCoarsePowerGating:skl,bxt - Render/Media PG need to be disabled with RC6.
         */
-       I915_WRITE(GEN9_PG_ENABLE, (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ?
-                       GEN9_MEDIA_PG_ENABLE : 0);
-
+       if ((IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) ||
+           ((IS_SKL_GT3(dev) || IS_SKL_GT4(dev)) && (INTEL_REVID(dev) <= SKL_REVID_E0)))
+               I915_WRITE(GEN9_PG_ENABLE, 0);
+       else
+               I915_WRITE(GEN9_PG_ENABLE, (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ?
+                               (GEN9_RENDER_PG_ENABLE | GEN9_MEDIA_PG_ENABLE) : 0);
 
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 
@@ -5153,32 +5127,27 @@ static int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
        struct drm_device *dev = dev_priv->dev;
        u32 val, rp0;
 
-       if (dev->pdev->revision >= 0x20) {
-               val = vlv_punit_read(dev_priv, FB_GFX_FMAX_AT_VMAX_FUSE);
+       val = vlv_punit_read(dev_priv, FB_GFX_FMAX_AT_VMAX_FUSE);
 
-               switch (INTEL_INFO(dev)->eu_total) {
-               case 8:
-                               /* (2 * 4) config */
-                               rp0 = (val >> FB_GFX_FMAX_AT_VMAX_2SS4EU_FUSE_SHIFT);
-                               break;
-               case 12:
-                               /* (2 * 6) config */
-                               rp0 = (val >> FB_GFX_FMAX_AT_VMAX_2SS6EU_FUSE_SHIFT);
-                               break;
-               case 16:
-                               /* (2 * 8) config */
-               default:
-                               /* Setting (2 * 8) Min RP0 for any other combination */
-                               rp0 = (val >> FB_GFX_FMAX_AT_VMAX_2SS8EU_FUSE_SHIFT);
-                               break;
-               }
-               rp0 = (rp0 & FB_GFX_FREQ_FUSE_MASK);
-       } else {
-               /* For pre-production hardware */
-               val = vlv_punit_read(dev_priv, PUNIT_GPU_STATUS_REG);
-               rp0 = (val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) &
-                      PUNIT_GPU_STATUS_MAX_FREQ_MASK;
+       switch (INTEL_INFO(dev)->eu_total) {
+       case 8:
+               /* (2 * 4) config */
+               rp0 = (val >> FB_GFX_FMAX_AT_VMAX_2SS4EU_FUSE_SHIFT);
+               break;
+       case 12:
+               /* (2 * 6) config */
+               rp0 = (val >> FB_GFX_FMAX_AT_VMAX_2SS6EU_FUSE_SHIFT);
+               break;
+       case 16:
+               /* (2 * 8) config */
+       default:
+               /* Setting (2 * 8) Min RP0 for any other combination */
+               rp0 = (val >> FB_GFX_FMAX_AT_VMAX_2SS8EU_FUSE_SHIFT);
+               break;
        }
+
+       rp0 = (rp0 & FB_GFX_FREQ_FUSE_MASK);
+
        return rp0;
 }
 
@@ -5194,18 +5163,11 @@ static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
 
 static int cherryview_rps_guar_freq(struct drm_i915_private *dev_priv)
 {
-       struct drm_device *dev = dev_priv->dev;
        u32 val, rp1;
 
-       if (dev->pdev->revision >= 0x20) {
-               val = vlv_punit_read(dev_priv, FB_GFX_FMAX_AT_VMAX_FUSE);
-               rp1 = (val & FB_GFX_FREQ_FUSE_MASK);
-       } else {
-               /* For pre-production hardware */
-               val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
-               rp1 = ((val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) &
-                      PUNIT_GPU_STATUS_MAX_FREQ_MASK);
-       }
+       val = vlv_punit_read(dev_priv, FB_GFX_FMAX_AT_VMAX_FUSE);
+       rp1 = (val & FB_GFX_FREQ_FUSE_MASK);
+
        return rp1;
 }
 
@@ -5420,25 +5382,10 @@ static void cherryview_init_gt_powersave(struct drm_device *dev)
        mutex_unlock(&dev_priv->sb_lock);
 
        switch ((val >> 2) & 0x7) {
-       case 0:
-       case 1:
-               dev_priv->rps.cz_freq = 200;
-               dev_priv->mem_freq = 1600;
-               break;
-       case 2:
-               dev_priv->rps.cz_freq = 267;
-               dev_priv->mem_freq = 1600;
-               break;
        case 3:
-               dev_priv->rps.cz_freq = 333;
                dev_priv->mem_freq = 2000;
                break;
-       case 4:
-               dev_priv->rps.cz_freq = 320;
-               dev_priv->mem_freq = 1600;
-               break;
-       case 5:
-               dev_priv->rps.cz_freq = 400;
+       default:
                dev_priv->mem_freq = 1600;
                break;
        }
@@ -5570,7 +5517,7 @@ static void cherryview_enable_rps(struct drm_device *dev)
        /* RPS code assumes GPLL is used */
        WARN_ONCE((val & GPLLENABLE) == 0, "GPLL not enabled\n");
 
-       DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & GPLLENABLE ? "yes" : "no");
+       DRM_DEBUG_DRIVER("GPLL enabled? %s\n", yesno(val & GPLLENABLE));
        DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
 
        dev_priv->rps.cur_freq = (val >> 8) & 0xff;
@@ -5660,7 +5607,7 @@ static void valleyview_enable_rps(struct drm_device *dev)
        /* RPS code assumes GPLL is used */
        WARN_ONCE((val & GPLLENABLE) == 0, "GPLL not enabled\n");
 
-       DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & GPLLENABLE ? "yes" : "no");
+       DRM_DEBUG_DRIVER("GPLL enabled? %s\n", yesno(val & GPLLENABLE));
        DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
 
        dev_priv->rps.cur_freq = (val >> 8) & 0xff;
@@ -5869,7 +5816,7 @@ static unsigned long __i915_gfx_val(struct drm_i915_private *dev_priv)
 
        assert_spin_locked(&mchdev_lock);
 
-       pxvid = I915_READ(PXVFREQ_BASE + (dev_priv->rps.cur_freq * 4));
+       pxvid = I915_READ(PXVFREQ(dev_priv->rps.cur_freq));
        pxvid = (pxvid >> 24) & 0x7f;
        ext_v = pvid_to_extvid(dev_priv, pxvid);
 
@@ -6112,13 +6059,13 @@ static void intel_init_emon(struct drm_device *dev)
        I915_WRITE(CSIEW2, 0x04000004);
 
        for (i = 0; i < 5; i++)
-               I915_WRITE(PEW + (i * 4), 0);
+               I915_WRITE(PEW(i), 0);
        for (i = 0; i < 3; i++)
-               I915_WRITE(DEW + (i * 4), 0);
+               I915_WRITE(DEW(i), 0);
 
        /* Program P-state weights to account for frequency power adjustment */
        for (i = 0; i < 16; i++) {
-               u32 pxvidfreq = I915_READ(PXVFREQ_BASE + (i * 4));
+               u32 pxvidfreq = I915_READ(PXVFREQ(i));
                unsigned long freq = intel_pxfreq(pxvidfreq);
                unsigned long vid = (pxvidfreq & PXVFREQ_PX_MASK) >>
                        PXVFREQ_PX_SHIFT;
@@ -6139,7 +6086,7 @@ static void intel_init_emon(struct drm_device *dev)
        for (i = 0; i < 4; i++) {
                u32 val = (pxw[i*4] << 24) | (pxw[(i*4)+1] << 16) |
                        (pxw[(i*4)+2] << 8) | (pxw[(i*4)+3]);
-               I915_WRITE(PXW + (i * 4), val);
+               I915_WRITE(PXW(i), val);
        }
 
        /* Adjust magic regs to magic values (more experimental results) */
@@ -6155,7 +6102,7 @@ static void intel_init_emon(struct drm_device *dev)
        I915_WRITE(EG7, 0);
 
        for (i = 0; i < 8; i++)
-               I915_WRITE(PXWL + (i * 4), 0);
+               I915_WRITE(PXWL(i), 0);
 
        /* Enable PMON + select events */
        I915_WRITE(ECR, 0x80000019);
@@ -6609,14 +6556,14 @@ static void lpt_init_clock_gating(struct drm_device *dev)
         * TODO: this bit should only be enabled when really needed, then
         * disabled when not needed anymore in order to save power.
         */
-       if (dev_priv->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE)
+       if (HAS_PCH_LPT_LP(dev))
                I915_WRITE(SOUTH_DSPCLK_GATE_D,
                           I915_READ(SOUTH_DSPCLK_GATE_D) |
                           PCH_LP_PARTITION_LEVEL_DISABLE);
 
        /* WADPOClockGatingDisable:hsw */
-       I915_WRITE(_TRANSA_CHICKEN1,
-                  I915_READ(_TRANSA_CHICKEN1) |
+       I915_WRITE(TRANS_CHICKEN1(PIPE_A),
+                  I915_READ(TRANS_CHICKEN1(PIPE_A)) |
                   TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);
 }
 
@@ -6624,7 +6571,7 @@ static void lpt_suspend_hw(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (dev_priv->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) {
+       if (HAS_PCH_LPT_LP(dev)) {
                uint32_t val = I915_READ(SOUTH_DSPCLK_GATE_D);
 
                val &= ~PCH_LP_PARTITION_LEVEL_DISABLE;
@@ -7110,9 +7057,6 @@ void intel_init_pm(struct drm_device *dev)
                if (IS_BROXTON(dev))
                        dev_priv->display.init_clock_gating =
                                bxt_init_clock_gating;
-               else if (IS_SKYLAKE(dev))
-                       dev_priv->display.init_clock_gating =
-                               skl_init_clock_gating;
                dev_priv->display.update_wm = skl_update_wm;
                dev_priv->display.update_sprite_wm = skl_update_sprite_wm;
        } else if (HAS_PCH_SPLIT(dev)) {
@@ -7265,7 +7209,7 @@ static int vlv_gpu_freq_div(unsigned int czclk_freq)
 
 static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val)
 {
-       int div, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->mem_freq, 4);
+       int div, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
 
        div = vlv_gpu_freq_div(czclk_freq);
        if (div < 0)
@@ -7276,7 +7220,7 @@ static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val)
 
 static int byt_freq_opcode(struct drm_i915_private *dev_priv, int val)
 {
-       int mul, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->mem_freq, 4);
+       int mul, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
 
        mul = vlv_gpu_freq_div(czclk_freq);
        if (mul < 0)
@@ -7287,7 +7231,7 @@ static int byt_freq_opcode(struct drm_i915_private *dev_priv, int val)
 
 static int chv_gpu_freq(struct drm_i915_private *dev_priv, int val)
 {
-       int div, czclk_freq = dev_priv->rps.cz_freq;
+       int div, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
 
        div = vlv_gpu_freq_div(czclk_freq) / 2;
        if (div < 0)
@@ -7298,7 +7242,7 @@ static int chv_gpu_freq(struct drm_i915_private *dev_priv, int val)
 
 static int chv_freq_opcode(struct drm_i915_private *dev_priv, int val)
 {
-       int mul, czclk_freq = dev_priv->rps.cz_freq;
+       int mul, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
 
        mul = vlv_gpu_freq_div(czclk_freq) / 2;
        if (mul < 0)