Merge tag 'drm-intel-next-2021-01-04' of git://anongit.freedesktop.org/drm/drm-intel...
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 7 Jan 2021 11:20:28 +0000 (12:20 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 7 Jan 2021 11:20:29 +0000 (12:20 +0100)
- Display hotplug fix for gen2/gen3 (Chris)
- Remove trailing semicolon (Tom)
- Suppress display warnings for old ifwi presend on our CI (Chris)
- OA/Perf related workaround (Lionel)
- Replace I915_READ/WRITE per new uncore and display read/write functions (Jani)
- PSR improvements (Jose)
- HDR and other color changes on LSPCON (Uma, Ville)
- FBC fixes for TGL (Uma)
- Record plane update times for debugging (Chris)
- Refactor panel backlight control functions (Dave)
- Display power improvements (Imre)
- Add VRR register definition (Manasi)
- Atomic modeset improvements for bigjoiner pipes (Ville)
- Switch off the scanout during driver unregister (Chris)
- Clean-up DP's FEW enable (Manasi)
- Fix VDSCP slice count (Manasi)
- Fix and clean up around rc_model_size for DSC (Jani)
- Remove Type-C noisy debug warn message (Sean)
- Display HPD code clean-up (Ville)
- Refactor Intel Display (Dave)
- Start adding support for Intel's eDP backlight controls (Lyude)

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
From: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210104211018.GA1094707@intel.com
13 files changed:
1  2 
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_hdmi.c
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_pm.c
include/drm/drm_dsc.h

@@@ -2285,18 -2285,23 +2285,23 @@@ static void intel_ddi_get_power_domains
        dig_port = enc_to_dig_port(encoder);
  
        if (!intel_phy_is_tc(dev_priv, phy) ||
-           dig_port->tc_mode != TC_PORT_TBT_ALT)
-               intel_display_power_get(dev_priv,
-                                       dig_port->ddi_io_power_domain);
+           dig_port->tc_mode != TC_PORT_TBT_ALT) {
+               drm_WARN_ON(&dev_priv->drm, dig_port->ddi_io_wakeref);
+               dig_port->ddi_io_wakeref = intel_display_power_get(dev_priv,
+                                                                  dig_port->ddi_io_power_domain);
+       }
  
        /*
         * AUX power is only needed for (e)DP mode, and for HDMI mode on TC
         * ports.
         */
        if (intel_crtc_has_dp_encoder(crtc_state) ||
-           intel_phy_is_tc(dev_priv, phy))
-               intel_display_power_get(dev_priv,
-                                       intel_ddi_main_link_aux_domain(dig_port));
+           intel_phy_is_tc(dev_priv, phy)) {
+               drm_WARN_ON(&dev_priv->drm, dig_port->aux_wakeref);
+               dig_port->aux_wakeref =
+                       intel_display_power_get(dev_priv,
+                                               intel_ddi_main_link_aux_domain(dig_port));
+       }
  }
  
  void intel_ddi_enable_pipe_clock(struct intel_encoder *encoder,
@@@ -3507,12 -3512,6 +3512,6 @@@ static void intel_ddi_enable_fec(struc
        val = intel_de_read(dev_priv, dp_tp_ctl_reg(encoder, crtc_state));
        val |= DP_TP_CTL_FEC_ENABLE;
        intel_de_write(dev_priv, dp_tp_ctl_reg(encoder, crtc_state), val);
-       if (intel_de_wait_for_set(dev_priv,
-                                 dp_tp_status_reg(encoder, crtc_state),
-                                 DP_TP_STATUS_FEC_ENABLE_LIVE, 1))
-               drm_err(&dev_priv->drm,
-                       "Timed out waiting for FEC Enable Status\n");
  }
  
  static void intel_ddi_disable_fec_state(struct intel_encoder *encoder,
@@@ -3577,9 -3576,11 +3576,11 @@@ static void tgl_ddi_pre_enable_dp(struc
  
        /* 5. If IO power is controlled through PWR_WELL_CTL, Enable IO Power */
        if (!intel_phy_is_tc(dev_priv, phy) ||
-           dig_port->tc_mode != TC_PORT_TBT_ALT)
-               intel_display_power_get(dev_priv,
-                                       dig_port->ddi_io_power_domain);
+           dig_port->tc_mode != TC_PORT_TBT_ALT) {
+               drm_WARN_ON(&dev_priv->drm, dig_port->ddi_io_wakeref);
+               dig_port->ddi_io_wakeref = intel_display_power_get(dev_priv,
+                                                                  dig_port->ddi_io_power_domain);
+       }
  
        /* 6. Program DP_MODE */
        icl_program_mg_dp_mode(dig_port, crtc_state);
        if (!is_mst)
                intel_dp_set_power(intel_dp, DP_SET_POWER_D0);
  
 +      intel_dp_configure_protocol_converter(intel_dp, crtc_state);
        intel_dp_sink_set_decompression_state(intel_dp, crtc_state, true);
        /*
         * DDI FEC: "anticipates enabling FEC encoding sets the FEC_READY bit
         */
        intel_dp_sink_set_fec_ready(intel_dp, crtc_state);
  
 +      intel_dp_check_frl_training(intel_dp);
 +      intel_dp_pcon_dsc_configure(intel_dp, crtc_state);
 +
        /*
         * 7.i Follow DisplayPort specification training sequence (see notes for
         *     failure handling)
@@@ -3702,9 -3699,11 +3703,11 @@@ static void hsw_ddi_pre_enable_dp(struc
        intel_ddi_clk_select(encoder, crtc_state);
  
        if (!intel_phy_is_tc(dev_priv, phy) ||
-           dig_port->tc_mode != TC_PORT_TBT_ALT)
-               intel_display_power_get(dev_priv,
-                                       dig_port->ddi_io_power_domain);
+           dig_port->tc_mode != TC_PORT_TBT_ALT) {
+               drm_WARN_ON(&dev_priv->drm, dig_port->ddi_io_wakeref);
+               dig_port->ddi_io_wakeref = intel_display_power_get(dev_priv,
+                                                                  dig_port->ddi_io_power_domain);
+       }
  
        icl_program_mg_dp_mode(dig_port, crtc_state);
  
        intel_ddi_init_dp_buf_reg(encoder, crtc_state);
        if (!is_mst)
                intel_dp_set_power(intel_dp, DP_SET_POWER_D0);
 -      intel_dp_configure_protocol_converter(intel_dp);
 +      intel_dp_configure_protocol_converter(intel_dp, crtc_state);
        intel_dp_sink_set_decompression_state(intel_dp, crtc_state,
                                              true);
        intel_dp_sink_set_fec_ready(intel_dp, crtc_state);
@@@ -3782,7 -3781,9 +3785,9 @@@ static void intel_ddi_pre_enable_hdmi(s
        intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
        intel_ddi_clk_select(encoder, crtc_state);
  
-       intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);
+       drm_WARN_ON(&dev_priv->drm, dig_port->ddi_io_wakeref);
+       dig_port->ddi_io_wakeref = intel_display_power_get(dev_priv,
+                                                          dig_port->ddi_io_power_domain);
  
        icl_program_mg_dp_mode(dig_port, crtc_state);
  
@@@ -3940,8 -3941,9 +3945,9 @@@ static void intel_ddi_post_disable_dp(s
  
        if (!intel_phy_is_tc(dev_priv, phy) ||
            dig_port->tc_mode != TC_PORT_TBT_ALT)
-               intel_display_power_put_unchecked(dev_priv,
-                                                 dig_port->ddi_io_power_domain);
+               intel_display_power_put(dev_priv,
+                                       dig_port->ddi_io_power_domain,
+                                       fetch_and_zero(&dig_port->ddi_io_wakeref));
  
        intel_ddi_clk_disable(encoder);
  }
@@@ -3962,8 -3964,9 +3968,9 @@@ static void intel_ddi_post_disable_hdmi
  
        intel_disable_ddi_buf(encoder, old_crtc_state);
  
-       intel_display_power_put_unchecked(dev_priv,
-                                         dig_port->ddi_io_power_domain);
+       intel_display_power_put(dev_priv,
+                               dig_port->ddi_io_power_domain,
+                               fetch_and_zero(&dig_port->ddi_io_wakeref));
  
        intel_ddi_clk_disable(encoder);
  
@@@ -4036,8 -4039,9 +4043,9 @@@ static void intel_ddi_post_disable(stru
                icl_unmap_plls_to_ports(encoder);
  
        if (intel_crtc_has_dp_encoder(old_crtc_state) || is_tc_port)
-               intel_display_power_put_unchecked(dev_priv,
-                                                 intel_ddi_main_link_aux_domain(dig_port));
+               intel_display_power_put(dev_priv,
+                                       intel_ddi_main_link_aux_domain(dig_port),
+                                       fetch_and_zero(&dig_port->aux_wakeref));
  
        if (is_tc_port)
                intel_tc_port_put_link(dig_port);
@@@ -4122,6 -4126,7 +4130,7 @@@ static void intel_enable_ddi_dp(struct 
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+       struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
        enum port port = encoder->port;
  
        if (port == PORT_A && INTEL_GEN(dev_priv) < 9)
  
        intel_edp_backlight_on(crtc_state, conn_state);
        intel_psr_enable(intel_dp, crtc_state, conn_state);
-       intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
+       if (!dig_port->lspcon.active || dig_port->dp.has_hdmi_sink)
+               intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
        intel_edp_drrs_enable(intel_dp, crtc_state);
  
        if (crtc_state->has_audio)
@@@ -4372,9 -4380,12 +4384,12 @@@ intel_ddi_pre_pll_enable(struct intel_a
        if (is_tc_port)
                intel_tc_port_get_link(dig_port, crtc_state->lane_count);
  
-       if (intel_crtc_has_dp_encoder(crtc_state) || is_tc_port)
-               intel_display_power_get(dev_priv,
-                                       intel_ddi_main_link_aux_domain(dig_port));
+       if (intel_crtc_has_dp_encoder(crtc_state) || is_tc_port) {
+               drm_WARN_ON(&dev_priv->drm, dig_port->aux_wakeref);
+               dig_port->aux_wakeref =
+                       intel_display_power_get(dev_priv,
+                                               intel_ddi_main_link_aux_domain(dig_port));
+       }
  
        if (is_tc_port && dig_port->tc_mode != TC_PORT_TBT_ALT)
                /*
@@@ -4587,6 -4598,7 +4602,7 @@@ static void intel_ddi_read_func_ctl(str
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
        enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
+       struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
        u32 temp, flags = 0;
  
        temp = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder));
                                    pipe_config->fec_enable);
                }
  
-               pipe_config->infoframes.enable |=
-                       intel_hdmi_infoframes_enabled(encoder, pipe_config);
+               if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
+                       pipe_config->infoframes.enable |=
+                               intel_lspcon_infoframes_enabled(encoder, pipe_config);
+               else
+                       pipe_config->infoframes.enable |=
+                               intel_hdmi_infoframes_enabled(encoder, pipe_config);
                break;
        case TRANS_DDI_MODE_SELECT_DP_MST:
                pipe_config->output_types |= BIT(INTEL_OUTPUT_DP_MST);
@@@ -45,6 -45,7 +45,7 @@@
  
  #include "display/intel_crt.h"
  #include "display/intel_ddi.h"
+ #include "display/intel_display_debugfs.h"
  #include "display/intel_dp.h"
  #include "display/intel_dp_mst.h"
  #include "display/intel_dpll_mgr.h"
@@@ -68,6 -69,7 +69,7 @@@
  #include "intel_cdclk.h"
  #include "intel_color.h"
  #include "intel_csr.h"
+ #include "intel_cursor.h"
  #include "intel_display_types.h"
  #include "intel_dp_link_training.h"
  #include "intel_fbc.h"
  #include "intel_sprite.h"
  #include "intel_tc.h"
  #include "intel_vga.h"
- /* Primary plane formats for gen <= 3 */
- static const u32 i8xx_primary_formats[] = {
-       DRM_FORMAT_C8,
-       DRM_FORMAT_XRGB1555,
-       DRM_FORMAT_RGB565,
-       DRM_FORMAT_XRGB8888,
- };
- /* Primary plane formats for ivb (no fp16 due to hw issue) */
- static const u32 ivb_primary_formats[] = {
-       DRM_FORMAT_C8,
-       DRM_FORMAT_RGB565,
-       DRM_FORMAT_XRGB8888,
-       DRM_FORMAT_XBGR8888,
-       DRM_FORMAT_XRGB2101010,
-       DRM_FORMAT_XBGR2101010,
- };
- /* Primary plane formats for gen >= 4, except ivb */
- static const u32 i965_primary_formats[] = {
-       DRM_FORMAT_C8,
-       DRM_FORMAT_RGB565,
-       DRM_FORMAT_XRGB8888,
-       DRM_FORMAT_XBGR8888,
-       DRM_FORMAT_XRGB2101010,
-       DRM_FORMAT_XBGR2101010,
-       DRM_FORMAT_XBGR16161616F,
- };
- /* Primary plane formats for vlv/chv */
- static const u32 vlv_primary_formats[] = {
-       DRM_FORMAT_C8,
-       DRM_FORMAT_RGB565,
-       DRM_FORMAT_XRGB8888,
-       DRM_FORMAT_XBGR8888,
-       DRM_FORMAT_ARGB8888,
-       DRM_FORMAT_ABGR8888,
-       DRM_FORMAT_XRGB2101010,
-       DRM_FORMAT_XBGR2101010,
-       DRM_FORMAT_ARGB2101010,
-       DRM_FORMAT_ABGR2101010,
-       DRM_FORMAT_XBGR16161616F,
- };
- static const u64 i9xx_format_modifiers[] = {
-       I915_FORMAT_MOD_X_TILED,
-       DRM_FORMAT_MOD_LINEAR,
-       DRM_FORMAT_MOD_INVALID
- };
- /* Cursor formats */
- static const u32 intel_cursor_formats[] = {
-       DRM_FORMAT_ARGB8888,
- };
- static const u64 cursor_format_modifiers[] = {
-       DRM_FORMAT_MOD_LINEAR,
-       DRM_FORMAT_MOD_INVALID
- };
+ #include "i9xx_plane.h"
  
  static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
                                struct intel_crtc_state *pipe_config);
@@@ -542,12 -485,6 +485,6 @@@ icl_wa_scalerclkgating(struct drm_i915_
  }
  
  static bool
- needs_modeset(const struct intel_crtc_state *state)
- {
-       return drm_atomic_crtc_needs_modeset(&state->uapi);
- }
- static bool
  is_trans_port_sync_slave(const struct intel_crtc_state *crtc_state)
  {
        return crtc_state->master_transcoder != INVALID_TRANSCODER;
@@@ -994,7 -931,8 +931,8 @@@ chv_find_best_dpll(const struct intel_l
         * set to 2.  If requires to support 200Mhz refclk, we need to
         * revisit this because n may not 1 anymore.
         */
-       clock.n = 1, clock.m1 = 2;
+       clock.n = 1;
+       clock.m1 = 2;
        target *= 5;    /* fast clock */
  
        for (clock.p1 = limit->p1.max; clock.p1 >= limit->p1.min; clock.p1--) {
@@@ -2532,9 -2470,9 +2470,9 @@@ static u32 intel_compute_aligned_offset
        return offset_aligned;
  }
  
static u32 intel_plane_compute_aligned_offset(int *x, int *y,
-                                             const struct intel_plane_state *state,
-                                             int color_plane)
+ u32 intel_plane_compute_aligned_offset(int *x, int *y,
+                                      const struct intel_plane_state *state,
+                                      int color_plane)
  {
        struct intel_plane *intel_plane = to_intel_plane(state->uapi.plane);
        struct drm_i915_private *dev_priv = to_i915(intel_plane->base.dev);
@@@ -3271,7 -3209,7 +3209,7 @@@ intel_plane_remap_gtt(struct intel_plan
        }
  }
  
static int
+ int
  intel_plane_compute_gtt(struct intel_plane_state *plane_state)
  {
        const struct intel_framebuffer *fb =
@@@ -3551,7 -3489,7 +3489,7 @@@ intel_set_plane_visible(struct intel_cr
                crtc_state->uapi.plane_mask &= ~drm_plane_mask(&plane->base);
  }
  
- static void fixup_active_planes(struct intel_crtc_state *crtc_state)
+ static void fixup_plane_bitmasks(struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        struct drm_plane *plane;
         * have been used on the same (or wrong) pipe. plane_mask uses
         * unique ids, hence we can use that to reconstruct active_planes.
         */
+       crtc_state->enabled_planes = 0;
        crtc_state->active_planes = 0;
  
        drm_for_each_plane_mask(plane, &dev_priv->drm,
-                               crtc_state->uapi.plane_mask)
+                               crtc_state->uapi.plane_mask) {
+               crtc_state->enabled_planes |= BIT(to_intel_plane(plane)->id);
                crtc_state->active_planes |= BIT(to_intel_plane(plane)->id);
+       }
  }
  
  static void intel_plane_disable_noatomic(struct intel_crtc *crtc,
                    crtc->base.base.id, crtc->base.name);
  
        intel_set_plane_visible(crtc_state, plane_state, false);
-       fixup_active_planes(crtc_state);
+       fixup_plane_bitmasks(crtc_state);
        crtc_state->data_rate[plane->id] = 0;
        crtc_state->min_cdclk[plane->id] = 0;
  
        intel_disable_plane(plane, crtc_state);
  }
  
- static struct intel_frontbuffer *
- to_intel_frontbuffer(struct drm_framebuffer *fb)
- {
-       return fb ? to_intel_framebuffer(fb)->frontbuffer : NULL;
- }
  static void
  intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
                             struct intel_initial_plane_config *plane_config)
@@@ -4063,422 -3998,6 +3998,6 @@@ int skl_check_plane_surface(struct inte
        return 0;
  }
  
- static void i9xx_plane_ratio(const struct intel_crtc_state *crtc_state,
-                            const struct intel_plane_state *plane_state,
-                            unsigned int *num, unsigned int *den)
- {
-       const struct drm_framebuffer *fb = plane_state->hw.fb;
-       unsigned int cpp = fb->format->cpp[0];
-       /*
-        * g4x bspec says 64bpp pixel rate can't exceed 80%
-        * of cdclk when the sprite plane is enabled on the
-        * same pipe. ilk/snb bspec says 64bpp pixel rate is
-        * never allowed to exceed 80% of cdclk. Let's just go
-        * with the ilk/snb limit always.
-        */
-       if (cpp == 8) {
-               *num = 10;
-               *den = 8;
-       } else {
-               *num = 1;
-               *den = 1;
-       }
- }
- static int i9xx_plane_min_cdclk(const struct intel_crtc_state *crtc_state,
-                               const struct intel_plane_state *plane_state)
- {
-       unsigned int pixel_rate;
-       unsigned int num, den;
-       /*
-        * Note that crtc_state->pixel_rate accounts for both
-        * horizontal and vertical panel fitter downscaling factors.
-        * Pre-HSW bspec tells us to only consider the horizontal
-        * downscaling factor here. We ignore that and just consider
-        * both for simplicity.
-        */
-       pixel_rate = crtc_state->pixel_rate;
-       i9xx_plane_ratio(crtc_state, plane_state, &num, &den);
-       /* two pixels per clock with double wide pipe */
-       if (crtc_state->double_wide)
-               den *= 2;
-       return DIV_ROUND_UP(pixel_rate * num, den);
- }
- unsigned int
- i9xx_plane_max_stride(struct intel_plane *plane,
-                     u32 pixel_format, u64 modifier,
-                     unsigned int rotation)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       if (!HAS_GMCH(dev_priv)) {
-               return 32*1024;
-       } else if (INTEL_GEN(dev_priv) >= 4) {
-               if (modifier == I915_FORMAT_MOD_X_TILED)
-                       return 16*1024;
-               else
-                       return 32*1024;
-       } else if (INTEL_GEN(dev_priv) >= 3) {
-               if (modifier == I915_FORMAT_MOD_X_TILED)
-                       return 8*1024;
-               else
-                       return 16*1024;
-       } else {
-               if (plane->i9xx_plane == PLANE_C)
-                       return 4*1024;
-               else
-                       return 8*1024;
-       }
- }
- static u32 i9xx_plane_ctl_crtc(const struct intel_crtc_state *crtc_state)
- {
-       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-       u32 dspcntr = 0;
-       if (crtc_state->gamma_enable)
-               dspcntr |= DISPPLANE_GAMMA_ENABLE;
-       if (crtc_state->csc_enable)
-               dspcntr |= DISPPLANE_PIPE_CSC_ENABLE;
-       if (INTEL_GEN(dev_priv) < 5)
-               dspcntr |= DISPPLANE_SEL_PIPE(crtc->pipe);
-       return dspcntr;
- }
- static u32 i9xx_plane_ctl(const struct intel_crtc_state *crtc_state,
-                         const struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv =
-               to_i915(plane_state->uapi.plane->dev);
-       const struct drm_framebuffer *fb = plane_state->hw.fb;
-       unsigned int rotation = plane_state->hw.rotation;
-       u32 dspcntr;
-       dspcntr = DISPLAY_PLANE_ENABLE;
-       if (IS_G4X(dev_priv) || IS_GEN(dev_priv, 5) ||
-           IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv))
-               dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
-       switch (fb->format->format) {
-       case DRM_FORMAT_C8:
-               dspcntr |= DISPPLANE_8BPP;
-               break;
-       case DRM_FORMAT_XRGB1555:
-               dspcntr |= DISPPLANE_BGRX555;
-               break;
-       case DRM_FORMAT_ARGB1555:
-               dspcntr |= DISPPLANE_BGRA555;
-               break;
-       case DRM_FORMAT_RGB565:
-               dspcntr |= DISPPLANE_BGRX565;
-               break;
-       case DRM_FORMAT_XRGB8888:
-               dspcntr |= DISPPLANE_BGRX888;
-               break;
-       case DRM_FORMAT_XBGR8888:
-               dspcntr |= DISPPLANE_RGBX888;
-               break;
-       case DRM_FORMAT_ARGB8888:
-               dspcntr |= DISPPLANE_BGRA888;
-               break;
-       case DRM_FORMAT_ABGR8888:
-               dspcntr |= DISPPLANE_RGBA888;
-               break;
-       case DRM_FORMAT_XRGB2101010:
-               dspcntr |= DISPPLANE_BGRX101010;
-               break;
-       case DRM_FORMAT_XBGR2101010:
-               dspcntr |= DISPPLANE_RGBX101010;
-               break;
-       case DRM_FORMAT_ARGB2101010:
-               dspcntr |= DISPPLANE_BGRA101010;
-               break;
-       case DRM_FORMAT_ABGR2101010:
-               dspcntr |= DISPPLANE_RGBA101010;
-               break;
-       case DRM_FORMAT_XBGR16161616F:
-               dspcntr |= DISPPLANE_RGBX161616;
-               break;
-       default:
-               MISSING_CASE(fb->format->format);
-               return 0;
-       }
-       if (INTEL_GEN(dev_priv) >= 4 &&
-           fb->modifier == I915_FORMAT_MOD_X_TILED)
-               dspcntr |= DISPPLANE_TILED;
-       if (rotation & DRM_MODE_ROTATE_180)
-               dspcntr |= DISPPLANE_ROTATE_180;
-       if (rotation & DRM_MODE_REFLECT_X)
-               dspcntr |= DISPPLANE_MIRROR;
-       return dspcntr;
- }
- int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv =
-               to_i915(plane_state->uapi.plane->dev);
-       const struct drm_framebuffer *fb = plane_state->hw.fb;
-       int src_x, src_y, src_w;
-       u32 offset;
-       int ret;
-       ret = intel_plane_compute_gtt(plane_state);
-       if (ret)
-               return ret;
-       if (!plane_state->uapi.visible)
-               return 0;
-       src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
-       src_x = plane_state->uapi.src.x1 >> 16;
-       src_y = plane_state->uapi.src.y1 >> 16;
-       /* Undocumented hardware limit on i965/g4x/vlv/chv */
-       if (HAS_GMCH(dev_priv) && fb->format->cpp[0] == 8 && src_w > 2048)
-               return -EINVAL;
-       intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
-       if (INTEL_GEN(dev_priv) >= 4)
-               offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
-                                                           plane_state, 0);
-       else
-               offset = 0;
-       /*
-        * Put the final coordinates back so that the src
-        * coordinate checks will see the right values.
-        */
-       drm_rect_translate_to(&plane_state->uapi.src,
-                             src_x << 16, src_y << 16);
-       /* HSW/BDW do this automagically in hardware */
-       if (!IS_HASWELL(dev_priv) && !IS_BROADWELL(dev_priv)) {
-               unsigned int rotation = plane_state->hw.rotation;
-               int src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
-               int src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
-               if (rotation & DRM_MODE_ROTATE_180) {
-                       src_x += src_w - 1;
-                       src_y += src_h - 1;
-               } else if (rotation & DRM_MODE_REFLECT_X) {
-                       src_x += src_w - 1;
-               }
-       }
-       plane_state->color_plane[0].offset = offset;
-       plane_state->color_plane[0].x = src_x;
-       plane_state->color_plane[0].y = src_y;
-       return 0;
- }
- static bool i9xx_plane_has_windowing(struct intel_plane *plane)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
-       if (IS_CHERRYVIEW(dev_priv))
-               return i9xx_plane == PLANE_B;
-       else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
-               return false;
-       else if (IS_GEN(dev_priv, 4))
-               return i9xx_plane == PLANE_C;
-       else
-               return i9xx_plane == PLANE_B ||
-                       i9xx_plane == PLANE_C;
- }
- static int
- i9xx_plane_check(struct intel_crtc_state *crtc_state,
-                struct intel_plane_state *plane_state)
- {
-       struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
-       int ret;
-       ret = chv_plane_check_rotation(plane_state);
-       if (ret)
-               return ret;
-       ret = intel_atomic_plane_check_clipping(plane_state, crtc_state,
-                                               DRM_PLANE_HELPER_NO_SCALING,
-                                               DRM_PLANE_HELPER_NO_SCALING,
-                                               i9xx_plane_has_windowing(plane));
-       if (ret)
-               return ret;
-       ret = i9xx_check_plane_surface(plane_state);
-       if (ret)
-               return ret;
-       if (!plane_state->uapi.visible)
-               return 0;
-       ret = intel_plane_check_src_coordinates(plane_state);
-       if (ret)
-               return ret;
-       plane_state->ctl = i9xx_plane_ctl(crtc_state, plane_state);
-       return 0;
- }
- static void i9xx_update_plane(struct intel_plane *plane,
-                             const struct intel_crtc_state *crtc_state,
-                             const struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
-       u32 linear_offset;
-       int x = plane_state->color_plane[0].x;
-       int y = plane_state->color_plane[0].y;
-       int crtc_x = plane_state->uapi.dst.x1;
-       int crtc_y = plane_state->uapi.dst.y1;
-       int crtc_w = drm_rect_width(&plane_state->uapi.dst);
-       int crtc_h = drm_rect_height(&plane_state->uapi.dst);
-       unsigned long irqflags;
-       u32 dspaddr_offset;
-       u32 dspcntr;
-       dspcntr = plane_state->ctl | i9xx_plane_ctl_crtc(crtc_state);
-       linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
-       if (INTEL_GEN(dev_priv) >= 4)
-               dspaddr_offset = plane_state->color_plane[0].offset;
-       else
-               dspaddr_offset = linear_offset;
-       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
-       intel_de_write_fw(dev_priv, DSPSTRIDE(i9xx_plane),
-                         plane_state->color_plane[0].stride);
-       if (INTEL_GEN(dev_priv) < 4) {
-               /*
-                * PLANE_A doesn't actually have a full window
-                * generator but let's assume we still need to
-                * program whatever is there.
-                */
-               intel_de_write_fw(dev_priv, DSPPOS(i9xx_plane),
-                                 (crtc_y << 16) | crtc_x);
-               intel_de_write_fw(dev_priv, DSPSIZE(i9xx_plane),
-                                 ((crtc_h - 1) << 16) | (crtc_w - 1));
-       } else if (IS_CHERRYVIEW(dev_priv) && i9xx_plane == PLANE_B) {
-               intel_de_write_fw(dev_priv, PRIMPOS(i9xx_plane),
-                                 (crtc_y << 16) | crtc_x);
-               intel_de_write_fw(dev_priv, PRIMSIZE(i9xx_plane),
-                                 ((crtc_h - 1) << 16) | (crtc_w - 1));
-               intel_de_write_fw(dev_priv, PRIMCNSTALPHA(i9xx_plane), 0);
-       }
-       if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
-               intel_de_write_fw(dev_priv, DSPOFFSET(i9xx_plane),
-                                 (y << 16) | x);
-       } else if (INTEL_GEN(dev_priv) >= 4) {
-               intel_de_write_fw(dev_priv, DSPLINOFF(i9xx_plane),
-                                 linear_offset);
-               intel_de_write_fw(dev_priv, DSPTILEOFF(i9xx_plane),
-                                 (y << 16) | x);
-       }
-       /*
-        * The control register self-arms if the plane was previously
-        * disabled. Try to make the plane enable atomic by writing
-        * the control register just before the surface register.
-        */
-       intel_de_write_fw(dev_priv, DSPCNTR(i9xx_plane), dspcntr);
-       if (INTEL_GEN(dev_priv) >= 4)
-               intel_de_write_fw(dev_priv, DSPSURF(i9xx_plane),
-                                 intel_plane_ggtt_offset(plane_state) + dspaddr_offset);
-       else
-               intel_de_write_fw(dev_priv, DSPADDR(i9xx_plane),
-                                 intel_plane_ggtt_offset(plane_state) + dspaddr_offset);
-       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
- }
- static void i9xx_disable_plane(struct intel_plane *plane,
-                              const struct intel_crtc_state *crtc_state)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
-       unsigned long irqflags;
-       u32 dspcntr;
-       /*
-        * DSPCNTR pipe gamma enable on g4x+ and pipe csc
-        * enable on ilk+ affect the pipe bottom color as
-        * well, so we must configure them even if the plane
-        * is disabled.
-        *
-        * On pre-g4x there is no way to gamma correct the
-        * pipe bottom color but we'll keep on doing this
-        * anyway so that the crtc state readout works correctly.
-        */
-       dspcntr = i9xx_plane_ctl_crtc(crtc_state);
-       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
-       intel_de_write_fw(dev_priv, DSPCNTR(i9xx_plane), dspcntr);
-       if (INTEL_GEN(dev_priv) >= 4)
-               intel_de_write_fw(dev_priv, DSPSURF(i9xx_plane), 0);
-       else
-               intel_de_write_fw(dev_priv, DSPADDR(i9xx_plane), 0);
-       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
- }
- static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
-                                   enum pipe *pipe)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       enum intel_display_power_domain power_domain;
-       enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
-       intel_wakeref_t wakeref;
-       bool ret;
-       u32 val;
-       /*
-        * Not 100% correct for planes that can move between pipes,
-        * but that's only the case for gen2-4 which don't have any
-        * display power wells.
-        */
-       power_domain = POWER_DOMAIN_PIPE(plane->pipe);
-       wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
-       if (!wakeref)
-               return false;
-       val = intel_de_read(dev_priv, DSPCNTR(i9xx_plane));
-       ret = val & DISPLAY_PLANE_ENABLE;
-       if (INTEL_GEN(dev_priv) >= 5)
-               *pipe = plane->pipe;
-       else
-               *pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
-                       DISPPLANE_SEL_PIPE_SHIFT;
-       intel_display_power_put(dev_priv, power_domain, wakeref);
-       return ret;
- }
  static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
  {
        struct drm_device *dev = intel_crtc->base.dev;
@@@ -6470,7 -5989,7 +5989,7 @@@ static bool hsw_pre_update_disable_ips(
        if (!old_crtc_state->ips_enabled)
                return false;
  
-       if (needs_modeset(new_crtc_state))
+       if (intel_crtc_needs_modeset(new_crtc_state))
                return true;
  
        /*
@@@ -6497,7 -6016,7 +6016,7 @@@ static bool hsw_post_update_enable_ips(
        if (!new_crtc_state->ips_enabled)
                return false;
  
-       if (needs_modeset(new_crtc_state))
+       if (intel_crtc_needs_modeset(new_crtc_state))
                return true;
  
        /*
@@@ -6550,7 -6069,7 +6069,7 @@@ static bool needs_scalerclk_wa(const st
  static bool planes_enabling(const struct intel_crtc_state *old_crtc_state,
                            const struct intel_crtc_state *new_crtc_state)
  {
-       return (!old_crtc_state->active_planes || needs_modeset(new_crtc_state)) &&
+       return (!old_crtc_state->active_planes || intel_crtc_needs_modeset(new_crtc_state)) &&
                new_crtc_state->active_planes;
  }
  
@@@ -6558,7 -6077,7 +6077,7 @@@ static bool planes_disabling(const stru
                             const struct intel_crtc_state *new_crtc_state)
  {
        return old_crtc_state->active_planes &&
-               (!new_crtc_state->active_planes || needs_modeset(new_crtc_state));
+               (!new_crtc_state->active_planes || intel_crtc_needs_modeset(new_crtc_state));
  }
  
  static void intel_post_plane_update(struct intel_atomic_state *state,
@@@ -6681,7 -6200,7 +6200,7 @@@ static void intel_pre_plane_update(stru
         * If we're doing a modeset we don't need to do any
         * pre-vblank watermark programming here.
         */
-       if (!needs_modeset(new_crtc_state)) {
+       if (!intel_crtc_needs_modeset(new_crtc_state)) {
                /*
                 * For platforms that support atomic watermarks, program the
                 * 'intermediate' watermarks immediately.  On pre-gen9 platforms, these
@@@ -7575,25 -7094,25 +7094,25 @@@ modeset_get_crtc_power_domains(struct i
        enum intel_display_power_domain domain;
        u64 domains, new_domains, old_domains;
  
-       old_domains = crtc->enabled_power_domains;
-       crtc->enabled_power_domains = new_domains =
-               get_crtc_power_domains(crtc_state);
+       domains = get_crtc_power_domains(crtc_state);
  
-       domains = new_domains & ~old_domains;
+       new_domains = domains & ~crtc->enabled_power_domains.mask;
+       old_domains = crtc->enabled_power_domains.mask & ~domains;
  
-       for_each_power_domain(domain, domains)
-               intel_display_power_get(dev_priv, domain);
+       for_each_power_domain(domain, new_domains)
+               intel_display_power_get_in_set(dev_priv,
+                                              &crtc->enabled_power_domains,
+                                              domain);
  
-       return old_domains & ~new_domains;
+       return old_domains;
  }
  
- static void modeset_put_power_domains(struct drm_i915_private *dev_priv,
-                                     u64 domains)
+ static void modeset_put_crtc_power_domains(struct intel_crtc *crtc,
+                                          u64 domains)
  {
-       enum intel_display_power_domain domain;
-       for_each_power_domain(domain, domains)
-               intel_display_power_put_unchecked(dev_priv, domain);
+       intel_display_power_put_mask_in_set(to_i915(crtc->base.dev),
+                                           &crtc->enabled_power_domains,
+                                           domains);
  }
  
  static void valleyview_crtc_enable(struct intel_atomic_state *state,
@@@ -7789,12 -7308,10 +7308,10 @@@ static void intel_crtc_disable_noatomic
                to_intel_dbuf_state(dev_priv->dbuf.obj.state);
        struct intel_crtc_state *crtc_state =
                to_intel_crtc_state(crtc->base.state);
-       enum intel_display_power_domain domain;
        struct intel_plane *plane;
        struct drm_atomic_state *state;
        struct intel_crtc_state *temp_crtc_state;
        enum pipe pipe = crtc->pipe;
-       u64 domains;
        int ret;
  
        if (!crtc_state->hw.active)
        intel_update_watermarks(crtc);
        intel_disable_shared_dpll(crtc_state);
  
-       domains = crtc->enabled_power_domains;
-       for_each_power_domain(domain, domains)
-               intel_display_power_put_unchecked(dev_priv, domain);
-       crtc->enabled_power_domains = 0;
+       intel_display_power_put_all_in_set(dev_priv, &crtc->enabled_power_domains);
  
        dev_priv->active_pipes &= ~BIT(pipe);
        cdclk_state->min_cdclk[pipe] = 0;
@@@ -11226,16 -10740,13 +10740,13 @@@ static void hsw_get_ddi_pll(struct drm_
  
  static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
                                     struct intel_crtc_state *pipe_config,
-                                    u64 *power_domain_mask,
-                                    intel_wakeref_t *wakerefs)
+                                    struct intel_display_power_domain_set *power_domain_set)
  {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
-       enum intel_display_power_domain power_domain;
        unsigned long panel_transcoder_mask = BIT(TRANSCODER_EDP);
        unsigned long enabled_panel_transcoders = 0;
        enum transcoder panel_transcoder;
-       intel_wakeref_t wf;
        u32 tmp;
  
        if (INTEL_GEN(dev_priv) >= 11)
        drm_WARN_ON(dev, (enabled_panel_transcoders & BIT(TRANSCODER_EDP)) &&
                    enabled_panel_transcoders != BIT(TRANSCODER_EDP));
  
-       power_domain = POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder);
-       drm_WARN_ON(dev, *power_domain_mask & BIT_ULL(power_domain));
-       wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
-       if (!wf)
+       if (!intel_display_power_get_in_set_if_enabled(dev_priv, power_domain_set,
+                                                      POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder)))
                return false;
  
-       wakerefs[power_domain] = wf;
-       *power_domain_mask |= BIT_ULL(power_domain);
        tmp = intel_de_read(dev_priv, PIPECONF(pipe_config->cpu_transcoder));
  
        return tmp & PIPECONF_ENABLE;
  
  static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc,
                                         struct intel_crtc_state *pipe_config,
-                                        u64 *power_domain_mask,
-                                        intel_wakeref_t *wakerefs)
+                                        struct intel_display_power_domain_set *power_domain_set)
  {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
-       enum intel_display_power_domain power_domain;
        enum transcoder cpu_transcoder;
-       intel_wakeref_t wf;
        enum port port;
        u32 tmp;
  
                else
                        cpu_transcoder = TRANSCODER_DSI_C;
  
-               power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
-               drm_WARN_ON(dev, *power_domain_mask & BIT_ULL(power_domain));
-               wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
-               if (!wf)
+               if (!intel_display_power_get_in_set_if_enabled(dev_priv, power_domain_set,
+                                                              POWER_DOMAIN_TRANSCODER(cpu_transcoder)))
                        continue;
  
-               wakerefs[power_domain] = wf;
-               *power_domain_mask |= BIT_ULL(power_domain);
                /*
                 * The PLL needs to be enabled with a valid divider
                 * configuration, otherwise accessing DSI registers will hang
@@@ -11432,30 -10928,22 +10928,22 @@@ static bool hsw_get_pipe_config(struct 
                                struct intel_crtc_state *pipe_config)
  {
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-       intel_wakeref_t wakerefs[POWER_DOMAIN_NUM], wf;
-       enum intel_display_power_domain power_domain;
-       u64 power_domain_mask;
+       struct intel_display_power_domain_set power_domain_set = { };
        bool active;
        u32 tmp;
  
        pipe_config->master_transcoder = INVALID_TRANSCODER;
  
-       power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
-       wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
-       if (!wf)
+       if (!intel_display_power_get_in_set_if_enabled(dev_priv, &power_domain_set,
+                                                      POWER_DOMAIN_PIPE(crtc->pipe)))
                return false;
  
-       wakerefs[power_domain] = wf;
-       power_domain_mask = BIT_ULL(power_domain);
        pipe_config->shared_dpll = NULL;
  
-       active = hsw_get_transcoder_state(crtc, pipe_config,
-                                         &power_domain_mask, wakerefs);
+       active = hsw_get_transcoder_state(crtc, pipe_config, &power_domain_set);
  
        if (IS_GEN9_LP(dev_priv) &&
-           bxt_get_dsi_transcoder_state(crtc, pipe_config,
-                                        &power_domain_mask, wakerefs)) {
+           bxt_get_dsi_transcoder_state(crtc, pipe_config, &power_domain_set)) {
                drm_WARN_ON(&dev_priv->drm, active);
                active = true;
        }
                pipe_config->ips_linetime =
                        REG_FIELD_GET(HSW_IPS_LINETIME_MASK, tmp);
  
-       power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
-       drm_WARN_ON(&dev_priv->drm, power_domain_mask & BIT_ULL(power_domain));
-       wf = intel_display_power_get_if_enabled(dev_priv, power_domain);
-       if (wf) {
-               wakerefs[power_domain] = wf;
-               power_domain_mask |= BIT_ULL(power_domain);
+       if (intel_display_power_get_in_set_if_enabled(dev_priv, &power_domain_set,
+                                                     POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe))) {
                if (INTEL_GEN(dev_priv) >= 9)
                        skl_get_pfit_config(pipe_config);
                else
                         * We cannot readout IPS state on broadwell, set to
                         * true so we can set it to a defined state on first
                         * commit.
-                        */
-                       pipe_config->ips_enabled = true;
-               }
-       }
-       if (pipe_config->bigjoiner_slave) {
-               /* Cannot be read out as a slave, set to 0. */
-               pipe_config->pixel_multiplier = 0;
-       } else if (pipe_config->cpu_transcoder != TRANSCODER_EDP &&
-           !transcoder_is_dsi(pipe_config->cpu_transcoder)) {
-               pipe_config->pixel_multiplier =
-                       intel_de_read(dev_priv,
-                                     PIPE_MULT(pipe_config->cpu_transcoder)) + 1;
-       } else {
-               pipe_config->pixel_multiplier = 1;
-       }
- out:
-       for_each_power_domain(power_domain, power_domain_mask)
-               intel_display_power_put(dev_priv,
-                                       power_domain, wakerefs[power_domain]);
-       return active;
- }
- static bool intel_crtc_get_pipe_config(struct intel_crtc_state *crtc_state)
- {
-       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-       struct drm_i915_private *i915 = to_i915(crtc->base.dev);
-       if (!i915->display.get_pipe_config(crtc, crtc_state))
-               return false;
-       crtc_state->hw.active = true;
-       intel_crtc_readout_derived_state(crtc_state);
-       return true;
- }
- static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv =
-               to_i915(plane_state->uapi.plane->dev);
-       const struct drm_framebuffer *fb = plane_state->hw.fb;
-       const struct drm_i915_gem_object *obj = intel_fb_obj(fb);
-       u32 base;
-       if (INTEL_INFO(dev_priv)->display.cursor_needs_physical)
-               base = sg_dma_address(obj->mm.pages->sgl);
-       else
-               base = intel_plane_ggtt_offset(plane_state);
-       return base + plane_state->color_plane[0].offset;
- }
- static u32 intel_cursor_position(const struct intel_plane_state *plane_state)
- {
-       int x = plane_state->uapi.dst.x1;
-       int y = plane_state->uapi.dst.y1;
-       u32 pos = 0;
-       if (x < 0) {
-               pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
-               x = -x;
-       }
-       pos |= x << CURSOR_X_SHIFT;
-       if (y < 0) {
-               pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT;
-               y = -y;
-       }
-       pos |= y << CURSOR_Y_SHIFT;
-       return pos;
- }
- static bool intel_cursor_size_ok(const struct intel_plane_state *plane_state)
- {
-       const struct drm_mode_config *config =
-               &plane_state->uapi.plane->dev->mode_config;
-       int width = drm_rect_width(&plane_state->uapi.dst);
-       int height = drm_rect_height(&plane_state->uapi.dst);
-       return width > 0 && width <= config->cursor_width &&
-               height > 0 && height <= config->cursor_height;
- }
- static int intel_cursor_check_surface(struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv =
-               to_i915(plane_state->uapi.plane->dev);
-       unsigned int rotation = plane_state->hw.rotation;
-       int src_x, src_y;
-       u32 offset;
-       int ret;
-       ret = intel_plane_compute_gtt(plane_state);
-       if (ret)
-               return ret;
-       if (!plane_state->uapi.visible)
-               return 0;
-       src_x = plane_state->uapi.src.x1 >> 16;
-       src_y = plane_state->uapi.src.y1 >> 16;
-       intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
-       offset = intel_plane_compute_aligned_offset(&src_x, &src_y,
-                                                   plane_state, 0);
-       if (src_x != 0 || src_y != 0) {
-               drm_dbg_kms(&dev_priv->drm,
-                           "Arbitrary cursor panning not supported\n");
-               return -EINVAL;
-       }
-       /*
-        * Put the final coordinates back so that the src
-        * coordinate checks will see the right values.
-        */
-       drm_rect_translate_to(&plane_state->uapi.src,
-                             src_x << 16, src_y << 16);
-       /* ILK+ do this automagically in hardware */
-       if (HAS_GMCH(dev_priv) && rotation & DRM_MODE_ROTATE_180) {
-               const struct drm_framebuffer *fb = plane_state->hw.fb;
-               int src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
-               int src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
-               offset += (src_h * src_w - 1) * fb->format->cpp[0];
-       }
-       plane_state->color_plane[0].offset = offset;
-       plane_state->color_plane[0].x = src_x;
-       plane_state->color_plane[0].y = src_y;
-       return 0;
- }
- static int intel_check_cursor(struct intel_crtc_state *crtc_state,
-                             struct intel_plane_state *plane_state)
- {
-       const struct drm_framebuffer *fb = plane_state->hw.fb;
-       struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev);
-       const struct drm_rect src = plane_state->uapi.src;
-       const struct drm_rect dst = plane_state->uapi.dst;
-       int ret;
-       if (fb && fb->modifier != DRM_FORMAT_MOD_LINEAR) {
-               drm_dbg_kms(&i915->drm, "cursor cannot be tiled\n");
-               return -EINVAL;
-       }
-       ret = intel_atomic_plane_check_clipping(plane_state, crtc_state,
-                                               DRM_PLANE_HELPER_NO_SCALING,
-                                               DRM_PLANE_HELPER_NO_SCALING,
-                                               true);
-       if (ret)
-               return ret;
-       /* Use the unclipped src/dst rectangles, which we program to hw */
-       plane_state->uapi.src = src;
-       plane_state->uapi.dst = dst;
-       ret = intel_cursor_check_surface(plane_state);
-       if (ret)
-               return ret;
-       if (!plane_state->uapi.visible)
-               return 0;
-       ret = intel_plane_check_src_coordinates(plane_state);
-       if (ret)
-               return ret;
-       return 0;
- }
- static unsigned int
- i845_cursor_max_stride(struct intel_plane *plane,
-                      u32 pixel_format, u64 modifier,
-                      unsigned int rotation)
- {
-       return 2048;
- }
- static u32 i845_cursor_ctl_crtc(const struct intel_crtc_state *crtc_state)
- {
-       u32 cntl = 0;
-       if (crtc_state->gamma_enable)
-               cntl |= CURSOR_GAMMA_ENABLE;
-       return cntl;
- }
- static u32 i845_cursor_ctl(const struct intel_crtc_state *crtc_state,
-                          const struct intel_plane_state *plane_state)
- {
-       return CURSOR_ENABLE |
-               CURSOR_FORMAT_ARGB |
-               CURSOR_STRIDE(plane_state->color_plane[0].stride);
- }
- static bool i845_cursor_size_ok(const struct intel_plane_state *plane_state)
- {
-       int width = drm_rect_width(&plane_state->uapi.dst);
-       /*
-        * 845g/865g are only limited by the width of their cursors,
-        * the height is arbitrary up to the precision of the register.
-        */
-       return intel_cursor_size_ok(plane_state) && IS_ALIGNED(width, 64);
- }
- static int i845_check_cursor(struct intel_crtc_state *crtc_state,
-                            struct intel_plane_state *plane_state)
- {
-       const struct drm_framebuffer *fb = plane_state->hw.fb;
-       struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev);
-       int ret;
-       ret = intel_check_cursor(crtc_state, plane_state);
-       if (ret)
-               return ret;
-       /* if we want to turn off the cursor ignore width and height */
-       if (!fb)
-               return 0;
-       /* Check for which cursor types we support */
-       if (!i845_cursor_size_ok(plane_state)) {
-               drm_dbg_kms(&i915->drm,
-                           "Cursor dimension %dx%d not supported\n",
-                           drm_rect_width(&plane_state->uapi.dst),
-                           drm_rect_height(&plane_state->uapi.dst));
-               return -EINVAL;
-       }
-       drm_WARN_ON(&i915->drm, plane_state->uapi.visible &&
-                   plane_state->color_plane[0].stride != fb->pitches[0]);
-       switch (fb->pitches[0]) {
-       case 256:
-       case 512:
-       case 1024:
-       case 2048:
-               break;
-       default:
-                drm_dbg_kms(&i915->drm, "Invalid cursor stride (%u)\n",
-                            fb->pitches[0]);
-               return -EINVAL;
-       }
-       plane_state->ctl = i845_cursor_ctl(crtc_state, plane_state);
-       return 0;
- }
- static void i845_update_cursor(struct intel_plane *plane,
-                              const struct intel_crtc_state *crtc_state,
-                              const struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       u32 cntl = 0, base = 0, pos = 0, size = 0;
-       unsigned long irqflags;
-       if (plane_state && plane_state->uapi.visible) {
-               unsigned int width = drm_rect_width(&plane_state->uapi.dst);
-               unsigned int height = drm_rect_height(&plane_state->uapi.dst);
-               cntl = plane_state->ctl |
-                       i845_cursor_ctl_crtc(crtc_state);
-               size = (height << 12) | width;
-               base = intel_cursor_base(plane_state);
-               pos = intel_cursor_position(plane_state);
-       }
-       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
-       /* On these chipsets we can only modify the base/size/stride
-        * whilst the cursor is disabled.
-        */
-       if (plane->cursor.base != base ||
-           plane->cursor.size != size ||
-           plane->cursor.cntl != cntl) {
-               intel_de_write_fw(dev_priv, CURCNTR(PIPE_A), 0);
-               intel_de_write_fw(dev_priv, CURBASE(PIPE_A), base);
-               intel_de_write_fw(dev_priv, CURSIZE, size);
-               intel_de_write_fw(dev_priv, CURPOS(PIPE_A), pos);
-               intel_de_write_fw(dev_priv, CURCNTR(PIPE_A), cntl);
-               plane->cursor.base = base;
-               plane->cursor.size = size;
-               plane->cursor.cntl = cntl;
-       } else {
-               intel_de_write_fw(dev_priv, CURPOS(PIPE_A), pos);
-       }
-       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
- }
- static void i845_disable_cursor(struct intel_plane *plane,
-                               const struct intel_crtc_state *crtc_state)
- {
-       i845_update_cursor(plane, crtc_state, NULL);
- }
- static bool i845_cursor_get_hw_state(struct intel_plane *plane,
-                                    enum pipe *pipe)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       enum intel_display_power_domain power_domain;
-       intel_wakeref_t wakeref;
-       bool ret;
-       power_domain = POWER_DOMAIN_PIPE(PIPE_A);
-       wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
-       if (!wakeref)
-               return false;
-       ret = intel_de_read(dev_priv, CURCNTR(PIPE_A)) & CURSOR_ENABLE;
-       *pipe = PIPE_A;
-       intel_display_power_put(dev_priv, power_domain, wakeref);
-       return ret;
- }
- static unsigned int
- i9xx_cursor_max_stride(struct intel_plane *plane,
-                      u32 pixel_format, u64 modifier,
-                      unsigned int rotation)
- {
-       return plane->base.dev->mode_config.cursor_width * 4;
- }
- static u32 i9xx_cursor_ctl_crtc(const struct intel_crtc_state *crtc_state)
- {
-       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-       u32 cntl = 0;
-       if (INTEL_GEN(dev_priv) >= 11)
-               return cntl;
-       if (crtc_state->gamma_enable)
-               cntl = MCURSOR_GAMMA_ENABLE;
-       if (crtc_state->csc_enable)
-               cntl |= MCURSOR_PIPE_CSC_ENABLE;
-       if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
-               cntl |= MCURSOR_PIPE_SELECT(crtc->pipe);
-       return cntl;
- }
- static u32 i9xx_cursor_ctl(const struct intel_crtc_state *crtc_state,
-                          const struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv =
-               to_i915(plane_state->uapi.plane->dev);
-       u32 cntl = 0;
-       if (IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv))
-               cntl |= MCURSOR_TRICKLE_FEED_DISABLE;
-       switch (drm_rect_width(&plane_state->uapi.dst)) {
-       case 64:
-               cntl |= MCURSOR_MODE_64_ARGB_AX;
-               break;
-       case 128:
-               cntl |= MCURSOR_MODE_128_ARGB_AX;
-               break;
-       case 256:
-               cntl |= MCURSOR_MODE_256_ARGB_AX;
-               break;
-       default:
-               MISSING_CASE(drm_rect_width(&plane_state->uapi.dst));
-               return 0;
-       }
-       if (plane_state->hw.rotation & DRM_MODE_ROTATE_180)
-               cntl |= MCURSOR_ROTATE_180;
-       return cntl;
- }
- static bool i9xx_cursor_size_ok(const struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv =
-               to_i915(plane_state->uapi.plane->dev);
-       int width = drm_rect_width(&plane_state->uapi.dst);
-       int height = drm_rect_height(&plane_state->uapi.dst);
-       if (!intel_cursor_size_ok(plane_state))
-               return false;
-       /* Cursor width is limited to a few power-of-two sizes */
-       switch (width) {
-       case 256:
-       case 128:
-       case 64:
-               break;
-       default:
-               return false;
-       }
-       /*
-        * IVB+ have CUR_FBC_CTL which allows an arbitrary cursor
-        * height from 8 lines up to the cursor width, when the
-        * cursor is not rotated. Everything else requires square
-        * cursors.
-        */
-       if (HAS_CUR_FBC(dev_priv) &&
-           plane_state->hw.rotation & DRM_MODE_ROTATE_0) {
-               if (height < 8 || height > width)
-                       return false;
-       } else {
-               if (height != width)
-                       return false;
-       }
-       return true;
- }
- static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
-                            struct intel_plane_state *plane_state)
- {
-       struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       const struct drm_framebuffer *fb = plane_state->hw.fb;
-       enum pipe pipe = plane->pipe;
-       int ret;
-       ret = intel_check_cursor(crtc_state, plane_state);
-       if (ret)
-               return ret;
-       /* if we want to turn off the cursor ignore width and height */
-       if (!fb)
-               return 0;
-       /* Check for which cursor types we support */
-       if (!i9xx_cursor_size_ok(plane_state)) {
-               drm_dbg(&dev_priv->drm,
-                       "Cursor dimension %dx%d not supported\n",
-                       drm_rect_width(&plane_state->uapi.dst),
-                       drm_rect_height(&plane_state->uapi.dst));
-               return -EINVAL;
-       }
-       drm_WARN_ON(&dev_priv->drm, plane_state->uapi.visible &&
-                   plane_state->color_plane[0].stride != fb->pitches[0]);
-       if (fb->pitches[0] !=
-           drm_rect_width(&plane_state->uapi.dst) * fb->format->cpp[0]) {
-               drm_dbg_kms(&dev_priv->drm,
-                           "Invalid cursor stride (%u) (cursor width %d)\n",
-                           fb->pitches[0],
-                           drm_rect_width(&plane_state->uapi.dst));
-               return -EINVAL;
-       }
-       /*
-        * There's something wrong with the cursor on CHV pipe C.
-        * If it straddles the left edge of the screen then
-        * moving it away from the edge or disabling it often
-        * results in a pipe underrun, and often that can lead to
-        * dead pipe (constant underrun reported, and it scans
-        * out just a solid color). To recover from that, the
-        * display power well must be turned off and on again.
-        * Refuse the put the cursor into that compromised position.
-        */
-       if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_C &&
-           plane_state->uapi.visible && plane_state->uapi.dst.x1 < 0) {
-               drm_dbg_kms(&dev_priv->drm,
-                           "CHV cursor C not allowed to straddle the left screen edge\n");
-               return -EINVAL;
-       }
-       plane_state->ctl = i9xx_cursor_ctl(crtc_state, plane_state);
-       return 0;
- }
- static void i9xx_update_cursor(struct intel_plane *plane,
-                              const struct intel_crtc_state *crtc_state,
-                              const struct intel_plane_state *plane_state)
- {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       enum pipe pipe = plane->pipe;
-       u32 cntl = 0, base = 0, pos = 0, fbc_ctl = 0;
-       unsigned long irqflags;
-       if (plane_state && plane_state->uapi.visible) {
-               unsigned width = drm_rect_width(&plane_state->uapi.dst);
-               unsigned height = drm_rect_height(&plane_state->uapi.dst);
-               cntl = plane_state->ctl |
-                       i9xx_cursor_ctl_crtc(crtc_state);
-               if (width != height)
-                       fbc_ctl = CUR_FBC_CTL_EN | (height - 1);
-               base = intel_cursor_base(plane_state);
-               pos = intel_cursor_position(plane_state);
-       }
-       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
-       /*
-        * On some platforms writing CURCNTR first will also
-        * cause CURPOS to be armed by the CURBASE write.
-        * Without the CURCNTR write the CURPOS write would
-        * arm itself. Thus we always update CURCNTR before
-        * CURPOS.
-        *
-        * On other platforms CURPOS always requires the
-        * CURBASE write to arm the update. Additonally
-        * a write to any of the cursor register will cancel
-        * an already armed cursor update. Thus leaving out
-        * the CURBASE write after CURPOS could lead to a
-        * cursor that doesn't appear to move, or even change
-        * shape. Thus we always write CURBASE.
-        *
-        * The other registers are armed by by the CURBASE write
-        * except when the plane is getting enabled at which time
-        * the CURCNTR write arms the update.
-        */
+                        */
+                       pipe_config->ips_enabled = true;
+               }
+       }
  
-       if (INTEL_GEN(dev_priv) >= 9)
-               skl_write_cursor_wm(plane, crtc_state);
-       if (!needs_modeset(crtc_state))
-               intel_psr2_program_plane_sel_fetch(plane, crtc_state, plane_state, 0);
-       if (plane->cursor.base != base ||
-           plane->cursor.size != fbc_ctl ||
-           plane->cursor.cntl != cntl) {
-               if (HAS_CUR_FBC(dev_priv))
-                       intel_de_write_fw(dev_priv, CUR_FBC_CTL(pipe),
-                                         fbc_ctl);
-               intel_de_write_fw(dev_priv, CURCNTR(pipe), cntl);
-               intel_de_write_fw(dev_priv, CURPOS(pipe), pos);
-               intel_de_write_fw(dev_priv, CURBASE(pipe), base);
-               plane->cursor.base = base;
-               plane->cursor.size = fbc_ctl;
-               plane->cursor.cntl = cntl;
+       if (pipe_config->bigjoiner_slave) {
+               /* Cannot be read out as a slave, set to 0. */
+               pipe_config->pixel_multiplier = 0;
+       } else if (pipe_config->cpu_transcoder != TRANSCODER_EDP &&
+           !transcoder_is_dsi(pipe_config->cpu_transcoder)) {
+               pipe_config->pixel_multiplier =
+                       intel_de_read(dev_priv,
+                                     PIPE_MULT(pipe_config->cpu_transcoder)) + 1;
        } else {
-               intel_de_write_fw(dev_priv, CURPOS(pipe), pos);
-               intel_de_write_fw(dev_priv, CURBASE(pipe), base);
+               pipe_config->pixel_multiplier = 1;
        }
  
-       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
- }
+ out:
+       intel_display_power_put_all_in_set(dev_priv, &power_domain_set);
  
- static void i9xx_disable_cursor(struct intel_plane *plane,
-                               const struct intel_crtc_state *crtc_state)
- {
-       i9xx_update_cursor(plane, crtc_state, NULL);
+       return active;
  }
  
- static bool i9xx_cursor_get_hw_state(struct intel_plane *plane,
-                                    enum pipe *pipe)
+ static bool intel_crtc_get_pipe_config(struct intel_crtc_state *crtc_state)
  {
-       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
-       enum intel_display_power_domain power_domain;
-       intel_wakeref_t wakeref;
-       bool ret;
-       u32 val;
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+       struct drm_i915_private *i915 = to_i915(crtc->base.dev);
  
-       /*
-        * Not 100% correct for planes that can move between pipes,
-        * but that's only the case for gen2-3 which don't have any
-        * display power wells.
-        */
-       power_domain = POWER_DOMAIN_PIPE(plane->pipe);
-       wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
-       if (!wakeref)
+       if (!i915->display.get_pipe_config(crtc, crtc_state))
                return false;
  
-       val = intel_de_read(dev_priv, CURCNTR(plane->pipe));
-       ret = val & MCURSOR_MODE;
-       if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
-               *pipe = plane->pipe;
-       else
-               *pipe = (val & MCURSOR_PIPE_SELECT_MASK) >>
-                       MCURSOR_PIPE_SELECT_SHIFT;
+       crtc_state->hw.active = true;
  
-       intel_display_power_put(dev_priv, power_domain, wakeref);
+       intel_crtc_readout_derived_state(crtc_state);
  
-       return ret;
+       return true;
  }
  
  /* VESA 640x480x72Hz mode to set on the pipe */
@@@ -12651,7 -11568,7 +11568,7 @@@ int intel_plane_atomic_calc_changes(con
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-       bool mode_changed = needs_modeset(crtc_state);
+       bool mode_changed = intel_crtc_needs_modeset(crtc_state);
        bool was_crtc_enabled = old_crtc_state->hw.active;
        bool is_crtc_enabled = crtc_state->hw.active;
        bool turn_off, turn_on, visible, was_visible;
@@@ -12842,6 -11759,7 +11759,7 @@@ static int icl_check_nv12_planes(struc
  
                plane_state->planar_linked_plane = NULL;
                if (plane_state->planar_slave && !plane_state->uapi.visible) {
+                       crtc_state->enabled_planes &= ~BIT(plane->id);
                        crtc_state->active_planes &= ~BIT(plane->id);
                        crtc_state->update_planes |= BIT(plane->id);
                }
  
                linked_state->planar_slave = true;
                linked_state->planar_linked_plane = plane;
+               crtc_state->enabled_planes |= BIT(linked->id);
                crtc_state->active_planes |= BIT(linked->id);
                crtc_state->update_planes |= BIT(linked->id);
                drm_dbg_kms(&dev_priv->drm, "Using %s as Y plane for %s\n",
@@@ -13013,7 -11932,7 +11932,7 @@@ static int intel_crtc_atomic_check(stru
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct intel_crtc_state *crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
-       bool mode_changed = needs_modeset(crtc_state);
+       bool mode_changed = intel_crtc_needs_modeset(crtc_state);
        int ret;
  
        if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv) &&
@@@ -14845,7 -13764,7 +13764,7 @@@ intel_modeset_verify_crtc(struct intel_
                          struct intel_crtc_state *old_crtc_state,
                          struct intel_crtc_state *new_crtc_state)
  {
-       if (!needs_modeset(new_crtc_state) && !new_crtc_state->update_pipe)
+       if (!intel_crtc_needs_modeset(new_crtc_state) && !new_crtc_state->update_pipe)
                return;
  
        verify_wm_state(crtc, new_crtc_state);
@@@ -14940,7 -13859,7 +13859,7 @@@ static void intel_modeset_clear_plls(st
                return;
  
        for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
-               if (!needs_modeset(new_crtc_state))
+               if (!intel_crtc_needs_modeset(new_crtc_state))
                        continue;
  
                intel_release_shared_dplls(state, crtc);
@@@ -14965,7 -13884,7 +13884,7 @@@ static int hsw_mode_set_planes_workarou
        /* look at all crtc's that are going to be enabled in during modeset */
        for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
                if (!crtc_state->hw.active ||
-                   !needs_modeset(crtc_state))
+                   !intel_crtc_needs_modeset(crtc_state))
                        continue;
  
                if (first_crtc_state) {
                crtc_state->hsw_workaround_pipe = INVALID_PIPE;
  
                if (!crtc_state->hw.active ||
-                   needs_modeset(crtc_state))
+                   intel_crtc_needs_modeset(crtc_state))
                        continue;
  
                /* 2 or more enabled crtcs means no need for w/a */
@@@ -15102,6 -14021,19 +14021,19 @@@ static int intel_crtc_add_planes_to_sta
        return 0;
  }
  
+ int intel_atomic_add_affected_planes(struct intel_atomic_state *state,
+                                    struct intel_crtc *crtc)
+ {
+       const struct intel_crtc_state *old_crtc_state =
+               intel_atomic_get_old_crtc_state(state, crtc);
+       const struct intel_crtc_state *new_crtc_state =
+               intel_atomic_get_new_crtc_state(state, crtc);
+       return intel_crtc_add_planes_to_state(state, crtc,
+                                             old_crtc_state->enabled_planes |
+                                             new_crtc_state->enabled_planes);
+ }
  static bool active_planes_affects_min_cdclk(struct drm_i915_private *dev_priv)
  {
        /* See {hsw,vlv,ivb}_plane_ratio() */
@@@ -15296,7 -14228,7 +14228,7 @@@ static bool intel_cpu_transcoders_need_
        for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
                if (new_crtc_state->hw.enable &&
                    transcoders & BIT(new_crtc_state->cpu_transcoder) &&
-                   needs_modeset(new_crtc_state))
+                   intel_crtc_needs_modeset(new_crtc_state))
                        return true;
        }
  
@@@ -15317,7 -14249,7 +14249,7 @@@ static int intel_atomic_check_bigjoiner
                slave = crtc;
                master = old_crtc_state->bigjoiner_linked_crtc;
                master_crtc_state = intel_atomic_get_new_crtc_state(state, master);
-               if (!master_crtc_state || !needs_modeset(master_crtc_state))
+               if (!master_crtc_state || !intel_crtc_needs_modeset(master_crtc_state))
                        goto claimed;
        }
  
@@@ -15355,21 -14287,16 +14287,16 @@@ claimed
        return -EINVAL;
  }
  
- static int kill_bigjoiner_slave(struct intel_atomic_state *state,
-                               struct intel_crtc_state *master_crtc_state)
+ static void kill_bigjoiner_slave(struct intel_atomic_state *state,
+                                struct intel_crtc_state *master_crtc_state)
  {
        struct intel_crtc_state *slave_crtc_state =
-               intel_atomic_get_crtc_state(&state->base,
-                                           master_crtc_state->bigjoiner_linked_crtc);
-       if (IS_ERR(slave_crtc_state))
-               return PTR_ERR(slave_crtc_state);
+               intel_atomic_get_new_crtc_state(state, master_crtc_state->bigjoiner_linked_crtc);
  
        slave_crtc_state->bigjoiner = master_crtc_state->bigjoiner = false;
        slave_crtc_state->bigjoiner_slave = master_crtc_state->bigjoiner_slave = false;
        slave_crtc_state->bigjoiner_linked_crtc = master_crtc_state->bigjoiner_linked_crtc = NULL;
        intel_crtc_copy_uapi_to_hw_state(state, slave_crtc_state);
-       return 0;
  }
  
  /**
@@@ -15401,7 -14328,7 +14328,7 @@@ static int intel_atomic_check_async(str
  
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
-               if (needs_modeset(new_crtc_state)) {
+               if (intel_crtc_needs_modeset(new_crtc_state)) {
                        drm_dbg_kms(&i915->drm, "Modeset Required. Async flip not supported\n");
                        return -EINVAL;
                }
  
  static int intel_bigjoiner_add_affected_crtcs(struct intel_atomic_state *state)
  {
-       const struct intel_crtc_state *crtc_state;
+       struct intel_crtc_state *crtc_state;
        struct intel_crtc *crtc;
        int i;
  
        for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
                struct intel_crtc_state *linked_crtc_state;
+               struct intel_crtc *linked_crtc;
+               int ret;
  
                if (!crtc_state->bigjoiner)
                        continue;
  
-               linked_crtc_state = intel_atomic_get_crtc_state(&state->base,
-                                                               crtc_state->bigjoiner_linked_crtc);
+               linked_crtc = crtc_state->bigjoiner_linked_crtc;
+               linked_crtc_state = intel_atomic_get_crtc_state(&state->base, linked_crtc);
                if (IS_ERR(linked_crtc_state))
                        return PTR_ERR(linked_crtc_state);
+               if (!intel_crtc_needs_modeset(crtc_state))
+                       continue;
+               linked_crtc_state->uapi.mode_changed = true;
+               ret = drm_atomic_add_affected_connectors(&state->base,
+                                                        &linked_crtc->base);
+               if (ret)
+                       return ret;
+               ret = intel_atomic_add_affected_planes(state, linked_crtc);
+               if (ret)
+                       return ret;
+       }
+       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
+               /* Kill old bigjoiner link, we may re-establish afterwards */
+               if (intel_crtc_needs_modeset(crtc_state) &&
+                   crtc_state->bigjoiner && !crtc_state->bigjoiner_slave)
+                       kill_bigjoiner_slave(state, crtc_state);
        }
  
        return 0;
@@@ -15557,20 -14507,13 +14507,13 @@@ static int intel_atomic_check(struct dr
  
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
-               if (!needs_modeset(new_crtc_state)) {
+               if (!intel_crtc_needs_modeset(new_crtc_state)) {
                        /* Light copy */
                        intel_crtc_copy_uapi_to_hw_state_nomodeset(state, new_crtc_state);
  
                        continue;
                }
  
-               /* Kill old bigjoiner link, we may re-establish afterwards */
-               if (old_crtc_state->bigjoiner && !old_crtc_state->bigjoiner_slave) {
-                       ret = kill_bigjoiner_slave(state, new_crtc_state);
-                       if (ret)
-                               goto fail;
-               }
                if (!new_crtc_state->uapi.enable) {
                        if (!new_crtc_state->bigjoiner_slave) {
                                intel_crtc_copy_uapi_to_hw_state(state, new_crtc_state);
  
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
-               if (!needs_modeset(new_crtc_state))
+               if (!intel_crtc_needs_modeset(new_crtc_state))
                        continue;
  
                ret = intel_modeset_pipe_config_late(new_crtc_state);
         * forced a full modeset.
         */
        for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
-               if (!new_crtc_state->hw.enable || needs_modeset(new_crtc_state))
+               if (!new_crtc_state->hw.enable || intel_crtc_needs_modeset(new_crtc_state))
                        continue;
  
                if (intel_dp_mst_is_slave_trans(new_crtc_state)) {
                                new_crtc_state->update_pipe = false;
                        }
                }
+               if (new_crtc_state->bigjoiner) {
+                       struct intel_crtc_state *linked_crtc_state =
+                               intel_atomic_get_new_crtc_state(state, new_crtc_state->bigjoiner_linked_crtc);
+                       if (intel_crtc_needs_modeset(linked_crtc_state)) {
+                               new_crtc_state->uapi.mode_changed = true;
+                               new_crtc_state->update_pipe = false;
+                       }
+               }
        }
  
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
-               if (needs_modeset(new_crtc_state)) {
+               if (intel_crtc_needs_modeset(new_crtc_state)) {
                        any_ms = true;
                        continue;
                }
                                goto fail;
                }
  
-               if (!needs_modeset(new_crtc_state) &&
+               if (!intel_crtc_needs_modeset(new_crtc_state) &&
                    !new_crtc_state->update_pipe)
                        continue;
  
                intel_dump_pipe_config(new_crtc_state, state,
-                                      needs_modeset(new_crtc_state) ?
+                                      intel_crtc_needs_modeset(new_crtc_state) ?
                                       "[modeset]" : "[fastset]");
        }
  
@@@ -15758,7 -14711,7 +14711,7 @@@ static int intel_atomic_prepare_commit(
                return ret;
  
        for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
-               bool mode_changed = needs_modeset(crtc_state);
+               bool mode_changed = intel_crtc_needs_modeset(crtc_state);
  
                if (mode_changed || crtc_state->update_pipe ||
                    crtc_state->uapi.color_mgmt_changed) {
@@@ -15849,7 -14802,7 +14802,7 @@@ static void commit_pipe_config(struct i
                intel_atomic_get_old_crtc_state(state, crtc);
        const struct intel_crtc_state *new_crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
-       bool modeset = needs_modeset(new_crtc_state);
+       bool modeset = intel_crtc_needs_modeset(new_crtc_state);
  
        /*
         * During modesets pipe configuration was programmed as the
@@@ -15883,7 -14836,7 +14836,7 @@@ static void intel_enable_crtc(struct in
        const struct intel_crtc_state *new_crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
  
-       if (!needs_modeset(new_crtc_state))
+       if (!intel_crtc_needs_modeset(new_crtc_state))
                return;
  
        intel_crtc_update_active_timings(new_crtc_state);
@@@ -15905,7 -14858,7 +14858,7 @@@ static void intel_update_crtc(struct in
                intel_atomic_get_old_crtc_state(state, crtc);
        struct intel_crtc_state *new_crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
-       bool modeset = needs_modeset(new_crtc_state);
+       bool modeset = intel_crtc_needs_modeset(new_crtc_state);
  
        if (!modeset) {
                if (new_crtc_state->preload_luts &&
@@@ -15997,7 -14950,7 +14950,7 @@@ static void intel_commit_modeset_disabl
        /* Only disable port sync and MST slaves */
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
-               if (!needs_modeset(new_crtc_state) || old_crtc_state->bigjoiner)
+               if (!intel_crtc_needs_modeset(new_crtc_state) || old_crtc_state->bigjoiner)
                        continue;
  
                if (!old_crtc_state->hw.active)
        /* Disable everything else left on */
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
-               if (!needs_modeset(new_crtc_state) ||
+               if (!intel_crtc_needs_modeset(new_crtc_state) ||
                    (handled & BIT(crtc->pipe)) ||
                    old_crtc_state->bigjoiner_slave)
                        continue;
@@@ -16071,7 -15024,7 +15024,7 @@@ static void skl_commit_modeset_enables(
                        continue;
  
                /* ignore allocations for crtc's that have been turned off. */
-               if (!needs_modeset(new_crtc_state)) {
+               if (!intel_crtc_needs_modeset(new_crtc_state)) {
                        entries[pipe] = old_crtc_state->wm.skl.ddb;
                        update_pipes |= BIT(pipe);
                } else {
@@@ -16266,7 -15219,7 +15219,7 @@@ static void intel_atomic_commit_tail(st
  
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
-               if (needs_modeset(new_crtc_state) ||
+               if (intel_crtc_needs_modeset(new_crtc_state) ||
                    new_crtc_state->update_pipe) {
  
                        put_domains[crtc->pipe] =
  
        /* Complete the events for pipes that have now been disabled */
        for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
-               bool modeset = needs_modeset(new_crtc_state);
+               bool modeset = intel_crtc_needs_modeset(new_crtc_state);
  
                /* Complete events for now disable pipes here. */
                if (modeset && !new_crtc_state->hw.active && new_crtc_state->uapi.event) {
                        skl_disable_flip_done(crtc);
  
                if (new_crtc_state->hw.active &&
-                   !needs_modeset(new_crtc_state) &&
+                   !intel_crtc_needs_modeset(new_crtc_state) &&
                    !new_crtc_state->preload_luts &&
                    (new_crtc_state->uapi.color_mgmt_changed ||
                     new_crtc_state->update_pipe))
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
                intel_post_plane_update(state, crtc);
  
-               if (put_domains[i])
-                       modeset_put_power_domains(dev_priv, put_domains[i]);
+               modeset_put_crtc_power_domains(crtc, put_domains[crtc->pipe]);
  
                intel_modeset_verify_crtc(crtc, state, old_crtc_state, new_crtc_state);
  
@@@ -16620,7 -15572,7 +15572,7 @@@ static void add_rps_boost_after_vblank(
        add_wait_queue(drm_crtc_vblank_waitqueue(crtc), &wait->wait);
  }
  
static int intel_plane_pin_fb(struct intel_plane_state *plane_state)
+ int intel_plane_pin_fb(struct intel_plane_state *plane_state)
  {
        struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        return 0;
  }
  
static void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
+ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
  {
        struct i915_vma *vma;
  
@@@ -16712,7 -15664,7 +15664,7 @@@ intel_prepare_plane_fb(struct drm_plan
                 * This should only fail upon a hung GPU, in which case we
                 * can safely continue.
                 */
-               if (needs_modeset(crtc_state)) {
+               if (intel_crtc_needs_modeset(crtc_state)) {
                        ret = i915_sw_fence_await_reservation(&state->commit_ready,
                                                              old_obj->base.resv, NULL,
                                                              false, 0,
@@@ -16833,440 -15785,14 +15785,13 @@@ void intel_plane_destroy(struct drm_pla
        kfree(to_intel_plane(plane));
  }
  
- static bool i8xx_plane_format_mod_supported(struct drm_plane *_plane,
-                                           u32 format, u64 modifier)
- {
-       switch (modifier) {
-       case DRM_FORMAT_MOD_LINEAR:
-       case I915_FORMAT_MOD_X_TILED:
-               break;
-       default:
-               return false;
-       }
-       switch (format) {
-       case DRM_FORMAT_C8:
-       case DRM_FORMAT_RGB565:
-       case DRM_FORMAT_XRGB1555:
-       case DRM_FORMAT_XRGB8888:
-               return modifier == DRM_FORMAT_MOD_LINEAR ||
-                       modifier == I915_FORMAT_MOD_X_TILED;
-       default:
-               return false;
-       }
- }
- static bool i965_plane_format_mod_supported(struct drm_plane *_plane,
-                                           u32 format, u64 modifier)
- {
-       switch (modifier) {
-       case DRM_FORMAT_MOD_LINEAR:
-       case I915_FORMAT_MOD_X_TILED:
-               break;
-       default:
-               return false;
-       }
-       switch (format) {
-       case DRM_FORMAT_C8:
-       case DRM_FORMAT_RGB565:
-       case DRM_FORMAT_XRGB8888:
-       case DRM_FORMAT_XBGR8888:
-       case DRM_FORMAT_ARGB8888:
-       case DRM_FORMAT_ABGR8888:
-       case DRM_FORMAT_XRGB2101010:
-       case DRM_FORMAT_XBGR2101010:
-       case DRM_FORMAT_ARGB2101010:
-       case DRM_FORMAT_ABGR2101010:
-       case DRM_FORMAT_XBGR16161616F:
-               return modifier == DRM_FORMAT_MOD_LINEAR ||
-                       modifier == I915_FORMAT_MOD_X_TILED;
-       default:
-               return false;
-       }
- }
- static bool intel_cursor_format_mod_supported(struct drm_plane *_plane,
-                                             u32 format, u64 modifier)
- {
-       return modifier == DRM_FORMAT_MOD_LINEAR &&
-               format == DRM_FORMAT_ARGB8888;
- }
- static const struct drm_plane_funcs i965_plane_funcs = {
-       .update_plane = drm_atomic_helper_update_plane,
-       .disable_plane = drm_atomic_helper_disable_plane,
-       .destroy = intel_plane_destroy,
-       .atomic_duplicate_state = intel_plane_duplicate_state,
-       .atomic_destroy_state = intel_plane_destroy_state,
-       .format_mod_supported = i965_plane_format_mod_supported,
- };
- static const struct drm_plane_funcs i8xx_plane_funcs = {
-       .update_plane = drm_atomic_helper_update_plane,
-       .disable_plane = drm_atomic_helper_disable_plane,
-       .destroy = intel_plane_destroy,
-       .atomic_duplicate_state = intel_plane_duplicate_state,
-       .atomic_destroy_state = intel_plane_destroy_state,
-       .format_mod_supported = i8xx_plane_format_mod_supported,
- };
- static int
- intel_legacy_cursor_update(struct drm_plane *_plane,
-                          struct drm_crtc *_crtc,
-                          struct drm_framebuffer *fb,
-                          int crtc_x, int crtc_y,
-                          unsigned int crtc_w, unsigned int crtc_h,
-                          u32 src_x, u32 src_y,
-                          u32 src_w, u32 src_h,
-                          struct drm_modeset_acquire_ctx *ctx)
- {
-       struct intel_plane *plane = to_intel_plane(_plane);
-       struct intel_crtc *crtc = to_intel_crtc(_crtc);
-       struct intel_plane_state *old_plane_state =
-               to_intel_plane_state(plane->base.state);
-       struct intel_plane_state *new_plane_state;
-       struct intel_crtc_state *crtc_state =
-               to_intel_crtc_state(crtc->base.state);
-       struct intel_crtc_state *new_crtc_state;
-       int ret;
-       /*
-        * When crtc is inactive or there is a modeset pending,
-        * wait for it to complete in the slowpath
-        *
-        * FIXME bigjoiner fastpath would be good
-        */
-       if (!crtc_state->hw.active || needs_modeset(crtc_state) ||
-           crtc_state->update_pipe || crtc_state->bigjoiner)
-               goto slow;
-       /*
-        * Don't do an async update if there is an outstanding commit modifying
-        * the plane.  This prevents our async update's changes from getting
-        * overridden by a previous synchronous update's state.
-        */
-       if (old_plane_state->uapi.commit &&
-           !try_wait_for_completion(&old_plane_state->uapi.commit->hw_done))
-               goto slow;
-       /*
-        * If any parameters change that may affect watermarks,
-        * take the slowpath. Only changing fb or position should be
-        * in the fastpath.
-        */
-       if (old_plane_state->uapi.crtc != &crtc->base ||
-           old_plane_state->uapi.src_w != src_w ||
-           old_plane_state->uapi.src_h != src_h ||
-           old_plane_state->uapi.crtc_w != crtc_w ||
-           old_plane_state->uapi.crtc_h != crtc_h ||
-           !old_plane_state->uapi.fb != !fb)
-               goto slow;
-       new_plane_state = to_intel_plane_state(intel_plane_duplicate_state(&plane->base));
-       if (!new_plane_state)
-               return -ENOMEM;
-       new_crtc_state = to_intel_crtc_state(intel_crtc_duplicate_state(&crtc->base));
-       if (!new_crtc_state) {
-               ret = -ENOMEM;
-               goto out_free;
-       }
-       drm_atomic_set_fb_for_plane(&new_plane_state->uapi, fb);
-       new_plane_state->uapi.src_x = src_x;
-       new_plane_state->uapi.src_y = src_y;
-       new_plane_state->uapi.src_w = src_w;
-       new_plane_state->uapi.src_h = src_h;
-       new_plane_state->uapi.crtc_x = crtc_x;
-       new_plane_state->uapi.crtc_y = crtc_y;
-       new_plane_state->uapi.crtc_w = crtc_w;
-       new_plane_state->uapi.crtc_h = crtc_h;
-       intel_plane_copy_uapi_to_hw_state(new_plane_state, new_plane_state, crtc);
-       ret = intel_plane_atomic_check_with_state(crtc_state, new_crtc_state,
-                                                 old_plane_state, new_plane_state);
-       if (ret)
-               goto out_free;
-       ret = intel_plane_pin_fb(new_plane_state);
-       if (ret)
-               goto out_free;
-       intel_frontbuffer_flush(to_intel_frontbuffer(new_plane_state->hw.fb),
-                               ORIGIN_FLIP);
-       intel_frontbuffer_track(to_intel_frontbuffer(old_plane_state->hw.fb),
-                               to_intel_frontbuffer(new_plane_state->hw.fb),
-                               plane->frontbuffer_bit);
-       /* Swap plane state */
-       plane->base.state = &new_plane_state->uapi;
-       /*
-        * We cannot swap crtc_state as it may be in use by an atomic commit or
-        * page flip that's running simultaneously. If we swap crtc_state and
-        * destroy the old state, we will cause a use-after-free there.
-        *
-        * Only update active_planes, which is needed for our internal
-        * bookkeeping. Either value will do the right thing when updating
-        * planes atomically. If the cursor was part of the atomic update then
-        * we would have taken the slowpath.
-        */
-       crtc_state->active_planes = new_crtc_state->active_planes;
-       if (new_plane_state->uapi.visible)
-               intel_update_plane(plane, crtc_state, new_plane_state);
-       else
-               intel_disable_plane(plane, crtc_state);
-       intel_plane_unpin_fb(old_plane_state);
- out_free:
-       if (new_crtc_state)
-               intel_crtc_destroy_state(&crtc->base, &new_crtc_state->uapi);
-       if (ret)
-               intel_plane_destroy_state(&plane->base, &new_plane_state->uapi);
-       else
-               intel_plane_destroy_state(&plane->base, &old_plane_state->uapi);
-       return ret;
- slow:
-       return drm_atomic_helper_update_plane(&plane->base, &crtc->base, fb,
-                                             crtc_x, crtc_y, crtc_w, crtc_h,
-                                             src_x, src_y, src_w, src_h, ctx);
- }
- static const struct drm_plane_funcs intel_cursor_plane_funcs = {
-       .update_plane = intel_legacy_cursor_update,
-       .disable_plane = drm_atomic_helper_disable_plane,
-       .destroy = intel_plane_destroy,
-       .atomic_duplicate_state = intel_plane_duplicate_state,
-       .atomic_destroy_state = intel_plane_destroy_state,
-       .format_mod_supported = intel_cursor_format_mod_supported,
- };
- static bool i9xx_plane_has_fbc(struct drm_i915_private *dev_priv,
-                              enum i9xx_plane_id i9xx_plane)
- {
-       if (!HAS_FBC(dev_priv))
-               return false;
-       if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
-               return i9xx_plane == PLANE_A; /* tied to pipe A */
-       else if (IS_IVYBRIDGE(dev_priv))
-               return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B ||
-                       i9xx_plane == PLANE_C;
-       else if (INTEL_GEN(dev_priv) >= 4)
-               return i9xx_plane == PLANE_A || i9xx_plane == PLANE_B;
-       else
-               return i9xx_plane == PLANE_A;
- }
- static struct intel_plane *
- intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
- {
-       struct intel_plane *plane;
-       const struct drm_plane_funcs *plane_funcs;
-       unsigned int supported_rotations;
-       const u32 *formats;
-       int num_formats;
-       int ret, zpos;
-       if (INTEL_GEN(dev_priv) >= 9)
-               return skl_universal_plane_create(dev_priv, pipe,
-                                                 PLANE_PRIMARY);
-       plane = intel_plane_alloc();
-       if (IS_ERR(plane))
-               return plane;
-       plane->pipe = pipe;
-       /*
-        * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS
-        * port is hooked to pipe B. Hence we want plane A feeding pipe B.
-        */
-       if (HAS_FBC(dev_priv) && INTEL_GEN(dev_priv) < 4 &&
-           INTEL_NUM_PIPES(dev_priv) == 2)
-               plane->i9xx_plane = (enum i9xx_plane_id) !pipe;
-       else
-               plane->i9xx_plane = (enum i9xx_plane_id) pipe;
-       plane->id = PLANE_PRIMARY;
-       plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
-       plane->has_fbc = i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane);
-       if (plane->has_fbc) {
-               struct intel_fbc *fbc = &dev_priv->fbc;
-               fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
-       }
-       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
-               formats = vlv_primary_formats;
-               num_formats = ARRAY_SIZE(vlv_primary_formats);
-       } else if (INTEL_GEN(dev_priv) >= 4) {
-               /*
-                * WaFP16GammaEnabling:ivb
-                * "Workaround : When using the 64-bit format, the plane
-                *  output on each color channel has one quarter amplitude.
-                *  It can be brought up to full amplitude by using pipe
-                *  gamma correction or pipe color space conversion to
-                *  multiply the plane output by four."
-                *
-                * There is no dedicated plane gamma for the primary plane,
-                * and using the pipe gamma/csc could conflict with other
-                * planes, so we choose not to expose fp16 on IVB primary
-                * planes. HSW primary planes no longer have this problem.
-                */
-               if (IS_IVYBRIDGE(dev_priv)) {
-                       formats = ivb_primary_formats;
-                       num_formats = ARRAY_SIZE(ivb_primary_formats);
-               } else {
-                       formats = i965_primary_formats;
-                       num_formats = ARRAY_SIZE(i965_primary_formats);
-               }
-       } else {
-               formats = i8xx_primary_formats;
-               num_formats = ARRAY_SIZE(i8xx_primary_formats);
-       }
-       if (INTEL_GEN(dev_priv) >= 4)
-               plane_funcs = &i965_plane_funcs;
-       else
-               plane_funcs = &i8xx_plane_funcs;
-       if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
-               plane->min_cdclk = vlv_plane_min_cdclk;
-       else if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
-               plane->min_cdclk = hsw_plane_min_cdclk;
-       else if (IS_IVYBRIDGE(dev_priv))
-               plane->min_cdclk = ivb_plane_min_cdclk;
-       else
-               plane->min_cdclk = i9xx_plane_min_cdclk;
-       plane->max_stride = i9xx_plane_max_stride;
-       plane->update_plane = i9xx_update_plane;
-       plane->disable_plane = i9xx_disable_plane;
-       plane->get_hw_state = i9xx_plane_get_hw_state;
-       plane->check_plane = i9xx_plane_check;
-       if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
-               ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
-                                              0, plane_funcs,
-                                              formats, num_formats,
-                                              i9xx_format_modifiers,
-                                              DRM_PLANE_TYPE_PRIMARY,
-                                              "primary %c", pipe_name(pipe));
-       else
-               ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
-                                              0, plane_funcs,
-                                              formats, num_formats,
-                                              i9xx_format_modifiers,
-                                              DRM_PLANE_TYPE_PRIMARY,
-                                              "plane %c",
-                                              plane_name(plane->i9xx_plane));
-       if (ret)
-               goto fail;
-       if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
-               supported_rotations =
-                       DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
-                       DRM_MODE_REFLECT_X;
-       } else if (INTEL_GEN(dev_priv) >= 4) {
-               supported_rotations =
-                       DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180;
-       } else {
-               supported_rotations = DRM_MODE_ROTATE_0;
-       }
-       if (INTEL_GEN(dev_priv) >= 4)
-               drm_plane_create_rotation_property(&plane->base,
-                                                  DRM_MODE_ROTATE_0,
-                                                  supported_rotations);
-       zpos = 0;
-       drm_plane_create_zpos_immutable_property(&plane->base, zpos);
-       drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
-       return plane;
- fail:
-       intel_plane_free(plane);
-       return ERR_PTR(ret);
- }
- static struct intel_plane *
- intel_cursor_plane_create(struct drm_i915_private *dev_priv,
-                         enum pipe pipe)
+ static int intel_crtc_late_register(struct drm_crtc *crtc)
  {
-       struct intel_plane *cursor;
-       int ret, zpos;
-       cursor = intel_plane_alloc();
-       if (IS_ERR(cursor))
-               return cursor;
-       cursor->pipe = pipe;
-       cursor->i9xx_plane = (enum i9xx_plane_id) pipe;
-       cursor->id = PLANE_CURSOR;
-       cursor->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, cursor->id);
-       if (IS_I845G(dev_priv) || IS_I865G(dev_priv)) {
-               cursor->max_stride = i845_cursor_max_stride;
-               cursor->update_plane = i845_update_cursor;
-               cursor->disable_plane = i845_disable_cursor;
-               cursor->get_hw_state = i845_cursor_get_hw_state;
-               cursor->check_plane = i845_check_cursor;
-       } else {
-               cursor->max_stride = i9xx_cursor_max_stride;
-               cursor->update_plane = i9xx_update_cursor;
-               cursor->disable_plane = i9xx_disable_cursor;
-               cursor->get_hw_state = i9xx_cursor_get_hw_state;
-               cursor->check_plane = i9xx_check_cursor;
-       }
-       cursor->cursor.base = ~0;
-       cursor->cursor.cntl = ~0;
-       if (IS_I845G(dev_priv) || IS_I865G(dev_priv) || HAS_CUR_FBC(dev_priv))
-               cursor->cursor.size = ~0;
-       ret = drm_universal_plane_init(&dev_priv->drm, &cursor->base,
-                                      0, &intel_cursor_plane_funcs,
-                                      intel_cursor_formats,
-                                      ARRAY_SIZE(intel_cursor_formats),
-                                      cursor_format_modifiers,
-                                      DRM_PLANE_TYPE_CURSOR,
-                                      "cursor %c", pipe_name(pipe));
-       if (ret)
-               goto fail;
-       if (INTEL_GEN(dev_priv) >= 4)
-               drm_plane_create_rotation_property(&cursor->base,
-                                                  DRM_MODE_ROTATE_0,
-                                                  DRM_MODE_ROTATE_0 |
-                                                  DRM_MODE_ROTATE_180);
-       zpos = RUNTIME_INFO(dev_priv)->num_sprites[pipe] + 1;
-       drm_plane_create_zpos_immutable_property(&cursor->base, zpos);
-       if (INTEL_GEN(dev_priv) >= 12)
-               drm_plane_enable_fb_damage_clips(&cursor->base);
-       drm_plane_helper_add(&cursor->base, &intel_plane_helper_funcs);
-       return cursor;
- fail:
-       intel_plane_free(cursor);
-       return ERR_PTR(ret);
+       intel_crtc_debugfs_add(crtc);
+       return 0;
  }
  
  #define INTEL_CRTC_FUNCS \
 -      .gamma_set = drm_atomic_helper_legacy_gamma_set, \
        .set_config = drm_atomic_helper_set_config, \
        .destroy = intel_crtc_destroy, \
        .page_flip = drm_atomic_helper_page_flip, \
        .atomic_destroy_state = intel_crtc_destroy_state, \
        .set_crc_source = intel_crtc_set_crc_source, \
        .verify_crc_source = intel_crtc_verify_crc_source, \
-       .get_crc_sources = intel_crtc_get_crc_sources
+       .get_crc_sources = intel_crtc_get_crc_sources, \
+       .late_register = intel_crtc_late_register
  
  static const struct drm_crtc_funcs bdw_crtc_funcs = {
        INTEL_CRTC_FUNCS,
@@@ -18747,7 -17274,7 +17273,7 @@@ int intel_modeset_init(struct drm_i915_
         */
        ret = intel_initial_commit(&i915->drm);
        if (ret)
 -              return ret;
 +              drm_dbg_kms(&i915->drm, "Initial modeset failed, %d\n", ret);
  
        intel_overlay_setup(i915);
  
@@@ -19164,7 -17691,7 +17690,7 @@@ static void readout_plane_state(struct 
                struct intel_crtc_state *crtc_state =
                        to_intel_crtc_state(crtc->base.state);
  
-               fixup_active_planes(crtc_state);
+               fixup_plane_bitmasks(crtc_state);
        }
  }
  
@@@ -19587,7 -18114,7 +18113,7 @@@ intel_modeset_setup_hw_state(struct drm
  
                put_domains = modeset_get_crtc_power_domains(crtc_state);
                if (drm_WARN_ON(dev, put_domains))
-                       modeset_put_power_domains(dev_priv, put_domains);
+                       modeset_put_crtc_power_domains(crtc, put_domains);
        }
  
        intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref);
@@@ -225,6 -225,17 +225,17 @@@ struct intel_encoder 
        const struct drm_connector *audio_connector;
  };
  
+ struct intel_panel_bl_funcs {
+       /* Connector and platform specific backlight functions */
+       int (*setup)(struct intel_connector *connector, enum pipe pipe);
+       u32 (*get)(struct intel_connector *connector);
+       void (*set)(const struct drm_connector_state *conn_state, u32 level);
+       void (*disable)(const struct drm_connector_state *conn_state, u32 level);
+       void (*enable)(const struct intel_crtc_state *crtc_state,
+                      const struct drm_connector_state *conn_state, u32 level);
+       u32 (*hz_to_pwm)(struct intel_connector *connector, u32 hz);
+ };
  struct intel_panel {
        struct drm_display_mode *fixed_mode;
        struct drm_display_mode *downclock_mode;
  
                struct backlight_device *device;
  
-               /* Connector and platform specific backlight functions */
-               int (*setup)(struct intel_connector *connector, enum pipe pipe);
-               u32 (*get)(struct intel_connector *connector);
-               void (*set)(const struct drm_connector_state *conn_state, u32 level);
-               void (*disable)(const struct drm_connector_state *conn_state);
-               void (*enable)(const struct intel_crtc_state *crtc_state,
-                              const struct drm_connector_state *conn_state);
-               u32 (*hz_to_pwm)(struct intel_connector *connector, u32 hz);
+               const struct intel_panel_bl_funcs *funcs;
                void (*power)(struct intel_connector *, bool enable);
        } backlight;
  };
@@@ -604,6 -608,8 +608,8 @@@ struct intel_plane_state 
        u32 planar_slave;
  
        struct drm_intel_sprite_colorkey ckey;
+       struct drm_rect psr2_sel_fetch_area;
  };
  
  struct intel_initial_plane_config {
@@@ -1047,7 -1053,10 +1053,10 @@@ struct intel_crtc_state 
                u32 cgm_mode;
        };
  
-       /* bitmask of visible planes (enum plane_id) */
+       /* bitmask of logically enabled planes (enum plane_id) */
+       u8 enabled_planes;
+       /* bitmask of actually visible planes (enum plane_id) */
        u8 active_planes;
        u8 nv12_planes;
        u8 c8_planes;
@@@ -1160,7 -1169,7 +1169,7 @@@ struct intel_crtc 
        /* I915_MODE_FLAG_* */
        u8 mode_flags;
  
-       unsigned long long enabled_power_domains;
+       struct intel_display_power_domain_set enabled_power_domains;
        struct intel_overlay *overlay;
  
        struct intel_crtc_state *config;
                ktime_t start_vbl_time;
                int min_vbl, max_vbl;
                int scanline_start;
+ #ifdef CONFIG_DRM_I915_DEBUG_VBLANK_EVADE
+               struct {
+                       u64 min;
+                       u64 max;
+                       u64 sum;
+                       unsigned int over;
+                       unsigned int times[17]; /* [1us, 16ms] */
+               } vbl;
+ #endif
        } debug;
  
        /* scalers available on this crtc */
@@@ -1321,11 -1339,6 +1339,11 @@@ struct intel_dp_compliance 
        u8 test_lane_count;
  };
  
 +struct intel_dp_pcon_frl {
 +      bool is_trained;
 +      int trained_rate_gbps;
 +};
 +
  struct intel_dp {
        i915_reg_t output_reg;
        u32 DP;
        u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE];
        u8 lttpr_phy_caps[DP_MAX_LTTPR_COUNT][DP_LTTPR_PHY_CAP_SIZE];
        u8 fec_capable;
 +      u8 pcon_dsc_dpcd[DP_PCON_DSC_ENCODER_CAP_SIZE];
        /* source rates */
        int num_source_rates;
        const int *source_rates;
        unsigned long last_power_on;
        unsigned long last_backlight_off;
        ktime_t panel_power_off_time;
+       intel_wakeref_t vdd_wakeref;
  
        /*
         * Pipe whose power sequencer is currently locked into
        struct {
                int min_tmds_clock, max_tmds_clock;
                int max_dotclock;
 +              int pcon_max_frl_bw;
                u8 max_bpc;
                bool ycbcr_444_to_420;
 +              bool rgb_to_ycbcr;
        } dfp;
  
+       /* To control wakeup latency, e.g. for irq-driven dp aux transfers. */
+       struct pm_qos_request pm_qos;
        /* Display stream compression testing */
        bool force_dsc_en;
  
        bool hobl_failed;
        bool hobl_active;
 +
 +      struct intel_dp_pcon_frl frl;
  };
  
  enum lspcon_vendor {
  
  struct intel_lspcon {
        bool active;
+       bool hdr_supported;
        enum drm_lspcon_mode mode;
        enum lspcon_vendor vendor;
  };
@@@ -1476,6 -1489,8 +1499,8 @@@ struct intel_digital_port 
        /* Used for DP and ICL+ TypeC/DP and TypeC/HDMI ports. */
        enum aux_ch aux_ch;
        enum intel_display_power_domain ddi_io_power_domain;
+       intel_wakeref_t ddi_io_wakeref;
+       intel_wakeref_t aux_wakeref;
        struct mutex tc_lock;   /* protects the TypeC port mode */
        intel_wakeref_t tc_lock_wakeref;
        int tc_link_refcount;
@@@ -1765,6 -1780,12 +1790,12 @@@ intel_crtc_has_dp_encoder(const struct 
                 (1 << INTEL_OUTPUT_EDP));
  }
  
+ static inline bool
+ intel_crtc_needs_modeset(const struct intel_crtc_state *crtc_state)
+ {
+       return drm_atomic_crtc_needs_modeset(&crtc_state->uapi);
+ }
  static inline void
  intel_wait_for_vblank(struct drm_i915_private *dev_priv, enum pipe pipe)
  {
@@@ -1787,4 -1808,10 +1818,10 @@@ static inline u32 intel_plane_ggtt_offs
        return i915_ggtt_offset(state->vma);
  }
  
+ static inline struct intel_frontbuffer *
+ to_intel_frontbuffer(struct drm_framebuffer *fb)
+ {
+       return fb ? to_intel_framebuffer(fb)->frontbuffer : NULL;
+ }
  #endif /*  __INTEL_DISPLAY_TYPES_H__ */
@@@ -651,10 -651,6 +651,10 @@@ intel_dp_output_format(struct drm_conne
            !drm_mode_is_420_only(info, mode))
                return INTEL_OUTPUT_FORMAT_RGB;
  
 +      if (intel_dp->dfp.rgb_to_ycbcr &&
 +          intel_dp->dfp.ycbcr_444_to_420)
 +              return INTEL_OUTPUT_FORMAT_RGB;
 +
        if (intel_dp->dfp.ycbcr_444_to_420)
                return INTEL_OUTPUT_FORMAT_YCBCR444;
        else
@@@ -720,25 -716,6 +720,25 @@@ intel_dp_mode_valid_downstream(struct i
        const struct drm_display_info *info = &connector->base.display_info;
        int tmds_clock;
  
 +      /* If PCON supports FRL MODE, check FRL bandwidth constraints */
 +      if (intel_dp->dfp.pcon_max_frl_bw) {
 +              int target_bw;
 +              int max_frl_bw;
 +              int bpp = intel_dp_mode_min_output_bpp(&connector->base, mode);
 +
 +              target_bw = bpp * target_clock;
 +
 +              max_frl_bw = intel_dp->dfp.pcon_max_frl_bw;
 +
 +              /* converting bw from Gbps to Kbps*/
 +              max_frl_bw = max_frl_bw * 1000000;
 +
 +              if (target_bw > max_frl_bw)
 +                      return MODE_CLOCK_HIGH;
 +
 +              return MODE_OK;
 +      }
 +
        if (intel_dp->dfp.max_dotclock &&
            target_clock > intel_dp->dfp.max_dotclock)
                return MODE_CLOCK_HIGH;
@@@ -1512,7 -1489,7 +1512,7 @@@ intel_dp_aux_xfer(struct intel_dp *inte
         * lowest possible wakeup latency and so prevent the cpu from going into
         * deep sleep states.
         */
-       cpu_latency_qos_update_request(&i915->pm_qos, 0);
+       cpu_latency_qos_update_request(&intel_dp->pm_qos, 0);
  
        intel_dp_check_edp(intel_dp);
  
@@@ -1645,7 -1622,7 +1645,7 @@@ done
  
        ret = recv_bytes;
  out:
-       cpu_latency_qos_update_request(&i915->pm_qos, PM_QOS_DEFAULT_VALUE);
+       cpu_latency_qos_update_request(&intel_dp->pm_qos, PM_QOS_DEFAULT_VALUE);
  
        if (vdd)
                edp_panel_vdd_off(intel_dp, false);
@@@ -1921,6 -1898,9 +1921,9 @@@ static i915_reg_t tgl_aux_data_reg(stru
  static void
  intel_dp_aux_fini(struct intel_dp *intel_dp)
  {
+       if (cpu_latency_qos_request_active(&intel_dp->pm_qos))
+               cpu_latency_qos_remove_request(&intel_dp->pm_qos);
        kfree(intel_dp->aux.name);
  }
  
@@@ -1973,6 -1953,7 +1976,7 @@@ intel_dp_aux_init(struct intel_dp *inte
                                               encoder->base.name);
  
        intel_dp->aux.transfer = intel_dp_aux_transfer;
+       cpu_latency_qos_add_request(&intel_dp->pm_qos, PM_QOS_DEFAULT_VALUE);
  }
  
  bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp)
@@@ -2312,6 -2293,14 +2316,14 @@@ static int intel_dp_dsc_compute_params(
        u8 line_buf_depth;
        int ret;
  
+       /*
+        * RC_MODEL_SIZE is currently a constant across all configurations.
+        *
+        * FIXME: Look into using sink defined DPCD DP_DSC_RC_BUF_BLK_SIZE and
+        * DP_DSC_RC_BUF_SIZE for this.
+        */
+       vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
        ret = intel_dsc_compute_params(encoder, crtc_state);
        if (ret)
                return ret;
@@@ -3117,8 -3106,9 +3129,9 @@@ static bool edp_panel_vdd_on(struct int
        if (edp_have_panel_vdd(intel_dp))
                return need_to_disable;
  
-       intel_display_power_get(dev_priv,
-                               intel_aux_power_domain(dig_port));
+       drm_WARN_ON(&dev_priv->drm, intel_dp->vdd_wakeref);
+       intel_dp->vdd_wakeref = intel_display_power_get(dev_priv,
+                                                       intel_aux_power_domain(dig_port));
  
        drm_dbg_kms(&dev_priv->drm, "Turning [ENCODER:%d:%s] VDD on\n",
                    dig_port->base.base.base.id,
@@@ -3211,8 -3201,9 +3224,9 @@@ static void edp_panel_vdd_off_sync(stru
        if ((pp & PANEL_POWER_ON) == 0)
                intel_dp->panel_power_off_time = ktime_get_boottime();
  
-       intel_display_power_put_unchecked(dev_priv,
-                                         intel_aux_power_domain(dig_port));
+       intel_display_power_put(dev_priv,
+                               intel_aux_power_domain(dig_port),
+                               fetch_and_zero(&intel_dp->vdd_wakeref));
  }
  
  static void edp_panel_vdd_work(struct work_struct *__work)
@@@ -3364,7 -3355,9 +3378,9 @@@ static void edp_panel_off(struct intel_
        intel_dp->panel_power_off_time = ktime_get_boottime();
  
        /* We got a reference when we enabled the VDD. */
-       intel_display_power_put_unchecked(dev_priv, intel_aux_power_domain(dig_port));
+       intel_display_power_put(dev_priv,
+                               intel_aux_power_domain(dig_port),
+                               fetch_and_zero(&intel_dp->vdd_wakeref));
  }
  
  void intel_edp_panel_off(struct intel_dp *intel_dp)
@@@ -3602,6 -3595,29 +3618,29 @@@ void intel_dp_sink_set_decompression_st
                            enable ? "enable" : "disable");
  }
  
+ static void
+ intel_edp_init_source_oui(struct intel_dp *intel_dp, bool careful)
+ {
+       struct drm_i915_private *i915 = dp_to_i915(intel_dp);
+       u8 oui[] = { 0x00, 0xaa, 0x01 };
+       u8 buf[3] = { 0 };
+       /*
+        * During driver init, we want to be careful and avoid changing the source OUI if it's
+        * already set to what we want, so as to avoid clearing any state by accident
+        */
+       if (careful) {
+               if (drm_dp_dpcd_read(&intel_dp->aux, DP_SOURCE_OUI, buf, sizeof(buf)) < 0)
+                       drm_err(&i915->drm, "Failed to read source OUI\n");
+               if (memcmp(oui, buf, sizeof(oui)) == 0)
+                       return;
+       }
+       if (drm_dp_dpcd_write(&intel_dp->aux, DP_SOURCE_OUI, oui, sizeof(oui)) < 0)
+               drm_err(&i915->drm, "Failed to write source OUI\n");
+ }
  /* If the device supports it, try to set the power state appropriately */
  void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode)
  {
  
                lspcon_resume(dp_to_dig_port(intel_dp));
  
+               /* Write the source OUI as early as possible */
+               if (intel_dp_is_edp(intel_dp))
+                       intel_edp_init_source_oui(intel_dp, false);
                /*
                 * When turning on, we need to retry for 1ms to give the sink
                 * time to wake up.
@@@ -3883,8 -3903,6 +3926,8 @@@ static void intel_disable_dp(struct int
        intel_edp_backlight_off(old_conn_state);
        intel_dp_set_power(intel_dp, DP_SET_POWER_D3);
        intel_edp_panel_off(intel_dp);
 +      intel_dp->frl.is_trained = false;
 +      intel_dp->frl.trained_rate_gbps = 0;
  }
  
  static void g4x_disable_dp(struct intel_atomic_state *state,
@@@ -3980,280 -3998,6 +4023,280 @@@ cpt_set_link_train(struct intel_dp *int
        intel_de_posting_read(dev_priv, intel_dp->output_reg);
  }
  
 +static void intel_dp_get_pcon_dsc_cap(struct intel_dp *intel_dp)
 +{
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +
 +      /* Clear the cached register set to avoid using stale values */
 +
 +      memset(intel_dp->pcon_dsc_dpcd, 0, sizeof(intel_dp->pcon_dsc_dpcd));
 +
 +      if (drm_dp_dpcd_read(&intel_dp->aux, DP_PCON_DSC_ENCODER,
 +                           intel_dp->pcon_dsc_dpcd,
 +                           sizeof(intel_dp->pcon_dsc_dpcd)) < 0)
 +              drm_err(&i915->drm, "Failed to read DPCD register 0x%x\n",
 +                      DP_PCON_DSC_ENCODER);
 +
 +      drm_dbg_kms(&i915->drm, "PCON ENCODER DSC DPCD: %*ph\n",
 +                  (int)sizeof(intel_dp->pcon_dsc_dpcd), intel_dp->pcon_dsc_dpcd);
 +}
 +
 +static int intel_dp_pcon_get_frl_mask(u8 frl_bw_mask)
 +{
 +      int bw_gbps[] = {9, 18, 24, 32, 40, 48};
 +      int i;
 +
 +      for (i = ARRAY_SIZE(bw_gbps) - 1; i >= 0; i--) {
 +              if (frl_bw_mask & (1 << i))
 +                      return bw_gbps[i];
 +      }
 +      return 0;
 +}
 +
 +static int intel_dp_pcon_set_frl_mask(int max_frl)
 +{
 +      switch (max_frl) {
 +      case 48:
 +              return DP_PCON_FRL_BW_MASK_48GBPS;
 +      case 40:
 +              return DP_PCON_FRL_BW_MASK_40GBPS;
 +      case 32:
 +              return DP_PCON_FRL_BW_MASK_32GBPS;
 +      case 24:
 +              return DP_PCON_FRL_BW_MASK_24GBPS;
 +      case 18:
 +              return DP_PCON_FRL_BW_MASK_18GBPS;
 +      case 9:
 +              return DP_PCON_FRL_BW_MASK_9GBPS;
 +      }
 +
 +      return 0;
 +}
 +
 +static int intel_dp_hdmi_sink_max_frl(struct intel_dp *intel_dp)
 +{
 +      struct intel_connector *intel_connector = intel_dp->attached_connector;
 +      struct drm_connector *connector = &intel_connector->base;
 +      int max_frl_rate;
 +      int max_lanes, rate_per_lane;
 +      int max_dsc_lanes, dsc_rate_per_lane;
 +
 +      max_lanes = connector->display_info.hdmi.max_lanes;
 +      rate_per_lane = connector->display_info.hdmi.max_frl_rate_per_lane;
 +      max_frl_rate = max_lanes * rate_per_lane;
 +
 +      if (connector->display_info.hdmi.dsc_cap.v_1p2) {
 +              max_dsc_lanes = connector->display_info.hdmi.dsc_cap.max_lanes;
 +              dsc_rate_per_lane = connector->display_info.hdmi.dsc_cap.max_frl_rate_per_lane;
 +              if (max_dsc_lanes && dsc_rate_per_lane)
 +                      max_frl_rate = min(max_frl_rate, max_dsc_lanes * dsc_rate_per_lane);
 +      }
 +
 +      return max_frl_rate;
 +}
 +
 +static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)
 +{
 +#define PCON_EXTENDED_TRAIN_MODE (1 > 0)
 +#define PCON_CONCURRENT_MODE (1 > 0)
 +#define PCON_SEQUENTIAL_MODE !PCON_CONCURRENT_MODE
 +#define PCON_NORMAL_TRAIN_MODE !PCON_EXTENDED_TRAIN_MODE
 +#define TIMEOUT_FRL_READY_MS 500
 +#define TIMEOUT_HDMI_LINK_ACTIVE_MS 1000
 +
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +      int max_frl_bw, max_pcon_frl_bw, max_edid_frl_bw, ret;
 +      u8 max_frl_bw_mask = 0, frl_trained_mask;
 +      bool is_active;
 +
 +      ret = drm_dp_pcon_reset_frl_config(&intel_dp->aux);
 +      if (ret < 0)
 +              return ret;
 +
 +      max_pcon_frl_bw = intel_dp->dfp.pcon_max_frl_bw;
 +      drm_dbg(&i915->drm, "PCON max rate = %d Gbps\n", max_pcon_frl_bw);
 +
 +      max_edid_frl_bw = intel_dp_hdmi_sink_max_frl(intel_dp);
 +      drm_dbg(&i915->drm, "Sink max rate from EDID = %d Gbps\n", max_edid_frl_bw);
 +
 +      max_frl_bw = min(max_edid_frl_bw, max_pcon_frl_bw);
 +
 +      if (max_frl_bw <= 0)
 +              return -EINVAL;
 +
 +      ret = drm_dp_pcon_frl_prepare(&intel_dp->aux, false);
 +      if (ret < 0)
 +              return ret;
 +      /* Wait for PCON to be FRL Ready */
 +      wait_for(is_active = drm_dp_pcon_is_frl_ready(&intel_dp->aux) == true, TIMEOUT_FRL_READY_MS);
 +
 +      if (!is_active)
 +              return -ETIMEDOUT;
 +
 +      max_frl_bw_mask = intel_dp_pcon_set_frl_mask(max_frl_bw);
 +      ret = drm_dp_pcon_frl_configure_1(&intel_dp->aux, max_frl_bw, PCON_SEQUENTIAL_MODE);
 +      if (ret < 0)
 +              return ret;
 +      ret = drm_dp_pcon_frl_configure_2(&intel_dp->aux, max_frl_bw_mask, PCON_NORMAL_TRAIN_MODE);
 +      if (ret < 0)
 +              return ret;
 +      ret = drm_dp_pcon_frl_enable(&intel_dp->aux);
 +      if (ret < 0)
 +              return ret;
 +      /*
 +       * Wait for FRL to be completed
 +       * Check if the HDMI Link is up and active.
 +       */
 +      wait_for(is_active = drm_dp_pcon_hdmi_link_active(&intel_dp->aux) == true, TIMEOUT_HDMI_LINK_ACTIVE_MS);
 +
 +      if (!is_active)
 +              return -ETIMEDOUT;
 +
 +      /* Verify HDMI Link configuration shows FRL Mode */
 +      if (drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, &frl_trained_mask) !=
 +          DP_PCON_HDMI_MODE_FRL) {
 +              drm_dbg(&i915->drm, "HDMI couldn't be trained in FRL Mode\n");
 +              return -EINVAL;
 +      }
 +      drm_dbg(&i915->drm, "MAX_FRL_MASK = %u, FRL_TRAINED_MASK = %u\n", max_frl_bw_mask, frl_trained_mask);
 +
 +      intel_dp->frl.trained_rate_gbps = intel_dp_pcon_get_frl_mask(frl_trained_mask);
 +      intel_dp->frl.is_trained = true;
 +      drm_dbg(&i915->drm, "FRL trained with : %d Gbps\n", intel_dp->frl.trained_rate_gbps);
 +
 +      return 0;
 +}
 +
 +static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp)
 +{
 +      if (drm_dp_is_branch(intel_dp->dpcd) &&
 +          intel_dp->has_hdmi_sink &&
 +          intel_dp_hdmi_sink_max_frl(intel_dp) > 0)
 +              return true;
 +
 +      return false;
 +}
 +
 +void intel_dp_check_frl_training(struct intel_dp *intel_dp)
 +{
 +      struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 +
 +      /* Always go for FRL training if supported */
 +      if (!intel_dp_is_hdmi_2_1_sink(intel_dp) ||
 +          intel_dp->frl.is_trained)
 +              return;
 +
 +      if (intel_dp_pcon_start_frl_training(intel_dp) < 0) {
 +              int ret, mode;
 +
 +              drm_dbg(&dev_priv->drm, "Couldnt set FRL mode, continuing with TMDS mode\n");
 +              ret = drm_dp_pcon_reset_frl_config(&intel_dp->aux);
 +              mode = drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, NULL);
 +
 +              if (ret < 0 || mode != DP_PCON_HDMI_MODE_TMDS)
 +                      drm_dbg(&dev_priv->drm, "Issue with PCON, cannot set TMDS mode\n");
 +      } else {
 +              drm_dbg(&dev_priv->drm, "FRL training Completed\n");
 +      }
 +}
 +
 +static int
 +intel_dp_pcon_dsc_enc_slice_height(const struct intel_crtc_state *crtc_state)
 +{
 +      int vactive = crtc_state->hw.adjusted_mode.vdisplay;
 +
 +      return intel_hdmi_dsc_get_slice_height(vactive);
 +}
 +
 +static int
 +intel_dp_pcon_dsc_enc_slices(struct intel_dp *intel_dp,
 +                           const struct intel_crtc_state *crtc_state)
 +{
 +      struct intel_connector *intel_connector = intel_dp->attached_connector;
 +      struct drm_connector *connector = &intel_connector->base;
 +      int hdmi_throughput = connector->display_info.hdmi.dsc_cap.clk_per_slice;
 +      int hdmi_max_slices = connector->display_info.hdmi.dsc_cap.max_slices;
 +      int pcon_max_slices = drm_dp_pcon_dsc_max_slices(intel_dp->pcon_dsc_dpcd);
 +      int pcon_max_slice_width = drm_dp_pcon_dsc_max_slice_width(intel_dp->pcon_dsc_dpcd);
 +
 +      return intel_hdmi_dsc_get_num_slices(crtc_state, pcon_max_slices,
 +                                           pcon_max_slice_width,
 +                                           hdmi_max_slices, hdmi_throughput);
 +}
 +
 +static int
 +intel_dp_pcon_dsc_enc_bpp(struct intel_dp *intel_dp,
 +                        const struct intel_crtc_state *crtc_state,
 +                        int num_slices, int slice_width)
 +{
 +      struct intel_connector *intel_connector = intel_dp->attached_connector;
 +      struct drm_connector *connector = &intel_connector->base;
 +      int output_format = crtc_state->output_format;
 +      bool hdmi_all_bpp = connector->display_info.hdmi.dsc_cap.all_bpp;
 +      int pcon_fractional_bpp = drm_dp_pcon_dsc_bpp_incr(intel_dp->pcon_dsc_dpcd);
 +      int hdmi_max_chunk_bytes =
 +              connector->display_info.hdmi.dsc_cap.total_chunk_kbytes * 1024;
 +
 +      return intel_hdmi_dsc_get_bpp(pcon_fractional_bpp, slice_width,
 +                                    num_slices, output_format, hdmi_all_bpp,
 +                                    hdmi_max_chunk_bytes);
 +}
 +
 +void
 +intel_dp_pcon_dsc_configure(struct intel_dp *intel_dp,
 +                          const struct intel_crtc_state *crtc_state)
 +{
 +      u8 pps_param[6];
 +      int slice_height;
 +      int slice_width;
 +      int num_slices;
 +      int bits_per_pixel;
 +      int ret;
 +      struct intel_connector *intel_connector = intel_dp->attached_connector;
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +      struct drm_connector *connector;
 +      bool hdmi_is_dsc_1_2;
 +
 +      if (!intel_dp_is_hdmi_2_1_sink(intel_dp))
 +              return;
 +
 +      if (!intel_connector)
 +              return;
 +      connector = &intel_connector->base;
 +      hdmi_is_dsc_1_2 = connector->display_info.hdmi.dsc_cap.v_1p2;
 +
 +      if (!drm_dp_pcon_enc_is_dsc_1_2(intel_dp->pcon_dsc_dpcd) ||
 +          !hdmi_is_dsc_1_2)
 +              return;
 +
 +      slice_height = intel_dp_pcon_dsc_enc_slice_height(crtc_state);
 +      if (!slice_height)
 +              return;
 +
 +      num_slices = intel_dp_pcon_dsc_enc_slices(intel_dp, crtc_state);
 +      if (!num_slices)
 +              return;
 +
 +      slice_width = DIV_ROUND_UP(crtc_state->hw.adjusted_mode.hdisplay,
 +                                 num_slices);
 +
 +      bits_per_pixel = intel_dp_pcon_dsc_enc_bpp(intel_dp, crtc_state,
 +                                                 num_slices, slice_width);
 +      if (!bits_per_pixel)
 +              return;
 +
 +      pps_param[0] = slice_height & 0xFF;
 +      pps_param[1] = slice_height >> 8;
 +      pps_param[2] = slice_width & 0xFF;
 +      pps_param[3] = slice_width >> 8;
 +      pps_param[4] = bits_per_pixel & 0xFF;
 +      pps_param[5] = (bits_per_pixel >> 8) & 0x3;
 +
 +      ret = drm_dp_pcon_pps_override_param(&intel_dp->aux, pps_param);
 +      if (ret < 0)
 +              drm_dbg_kms(&i915->drm, "Failed to set pcon DSC\n");
 +}
 +
  static void
  g4x_set_link_train(struct intel_dp *intel_dp,
                   const struct intel_crtc_state *crtc_state,
@@@ -4309,8 -4053,7 +4352,8 @@@ static void intel_dp_enable_port(struc
        intel_de_posting_read(dev_priv, intel_dp->output_reg);
  }
  
 -void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp)
 +void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp,
 +                                         const struct intel_crtc_state *crtc_state)
  {
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 tmp;
                            enableddisabled(intel_dp->dfp.ycbcr_444_to_420));
  
        tmp = 0;
 +      if (intel_dp->dfp.rgb_to_ycbcr) {
 +              bool bt2020, bt709;
  
 -      if (drm_dp_dpcd_writeb(&intel_dp->aux,
 -                             DP_PROTOCOL_CONVERTER_CONTROL_2, tmp) <= 0)
 +              /*
 +               * FIXME: Currently if userspace selects BT2020 or BT709, but PCON supports only
 +               * RGB->YCbCr for BT601 colorspace, we go ahead with BT601, as default.
 +               *
 +               */
 +              tmp = DP_CONVERSION_BT601_RGB_YCBCR_ENABLE;
 +
 +              bt2020 = drm_dp_downstream_rgb_to_ycbcr_conversion(intel_dp->dpcd,
 +                                                                 intel_dp->downstream_ports,
 +                                                                 DP_DS_HDMI_BT2020_RGB_YCBCR_CONV);
 +              bt709 = drm_dp_downstream_rgb_to_ycbcr_conversion(intel_dp->dpcd,
 +                                                                intel_dp->downstream_ports,
 +                                                                DP_DS_HDMI_BT709_RGB_YCBCR_CONV);
 +              switch (crtc_state->infoframes.vsc.colorimetry) {
 +              case DP_COLORIMETRY_BT2020_RGB:
 +              case DP_COLORIMETRY_BT2020_YCC:
 +                      if (bt2020)
 +                              tmp = DP_CONVERSION_BT2020_RGB_YCBCR_ENABLE;
 +                      break;
 +              case DP_COLORIMETRY_BT709_YCC:
 +              case DP_COLORIMETRY_XVYCC_709:
 +                      if (bt709)
 +                              tmp = DP_CONVERSION_BT709_RGB_YCBCR_ENABLE;
 +                      break;
 +              default:
 +                      break;
 +              }
 +      }
 +
 +      if (drm_dp_pcon_convert_rgb_to_ycbcr(&intel_dp->aux, tmp) < 0)
                drm_dbg_kms(&i915->drm,
 -                          "Failed to set protocol converter YCbCr 4:2:2 conversion mode to %s\n",
 -                          enableddisabled(false));
 +                         "Failed to set protocol converter RGB->YCbCr conversion mode to %s\n",
 +                         enableddisabled(tmp ? true : false));
  }
  
  static void intel_enable_dp(struct intel_atomic_state *state,
        }
  
        intel_dp_set_power(intel_dp, DP_SET_POWER_D0);
 -      intel_dp_configure_protocol_converter(intel_dp);
 +      intel_dp_configure_protocol_converter(intel_dp, pipe_config);
 +      intel_dp_check_frl_training(intel_dp);
 +      intel_dp_pcon_dsc_configure(intel_dp, pipe_config);
        intel_dp_start_link_train(intel_dp, pipe_config);
        intel_dp_stop_link_train(intel_dp, pipe_config);
  
@@@ -5197,6 -4908,12 +5240,12 @@@ intel_edp_init_dpcd(struct intel_dp *in
        if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
                intel_dp_get_dsc_sink_cap(intel_dp);
  
+       /*
+        * If needed, program our source OUI so we can make various Intel-specific AUX services
+        * available (such as HDR backlight controls)
+        */
+       intel_edp_init_source_oui(intel_dp, true);
        return true;
  }
  
@@@ -6165,28 -5882,6 +6214,28 @@@ intel_dp_check_mst_status(struct intel_
        return link_ok;
  }
  
 +static void
 +intel_dp_handle_hdmi_link_status_change(struct intel_dp *intel_dp)
 +{
 +      bool is_active;
 +      u8 buf = 0;
 +
 +      is_active = drm_dp_pcon_hdmi_link_active(&intel_dp->aux);
 +      if (intel_dp->frl.is_trained && !is_active) {
 +              if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf) < 0)
 +                      return;
 +
 +              buf &=  ~DP_PCON_ENABLE_HDMI_LINK;
 +              if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf) < 0)
 +                      return;
 +
 +              drm_dp_pcon_hdmi_frl_link_error_count(&intel_dp->aux, &intel_dp->attached_connector->base);
 +
 +              /* Restart FRL training or fall back to TMDS mode */
 +              intel_dp_check_frl_training(intel_dp);
 +      }
 +}
 +
  static bool
  intel_dp_needs_link_retrain(struct intel_dp *intel_dp)
  {
@@@ -6360,8 -6055,6 +6409,8 @@@ int intel_dp_retrain_link(struct intel_
                    !intel_dp_mst_is_master_trans(crtc_state))
                        continue;
  
 +              intel_dp_check_frl_training(intel_dp);
 +              intel_dp_pcon_dsc_configure(intel_dp, crtc_state);
                intel_dp_start_link_train(intel_dp, crtc_state);
                intel_dp_stop_link_train(intel_dp, crtc_state);
                break;
@@@ -6553,7 -6246,7 +6602,7 @@@ intel_dp_hotplug(struct intel_encoder *
        return state;
  }
  
 -static void intel_dp_check_service_irq(struct intel_dp *intel_dp)
 +static void intel_dp_check_device_service_irq(struct intel_dp *intel_dp)
  {
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 val;
                drm_dbg_kms(&i915->drm, "Sink specific irq unhandled\n");
  }
  
 +static void intel_dp_check_link_service_irq(struct intel_dp *intel_dp)
 +{
 +      struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 +      u8 val;
 +
 +      if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
 +              return;
 +
 +      if (drm_dp_dpcd_readb(&intel_dp->aux,
 +                            DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || !val) {
 +              drm_dbg_kms(&i915->drm, "Error in reading link service irq vector\n");
 +              return;
 +      }
 +
 +      if (drm_dp_dpcd_writeb(&intel_dp->aux,
 +                             DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1) {
 +              drm_dbg_kms(&i915->drm, "Error in writing link service irq vector\n");
 +              return;
 +      }
 +
 +      if (val & HDMI_LINK_STATUS_CHANGED)
 +              intel_dp_handle_hdmi_link_status_change(intel_dp);
 +}
 +
  /*
   * According to DP spec
   * 5.1.2:
@@@ -6640,8 -6309,7 +6689,8 @@@ intel_dp_short_pulse(struct intel_dp *i
                return false;
        }
  
 -      intel_dp_check_service_irq(intel_dp);
 +      intel_dp_check_device_service_irq(intel_dp);
 +      intel_dp_check_link_service_irq(intel_dp);
  
        /* Handle CEC interrupts, if any */
        drm_dp_cec_irq(&intel_dp->aux);
@@@ -6861,20 -6529,13 +6910,20 @@@ intel_dp_update_dfp(struct intel_dp *in
                                                 intel_dp->downstream_ports,
                                                 edid);
  
 +      intel_dp->dfp.pcon_max_frl_bw =
 +              drm_dp_get_pcon_max_frl_bw(intel_dp->dpcd,
 +                                         intel_dp->downstream_ports);
 +
        drm_dbg_kms(&i915->drm,
 -                  "[CONNECTOR:%d:%s] DFP max bpc %d, max dotclock %d, TMDS clock %d-%d\n",
 +                  "[CONNECTOR:%d:%s] DFP max bpc %d, max dotclock %d, TMDS clock %d-%d, PCON Max FRL BW %dGbps\n",
                    connector->base.base.id, connector->base.name,
                    intel_dp->dfp.max_bpc,
                    intel_dp->dfp.max_dotclock,
                    intel_dp->dfp.min_tmds_clock,
 -                  intel_dp->dfp.max_tmds_clock);
 +                  intel_dp->dfp.max_tmds_clock,
 +                  intel_dp->dfp.pcon_max_frl_bw);
 +
 +      intel_dp_get_pcon_dsc_cap(intel_dp);
  }
  
  static void
@@@ -6882,7 -6543,7 +6931,7 @@@ intel_dp_update_420(struct intel_dp *in
  {
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        struct intel_connector *connector = intel_dp->attached_connector;
 -      bool is_branch, ycbcr_420_passthrough, ycbcr_444_to_420;
 +      bool is_branch, ycbcr_420_passthrough, ycbcr_444_to_420, rgb_to_ycbcr;
  
        /* No YCbCr output support on gmch platforms */
        if (HAS_GMCH(i915))
                dp_to_dig_port(intel_dp)->lspcon.active ||
                drm_dp_downstream_444_to_420_conversion(intel_dp->dpcd,
                                                        intel_dp->downstream_ports);
 +      rgb_to_ycbcr = drm_dp_downstream_rgb_to_ycbcr_conversion(intel_dp->dpcd,
 +                                                               intel_dp->downstream_ports,
 +                                                               DP_DS_HDMI_BT601_RGB_YCBCR_CONV ||
 +                                                               DP_DS_HDMI_BT709_RGB_YCBCR_CONV ||
 +                                                               DP_DS_HDMI_BT2020_RGB_YCBCR_CONV);
  
        if (INTEL_GEN(i915) >= 11) {
 +              /* Let PCON convert from RGB->YCbCr if possible */
 +              if (is_branch && rgb_to_ycbcr && ycbcr_444_to_420) {
 +                      intel_dp->dfp.rgb_to_ycbcr = true;
 +                      intel_dp->dfp.ycbcr_444_to_420 = true;
 +                      connector->base.ycbcr_420_allowed = true;
 +              } else {
                /* Prefer 4:2:0 passthrough over 4:4:4->4:2:0 conversion */
 -              intel_dp->dfp.ycbcr_444_to_420 =
 -                      ycbcr_444_to_420 && !ycbcr_420_passthrough;
 +                      intel_dp->dfp.ycbcr_444_to_420 =
 +                              ycbcr_444_to_420 && !ycbcr_420_passthrough;
  
 -              connector->base.ycbcr_420_allowed =
 -                      !is_branch || ycbcr_444_to_420 || ycbcr_420_passthrough;
 +                      connector->base.ycbcr_420_allowed =
 +                              !is_branch || ycbcr_444_to_420 || ycbcr_420_passthrough;
 +              }
        } else {
                /* 4:4:4->4:2:0 conversion is the only way */
                intel_dp->dfp.ycbcr_444_to_420 = ycbcr_444_to_420;
        }
  
        drm_dbg_kms(&i915->drm,
 -                  "[CONNECTOR:%d:%s] YCbCr 4:2:0 allowed? %s, YCbCr 4:4:4->4:2:0 conversion? %s\n",
 +                  "[CONNECTOR:%d:%s] RGB->YcbCr conversion? %s, YCbCr 4:2:0 allowed? %s, YCbCr 4:4:4->4:2:0 conversion? %s\n",
                    connector->base.base.id, connector->base.name,
 +                  yesno(intel_dp->dfp.rgb_to_ycbcr),
                    yesno(connector->base.ycbcr_420_allowed),
                    yesno(intel_dp->dfp.ycbcr_444_to_420));
  }
@@@ -6979,8 -6627,6 +7028,8 @@@ intel_dp_unset_edid(struct intel_dp *in
        intel_dp->dfp.min_tmds_clock = 0;
        intel_dp->dfp.max_tmds_clock = 0;
  
 +      intel_dp->dfp.pcon_max_frl_bw = 0;
 +
        intel_dp->dfp.ycbcr_444_to_420 = false;
        connector->base.ycbcr_420_allowed = false;
  }
@@@ -7086,7 -6732,7 +7135,7 @@@ intel_dp_detect(struct drm_connector *c
            to_intel_connector(connector)->detect_edid)
                status = connector_status_connected;
  
 -      intel_dp_check_service_irq(intel_dp);
 +      intel_dp_check_device_service_irq(intel_dp);
  
  out:
        if (status != connector_status_connected && !intel_dp->is_mst)
@@@ -7177,6 -6823,8 +7226,8 @@@ intel_dp_connector_register(struct drm_
  {
        struct drm_i915_private *i915 = to_i915(connector->dev);
        struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
+       struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+       struct intel_lspcon *lspcon = &dig_port->lspcon;
        int ret;
  
        ret = intel_connector_register(connector);
        ret = drm_dp_aux_register(&intel_dp->aux);
        if (!ret)
                drm_dp_cec_register_connector(&intel_dp->aux, connector);
+       if (!intel_bios_is_lspcon_present(i915, dig_port->base.port))
+               return ret;
+       /*
+        * ToDo: Clean this up to handle lspcon init and resume more
+        * efficiently and streamlined.
+        */
+       if (lspcon_init(dig_port)) {
+               lspcon_detect_hdr_capability(lspcon);
+               if (lspcon->hdr_supported)
+                       drm_object_attach_property(&connector->base,
+                                                  connector->dev->mode_config.hdr_output_metadata_property,
+                                                  0);
+       }
        return ret;
  }
  
@@@ -7279,7 -6943,9 +7346,9 @@@ static void intel_edp_panel_vdd_sanitiz
         */
        drm_dbg_kms(&dev_priv->drm,
                    "VDD left on by BIOS, adjusting state tracking\n");
-       intel_display_power_get(dev_priv, intel_aux_power_domain(dig_port));
+       drm_WARN_ON(&dev_priv->drm, intel_dp->vdd_wakeref);
+       intel_dp->vdd_wakeref = intel_display_power_get(dev_priv,
+                                                       intel_aux_power_domain(dig_port));
  
        edp_panel_vdd_schedule_off(intel_dp);
  }
@@@ -7578,7 -7244,13 +7647,13 @@@ intel_dp_add_properties(struct intel_d
        else if (INTEL_GEN(dev_priv) >= 5)
                drm_connector_attach_max_bpc_property(connector, 6, 12);
  
-       intel_attach_colorspace_property(connector);
+       /* Register HDMI colorspace for case of lspcon */
+       if (intel_bios_is_lspcon_present(dev_priv, port)) {
+               drm_connector_attach_content_type_property(connector);
+               intel_attach_hdmi_colorspace_property(connector);
+       } else {
+               intel_attach_dp_colorspace_property(connector);
+       }
  
        if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) >= 11)
                drm_object_attach_property(&connector->base,
@@@ -8549,9 -8221,6 +8624,9 @@@ intel_dp_init_connector(struct intel_di
                               (temp & ~0xf) | 0xd);
        }
  
 +      intel_dp->frl.is_trained = false;
 +      intel_dp->frl.trained_rate_gbps = 0;
 +
        return true;
  
  fail:
@@@ -518,10 -518,10 +518,10 @@@ static u32 vlv_infoframes_enabled(struc
                      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
  }
  
static void hsw_write_infoframe(struct intel_encoder *encoder,
-                               const struct intel_crtc_state *crtc_state,
-                               unsigned int type,
-                               const void *frame, ssize_t len)
+ void hsw_write_infoframe(struct intel_encoder *encoder,
+                        const struct intel_crtc_state *crtc_state,
+                        unsigned int type,
+                        const void *frame, ssize_t len)
  {
        const u32 *data = frame;
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        intel_de_posting_read(dev_priv, ctl_reg);
  }
  
- static void hsw_read_infoframe(struct intel_encoder *encoder,
-                              const struct intel_crtc_state *crtc_state,
-                              unsigned int type,
-                              void *frame, ssize_t len)
+ void hsw_read_infoframe(struct intel_encoder *encoder,
+                       const struct intel_crtc_state *crtc_state,
+                       unsigned int type, void *frame, ssize_t len)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
@@@ -2950,21 -2949,12 +2949,12 @@@ static voi
  intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
  {
        struct drm_i915_private *dev_priv = to_i915(connector->dev);
-       struct intel_digital_port *dig_port =
-                               hdmi_to_dig_port(intel_hdmi);
  
        intel_attach_force_audio_property(connector);
        intel_attach_broadcast_rgb_property(connector);
        intel_attach_aspect_ratio_property(connector);
  
-       /*
-        * Attach Colorspace property for Non LSPCON based device
-        * ToDo: This needs to be extended for LSPCON implementation
-        * as well. Will be implemented separately.
-        */
-       if (!dig_port->lspcon.active)
-               intel_attach_colorspace_property(connector);
+       intel_attach_hdmi_colorspace_property(connector);
        drm_connector_attach_content_type_property(connector);
  
        if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
@@@ -3438,236 -3428,3 +3428,236 @@@ void intel_hdmi_init(struct drm_i915_pr
        dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
        intel_hdmi_init_connector(dig_port, intel_connector);
  }
 +
 +/*
 + * intel_hdmi_dsc_get_slice_height - get the dsc slice_height
 + * @vactive: Vactive of a display mode
 + *
 + * @return: appropriate dsc slice height for a given mode.
 + */
 +int intel_hdmi_dsc_get_slice_height(int vactive)
 +{
 +      int slice_height;
 +
 +      /*
 +       * Slice Height determination : HDMI2.1 Section 7.7.5.2
 +       * Select smallest slice height >=96, that results in a valid PPS and
 +       * requires minimum padding lines required for final slice.
 +       *
 +       * Assumption : Vactive is even.
 +       */
 +      for (slice_height = 96; slice_height <= vactive; slice_height += 2)
 +              if (vactive % slice_height == 0)
 +                      return slice_height;
 +
 +      return 0;
 +}
 +
 +/*
 + * intel_hdmi_dsc_get_num_slices - get no. of dsc slices based on dsc encoder
 + * and dsc decoder capabilities
 + *
 + * @crtc_state: intel crtc_state
 + * @src_max_slices: maximum slices supported by the DSC encoder
 + * @src_max_slice_width: maximum slice width supported by DSC encoder
 + * @hdmi_max_slices: maximum slices supported by sink DSC decoder
 + * @hdmi_throughput: maximum clock per slice (MHz) supported by HDMI sink
 + *
 + * @return: num of dsc slices that can be supported by the dsc encoder
 + * and decoder.
 + */
 +int
 +intel_hdmi_dsc_get_num_slices(const struct intel_crtc_state *crtc_state,
 +                            int src_max_slices, int src_max_slice_width,
 +                            int hdmi_max_slices, int hdmi_throughput)
 +{
 +/* Pixel rates in KPixels/sec */
 +#define HDMI_DSC_PEAK_PIXEL_RATE              2720000
 +/*
 + * Rates at which the source and sink are required to process pixels in each
 + * slice, can be two levels: either atleast 340000KHz or atleast 40000KHz.
 + */
 +#define HDMI_DSC_MAX_ENC_THROUGHPUT_0         340000
 +#define HDMI_DSC_MAX_ENC_THROUGHPUT_1         400000
 +
 +/* Spec limits the slice width to 2720 pixels */
 +#define MAX_HDMI_SLICE_WIDTH                  2720
 +      int kslice_adjust;
 +      int adjusted_clk_khz;
 +      int min_slices;
 +      int target_slices;
 +      int max_throughput; /* max clock freq. in khz per slice */
 +      int max_slice_width;
 +      int slice_width;
 +      int pixel_clock = crtc_state->hw.adjusted_mode.crtc_clock;
 +
 +      if (!hdmi_throughput)
 +              return 0;
 +
 +      /*
 +       * Slice Width determination : HDMI2.1 Section 7.7.5.1
 +       * kslice_adjust factor for 4:2:0, and 4:2:2 formats is 0.5, where as
 +       * for 4:4:4 is 1.0. Multiplying these factors by 10 and later
 +       * dividing adjusted clock value by 10.
 +       */
 +      if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444 ||
 +          crtc_state->output_format == INTEL_OUTPUT_FORMAT_RGB)
 +              kslice_adjust = 10;
 +      else
 +              kslice_adjust = 5;
 +
 +      /*
 +       * As per spec, the rate at which the source and the sink process
 +       * the pixels per slice are at two levels: atleast 340Mhz or 400Mhz.
 +       * This depends upon the pixel clock rate and output formats
 +       * (kslice adjust).
 +       * If pixel clock * kslice adjust >= 2720MHz slices can be processed
 +       * at max 340MHz, otherwise they can be processed at max 400MHz.
 +       */
 +
 +      adjusted_clk_khz = DIV_ROUND_UP(kslice_adjust * pixel_clock, 10);
 +
 +      if (adjusted_clk_khz <= HDMI_DSC_PEAK_PIXEL_RATE)
 +              max_throughput = HDMI_DSC_MAX_ENC_THROUGHPUT_0;
 +      else
 +              max_throughput = HDMI_DSC_MAX_ENC_THROUGHPUT_1;
 +
 +      /*
 +       * Taking into account the sink's capability for maximum
 +       * clock per slice (in MHz) as read from HF-VSDB.
 +       */
 +      max_throughput = min(max_throughput, hdmi_throughput * 1000);
 +
 +      min_slices = DIV_ROUND_UP(adjusted_clk_khz, max_throughput);
 +      max_slice_width = min(MAX_HDMI_SLICE_WIDTH, src_max_slice_width);
 +
 +      /*
 +       * Keep on increasing the num of slices/line, starting from min_slices
 +       * per line till we get such a number, for which the slice_width is
 +       * just less than max_slice_width. The slices/line selected should be
 +       * less than or equal to the max horizontal slices that the combination
 +       * of PCON encoder and HDMI decoder can support.
 +       */
 +      slice_width = max_slice_width;
 +
 +      do {
 +              if (min_slices <= 1 && src_max_slices >= 1 && hdmi_max_slices >= 1)
 +                      target_slices = 1;
 +              else if (min_slices <= 2 && src_max_slices >= 2 && hdmi_max_slices >= 2)
 +                      target_slices = 2;
 +              else if (min_slices <= 4 && src_max_slices >= 4 && hdmi_max_slices >= 4)
 +                      target_slices = 4;
 +              else if (min_slices <= 8 && src_max_slices >= 8 && hdmi_max_slices >= 8)
 +                      target_slices = 8;
 +              else if (min_slices <= 12 && src_max_slices >= 12 && hdmi_max_slices >= 12)
 +                      target_slices = 12;
 +              else if (min_slices <= 16 && src_max_slices >= 16 && hdmi_max_slices >= 16)
 +                      target_slices = 16;
 +              else
 +                      return 0;
 +
 +              slice_width = DIV_ROUND_UP(crtc_state->hw.adjusted_mode.hdisplay, target_slices);
 +              if (slice_width >= max_slice_width)
 +                      min_slices = target_slices + 1;
 +      } while (slice_width >= max_slice_width);
 +
 +      return target_slices;
 +}
 +
 +/*
 + * intel_hdmi_dsc_get_bpp - get the appropriate compressed bits_per_pixel based on
 + * source and sink capabilities.
 + *
 + * @src_fraction_bpp: fractional bpp supported by the source
 + * @slice_width: dsc slice width supported by the source and sink
 + * @num_slices: num of slices supported by the source and sink
 + * @output_format: video output format
 + * @hdmi_all_bpp: sink supports decoding of 1/16th bpp setting
 + * @hdmi_max_chunk_bytes: max bytes in a line of chunks supported by sink
 + *
 + * @return: compressed bits_per_pixel in step of 1/16 of bits_per_pixel
 + */
 +int
 +intel_hdmi_dsc_get_bpp(int src_fractional_bpp, int slice_width, int num_slices,
 +                     int output_format, bool hdmi_all_bpp,
 +                     int hdmi_max_chunk_bytes)
 +{
 +      int max_dsc_bpp, min_dsc_bpp;
 +      int target_bytes;
 +      bool bpp_found = false;
 +      int bpp_decrement_x16;
 +      int bpp_target;
 +      int bpp_target_x16;
 +
 +      /*
 +       * Get min bpp and max bpp as per Table 7.23, in HDMI2.1 spec
 +       * Start with the max bpp and keep on decrementing with
 +       * fractional bpp, if supported by PCON DSC encoder
 +       *
 +       * for each bpp we check if no of bytes can be supported by HDMI sink
 +       */
 +
 +      /* Assuming: bpc as 8*/
 +      if (output_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
 +              min_dsc_bpp = 6;
 +              max_dsc_bpp = 3 * 4; /* 3*bpc/2 */
 +      } else if (output_format == INTEL_OUTPUT_FORMAT_YCBCR444 ||
 +                 output_format == INTEL_OUTPUT_FORMAT_RGB) {
 +              min_dsc_bpp = 8;
 +              max_dsc_bpp = 3 * 8; /* 3*bpc */
 +      } else {
 +              /* Assuming 4:2:2 encoding */
 +              min_dsc_bpp = 7;
 +              max_dsc_bpp = 2 * 8; /* 2*bpc */
 +      }
 +
 +      /*
 +       * Taking into account if all dsc_all_bpp supported by HDMI2.1 sink
 +       * Section 7.7.34 : Source shall not enable compressed Video
 +       * Transport with bpp_target settings above 12 bpp unless
 +       * DSC_all_bpp is set to 1.
 +       */
 +      if (!hdmi_all_bpp)
 +              max_dsc_bpp = min(max_dsc_bpp, 12);
 +
 +      /*
 +       * The Sink has a limit of compressed data in bytes for a scanline,
 +       * as described in max_chunk_bytes field in HFVSDB block of edid.
 +       * The no. of bytes depend on the target bits per pixel that the
 +       * source configures. So we start with the max_bpp and calculate
 +       * the target_chunk_bytes. We keep on decrementing the target_bpp,
 +       * till we get the target_chunk_bytes just less than what the sink's
 +       * max_chunk_bytes, or else till we reach the min_dsc_bpp.
 +       *
 +       * The decrement is according to the fractional support from PCON DSC
 +       * encoder. For fractional BPP we use bpp_target as a multiple of 16.
 +       *
 +       * bpp_target_x16 = bpp_target * 16
 +       * So we need to decrement by {1, 2, 4, 8, 16} for fractional bpps
 +       * {1/16, 1/8, 1/4, 1/2, 1} respectively.
 +       */
 +
 +      bpp_target = max_dsc_bpp;
 +
 +      /* src does not support fractional bpp implies decrement by 16 for bppx16 */
 +      if (!src_fractional_bpp)
 +              src_fractional_bpp = 1;
 +      bpp_decrement_x16 = DIV_ROUND_UP(16, src_fractional_bpp);
 +      bpp_target_x16 = (bpp_target * 16) - bpp_decrement_x16;
 +
 +      while (bpp_target_x16 > (min_dsc_bpp * 16)) {
 +              int bpp;
 +
 +              bpp = DIV_ROUND_UP(bpp_target_x16, 16);
 +              target_bytes = DIV_ROUND_UP((num_slices * slice_width * bpp), 8);
 +              if (target_bytes <= hdmi_max_chunk_bytes) {
 +                      bpp_found = true;
 +                      break;
 +              }
 +              bpp_target_x16 -= bpp_decrement_x16;
 +      }
 +      if (bpp_found)
 +              return bpp_target_x16;
 +
 +      return 0;
 +}
@@@ -1489,8 -1489,7 +1489,8 @@@ static int hws_pga_write(struct intel_v
        const struct intel_engine_cs *engine =
                intel_gvt_render_mmio_to_engine(vgpu->gvt, offset);
  
 -      if (!intel_gvt_ggtt_validate_range(vgpu, value, I915_GTT_PAGE_SIZE)) {
 +      if (value != 0 &&
 +          !intel_gvt_ggtt_validate_range(vgpu, value, I915_GTT_PAGE_SIZE)) {
                gvt_vgpu_err("write invalid HWSP address, reg:0x%x, value:0x%x\n",
                              offset, value);
                return -EINVAL;
@@@ -1651,34 -1650,6 +1651,34 @@@ static int edp_psr_imr_iir_write(struc
        return 0;
  }
  
 +/**
 + * FixMe:
 + * If guest fills non-priv batch buffer on ApolloLake/Broxton as Mesa i965 did:
 + * 717e7539124d (i965: Use a WC map and memcpy for the batch instead of pwrite.)
 + * Due to the missing flush of bb filled by VM vCPU, host GPU hangs on executing
 + * these MI_BATCH_BUFFER.
 + * Temporarily workaround this by setting SNOOP bit for PAT3 used by PPGTT
 + * PML4 PTE: PAT(0) PCD(1) PWT(1).
 + * The performance is still expected to be low, will need further improvement.
 + */
 +static int bxt_ppat_low_write(struct intel_vgpu *vgpu, unsigned int offset,
 +                            void *p_data, unsigned int bytes)
 +{
 +      u64 pat =
 +              GEN8_PPAT(0, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(1, 0) |
 +              GEN8_PPAT(2, 0) |
 +              GEN8_PPAT(3, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(4, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(5, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(6, CHV_PPAT_SNOOP) |
 +              GEN8_PPAT(7, CHV_PPAT_SNOOP);
 +
 +      vgpu_vreg(vgpu, offset) = lower_32_bits(pat);
 +
 +      return 0;
 +}
 +
  static int guc_status_read(struct intel_vgpu *vgpu,
                           unsigned int offset, void *p_data,
                           unsigned int bytes)
@@@ -2841,7 -2812,7 +2841,7 @@@ static int init_bdw_mmio_info(struct in
  
        MMIO_DH(GEN6_PCODE_MAILBOX, D_BDW_PLUS, NULL, mailbox_write);
  
 -      MMIO_D(GEN8_PRIVATE_PAT_LO, D_BDW_PLUS);
 +      MMIO_D(GEN8_PRIVATE_PAT_LO, D_BDW_PLUS & ~D_BXT);
        MMIO_D(GEN8_PRIVATE_PAT_HI, D_BDW_PLUS);
  
        MMIO_D(GAMTARBMODE, D_BDW_PLUS);
@@@ -3169,7 -3140,7 +3169,7 @@@ static int init_skl_mmio_info(struct in
                 NULL, NULL);
  
        MMIO_DFH(GAMT_CHKN_BIT_REG, D_KBL | D_CFL, F_CMD_ACCESS, NULL, NULL);
 -      MMIO_D(GEN9_CTX_PREEMPT_REG, D_SKL_PLUS);
 +      MMIO_D(GEN9_CTX_PREEMPT_REG, D_SKL_PLUS & ~D_BXT);
  
        return 0;
  }
@@@ -3343,21 -3314,9 +3343,21 @@@ static int init_bxt_mmio_info(struct in
        MMIO_D(GEN8_PUSHBUS_SHIFT, D_BXT);
        MMIO_D(GEN6_GFXPAUSE, D_BXT);
        MMIO_DFH(GEN8_L3SQCREG1, D_BXT, F_CMD_ACCESS, NULL, NULL);
 +      MMIO_DFH(GEN8_L3CNTLREG, D_BXT, F_CMD_ACCESS, NULL, NULL);
 +      MMIO_DFH(_MMIO(0x20D8), D_BXT, F_CMD_ACCESS, NULL, NULL);
 +      MMIO_F(GEN8_RING_CS_GPR(RENDER_RING_BASE, 0), 0x40, F_CMD_ACCESS,
 +             0, 0, D_BXT, NULL, NULL);
 +      MMIO_F(GEN8_RING_CS_GPR(GEN6_BSD_RING_BASE, 0), 0x40, F_CMD_ACCESS,
 +             0, 0, D_BXT, NULL, NULL);
 +      MMIO_F(GEN8_RING_CS_GPR(BLT_RING_BASE, 0), 0x40, F_CMD_ACCESS,
 +             0, 0, D_BXT, NULL, NULL);
 +      MMIO_F(GEN8_RING_CS_GPR(VEBOX_RING_BASE, 0), 0x40, F_CMD_ACCESS,
 +             0, 0, D_BXT, NULL, NULL);
  
        MMIO_DFH(GEN9_CTX_PREEMPT_REG, D_BXT, F_CMD_ACCESS, NULL, NULL);
  
 +      MMIO_DH(GEN8_PRIVATE_PAT_LO, D_BXT, NULL, bxt_ppat_low_write);
 +
        return 0;
  }
  
@@@ -3693,7 -3652,7 +3693,7 @@@ static inline int mmio_pm_restore_handl
        struct drm_i915_private *dev_priv = gvt->gt->i915;
  
        if (gvt->mmio.mmio_attribute[offset >> 2] & F_PM_SAVE)
-               I915_WRITE(_MMIO(offset), vgpu_vreg(vgpu, offset));
+               intel_uncore_write(&dev_priv->uncore, _MMIO(offset), vgpu_vreg(vgpu, offset));
  
        return 0;
  }
@@@ -378,308 -378,6 +378,6 @@@ static int i915_gem_object_info(struct 
        return 0;
  }
  
- static void gen8_display_interrupt_info(struct seq_file *m)
- {
-       struct drm_i915_private *dev_priv = node_to_i915(m->private);
-       enum pipe pipe;
-       for_each_pipe(dev_priv, pipe) {
-               enum intel_display_power_domain power_domain;
-               intel_wakeref_t wakeref;
-               power_domain = POWER_DOMAIN_PIPE(pipe);
-               wakeref = intel_display_power_get_if_enabled(dev_priv,
-                                                            power_domain);
-               if (!wakeref) {
-                       seq_printf(m, "Pipe %c power disabled\n",
-                                  pipe_name(pipe));
-                       continue;
-               }
-               seq_printf(m, "Pipe %c IMR:\t%08x\n",
-                          pipe_name(pipe),
-                          I915_READ(GEN8_DE_PIPE_IMR(pipe)));
-               seq_printf(m, "Pipe %c IIR:\t%08x\n",
-                          pipe_name(pipe),
-                          I915_READ(GEN8_DE_PIPE_IIR(pipe)));
-               seq_printf(m, "Pipe %c IER:\t%08x\n",
-                          pipe_name(pipe),
-                          I915_READ(GEN8_DE_PIPE_IER(pipe)));
-               intel_display_power_put(dev_priv, power_domain, wakeref);
-       }
-       seq_printf(m, "Display Engine port interrupt mask:\t%08x\n",
-                  I915_READ(GEN8_DE_PORT_IMR));
-       seq_printf(m, "Display Engine port interrupt identity:\t%08x\n",
-                  I915_READ(GEN8_DE_PORT_IIR));
-       seq_printf(m, "Display Engine port interrupt enable:\t%08x\n",
-                  I915_READ(GEN8_DE_PORT_IER));
-       seq_printf(m, "Display Engine misc interrupt mask:\t%08x\n",
-                  I915_READ(GEN8_DE_MISC_IMR));
-       seq_printf(m, "Display Engine misc interrupt identity:\t%08x\n",
-                  I915_READ(GEN8_DE_MISC_IIR));
-       seq_printf(m, "Display Engine misc interrupt enable:\t%08x\n",
-                  I915_READ(GEN8_DE_MISC_IER));
-       seq_printf(m, "PCU interrupt mask:\t%08x\n",
-                  I915_READ(GEN8_PCU_IMR));
-       seq_printf(m, "PCU interrupt identity:\t%08x\n",
-                  I915_READ(GEN8_PCU_IIR));
-       seq_printf(m, "PCU interrupt enable:\t%08x\n",
-                  I915_READ(GEN8_PCU_IER));
- }
- static int i915_interrupt_info(struct seq_file *m, void *data)
- {
-       struct drm_i915_private *dev_priv = node_to_i915(m->private);
-       struct intel_engine_cs *engine;
-       intel_wakeref_t wakeref;
-       int i, pipe;
-       wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
-       if (IS_CHERRYVIEW(dev_priv)) {
-               intel_wakeref_t pref;
-               seq_printf(m, "Master Interrupt Control:\t%08x\n",
-                          I915_READ(GEN8_MASTER_IRQ));
-               seq_printf(m, "Display IER:\t%08x\n",
-                          I915_READ(VLV_IER));
-               seq_printf(m, "Display IIR:\t%08x\n",
-                          I915_READ(VLV_IIR));
-               seq_printf(m, "Display IIR_RW:\t%08x\n",
-                          I915_READ(VLV_IIR_RW));
-               seq_printf(m, "Display IMR:\t%08x\n",
-                          I915_READ(VLV_IMR));
-               for_each_pipe(dev_priv, pipe) {
-                       enum intel_display_power_domain power_domain;
-                       power_domain = POWER_DOMAIN_PIPE(pipe);
-                       pref = intel_display_power_get_if_enabled(dev_priv,
-                                                                 power_domain);
-                       if (!pref) {
-                               seq_printf(m, "Pipe %c power disabled\n",
-                                          pipe_name(pipe));
-                               continue;
-                       }
-                       seq_printf(m, "Pipe %c stat:\t%08x\n",
-                                  pipe_name(pipe),
-                                  I915_READ(PIPESTAT(pipe)));
-                       intel_display_power_put(dev_priv, power_domain, pref);
-               }
-               pref = intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
-               seq_printf(m, "Port hotplug:\t%08x\n",
-                          I915_READ(PORT_HOTPLUG_EN));
-               seq_printf(m, "DPFLIPSTAT:\t%08x\n",
-                          I915_READ(VLV_DPFLIPSTAT));
-               seq_printf(m, "DPINVGTT:\t%08x\n",
-                          I915_READ(DPINVGTT));
-               intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, pref);
-               for (i = 0; i < 4; i++) {
-                       seq_printf(m, "GT Interrupt IMR %d:\t%08x\n",
-                                  i, I915_READ(GEN8_GT_IMR(i)));
-                       seq_printf(m, "GT Interrupt IIR %d:\t%08x\n",
-                                  i, I915_READ(GEN8_GT_IIR(i)));
-                       seq_printf(m, "GT Interrupt IER %d:\t%08x\n",
-                                  i, I915_READ(GEN8_GT_IER(i)));
-               }
-               seq_printf(m, "PCU interrupt mask:\t%08x\n",
-                          I915_READ(GEN8_PCU_IMR));
-               seq_printf(m, "PCU interrupt identity:\t%08x\n",
-                          I915_READ(GEN8_PCU_IIR));
-               seq_printf(m, "PCU interrupt enable:\t%08x\n",
-                          I915_READ(GEN8_PCU_IER));
-       } else if (INTEL_GEN(dev_priv) >= 11) {
-               if (HAS_MASTER_UNIT_IRQ(dev_priv))
-                       seq_printf(m, "Master Unit Interrupt Control:  %08x\n",
-                                  I915_READ(DG1_MSTR_UNIT_INTR));
-               seq_printf(m, "Master Interrupt Control:  %08x\n",
-                          I915_READ(GEN11_GFX_MSTR_IRQ));
-               seq_printf(m, "Render/Copy Intr Enable:   %08x\n",
-                          I915_READ(GEN11_RENDER_COPY_INTR_ENABLE));
-               seq_printf(m, "VCS/VECS Intr Enable:      %08x\n",
-                          I915_READ(GEN11_VCS_VECS_INTR_ENABLE));
-               seq_printf(m, "GUC/SG Intr Enable:\t   %08x\n",
-                          I915_READ(GEN11_GUC_SG_INTR_ENABLE));
-               seq_printf(m, "GPM/WGBOXPERF Intr Enable: %08x\n",
-                          I915_READ(GEN11_GPM_WGBOXPERF_INTR_ENABLE));
-               seq_printf(m, "Crypto Intr Enable:\t   %08x\n",
-                          I915_READ(GEN11_CRYPTO_RSVD_INTR_ENABLE));
-               seq_printf(m, "GUnit/CSME Intr Enable:\t   %08x\n",
-                          I915_READ(GEN11_GUNIT_CSME_INTR_ENABLE));
-               seq_printf(m, "Display Interrupt Control:\t%08x\n",
-                          I915_READ(GEN11_DISPLAY_INT_CTL));
-               gen8_display_interrupt_info(m);
-       } else if (INTEL_GEN(dev_priv) >= 8) {
-               seq_printf(m, "Master Interrupt Control:\t%08x\n",
-                          I915_READ(GEN8_MASTER_IRQ));
-               for (i = 0; i < 4; i++) {
-                       seq_printf(m, "GT Interrupt IMR %d:\t%08x\n",
-                                  i, I915_READ(GEN8_GT_IMR(i)));
-                       seq_printf(m, "GT Interrupt IIR %d:\t%08x\n",
-                                  i, I915_READ(GEN8_GT_IIR(i)));
-                       seq_printf(m, "GT Interrupt IER %d:\t%08x\n",
-                                  i, I915_READ(GEN8_GT_IER(i)));
-               }
-               gen8_display_interrupt_info(m);
-       } else if (IS_VALLEYVIEW(dev_priv)) {
-               intel_wakeref_t pref;
-               seq_printf(m, "Display IER:\t%08x\n",
-                          I915_READ(VLV_IER));
-               seq_printf(m, "Display IIR:\t%08x\n",
-                          I915_READ(VLV_IIR));
-               seq_printf(m, "Display IIR_RW:\t%08x\n",
-                          I915_READ(VLV_IIR_RW));
-               seq_printf(m, "Display IMR:\t%08x\n",
-                          I915_READ(VLV_IMR));
-               for_each_pipe(dev_priv, pipe) {
-                       enum intel_display_power_domain power_domain;
-                       power_domain = POWER_DOMAIN_PIPE(pipe);
-                       pref = intel_display_power_get_if_enabled(dev_priv,
-                                                                 power_domain);
-                       if (!pref) {
-                               seq_printf(m, "Pipe %c power disabled\n",
-                                          pipe_name(pipe));
-                               continue;
-                       }
-                       seq_printf(m, "Pipe %c stat:\t%08x\n",
-                                  pipe_name(pipe),
-                                  I915_READ(PIPESTAT(pipe)));
-                       intel_display_power_put(dev_priv, power_domain, pref);
-               }
-               seq_printf(m, "Master IER:\t%08x\n",
-                          I915_READ(VLV_MASTER_IER));
-               seq_printf(m, "Render IER:\t%08x\n",
-                          I915_READ(GTIER));
-               seq_printf(m, "Render IIR:\t%08x\n",
-                          I915_READ(GTIIR));
-               seq_printf(m, "Render IMR:\t%08x\n",
-                          I915_READ(GTIMR));
-               seq_printf(m, "PM IER:\t\t%08x\n",
-                          I915_READ(GEN6_PMIER));
-               seq_printf(m, "PM IIR:\t\t%08x\n",
-                          I915_READ(GEN6_PMIIR));
-               seq_printf(m, "PM IMR:\t\t%08x\n",
-                          I915_READ(GEN6_PMIMR));
-               pref = intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
-               seq_printf(m, "Port hotplug:\t%08x\n",
-                          I915_READ(PORT_HOTPLUG_EN));
-               seq_printf(m, "DPFLIPSTAT:\t%08x\n",
-                          I915_READ(VLV_DPFLIPSTAT));
-               seq_printf(m, "DPINVGTT:\t%08x\n",
-                          I915_READ(DPINVGTT));
-               intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, pref);
-       } else if (!HAS_PCH_SPLIT(dev_priv)) {
-               seq_printf(m, "Interrupt enable:    %08x\n",
-                          I915_READ(GEN2_IER));
-               seq_printf(m, "Interrupt identity:  %08x\n",
-                          I915_READ(GEN2_IIR));
-               seq_printf(m, "Interrupt mask:      %08x\n",
-                          I915_READ(GEN2_IMR));
-               for_each_pipe(dev_priv, pipe)
-                       seq_printf(m, "Pipe %c stat:         %08x\n",
-                                  pipe_name(pipe),
-                                  I915_READ(PIPESTAT(pipe)));
-       } else {
-               seq_printf(m, "North Display Interrupt enable:          %08x\n",
-                          I915_READ(DEIER));
-               seq_printf(m, "North Display Interrupt identity:        %08x\n",
-                          I915_READ(DEIIR));
-               seq_printf(m, "North Display Interrupt mask:            %08x\n",
-                          I915_READ(DEIMR));
-               seq_printf(m, "South Display Interrupt enable:          %08x\n",
-                          I915_READ(SDEIER));
-               seq_printf(m, "South Display Interrupt identity:        %08x\n",
-                          I915_READ(SDEIIR));
-               seq_printf(m, "South Display Interrupt mask:            %08x\n",
-                          I915_READ(SDEIMR));
-               seq_printf(m, "Graphics Interrupt enable:               %08x\n",
-                          I915_READ(GTIER));
-               seq_printf(m, "Graphics Interrupt identity:             %08x\n",
-                          I915_READ(GTIIR));
-               seq_printf(m, "Graphics Interrupt mask:         %08x\n",
-                          I915_READ(GTIMR));
-       }
-       if (INTEL_GEN(dev_priv) >= 11) {
-               seq_printf(m, "RCS Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_RCS0_RSVD_INTR_MASK));
-               seq_printf(m, "BCS Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_BCS_RSVD_INTR_MASK));
-               seq_printf(m, "VCS0/VCS1 Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_VCS0_VCS1_INTR_MASK));
-               seq_printf(m, "VCS2/VCS3 Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_VCS2_VCS3_INTR_MASK));
-               seq_printf(m, "VECS0/VECS1 Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_VECS0_VECS1_INTR_MASK));
-               seq_printf(m, "GUC/SG Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_GUC_SG_INTR_MASK));
-               seq_printf(m, "GPM/WGBOXPERF Intr Mask: %08x\n",
-                          I915_READ(GEN11_GPM_WGBOXPERF_INTR_MASK));
-               seq_printf(m, "Crypto Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_CRYPTO_RSVD_INTR_MASK));
-               seq_printf(m, "Gunit/CSME Intr Mask:\t %08x\n",
-                          I915_READ(GEN11_GUNIT_CSME_INTR_MASK));
-       } else if (INTEL_GEN(dev_priv) >= 6) {
-               for_each_uabi_engine(engine, dev_priv) {
-                       seq_printf(m,
-                                  "Graphics Interrupt mask (%s):       %08x\n",
-                                  engine->name, ENGINE_READ(engine, RING_IMR));
-               }
-       }
-       intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
-       return 0;
- }
- static int i915_gem_fence_regs_info(struct seq_file *m, void *data)
- {
-       struct drm_i915_private *i915 = node_to_i915(m->private);
-       unsigned int i;
-       seq_printf(m, "Total fences = %d\n", i915->ggtt.num_fences);
-       rcu_read_lock();
-       for (i = 0; i < i915->ggtt.num_fences; i++) {
-               struct i915_fence_reg *reg = &i915->ggtt.fence_regs[i];
-               struct i915_vma *vma = reg->vma;
-               seq_printf(m, "Fence %d, pin count = %d, object = ",
-                          i, atomic_read(&reg->pin_count));
-               if (!vma)
-                       seq_puts(m, "unused");
-               else
-                       i915_debugfs_describe_obj(m, vma->obj);
-               seq_putc(m, '\n');
-       }
-       rcu_read_unlock();
-       return 0;
- }
  #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
  static ssize_t gpu_state_read(struct file *file, char __user *ubuf,
                              size_t count, loff_t *pos)
@@@ -725,7 -423,7 +423,7 @@@ static int i915_gpu_info_open(struct in
  
        gpu = NULL;
        with_intel_runtime_pm(&i915->runtime_pm, wakeref)
 -              gpu = i915_gpu_coredump(i915);
 +              gpu = i915_gpu_coredump(&i915->gt, ALL_ENGINES);
        if (IS_ERR(gpu))
                return PTR_ERR(gpu);
  
@@@ -802,7 -500,7 +500,7 @@@ static int i915_frequency_info(struct s
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                u32 rpmodectl, freq_sts;
  
-               rpmodectl = I915_READ(GEN6_RP_CONTROL);
+               rpmodectl = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CONTROL);
                seq_printf(m, "Video Turbo Mode: %s\n",
                           yesno(rpmodectl & GEN6_RP_MEDIA_TURBO));
                seq_printf(m, "HW control enabled: %s\n",
                u32 pm_ier, pm_imr, pm_isr, pm_iir, pm_mask;
                int max_freq;
  
-               rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
+               rp_state_limits = intel_uncore_read(&dev_priv->uncore, GEN6_RP_STATE_LIMITS);
                if (IS_GEN9_LP(dev_priv)) {
-                       rp_state_cap = I915_READ(BXT_RP_STATE_CAP);
-                       gt_perf_status = I915_READ(BXT_GT_PERF_STATUS);
+                       rp_state_cap = intel_uncore_read(&dev_priv->uncore, BXT_RP_STATE_CAP);
+                       gt_perf_status = intel_uncore_read(&dev_priv->uncore, BXT_GT_PERF_STATUS);
                } else {
-                       rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
-                       gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
+                       rp_state_cap = intel_uncore_read(&dev_priv->uncore, GEN6_RP_STATE_CAP);
+                       gt_perf_status = intel_uncore_read(&dev_priv->uncore, GEN6_GT_PERF_STATUS);
                }
  
                /* RPSTAT1 is in the GT power well */
                intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
  
-               reqf = I915_READ(GEN6_RPNSWREQ);
+               reqf = intel_uncore_read(&dev_priv->uncore, GEN6_RPNSWREQ);
                if (INTEL_GEN(dev_priv) >= 9)
                        reqf >>= 23;
                else {
                }
                reqf = intel_gpu_freq(rps, reqf);
  
-               rpmodectl = I915_READ(GEN6_RP_CONTROL);
-               rpinclimit = I915_READ(GEN6_RP_UP_THRESHOLD);
-               rpdeclimit = I915_READ(GEN6_RP_DOWN_THRESHOLD);
-               rpstat = I915_READ(GEN6_RPSTAT1);
-               rpupei = I915_READ(GEN6_RP_CUR_UP_EI) & GEN6_CURICONT_MASK;
-               rpcurup = I915_READ(GEN6_RP_CUR_UP) & GEN6_CURBSYTAVG_MASK;
-               rpprevup = I915_READ(GEN6_RP_PREV_UP) & GEN6_CURBSYTAVG_MASK;
-               rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI) & GEN6_CURIAVG_MASK;
-               rpcurdown = I915_READ(GEN6_RP_CUR_DOWN) & GEN6_CURBSYTAVG_MASK;
-               rpprevdown = I915_READ(GEN6_RP_PREV_DOWN) & GEN6_CURBSYTAVG_MASK;
+               rpmodectl = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CONTROL);
+               rpinclimit = intel_uncore_read(&dev_priv->uncore, GEN6_RP_UP_THRESHOLD);
+               rpdeclimit = intel_uncore_read(&dev_priv->uncore, GEN6_RP_DOWN_THRESHOLD);
+               rpstat = intel_uncore_read(&dev_priv->uncore, GEN6_RPSTAT1);
+               rpupei = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_UP_EI) & GEN6_CURICONT_MASK;
+               rpcurup = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_UP) & GEN6_CURBSYTAVG_MASK;
+               rpprevup = intel_uncore_read(&dev_priv->uncore, GEN6_RP_PREV_UP) & GEN6_CURBSYTAVG_MASK;
+               rpdownei = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_DOWN_EI) & GEN6_CURIAVG_MASK;
+               rpcurdown = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_DOWN) & GEN6_CURBSYTAVG_MASK;
+               rpprevdown = intel_uncore_read(&dev_priv->uncore, GEN6_RP_PREV_DOWN) & GEN6_CURBSYTAVG_MASK;
                cagf = intel_rps_read_actual_frequency(rps);
  
                intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
  
                if (INTEL_GEN(dev_priv) >= 11) {
-                       pm_ier = I915_READ(GEN11_GPM_WGBOXPERF_INTR_ENABLE);
-                       pm_imr = I915_READ(GEN11_GPM_WGBOXPERF_INTR_MASK);
+                       pm_ier = intel_uncore_read(&dev_priv->uncore, GEN11_GPM_WGBOXPERF_INTR_ENABLE);
+                       pm_imr = intel_uncore_read(&dev_priv->uncore, GEN11_GPM_WGBOXPERF_INTR_MASK);
                        /*
                         * The equivalent to the PM ISR & IIR cannot be read
                         * without affecting the current state of the system
                        pm_isr = 0;
                        pm_iir = 0;
                } else if (INTEL_GEN(dev_priv) >= 8) {
-                       pm_ier = I915_READ(GEN8_GT_IER(2));
-                       pm_imr = I915_READ(GEN8_GT_IMR(2));
-                       pm_isr = I915_READ(GEN8_GT_ISR(2));
-                       pm_iir = I915_READ(GEN8_GT_IIR(2));
+                       pm_ier = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IER(2));
+                       pm_imr = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IMR(2));
+                       pm_isr = intel_uncore_read(&dev_priv->uncore, GEN8_GT_ISR(2));
+                       pm_iir = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IIR(2));
                } else {
-                       pm_ier = I915_READ(GEN6_PMIER);
-                       pm_imr = I915_READ(GEN6_PMIMR);
-                       pm_isr = I915_READ(GEN6_PMISR);
-                       pm_iir = I915_READ(GEN6_PMIIR);
+                       pm_ier = intel_uncore_read(&dev_priv->uncore, GEN6_PMIER);
+                       pm_imr = intel_uncore_read(&dev_priv->uncore, GEN6_PMIMR);
+                       pm_isr = intel_uncore_read(&dev_priv->uncore, GEN6_PMISR);
+                       pm_iir = intel_uncore_read(&dev_priv->uncore, GEN6_PMIIR);
                }
-               pm_mask = I915_READ(GEN6_PMINTRMSK);
+               pm_mask = intel_uncore_read(&dev_priv->uncore, GEN6_PMINTRMSK);
  
                seq_printf(m, "Video Turbo Mode: %s\n",
                           yesno(rpmodectl & GEN6_RP_MEDIA_TURBO));
        return 0;
  }
  
- static int i915_ring_freq_table(struct seq_file *m, void *unused)
- {
-       struct drm_i915_private *dev_priv = node_to_i915(m->private);
-       struct intel_rps *rps = &dev_priv->gt.rps;
-       unsigned int max_gpu_freq, min_gpu_freq;
-       intel_wakeref_t wakeref;
-       int gpu_freq, ia_freq;
-       if (!HAS_LLC(dev_priv))
-               return -ENODEV;
-       min_gpu_freq = rps->min_freq;
-       max_gpu_freq = rps->max_freq;
-       if (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
-               /* Convert GT frequency to 50 HZ units */
-               min_gpu_freq /= GEN9_FREQ_SCALER;
-               max_gpu_freq /= GEN9_FREQ_SCALER;
-       }
-       seq_puts(m, "GPU freq (MHz)\tEffective CPU freq (MHz)\tEffective Ring freq (MHz)\n");
-       wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
-       for (gpu_freq = min_gpu_freq; gpu_freq <= max_gpu_freq; gpu_freq++) {
-               ia_freq = gpu_freq;
-               sandybridge_pcode_read(dev_priv,
-                                      GEN6_PCODE_READ_MIN_FREQ_TABLE,
-                                      &ia_freq, NULL);
-               seq_printf(m, "%d\t\t%d\t\t\t\t%d\n",
-                          intel_gpu_freq(rps,
-                                         (gpu_freq *
-                                          (IS_GEN9_BC(dev_priv) ||
-                                           INTEL_GEN(dev_priv) >= 10 ?
-                                           GEN9_FREQ_SCALER : 1))),
-                          ((ia_freq >> 0) & 0xff) * 100,
-                          ((ia_freq >> 8) & 0xff) * 100);
-       }
-       intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
-       return 0;
- }
- static void describe_ctx_ring(struct seq_file *m, struct intel_ring *ring)
- {
-       seq_printf(m, " (ringbuffer, space: %d, head: %u, tail: %u, emit: %u)",
-                  ring->space, ring->head, ring->tail, ring->emit);
- }
- static int i915_context_status(struct seq_file *m, void *unused)
- {
-       struct drm_i915_private *i915 = node_to_i915(m->private);
-       struct i915_gem_context *ctx, *cn;
-       spin_lock(&i915->gem.contexts.lock);
-       list_for_each_entry_safe(ctx, cn, &i915->gem.contexts.list, link) {
-               struct i915_gem_engines_iter it;
-               struct intel_context *ce;
-               if (!kref_get_unless_zero(&ctx->ref))
-                       continue;
-               spin_unlock(&i915->gem.contexts.lock);
-               seq_puts(m, "HW context ");
-               if (ctx->pid) {
-                       struct task_struct *task;
-                       task = get_pid_task(ctx->pid, PIDTYPE_PID);
-                       if (task) {
-                               seq_printf(m, "(%s [%d]) ",
-                                          task->comm, task->pid);
-                               put_task_struct(task);
-                       }
-               } else if (IS_ERR(ctx->file_priv)) {
-                       seq_puts(m, "(deleted) ");
-               } else {
-                       seq_puts(m, "(kernel) ");
-               }
-               seq_putc(m, ctx->remap_slice ? 'R' : 'r');
-               seq_putc(m, '\n');
-               for_each_gem_engine(ce,
-                                   i915_gem_context_lock_engines(ctx), it) {
-                       if (intel_context_pin_if_active(ce)) {
-                               seq_printf(m, "%s: ", ce->engine->name);
-                               if (ce->state)
-                                       i915_debugfs_describe_obj(m, ce->state->obj);
-                               describe_ctx_ring(m, ce->ring);
-                               seq_putc(m, '\n');
-                               intel_context_unpin(ce);
-                       }
-               }
-               i915_gem_context_unlock_engines(ctx);
-               seq_putc(m, '\n');
-               spin_lock(&i915->gem.contexts.lock);
-               list_safe_reset_next(ctx, cn, link);
-               i915_gem_context_put(ctx);
-       }
-       spin_unlock(&i915->gem.contexts.lock);
-       return 0;
- }
  static const char *swizzle_string(unsigned swizzle)
  {
        switch (swizzle) {
@@@ -1193,20 -786,6 +786,6 @@@ static int i915_swizzle_info(struct seq
        return 0;
  }
  
- static const char *rps_power_to_str(unsigned int power)
- {
-       static const char * const strings[] = {
-               [LOW_POWER] = "low power",
-               [BETWEEN] = "mixed",
-               [HIGH_POWER] = "high power",
-       };
-       if (power >= ARRAY_SIZE(strings) || !strings[power])
-               return "unknown";
-       return strings[power];
- }
  static int i915_rps_boost_info(struct seq_file *m, void *data)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
  
        seq_printf(m, "Wait boosts: %d\n", atomic_read(&rps->boosts));
  
-       if (INTEL_GEN(dev_priv) >= 6 && intel_rps_is_active(rps)) {
-               u32 rpup, rpupei;
-               u32 rpdown, rpdownei;
-               intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
-               rpup = I915_READ_FW(GEN6_RP_CUR_UP) & GEN6_RP_EI_MASK;
-               rpupei = I915_READ_FW(GEN6_RP_CUR_UP_EI) & GEN6_RP_EI_MASK;
-               rpdown = I915_READ_FW(GEN6_RP_CUR_DOWN) & GEN6_RP_EI_MASK;
-               rpdownei = I915_READ_FW(GEN6_RP_CUR_DOWN_EI) & GEN6_RP_EI_MASK;
-               intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
-               seq_printf(m, "\nRPS Autotuning (current \"%s\" window):\n",
-                          rps_power_to_str(rps->power.mode));
-               seq_printf(m, "  Avg. up: %d%% [above threshold? %d%%]\n",
-                          rpup && rpupei ? 100 * rpup / rpupei : 0,
-                          rps->power.up_threshold);
-               seq_printf(m, "  Avg. down: %d%% [below threshold? %d%%]\n",
-                          rpdown && rpdownei ? 100 * rpdown / rpdownei : 0,
-                          rps->power.down_threshold);
-       } else {
-               seq_puts(m, "\nRPS Autotuning inactive\n");
-       }
-       return 0;
- }
- static int i915_llc(struct seq_file *m, void *data)
- {
-       struct drm_i915_private *dev_priv = node_to_i915(m->private);
-       const bool edram = INTEL_GEN(dev_priv) > 8;
-       seq_printf(m, "LLC: %s\n", yesno(HAS_LLC(dev_priv)));
-       seq_printf(m, "%s: %uMB\n", edram ? "eDRAM" : "eLLC",
-                  dev_priv->edram_size_mb);
        return 0;
  }
  
@@@ -1280,7 -824,7 +824,7 @@@ static int i915_runtime_pm_status(struc
                seq_puts(m, "Runtime power management not supported\n");
  
        seq_printf(m, "Runtime power status: %s\n",
-                  enableddisabled(!dev_priv->power_domains.wakeref));
+                  enableddisabled(!dev_priv->power_domains.init_wakeref));
  
        seq_printf(m, "GPU idle: %s\n", yesno(!dev_priv->gt.awake));
        seq_printf(m, "IRQs disabled: %s\n",
@@@ -1328,16 -872,6 +872,6 @@@ static int i915_engine_info(struct seq_
        return 0;
  }
  
- static int i915_shrinker_info(struct seq_file *m, void *unused)
- {
-       struct drm_i915_private *i915 = node_to_i915(m->private);
-       seq_printf(m, "seeks = %d\n", i915->mm.shrinker.seeks);
-       seq_printf(m, "batch = %lu\n", i915->mm.shrinker.batch);
-       return 0;
- }
  static int i915_wa_registers(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *i915 = node_to_i915(m->private);
@@@ -1529,55 -1063,6 +1063,6 @@@ DEFINE_SIMPLE_ATTRIBUTE(i915_drop_cache
                        i915_drop_caches_get, i915_drop_caches_set,
                        "0x%08llx\n");
  
- static int
- i915_cache_sharing_get(void *data, u64 *val)
- {
-       struct drm_i915_private *dev_priv = data;
-       intel_wakeref_t wakeref;
-       u32 snpcr = 0;
-       if (!(IS_GEN_RANGE(dev_priv, 6, 7)))
-               return -ENODEV;
-       with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref)
-               snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
-       *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT;
-       return 0;
- }
- static int
- i915_cache_sharing_set(void *data, u64 val)
- {
-       struct drm_i915_private *dev_priv = data;
-       intel_wakeref_t wakeref;
-       if (!(IS_GEN_RANGE(dev_priv, 6, 7)))
-               return -ENODEV;
-       if (val > 3)
-               return -EINVAL;
-       drm_dbg(&dev_priv->drm,
-               "Manually setting uncore sharing to %llu\n", val);
-       with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
-               u32 snpcr;
-               /* Update the cache sharing policy here as well */
-               snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
-               snpcr &= ~GEN6_MBC_SNPCR_MASK;
-               snpcr |= val << GEN6_MBC_SNPCR_SHIFT;
-               I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
-       }
-       return 0;
- }
- DEFINE_SIMPLE_ATTRIBUTE(i915_cache_sharing_fops,
-                       i915_cache_sharing_get, i915_cache_sharing_set,
-                       "%llu\n");
  static int i915_sseu_status(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *i915 = node_to_i915(m->private);
@@@ -1621,16 -1106,10 +1106,10 @@@ static const struct file_operations i91
  static const struct drm_info_list i915_debugfs_list[] = {
        {"i915_capabilities", i915_capabilities, 0},
        {"i915_gem_objects", i915_gem_object_info, 0},
-       {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0},
-       {"i915_gem_interrupt", i915_interrupt_info, 0},
        {"i915_frequency_info", i915_frequency_info, 0},
-       {"i915_ring_freq_table", i915_ring_freq_table, 0},
-       {"i915_context_status", i915_context_status, 0},
        {"i915_swizzle_info", i915_swizzle_info, 0},
-       {"i915_llc", i915_llc, 0},
        {"i915_runtime_pm_status", i915_runtime_pm_status, 0},
        {"i915_engine_info", i915_engine_info, 0},
-       {"i915_shrinker_info", i915_shrinker_info, 0},
        {"i915_wa_registers", i915_wa_registers, 0},
        {"i915_sseu_status", i915_sseu_status, 0},
        {"i915_rps_boost_info", i915_rps_boost_info, 0},
@@@ -1643,7 -1122,6 +1122,6 @@@ static const struct i915_debugfs_files 
  } i915_debugfs_files[] = {
        {"i915_perf_noa_delay", &i915_perf_noa_delay_fops},
        {"i915_wedged", &i915_wedged_fops},
-       {"i915_cache_sharing", &i915_cache_sharing_fops},
        {"i915_gem_drop_caches", &i915_drop_caches_fops},
  #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
        {"i915_error_state", &i915_error_state_fops},
@@@ -87,7 -87,7 +87,7 @@@
  #include "intel_sideband.h"
  #include "vlv_suspend.h"
  
 -static struct drm_driver driver;
 +static const struct drm_driver driver;
  
  static int i915_get_bridge_dev(struct drm_i915_private *dev_priv)
  {
@@@ -578,8 -578,6 +578,6 @@@ static int i915_driver_hw_probe(struct 
  
        pci_set_master(pdev);
  
-       cpu_latency_qos_add_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE);
        intel_gt_init_workarounds(dev_priv);
  
        /* On the 945G/GM, the chipset reports the MSI capability on the
  err_msi:
        if (pdev->msi_enabled)
                pci_disable_msi(pdev);
-       cpu_latency_qos_remove_request(&dev_priv->pm_qos);
  err_mem_regions:
        intel_memory_regions_driver_release(dev_priv);
  err_ggtt:
@@@ -648,8 -645,6 +645,6 @@@ static void i915_driver_hw_remove(struc
  
        if (pdev->msi_enabled)
                pci_disable_msi(pdev);
-       cpu_latency_qos_remove_request(&dev_priv->pm_qos);
  }
  
  /**
@@@ -738,6 -733,7 +733,7 @@@ static void i915_driver_unregister(stru
         * events.
         */
        drm_kms_helper_poll_fini(&dev_priv->drm);
+       drm_atomic_helper_shutdown(&dev_priv->drm);
  
        intel_gt_driver_unregister(&dev_priv->gt);
        acpi_video_unregister();
@@@ -940,8 -936,6 +936,6 @@@ void i915_driver_remove(struct drm_i915
  
        i915_gem_suspend(i915);
  
-       drm_atomic_helper_shutdown(&i915->drm);
        intel_gvt_driver_remove(i915);
  
        intel_modeset_driver_remove(i915);
@@@ -1761,7 -1755,7 +1755,7 @@@ static const struct drm_ioctl_desc i915
        DRM_IOCTL_DEF_DRV(I915_GEM_VM_DESTROY, i915_gem_vm_destroy_ioctl, DRM_RENDER_ALLOW),
  };
  
 -static struct drm_driver driver = {
 +static const struct drm_driver driver = {
        /* Don't use MTRRs here; the Xserver or userspace app should
         * deal with them for Intel hardware.
         */
@@@ -416,6 -416,7 +416,7 @@@ struct intel_fbc 
                u16 gen9_wa_cfb_stride;
                u16 interval;
                s8 fence_id;
+               bool psr2_active;
        } state_cache;
  
        /*
@@@ -891,9 -892,6 +892,6 @@@ struct drm_i915_private 
  
        bool display_irqs_enabled;
  
-       /* To control wakeup latency, e.g. for irq-driven dp aux transfers. */
-       struct pm_qos_request pm_qos;
        /* Sideband mailbox protection */
        struct mutex sb_lock;
        struct pm_qos_request sb_qos;
@@@ -1579,9 -1577,9 +1577,9 @@@ static inline const struct i915_rev_ste
  tgl_revids_get(struct drm_i915_private *dev_priv)
  {
        if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv))
 -              return tgl_uy_revids;
 +              return &tgl_uy_revids[INTEL_REVID(dev_priv)];
        else
 -              return tgl_revids;
 +              return &tgl_revids[INTEL_REVID(dev_priv)];
  }
  
  #define IS_TGL_DISP_REVID(p, since, until) \
  
  #define IS_TGL_UY_GT_REVID(p, since, until) \
        ((IS_TGL_U(p) || IS_TGL_Y(p)) && \
 -       tgl_uy_revids->gt_stepping >= (since) && \
 -       tgl_uy_revids->gt_stepping <= (until))
 +       tgl_uy_revids[INTEL_REVID(p)].gt_stepping >= (since) && \
 +       tgl_uy_revids[INTEL_REVID(p)].gt_stepping <= (until))
  
  #define IS_TGL_GT_REVID(p, since, until) \
        (IS_TIGERLAKE(p) && \
         !(IS_TGL_U(p) || IS_TGL_Y(p)) && \
 -       tgl_revids->gt_stepping >= (since) && \
 -       tgl_revids->gt_stepping <= (until))
 +       tgl_revids[INTEL_REVID(p)].gt_stepping >= (since) && \
 +       tgl_revids[INTEL_REVID(p)].gt_stepping <= (until))
  
  #define RKL_REVID_A0          0x0
  #define RKL_REVID_B0          0x1
  #define HAS_SNOOP(dev_priv)   (INTEL_INFO(dev_priv)->has_snoop)
  #define HAS_EDRAM(dev_priv)   ((dev_priv)->edram_size_mb)
  #define HAS_SECURE_BATCHES(dev_priv) (INTEL_GEN(dev_priv) < 6)
 -#define HAS_WT(dev_priv)      ((IS_HASWELL(dev_priv) || \
 -                               IS_BROADWELL(dev_priv)) && HAS_EDRAM(dev_priv))
 +#define HAS_WT(dev_priv)      HAS_EDRAM(dev_priv)
  
  #define HWS_NEEDS_PHYSICAL(dev_priv)  (INTEL_INFO(dev_priv)->hws_needs_physical)
  
@@@ -1970,43 -1969,6 +1968,6 @@@ mkwrite_device_info(struct drm_i915_pri
  int i915_reg_read_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file);
  
- #define __I915_REG_OP(op__, dev_priv__, ...) \
-       intel_uncore_##op__(&(dev_priv__)->uncore, __VA_ARGS__)
- #define I915_READ(reg__)       __I915_REG_OP(read, dev_priv, (reg__))
- #define I915_WRITE(reg__, val__) __I915_REG_OP(write, dev_priv, (reg__), (val__))
- #define POSTING_READ(reg__)   __I915_REG_OP(posting_read, dev_priv, (reg__))
- /* These are untraced mmio-accessors that are only valid to be used inside
-  * critical sections, such as inside IRQ handlers, where forcewake is explicitly
-  * controlled.
-  *
-  * Think twice, and think again, before using these.
-  *
-  * As an example, these accessors can possibly be used between:
-  *
-  * spin_lock_irq(&dev_priv->uncore.lock);
-  * intel_uncore_forcewake_get__locked();
-  *
-  * and
-  *
-  * intel_uncore_forcewake_put__locked();
-  * spin_unlock_irq(&dev_priv->uncore.lock);
-  *
-  *
-  * Note: some registers may not need forcewake held, so
-  * intel_uncore_forcewake_{get,put} can be omitted, see
-  * intel_uncore_forcewake_for_reg().
-  *
-  * Certain architectures will die if the same cacheline is concurrently accessed
-  * by different clients (e.g. on Ivybridge). Access to registers should
-  * therefore generally be serialised, by either the dev_priv->uncore.lock or
-  * a more localised lock guarding all access to that bank of registers.
-  */
- #define I915_READ_FW(reg__) __I915_REG_OP(read_fw, dev_priv, (reg__))
- #define I915_WRITE_FW(reg__, val__) __I915_REG_OP(write_fw, dev_priv, (reg__), (val__))
  /* i915_mm.c */
  int remap_io_mapping(struct vm_area_struct *vma,
                     unsigned long addr, unsigned long pfn, unsigned long size,
   * and related files, but that will be described in separate chapters.
   */
  
 +/*
 + * Interrupt statistic for PMU. Increments the counter only if the
 + * interrupt originated from the the GPU so interrupts from a device which
 + * shares the interrupt line are not accounted.
 + */
 +static inline void pmu_irq_stats(struct drm_i915_private *i915,
 +                               irqreturn_t res)
 +{
 +      if (unlikely(res != IRQ_HANDLED))
 +              return;
 +
 +      /*
 +       * A clever compiler translates that into INC. A not so clever one
 +       * should at least prevent store tearing.
 +       */
 +      WRITE_ONCE(i915->pmu.irq_count, i915->pmu.irq_count + 1);
 +}
 +
  typedef bool (*long_pulse_detect_func)(enum hpd_pin pin, u32 val);
  typedef u32 (*hotplug_enables_func)(struct drm_i915_private *i915,
                                    enum hpd_pin pin);
@@@ -327,10 -309,10 +327,10 @@@ i915_hotplug_interrupt_update_locked(st
        lockdep_assert_held(&dev_priv->irq_lock);
        drm_WARN_ON(&dev_priv->drm, bits & ~mask);
  
-       val = I915_READ(PORT_HOTPLUG_EN);
+       val = intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_EN);
        val &= ~mask;
        val |= bits;
-       I915_WRITE(PORT_HOTPLUG_EN, val);
+       intel_uncore_write(&dev_priv->uncore, PORT_HOTPLUG_EN, val);
  }
  
  /**
@@@ -376,8 -358,8 +376,8 @@@ void ilk_update_display_irq(struct drm_
        if (new_val != dev_priv->irq_mask &&
            !drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv))) {
                dev_priv->irq_mask = new_val;
-               I915_WRITE(DEIMR, dev_priv->irq_mask);
-               POSTING_READ(DEIMR);
+               intel_uncore_write(&dev_priv->uncore, DEIMR, dev_priv->irq_mask);
+               intel_uncore_posting_read(&dev_priv->uncore, DEIMR);
        }
  }
  
@@@ -401,15 -383,15 +401,15 @@@ static void bdw_update_port_irq(struct 
        if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
                return;
  
-       old_val = I915_READ(GEN8_DE_PORT_IMR);
+       old_val = intel_uncore_read(&dev_priv->uncore, GEN8_DE_PORT_IMR);
  
        new_val = old_val;
        new_val &= ~interrupt_mask;
        new_val |= (~enabled_irq_mask & interrupt_mask);
  
        if (new_val != old_val) {
-               I915_WRITE(GEN8_DE_PORT_IMR, new_val);
-               POSTING_READ(GEN8_DE_PORT_IMR);
+               intel_uncore_write(&dev_priv->uncore, GEN8_DE_PORT_IMR, new_val);
+               intel_uncore_posting_read(&dev_priv->uncore, GEN8_DE_PORT_IMR);
        }
  }
  
@@@ -440,8 -422,8 +440,8 @@@ void bdw_update_pipe_irq(struct drm_i91
  
        if (new_val != dev_priv->de_irq_mask[pipe]) {
                dev_priv->de_irq_mask[pipe] = new_val;
-               I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
-               POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
+               intel_uncore_write(&dev_priv->uncore, GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
+               intel_uncore_posting_read(&dev_priv->uncore, GEN8_DE_PIPE_IMR(pipe));
        }
  }
  
@@@ -455,7 -437,7 +455,7 @@@ void ibx_display_interrupt_update(struc
                                  u32 interrupt_mask,
                                  u32 enabled_irq_mask)
  {
-       u32 sdeimr = I915_READ(SDEIMR);
+       u32 sdeimr = intel_uncore_read(&dev_priv->uncore, SDEIMR);
        sdeimr &= ~interrupt_mask;
        sdeimr |= (~enabled_irq_mask & interrupt_mask);
  
        if (drm_WARN_ON(&dev_priv->drm, !intel_irqs_enabled(dev_priv)))
                return;
  
-       I915_WRITE(SDEIMR, sdeimr);
-       POSTING_READ(SDEIMR);
+       intel_uncore_write(&dev_priv->uncore, SDEIMR, sdeimr);
+       intel_uncore_posting_read(&dev_priv->uncore, SDEIMR);
  }
  
  u32 i915_pipestat_enable_mask(struct drm_i915_private *dev_priv,
@@@ -533,8 -515,8 +533,8 @@@ void i915_enable_pipestat(struct drm_i9
        dev_priv->pipestat_irq_mask[pipe] |= status_mask;
        enable_mask = i915_pipestat_enable_mask(dev_priv, pipe);
  
-       I915_WRITE(reg, enable_mask | status_mask);
-       POSTING_READ(reg);
+       intel_uncore_write(&dev_priv->uncore, reg, enable_mask | status_mask);
+       intel_uncore_posting_read(&dev_priv->uncore, reg);
  }
  
  void i915_disable_pipestat(struct drm_i915_private *dev_priv,
        dev_priv->pipestat_irq_mask[pipe] &= ~status_mask;
        enable_mask = i915_pipestat_enable_mask(dev_priv, pipe);
  
-       I915_WRITE(reg, enable_mask | status_mask);
-       POSTING_READ(reg);
+       intel_uncore_write(&dev_priv->uncore, reg, enable_mask | status_mask);
+       intel_uncore_posting_read(&dev_priv->uncore, reg);
  }
  
  static bool i915_has_asle(struct drm_i915_private *dev_priv)
@@@ -715,7 -697,7 +715,7 @@@ u32 g4x_get_vblank_counter(struct drm_c
        if (!vblank->max_vblank_count)
                return 0;
  
-       return I915_READ(PIPE_FRMCOUNT_G4X(pipe));
+       return intel_uncore_read(&dev_priv->uncore, PIPE_FRMCOUNT_G4X(pipe));
  }
  
  /*
@@@ -1004,9 -986,9 +1004,9 @@@ static void ivb_parity_work(struct work
        if (drm_WARN_ON(&dev_priv->drm, !dev_priv->l3_parity.which_slice))
                goto out;
  
-       misccpctl = I915_READ(GEN7_MISCCPCTL);
-       I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
-       POSTING_READ(GEN7_MISCCPCTL);
+       misccpctl = intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL);
+       intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
+       intel_uncore_posting_read(&dev_priv->uncore, GEN7_MISCCPCTL);
  
        while ((slice = ffs(dev_priv->l3_parity.which_slice)) != 0) {
                i915_reg_t reg;
  
                reg = GEN7_L3CDERRST1(slice);
  
-               error_status = I915_READ(reg);
+               error_status = intel_uncore_read(&dev_priv->uncore, reg);
                row = GEN7_PARITY_ERROR_ROW(error_status);
                bank = GEN7_PARITY_ERROR_BANK(error_status);
                subbank = GEN7_PARITY_ERROR_SUBBANK(error_status);
  
-               I915_WRITE(reg, GEN7_PARITY_ERROR_VALID | GEN7_L3CDERRST1_ENABLE);
-               POSTING_READ(reg);
+               intel_uncore_write(&dev_priv->uncore, reg, GEN7_PARITY_ERROR_VALID | GEN7_L3CDERRST1_ENABLE);
+               intel_uncore_posting_read(&dev_priv->uncore, reg);
  
                parity_event[0] = I915_L3_PARITY_UEVENT "=1";
                parity_event[1] = kasprintf(GFP_KERNEL, "ROW=%d", row);
                kfree(parity_event[1]);
        }
  
-       I915_WRITE(GEN7_MISCCPCTL, misccpctl);
+       intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl);
  
  out:
        drm_WARN_ON(&dev_priv->drm, dev_priv->l3_parity.which_slice);
@@@ -1062,17 -1044,12 +1062,12 @@@ static bool gen11_port_hotplug_long_det
  {
        switch (pin) {
        case HPD_PORT_TC1:
-               return val & GEN11_HOTPLUG_CTL_LONG_DETECT(HPD_PORT_TC1);
        case HPD_PORT_TC2:
-               return val & GEN11_HOTPLUG_CTL_LONG_DETECT(HPD_PORT_TC2);
        case HPD_PORT_TC3:
-               return val & GEN11_HOTPLUG_CTL_LONG_DETECT(HPD_PORT_TC3);
        case HPD_PORT_TC4:
-               return val & GEN11_HOTPLUG_CTL_LONG_DETECT(HPD_PORT_TC4);
        case HPD_PORT_TC5:
-               return val & GEN11_HOTPLUG_CTL_LONG_DETECT(HPD_PORT_TC5);
        case HPD_PORT_TC6:
-               return val & GEN11_HOTPLUG_CTL_LONG_DETECT(HPD_PORT_TC6);
+               return val & GEN11_HOTPLUG_CTL_LONG_DETECT(pin);
        default:
                return false;
        }
@@@ -1096,13 -1073,10 +1091,10 @@@ static bool icp_ddi_port_hotplug_long_d
  {
        switch (pin) {
        case HPD_PORT_A:
-               return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(HPD_PORT_A);
        case HPD_PORT_B:
-               return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(HPD_PORT_B);
        case HPD_PORT_C:
-               return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(HPD_PORT_C);
        case HPD_PORT_D:
-               return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(HPD_PORT_D);
+               return val & SHOTPLUG_CTL_DDI_HPD_LONG_DETECT(pin);
        default:
                return false;
        }
@@@ -1112,17 -1086,12 +1104,12 @@@ static bool icp_tc_port_hotplug_long_de
  {
        switch (pin) {
        case HPD_PORT_TC1:
-               return val & ICP_TC_HPD_LONG_DETECT(HPD_PORT_TC1);
        case HPD_PORT_TC2:
-               return val & ICP_TC_HPD_LONG_DETECT(HPD_PORT_TC2);
        case HPD_PORT_TC3:
-               return val & ICP_TC_HPD_LONG_DETECT(HPD_PORT_TC3);
        case HPD_PORT_TC4:
-               return val & ICP_TC_HPD_LONG_DETECT(HPD_PORT_TC4);
        case HPD_PORT_TC5:
-               return val & ICP_TC_HPD_LONG_DETECT(HPD_PORT_TC5);
        case HPD_PORT_TC6:
-               return val & ICP_TC_HPD_LONG_DETECT(HPD_PORT_TC6);
+               return val & ICP_TC_HPD_LONG_DETECT(pin);
        default:
                return false;
        }
@@@ -1337,7 -1306,7 +1324,7 @@@ static void hsw_pipe_crc_irq_handler(st
                                     enum pipe pipe)
  {
        display_pipe_crc_irq_handler(dev_priv, pipe,
-                                    I915_READ(PIPE_CRC_RES_1_IVB(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_1_IVB(pipe)),
                                     0, 0, 0, 0);
  }
  
@@@ -1345,11 -1314,11 +1332,11 @@@ static void ivb_pipe_crc_irq_handler(st
                                     enum pipe pipe)
  {
        display_pipe_crc_irq_handler(dev_priv, pipe,
-                                    I915_READ(PIPE_CRC_RES_1_IVB(pipe)),
-                                    I915_READ(PIPE_CRC_RES_2_IVB(pipe)),
-                                    I915_READ(PIPE_CRC_RES_3_IVB(pipe)),
-                                    I915_READ(PIPE_CRC_RES_4_IVB(pipe)),
-                                    I915_READ(PIPE_CRC_RES_5_IVB(pipe)));
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_1_IVB(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_2_IVB(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_3_IVB(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_4_IVB(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_5_IVB(pipe)));
  }
  
  static void i9xx_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
        u32 res1, res2;
  
        if (INTEL_GEN(dev_priv) >= 3)
-               res1 = I915_READ(PIPE_CRC_RES_RES1_I915(pipe));
+               res1 = intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_RES1_I915(pipe));
        else
                res1 = 0;
  
        if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
-               res2 = I915_READ(PIPE_CRC_RES_RES2_G4X(pipe));
+               res2 = intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_RES2_G4X(pipe));
        else
                res2 = 0;
  
        display_pipe_crc_irq_handler(dev_priv, pipe,
-                                    I915_READ(PIPE_CRC_RES_RED(pipe)),
-                                    I915_READ(PIPE_CRC_RES_GREEN(pipe)),
-                                    I915_READ(PIPE_CRC_RES_BLUE(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_RED(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_GREEN(pipe)),
+                                    intel_uncore_read(&dev_priv->uncore, PIPE_CRC_RES_BLUE(pipe)),
                                     res1, res2);
  }
  
@@@ -1379,7 -1348,7 +1366,7 @@@ static void i9xx_pipestat_irq_reset(str
        enum pipe pipe;
  
        for_each_pipe(dev_priv, pipe) {
-               I915_WRITE(PIPESTAT(pipe),
+               intel_uncore_write(&dev_priv->uncore, PIPESTAT(pipe),
                           PIPESTAT_INT_STATUS_MASK |
                           PIPE_FIFO_UNDERRUN_STATUS);
  
@@@ -1433,7 -1402,7 +1420,7 @@@ static void i9xx_pipestat_irq_ack(struc
                        continue;
  
                reg = PIPESTAT(pipe);
-               pipe_stats[pipe] = I915_READ(reg) & status_mask;
+               pipe_stats[pipe] = intel_uncore_read(&dev_priv->uncore, reg) & status_mask;
                enable_mask = i915_pipestat_enable_mask(dev_priv, pipe);
  
                /*
                 * an interrupt is still pending.
                 */
                if (pipe_stats[pipe]) {
-                       I915_WRITE(reg, pipe_stats[pipe]);
-                       I915_WRITE(reg, enable_mask);
+                       intel_uncore_write(&dev_priv->uncore, reg, pipe_stats[pipe]);
+                       intel_uncore_write(&dev_priv->uncore, reg, enable_mask);
                }
        }
        spin_unlock(&dev_priv->irq_lock);
@@@ -1563,18 -1532,18 +1550,18 @@@ static u32 i9xx_hpd_irq_ack(struct drm_
         * bits can itself generate a new hotplug interrupt :(
         */
        for (i = 0; i < 10; i++) {
-               u32 tmp = I915_READ(PORT_HOTPLUG_STAT) & hotplug_status_mask;
+               u32 tmp = intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_STAT) & hotplug_status_mask;
  
                if (tmp == 0)
                        return hotplug_status;
  
                hotplug_status |= tmp;
-               I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
+               intel_uncore_write(&dev_priv->uncore, PORT_HOTPLUG_STAT, hotplug_status);
        }
  
        drm_WARN_ONCE(&dev_priv->drm, 1,
                      "PORT_HOTPLUG_STAT did not clear (0x%08x)\n",
-                     I915_READ(PORT_HOTPLUG_STAT));
+                     intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_STAT));
  
        return hotplug_status;
  }
@@@ -1623,9 -1592,9 +1610,9 @@@ static irqreturn_t valleyview_irq_handl
                u32 hotplug_status = 0;
                u32 ier = 0;
  
-               gt_iir = I915_READ(GTIIR);
-               pm_iir = I915_READ(GEN6_PMIIR);
-               iir = I915_READ(VLV_IIR);
+               gt_iir = intel_uncore_read(&dev_priv->uncore, GTIIR);
+               pm_iir = intel_uncore_read(&dev_priv->uncore, GEN6_PMIIR);
+               iir = intel_uncore_read(&dev_priv->uncore, VLV_IIR);
  
                if (gt_iir == 0 && pm_iir == 0 && iir == 0)
                        break;
                 * don't end up clearing all the VLV_IIR, GT_IIR, GEN6_PMIIR
                 * bits this time around.
                 */
-               I915_WRITE(VLV_MASTER_IER, 0);
-               ier = I915_READ(VLV_IER);
-               I915_WRITE(VLV_IER, 0);
+               intel_uncore_write(&dev_priv->uncore, VLV_MASTER_IER, 0);
+               ier = intel_uncore_read(&dev_priv->uncore, VLV_IER);
+               intel_uncore_write(&dev_priv->uncore, VLV_IER, 0);
  
                if (gt_iir)
-                       I915_WRITE(GTIIR, gt_iir);
+                       intel_uncore_write(&dev_priv->uncore, GTIIR, gt_iir);
                if (pm_iir)
-                       I915_WRITE(GEN6_PMIIR, pm_iir);
+                       intel_uncore_write(&dev_priv->uncore, GEN6_PMIIR, pm_iir);
  
                if (iir & I915_DISPLAY_PORT_INTERRUPT)
                        hotplug_status = i9xx_hpd_irq_ack(dev_priv);
                 * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
                 */
                if (iir)
-                       I915_WRITE(VLV_IIR, iir);
+                       intel_uncore_write(&dev_priv->uncore, VLV_IIR, iir);
  
-               I915_WRITE(VLV_IER, ier);
-               I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
+               intel_uncore_write(&dev_priv->uncore, VLV_IER, ier);
+               intel_uncore_write(&dev_priv->uncore, VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
  
                if (gt_iir)
                        gen6_gt_irq_handler(&dev_priv->gt, gt_iir);
                valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
        } while (0);
  
 +      pmu_irq_stats(dev_priv, ret);
 +
        enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
        return ret;
@@@ -1710,8 -1677,8 +1697,8 @@@ static irqreturn_t cherryview_irq_handl
                u32 hotplug_status = 0;
                u32 ier = 0;
  
-               master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
-               iir = I915_READ(VLV_IIR);
+               master_ctl = intel_uncore_read(&dev_priv->uncore, GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
+               iir = intel_uncore_read(&dev_priv->uncore, VLV_IIR);
  
                if (master_ctl == 0 && iir == 0)
                        break;
                 * don't end up clearing all the VLV_IIR and GEN8_MASTER_IRQ_CONTROL
                 * bits this time around.
                 */
-               I915_WRITE(GEN8_MASTER_IRQ, 0);
-               ier = I915_READ(VLV_IER);
-               I915_WRITE(VLV_IER, 0);
+               intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, 0);
+               ier = intel_uncore_read(&dev_priv->uncore, VLV_IER);
+               intel_uncore_write(&dev_priv->uncore, VLV_IER, 0);
  
                gen8_gt_irq_handler(&dev_priv->gt, master_ctl);
  
                 * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
                 */
                if (iir)
-                       I915_WRITE(VLV_IIR, iir);
+                       intel_uncore_write(&dev_priv->uncore, VLV_IIR, iir);
  
-               I915_WRITE(VLV_IER, ier);
-               I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
+               intel_uncore_write(&dev_priv->uncore, VLV_IER, ier);
+               intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
  
                if (hotplug_status)
                        i9xx_hpd_irq_handler(dev_priv, hotplug_status);
                valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
        } while (0);
  
 +      pmu_irq_stats(dev_priv, ret);
 +
        enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
        return ret;
@@@ -1783,7 -1748,7 +1770,7 @@@ static void ibx_hpd_irq_handler(struct 
         * zero. Not acking leads to "The master control interrupt lied (SDE)!"
         * errors.
         */
-       dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
+       dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG);
        if (!hotplug_trigger) {
                u32 mask = PORTA_HOTPLUG_STATUS_MASK |
                        PORTD_HOTPLUG_STATUS_MASK |
                dig_hotplug_reg &= ~mask;
        }
  
-       I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
+       intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, dig_hotplug_reg);
        if (!hotplug_trigger)
                return;
  
@@@ -1837,7 -1802,7 +1824,7 @@@ static void ibx_irq_handler(struct drm_
                for_each_pipe(dev_priv, pipe)
                        drm_dbg(&dev_priv->drm, "  pipe %c FDI IIR: 0x%08x\n",
                                pipe_name(pipe),
-                               I915_READ(FDI_RX_IIR(pipe)));
+                               intel_uncore_read(&dev_priv->uncore, FDI_RX_IIR(pipe)));
        }
  
        if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE))
  
  static void ivb_err_int_handler(struct drm_i915_private *dev_priv)
  {
-       u32 err_int = I915_READ(GEN7_ERR_INT);
+       u32 err_int = intel_uncore_read(&dev_priv->uncore, GEN7_ERR_INT);
        enum pipe pipe;
  
        if (err_int & ERR_INT_POISON)
                }
        }
  
-       I915_WRITE(GEN7_ERR_INT, err_int);
+       intel_uncore_write(&dev_priv->uncore, GEN7_ERR_INT, err_int);
  }
  
  static void cpt_serr_int_handler(struct drm_i915_private *dev_priv)
  {
-       u32 serr_int = I915_READ(SERR_INT);
+       u32 serr_int = intel_uncore_read(&dev_priv->uncore, SERR_INT);
        enum pipe pipe;
  
        if (serr_int & SERR_INT_POISON)
                if (serr_int & SERR_INT_TRANS_FIFO_UNDERRUN(pipe))
                        intel_pch_fifo_underrun_irq_handler(dev_priv, pipe);
  
-       I915_WRITE(SERR_INT, serr_int);
+       intel_uncore_write(&dev_priv->uncore, SERR_INT, serr_int);
  }
  
  static void cpt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
                for_each_pipe(dev_priv, pipe)
                        drm_dbg(&dev_priv->drm, "  pipe %c FDI IIR: 0x%08x\n",
                                pipe_name(pipe),
-                               I915_READ(FDI_RX_IIR(pipe)));
+                               intel_uncore_read(&dev_priv->uncore, FDI_RX_IIR(pipe)));
        }
  
        if (pch_iir & SDE_ERROR_CPT)
@@@ -1938,8 -1903,8 +1925,8 @@@ static void icp_irq_handler(struct drm_
        if (ddi_hotplug_trigger) {
                u32 dig_hotplug_reg;
  
-               dig_hotplug_reg = I915_READ(SHOTPLUG_CTL_DDI);
-               I915_WRITE(SHOTPLUG_CTL_DDI, dig_hotplug_reg);
+               dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_DDI);
+               intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_DDI, dig_hotplug_reg);
  
                intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                                   ddi_hotplug_trigger, dig_hotplug_reg,
        if (tc_hotplug_trigger) {
                u32 dig_hotplug_reg;
  
-               dig_hotplug_reg = I915_READ(SHOTPLUG_CTL_TC);
-               I915_WRITE(SHOTPLUG_CTL_TC, dig_hotplug_reg);
+               dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_TC);
+               intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_TC, dig_hotplug_reg);
  
                intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                                   tc_hotplug_trigger, dig_hotplug_reg,
@@@ -1976,8 -1941,8 +1963,8 @@@ static void spt_irq_handler(struct drm_
        if (hotplug_trigger) {
                u32 dig_hotplug_reg;
  
-               dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
-               I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
+               dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG);
+               intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, dig_hotplug_reg);
  
                intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                                   hotplug_trigger, dig_hotplug_reg,
        if (hotplug2_trigger) {
                u32 dig_hotplug_reg;
  
-               dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG2);
-               I915_WRITE(PCH_PORT_HOTPLUG2, dig_hotplug_reg);
+               dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG2);
+               intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG2, dig_hotplug_reg);
  
                intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                                   hotplug2_trigger, dig_hotplug_reg,
@@@ -2009,8 -1974,8 +1996,8 @@@ static void ilk_hpd_irq_handler(struct 
  {
        u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
  
-       dig_hotplug_reg = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
-       I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg);
+       dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL);
+       intel_uncore_write(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg);
  
        intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                           hotplug_trigger, dig_hotplug_reg,
@@@ -2051,7 -2016,7 +2038,7 @@@ static void ilk_display_irq_handler(str
  
        /* check event from PCH */
        if (de_iir & DE_PCH_EVENT) {
-               u32 pch_iir = I915_READ(SDEIIR);
+               u32 pch_iir = intel_uncore_read(&dev_priv->uncore, SDEIIR);
  
                if (HAS_PCH_CPT(dev_priv))
                        cpt_irq_handler(dev_priv, pch_iir);
                        ibx_irq_handler(dev_priv, pch_iir);
  
                /* should clear PCH hotplug event before clear CPU irq */
-               I915_WRITE(SDEIIR, pch_iir);
+               intel_uncore_write(&dev_priv->uncore, SDEIIR, pch_iir);
        }
  
        if (IS_GEN(dev_priv, 5) && de_iir & DE_PCU_EVENT)
@@@ -2079,10 -2044,10 +2066,10 @@@ static void ivb_display_irq_handler(str
                ivb_err_int_handler(dev_priv);
  
        if (de_iir & DE_EDP_PSR_INT_HSW) {
-               u32 psr_iir = I915_READ(EDP_PSR_IIR);
+               u32 psr_iir = intel_uncore_read(&dev_priv->uncore, EDP_PSR_IIR);
  
                intel_psr_irq_handler(dev_priv, psr_iir);
-               I915_WRITE(EDP_PSR_IIR, psr_iir);
+               intel_uncore_write(&dev_priv->uncore, EDP_PSR_IIR, psr_iir);
        }
  
        if (de_iir & DE_AUX_CHANNEL_A_IVB)
  
        /* check event from PCH */
        if (!HAS_PCH_NOP(dev_priv) && (de_iir & DE_PCH_EVENT_IVB)) {
-               u32 pch_iir = I915_READ(SDEIIR);
+               u32 pch_iir = intel_uncore_read(&dev_priv->uncore, SDEIIR);
  
                cpt_irq_handler(dev_priv, pch_iir);
  
                /* clear PCH hotplug event before clear CPU irq */
-               I915_WRITE(SDEIIR, pch_iir);
+               intel_uncore_write(&dev_priv->uncore, SDEIIR, pch_iir);
        }
  }
  
@@@ -2177,8 -2142,6 +2164,8 @@@ static irqreturn_t ilk_irq_handler(int 
        if (sde_ier)
                raw_reg_write(regs, SDEIER, sde_ier);
  
 +      pmu_irq_stats(i915, ret);
 +
        /* IRQs are synced during runtime_suspend, we don't require a wakeref */
        enable_rpm_wakeref_asserts(&i915->runtime_pm);
  
@@@ -2190,8 -2153,8 +2177,8 @@@ static void bxt_hpd_irq_handler(struct 
  {
        u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
  
-       dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
-       I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
+       dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG);
+       intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, dig_hotplug_reg);
  
        intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                           hotplug_trigger, dig_hotplug_reg,
@@@ -2210,8 -2173,8 +2197,8 @@@ static void gen11_hpd_irq_handler(struc
        if (trigger_tc) {
                u32 dig_hotplug_reg;
  
-               dig_hotplug_reg = I915_READ(GEN11_TC_HOTPLUG_CTL);
-               I915_WRITE(GEN11_TC_HOTPLUG_CTL, dig_hotplug_reg);
+               dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL);
+               intel_uncore_write(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, dig_hotplug_reg);
  
                intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                                   trigger_tc, dig_hotplug_reg,
        if (trigger_tbt) {
                u32 dig_hotplug_reg;
  
-               dig_hotplug_reg = I915_READ(GEN11_TBT_HOTPLUG_CTL);
-               I915_WRITE(GEN11_TBT_HOTPLUG_CTL, dig_hotplug_reg);
+               dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL);
+               intel_uncore_write(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, dig_hotplug_reg);
  
                intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask,
                                   trigger_tbt, dig_hotplug_reg,
@@@ -2300,8 -2263,8 +2287,8 @@@ gen8_de_misc_irq_handler(struct drm_i91
                else
                        iir_reg = EDP_PSR_IIR;
  
-               psr_iir = I915_READ(iir_reg);
-               I915_WRITE(iir_reg, psr_iir);
+               psr_iir = intel_uncore_read(&dev_priv->uncore, iir_reg);
+               intel_uncore_write(&dev_priv->uncore, iir_reg, psr_iir);
  
                if (psr_iir)
                        found = true;
@@@ -2325,7 -2288,7 +2312,7 @@@ static void gen11_dsi_te_interrupt_hand
         * Incase of dual link, TE comes from DSI_1
         * this is to check if dual link is enabled
         */
-       val = I915_READ(TRANS_DDI_FUNC_CTL2(TRANSCODER_DSI_0));
+       val = intel_uncore_read(&dev_priv->uncore, TRANS_DDI_FUNC_CTL2(TRANSCODER_DSI_0));
        val &= PORT_SYNC_MODE_ENABLE;
  
        /*
        dsi_trans = (port == PORT_A) ? TRANSCODER_DSI_0 : TRANSCODER_DSI_1;
  
        /* Check if DSI configured in command mode */
-       val = I915_READ(DSI_TRANS_FUNC_CONF(dsi_trans));
+       val = intel_uncore_read(&dev_priv->uncore, DSI_TRANS_FUNC_CONF(dsi_trans));
        val = val & OP_MODE_MASK;
  
        if (val != CMD_MODE_NO_GATE && val != CMD_MODE_TE_GATE) {
        }
  
        /* Get PIPE for handling VBLANK event */
-       val = I915_READ(TRANS_DDI_FUNC_CTL(dsi_trans));
+       val = intel_uncore_read(&dev_priv->uncore, TRANS_DDI_FUNC_CTL(dsi_trans));
        switch (val & TRANS_DDI_EDP_INPUT_MASK) {
        case TRANS_DDI_EDP_INPUT_A_ON:
                pipe = PIPE_A;
  
        /* clear TE in dsi IIR */
        port = (te_trigger & DSI1_TE) ? PORT_B : PORT_A;
-       tmp = I915_READ(DSI_INTR_IDENT_REG(port));
-       I915_WRITE(DSI_INTR_IDENT_REG(port), tmp);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSI_INTR_IDENT_REG(port));
+       intel_uncore_write(&dev_priv->uncore, DSI_INTR_IDENT_REG(port), tmp);
  }
  
  static irqreturn_t
@@@ -2378,9 -2341,9 +2365,9 @@@ gen8_de_irq_handler(struct drm_i915_pri
        enum pipe pipe;
  
        if (master_ctl & GEN8_DE_MISC_IRQ) {
-               iir = I915_READ(GEN8_DE_MISC_IIR);
+               iir = intel_uncore_read(&dev_priv->uncore, GEN8_DE_MISC_IIR);
                if (iir) {
-                       I915_WRITE(GEN8_DE_MISC_IIR, iir);
+                       intel_uncore_write(&dev_priv->uncore, GEN8_DE_MISC_IIR, iir);
                        ret = IRQ_HANDLED;
                        gen8_de_misc_irq_handler(dev_priv, iir);
                } else {
        }
  
        if (INTEL_GEN(dev_priv) >= 11 && (master_ctl & GEN11_DE_HPD_IRQ)) {
-               iir = I915_READ(GEN11_DE_HPD_IIR);
+               iir = intel_uncore_read(&dev_priv->uncore, GEN11_DE_HPD_IIR);
                if (iir) {
-                       I915_WRITE(GEN11_DE_HPD_IIR, iir);
+                       intel_uncore_write(&dev_priv->uncore, GEN11_DE_HPD_IIR, iir);
                        ret = IRQ_HANDLED;
                        gen11_hpd_irq_handler(dev_priv, iir);
                } else {
        }
  
        if (master_ctl & GEN8_DE_PORT_IRQ) {
-               iir = I915_READ(GEN8_DE_PORT_IIR);
+               iir = intel_uncore_read(&dev_priv->uncore, GEN8_DE_PORT_IIR);
                if (iir) {
                        bool found = false;
  
-                       I915_WRITE(GEN8_DE_PORT_IIR, iir);
+                       intel_uncore_write(&dev_priv->uncore, GEN8_DE_PORT_IIR, iir);
                        ret = IRQ_HANDLED;
  
                        if (iir & gen8_de_port_aux_mask(dev_priv)) {
                if (!(master_ctl & GEN8_DE_PIPE_IRQ(pipe)))
                        continue;
  
-               iir = I915_READ(GEN8_DE_PIPE_IIR(pipe));
+               iir = intel_uncore_read(&dev_priv->uncore, GEN8_DE_PIPE_IIR(pipe));
                if (!iir) {
                        drm_err(&dev_priv->drm,
                                "The master control interrupt lied (DE PIPE)!\n");
                }
  
                ret = IRQ_HANDLED;
-               I915_WRITE(GEN8_DE_PIPE_IIR(pipe), iir);
+               intel_uncore_write(&dev_priv->uncore, GEN8_DE_PIPE_IIR(pipe), iir);
  
                if (iir & GEN8_PIPE_VBLANK)
                        intel_handle_vblank(dev_priv, pipe);
                 * scheme also closed the SDE interrupt handling race we've seen
                 * on older pch-split platforms. But this needs testing.
                 */
-               iir = I915_READ(SDEIIR);
+               iir = intel_uncore_read(&dev_priv->uncore, SDEIIR);
                if (iir) {
-                       I915_WRITE(SDEIIR, iir);
+                       intel_uncore_write(&dev_priv->uncore, SDEIIR, iir);
                        ret = IRQ_HANDLED;
  
                        if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
@@@ -2565,8 -2528,6 +2552,8 @@@ static irqreturn_t gen8_irq_handler(in
  
        gen8_master_intr_enable(regs);
  
 +      pmu_irq_stats(dev_priv, IRQ_HANDLED);
 +
        return IRQ_HANDLED;
  }
  
@@@ -2662,8 -2623,6 +2649,8 @@@ __gen11_irq_handler(struct drm_i915_pri
  
        gen11_gu_misc_irq_handler(gt, gu_misc_iir);
  
 +      pmu_irq_stats(i915, IRQ_HANDLED);
 +
        return IRQ_HANDLED;
  }
  
@@@ -2741,7 -2700,7 +2728,7 @@@ int i915gm_enable_vblank(struct drm_crt
         * only when vblank interrupts are actually enabled.
         */
        if (dev_priv->vblank_enabled++ == 0)
-               I915_WRITE(SCPD0, _MASKED_BIT_ENABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
+               intel_uncore_write(&dev_priv->uncore, SCPD0, _MASKED_BIT_ENABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
  
        return i8xx_enable_vblank(crtc);
  }
@@@ -2798,16 -2757,16 +2785,16 @@@ static bool gen11_dsi_configure_te(stru
        else
                port = PORT_A;
  
-       tmp =  I915_READ(DSI_INTR_MASK_REG(port));
+       tmp =  intel_uncore_read(&dev_priv->uncore, DSI_INTR_MASK_REG(port));
        if (enable)
                tmp &= ~DSI_TE_EVENT;
        else
                tmp |= DSI_TE_EVENT;
  
-       I915_WRITE(DSI_INTR_MASK_REG(port), tmp);
+       intel_uncore_write(&dev_priv->uncore, DSI_INTR_MASK_REG(port), tmp);
  
-       tmp = I915_READ(DSI_INTR_IDENT_REG(port));
-       I915_WRITE(DSI_INTR_IDENT_REG(port), tmp);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSI_INTR_IDENT_REG(port));
+       intel_uncore_write(&dev_priv->uncore, DSI_INTR_IDENT_REG(port), tmp);
  
        return true;
  }
@@@ -2869,7 -2828,7 +2856,7 @@@ void i915gm_disable_vblank(struct drm_c
        i8xx_disable_vblank(crtc);
  
        if (--dev_priv->vblank_enabled == 0)
-               I915_WRITE(SCPD0, _MASKED_BIT_DISABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
+               intel_uncore_write(&dev_priv->uncore, SCPD0, _MASKED_BIT_DISABLE(CSTATE_RENDER_CLOCK_GATE_DISABLE));
  }
  
  void i965_disable_vblank(struct drm_crtc *crtc)
@@@ -2935,7 -2894,7 +2922,7 @@@ static void ibx_irq_reset(struct drm_i9
        GEN3_IRQ_RESET(uncore, SDE);
  
        if (HAS_PCH_CPT(dev_priv) || HAS_PCH_LPT(dev_priv))
-               I915_WRITE(SERR_INT, 0xffffffff);
+               intel_uncore_write(&dev_priv->uncore, SERR_INT, 0xffffffff);
  }
  
  static void vlv_display_irq_reset(struct drm_i915_private *dev_priv)
                intel_uncore_write(uncore, DPINVGTT, DPINVGTT_STATUS_MASK);
  
        i915_hotplug_interrupt_update_locked(dev_priv, 0xffffffff, 0);
-       intel_uncore_write(uncore, PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
+       intel_uncore_write(uncore, PORT_HOTPLUG_STAT, intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_STAT));
  
        i9xx_pipestat_irq_reset(dev_priv);
  
@@@ -3011,8 -2970,8 +2998,8 @@@ static void ilk_irq_reset(struct drm_i9
  
  static void valleyview_irq_reset(struct drm_i915_private *dev_priv)
  {
-       I915_WRITE(VLV_MASTER_IER, 0);
-       POSTING_READ(VLV_MASTER_IER);
+       intel_uncore_write(&dev_priv->uncore, VLV_MASTER_IER, 0);
+       intel_uncore_posting_read(&dev_priv->uncore, VLV_MASTER_IER);
  
        gen5_gt_irq_reset(&dev_priv->gt);
  
@@@ -3165,8 -3124,8 +3152,8 @@@ static void cherryview_irq_reset(struc
  {
        struct intel_uncore *uncore = &dev_priv->uncore;
  
-       I915_WRITE(GEN8_MASTER_IRQ, 0);
-       POSTING_READ(GEN8_MASTER_IRQ);
+       intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, 0);
+       intel_uncore_posting_read(&dev_priv->uncore, GEN8_MASTER_IRQ);
  
        gen8_gt_irq_reset(&dev_priv->gt);
  
@@@ -3212,7 -3171,7 +3199,7 @@@ static void ibx_hpd_detection_setup(str
         * duration to 2ms (which is the minimum in the Display Port spec).
         * The pulse duration bits are reserved on LPT+.
         */
-       hotplug = I915_READ(PCH_PORT_HOTPLUG);
+       hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG);
        hotplug &= ~(PORTA_HOTPLUG_ENABLE |
                     PORTB_HOTPLUG_ENABLE |
                     PORTC_HOTPLUG_ENABLE |
                     PORTC_PULSE_DURATION_MASK |
                     PORTD_PULSE_DURATION_MASK);
        hotplug |= intel_hpd_hotplug_enables(dev_priv, ibx_hotplug_enables);
-       I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
+       intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, hotplug);
  }
  
  static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv)
@@@ -3270,20 -3229,20 +3257,20 @@@ static void icp_ddi_hpd_detection_setup
  {
        u32 hotplug;
  
-       hotplug = I915_READ(SHOTPLUG_CTL_DDI);
+       hotplug = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_DDI);
        hotplug &= ~(SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_A) |
                     SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_B) |
                     SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_C) |
                     SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_D));
        hotplug |= intel_hpd_hotplug_enables(dev_priv, icp_ddi_hotplug_enables);
-       I915_WRITE(SHOTPLUG_CTL_DDI, hotplug);
+       intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_DDI, hotplug);
  }
  
  static void icp_tc_hpd_detection_setup(struct drm_i915_private *dev_priv)
  {
        u32 hotplug;
  
-       hotplug = I915_READ(SHOTPLUG_CTL_TC);
+       hotplug = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_TC);
        hotplug &= ~(ICP_TC_HPD_ENABLE(HPD_PORT_TC1) |
                     ICP_TC_HPD_ENABLE(HPD_PORT_TC2) |
                     ICP_TC_HPD_ENABLE(HPD_PORT_TC3) |
                     ICP_TC_HPD_ENABLE(HPD_PORT_TC5) |
                     ICP_TC_HPD_ENABLE(HPD_PORT_TC6));
        hotplug |= intel_hpd_hotplug_enables(dev_priv, icp_tc_hotplug_enables);
-       I915_WRITE(SHOTPLUG_CTL_TC, hotplug);
+       intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_TC, hotplug);
  }
  
  static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv)
        hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
  
        if (INTEL_PCH_TYPE(dev_priv) <= PCH_TGP)
-               I915_WRITE(SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
+               intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
  
        ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs);
  
@@@ -3330,12 -3289,12 +3317,12 @@@ static void dg1_hpd_irq_setup(struct dr
  {
        u32 val;
  
-       val = I915_READ(SOUTH_CHICKEN1);
+       val = intel_uncore_read(&dev_priv->uncore, SOUTH_CHICKEN1);
        val |= (INVERT_DDIA_HPD |
                INVERT_DDIB_HPD |
                INVERT_DDIC_HPD |
                INVERT_DDID_HPD);
-       I915_WRITE(SOUTH_CHICKEN1, val);
+       intel_uncore_write(&dev_priv->uncore, SOUTH_CHICKEN1, val);
  
        icp_hpd_irq_setup(dev_priv);
  }
@@@ -3344,7 -3303,7 +3331,7 @@@ static void gen11_tc_hpd_detection_setu
  {
        u32 hotplug;
  
-       hotplug = I915_READ(GEN11_TC_HOTPLUG_CTL);
+       hotplug = intel_uncore_read(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL);
        hotplug &= ~(GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC1) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC2) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC3) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC5) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC6));
        hotplug |= intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables);
-       I915_WRITE(GEN11_TC_HOTPLUG_CTL, hotplug);
+       intel_uncore_write(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, hotplug);
  }
  
  static void gen11_tbt_hpd_detection_setup(struct drm_i915_private *dev_priv)
  {
        u32 hotplug;
  
-       hotplug = I915_READ(GEN11_TBT_HOTPLUG_CTL);
+       hotplug = intel_uncore_read(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL);
        hotplug &= ~(GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC1) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC2) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC3) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC5) |
                     GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC6));
        hotplug |= intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables);
-       I915_WRITE(GEN11_TBT_HOTPLUG_CTL, hotplug);
+       intel_uncore_write(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, hotplug);
  }
  
  static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv)
        enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.hpd);
        hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.hpd);
  
-       val = I915_READ(GEN11_DE_HPD_IMR);
+       val = intel_uncore_read(&dev_priv->uncore, GEN11_DE_HPD_IMR);
        val &= ~hotplug_irqs;
        val |= ~enabled_irqs & hotplug_irqs;
-       I915_WRITE(GEN11_DE_HPD_IMR, val);
-       POSTING_READ(GEN11_DE_HPD_IMR);
+       intel_uncore_write(&dev_priv->uncore, GEN11_DE_HPD_IMR, val);
+       intel_uncore_posting_read(&dev_priv->uncore, GEN11_DE_HPD_IMR);
  
        gen11_tc_hpd_detection_setup(dev_priv);
        gen11_tbt_hpd_detection_setup(dev_priv);
@@@ -3425,25 -3384,25 +3412,25 @@@ static void spt_hpd_detection_setup(str
  
        /* Display WA #1179 WaHardHangonHotPlug: cnp */
        if (HAS_PCH_CNP(dev_priv)) {
-               val = I915_READ(SOUTH_CHICKEN1);
+               val = intel_uncore_read(&dev_priv->uncore, SOUTH_CHICKEN1);
                val &= ~CHASSIS_CLK_REQ_DURATION_MASK;
                val |= CHASSIS_CLK_REQ_DURATION(0xf);
-               I915_WRITE(SOUTH_CHICKEN1, val);
+               intel_uncore_write(&dev_priv->uncore, SOUTH_CHICKEN1, val);
        }
  
        /* Enable digital hotplug on the PCH */
-       hotplug = I915_READ(PCH_PORT_HOTPLUG);
+       hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG);
        hotplug &= ~(PORTA_HOTPLUG_ENABLE |
                     PORTB_HOTPLUG_ENABLE |
                     PORTC_HOTPLUG_ENABLE |
                     PORTD_HOTPLUG_ENABLE);
        hotplug |= intel_hpd_hotplug_enables(dev_priv, spt_hotplug_enables);
-       I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
+       intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, hotplug);
  
-       hotplug = I915_READ(PCH_PORT_HOTPLUG2);
+       hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG2);
        hotplug &= ~PORTE_HOTPLUG_ENABLE;
        hotplug |= intel_hpd_hotplug_enables(dev_priv, spt_hotplug2_enables);
-       I915_WRITE(PCH_PORT_HOTPLUG2, hotplug);
+       intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG2, hotplug);
  }
  
  static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv)
        u32 hotplug_irqs, enabled_irqs;
  
        if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
-               I915_WRITE(SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
+               intel_uncore_write(&dev_priv->uncore, SHPD_FILTER_CNT, SHPD_FILTER_CNT_500_ADJ);
  
        enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
        hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->hotplug.pch_hpd);
@@@ -3482,11 -3441,11 +3469,11 @@@ static void ilk_hpd_detection_setup(str
         * duration to 2ms (which is the minimum in the Display Port spec)
         * The pulse duration bits are reserved on HSW+.
         */
-       hotplug = I915_READ(DIGITAL_PORT_HOTPLUG_CNTRL);
+       hotplug = intel_uncore_read(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL);
        hotplug &= ~(DIGITAL_PORTA_HOTPLUG_ENABLE |
                     DIGITAL_PORTA_PULSE_DURATION_MASK);
        hotplug |= intel_hpd_hotplug_enables(dev_priv, ilk_hotplug_enables);
-       I915_WRITE(DIGITAL_PORT_HOTPLUG_CNTRL, hotplug);
+       intel_uncore_write(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, hotplug);
  }
  
  static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv)
@@@ -3536,7 -3495,7 +3523,7 @@@ static void bxt_hpd_detection_setup(str
  {
        u32 hotplug;
  
-       hotplug = I915_READ(PCH_PORT_HOTPLUG);
+       hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG);
        hotplug &= ~(PORTA_HOTPLUG_ENABLE |
                     PORTB_HOTPLUG_ENABLE |
                     PORTC_HOTPLUG_ENABLE |
                     BXT_DDIB_HPD_INVERT |
                     BXT_DDIC_HPD_INVERT);
        hotplug |= intel_hpd_hotplug_enables(dev_priv, bxt_hotplug_enables);
-       I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
+       intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, hotplug);
  }
  
  static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv)
@@@ -3664,8 -3623,8 +3651,8 @@@ static void valleyview_irq_postinstall(
                vlv_display_irq_postinstall(dev_priv);
        spin_unlock_irq(&dev_priv->irq_lock);
  
-       I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
-       POSTING_READ(VLV_MASTER_IER);
+       intel_uncore_write(&dev_priv->uncore, VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
+       intel_uncore_posting_read(&dev_priv->uncore, VLV_MASTER_IER);
  }
  
  static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
@@@ -3778,14 -3737,14 +3765,14 @@@ static void gen11_irq_postinstall(struc
  
        GEN3_IRQ_INIT(uncore, GEN11_GU_MISC_, ~gu_misc_masked, gu_misc_masked);
  
-       I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
+       intel_uncore_write(&dev_priv->uncore, GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
  
        if (HAS_MASTER_UNIT_IRQ(dev_priv)) {
                dg1_master_intr_enable(uncore->regs);
-               POSTING_READ(DG1_MSTR_UNIT_INTR);
+               intel_uncore_posting_read(&dev_priv->uncore, DG1_MSTR_UNIT_INTR);
        } else {
                gen11_master_intr_enable(uncore->regs);
-               POSTING_READ(GEN11_GFX_MSTR_IRQ);
+               intel_uncore_posting_read(&dev_priv->uncore, GEN11_GFX_MSTR_IRQ);
        }
  }
  
@@@ -3798,8 -3757,8 +3785,8 @@@ static void cherryview_irq_postinstall(
                vlv_display_irq_postinstall(dev_priv);
        spin_unlock_irq(&dev_priv->irq_lock);
  
-       I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
-       POSTING_READ(GEN8_MASTER_IRQ);
+       intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
+       intel_uncore_posting_read(&dev_priv->uncore, GEN8_MASTER_IRQ);
  }
  
  static void i8xx_irq_reset(struct drm_i915_private *dev_priv)
@@@ -3889,11 -3848,11 +3876,11 @@@ static void i9xx_error_irq_ack(struct d
  {
        u32 emr;
  
-       *eir = I915_READ(EIR);
+       *eir = intel_uncore_read(&dev_priv->uncore, EIR);
  
-       I915_WRITE(EIR, *eir);
+       intel_uncore_write(&dev_priv->uncore, EIR, *eir);
  
-       *eir_stuck = I915_READ(EIR);
+       *eir_stuck = intel_uncore_read(&dev_priv->uncore, EIR);
        if (*eir_stuck == 0)
                return;
  
         * (or by a GPU reset) so we mask any bit that
         * remains set.
         */
-       emr = I915_READ(EMR);
-       I915_WRITE(EMR, 0xffffffff);
-       I915_WRITE(EMR, emr | *eir_stuck);
+       emr = intel_uncore_read(&dev_priv->uncore, EMR);
+       intel_uncore_write(&dev_priv->uncore, EMR, 0xffffffff);
+       intel_uncore_write(&dev_priv->uncore, EMR, emr | *eir_stuck);
  }
  
  static void i9xx_error_irq_handler(struct drm_i915_private *dev_priv,
@@@ -3962,8 -3921,6 +3949,8 @@@ static irqreturn_t i8xx_irq_handler(in
                i8xx_pipestat_irq_handler(dev_priv, iir, pipe_stats);
        } while (0);
  
 +      pmu_irq_stats(dev_priv, ret);
 +
        enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
        return ret;
@@@ -3975,7 -3932,7 +3962,7 @@@ static void i915_irq_reset(struct drm_i
  
        if (I915_HAS_HOTPLUG(dev_priv)) {
                i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
-               I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
+               intel_uncore_write(&dev_priv->uncore, PORT_HOTPLUG_STAT, intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_STAT));
        }
  
        i9xx_pipestat_irq_reset(dev_priv);
@@@ -3989,7 -3946,7 +3976,7 @@@ static void i915_irq_postinstall(struc
        struct intel_uncore *uncore = &dev_priv->uncore;
        u32 enable_mask;
  
-       I915_WRITE(EMR, ~(I915_ERROR_PAGE_TABLE |
+       intel_uncore_write(&dev_priv->uncore, EMR, ~(I915_ERROR_PAGE_TABLE |
                          I915_ERROR_MEMORY_REFRESH));
  
        /* Unmask the interrupts that we always want on. */
@@@ -4042,7 -3999,7 +4029,7 @@@ static irqreturn_t i915_irq_handler(in
                u32 hotplug_status = 0;
                u32 iir;
  
-               iir = I915_READ(GEN2_IIR);
+               iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
                if (iir == 0)
                        break;
  
                if (iir & I915_MASTER_ERROR_INTERRUPT)
                        i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
  
-               I915_WRITE(GEN2_IIR, iir);
+               intel_uncore_write(&dev_priv->uncore, GEN2_IIR, iir);
  
                if (iir & I915_USER_INTERRUPT)
                        intel_engine_signal_breadcrumbs(dev_priv->gt.engine[RCS0]);
                i915_pipestat_irq_handler(dev_priv, iir, pipe_stats);
        } while (0);
  
 +      pmu_irq_stats(dev_priv, ret);
 +
        enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
        return ret;
@@@ -4085,7 -4040,7 +4072,7 @@@ static void i965_irq_reset(struct drm_i
        struct intel_uncore *uncore = &dev_priv->uncore;
  
        i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
-       I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
+       intel_uncore_write(&dev_priv->uncore, PORT_HOTPLUG_STAT, intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_STAT));
  
        i9xx_pipestat_irq_reset(dev_priv);
  
@@@ -4112,7 -4067,7 +4099,7 @@@ static void i965_irq_postinstall(struc
                error_mask = ~(I915_ERROR_PAGE_TABLE |
                               I915_ERROR_MEMORY_REFRESH);
        }
-       I915_WRITE(EMR, error_mask);
+       intel_uncore_write(&dev_priv->uncore, EMR, error_mask);
  
        /* Unmask the interrupts that we always want on. */
        dev_priv->irq_mask =
@@@ -4188,7 -4143,7 +4175,7 @@@ static irqreturn_t i965_irq_handler(in
                u32 hotplug_status = 0;
                u32 iir;
  
-               iir = I915_READ(GEN2_IIR);
+               iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
                if (iir == 0)
                        break;
  
                if (iir & I915_MASTER_ERROR_INTERRUPT)
                        i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
  
-               I915_WRITE(GEN2_IIR, iir);
+               intel_uncore_write(&dev_priv->uncore, GEN2_IIR, iir);
  
                if (iir & I915_USER_INTERRUPT)
                        intel_engine_signal_breadcrumbs(dev_priv->gt.engine[RCS0]);
                i965_pipestat_irq_handler(dev_priv, iir, pipe_stats);
        } while (0);
  
 +      pmu_irq_stats(dev_priv, IRQ_HANDLED);
 +
        enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
        return ret;
@@@ -4352,6 -4352,7 +4352,7 @@@ enum 
  #define   VRR_CTL_IGN_MAX_SHIFT               REG_BIT(30)
  #define   VRR_CTL_FLIP_LINE_EN                REG_BIT(29)
  #define   VRR_CTL_LINE_COUNT_MASK     REG_GENMASK(10, 3)
+ #define   VRR_CTL_LINE_COUNT(x)               REG_FIELD_PREP(VRR_CTL_LINE_COUNT_MASK, (x))
  #define   VRR_CTL_SW_FULLLINE_COUNT   REG_BIT(0)
  
  #define _TRANS_VRR_VMAX_A             0x60424
  #define   GEN9_PWRGT_MEDIA_STATUS_MASK                (1 << 0)
  #define   GEN9_PWRGT_RENDER_STATUS_MASK               (1 << 1)
  
 -#define POWERGATE_ENABLE                      _MMIO(0xa210)
 -#define    VDN_HCP_POWERGATE_ENABLE(n)                BIT(((n) * 2) + 3)
 -#define    VDN_MFX_POWERGATE_ENABLE(n)                BIT(((n) * 2) + 4)
 -
  #define  GTFIFODBG                            _MMIO(0x120000)
  #define    GT_FIFO_SBDEDICATE_FREE_ENTRY_CHV  (0x1f << 20)
  #define    GT_FIFO_FREE_ENTRIES_CHV           (0x7f << 13)
  #define GEN9_MEDIA_PG_IDLE_HYSTERESIS         _MMIO(0xA0C4)
  #define GEN9_RENDER_PG_IDLE_HYSTERESIS                _MMIO(0xA0C8)
  #define GEN9_PG_ENABLE                                _MMIO(0xA210)
 -#define GEN9_RENDER_PG_ENABLE                 REG_BIT(0)
 -#define GEN9_MEDIA_PG_ENABLE                  REG_BIT(1)
 -#define GEN11_MEDIA_SAMPLER_PG_ENABLE         REG_BIT(2)
 +#define   GEN9_RENDER_PG_ENABLE                       REG_BIT(0)
 +#define   GEN9_MEDIA_PG_ENABLE                        REG_BIT(1)
 +#define   GEN11_MEDIA_SAMPLER_PG_ENABLE               REG_BIT(2)
 +#define   VDN_HCP_POWERGATE_ENABLE(n)         REG_BIT(3 + 2 * (n))
 +#define   VDN_MFX_POWERGATE_ENABLE(n)         REG_BIT(4 + 2 * (n))
  #define GEN8_PUSHBUS_CONTROL                  _MMIO(0xA248)
  #define GEN8_PUSHBUS_ENABLE                   _MMIO(0xA250)
  #define GEN8_PUSHBUS_SHIFT                    _MMIO(0xA25C)
@@@ -10851,8 -10854,10 +10852,10 @@@ enum skl_power_gate 
  #define  CNL_DRAM_RANK_3                      (0x2 << 9)
  #define  CNL_DRAM_RANK_4                      (0x3 << 9)
  
- /* Please see hsw_read_dcomp() and hsw_write_dcomp() before using this register,
-  * since on HSW we can't write to it using I915_WRITE. */
+ /*
+  * Please see hsw_read_dcomp() and hsw_write_dcomp() before using this register,
+  * since on HSW we can't write to it using intel_uncore_write.
+  */
  #define D_COMP_HSW                    _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5F0C)
  #define D_COMP_BDW                    _MMIO(0x138144)
  #define  D_COMP_RCOMP_IN_PROGRESS     (1 << 9)
@@@ -82,24 -82,24 +82,24 @@@ static void gen9_init_clock_gating(stru
                 * Must match Sampler, Pixel Back End, and Media. See
                 * WaCompressedResourceSamplerPbeMediaNewHashMode.
                 */
-               I915_WRITE(CHICKEN_PAR1_1,
-                          I915_READ(CHICKEN_PAR1_1) |
+               intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
+                          intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) |
                           SKL_DE_COMPRESSED_HASH_MODE);
        }
  
        /* See Bspec note for PSR2_CTL bit 31, Wa#828:skl,bxt,kbl,cfl */
-       I915_WRITE(CHICKEN_PAR1_1,
-                  I915_READ(CHICKEN_PAR1_1) | SKL_EDP_PSR_FIX_RDWRAP);
+       intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
+                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | SKL_EDP_PSR_FIX_RDWRAP);
  
        /* WaEnableChickenDCPR:skl,bxt,kbl,glk,cfl */
-       I915_WRITE(GEN8_CHICKEN_DCPR_1,
-                  I915_READ(GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM);
+       intel_uncore_write(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1,
+                  intel_uncore_read(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM);
  
        /*
         * WaFbcWakeMemOn:skl,bxt,kbl,glk,cfl
         * Display WA #0859: skl,bxt,kbl,glk,cfl
         */
-       I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
                   DISP_FBC_MEMORY_WAKE);
  }
  
@@@ -108,21 -108,21 +108,21 @@@ static void bxt_init_clock_gating(struc
        gen9_init_clock_gating(dev_priv);
  
        /* WaDisableSDEUnitClockGating:bxt */
-       I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
+       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
                   GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /*
         * FIXME:
         * GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ applies on 3x6 GT SKUs only.
         */
-       I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
+       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
                   GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ);
  
        /*
         * Wa: Backlight PWM may stop in the asserted state, causing backlight
         * to stay fully on.
         */
-       I915_WRITE(GEN9_CLKGATE_DIS_0, I915_READ(GEN9_CLKGATE_DIS_0) |
+       intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_0, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_0) |
                   PWM1_GATING_DIS | PWM2_GATING_DIS);
  
        /*
         * is off and a MMIO access is attempted by any privilege
         * application, using batch buffers or any other means.
         */
-       I915_WRITE(RM_TIMEOUT, MMIO_TIMEOUT_US(950));
+       intel_uncore_write(&dev_priv->uncore, RM_TIMEOUT, MMIO_TIMEOUT_US(950));
  
        /*
         * WaFbcTurnOffFbcWatermark:bxt
         * Display WA #0562: bxt
         */
-       I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
                   DISP_FBC_WM_DIS);
  
        /*
         * WaFbcHighMemBwCorruptionAvoidance:bxt
         * Display WA #0883: bxt
         */
-       I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) |
                   ILK_DPFC_DISABLE_DUMMY0);
  }
  
@@@ -157,7 -157,7 +157,7 @@@ static void glk_init_clock_gating(struc
         * Backlight PWM may stop in the asserted state, causing backlight
         * to stay fully on.
         */
-       I915_WRITE(GEN9_CLKGATE_DIS_0, I915_READ(GEN9_CLKGATE_DIS_0) |
+       intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_0, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_0) |
                   PWM1_GATING_DIS | PWM2_GATING_DIS);
  }
  
@@@ -165,7 -165,7 +165,7 @@@ static void pnv_get_mem_freq(struct drm
  {
        u32 tmp;
  
-       tmp = I915_READ(CLKCFG);
+       tmp = intel_uncore_read(&dev_priv->uncore, CLKCFG);
  
        switch (tmp & CLKCFG_FSB_MASK) {
        case CLKCFG_FSB_533:
        }
  
        /* detect pineview DDR3 setting */
-       tmp = I915_READ(CSHRDDR3CTL);
+       tmp = intel_uncore_read(&dev_priv->uncore, CSHRDDR3CTL);
        dev_priv->is_ddr3 = (tmp & CSHRDDR3CTL_DDR3) ? 1 : 0;
  }
  
@@@ -366,39 -366,39 +366,39 @@@ static bool _intel_set_memory_cxsr(stru
        u32 val;
  
        if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
-               was_enabled = I915_READ(FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
-               I915_WRITE(FW_BLC_SELF_VLV, enable ? FW_CSPWRDWNEN : 0);
-               POSTING_READ(FW_BLC_SELF_VLV);
+               was_enabled = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
+               intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF_VLV, enable ? FW_CSPWRDWNEN : 0);
+               intel_uncore_posting_read(&dev_priv->uncore, FW_BLC_SELF_VLV);
        } else if (IS_G4X(dev_priv) || IS_I965GM(dev_priv)) {
-               was_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
-               I915_WRITE(FW_BLC_SELF, enable ? FW_BLC_SELF_EN : 0);
-               POSTING_READ(FW_BLC_SELF);
+               was_enabled = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF) & FW_BLC_SELF_EN;
+               intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF, enable ? FW_BLC_SELF_EN : 0);
+               intel_uncore_posting_read(&dev_priv->uncore, FW_BLC_SELF);
        } else if (IS_PINEVIEW(dev_priv)) {
-               val = I915_READ(DSPFW3);
+               val = intel_uncore_read(&dev_priv->uncore, DSPFW3);
                was_enabled = val & PINEVIEW_SELF_REFRESH_EN;
                if (enable)
                        val |= PINEVIEW_SELF_REFRESH_EN;
                else
                        val &= ~PINEVIEW_SELF_REFRESH_EN;
-               I915_WRITE(DSPFW3, val);
-               POSTING_READ(DSPFW3);
+               intel_uncore_write(&dev_priv->uncore, DSPFW3, val);
+               intel_uncore_posting_read(&dev_priv->uncore, DSPFW3);
        } else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv)) {
-               was_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
+               was_enabled = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF) & FW_BLC_SELF_EN;
                val = enable ? _MASKED_BIT_ENABLE(FW_BLC_SELF_EN) :
                               _MASKED_BIT_DISABLE(FW_BLC_SELF_EN);
-               I915_WRITE(FW_BLC_SELF, val);
-               POSTING_READ(FW_BLC_SELF);
+               intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF, val);
+               intel_uncore_posting_read(&dev_priv->uncore, FW_BLC_SELF);
        } else if (IS_I915GM(dev_priv)) {
                /*
                 * FIXME can't find a bit like this for 915G, and
                 * and yet it does have the related watermark in
                 * FW_BLC_SELF. What's going on?
                 */
-               was_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN;
+               was_enabled = intel_uncore_read(&dev_priv->uncore, INSTPM) & INSTPM_SELF_EN;
                val = enable ? _MASKED_BIT_ENABLE(INSTPM_SELF_EN) :
                               _MASKED_BIT_DISABLE(INSTPM_SELF_EN);
-               I915_WRITE(INSTPM, val);
-               POSTING_READ(INSTPM);
+               intel_uncore_write(&dev_priv->uncore, INSTPM, val);
+               intel_uncore_posting_read(&dev_priv->uncore, INSTPM);
        } else {
                return false;
        }
@@@ -494,20 -494,20 +494,20 @@@ static void vlv_get_fifo_size(struct in
  
        switch (pipe) {
        case PIPE_A:
-               dsparb = I915_READ(DSPARB);
-               dsparb2 = I915_READ(DSPARB2);
+               dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB);
+               dsparb2 = intel_uncore_read(&dev_priv->uncore, DSPARB2);
                sprite0_start = VLV_FIFO_START(dsparb, dsparb2, 0, 0);
                sprite1_start = VLV_FIFO_START(dsparb, dsparb2, 8, 4);
                break;
        case PIPE_B:
-               dsparb = I915_READ(DSPARB);
-               dsparb2 = I915_READ(DSPARB2);
+               dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB);
+               dsparb2 = intel_uncore_read(&dev_priv->uncore, DSPARB2);
                sprite0_start = VLV_FIFO_START(dsparb, dsparb2, 16, 8);
                sprite1_start = VLV_FIFO_START(dsparb, dsparb2, 24, 12);
                break;
        case PIPE_C:
-               dsparb2 = I915_READ(DSPARB2);
-               dsparb3 = I915_READ(DSPARB3);
+               dsparb2 = intel_uncore_read(&dev_priv->uncore, DSPARB2);
+               dsparb3 = intel_uncore_read(&dev_priv->uncore, DSPARB3);
                sprite0_start = VLV_FIFO_START(dsparb3, dsparb2, 0, 16);
                sprite1_start = VLV_FIFO_START(dsparb3, dsparb2, 8, 20);
                break;
  static int i9xx_get_fifo_size(struct drm_i915_private *dev_priv,
                              enum i9xx_plane_id i9xx_plane)
  {
-       u32 dsparb = I915_READ(DSPARB);
+       u32 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB);
        int size;
  
        size = dsparb & 0x7f;
  static int i830_get_fifo_size(struct drm_i915_private *dev_priv,
                              enum i9xx_plane_id i9xx_plane)
  {
-       u32 dsparb = I915_READ(DSPARB);
+       u32 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB);
        int size;
  
        size = dsparb & 0x1ff;
  static int i845_get_fifo_size(struct drm_i915_private *dev_priv,
                              enum i9xx_plane_id i9xx_plane)
  {
-       u32 dsparb = I915_READ(DSPARB);
+       u32 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB);
        int size;
  
        size = dsparb & 0x7f;
@@@ -911,38 -911,38 +911,38 @@@ static void pnv_update_wm(struct intel_
                wm = intel_calculate_wm(clock, &pnv_display_wm,
                                        pnv_display_wm.fifo_size,
                                        cpp, latency->display_sr);
-               reg = I915_READ(DSPFW1);
+               reg = intel_uncore_read(&dev_priv->uncore, DSPFW1);
                reg &= ~DSPFW_SR_MASK;
                reg |= FW_WM(wm, SR);
-               I915_WRITE(DSPFW1, reg);
+               intel_uncore_write(&dev_priv->uncore, DSPFW1, reg);
                drm_dbg_kms(&dev_priv->drm, "DSPFW1 register is %x\n", reg);
  
                /* cursor SR */
                wm = intel_calculate_wm(clock, &pnv_cursor_wm,
                                        pnv_display_wm.fifo_size,
                                        4, latency->cursor_sr);
-               reg = I915_READ(DSPFW3);
+               reg = intel_uncore_read(&dev_priv->uncore, DSPFW3);
                reg &= ~DSPFW_CURSOR_SR_MASK;
                reg |= FW_WM(wm, CURSOR_SR);
-               I915_WRITE(DSPFW3, reg);
+               intel_uncore_write(&dev_priv->uncore, DSPFW3, reg);
  
                /* Display HPLL off SR */
                wm = intel_calculate_wm(clock, &pnv_display_hplloff_wm,
                                        pnv_display_hplloff_wm.fifo_size,
                                        cpp, latency->display_hpll_disable);
-               reg = I915_READ(DSPFW3);
+               reg = intel_uncore_read(&dev_priv->uncore, DSPFW3);
                reg &= ~DSPFW_HPLL_SR_MASK;
                reg |= FW_WM(wm, HPLL_SR);
-               I915_WRITE(DSPFW3, reg);
+               intel_uncore_write(&dev_priv->uncore, DSPFW3, reg);
  
                /* cursor HPLL off SR */
                wm = intel_calculate_wm(clock, &pnv_cursor_hplloff_wm,
                                        pnv_display_hplloff_wm.fifo_size,
                                        4, latency->cursor_hpll_disable);
-               reg = I915_READ(DSPFW3);
+               reg = intel_uncore_read(&dev_priv->uncore, DSPFW3);
                reg &= ~DSPFW_HPLL_CURSOR_MASK;
                reg |= FW_WM(wm, HPLL_CURSOR);
-               I915_WRITE(DSPFW3, reg);
+               intel_uncore_write(&dev_priv->uncore, DSPFW3, reg);
                drm_dbg_kms(&dev_priv->drm, "DSPFW3 register is %x\n", reg);
  
                intel_set_memory_cxsr(dev_priv, true);
@@@ -976,25 -976,25 +976,25 @@@ static void g4x_write_wm_values(struct 
        for_each_pipe(dev_priv, pipe)
                trace_g4x_wm(intel_get_crtc_for_pipe(dev_priv, pipe), wm);
  
-       I915_WRITE(DSPFW1,
+       intel_uncore_write(&dev_priv->uncore, DSPFW1,
                   FW_WM(wm->sr.plane, SR) |
                   FW_WM(wm->pipe[PIPE_B].plane[PLANE_CURSOR], CURSORB) |
                   FW_WM(wm->pipe[PIPE_B].plane[PLANE_PRIMARY], PLANEB) |
                   FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY], PLANEA));
-       I915_WRITE(DSPFW2,
+       intel_uncore_write(&dev_priv->uncore, DSPFW2,
                   (wm->fbc_en ? DSPFW_FBC_SR_EN : 0) |
                   FW_WM(wm->sr.fbc, FBC_SR) |
                   FW_WM(wm->hpll.fbc, FBC_HPLL_SR) |
                   FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEB) |
                   FW_WM(wm->pipe[PIPE_A].plane[PLANE_CURSOR], CURSORA) |
                   FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE0], SPRITEA));
-       I915_WRITE(DSPFW3,
+       intel_uncore_write(&dev_priv->uncore, DSPFW3,
                   (wm->hpll_en ? DSPFW_HPLL_SR_EN : 0) |
                   FW_WM(wm->sr.cursor, CURSOR_SR) |
                   FW_WM(wm->hpll.cursor, HPLL_CURSOR) |
                   FW_WM(wm->hpll.plane, HPLL_SR));
  
-       POSTING_READ(DSPFW1);
+       intel_uncore_posting_read(&dev_priv->uncore, DSPFW1);
  }
  
  #define FW_WM_VLV(value, plane) \
@@@ -1008,7 -1008,7 +1008,7 @@@ static void vlv_write_wm_values(struct 
        for_each_pipe(dev_priv, pipe) {
                trace_vlv_wm(intel_get_crtc_for_pipe(dev_priv, pipe), wm);
  
-               I915_WRITE(VLV_DDL(pipe),
+               intel_uncore_write(&dev_priv->uncore, VLV_DDL(pipe),
                           (wm->ddl[pipe].plane[PLANE_CURSOR] << DDL_CURSOR_SHIFT) |
                           (wm->ddl[pipe].plane[PLANE_SPRITE1] << DDL_SPRITE_SHIFT(1)) |
                           (wm->ddl[pipe].plane[PLANE_SPRITE0] << DDL_SPRITE_SHIFT(0)) |
         * high order bits so that there are no out of bounds values
         * present in the registers during the reprogramming.
         */
-       I915_WRITE(DSPHOWM, 0);
-       I915_WRITE(DSPHOWM1, 0);
-       I915_WRITE(DSPFW4, 0);
-       I915_WRITE(DSPFW5, 0);
-       I915_WRITE(DSPFW6, 0);
+       intel_uncore_write(&dev_priv->uncore, DSPHOWM, 0);
+       intel_uncore_write(&dev_priv->uncore, DSPHOWM1, 0);
+       intel_uncore_write(&dev_priv->uncore, DSPFW4, 0);
+       intel_uncore_write(&dev_priv->uncore, DSPFW5, 0);
+       intel_uncore_write(&dev_priv->uncore, DSPFW6, 0);
  
-       I915_WRITE(DSPFW1,
+       intel_uncore_write(&dev_priv->uncore, DSPFW1,
                   FW_WM(wm->sr.plane, SR) |
                   FW_WM(wm->pipe[PIPE_B].plane[PLANE_CURSOR], CURSORB) |
                   FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_PRIMARY], PLANEB) |
                   FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_PRIMARY], PLANEA));
-       I915_WRITE(DSPFW2,
+       intel_uncore_write(&dev_priv->uncore, DSPFW2,
                   FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_SPRITE1], SPRITEB) |
                   FW_WM(wm->pipe[PIPE_A].plane[PLANE_CURSOR], CURSORA) |
                   FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_SPRITE0], SPRITEA));
-       I915_WRITE(DSPFW3,
+       intel_uncore_write(&dev_priv->uncore, DSPFW3,
                   FW_WM(wm->sr.cursor, CURSOR_SR));
  
        if (IS_CHERRYVIEW(dev_priv)) {
-               I915_WRITE(DSPFW7_CHV,
+               intel_uncore_write(&dev_priv->uncore, DSPFW7_CHV,
                           FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE1], SPRITED) |
                           FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEC));
-               I915_WRITE(DSPFW8_CHV,
+               intel_uncore_write(&dev_priv->uncore, DSPFW8_CHV,
                           FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_SPRITE1], SPRITEF) |
                           FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_SPRITE0], SPRITEE));
-               I915_WRITE(DSPFW9_CHV,
+               intel_uncore_write(&dev_priv->uncore, DSPFW9_CHV,
                           FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_PRIMARY], PLANEC) |
                           FW_WM(wm->pipe[PIPE_C].plane[PLANE_CURSOR], CURSORC));
-               I915_WRITE(DSPHOWM,
+               intel_uncore_write(&dev_priv->uncore, DSPHOWM,
                           FW_WM(wm->sr.plane >> 9, SR_HI) |
                           FW_WM(wm->pipe[PIPE_C].plane[PLANE_SPRITE1] >> 8, SPRITEF_HI) |
                           FW_WM(wm->pipe[PIPE_C].plane[PLANE_SPRITE0] >> 8, SPRITEE_HI) |
                           FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE0] >> 8, SPRITEA_HI) |
                           FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY] >> 8, PLANEA_HI));
        } else {
-               I915_WRITE(DSPFW7,
+               intel_uncore_write(&dev_priv->uncore, DSPFW7,
                           FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE1], SPRITED) |
                           FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEC));
-               I915_WRITE(DSPHOWM,
+               intel_uncore_write(&dev_priv->uncore, DSPHOWM,
                           FW_WM(wm->sr.plane >> 9, SR_HI) |
                           FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE1] >> 8, SPRITED_HI) |
                           FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE0] >> 8, SPRITEC_HI) |
                           FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY] >> 8, PLANEA_HI));
        }
  
-       POSTING_READ(DSPFW1);
+       intel_uncore_posting_read(&dev_priv->uncore, DSPFW1);
  }
  
  #undef FW_WM_VLV
@@@ -2310,14 -2310,14 +2310,14 @@@ static void i965_update_wm(struct intel
                    srwm);
  
        /* 965 has limitations... */
-       I915_WRITE(DSPFW1, FW_WM(srwm, SR) |
+       intel_uncore_write(&dev_priv->uncore, DSPFW1, FW_WM(srwm, SR) |
                   FW_WM(8, CURSORB) |
                   FW_WM(8, PLANEB) |
                   FW_WM(8, PLANEA));
-       I915_WRITE(DSPFW2, FW_WM(8, CURSORA) |
+       intel_uncore_write(&dev_priv->uncore, DSPFW2, FW_WM(8, CURSORA) |
                   FW_WM(8, PLANEC_OLD));
        /* update cursor SR watermark */
-       I915_WRITE(DSPFW3, FW_WM(cursor_sr, CURSOR_SR));
+       intel_uncore_write(&dev_priv->uncore, DSPFW3, FW_WM(cursor_sr, CURSOR_SR));
  
        if (cxsr_enabled)
                intel_set_memory_cxsr(dev_priv, true);
@@@ -2447,10 -2447,10 +2447,10 @@@ static void i9xx_update_wm(struct intel
                        srwm = 1;
  
                if (IS_I945G(dev_priv) || IS_I945GM(dev_priv))
-                       I915_WRITE(FW_BLC_SELF,
+                       intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF,
                                   FW_BLC_SELF_FIFO_MASK | (srwm & 0xff));
                else
-                       I915_WRITE(FW_BLC_SELF, srwm & 0x3f);
+                       intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF, srwm & 0x3f);
        }
  
        drm_dbg_kms(&dev_priv->drm,
        fwater_lo = fwater_lo | (1 << 24) | (1 << 8);
        fwater_hi = fwater_hi | (1 << 8);
  
-       I915_WRITE(FW_BLC, fwater_lo);
-       I915_WRITE(FW_BLC2, fwater_hi);
+       intel_uncore_write(&dev_priv->uncore, FW_BLC, fwater_lo);
+       intel_uncore_write(&dev_priv->uncore, FW_BLC2, fwater_hi);
  
        if (enabled)
                intel_set_memory_cxsr(dev_priv, true);
@@@ -2488,13 -2488,13 +2488,13 @@@ static void i845_update_wm(struct intel
                                       &i845_wm_info,
                                       dev_priv->display.get_fifo_size(dev_priv, PLANE_A),
                                       4, pessimal_latency_ns);
-       fwater_lo = I915_READ(FW_BLC) & ~0xfff;
+       fwater_lo = intel_uncore_read(&dev_priv->uncore, FW_BLC) & ~0xfff;
        fwater_lo |= (3<<8) | planea_wm;
  
        drm_dbg_kms(&dev_priv->drm,
                    "Setting FIFO watermarks - A: %d\n", planea_wm);
  
-       I915_WRITE(FW_BLC, fwater_lo);
+       intel_uncore_write(&dev_priv->uncore, FW_BLC, fwater_lo);
  }
  
  /* latency must be in 0.1us units. */
@@@ -3534,17 -3534,17 +3534,17 @@@ static bool _ilk_disable_lp_wm(struct d
  
        if (dirty & WM_DIRTY_LP(3) && previous->wm_lp[2] & WM1_LP_SR_EN) {
                previous->wm_lp[2] &= ~WM1_LP_SR_EN;
-               I915_WRITE(WM3_LP_ILK, previous->wm_lp[2]);
+               intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, previous->wm_lp[2]);
                changed = true;
        }
        if (dirty & WM_DIRTY_LP(2) && previous->wm_lp[1] & WM1_LP_SR_EN) {
                previous->wm_lp[1] &= ~WM1_LP_SR_EN;
-               I915_WRITE(WM2_LP_ILK, previous->wm_lp[1]);
+               intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, previous->wm_lp[1]);
                changed = true;
        }
        if (dirty & WM_DIRTY_LP(1) && previous->wm_lp[0] & WM1_LP_SR_EN) {
                previous->wm_lp[0] &= ~WM1_LP_SR_EN;
-               I915_WRITE(WM1_LP_ILK, previous->wm_lp[0]);
+               intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, previous->wm_lp[0]);
                changed = true;
        }
  
@@@ -3574,56 -3574,56 +3574,56 @@@ static void ilk_write_wm_values(struct 
        _ilk_disable_lp_wm(dev_priv, dirty);
  
        if (dirty & WM_DIRTY_PIPE(PIPE_A))
-               I915_WRITE(WM0_PIPE_ILK(PIPE_A), results->wm_pipe[0]);
+               intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_A), results->wm_pipe[0]);
        if (dirty & WM_DIRTY_PIPE(PIPE_B))
-               I915_WRITE(WM0_PIPE_ILK(PIPE_B), results->wm_pipe[1]);
+               intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_B), results->wm_pipe[1]);
        if (dirty & WM_DIRTY_PIPE(PIPE_C))
-               I915_WRITE(WM0_PIPE_ILK(PIPE_C), results->wm_pipe[2]);
+               intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_C), results->wm_pipe[2]);
  
        if (dirty & WM_DIRTY_DDB) {
                if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
-                       val = I915_READ(WM_MISC);
+                       val = intel_uncore_read(&dev_priv->uncore, WM_MISC);
                        if (results->partitioning == INTEL_DDB_PART_1_2)
                                val &= ~WM_MISC_DATA_PARTITION_5_6;
                        else
                                val |= WM_MISC_DATA_PARTITION_5_6;
-                       I915_WRITE(WM_MISC, val);
+                       intel_uncore_write(&dev_priv->uncore, WM_MISC, val);
                } else {
-                       val = I915_READ(DISP_ARB_CTL2);
+                       val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2);
                        if (results->partitioning == INTEL_DDB_PART_1_2)
                                val &= ~DISP_DATA_PARTITION_5_6;
                        else
                                val |= DISP_DATA_PARTITION_5_6;
-                       I915_WRITE(DISP_ARB_CTL2, val);
+                       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL2, val);
                }
        }
  
        if (dirty & WM_DIRTY_FBC) {
-               val = I915_READ(DISP_ARB_CTL);
+               val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL);
                if (results->enable_fbc_wm)
                        val &= ~DISP_FBC_WM_DIS;
                else
                        val |= DISP_FBC_WM_DIS;
-               I915_WRITE(DISP_ARB_CTL, val);
+               intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, val);
        }
  
        if (dirty & WM_DIRTY_LP(1) &&
            previous->wm_lp_spr[0] != results->wm_lp_spr[0])
-               I915_WRITE(WM1S_LP_ILK, results->wm_lp_spr[0]);
+               intel_uncore_write(&dev_priv->uncore, WM1S_LP_ILK, results->wm_lp_spr[0]);
  
        if (INTEL_GEN(dev_priv) >= 7) {
                if (dirty & WM_DIRTY_LP(2) && previous->wm_lp_spr[1] != results->wm_lp_spr[1])
-                       I915_WRITE(WM2S_LP_IVB, results->wm_lp_spr[1]);
+                       intel_uncore_write(&dev_priv->uncore, WM2S_LP_IVB, results->wm_lp_spr[1]);
                if (dirty & WM_DIRTY_LP(3) && previous->wm_lp_spr[2] != results->wm_lp_spr[2])
-                       I915_WRITE(WM3S_LP_IVB, results->wm_lp_spr[2]);
+                       intel_uncore_write(&dev_priv->uncore, WM3S_LP_IVB, results->wm_lp_spr[2]);
        }
  
        if (dirty & WM_DIRTY_LP(1) && previous->wm_lp[0] != results->wm_lp[0])
-               I915_WRITE(WM1_LP_ILK, results->wm_lp[0]);
+               intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, results->wm_lp[0]);
        if (dirty & WM_DIRTY_LP(2) && previous->wm_lp[1] != results->wm_lp[1])
-               I915_WRITE(WM2_LP_ILK, results->wm_lp[1]);
+               intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, results->wm_lp[1]);
        if (dirty & WM_DIRTY_LP(3) && previous->wm_lp[2] != results->wm_lp[2])
-               I915_WRITE(WM3_LP_ILK, results->wm_lp[2]);
+               intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, results->wm_lp[2]);
  
        dev_priv->wm.hw = *results;
  }
@@@ -3640,7 -3640,7 +3640,7 @@@ u8 intel_enabled_dbuf_slices_mask(struc
        u8 enabled_slices_mask = 0;
  
        for (i = 0; i < max_slices; i++) {
-               if (I915_READ(DBUF_CTL_S(i)) & DBUF_POWER_STATE)
+               if (intel_uncore_read(&dev_priv->uncore, DBUF_CTL_S(i)) & DBUF_POWER_STATE)
                        enabled_slices_mask |= BIT(i);
        }
  
@@@ -4300,12 -4300,12 +4300,12 @@@ skl_ddb_get_hw_plane_state(struct drm_i
  
        /* Cursor doesn't support NV12/planar, so no extra calculation needed */
        if (plane_id == PLANE_CURSOR) {
-               val = I915_READ(CUR_BUF_CFG(pipe));
+               val = intel_uncore_read(&dev_priv->uncore, CUR_BUF_CFG(pipe));
                skl_ddb_entry_init_from_hw(dev_priv, ddb_y, val);
                return;
        }
  
-       val = I915_READ(PLANE_CTL(pipe, plane_id));
+       val = intel_uncore_read(&dev_priv->uncore, PLANE_CTL(pipe, plane_id));
  
        /* No DDB allocated for disabled planes */
        if (val & PLANE_CTL_ENABLE)
                                              val & PLANE_CTL_ALPHA_MASK);
  
        if (INTEL_GEN(dev_priv) >= 11) {
-               val = I915_READ(PLANE_BUF_CFG(pipe, plane_id));
+               val = intel_uncore_read(&dev_priv->uncore, PLANE_BUF_CFG(pipe, plane_id));
                skl_ddb_entry_init_from_hw(dev_priv, ddb_y, val);
        } else {
-               val = I915_READ(PLANE_BUF_CFG(pipe, plane_id));
-               val2 = I915_READ(PLANE_NV12_BUF_CFG(pipe, plane_id));
+               val = intel_uncore_read(&dev_priv->uncore, PLANE_BUF_CFG(pipe, plane_id));
+               val2 = intel_uncore_read(&dev_priv->uncore, PLANE_NV12_BUF_CFG(pipe, plane_id));
  
                if (fourcc &&
                    drm_format_info_is_yuv_semiplanar(drm_format_info(fourcc)))
@@@ -6231,9 -6231,9 +6231,9 @@@ void skl_pipe_wm_get_hw_state(struct in
  
                for (level = 0; level <= max_level; level++) {
                        if (plane_id != PLANE_CURSOR)
-                               val = I915_READ(PLANE_WM(pipe, plane_id, level));
+                               val = intel_uncore_read(&dev_priv->uncore, PLANE_WM(pipe, plane_id, level));
                        else
-                               val = I915_READ(CUR_WM(pipe, level));
+                               val = intel_uncore_read(&dev_priv->uncore, CUR_WM(pipe, level));
  
                        skl_wm_level_from_reg_val(val, &wm->wm[level]);
                }
                        wm->sagv_wm0 = wm->wm[0];
  
                if (plane_id != PLANE_CURSOR)
-                       val = I915_READ(PLANE_WM_TRANS(pipe, plane_id));
+                       val = intel_uncore_read(&dev_priv->uncore, PLANE_WM_TRANS(pipe, plane_id));
                else
-                       val = I915_READ(CUR_WM_TRANS(pipe));
+                       val = intel_uncore_read(&dev_priv->uncore, CUR_WM_TRANS(pipe));
  
                skl_wm_level_from_reg_val(val, &wm->trans_wm);
        }
@@@ -6280,7 -6280,7 +6280,7 @@@ static void ilk_pipe_wm_get_hw_state(st
        struct intel_pipe_wm *active = &crtc_state->wm.ilk.optimal;
        enum pipe pipe = crtc->pipe;
  
-       hw->wm_pipe[pipe] = I915_READ(WM0_PIPE_ILK(pipe));
+       hw->wm_pipe[pipe] = intel_uncore_read(&dev_priv->uncore, WM0_PIPE_ILK(pipe));
  
        memset(active, 0, sizeof(*active));
  
@@@ -6324,13 -6324,13 +6324,13 @@@ static void g4x_read_wm_values(struct d
  {
        u32 tmp;
  
-       tmp = I915_READ(DSPFW1);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSPFW1);
        wm->sr.plane = _FW_WM(tmp, SR);
        wm->pipe[PIPE_B].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORB);
        wm->pipe[PIPE_B].plane[PLANE_PRIMARY] = _FW_WM(tmp, PLANEB);
        wm->pipe[PIPE_A].plane[PLANE_PRIMARY] = _FW_WM(tmp, PLANEA);
  
-       tmp = I915_READ(DSPFW2);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSPFW2);
        wm->fbc_en = tmp & DSPFW_FBC_SR_EN;
        wm->sr.fbc = _FW_WM(tmp, FBC_SR);
        wm->hpll.fbc = _FW_WM(tmp, FBC_HPLL_SR);
        wm->pipe[PIPE_A].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORA);
        wm->pipe[PIPE_A].plane[PLANE_SPRITE0] = _FW_WM(tmp, SPRITEA);
  
-       tmp = I915_READ(DSPFW3);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSPFW3);
        wm->hpll_en = tmp & DSPFW_HPLL_SR_EN;
        wm->sr.cursor = _FW_WM(tmp, CURSOR_SR);
        wm->hpll.cursor = _FW_WM(tmp, HPLL_CURSOR);
@@@ -6352,7 -6352,7 +6352,7 @@@ static void vlv_read_wm_values(struct d
        u32 tmp;
  
        for_each_pipe(dev_priv, pipe) {
-               tmp = I915_READ(VLV_DDL(pipe));
+               tmp = intel_uncore_read(&dev_priv->uncore, VLV_DDL(pipe));
  
                wm->ddl[pipe].plane[PLANE_PRIMARY] =
                        (tmp >> DDL_PLANE_SHIFT) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK);
                        (tmp >> DDL_SPRITE_SHIFT(1)) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK);
        }
  
-       tmp = I915_READ(DSPFW1);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSPFW1);
        wm->sr.plane = _FW_WM(tmp, SR);
        wm->pipe[PIPE_B].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORB);
        wm->pipe[PIPE_B].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEB);
        wm->pipe[PIPE_A].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEA);
  
-       tmp = I915_READ(DSPFW2);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSPFW2);
        wm->pipe[PIPE_A].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITEB);
        wm->pipe[PIPE_A].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORA);
        wm->pipe[PIPE_A].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEA);
  
-       tmp = I915_READ(DSPFW3);
+       tmp = intel_uncore_read(&dev_priv->uncore, DSPFW3);
        wm->sr.cursor = _FW_WM(tmp, CURSOR_SR);
  
        if (IS_CHERRYVIEW(dev_priv)) {
-               tmp = I915_READ(DSPFW7_CHV);
+               tmp = intel_uncore_read(&dev_priv->uncore, DSPFW7_CHV);
                wm->pipe[PIPE_B].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITED);
                wm->pipe[PIPE_B].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEC);
  
-               tmp = I915_READ(DSPFW8_CHV);
+               tmp = intel_uncore_read(&dev_priv->uncore, DSPFW8_CHV);
                wm->pipe[PIPE_C].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITEF);
                wm->pipe[PIPE_C].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEE);
  
-               tmp = I915_READ(DSPFW9_CHV);
+               tmp = intel_uncore_read(&dev_priv->uncore, DSPFW9_CHV);
                wm->pipe[PIPE_C].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEC);
                wm->pipe[PIPE_C].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORC);
  
-               tmp = I915_READ(DSPHOWM);
+               tmp = intel_uncore_read(&dev_priv->uncore, DSPHOWM);
                wm->sr.plane |= _FW_WM(tmp, SR_HI) << 9;
                wm->pipe[PIPE_C].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITEF_HI) << 8;
                wm->pipe[PIPE_C].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEE_HI) << 8;
                wm->pipe[PIPE_A].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEA_HI) << 8;
                wm->pipe[PIPE_A].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEA_HI) << 8;
        } else {
-               tmp = I915_READ(DSPFW7);
+               tmp = intel_uncore_read(&dev_priv->uncore, DSPFW7);
                wm->pipe[PIPE_B].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITED);
                wm->pipe[PIPE_B].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEC);
  
-               tmp = I915_READ(DSPHOWM);
+               tmp = intel_uncore_read(&dev_priv->uncore, DSPHOWM);
                wm->sr.plane |= _FW_WM(tmp, SR_HI) << 9;
                wm->pipe[PIPE_B].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITED_HI) << 8;
                wm->pipe[PIPE_B].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEC_HI) << 8;
@@@ -6428,7 -6428,7 +6428,7 @@@ void g4x_wm_get_hw_state(struct drm_i91
  
        g4x_read_wm_values(dev_priv, wm);
  
-       wm->cxsr = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
+       wm->cxsr = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF) & FW_BLC_SELF_EN;
  
        for_each_intel_crtc(&dev_priv->drm, crtc) {
                struct intel_crtc_state *crtc_state =
@@@ -6572,7 -6572,7 +6572,7 @@@ void vlv_wm_get_hw_state(struct drm_i91
  
        vlv_read_wm_values(dev_priv, wm);
  
-       wm->cxsr = I915_READ(FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
+       wm->cxsr = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
        wm->level = VLV_WM_LEVEL_PM2;
  
        if (IS_CHERRYVIEW(dev_priv)) {
@@@ -6719,9 -6719,9 +6719,9 @@@ void vlv_wm_sanitize(struct drm_i915_pr
   */
  static void ilk_init_lp_watermarks(struct drm_i915_private *dev_priv)
  {
-       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);
+       intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM3_LP_ILK) & ~WM1_LP_SR_EN);
+       intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM2_LP_ILK) & ~WM1_LP_SR_EN);
+       intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM1_LP_ILK) & ~WM1_LP_SR_EN);
  
        /*
         * Don't touch WM1S_LP_EN here.
@@@ -6739,25 -6739,25 +6739,25 @@@ void ilk_wm_get_hw_state(struct drm_i91
        for_each_intel_crtc(&dev_priv->drm, crtc)
                ilk_pipe_wm_get_hw_state(crtc);
  
-       hw->wm_lp[0] = I915_READ(WM1_LP_ILK);
-       hw->wm_lp[1] = I915_READ(WM2_LP_ILK);
-       hw->wm_lp[2] = I915_READ(WM3_LP_ILK);
+       hw->wm_lp[0] = intel_uncore_read(&dev_priv->uncore, WM1_LP_ILK);
+       hw->wm_lp[1] = intel_uncore_read(&dev_priv->uncore, WM2_LP_ILK);
+       hw->wm_lp[2] = intel_uncore_read(&dev_priv->uncore, WM3_LP_ILK);
  
-       hw->wm_lp_spr[0] = I915_READ(WM1S_LP_ILK);
+       hw->wm_lp_spr[0] = intel_uncore_read(&dev_priv->uncore, WM1S_LP_ILK);
        if (INTEL_GEN(dev_priv) >= 7) {
-               hw->wm_lp_spr[1] = I915_READ(WM2S_LP_IVB);
-               hw->wm_lp_spr[2] = I915_READ(WM3S_LP_IVB);
+               hw->wm_lp_spr[1] = intel_uncore_read(&dev_priv->uncore, WM2S_LP_IVB);
+               hw->wm_lp_spr[2] = intel_uncore_read(&dev_priv->uncore, WM3S_LP_IVB);
        }
  
        if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
-               hw->partitioning = (I915_READ(WM_MISC) & WM_MISC_DATA_PARTITION_5_6) ?
+               hw->partitioning = (intel_uncore_read(&dev_priv->uncore, WM_MISC) & WM_MISC_DATA_PARTITION_5_6) ?
                        INTEL_DDB_PART_5_6 : INTEL_DDB_PART_1_2;
        else if (IS_IVYBRIDGE(dev_priv))
-               hw->partitioning = (I915_READ(DISP_ARB_CTL2) & DISP_DATA_PARTITION_5_6) ?
+               hw->partitioning = (intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2) & DISP_DATA_PARTITION_5_6) ?
                        INTEL_DDB_PART_5_6 : INTEL_DDB_PART_1_2;
  
        hw->enable_fbc_wm =
-               !(I915_READ(DISP_ARB_CTL) & DISP_FBC_WM_DIS);
+               !(intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) & DISP_FBC_WM_DIS);
  }
  
  /**
@@@ -6808,14 -6808,14 +6808,14 @@@ void intel_enable_ipc(struct drm_i915_p
        if (!HAS_IPC(dev_priv))
                return;
  
-       val = I915_READ(DISP_ARB_CTL2);
+       val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2);
  
        if (dev_priv->ipc_enabled)
                val |= DISP_IPC_ENABLE;
        else
                val &= ~DISP_IPC_ENABLE;
  
-       I915_WRITE(DISP_ARB_CTL2, val);
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL2, val);
  }
  
  static bool intel_can_enable_ipc(struct drm_i915_private *dev_priv)
@@@ -6850,7 -6850,7 +6850,7 @@@ static void ibx_init_clock_gating(struc
         * 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);
+       intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE);
  }
  
  static void g4x_disable_trickle_feed(struct drm_i915_private *dev_priv)
        enum pipe pipe;
  
        for_each_pipe(dev_priv, pipe) {
-               I915_WRITE(DSPCNTR(pipe),
-                          I915_READ(DSPCNTR(pipe)) |
+               intel_uncore_write(&dev_priv->uncore, DSPCNTR(pipe),
+                          intel_uncore_read(&dev_priv->uncore, DSPCNTR(pipe)) |
                           DISPPLANE_TRICKLE_FEED_DISABLE);
  
-               I915_WRITE(DSPSURF(pipe), I915_READ(DSPSURF(pipe)));
-               POSTING_READ(DSPSURF(pipe));
+               intel_uncore_write(&dev_priv->uncore, DSPSURF(pipe), intel_uncore_read(&dev_priv->uncore, DSPSURF(pipe)));
+               intel_uncore_posting_read(&dev_priv->uncore, DSPSURF(pipe));
        }
  }
  
@@@ -6879,10 -6879,10 +6879,10 @@@ static void ilk_init_clock_gating(struc
                   ILK_DPFCUNIT_CLOCK_GATE_DISABLE |
                   ILK_DPFDUNIT_CLOCK_GATE_ENABLE;
  
-       I915_WRITE(PCH_3DCGDIS0,
+       intel_uncore_write(&dev_priv->uncore, PCH_3DCGDIS0,
                   MARIUNIT_CLOCK_GATE_DISABLE |
                   SVSMUNIT_CLOCK_GATE_DISABLE);
-       I915_WRITE(PCH_3DCGDIS1,
+       intel_uncore_write(&dev_priv->uncore, PCH_3DCGDIS1,
                   VFMUNIT_CLOCK_GATE_DISABLE);
  
        /*
         * The bit 5 of 0x42020
         * The bit 15 of 0x45000
         */
-       I915_WRITE(ILK_DISPLAY_CHICKEN2,
-                  (I915_READ(ILK_DISPLAY_CHICKEN2) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
+                  (intel_uncore_read(&dev_priv->uncore, 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) |
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL,
+                  (intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
                    DISP_FBC_WM_DIS));
  
        /*
         */
        if (IS_IRONLAKE_M(dev_priv)) {
                /* WaFbcAsynchFlipDisableFbcQueue:ilk */
-               I915_WRITE(ILK_DISPLAY_CHICKEN1,
-                          I915_READ(ILK_DISPLAY_CHICKEN1) |
+               intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1,
+                          intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) |
                           ILK_FBCQ_DIS);
-               I915_WRITE(ILK_DISPLAY_CHICKEN2,
-                          I915_READ(ILK_DISPLAY_CHICKEN2) |
+               intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
+                          intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) |
                           ILK_DPARB_GATE);
        }
  
-       I915_WRITE(ILK_DSPCLK_GATE_D, dspclk_gate);
+       intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate);
  
-       I915_WRITE(ILK_DISPLAY_CHICKEN2,
-                  I915_READ(ILK_DISPLAY_CHICKEN2) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
+                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) |
                   ILK_ELPIN_409_SELECT);
  
        g4x_disable_trickle_feed(dev_priv);
@@@ -6938,27 -6938,27 +6938,27 @@@ static void cpt_init_clock_gating(struc
         * 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 |
+       intel_uncore_write(&dev_priv->uncore, 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) |
+       intel_uncore_write(&dev_priv->uncore, SOUTH_CHICKEN2, intel_uncore_read(&dev_priv->uncore, 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.
         */
        for_each_pipe(dev_priv, pipe) {
-               val = I915_READ(TRANS_CHICKEN2(pipe));
+               val = intel_uncore_read(&dev_priv->uncore, 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_DISABLE_DEEP_COLOR_COUNTER;
                val &= ~TRANS_CHICKEN2_DISABLE_DEEP_COLOR_MODESWITCH;
-               I915_WRITE(TRANS_CHICKEN2(pipe), val);
+               intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN2(pipe), val);
        }
        /* WADP0ClockGatingDisable */
        for_each_pipe(dev_priv, pipe) {
-               I915_WRITE(TRANS_CHICKEN1(pipe),
+               intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN1(pipe),
                           TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);
        }
  }
@@@ -6967,7 -6967,7 +6967,7 @@@ static void gen6_check_mch_setup(struc
  {
        u32 tmp;
  
-       tmp = I915_READ(MCH_SSKPD);
+       tmp = intel_uncore_read(&dev_priv->uncore, MCH_SSKPD);
        if ((tmp & MCH_SSKPD_WM0_MASK) != MCH_SSKPD_WM0_VAL)
                drm_dbg_kms(&dev_priv->drm,
                            "Wrong MCH_SSKPD value: 0x%08x This can cause underruns.\n",
@@@ -6978,14 -6978,14 +6978,14 @@@ static void gen6_init_clock_gating(stru
  {
        u32 dspclk_gate = ILK_VRHUNIT_CLOCK_GATE_DISABLE;
  
-       I915_WRITE(ILK_DSPCLK_GATE_D, dspclk_gate);
+       intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate);
  
-       I915_WRITE(ILK_DISPLAY_CHICKEN2,
-                  I915_READ(ILK_DISPLAY_CHICKEN2) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
+                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) |
                   ILK_ELPIN_409_SELECT);
  
-       I915_WRITE(GEN6_UCGCTL1,
-                  I915_READ(GEN6_UCGCTL1) |
+       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1,
+                  intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) |
                   GEN6_BLBUNIT_CLOCK_GATE_DISABLE |
                   GEN6_CSUNIT_CLOCK_GATE_DISABLE);
  
         * WaDisableRCCUnitClockGating:snb
         * WaDisableRCPBUnitClockGating:snb
         */
-       I915_WRITE(GEN6_UCGCTL2,
+       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL2,
                   GEN6_RCPBUNIT_CLOCK_GATE_DISABLE |
                   GEN6_RCCUNIT_CLOCK_GATE_DISABLE);
  
         *
         * WaFbcAsynchFlipDisableFbcQueue:snb
         */
-       I915_WRITE(ILK_DISPLAY_CHICKEN1,
-                  I915_READ(ILK_DISPLAY_CHICKEN1) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1,
+                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) |
                   ILK_FBCQ_DIS | ILK_PABSTRETCH_DIS);
-       I915_WRITE(ILK_DISPLAY_CHICKEN2,
-                  I915_READ(ILK_DISPLAY_CHICKEN2) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2,
+                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) |
                   ILK_DPARB_GATE | ILK_VSDPFD_FULL);
-       I915_WRITE(ILK_DSPCLK_GATE_D,
-                  I915_READ(ILK_DSPCLK_GATE_D) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D,
+                  intel_uncore_read(&dev_priv->uncore, ILK_DSPCLK_GATE_D) |
                   ILK_DPARBUNIT_CLOCK_GATE_ENABLE  |
                   ILK_DPFDUNIT_CLOCK_GATE_ENABLE);
  
@@@ -7042,23 -7042,23 +7042,23 @@@ static void lpt_init_clock_gating(struc
         * disabled when not needed anymore in order to save power.
         */
        if (HAS_PCH_LPT_LP(dev_priv))
-               I915_WRITE(SOUTH_DSPCLK_GATE_D,
-                          I915_READ(SOUTH_DSPCLK_GATE_D) |
+               intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D,
+                          intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) |
                           PCH_LP_PARTITION_LEVEL_DISABLE);
  
        /* WADPOClockGatingDisable:hsw */
-       I915_WRITE(TRANS_CHICKEN1(PIPE_A),
-                  I915_READ(TRANS_CHICKEN1(PIPE_A)) |
+       intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A),
+                  intel_uncore_read(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A)) |
                   TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);
  }
  
  static void lpt_suspend_hw(struct drm_i915_private *dev_priv)
  {
        if (HAS_PCH_LPT_LP(dev_priv)) {
-               u32 val = I915_READ(SOUTH_DSPCLK_GATE_D);
+               u32 val = intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D);
  
                val &= ~PCH_LP_PARTITION_LEVEL_DISABLE;
-               I915_WRITE(SOUTH_DSPCLK_GATE_D, val);
+               intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, val);
        }
  }
  
@@@ -7070,48 -7070,62 +7070,48 @@@ static void gen8_set_l3sqc_credits(stru
        u32 val;
  
        /* WaTempDisableDOPClkGating:bdw */
-       misccpctl = I915_READ(GEN7_MISCCPCTL);
-       I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
+       misccpctl = intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL);
+       intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
  
-       val = I915_READ(GEN8_L3SQCREG1);
+       val = intel_uncore_read(&dev_priv->uncore, GEN8_L3SQCREG1);
        val &= ~L3_PRIO_CREDITS_MASK;
        val |= L3_GENERAL_PRIO_CREDITS(general_prio_credits);
        val |= L3_HIGH_PRIO_CREDITS(high_prio_credits);
-       I915_WRITE(GEN8_L3SQCREG1, val);
+       intel_uncore_write(&dev_priv->uncore, GEN8_L3SQCREG1, val);
  
        /*
         * Wait at least 100 clocks before re-enabling clock gating.
         * See the definition of L3SQCREG1 in BSpec.
         */
-       POSTING_READ(GEN8_L3SQCREG1);
+       intel_uncore_posting_read(&dev_priv->uncore, GEN8_L3SQCREG1);
        udelay(1);
-       I915_WRITE(GEN7_MISCCPCTL, misccpctl);
+       intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl);
  }
  
  static void icl_init_clock_gating(struct drm_i915_private *dev_priv)
  {
        /* Wa_1409120013:icl,ehl */
-       I915_WRITE(ILK_DPFC_CHICKEN,
+       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN,
                   ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL);
  
        /* This is not an Wa. Enable to reduce Sampler power */
-       I915_WRITE(GEN10_DFR_RATIO_EN_AND_CHICKEN,
-                  I915_READ(GEN10_DFR_RATIO_EN_AND_CHICKEN) & ~DFR_DISABLE);
+       intel_uncore_write(&dev_priv->uncore, GEN10_DFR_RATIO_EN_AND_CHICKEN,
+                  intel_uncore_read(&dev_priv->uncore, GEN10_DFR_RATIO_EN_AND_CHICKEN) & ~DFR_DISABLE);
  
        /*Wa_14010594013:icl, ehl */
        intel_uncore_rmw(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1,
                         0, CNL_DELAY_PMRSP);
  }
  
 -static void gen12_init_clock_gating(struct drm_i915_private *i915)
 -{
 -      unsigned int i;
 -
 -      /* This is not a WA. Enable VD HCP & MFX_ENC powergate */
 -      for (i = 0; i < I915_MAX_VCS; i++)
 -              if (HAS_ENGINE(&i915->gt, _VCS(i)))
 -                      intel_uncore_rmw(&i915->uncore, POWERGATE_ENABLE, 0,
 -                                       VDN_HCP_POWERGATE_ENABLE(i) |
 -                                       VDN_MFX_POWERGATE_ENABLE(i));
 -}
 -
  static void tgl_init_clock_gating(struct drm_i915_private *dev_priv)
  {
 -      gen12_init_clock_gating(dev_priv);
 -
        /* Wa_1409120013:tgl */
-       I915_WRITE(ILK_DPFC_CHICKEN,
+       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN,
                   ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL);
  
        /* Wa_1409825376:tgl (pre-prod)*/
        if (IS_TGL_DISP_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_B1))
-               I915_WRITE(GEN9_CLKGATE_DIS_3, I915_READ(GEN9_CLKGATE_DIS_3) |
+               intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) |
                           TGL_VRH_GATING_DIS);
  
        /* Wa_14011059788:tgl */
  
  static void dg1_init_clock_gating(struct drm_i915_private *dev_priv)
  {
 -      gen12_init_clock_gating(dev_priv);
 -
        /* Wa_1409836686:dg1[a0] */
        if (IS_DG1_REVID(dev_priv, DG1_REVID_A0, DG1_REVID_A0))
-               I915_WRITE(GEN9_CLKGATE_DIS_3, I915_READ(GEN9_CLKGATE_DIS_3) |
+               intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) |
                           DPT_GATING_DIS);
  }
  
@@@ -7133,7 -7149,7 +7133,7 @@@ static void cnp_init_clock_gating(struc
                return;
  
        /* Display WA #1181 WaSouthDisplayDisablePWMCGEGating: cnp */
-       I915_WRITE(SOUTH_DSPCLK_GATE_D, I915_READ(SOUTH_DSPCLK_GATE_D) |
+       intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) |
                   CNP_PWM_CGE_GATING_DISABLE);
  }
  
@@@ -7143,35 -7159,35 +7143,35 @@@ static void cnl_init_clock_gating(struc
        cnp_init_clock_gating(dev_priv);
  
        /* This is not an Wa. Enable for better image quality */
-       I915_WRITE(_3D_CHICKEN3,
+       intel_uncore_write(&dev_priv->uncore, _3D_CHICKEN3,
                   _MASKED_BIT_ENABLE(_3D_CHICKEN3_AA_LINE_QUALITY_FIX_ENABLE));
  
        /* WaEnableChickenDCPR:cnl */
-       I915_WRITE(GEN8_CHICKEN_DCPR_1,
-                  I915_READ(GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM);
+       intel_uncore_write(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1,
+                  intel_uncore_read(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM);
  
        /*
         * WaFbcWakeMemOn:cnl
         * Display WA #0859: cnl
         */
-       I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
                   DISP_FBC_MEMORY_WAKE);
  
-       val = I915_READ(SLICE_UNIT_LEVEL_CLKGATE);
+       val = intel_uncore_read(&dev_priv->uncore, SLICE_UNIT_LEVEL_CLKGATE);
        /* ReadHitWriteOnlyDisable:cnl */
        val |= RCCUNIT_CLKGATE_DIS;
-       I915_WRITE(SLICE_UNIT_LEVEL_CLKGATE, val);
+       intel_uncore_write(&dev_priv->uncore, SLICE_UNIT_LEVEL_CLKGATE, val);
  
        /* Wa_2201832410:cnl */
-       val = I915_READ(SUBSLICE_UNIT_LEVEL_CLKGATE);
+       val = intel_uncore_read(&dev_priv->uncore, SUBSLICE_UNIT_LEVEL_CLKGATE);
        val |= GWUNIT_CLKGATE_DIS;
-       I915_WRITE(SUBSLICE_UNIT_LEVEL_CLKGATE, val);
+       intel_uncore_write(&dev_priv->uncore, SUBSLICE_UNIT_LEVEL_CLKGATE, val);
  
        /* WaDisableVFclkgate:cnl */
        /* WaVFUnitClockGatingDisable:cnl */
-       val = I915_READ(UNSLICE_UNIT_LEVEL_CLKGATE);
+       val = intel_uncore_read(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE);
        val |= VFUNIT_CLKGATE_DIS;
-       I915_WRITE(UNSLICE_UNIT_LEVEL_CLKGATE, val);
+       intel_uncore_write(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE, val);
  }
  
  static void cfl_init_clock_gating(struct drm_i915_private *dev_priv)
        gen9_init_clock_gating(dev_priv);
  
        /* WAC6entrylatency:cfl */
-       I915_WRITE(FBC_LLC_READ_CTRL, I915_READ(FBC_LLC_READ_CTRL) |
+       intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) |
                   FBC_LLC_FULLY_OPEN);
  
        /*
         * WaFbcTurnOffFbcWatermark:cfl
         * Display WA #0562: cfl
         */
-       I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
                   DISP_FBC_WM_DIS);
  
        /*
         * WaFbcNukeOnHostModify:cfl
         * Display WA #0873: cfl
         */
-       I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) |
                   ILK_DPFC_NUKE_ON_ANY_MODIFICATION);
  }
  
@@@ -7203,31 -7219,31 +7203,31 @@@ static void kbl_init_clock_gating(struc
        gen9_init_clock_gating(dev_priv);
  
        /* WAC6entrylatency:kbl */
-       I915_WRITE(FBC_LLC_READ_CTRL, I915_READ(FBC_LLC_READ_CTRL) |
+       intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) |
                   FBC_LLC_FULLY_OPEN);
  
        /* WaDisableSDEUnitClockGating:kbl */
        if (IS_KBL_GT_REVID(dev_priv, 0, KBL_REVID_B0))
-               I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
+               intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
                           GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /* WaDisableGamClockGating:kbl */
        if (IS_KBL_GT_REVID(dev_priv, 0, KBL_REVID_B0))
-               I915_WRITE(GEN6_UCGCTL1, I915_READ(GEN6_UCGCTL1) |
+               intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) |
                           GEN6_GAMUNIT_CLOCK_GATE_DISABLE);
  
        /*
         * WaFbcTurnOffFbcWatermark:kbl
         * Display WA #0562: kbl
         */
-       I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
                   DISP_FBC_WM_DIS);
  
        /*
         * WaFbcNukeOnHostModify:kbl
         * Display WA #0873: kbl
         */
-       I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) |
                   ILK_DPFC_NUKE_ON_ANY_MODIFICATION);
  }
  
@@@ -7236,32 -7252,32 +7236,32 @@@ static void skl_init_clock_gating(struc
        gen9_init_clock_gating(dev_priv);
  
        /* WaDisableDopClockGating:skl */
-       I915_WRITE(GEN7_MISCCPCTL, I915_READ(GEN7_MISCCPCTL) &
+       intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL) &
                   ~GEN7_DOP_CLOCK_GATE_ENABLE);
  
        /* WAC6entrylatency:skl */
-       I915_WRITE(FBC_LLC_READ_CTRL, I915_READ(FBC_LLC_READ_CTRL) |
+       intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) |
                   FBC_LLC_FULLY_OPEN);
  
        /*
         * WaFbcTurnOffFbcWatermark:skl
         * Display WA #0562: skl
         */
-       I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
+       intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) |
                   DISP_FBC_WM_DIS);
  
        /*
         * WaFbcNukeOnHostModify:skl
         * Display WA #0873: skl
         */
-       I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) |
                   ILK_DPFC_NUKE_ON_ANY_MODIFICATION);
  
        /*
         * WaFbcHighMemBwCorruptionAvoidance:skl
         * Display WA #0883: skl
         */
-       I915_WRITE(ILK_DPFC_CHICKEN, I915_READ(ILK_DPFC_CHICKEN) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) |
                   ILK_DPFC_DISABLE_DUMMY0);
  }
  
@@@ -7270,42 -7286,42 +7270,42 @@@ static void bdw_init_clock_gating(struc
        enum pipe pipe;
  
        /* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */
-       I915_WRITE(CHICKEN_PIPESL_1(PIPE_A),
-                  I915_READ(CHICKEN_PIPESL_1(PIPE_A)) |
+       intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A),
+                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) |
                   HSW_FBCQ_DIS);
  
        /* WaSwitchSolVfFArbitrationPriority:bdw */
-       I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
+       intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
  
        /* WaPsrDPAMaskVBlankInSRD:bdw */
-       I915_WRITE(CHICKEN_PAR1_1,
-                  I915_READ(CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD);
+       intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1,
+                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD);
  
        /* WaPsrDPRSUnmaskVBlankInSRD:bdw */
        for_each_pipe(dev_priv, pipe) {
-               I915_WRITE(CHICKEN_PIPESL_1(pipe),
-                          I915_READ(CHICKEN_PIPESL_1(pipe)) |
+               intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe),
+                          intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe)) |
                           BDW_DPRS_MASK_VBLANK_SRD);
        }
  
        /* WaVSRefCountFullforceMissDisable:bdw */
        /* WaDSRefCountFullforceMissDisable:bdw */
-       I915_WRITE(GEN7_FF_THREAD_MODE,
-                  I915_READ(GEN7_FF_THREAD_MODE) &
+       intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE,
+                  intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) &
                   ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME));
  
-       I915_WRITE(GEN6_RC_SLEEP_PSMI_CONTROL,
+       intel_uncore_write(&dev_priv->uncore, GEN6_RC_SLEEP_PSMI_CONTROL,
                   _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));
  
        /* WaDisableSDEUnitClockGating:bdw */
-       I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
+       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
                   GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /* WaProgramL3SqcReg1Default:bdw */
        gen8_set_l3sqc_credits(dev_priv, 30, 2);
  
        /* WaKVMNotificationOnConfigChange:bdw */
-       I915_WRITE(CHICKEN_PAR2_1, I915_READ(CHICKEN_PAR2_1)
+       intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR2_1, intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR2_1)
                   | KVM_CONFIG_CHANGE_NOTIFICATION_SELECT);
  
        lpt_init_clock_gating(dev_priv);
         * Also see the CHICKEN2 write in bdw_init_workarounds() to disable DOP
         * clock gating.
         */
-       I915_WRITE(GEN6_UCGCTL1,
-                  I915_READ(GEN6_UCGCTL1) | GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE);
+       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1,
+                  intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE);
  }
  
  static void hsw_init_clock_gating(struct drm_i915_private *dev_priv)
  {
        /* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */
-       I915_WRITE(CHICKEN_PIPESL_1(PIPE_A),
-                  I915_READ(CHICKEN_PIPESL_1(PIPE_A)) |
+       intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A),
+                  intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) |
                   HSW_FBCQ_DIS);
  
        /* This is required by WaCatErrorRejectionIssue:hsw */
-       I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
-                  I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
+       intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
+                  intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
                   GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
        /* WaSwitchSolVfFArbitrationPriority:hsw */
-       I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
+       intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL);
  
        lpt_init_clock_gating(dev_priv);
  }
@@@ -7341,26 -7357,26 +7341,26 @@@ static void ivb_init_clock_gating(struc
  {
        u32 snpcr;
  
-       I915_WRITE(ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);
+       intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);
  
        /* WaFbcAsynchFlipDisableFbcQueue:ivb */
-       I915_WRITE(ILK_DISPLAY_CHICKEN1,
-                  I915_READ(ILK_DISPLAY_CHICKEN1) |
+       intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1,
+                  intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) |
                   ILK_FBCQ_DIS);
  
        /* WaDisableBackToBackFlipFix:ivb */
-       I915_WRITE(IVB_CHICKEN3,
+       intel_uncore_write(&dev_priv->uncore, IVB_CHICKEN3,
                   CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE |
                   CHICKEN3_DGMG_DONE_FIX_DISABLE);
  
        if (IS_IVB_GT1(dev_priv))
-               I915_WRITE(GEN7_ROW_CHICKEN2,
+               intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2,
                           _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
        else {
                /* must write both registers */
-               I915_WRITE(GEN7_ROW_CHICKEN2,
+               intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2,
                           _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
-               I915_WRITE(GEN7_ROW_CHICKEN2_GT2,
+               intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2_GT2,
                           _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
        }
  
         * According to the spec, bit 13 (RCZUNIT) must be set on IVB.
         * This implements the WaDisableRCZUnitClockGating:ivb workaround.
         */
-       I915_WRITE(GEN6_UCGCTL2,
+       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL2,
                   GEN6_RCZUNIT_CLOCK_GATE_DISABLE);
  
        /* This is required by WaCatErrorRejectionIssue:ivb */
-       I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
-                       I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
+       intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
+                       intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
                        GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
        g4x_disable_trickle_feed(dev_priv);
  
-       snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
+       snpcr = intel_uncore_read(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR);
        snpcr &= ~GEN6_MBC_SNPCR_MASK;
        snpcr |= GEN6_MBC_SNPCR_MED;
-       I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
+       intel_uncore_write(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR, snpcr);
  
        if (!HAS_PCH_NOP(dev_priv))
                cpt_init_clock_gating(dev_priv);
  static void vlv_init_clock_gating(struct drm_i915_private *dev_priv)
  {
        /* WaDisableBackToBackFlipFix:vlv */
-       I915_WRITE(IVB_CHICKEN3,
+       intel_uncore_write(&dev_priv->uncore, IVB_CHICKEN3,
                   CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE |
                   CHICKEN3_DGMG_DONE_FIX_DISABLE);
  
        /* WaDisableDopClockGating:vlv */
-       I915_WRITE(GEN7_ROW_CHICKEN2,
+       intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2,
                   _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
  
        /* This is required by WaCatErrorRejectionIssue:vlv */
-       I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
-                  I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
+       intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG,
+                  intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) |
                   GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);
  
        /*
         * According to the spec, bit 13 (RCZUNIT) must be set on IVB.
         * This implements the WaDisableRCZUnitClockGating:vlv workaround.
         */
-       I915_WRITE(GEN6_UCGCTL2,
+       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL2,
                   GEN6_RCZUNIT_CLOCK_GATE_DISABLE);
  
        /* 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);
+       intel_uncore_write(&dev_priv->uncore, GEN7_UCGCTL4,
+                  intel_uncore_read(&dev_priv->uncore, GEN7_UCGCTL4) | GEN7_L3BANK2X_CLOCK_GATE_DISABLE);
  
        /*
         * 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);
+       intel_uncore_write(&dev_priv->uncore, VLV_GUNIT_CLOCK_GATE, GCFG_DIS);
  }
  
  static void chv_init_clock_gating(struct drm_i915_private *dev_priv)
  {
        /* WaVSRefCountFullforceMissDisable:chv */
        /* WaDSRefCountFullforceMissDisable:chv */
-       I915_WRITE(GEN7_FF_THREAD_MODE,
-                  I915_READ(GEN7_FF_THREAD_MODE) &
+       intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE,
+                  intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) &
                   ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME));
  
        /* WaDisableSemaphoreAndSyncFlipWait:chv */
-       I915_WRITE(GEN6_RC_SLEEP_PSMI_CONTROL,
+       intel_uncore_write(&dev_priv->uncore, GEN6_RC_SLEEP_PSMI_CONTROL,
                   _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));
  
        /* WaDisableCSUnitClockGating:chv */
-       I915_WRITE(GEN6_UCGCTL1, I915_READ(GEN6_UCGCTL1) |
+       intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) |
                   GEN6_CSUNIT_CLOCK_GATE_DISABLE);
  
        /* WaDisableSDEUnitClockGating:chv */
-       I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) |
+       intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) |
                   GEN8_SDEUNIT_CLOCK_GATE_DISABLE);
  
        /*
@@@ -7458,17 -7474,17 +7458,17 @@@ static void g4x_init_clock_gating(struc
  {
        u32 dspclk_gate;
  
-       I915_WRITE(RENCLK_GATE_D1, 0);
-       I915_WRITE(RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE |
+       intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D1, 0);
+       intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE |
                   GS_UNIT_CLOCK_GATE_DISABLE |
                   CL_UNIT_CLOCK_GATE_DISABLE);
-       I915_WRITE(RAMCLK_GATE_D, 0);
+       intel_uncore_write(&dev_priv->uncore, RAMCLK_GATE_D, 0);
        dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE |
                OVRUNIT_CLOCK_GATE_DISABLE |
                OVCUNIT_CLOCK_GATE_DISABLE;
        if (IS_GM45(dev_priv))
                dspclk_gate |= DSSUNIT_CLOCK_GATE_DISABLE;
-       I915_WRITE(DSPCLK_GATE_D, dspclk_gate);
+       intel_uncore_write(&dev_priv->uncore, DSPCLK_GATE_D, dspclk_gate);
  
        g4x_disable_trickle_feed(dev_priv);
  }
@@@ -7489,49 -7505,49 +7489,49 @@@ static void i965gm_init_clock_gating(st
  
  static void i965g_init_clock_gating(struct drm_i915_private *dev_priv)
  {
-       I915_WRITE(RENCLK_GATE_D1, I965_RCZ_CLOCK_GATE_DISABLE |
+       intel_uncore_write(&dev_priv->uncore, 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,
+       intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D2, 0);
+       intel_uncore_write(&dev_priv->uncore, MI_ARB_STATE,
                   _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE));
  }
  
  static void gen3_init_clock_gating(struct drm_i915_private *dev_priv)
  {
-       u32 dstate = I915_READ(D_STATE);
+       u32 dstate = intel_uncore_read(&dev_priv->uncore, D_STATE);
  
        dstate |= DSTATE_PLL_D3_OFF | DSTATE_GFX_CLOCK_GATING |
                DSTATE_DOT_CLOCK_GATING;
-       I915_WRITE(D_STATE, dstate);
+       intel_uncore_write(&dev_priv->uncore, D_STATE, dstate);
  
        if (IS_PINEVIEW(dev_priv))
-               I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY));
+               intel_uncore_write(&dev_priv->uncore, ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY));
  
        /* IIR "flip pending" means done if this bit is set */
-       I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));
+       intel_uncore_write(&dev_priv->uncore, ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));
  
        /* interrupts should cause a wake up from C3 */
-       I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_AGPBUSY_INT_EN));
+       intel_uncore_write(&dev_priv->uncore, INSTPM, _MASKED_BIT_ENABLE(INSTPM_AGPBUSY_INT_EN));
  
        /* 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));
+       intel_uncore_write(&dev_priv->uncore, MI_ARB_STATE, _MASKED_BIT_ENABLE(MI_ARB_C3_LP_WRITE_ENABLE));
  
-       I915_WRITE(MI_ARB_STATE,
+       intel_uncore_write(&dev_priv->uncore, MI_ARB_STATE,
                   _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE));
  }
  
  static void i85x_init_clock_gating(struct drm_i915_private *dev_priv)
  {
-       I915_WRITE(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
+       intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
  
        /* interrupts should cause a wake up from C3 */
-       I915_WRITE(MI_STATE, _MASKED_BIT_ENABLE(MI_AGPBUSY_INT_EN) |
+       intel_uncore_write(&dev_priv->uncore, MI_STATE, _MASKED_BIT_ENABLE(MI_AGPBUSY_INT_EN) |
                   _MASKED_BIT_DISABLE(MI_AGPBUSY_830_MODE));
  
-       I915_WRITE(MEM_MODE,
+       intel_uncore_write(&dev_priv->uncore, MEM_MODE,
                   _MASKED_BIT_ENABLE(MEM_DISPLAY_TRICKLE_FEED_DISABLE));
  
        /*
         * abosultely nothing) would not allow FBC to recompress
         * until a 2D blit occurs.
         */
-       I915_WRITE(SCPD0,
+       intel_uncore_write(&dev_priv->uncore, SCPD0,
                   _MASKED_BIT_ENABLE(SCPD_FBC_IGNORE_3D));
  }
  
  static void i830_init_clock_gating(struct drm_i915_private *dev_priv)
  {
-       I915_WRITE(MEM_MODE,
+       intel_uncore_write(&dev_priv->uncore, MEM_MODE,
                   _MASKED_BIT_ENABLE(MEM_DISPLAY_A_TRICKLE_FEED_DISABLE) |
                   _MASKED_BIT_ENABLE(MEM_DISPLAY_B_TRICKLE_FEED_DISABLE));
  }
diff --combined include/drm/drm_dsc.h
@@@ -273,8 -273,7 +273,8 @@@ struct drm_dsc_config 
  };
  
  /**
 - * struct picture_parameter_set - Represents 128 bytes of Picture Parameter Set
 + * struct drm_dsc_picture_parameter_set - Represents 128 bytes of
 + *    Picture Parameter Set
   *
   * The VESA DSC standard defines picture parameter set (PPS) which display
   * stream compression encoders must communicate to decoders.
@@@ -603,6 -602,7 +603,7 @@@ struct drm_dsc_pps_infoframe 
  } __packed;
  
  void drm_dsc_dp_pps_header_init(struct dp_sdp_header *pps_header);
+ int drm_dsc_dp_rc_buffer_size(u8 rc_buffer_block_size, u8 rc_buffer_size);
  void drm_dsc_pps_payload_pack(struct drm_dsc_picture_parameter_set *pps_sdp,
                                const struct drm_dsc_config *dsc_cfg);
  int drm_dsc_compute_rc_parameters(struct drm_dsc_config *vdsc_cfg);