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
48 files changed:
drivers/gpu/drm/drm_dsc.c
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/display/i9xx_plane.c [new file with mode: 0644]
drivers/gpu/drm/i915/display/i9xx_plane.h [new file with mode: 0644]
drivers/gpu/drm/i915/display/icl_dsi.c
drivers/gpu/drm/i915/display/intel_atomic_plane.c
drivers/gpu/drm/i915/display/intel_bios.c
drivers/gpu/drm/i915/display/intel_cdclk.c
drivers/gpu/drm/i915/display/intel_combo_phy.c
drivers/gpu/drm/i915/display/intel_connector.c
drivers/gpu/drm/i915/display/intel_connector.h
drivers/gpu/drm/i915/display/intel_cursor.c [new file with mode: 0644]
drivers/gpu/drm/i915/display/intel_cursor.h [new file with mode: 0644]
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display.h
drivers/gpu/drm/i915/display/intel_display_debugfs.c
drivers/gpu/drm/i915/display/intel_display_debugfs.h
drivers/gpu/drm/i915/display/intel_display_power.c
drivers/gpu/drm/i915/display/intel_display_power.h
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c
drivers/gpu/drm/i915/display/intel_dvo.c
drivers/gpu/drm/i915/display/intel_fbc.c
drivers/gpu/drm/i915/display/intel_hdmi.c
drivers/gpu/drm/i915/display/intel_lspcon.c
drivers/gpu/drm/i915/display/intel_lspcon.h
drivers/gpu/drm/i915/display/intel_panel.c
drivers/gpu/drm/i915/display/intel_psr.c
drivers/gpu/drm/i915/display/intel_sprite.c
drivers/gpu/drm/i915/display/intel_sprite.h
drivers/gpu/drm/i915/display/intel_tc.c
drivers/gpu/drm/i915/display/intel_vdsc.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/i915_suspend.c
drivers/gpu/drm/i915/intel_device_info.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_sideband.c
drivers/gpu/drm/i915/intel_uncore.c
drivers/gpu/drm/i915/intel_uncore.h
include/drm/drm_dsc.h

index 4a475d9696ff39dae1ace772c0af1f27897a07cc..ff602f7ec65b1e722458a562abf99a138b59b755 100644 (file)
@@ -49,6 +49,33 @@ void drm_dsc_dp_pps_header_init(struct dp_sdp_header *pps_header)
 }
 EXPORT_SYMBOL(drm_dsc_dp_pps_header_init);
 
+/**
+ * drm_dsc_dp_rc_buffer_size - get rc buffer size in bytes
+ * @rc_buffer_block_size: block size code, according to DPCD offset 62h
+ * @rc_buffer_size: number of blocks - 1, according to DPCD offset 63h
+ *
+ * return:
+ * buffer size in bytes, or 0 on invalid input
+ */
+int drm_dsc_dp_rc_buffer_size(u8 rc_buffer_block_size, u8 rc_buffer_size)
+{
+       int size = 1024 * (rc_buffer_size + 1);
+
+       switch (rc_buffer_block_size) {
+       case DP_DSC_RC_BUF_BLK_SIZE_1:
+               return 1 * size;
+       case DP_DSC_RC_BUF_BLK_SIZE_4:
+               return 4 * size;
+       case DP_DSC_RC_BUF_BLK_SIZE_16:
+               return 16 * size;
+       case DP_DSC_RC_BUF_BLK_SIZE_64:
+               return 64 * size;
+       default:
+               return 0;
+       }
+}
+EXPORT_SYMBOL(drm_dsc_dp_rc_buffer_size);
+
 /**
  * drm_dsc_pps_payload_pack() - Populates the DSC PPS
  *
@@ -186,8 +213,7 @@ void drm_dsc_pps_payload_pack(struct drm_dsc_picture_parameter_set *pps_payload,
        pps_payload->flatness_max_qp = dsc_cfg->flatness_max_qp;
 
        /* PPS 38, 39 */
-       pps_payload->rc_model_size =
-               cpu_to_be16(DSC_RC_MODEL_SIZE_CONST);
+       pps_payload->rc_model_size = cpu_to_be16(dsc_cfg->rc_model_size);
 
        /* PPS 40 */
        pps_payload->rc_edge_factor = DSC_RC_EDGE_FACTOR_CONST;
index e5574e506a5ccf03684f47fc0f59d9a62f4ae1d8..c1fa5a9310f94a47b6d1e25fc0a9c692756a6664 100644 (file)
@@ -197,6 +197,7 @@ i915-y += \
        display/intel_combo_phy.o \
        display/intel_connector.o \
        display/intel_csr.o \
+       display/intel_cursor.o \
        display/intel_display.o \
        display/intel_display_power.o \
        display/intel_dpio_phy.o \
@@ -214,7 +215,8 @@ i915-y += \
        display/intel_quirks.o \
        display/intel_sprite.o \
        display/intel_tc.o \
-       display/intel_vga.o
+       display/intel_vga.o \
+       display/i9xx_plane.o
 i915-$(CONFIG_ACPI) += \
        display/intel_acpi.o \
        display/intel_opregion.o
diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.c b/drivers/gpu/drm/i915/display/i9xx_plane.c
new file mode 100644 (file)
index 0000000..b78985c
--- /dev/null
@@ -0,0 +1,704 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+#include <linux/kernel.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_plane_helper.h>
+
+#include "intel_atomic.h"
+#include "intel_atomic_plane.h"
+#include "intel_display_types.h"
+#include "intel_sprite.h"
+#include "i9xx_plane.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
+};
+
+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 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 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 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 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 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 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);
+}
+
+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;
+}
+
+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 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,
+};
+
+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);
+}
+
diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.h b/drivers/gpu/drm/i915/display/i9xx_plane.h
new file mode 100644 (file)
index 0000000..bc2834a
--- /dev/null
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+
+#ifndef _I9XX_PLANE_H_
+#define _I9XX_PLANE_H_
+
+#include <linux/types.h>
+
+enum pipe;
+struct drm_i915_private;
+struct intel_plane;
+struct intel_plane_state;
+
+unsigned int i9xx_plane_max_stride(struct intel_plane *plane,
+                                  u32 pixel_format, u64 modifier,
+                                  unsigned int rotation);
+int i9xx_check_plane_surface(struct intel_plane_state *plane_state);
+
+struct intel_plane *
+intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe);
+
+#endif
index a9439b4156037169b17361c2ea7a446f7d45b573..9d245a689323f62703ef8780a12871ce369ecdb6 100644 (file)
@@ -1535,6 +1535,9 @@ static int gen11_dsi_dsc_compute_config(struct intel_encoder *encoder,
 
        vdsc_cfg->convert_rgb = true;
 
+       /* FIXME: initialize from VBT */
+       vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
+
        ret = intel_dsc_compute_params(encoder, crtc_state);
        if (ret)
                return ret;
@@ -1616,10 +1619,6 @@ static void gen11_dsi_get_power_domains(struct intel_encoder *encoder,
 
        get_dsi_io_power_domains(i915,
                                 enc_to_intel_dsi(encoder));
-
-       if (crtc_state->dsc.compression_enable)
-               intel_display_power_get(i915,
-                                       intel_dsc_power_domain(crtc_state));
 }
 
 static bool gen11_dsi_get_hw_state(struct intel_encoder *encoder,
index 7e9f84b008596be42c1dc8020096903a75e09b13..b5e1ee99535cfe4cdf7774bb61bec3df10ee6c89 100644 (file)
@@ -312,10 +312,13 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
        int ret;
 
        intel_plane_set_invisible(new_crtc_state, new_plane_state);
+       new_crtc_state->enabled_planes &= ~BIT(plane->id);
 
        if (!new_plane_state->hw.crtc && !old_plane_state->hw.crtc)
                return 0;
 
+       new_crtc_state->enabled_planes |= BIT(plane->id);
+
        ret = plane->check_plane(new_crtc_state, new_plane_state);
        if (ret)
                return ret;
index 4cc949b228f2dd5aa3f6c1383b5d69e8ef71bbdc..06c3310446a261e03bfee134e3c524d005c5b784 100644 (file)
@@ -2555,16 +2555,11 @@ static void fill_dsc(struct intel_crtc_state *crtc_state,
                              crtc_state->dsc.slice_count);
 
        /*
-        * FIXME: Use VBT rc_buffer_block_size and rc_buffer_size for the
-        * implementation specific physical rate buffer size. Currently we use
-        * the required rate buffer model size calculated in
-        * drm_dsc_compute_rc_parameters() according to VESA DSC Annex E.
-        *
         * The VBT rc_buffer_block_size and rc_buffer_size definitions
-        * correspond to DP 1.4 DPCD offsets 0x62 and 0x63. The DP DSC
-        * implementation should also use the DPCD (or perhaps VBT for eDP)
-        * provided value for the buffer size.
+        * correspond to DP 1.4 DPCD offsets 0x62 and 0x63.
         */
+       vdsc_cfg->rc_model_size = drm_dsc_dp_rc_buffer_size(dsc->rc_buffer_block_size,
+                                                           dsc->rc_buffer_size);
 
        /* FIXME: DSI spec says bpc + 1 for this one */
        vdsc_cfg->line_buf_depth = VBT_DSC_LINE_BUFFER_DEPTH(dsc->line_buffer_depth);
index c449d28d0560a6f3c88f941aa82744e126ea25a2..2e878cc274b7bb6d14b9498589cbce9e95051e5d 100644 (file)
@@ -2415,8 +2415,7 @@ static int intel_modeset_all_pipes(struct intel_atomic_state *state)
                if (ret)
                        return ret;
 
-               ret = drm_atomic_add_affected_planes(&state->base,
-                                                    &crtc->base);
+               ret = intel_atomic_add_affected_planes(state, crtc);
                if (ret)
                        return ret;
 
@@ -2710,8 +2709,8 @@ static int dg1_rawclk(struct drm_i915_private *dev_priv)
         * DG1 always uses a 38.4 MHz rawclk.  The bspec tells us
         * "Program Numerator=2, Denominator=4, Divider=37 decimal."
         */
-       I915_WRITE(PCH_RAWCLK_FREQ,
-                  CNP_RAWCLK_DEN(4) | CNP_RAWCLK_DIV(37) | ICP_RAWCLK_NUM(2));
+       intel_de_write(dev_priv, PCH_RAWCLK_FREQ,
+                      CNP_RAWCLK_DEN(4) | CNP_RAWCLK_DIV(37) | ICP_RAWCLK_NUM(2));
 
        return 38400;
 }
index d5ad61e4083e55a7224ba477a015ccec7cfcd151..996ae0608a62178e4fc8ea0dbbb91865bef124f7 100644 (file)
@@ -427,10 +427,22 @@ static void icl_combo_phys_uninit(struct drm_i915_private *dev_priv)
                u32 val;
 
                if (phy == PHY_A &&
-                   !icl_combo_phy_verify_state(dev_priv, phy))
-                       drm_warn(&dev_priv->drm,
-                                "Combo PHY %c HW state changed unexpectedly\n",
-                                phy_name(phy));
+                   !icl_combo_phy_verify_state(dev_priv, phy)) {
+                       if (IS_TIGERLAKE(dev_priv) || IS_DG1(dev_priv)) {
+                               /*
+                                * A known problem with old ifwi:
+                                * https://gitlab.freedesktop.org/drm/intel/-/issues/2411
+                                * Suppress the warning for CI. Remove ASAP!
+                                */
+                               drm_dbg_kms(&dev_priv->drm,
+                                           "Combo PHY %c HW state changed unexpectedly\n",
+                                           phy_name(phy));
+                       } else {
+                               drm_warn(&dev_priv->drm,
+                                        "Combo PHY %c HW state changed unexpectedly\n",
+                                        phy_name(phy));
+                       }
+               }
 
                if (!has_phy_misc(dev_priv, phy))
                        goto skip_phy_misc;
index 406e96785c763760cf422f9cbcb72cf5c8a721e2..d5ceb7bdc14b396b75c36fad562910d7bc47e798 100644 (file)
@@ -279,24 +279,17 @@ intel_attach_aspect_ratio_property(struct drm_connector *connector)
 }
 
 void
-intel_attach_colorspace_property(struct drm_connector *connector)
+intel_attach_hdmi_colorspace_property(struct drm_connector *connector)
 {
-       switch (connector->connector_type) {
-       case DRM_MODE_CONNECTOR_HDMIA:
-       case DRM_MODE_CONNECTOR_HDMIB:
-               if (drm_mode_create_hdmi_colorspace_property(connector))
-                       return;
-               break;
-       case DRM_MODE_CONNECTOR_DisplayPort:
-       case DRM_MODE_CONNECTOR_eDP:
-               if (drm_mode_create_dp_colorspace_property(connector))
-                       return;
-               break;
-       default:
-               MISSING_CASE(connector->connector_type);
-               return;
-       }
+       if (!drm_mode_create_hdmi_colorspace_property(connector))
+               drm_object_attach_property(&connector->base,
+                                          connector->colorspace_property, 0);
+}
 
-       drm_object_attach_property(&connector->base,
-                                  connector->colorspace_property, 0);
+void
+intel_attach_dp_colorspace_property(struct drm_connector *connector)
+{
+       if (!drm_mode_create_dp_colorspace_property(connector))
+               drm_object_attach_property(&connector->base,
+                                          connector->colorspace_property, 0);
 }
index 93a7375c8196dab2faa358c33506ee0228b6a944..661a37a3c6d834893c094e0b5cb66c0593ee0436 100644 (file)
@@ -30,6 +30,7 @@ int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
 void intel_attach_force_audio_property(struct drm_connector *connector);
 void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
 void intel_attach_aspect_ratio_property(struct drm_connector *connector);
-void intel_attach_colorspace_property(struct drm_connector *connector);
+void intel_attach_hdmi_colorspace_property(struct drm_connector *connector);
+void intel_attach_dp_colorspace_property(struct drm_connector *connector);
 
 #endif /* __INTEL_CONNECTOR_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/i915/display/intel_cursor.c
new file mode 100644 (file)
index 0000000..276d2bb
--- /dev/null
@@ -0,0 +1,806 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+#include <linux/kernel.h>
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_atomic_uapi.h>
+#include <drm/drm_damage_helper.h>
+#include <drm/drm_plane_helper.h>
+#include <drm/drm_fourcc.h>
+
+#include "intel_atomic.h"
+#include "intel_atomic_plane.h"
+#include "intel_cursor.h"
+#include "intel_display_types.h"
+#include "intel_display.h"
+
+#include "intel_frontbuffer.h"
+#include "intel_pm.h"
+#include "intel_psr.h"
+#include "intel_sprite.h"
+
+/* 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
+};
+
+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.
+        */
+
+       if (INTEL_GEN(dev_priv) >= 9)
+               skl_write_cursor_wm(plane, crtc_state);
+
+       if (!intel_crtc_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;
+       } else {
+               intel_de_write_fw(dev_priv, CURPOS(pipe), pos);
+               intel_de_write_fw(dev_priv, CURBASE(pipe), base);
+       }
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
+}
+
+static void i9xx_disable_cursor(struct intel_plane *plane,
+                               const struct intel_crtc_state *crtc_state)
+{
+       i9xx_update_cursor(plane, crtc_state, NULL);
+}
+
+static bool i9xx_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;
+       u32 val;
+
+       /*
+        * 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)
+               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;
+
+       intel_display_power_put(dev_priv, power_domain, wakeref);
+
+       return ret;
+}
+
+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 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 || intel_crtc_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,
+};
+
+struct intel_plane *
+intel_cursor_plane_create(struct drm_i915_private *dev_priv,
+                         enum pipe pipe)
+{
+       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);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_cursor.h b/drivers/gpu/drm/i915/display/intel_cursor.h
new file mode 100644 (file)
index 0000000..ce333bf
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2020 Intel Corporation
+ */
+
+#ifndef _INTEL_CURSOR_H_
+#define _INTEL_CURSOR_H_
+
+enum pipe;
+struct drm_i915_private;
+struct intel_plane;
+
+struct intel_plane *
+intel_cursor_plane_create(struct drm_i915_private *dev_priv,
+                         enum pipe pipe);
+
+#endif
index 5e927c8ab95a3c8d1c8f65de078beb6c5a05e656..17eaa56c5a99e35ad9eadad35495496faab393d6 100644 (file)
@@ -2285,18 +2285,23 @@ static void intel_ddi_get_power_domains(struct intel_encoder *encoder,
        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 @@ static void intel_ddi_enable_fec(struct intel_encoder *encoder,
        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 @@ static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,
 
        /* 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);
@@ -3702,9 +3703,11 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,
        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);
 
@@ -3782,7 +3785,9 @@ static void intel_ddi_pre_enable_hdmi(struct intel_atomic_state *state,
        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 +3945,9 @@ static void intel_ddi_post_disable_dp(struct intel_atomic_state *state,
 
        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 +3968,9 @@ static void intel_ddi_post_disable_hdmi(struct intel_atomic_state *state,
 
        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 +4043,9 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
                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 +4130,7 @@ static void intel_enable_ddi_dp(struct intel_atomic_state *state,
 {
        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)
@@ -4129,7 +4138,10 @@ static void intel_enable_ddi_dp(struct intel_atomic_state *state,
 
        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 +4384,12 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state *state,
        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 +4602,7 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,
        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));
@@ -4661,9 +4677,12 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,
                                    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);
index 3d53ec508a662cd9f51c53c7b393c0e4bf934889..f2c48e5cdb43267a31c52e747a18ff1a58094914 100644 (file)
@@ -45,6 +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 @@
 #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);
@@ -541,12 +484,6 @@ icl_wa_scalerclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,
                               intel_de_read(dev_priv, CLKGATE_DIS_PSL(pipe)) & ~DPFR_GATING_DIS);
 }
 
-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)
 {
@@ -994,7 +931,8 @@ chv_find_best_dpll(const struct intel_limit *limit,
         * 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 @@ static u32 intel_compute_aligned_offset(struct drm_i915_private *dev_priv,
        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 @@ intel_plane_remap_gtt(struct intel_plane_state *plane_state)
        }
 }
 
-static int
+int
 intel_plane_compute_gtt(struct intel_plane_state *plane_state)
 {
        const struct intel_framebuffer *fb =
@@ -3551,7 +3489,7 @@ intel_set_plane_visible(struct intel_crtc_state *crtc_state,
                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;
@@ -3561,11 +3499,14 @@ static void fixup_active_planes(struct intel_crtc_state *crtc_state)
         * 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,
@@ -3583,7 +3524,7 @@ 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;
 
@@ -3613,12 +3554,6 @@ static void intel_plane_disable_noatomic(struct intel_crtc *crtc,
        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 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state)
        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 @@ static bool hsw_pre_update_disable_ips(const struct intel_crtc_state *old_crtc_s
        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 @@ static bool hsw_post_update_enable_ips(const struct intel_crtc_state *old_crtc_s
        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 @@ static bool needs_scalerclk_wa(const struct intel_crtc_state *crtc_state)
 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 @@ static bool planes_disabling(const struct intel_crtc_state *old_crtc_state,
                             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 @@ static void intel_pre_plane_update(struct intel_atomic_state *state,
         * 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 @@ modeset_get_crtc_power_domains(struct intel_crtc_state *crtc_state)
        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 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
                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)
@@ -7850,10 +7367,7 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
        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 @@ static void hsw_get_ddi_pll(struct drm_i915_private *dev_priv, enum port port,
 
 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)
@@ -11306,16 +10817,10 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
        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;
@@ -11323,14 +10828,11 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
 
 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;
 
@@ -11340,16 +10842,10 @@ static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc,
                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 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
                                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;
        }
@@ -11519,14 +11007,8 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
                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
@@ -11542,607 +11024,42 @@ static bool hsw_get_pipe_config(struct intel_crtc *crtc,
                         * 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 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
        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 @@ static int icl_check_nv12_planes(struct intel_crtc_state *crtc_state)
 
                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);
                }
@@ -12885,6 +11803,7 @@ static int icl_check_nv12_planes(struct intel_crtc_state *crtc_state)
 
                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 @@ static int intel_crtc_atomic_check(struct intel_atomic_state *state,
        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 @@ intel_modeset_verify_crtc(struct intel_crtc *crtc,
                          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 @@ static void intel_modeset_clear_plls(struct intel_atomic_state *state)
                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 @@ static int hsw_mode_set_planes_workaround(struct intel_atomic_state *state)
        /* 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) {
@@ -14990,7 +13909,7 @@ static int hsw_mode_set_planes_workaround(struct intel_atomic_state *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 @@ static int intel_crtc_add_planes_to_state(struct intel_atomic_state *state,
        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 @@ static bool intel_cpu_transcoders_need_modeset(struct intel_atomic_state *state,
        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 @@ static int intel_atomic_check_bigjoiner(struct intel_atomic_state *state,
                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 @@ 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 @@ static int intel_atomic_check_async(struct intel_atomic_state *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)) {
                        drm_dbg_kms(&i915->drm, "Modeset Required. Async flip not supported\n");
                        return -EINVAL;
                }
@@ -15507,20 +14434,43 @@ static int intel_atomic_check_async(struct intel_atomic_state *state)
 
 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 @@ static int intel_atomic_check(struct drm_device *dev,
 
        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);
@@ -15595,7 +14538,7 @@ static int intel_atomic_check(struct drm_device *dev,
 
        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);
@@ -15617,7 +14560,7 @@ static int intel_atomic_check(struct drm_device *dev,
         * 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)) {
@@ -15640,11 +14583,21 @@ static int intel_atomic_check(struct drm_device *dev,
                                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;
                }
@@ -15721,12 +14674,12 @@ static int intel_atomic_check(struct drm_device *dev,
                                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 @@ static int intel_atomic_prepare_commit(struct intel_atomic_state *state)
                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 @@ static void commit_pipe_config(struct intel_atomic_state *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);
-       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 @@ static void intel_enable_crtc(struct intel_atomic_state *state,
        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 @@ static void intel_update_crtc(struct intel_atomic_state *state,
                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 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
        /* 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)
@@ -16021,7 +14974,7 @@ static void intel_commit_modeset_disables(struct intel_atomic_state *state)
        /* 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 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
                        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 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *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) ||
                    new_crtc_state->update_pipe) {
 
                        put_domains[crtc->pipe] =
@@ -16292,7 +15245,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
 
        /* 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) {
@@ -16340,7 +15293,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
                        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))
@@ -16376,8 +15329,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
        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 @@ static void add_rps_boost_after_vblank(struct drm_crtc *crtc,
        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);
@@ -16650,7 +15602,7 @@ static int intel_plane_pin_fb(struct intel_plane_state *plane_state)
        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 @@ intel_prepare_plane_fb(struct drm_plane *_plane,
                 * 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,437 +15785,10 @@ void intel_plane_destroy(struct drm_plane *plane)
        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 \
@@ -17274,7 +15799,8 @@ fail:
        .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,
@@ -19164,7 +17690,7 @@ static void readout_plane_state(struct drm_i915_private *dev_priv)
                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 +18113,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
 
                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);
index 5e0d42d82c110aa27ed8ce981e9defee16cf6708..f7e49a39bd921d66d4e9d660218d1465bef422e4 100644 (file)
@@ -499,6 +499,8 @@ enum phy_fia {
                             ((connector) = to_intel_connector((__state)->base.connectors[__i].ptr), \
                             (new_connector_state) = to_intel_digital_connector_state((__state)->base.connectors[__i].new_state), 1))
 
+int intel_atomic_add_affected_planes(struct intel_atomic_state *state,
+                                    struct intel_crtc *crtc);
 u8 intel_calc_active_pipes(struct intel_atomic_state *state,
                           u8 active_pipes);
 void intel_link_compute_m_n(u16 bpp, int nlanes,
@@ -628,11 +630,7 @@ u32 skl_plane_ctl_crtc(const struct intel_crtc_state *crtc_state);
 u32 skl_plane_stride(const struct intel_plane_state *plane_state,
                     int plane);
 int skl_check_plane_surface(struct intel_plane_state *plane_state);
-int i9xx_check_plane_surface(struct intel_plane_state *plane_state);
 int skl_format_to_fourcc(int format, bool rgb_order, bool alpha);
-unsigned int i9xx_plane_max_stride(struct intel_plane *plane,
-                                  u32 pixel_format, u64 modifier,
-                                  unsigned int rotation);
 int bdw_get_pipemisc_bpp(struct intel_crtc *crtc);
 unsigned int intel_plane_fence_y_offset(const struct intel_plane_state *plane_state);
 
@@ -645,6 +643,13 @@ bool
 intel_format_info_is_yuv_semiplanar(const struct drm_format_info *info,
                                    uint64_t modifier);
 
+int intel_plane_compute_gtt(struct intel_plane_state *plane_state);
+u32 intel_plane_compute_aligned_offset(int *x, int *y,
+                                      const struct intel_plane_state *state,
+                                      int color_plane);
+int intel_plane_pin_fb(struct intel_plane_state *plane_state);
+void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
+
 /* modesetting */
 void intel_modeset_init_hw(struct drm_i915_private *i915);
 int intel_modeset_init_noirq(struct drm_i915_private *i915);
index ca41e8c00ad7b7c3f28c57fd738fa860a91ad173..cd7e5519ee7dcb576cebcdf86e9e739055bf1dff 100644 (file)
@@ -18,6 +18,7 @@
 #include "intel_pm.h"
 #include "intel_psr.h"
 #include "intel_sideband.h"
+#include "intel_sprite.h"
 
 static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node)
 {
@@ -865,6 +866,110 @@ static void intel_scaler_info(struct seq_file *m, struct intel_crtc *crtc)
        }
 }
 
+#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_VBLANK_EVADE)
+static void crtc_updates_info(struct seq_file *m,
+                             struct intel_crtc *crtc,
+                             const char *hdr)
+{
+       u64 count;
+       int row;
+
+       count = 0;
+       for (row = 0; row < ARRAY_SIZE(crtc->debug.vbl.times); row++)
+               count += crtc->debug.vbl.times[row];
+       seq_printf(m, "%sUpdates: %llu\n", hdr, count);
+       if (!count)
+               return;
+
+       for (row = 0; row < ARRAY_SIZE(crtc->debug.vbl.times); row++) {
+               char columns[80] = "       |";
+               unsigned int x;
+
+               if (row & 1) {
+                       const char *units;
+
+                       if (row > 10) {
+                               x = 1000000;
+                               units = "ms";
+                       } else {
+                               x = 1000;
+                               units = "us";
+                       }
+
+                       snprintf(columns, sizeof(columns), "%4ld%s |",
+                                DIV_ROUND_CLOSEST(BIT(row + 9), x), units);
+               }
+
+               if (crtc->debug.vbl.times[row]) {
+                       x = ilog2(crtc->debug.vbl.times[row]);
+                       memset(columns + 8, '*', x);
+                       columns[8 + x] = '\0';
+               }
+
+               seq_printf(m, "%s%s\n", hdr, columns);
+       }
+
+       seq_printf(m, "%sMin update: %lluns\n",
+                  hdr, crtc->debug.vbl.min);
+       seq_printf(m, "%sMax update: %lluns\n",
+                  hdr, crtc->debug.vbl.max);
+       seq_printf(m, "%sAverage update: %lluns\n",
+                  hdr, div64_u64(crtc->debug.vbl.sum,  count));
+       seq_printf(m, "%sOverruns > %uus: %u\n",
+                  hdr, VBLANK_EVASION_TIME_US, crtc->debug.vbl.over);
+}
+
+static int crtc_updates_show(struct seq_file *m, void *data)
+{
+       crtc_updates_info(m, m->private, "");
+       return 0;
+}
+
+static int crtc_updates_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, crtc_updates_show, inode->i_private);
+}
+
+static ssize_t crtc_updates_write(struct file *file,
+                                 const char __user *ubuf,
+                                 size_t len, loff_t *offp)
+{
+       struct seq_file *m = file->private_data;
+       struct intel_crtc *crtc = m->private;
+
+       /* May race with an update. Meh. */
+       memset(&crtc->debug.vbl, 0, sizeof(crtc->debug.vbl));
+
+       return len;
+}
+
+static const struct file_operations crtc_updates_fops = {
+       .owner = THIS_MODULE,
+       .open = crtc_updates_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+       .write = crtc_updates_write
+};
+
+static void crtc_updates_add(struct drm_crtc *crtc)
+{
+       debugfs_create_file("i915_update_info", 0644, crtc->debugfs_entry,
+                           to_intel_crtc(crtc), &crtc_updates_fops);
+}
+
+#else
+static void crtc_updates_info(struct seq_file *m,
+                             struct intel_crtc *crtc,
+                             const char *hdr)
+{
+}
+
+static void crtc_updates_add(struct drm_crtc *crtc)
+{
+}
+#endif
+
 static void intel_crtc_info(struct seq_file *m, struct intel_crtc *crtc)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@ -907,6 +1012,8 @@ static void intel_crtc_info(struct seq_file *m, struct intel_crtc *crtc)
        seq_printf(m, "\tunderrun reporting: cpu=%s pch=%s\n",
                   yesno(!crtc->cpu_fifo_underrun_disabled),
                   yesno(!crtc->pch_fifo_underrun_disabled));
+
+       crtc_updates_info(m, crtc, "\t");
 }
 
 static int i915_display_info(struct seq_file *m, void *unused)
@@ -2278,3 +2385,20 @@ int intel_connector_debugfs_add(struct drm_connector *connector)
 
        return 0;
 }
+
+/**
+ * intel_crtc_debugfs_add - add i915 specific crtc debugfs files
+ * @crtc: pointer to a drm_crtc
+ *
+ * Returns 0 on success, negative error codes on error.
+ *
+ * Failure to add debugfs entries should generally be ignored.
+ */
+int intel_crtc_debugfs_add(struct drm_crtc *crtc)
+{
+       if (!crtc->debugfs_entry)
+               return -ENODEV;
+
+       crtc_updates_add(crtc);
+       return 0;
+}
index c922c1745bfe170d91af1f857d74db23306e9401..557901f3eb908c0f0a19ca11a4d168c7b7c4b5a4 100644 (file)
@@ -7,14 +7,17 @@
 #define __INTEL_DISPLAY_DEBUGFS_H__
 
 struct drm_connector;
+struct drm_crtc;
 struct drm_i915_private;
 
 #ifdef CONFIG_DEBUG_FS
 void intel_display_debugfs_register(struct drm_i915_private *i915);
 int intel_connector_debugfs_add(struct drm_connector *connector);
+int intel_crtc_debugfs_add(struct drm_crtc *crtc);
 #else
 static inline void intel_display_debugfs_register(struct drm_i915_private *i915) {}
 static inline int intel_connector_debugfs_add(struct drm_connector *connector) { return 0; }
+static inline int intel_crtc_debugfs_add(struct drm_crtc *crtc) { return 0; }
 #endif
 
 #endif /* __INTEL_DISPLAY_DEBUGFS_H__ */
index fe2d90bba53685c723e5e54395ca79d6d1a74445..d52374f01316896d82b43c774b5e0048dabc0514 100644 (file)
@@ -2184,26 +2184,6 @@ static void __intel_display_power_put(struct drm_i915_private *dev_priv,
        mutex_unlock(&power_domains->lock);
 }
 
-/**
- * intel_display_power_put_unchecked - release an unchecked power domain reference
- * @dev_priv: i915 device instance
- * @domain: power domain to reference
- *
- * This function drops the power domain reference obtained by
- * intel_display_power_get() and might power down the corresponding hardware
- * block right away if this is the last reference.
- *
- * This function exists only for historical reasons and should be avoided in
- * new code, as the correctness of its use cannot be checked. Always use
- * intel_display_power_put() instead.
- */
-void intel_display_power_put_unchecked(struct drm_i915_private *dev_priv,
-                                      enum intel_display_power_domain domain)
-{
-       __intel_display_power_put(dev_priv, domain);
-       intel_runtime_pm_put_unchecked(&dev_priv->runtime_pm);
-}
-
 static void
 queue_async_put_domains_work(struct i915_power_domains *power_domains,
                             intel_wakeref_t wakeref)
@@ -2410,8 +2390,85 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
        __intel_display_power_put(dev_priv, domain);
        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 }
+#else
+/**
+ * intel_display_power_put_unchecked - release an unchecked power domain reference
+ * @dev_priv: i915 device instance
+ * @domain: power domain to reference
+ *
+ * This function drops the power domain reference obtained by
+ * intel_display_power_get() and might power down the corresponding hardware
+ * block right away if this is the last reference.
+ *
+ * This function is only for the power domain code's internal use to suppress wakeref
+ * tracking when the correspondig debug kconfig option is disabled, should not
+ * be used otherwise.
+ */
+void intel_display_power_put_unchecked(struct drm_i915_private *dev_priv,
+                                      enum intel_display_power_domain domain)
+{
+       __intel_display_power_put(dev_priv, domain);
+       intel_runtime_pm_put_unchecked(&dev_priv->runtime_pm);
+}
 #endif
 
+void
+intel_display_power_get_in_set(struct drm_i915_private *i915,
+                              struct intel_display_power_domain_set *power_domain_set,
+                              enum intel_display_power_domain domain)
+{
+       intel_wakeref_t __maybe_unused wf;
+
+       drm_WARN_ON(&i915->drm, power_domain_set->mask & BIT_ULL(domain));
+
+       wf = intel_display_power_get(i915, domain);
+#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
+       power_domain_set->wakerefs[domain] = wf;
+#endif
+       power_domain_set->mask |= BIT_ULL(domain);
+}
+
+bool
+intel_display_power_get_in_set_if_enabled(struct drm_i915_private *i915,
+                                         struct intel_display_power_domain_set *power_domain_set,
+                                         enum intel_display_power_domain domain)
+{
+       intel_wakeref_t wf;
+
+       drm_WARN_ON(&i915->drm, power_domain_set->mask & BIT_ULL(domain));
+
+       wf = intel_display_power_get_if_enabled(i915, domain);
+       if (!wf)
+               return false;
+
+#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
+       power_domain_set->wakerefs[domain] = wf;
+#endif
+       power_domain_set->mask |= BIT_ULL(domain);
+
+       return true;
+}
+
+void
+intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
+                                   struct intel_display_power_domain_set *power_domain_set,
+                                   u64 mask)
+{
+       enum intel_display_power_domain domain;
+
+       drm_WARN_ON(&i915->drm, mask & ~power_domain_set->mask);
+
+       for_each_power_domain(domain, mask) {
+               intel_wakeref_t __maybe_unused wf = -1;
+
+#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
+               wf = fetch_and_zero(&power_domain_set->wakerefs[domain]);
+#endif
+               intel_display_power_put(i915, domain, wf);
+               power_domain_set->mask &= ~BIT_ULL(domain);
+       }
+}
+
 #define I830_PIPES_POWER_DOMAINS (             \
        BIT_ULL(POWER_DOMAIN_PIPE_A) |          \
        BIT_ULL(POWER_DOMAIN_PIPE_B) |          \
@@ -5601,12 +5658,16 @@ void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)
         * resources powered until display HW readout is complete. We drop
         * this reference in intel_power_domains_enable().
         */
-       power_domains->wakeref =
+       drm_WARN_ON(&i915->drm, power_domains->init_wakeref);
+       power_domains->init_wakeref =
                intel_display_power_get(i915, POWER_DOMAIN_INIT);
 
        /* Disable power support if the user asked so. */
-       if (!i915->params.disable_power_well)
-               intel_display_power_get(i915, POWER_DOMAIN_INIT);
+       if (!i915->params.disable_power_well) {
+               drm_WARN_ON(&i915->drm, power_domains->disable_wakeref);
+               i915->power_domains.disable_wakeref = intel_display_power_get(i915,
+                                                                             POWER_DOMAIN_INIT);
+       }
        intel_power_domains_sync_hw(i915);
 
        power_domains->initializing = false;
@@ -5626,11 +5687,12 @@ void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)
 void intel_power_domains_driver_remove(struct drm_i915_private *i915)
 {
        intel_wakeref_t wakeref __maybe_unused =
-               fetch_and_zero(&i915->power_domains.wakeref);
+               fetch_and_zero(&i915->power_domains.init_wakeref);
 
        /* Remove the refcount we took to keep power well support disabled. */
        if (!i915->params.disable_power_well)
-               intel_display_power_put_unchecked(i915, POWER_DOMAIN_INIT);
+               intel_display_power_put(i915, POWER_DOMAIN_INIT,
+                                       fetch_and_zero(&i915->power_domains.disable_wakeref));
 
        intel_display_power_flush_work_sync(i915);
 
@@ -5655,7 +5717,7 @@ void intel_power_domains_driver_remove(struct drm_i915_private *i915)
 void intel_power_domains_enable(struct drm_i915_private *i915)
 {
        intel_wakeref_t wakeref __maybe_unused =
-               fetch_and_zero(&i915->power_domains.wakeref);
+               fetch_and_zero(&i915->power_domains.init_wakeref);
 
        intel_display_power_put(i915, POWER_DOMAIN_INIT, wakeref);
        intel_power_domains_verify_state(i915);
@@ -5672,8 +5734,8 @@ void intel_power_domains_disable(struct drm_i915_private *i915)
 {
        struct i915_power_domains *power_domains = &i915->power_domains;
 
-       drm_WARN_ON(&i915->drm, power_domains->wakeref);
-       power_domains->wakeref =
+       drm_WARN_ON(&i915->drm, power_domains->init_wakeref);
+       power_domains->init_wakeref =
                intel_display_power_get(i915, POWER_DOMAIN_INIT);
 
        intel_power_domains_verify_state(i915);
@@ -5695,7 +5757,7 @@ void intel_power_domains_suspend(struct drm_i915_private *i915,
 {
        struct i915_power_domains *power_domains = &i915->power_domains;
        intel_wakeref_t wakeref __maybe_unused =
-               fetch_and_zero(&power_domains->wakeref);
+               fetch_and_zero(&power_domains->init_wakeref);
 
        intel_display_power_put(i915, POWER_DOMAIN_INIT, wakeref);
 
@@ -5719,7 +5781,8 @@ void intel_power_domains_suspend(struct drm_i915_private *i915,
         * power wells if power domains must be deinitialized for suspend.
         */
        if (!i915->params.disable_power_well)
-               intel_display_power_put_unchecked(i915, POWER_DOMAIN_INIT);
+               intel_display_power_put(i915, POWER_DOMAIN_INIT,
+                                       fetch_and_zero(&i915->power_domains.disable_wakeref));
 
        intel_display_power_flush_work(i915);
        intel_power_domains_verify_state(i915);
@@ -5754,8 +5817,8 @@ void intel_power_domains_resume(struct drm_i915_private *i915)
                intel_power_domains_init_hw(i915, true);
                power_domains->display_core_suspended = false;
        } else {
-               drm_WARN_ON(&i915->drm, power_domains->wakeref);
-               power_domains->wakeref =
+               drm_WARN_ON(&i915->drm, power_domains->init_wakeref);
+               power_domains->init_wakeref =
                        intel_display_power_get(i915, POWER_DOMAIN_INIT);
        }
 
index 4aa0a09cf14fb78ecf28ba581f02d2a21651c6a1..bc30c479be5343c43195eb80969150ae94f19528 100644 (file)
@@ -212,7 +212,8 @@ struct i915_power_domains {
        bool display_core_suspended;
        int power_well_count;
 
-       intel_wakeref_t wakeref;
+       intel_wakeref_t init_wakeref;
+       intel_wakeref_t disable_wakeref;
 
        struct mutex lock;
        int domain_use_count[POWER_DOMAIN_NUM];
@@ -224,6 +225,13 @@ struct i915_power_domains {
        struct i915_power_well *power_wells;
 };
 
+struct intel_display_power_domain_set {
+       u64 mask;
+#ifdef CONFIG_DRM_I915_DEBUG_RUNTIME_PM
+       intel_wakeref_t wakerefs[POWER_DOMAIN_NUM];
+#endif
+};
+
 #define for_each_power_domain(domain, mask)                            \
        for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++)     \
                for_each_if(BIT_ULL(domain) & (mask))
@@ -279,8 +287,6 @@ intel_wakeref_t intel_display_power_get(struct drm_i915_private *dev_priv,
 intel_wakeref_t
 intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv,
                                   enum intel_display_power_domain domain);
-void intel_display_power_put_unchecked(struct drm_i915_private *dev_priv,
-                                      enum intel_display_power_domain domain);
 void __intel_display_power_put_async(struct drm_i915_private *i915,
                                     enum intel_display_power_domain domain,
                                     intel_wakeref_t wakeref);
@@ -297,6 +303,9 @@ intel_display_power_put_async(struct drm_i915_private *i915,
        __intel_display_power_put_async(i915, domain, wakeref);
 }
 #else
+void intel_display_power_put_unchecked(struct drm_i915_private *dev_priv,
+                                      enum intel_display_power_domain domain);
+
 static inline void
 intel_display_power_put(struct drm_i915_private *i915,
                        enum intel_display_power_domain domain,
@@ -314,6 +323,28 @@ intel_display_power_put_async(struct drm_i915_private *i915,
 }
 #endif
 
+void
+intel_display_power_get_in_set(struct drm_i915_private *i915,
+                              struct intel_display_power_domain_set *power_domain_set,
+                              enum intel_display_power_domain domain);
+
+bool
+intel_display_power_get_in_set_if_enabled(struct drm_i915_private *i915,
+                                         struct intel_display_power_domain_set *power_domain_set,
+                                         enum intel_display_power_domain domain);
+
+void
+intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
+                                   struct intel_display_power_domain_set *power_domain_set,
+                                   u64 mask);
+
+static inline void
+intel_display_power_put_all_in_set(struct drm_i915_private *i915,
+                                  struct intel_display_power_domain_set *power_domain_set)
+{
+       intel_display_power_put_mask_in_set(i915, power_domain_set, power_domain_set->mask);
+}
+
 enum dbuf_slice {
        DBUF_S1,
        DBUF_S2,
index a780ced06f1213517d05158ae88521f365667975..1067bd073c955cf90dd159cd792980c27a5d89ce 100644 (file)
@@ -225,6 +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;
@@ -251,14 +262,7 @@ struct intel_panel {
 
                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 @@ 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 @@ 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 @@ 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;
@@ -1186,6 +1195,15 @@ struct intel_crtc {
                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 */
@@ -1375,6 +1393,7 @@ struct intel_dp {
        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
@@ -1444,6 +1463,9 @@ struct intel_dp {
                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;
 
@@ -1460,6 +1482,7 @@ enum lspcon_vendor {
 
 struct intel_lspcon {
        bool active;
+       bool hdr_supported;
        enum drm_lspcon_mode mode;
        enum lspcon_vendor vendor;
 };
@@ -1476,6 +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 +1790,12 @@ intel_crtc_has_dp_encoder(const struct intel_crtc_state *crtc_state)
                 (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 +1818,10 @@ static inline u32 intel_plane_ggtt_offset(const struct intel_plane_state *state)
        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__ */
index 58e3856a3ce9216339466cb632f7e7e4117828ad..8a00e609085f8c84487b1cb38871b6a502d4b2f9 100644 (file)
@@ -1512,7 +1512,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
         * 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 +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 +1921,9 @@ static i915_reg_t tgl_aux_data_reg(struct intel_dp *intel_dp, int index)
 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 +1976,7 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
                                               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 +2316,14 @@ static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
        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 +3129,9 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
        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 +3224,9 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
        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 +3378,9 @@ static void edp_panel_off(struct intel_dp *intel_dp)
        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 +3618,29 @@ void intel_dp_sink_set_decompression_state(struct intel_dp *intel_dp,
                            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)
 {
@@ -3623,6 +3662,10 @@ 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.
@@ -5197,6 +5240,12 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
        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;
 }
 
@@ -7177,6 +7226,8 @@ intel_dp_connector_register(struct drm_connector *connector)
 {
        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);
@@ -7190,6 +7241,22 @@ intel_dp_connector_register(struct drm_connector *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 +7346,9 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
         */
        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 +7647,13 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
        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,
index 51d27fc98d483b9e9f2a27767a28e3016800da99..9775f33d1aac45dc0b45fcada6446ee0e38bf8c0 100644 (file)
 #include "intel_display_types.h"
 #include "intel_dp_aux_backlight.h"
 
-static void set_aux_backlight_enable(struct intel_dp *intel_dp, bool enable)
+/*
+ * DP AUX registers for Intel's proprietary HDR backlight interface. We define
+ * them here since we'll likely be the only driver to ever use these.
+ */
+#define INTEL_EDP_HDR_TCON_CAP0                                        0x340
+
+#define INTEL_EDP_HDR_TCON_CAP1                                        0x341
+# define INTEL_EDP_HDR_TCON_2084_DECODE_CAP                           BIT(0)
+# define INTEL_EDP_HDR_TCON_2020_GAMUT_CAP                            BIT(1)
+# define INTEL_EDP_HDR_TCON_TONE_MAPPING_CAP                          BIT(2)
+# define INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_CAP                   BIT(3)
+# define INTEL_EDP_HDR_TCON_BRIGHTNESS_NITS_CAP                       BIT(4)
+# define INTEL_EDP_HDR_TCON_OPTIMIZATION_CAP                          BIT(5)
+# define INTEL_EDP_HDR_TCON_SDP_COLORIMETRY_CAP                       BIT(6)
+# define INTEL_EDP_HDR_TCON_SRGB_TO_PANEL_GAMUT_CONVERSION_CAP        BIT(7)
+
+#define INTEL_EDP_HDR_TCON_CAP2                                        0x342
+# define INTEL_EDP_SDR_TCON_BRIGHTNESS_AUX_CAP                        BIT(0)
+
+#define INTEL_EDP_HDR_TCON_CAP3                                        0x343
+
+#define INTEL_EDP_HDR_GETSET_CTRL_PARAMS                               0x344
+# define INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE                        BIT(0)
+# define INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE                         BIT(1)
+# define INTEL_EDP_HDR_TCON_TONE_MAPPING_ENABLE                       BIT(2) /* Pre-TGL+ */
+# define INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE                BIT(3)
+# define INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE                     BIT(4)
+# define INTEL_EDP_HDR_TCON_SRGB_TO_PANEL_GAMUT_ENABLE                BIT(5)
+/* Bit 6 is reserved */
+# define INTEL_EDP_HDR_TCON_SDP_COLORIMETRY_ENABLE                    BIT(7)
+
+#define INTEL_EDP_HDR_CONTENT_LUMINANCE                                0x346 /* Pre-TGL+ */
+#define INTEL_EDP_HDR_PANEL_LUMINANCE_OVERRIDE                         0x34A
+#define INTEL_EDP_SDR_LUMINANCE_LEVEL                                  0x352
+#define INTEL_EDP_BRIGHTNESS_NITS_LSB                                  0x354
+#define INTEL_EDP_BRIGHTNESS_NITS_MSB                                  0x355
+#define INTEL_EDP_BRIGHTNESS_DELAY_FRAMES                              0x356
+#define INTEL_EDP_BRIGHTNESS_PER_FRAME_STEPS                           0x357
+
+#define INTEL_EDP_BRIGHTNESS_OPTIMIZATION_0                            0x358
+# define INTEL_EDP_TCON_USAGE_MASK                             GENMASK(0, 3)
+# define INTEL_EDP_TCON_USAGE_UNKNOWN                                    0x0
+# define INTEL_EDP_TCON_USAGE_DESKTOP                                    0x1
+# define INTEL_EDP_TCON_USAGE_FULL_SCREEN_MEDIA                          0x2
+# define INTEL_EDP_TCON_USAGE_FULL_SCREEN_GAMING                         0x3
+# define INTEL_EDP_TCON_POWER_MASK                                    BIT(4)
+# define INTEL_EDP_TCON_POWER_DC                                    (0 << 4)
+# define INTEL_EDP_TCON_POWER_AC                                    (1 << 4)
+# define INTEL_EDP_TCON_OPTIMIZATION_STRENGTH_MASK             GENMASK(5, 7)
+
+#define INTEL_EDP_BRIGHTNESS_OPTIMIZATION_1                            0x359
+
+/* VESA backlight callbacks */
+static void set_vesa_backlight_enable(struct intel_dp *intel_dp, bool enable)
 {
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
        u8 reg_val = 0;
@@ -52,7 +105,7 @@ static void set_aux_backlight_enable(struct intel_dp *intel_dp, bool enable)
        }
 }
 
-static bool intel_dp_aux_backlight_dpcd_mode(struct intel_connector *connector)
+static bool intel_dp_aux_vesa_backlight_dpcd_mode(struct intel_connector *connector)
 {
        struct intel_dp *intel_dp = intel_attached_dp(connector);
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
@@ -75,7 +128,7 @@ static bool intel_dp_aux_backlight_dpcd_mode(struct intel_connector *connector)
  * Read the current backlight value from DPCD register(s) based
  * on if 8-bit(MSB) or 16-bit(MSB and LSB) values are supported
  */
-static u32 intel_dp_aux_get_backlight(struct intel_connector *connector)
+static u32 intel_dp_aux_vesa_get_backlight(struct intel_connector *connector)
 {
        struct intel_dp *intel_dp = intel_attached_dp(connector);
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
@@ -86,7 +139,7 @@ static u32 intel_dp_aux_get_backlight(struct intel_connector *connector)
         * If we're not in DPCD control mode yet, the programmed brightness
         * value is meaningless and we should assume max brightness
         */
-       if (!intel_dp_aux_backlight_dpcd_mode(connector))
+       if (!intel_dp_aux_vesa_backlight_dpcd_mode(connector))
                return connector->panel.backlight.max;
 
        if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB,
@@ -107,7 +160,8 @@ static u32 intel_dp_aux_get_backlight(struct intel_connector *connector)
  * 8-bit or 16 bit value (MSB and LSB)
  */
 static void
-intel_dp_aux_set_backlight(const struct drm_connector_state *conn_state, u32 level)
+intel_dp_aux_vesa_set_backlight(const struct drm_connector_state *conn_state,
+                               u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct intel_dp *intel_dp = intel_attached_dp(connector);
@@ -137,7 +191,7 @@ intel_dp_aux_set_backlight(const struct drm_connector_state *conn_state, u32 lev
  * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
  *             EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
  */
-static bool intel_dp_aux_set_pwm_freq(struct intel_connector *connector)
+static bool intel_dp_aux_vesa_set_pwm_freq(struct intel_connector *connector)
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_dp *intel_dp = intel_attached_dp(connector);
@@ -173,8 +227,9 @@ static bool intel_dp_aux_set_pwm_freq(struct intel_connector *connector)
        return true;
 }
 
-static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                         const struct drm_connector_state *conn_state)
+static void
+intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
+                                  const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct intel_dp *intel_dp = intel_attached_dp(connector);
@@ -214,7 +269,7 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st
        }
 
        if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
-               if (intel_dp_aux_set_pwm_freq(connector))
+               if (intel_dp_aux_vesa_set_pwm_freq(connector))
                        new_dpcd_buf |= DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE;
 
        if (new_dpcd_buf != dpcd_buf) {
@@ -225,18 +280,18 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st
                }
        }
 
-       intel_dp_aux_set_backlight(conn_state,
-                                  connector->panel.backlight.level);
-       set_aux_backlight_enable(intel_dp, true);
+       intel_dp_aux_vesa_set_backlight(conn_state, level);
+       set_vesa_backlight_enable(intel_dp, true);
 }
 
-static void intel_dp_aux_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void intel_dp_aux_vesa_disable_backlight(const struct drm_connector_state *old_conn_state,
+                                               u32 level)
 {
-       set_aux_backlight_enable(enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder)),
-                                false);
+       set_vesa_backlight_enable(enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder)),
+                                 false);
 }
 
-static u32 intel_dp_aux_calc_max_backlight(struct intel_connector *connector)
+static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connector)
 {
        struct drm_i915_private *i915 = to_i915(connector->base.dev);
        struct intel_dp *intel_dp = intel_attached_dp(connector);
@@ -316,25 +371,25 @@ static u32 intel_dp_aux_calc_max_backlight(struct intel_connector *connector)
        return max_backlight;
 }
 
-static int intel_dp_aux_setup_backlight(struct intel_connector *connector,
-                                       enum pipe pipe)
+static int intel_dp_aux_vesa_setup_backlight(struct intel_connector *connector,
+                                            enum pipe pipe)
 {
        struct intel_panel *panel = &connector->panel;
 
-       panel->backlight.max = intel_dp_aux_calc_max_backlight(connector);
+       panel->backlight.max = intel_dp_aux_vesa_calc_max_backlight(connector);
        if (!panel->backlight.max)
                return -ENODEV;
 
        panel->backlight.min = 0;
-       panel->backlight.level = intel_dp_aux_get_backlight(connector);
-       panel->backlight.enabled = intel_dp_aux_backlight_dpcd_mode(connector) &&
+       panel->backlight.level = intel_dp_aux_vesa_get_backlight(connector);
+       panel->backlight.enabled = intel_dp_aux_vesa_backlight_dpcd_mode(connector) &&
                                   panel->backlight.level != 0;
 
        return 0;
 }
 
 static bool
-intel_dp_aux_display_control_capable(struct intel_connector *connector)
+intel_dp_aux_supports_vesa_backlight(struct intel_connector *connector)
 {
        struct intel_dp *intel_dp = intel_attached_dp(connector);
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
@@ -350,6 +405,14 @@ intel_dp_aux_display_control_capable(struct intel_connector *connector)
        return false;
 }
 
+static const struct intel_panel_bl_funcs intel_dp_vesa_bl_funcs = {
+       .setup = intel_dp_aux_vesa_setup_backlight,
+       .enable = intel_dp_aux_vesa_enable_backlight,
+       .disable = intel_dp_aux_vesa_disable_backlight,
+       .set = intel_dp_aux_vesa_set_backlight,
+       .get = intel_dp_aux_vesa_get_backlight,
+};
+
 int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector)
 {
        struct intel_panel *panel = &intel_connector->panel;
@@ -357,7 +420,7 @@ int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector)
        struct drm_i915_private *i915 = dp_to_i915(intel_dp);
 
        if (i915->params.enable_dpcd_backlight == 0 ||
-           !intel_dp_aux_display_control_capable(intel_connector))
+           !intel_dp_aux_supports_vesa_backlight(intel_connector))
                return -ENODEV;
 
        /*
@@ -379,11 +442,7 @@ int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector)
                return -ENODEV;
        }
 
-       panel->backlight.setup = intel_dp_aux_setup_backlight;
-       panel->backlight.enable = intel_dp_aux_enable_backlight;
-       panel->backlight.disable = intel_dp_aux_disable_backlight;
-       panel->backlight.set = intel_dp_aux_set_backlight;
-       panel->backlight.get = intel_dp_aux_get_backlight;
+       panel->backlight.funcs = &intel_dp_vesa_bl_funcs;
 
        return 0;
 }
index b53c50372918f442871ca4ecab51fce3ebe17114..88628764956d67b92b61a9e3f4663101b3853d9a 100644 (file)
@@ -77,7 +77,7 @@ static void dcs_set_backlight(const struct drm_connector_state *conn_state, u32
        }
 }
 
-static void dcs_disable_backlight(const struct drm_connector_state *conn_state)
+static void dcs_disable_backlight(const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(conn_state->best_encoder));
        struct mipi_dsi_device *dsi_device;
@@ -111,10 +111,9 @@ static void dcs_disable_backlight(const struct drm_connector_state *conn_state)
 }
 
 static void dcs_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                const struct drm_connector_state *conn_state)
+                                const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(conn_state->best_encoder));
-       struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
        struct mipi_dsi_device *dsi_device;
        enum port port;
 
@@ -142,7 +141,7 @@ static void dcs_enable_backlight(const struct intel_crtc_state *crtc_state,
                                   &cabc, sizeof(cabc));
        }
 
-       dcs_set_backlight(conn_state, panel->backlight.level);
+       dcs_set_backlight(conn_state, level);
 }
 
 static int dcs_setup_backlight(struct intel_connector *connector,
@@ -156,6 +155,14 @@ static int dcs_setup_backlight(struct intel_connector *connector,
        return 0;
 }
 
+static const struct intel_panel_bl_funcs dcs_bl_funcs = {
+       .setup = dcs_setup_backlight,
+       .enable = dcs_enable_backlight,
+       .disable = dcs_disable_backlight,
+       .set = dcs_set_backlight,
+       .get = dcs_get_backlight,
+};
+
 int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector)
 {
        struct drm_device *dev = intel_connector->base.dev;
@@ -169,11 +176,7 @@ int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector)
        if (drm_WARN_ON(dev, encoder->type != INTEL_OUTPUT_DSI))
                return -EINVAL;
 
-       panel->backlight.setup = dcs_setup_backlight;
-       panel->backlight.enable = dcs_enable_backlight;
-       panel->backlight.disable = dcs_disable_backlight;
-       panel->backlight.set = dcs_set_backlight;
-       panel->backlight.get = dcs_get_backlight;
+       panel->backlight.funcs = &dcs_bl_funcs;
 
        return 0;
 }
index 237dbb1ba0eeb6c38c95e81e4902ede184b318ab..090cd76266c6ead398ea15e2c78d442c292b55d0 100644 (file)
@@ -301,12 +301,8 @@ static void intel_dvo_pre_enable(struct intel_atomic_state *state,
        if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
                dvo_val |= DVO_VSYNC_ACTIVE_HIGH;
 
-       /*I915_WRITE(DVOB_SRCDIM,
-         (adjusted_mode->crtc_hdisplay << DVO_SRCDIM_HORIZONTAL_SHIFT) |
-         (adjusted_mode->crtc_vdisplay << DVO_SRCDIM_VERTICAL_SHIFT));*/
        intel_de_write(dev_priv, dvo_srcdim_reg,
                       (adjusted_mode->crtc_hdisplay << DVO_SRCDIM_HORIZONTAL_SHIFT) | (adjusted_mode->crtc_vdisplay << DVO_SRCDIM_VERTICAL_SHIFT));
-       /*I915_WRITE(DVOB, dvo_val);*/
        intel_de_write(dev_priv, dvo_reg, dvo_val);
 }
 
index a5b072816a7b21626eb1ea174a0aa5da20331812..33200b5cfad02dbe2a576f6150b32fcf5dd37584 100644 (file)
@@ -742,6 +742,8 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
                cache->fence_id = plane_state->vma->fence->id;
        else
                cache->fence_id = -1;
+
+       cache->psr2_active = crtc_state->has_psr2;
 }
 
 static bool intel_fbc_cfb_size_changed(struct drm_i915_private *dev_priv)
@@ -914,6 +916,16 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc)
                return false;
        }
 
+       /*
+        * Tigerlake is not supporting FBC with PSR2.
+        * Recommendation is to keep this combination disabled
+        * Bspec: 50422 HSD: 14010260002
+        */
+       if (fbc->state_cache.psr2_active && IS_TIGERLAKE(dev_priv)) {
+               fbc->no_fbc_reason = "not supported with PSR2";
+               return false;
+       }
+
        return true;
 }
 
@@ -1433,13 +1445,6 @@ static int intel_sanitize_fbc_option(struct drm_i915_private *dev_priv)
        if (!HAS_FBC(dev_priv))
                return 0;
 
-       /*
-        * Fbc is causing random underruns in CI execution on TGL platforms.
-        * Disabling the same while the problem is being debugged and analyzed.
-        */
-       if (IS_TIGERLAKE(dev_priv))
-               return 0;
-
        if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9)
                return 1;
 
index a57796b0a47f32e573aa59873803af4216ad15bf..c5959590562baf499a9d936512faaea242872199 100644 (file)
@@ -518,10 +518,10 @@ static u32 vlv_infoframes_enabled(struct intel_encoder *encoder,
                      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);
@@ -555,10 +555,9 @@ static void hsw_write_infoframe(struct intel_encoder *encoder,
        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 @@ static void
 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))
index e37d45e531dfe80b713c0eb0a1239013ffb6e0ce..e4ff533e3a69dc36d4ba7ea6df3247b3809cb6b2 100644 (file)
 #include "intel_display_types.h"
 #include "intel_dp.h"
 #include "intel_lspcon.h"
+#include "intel_hdmi.h"
 
 /* LSPCON OUI Vendor ID(signatures) */
 #define LSPCON_VENDOR_PARADE_OUI 0x001CF8
 #define LSPCON_VENDOR_MCA_OUI 0x0060AD
 
+#define DPCD_MCA_LSPCON_HDR_STATUS     0x70003
+#define DPCD_PARADE_LSPCON_HDR_STATUS  0x00511
+
 /* AUX addresses to write MCA AVI IF */
 #define LSPCON_MCA_AVI_IF_WRITE_OFFSET 0x5C0
 #define LSPCON_MCA_AVI_IF_CTRL 0x5DF
@@ -104,6 +108,35 @@ static bool lspcon_detect_vendor(struct intel_lspcon *lspcon)
        return true;
 }
 
+static u32 get_hdr_status_reg(struct intel_lspcon *lspcon)
+{
+       if (lspcon->vendor == LSPCON_VENDOR_MCA)
+               return DPCD_MCA_LSPCON_HDR_STATUS;
+       else
+               return DPCD_PARADE_LSPCON_HDR_STATUS;
+}
+
+void lspcon_detect_hdr_capability(struct intel_lspcon *lspcon)
+{
+       struct intel_digital_port *dig_port =
+               container_of(lspcon, struct intel_digital_port, lspcon);
+       struct drm_device *dev = dig_port->base.base.dev;
+       struct intel_dp *dp = lspcon_to_intel_dp(lspcon);
+       u8 hdr_caps;
+       int ret;
+
+       ret = drm_dp_dpcd_read(&dp->aux, get_hdr_status_reg(lspcon),
+                              &hdr_caps, 1);
+
+       if (ret < 0) {
+               drm_dbg_kms(dev, "HDR capability detection failed\n");
+               lspcon->hdr_supported = false;
+       } else if (hdr_caps & 0x1) {
+               drm_dbg_kms(dev, "LSPCON capable of HDR\n");
+               lspcon->hdr_supported = true;
+       }
+}
+
 static enum drm_lspcon_mode lspcon_get_current_mode(struct intel_lspcon *lspcon)
 {
        enum drm_lspcon_mode current_mode;
@@ -418,27 +451,32 @@ void lspcon_write_infoframe(struct intel_encoder *encoder,
                            unsigned int type,
                            const void *frame, ssize_t len)
 {
-       bool ret;
+       bool ret = true;
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct intel_lspcon *lspcon = enc_to_intel_lspcon(encoder);
 
-       /* LSPCON only needs AVI IF */
-       if (type != HDMI_INFOFRAME_TYPE_AVI)
+       switch (type) {
+       case HDMI_INFOFRAME_TYPE_AVI:
+               if (lspcon->vendor == LSPCON_VENDOR_MCA)
+                       ret = _lspcon_write_avi_infoframe_mca(&intel_dp->aux,
+                                                             frame, len);
+               else
+                       ret = _lspcon_write_avi_infoframe_parade(&intel_dp->aux,
+                                                                frame, len);
+               break;
+       case HDMI_PACKET_TYPE_GAMUT_METADATA:
+               drm_dbg_kms(encoder->base.dev, "Update HDR metadata for lspcon\n");
+               /* It uses the legacy hsw implementation for the same */
+               hsw_write_infoframe(encoder, crtc_state, type, frame, len);
+               break;
+       default:
                return;
-
-       if (lspcon->vendor == LSPCON_VENDOR_MCA)
-               ret = _lspcon_write_avi_infoframe_mca(&intel_dp->aux,
-                                                     frame, len);
-       else
-               ret = _lspcon_write_avi_infoframe_parade(&intel_dp->aux,
-                                                        frame, len);
+       }
 
        if (!ret) {
-               DRM_ERROR("Failed to write AVI infoframes\n");
+               DRM_ERROR("Failed to write infoframes\n");
                return;
        }
-
-       DRM_DEBUG_DRIVER("AVI infoframes updated successfully\n");
 }
 
 void lspcon_read_infoframe(struct intel_encoder *encoder,
@@ -446,7 +484,10 @@ void lspcon_read_infoframe(struct intel_encoder *encoder,
                           unsigned int type,
                           void *frame, ssize_t len)
 {
-       /* FIXME implement this */
+       /* FIXME implement for AVI Infoframe as well */
+       if (type == HDMI_PACKET_TYPE_GAMUT_METADATA)
+               hsw_read_infoframe(encoder, crtc_state, type,
+                                  frame, len);
 }
 
 void lspcon_set_infoframes(struct intel_encoder *encoder,
@@ -491,12 +532,26 @@ void lspcon_set_infoframes(struct intel_encoder *encoder,
        else
                frame.avi.colorspace = HDMI_COLORSPACE_RGB;
 
-       drm_hdmi_avi_infoframe_quant_range(&frame.avi,
-                                          conn_state->connector,
-                                          adjusted_mode,
-                                          crtc_state->limited_color_range ?
-                                          HDMI_QUANTIZATION_RANGE_LIMITED :
-                                          HDMI_QUANTIZATION_RANGE_FULL);
+       /* Set the Colorspace as per the HDMI spec */
+       drm_hdmi_avi_infoframe_colorspace(&frame.avi, conn_state);
+
+       /* nonsense combination */
+       drm_WARN_ON(encoder->base.dev, crtc_state->limited_color_range &&
+                   crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB);
+
+       if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_RGB) {
+               drm_hdmi_avi_infoframe_quant_range(&frame.avi,
+                                                  conn_state->connector,
+                                                  adjusted_mode,
+                                                  crtc_state->limited_color_range ?
+                                                  HDMI_QUANTIZATION_RANGE_LIMITED :
+                                                  HDMI_QUANTIZATION_RANGE_FULL);
+       } else {
+               frame.avi.quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
+               frame.avi.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
+       }
+
+       drm_hdmi_avi_infoframe_content_type(&frame.avi, conn_state);
 
        ret = hdmi_infoframe_pack(&frame, buf, sizeof(buf));
        if (ret < 0) {
@@ -508,11 +563,64 @@ void lspcon_set_infoframes(struct intel_encoder *encoder,
                                  buf, ret);
 }
 
+static bool _lspcon_read_avi_infoframe_enabled_mca(struct drm_dp_aux *aux)
+{
+       int ret;
+       u32 val = 0;
+       u16 reg = LSPCON_MCA_AVI_IF_CTRL;
+
+       ret = drm_dp_dpcd_read(aux, reg, &val, 1);
+       if (ret < 0) {
+               DRM_ERROR("DPCD read failed, address 0x%x\n", reg);
+               return false;
+       }
+
+       return val & LSPCON_MCA_AVI_IF_KICKOFF;
+}
+
+static bool _lspcon_read_avi_infoframe_enabled_parade(struct drm_dp_aux *aux)
+{
+       int ret;
+       u32 val = 0;
+       u16 reg = LSPCON_PARADE_AVI_IF_CTRL;
+
+       ret = drm_dp_dpcd_read(aux, reg, &val, 1);
+       if (ret < 0) {
+               DRM_ERROR("DPCD read failed, address 0x%x\n", reg);
+               return false;
+       }
+
+       return val & LSPCON_PARADE_AVI_IF_KICKOFF;
+}
+
 u32 lspcon_infoframes_enabled(struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config)
 {
-       /* FIXME actually read this from the hw */
-       return 0;
+       struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+       struct intel_lspcon *lspcon = enc_to_intel_lspcon(encoder);
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+       bool infoframes_enabled;
+       u32 val = 0;
+       u32 mask, tmp;
+
+       if (lspcon->vendor == LSPCON_VENDOR_MCA)
+               infoframes_enabled = _lspcon_read_avi_infoframe_enabled_mca(&intel_dp->aux);
+       else
+               infoframes_enabled = _lspcon_read_avi_infoframe_enabled_parade(&intel_dp->aux);
+
+       if (infoframes_enabled)
+               val |= intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI);
+
+       if (lspcon->hdr_supported) {
+               tmp = intel_de_read(dev_priv,
+                                   HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
+               mask = VIDEO_DIP_ENABLE_GMP_HSW;
+
+               if (tmp & mask)
+                       val |= intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA);
+       }
+
+       return val;
 }
 
 void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon)
@@ -520,7 +628,7 @@ void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon)
        lspcon_wait_mode(lspcon, DRM_LSPCON_MODE_PCON);
 }
 
-static bool lspcon_init(struct intel_digital_port *dig_port)
+bool lspcon_init(struct intel_digital_port *dig_port)
 {
        struct intel_dp *dp = &dig_port->dp;
        struct intel_lspcon *lspcon = &dig_port->lspcon;
@@ -550,6 +658,14 @@ static bool lspcon_init(struct intel_digital_port *dig_port)
        return true;
 }
 
+u32 intel_lspcon_infoframes_enabled(struct intel_encoder *encoder,
+                                   const struct intel_crtc_state *pipe_config)
+{
+       struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
+
+       return dig_port->infoframes_enabled(encoder, pipe_config);
+}
+
 void lspcon_resume(struct intel_digital_port *dig_port)
 {
        struct intel_lspcon *lspcon = &dig_port->lspcon;
index b03dcb7076d84383142c70b5b08dc52e2288d24a..e19e10492b05112cc18f4b950fa47ae181650535 100644 (file)
@@ -15,6 +15,8 @@ struct intel_digital_port;
 struct intel_encoder;
 struct intel_lspcon;
 
+bool lspcon_init(struct intel_digital_port *dig_port);
+void lspcon_detect_hdr_capability(struct intel_lspcon *lspcon);
 void lspcon_resume(struct intel_digital_port *dig_port);
 void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
 void lspcon_write_infoframe(struct intel_encoder *encoder,
@@ -31,5 +33,15 @@ void lspcon_set_infoframes(struct intel_encoder *encoder,
                           const struct drm_connector_state *conn_state);
 u32 lspcon_infoframes_enabled(struct intel_encoder *encoder,
                              const struct intel_crtc_state *pipe_config);
+u32 intel_lspcon_infoframes_enabled(struct intel_encoder *encoder,
+                                   const struct intel_crtc_state *pipe_config);
+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_read_infoframe(struct intel_encoder *encoder,
+                       const struct intel_crtc_state *crtc_state,
+                       unsigned int type,
+                       void *frame, ssize_t len);
 
 #endif /* __INTEL_LSPCON_H__ */
index 9f23bac0d7924d3857e1e0e8fdc202f1341dc5b5..67f81ae995c4583c03912783a0b890c53e5f2b00 100644 (file)
@@ -589,7 +589,7 @@ static u32 bxt_get_backlight(struct intel_connector *connector)
                             BXT_BLC_PWM_DUTY(panel->backlight.controller));
 }
 
-static u32 pwm_get_backlight(struct intel_connector *connector)
+static u32 ext_pwm_get_backlight(struct intel_connector *connector)
 {
        struct intel_panel *panel = &connector->panel;
        struct pwm_state state;
@@ -666,7 +666,7 @@ static void bxt_set_backlight(const struct drm_connector_state *conn_state, u32
                       BXT_BLC_PWM_DUTY(panel->backlight.controller), level);
 }
 
-static void pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
+static void ext_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
 
@@ -684,7 +684,7 @@ intel_panel_actually_set_backlight(const struct drm_connector_state *conn_state,
        drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", level);
 
        level = intel_panel_compute_brightness(connector, level);
-       panel->backlight.set(conn_state, level);
+       panel->backlight.funcs->set(conn_state, level);
 }
 
 /* set backlight brightness to level in range [0..max], assuming hw min is
@@ -726,13 +726,13 @@ void intel_panel_set_backlight_acpi(const struct drm_connector_state *conn_state
        mutex_unlock(&dev_priv->backlight_lock);
 }
 
-static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, 0);
+       intel_panel_actually_set_backlight(old_conn_state, level);
 
        /*
         * Although we don't support or enable CPU PWM with LPT/SPT based
@@ -754,13 +754,13 @@ static void lpt_disable_backlight(const struct drm_connector_state *old_conn_sta
        intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
 }
 
-static void pch_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void pch_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
 {
        struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, 0);
+       intel_panel_actually_set_backlight(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
        intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
@@ -769,44 +769,44 @@ static void pch_disable_backlight(const struct drm_connector_state *old_conn_sta
        intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
 }
 
-static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
 {
-       intel_panel_actually_set_backlight(old_conn_state, 0);
+       intel_panel_actually_set_backlight(old_conn_state, val);
 }
 
-static void i965_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void i965_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
 {
        struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, 0);
+       intel_panel_actually_set_backlight(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv, BLC_PWM_CTL2);
        intel_de_write(dev_priv, BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
 }
 
-static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
 {
        struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, 0);
+       intel_panel_actually_set_backlight(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
        intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
                       tmp & ~BLM_PWM_ENABLE);
 }
 
-static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
 {
        struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
-       u32 tmp, val;
+       u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, 0);
+       intel_panel_actually_set_backlight(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv,
                            BXT_BLC_PWM_CTL(panel->backlight.controller));
@@ -820,14 +820,14 @@ static void bxt_disable_backlight(const struct drm_connector_state *old_conn_sta
        }
 }
 
-static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
 {
        struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, 0);
+       intel_panel_actually_set_backlight(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv,
                            BXT_BLC_PWM_CTL(panel->backlight.controller));
@@ -835,7 +835,7 @@ static void cnp_disable_backlight(const struct drm_connector_state *old_conn_sta
                       tmp & ~BXT_BLC_PWM_ENABLE);
 }
 
-static void pwm_disable_backlight(const struct drm_connector_state *old_conn_state)
+static void ext_pwm_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
        struct intel_panel *panel = &connector->panel;
@@ -870,13 +870,13 @@ void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_st
        if (panel->backlight.device)
                panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
        panel->backlight.enabled = false;
-       panel->backlight.disable(old_conn_state);
+       panel->backlight.funcs->disable(old_conn_state, 0);
 
        mutex_unlock(&dev_priv->backlight_lock);
 }
 
 static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                const struct drm_connector_state *conn_state)
+                                const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -923,11 +923,11 @@ static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
                       pch_ctl1 | BLM_PCH_PWM_ENABLE);
 
        /* This won't stick until the above enable. */
-       intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
+       intel_panel_actually_set_backlight(conn_state, level);
 }
 
 static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                const struct drm_connector_state *conn_state)
+                                const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -958,7 +958,7 @@ static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
        intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
 
        /* This won't stick until the above enable. */
-       intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
+       intel_panel_actually_set_backlight(conn_state, level);
 
        pch_ctl2 = panel->backlight.max << 16;
        intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
@@ -974,7 +974,7 @@ static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
 }
 
 static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                 const struct drm_connector_state *conn_state)
+                                 const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -1001,7 +1001,7 @@ static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
        intel_de_posting_read(dev_priv, BLC_PWM_CTL);
 
        /* XXX: combine this into above write? */
-       intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
+       intel_panel_actually_set_backlight(conn_state, level);
 
        /*
         * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is
@@ -1013,7 +1013,7 @@ static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
 }
 
 static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                 const struct drm_connector_state *conn_state)
+                                 const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -1044,11 +1044,11 @@ static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
        intel_de_posting_read(dev_priv, BLC_PWM_CTL2);
        intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
 
-       intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
+       intel_panel_actually_set_backlight(conn_state, level);
 }
 
 static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                const struct drm_connector_state *conn_state)
+                                const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -1067,7 +1067,7 @@ static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
        intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), ctl);
 
        /* XXX: combine this into above write? */
-       intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
+       intel_panel_actually_set_backlight(conn_state, level);
 
        ctl2 = 0;
        if (panel->backlight.active_low_pwm)
@@ -1079,7 +1079,7 @@ static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
 }
 
 static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                const struct drm_connector_state *conn_state)
+                                const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -1118,7 +1118,7 @@ static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
                       BXT_BLC_PWM_FREQ(panel->backlight.controller),
                       panel->backlight.max);
 
-       intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
+       intel_panel_actually_set_backlight(conn_state, level);
 
        pwm_ctl = 0;
        if (panel->backlight.active_low_pwm)
@@ -1133,7 +1133,7 @@ static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
 }
 
 static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                const struct drm_connector_state *conn_state)
+                                const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -1154,7 +1154,7 @@ static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
                       BXT_BLC_PWM_FREQ(panel->backlight.controller),
                       panel->backlight.max);
 
-       intel_panel_actually_set_backlight(conn_state, panel->backlight.level);
+       intel_panel_actually_set_backlight(conn_state, level);
 
        pwm_ctl = 0;
        if (panel->backlight.active_low_pwm)
@@ -1168,12 +1168,11 @@ static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
                       pwm_ctl | BXT_BLC_PWM_ENABLE);
 }
 
-static void pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
-                                const struct drm_connector_state *conn_state)
+static void ext_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
+                                    const struct drm_connector_state *conn_state, u32 level)
 {
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct intel_panel *panel = &connector->panel;
-       int level = panel->backlight.level;
 
        level = intel_panel_compute_brightness(connector, level);
        pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
@@ -1198,7 +1197,7 @@ static void __intel_panel_enable_backlight(const struct intel_crtc_state *crtc_s
                                                 panel->backlight.device->props.max_brightness);
        }
 
-       panel->backlight.enable(crtc_state, conn_state);
+       panel->backlight.funcs->enable(crtc_state, conn_state, panel->backlight.level);
        panel->backlight.enabled = true;
        if (panel->backlight.device)
                panel->backlight.device->props.power = FB_BLANK_UNBLANK;
@@ -1234,7 +1233,7 @@ static u32 intel_panel_get_backlight(struct intel_connector *connector)
        mutex_lock(&dev_priv->backlight_lock);
 
        if (panel->backlight.enabled) {
-               val = panel->backlight.get(connector);
+               val = panel->backlight.funcs->get(connector);
                val = intel_panel_compute_brightness(connector, val);
        }
 
@@ -1567,13 +1566,13 @@ static u32 get_backlight_max_vbt(struct intel_connector *connector)
        u16 pwm_freq_hz = get_vbt_pwm_freq(dev_priv);
        u32 pwm;
 
-       if (!panel->backlight.hz_to_pwm) {
+       if (!panel->backlight.funcs->hz_to_pwm) {
                drm_dbg_kms(&dev_priv->drm,
                            "backlight frequency conversion not supported\n");
                return 0;
        }
 
-       pwm = panel->backlight.hz_to_pwm(connector, pwm_freq_hz);
+       pwm = panel->backlight.funcs->hz_to_pwm(connector, pwm_freq_hz);
        if (!pwm) {
                drm_dbg_kms(&dev_priv->drm,
                            "backlight frequency conversion failed\n");
@@ -1890,8 +1889,8 @@ cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
        return 0;
 }
 
-static int pwm_setup_backlight(struct intel_connector *connector,
-                              enum pipe pipe)
+static int ext_pwm_setup_backlight(struct intel_connector *connector,
+                                  enum pipe pipe)
 {
        struct drm_device *dev = connector->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
@@ -1981,12 +1980,12 @@ int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
        }
 
        /* ensure intel_panel has been initialized first */
-       if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.setup))
+       if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.funcs))
                return -ENODEV;
 
        /* set level and max in panel struct */
        mutex_lock(&dev_priv->backlight_lock);
-       ret = panel->backlight.setup(intel_connector, pipe);
+       ret = panel->backlight.funcs->setup(intel_connector, pipe);
        mutex_unlock(&dev_priv->backlight_lock);
 
        if (ret) {
@@ -2016,6 +2015,86 @@ static void intel_panel_destroy_backlight(struct intel_panel *panel)
        panel->backlight.present = false;
 }
 
+static const struct intel_panel_bl_funcs bxt_funcs = {
+       .setup = bxt_setup_backlight,
+       .enable = bxt_enable_backlight,
+       .disable = bxt_disable_backlight,
+       .set = bxt_set_backlight,
+       .get = bxt_get_backlight,
+       .hz_to_pwm = bxt_hz_to_pwm,
+};
+
+static const struct intel_panel_bl_funcs cnp_funcs = {
+       .setup = cnp_setup_backlight,
+       .enable = cnp_enable_backlight,
+       .disable = cnp_disable_backlight,
+       .set = bxt_set_backlight,
+       .get = bxt_get_backlight,
+       .hz_to_pwm = cnp_hz_to_pwm,
+};
+
+static const struct intel_panel_bl_funcs lpt_funcs = {
+       .setup = lpt_setup_backlight,
+       .enable = lpt_enable_backlight,
+       .disable = lpt_disable_backlight,
+       .set = lpt_set_backlight,
+       .get = lpt_get_backlight,
+       .hz_to_pwm = lpt_hz_to_pwm,
+};
+
+static const struct intel_panel_bl_funcs spt_funcs = {
+       .setup = lpt_setup_backlight,
+       .enable = lpt_enable_backlight,
+       .disable = lpt_disable_backlight,
+       .set = lpt_set_backlight,
+       .get = lpt_get_backlight,
+       .hz_to_pwm = spt_hz_to_pwm,
+};
+
+static const struct intel_panel_bl_funcs pch_funcs = {
+       .setup = pch_setup_backlight,
+       .enable = pch_enable_backlight,
+       .disable = pch_disable_backlight,
+       .set = pch_set_backlight,
+       .get = pch_get_backlight,
+       .hz_to_pwm = pch_hz_to_pwm,
+};
+
+static const struct intel_panel_bl_funcs ext_pwm_funcs = {
+       .setup = ext_pwm_setup_backlight,
+       .enable = ext_pwm_enable_backlight,
+       .disable = ext_pwm_disable_backlight,
+       .set = ext_pwm_set_backlight,
+       .get = ext_pwm_get_backlight,
+};
+
+static const struct intel_panel_bl_funcs vlv_funcs = {
+       .setup = vlv_setup_backlight,
+       .enable = vlv_enable_backlight,
+       .disable = vlv_disable_backlight,
+       .set = vlv_set_backlight,
+       .get = vlv_get_backlight,
+       .hz_to_pwm = vlv_hz_to_pwm,
+};
+
+static const struct intel_panel_bl_funcs i965_funcs = {
+       .setup = i965_setup_backlight,
+       .enable = i965_enable_backlight,
+       .disable = i965_disable_backlight,
+       .set = i9xx_set_backlight,
+       .get = i9xx_get_backlight,
+       .hz_to_pwm = i965_hz_to_pwm,
+};
+
+static const struct intel_panel_bl_funcs i9xx_funcs = {
+       .setup = i9xx_setup_backlight,
+       .enable = i9xx_enable_backlight,
+       .disable = i9xx_disable_backlight,
+       .set = i9xx_set_backlight,
+       .get = i9xx_get_backlight,
+       .hz_to_pwm = i9xx_hz_to_pwm,
+};
+
 /* Set up chip specific backlight functions */
 static void
 intel_panel_init_backlight_funcs(struct intel_panel *panel)
@@ -2033,65 +2112,26 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
                return;
 
        if (IS_GEN9_LP(dev_priv)) {
-               panel->backlight.setup = bxt_setup_backlight;
-               panel->backlight.enable = bxt_enable_backlight;
-               panel->backlight.disable = bxt_disable_backlight;
-               panel->backlight.set = bxt_set_backlight;
-               panel->backlight.get = bxt_get_backlight;
-               panel->backlight.hz_to_pwm = bxt_hz_to_pwm;
+               panel->backlight.funcs = &bxt_funcs;
        } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP) {
-               panel->backlight.setup = cnp_setup_backlight;
-               panel->backlight.enable = cnp_enable_backlight;
-               panel->backlight.disable = cnp_disable_backlight;
-               panel->backlight.set = bxt_set_backlight;
-               panel->backlight.get = bxt_get_backlight;
-               panel->backlight.hz_to_pwm = cnp_hz_to_pwm;
+               panel->backlight.funcs = &cnp_funcs;
        } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_LPT) {
-               panel->backlight.setup = lpt_setup_backlight;
-               panel->backlight.enable = lpt_enable_backlight;
-               panel->backlight.disable = lpt_disable_backlight;
-               panel->backlight.set = lpt_set_backlight;
-               panel->backlight.get = lpt_get_backlight;
                if (HAS_PCH_LPT(dev_priv))
-                       panel->backlight.hz_to_pwm = lpt_hz_to_pwm;
+                       panel->backlight.funcs = &lpt_funcs;
                else
-                       panel->backlight.hz_to_pwm = spt_hz_to_pwm;
+                       panel->backlight.funcs = &spt_funcs;
        } else if (HAS_PCH_SPLIT(dev_priv)) {
-               panel->backlight.setup = pch_setup_backlight;
-               panel->backlight.enable = pch_enable_backlight;
-               panel->backlight.disable = pch_disable_backlight;
-               panel->backlight.set = pch_set_backlight;
-               panel->backlight.get = pch_get_backlight;
-               panel->backlight.hz_to_pwm = pch_hz_to_pwm;
+               panel->backlight.funcs = &pch_funcs;
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
-                       panel->backlight.setup = pwm_setup_backlight;
-                       panel->backlight.enable = pwm_enable_backlight;
-                       panel->backlight.disable = pwm_disable_backlight;
-                       panel->backlight.set = pwm_set_backlight;
-                       panel->backlight.get = pwm_get_backlight;
+                       panel->backlight.funcs = &ext_pwm_funcs;
                } else {
-                       panel->backlight.setup = vlv_setup_backlight;
-                       panel->backlight.enable = vlv_enable_backlight;
-                       panel->backlight.disable = vlv_disable_backlight;
-                       panel->backlight.set = vlv_set_backlight;
-                       panel->backlight.get = vlv_get_backlight;
-                       panel->backlight.hz_to_pwm = vlv_hz_to_pwm;
+                       panel->backlight.funcs = &vlv_funcs;
                }
        } else if (IS_GEN(dev_priv, 4)) {
-               panel->backlight.setup = i965_setup_backlight;
-               panel->backlight.enable = i965_enable_backlight;
-               panel->backlight.disable = i965_disable_backlight;
-               panel->backlight.set = i9xx_set_backlight;
-               panel->backlight.get = i9xx_get_backlight;
-               panel->backlight.hz_to_pwm = i965_hz_to_pwm;
+               panel->backlight.funcs = &i965_funcs;
        } else {
-               panel->backlight.setup = i9xx_setup_backlight;
-               panel->backlight.enable = i9xx_enable_backlight;
-               panel->backlight.disable = i9xx_disable_backlight;
-               panel->backlight.set = i9xx_set_backlight;
-               panel->backlight.get = i9xx_get_backlight;
-               panel->backlight.hz_to_pwm = i9xx_hz_to_pwm;
+               panel->backlight.funcs = &i9xx_funcs;
        }
 }
 
index b3631b722de327595b8d1ca57adffdd1037b851f..d9a395c486d3266a462349eb56e9fdf9d70c501d 100644 (file)
@@ -1185,6 +1185,7 @@ void intel_psr2_program_plane_sel_fetch(struct intel_plane *plane,
 {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum pipe pipe = plane->pipe;
+       const struct drm_rect *clip;
        u32 val;
 
        if (!crtc_state->enable_psr2_sel_fetch)
@@ -1196,16 +1197,20 @@ void intel_psr2_program_plane_sel_fetch(struct intel_plane *plane,
        if (!val || plane->id == PLANE_CURSOR)
                return;
 
-       val = plane_state->uapi.dst.y1 << 16 | plane_state->uapi.dst.x1;
+       clip = &plane_state->psr2_sel_fetch_area;
+
+       val = (clip->y1 + plane_state->uapi.dst.y1) << 16;
+       val |= plane_state->uapi.dst.x1;
        intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_POS(pipe, plane->id), val);
 
-       val = plane_state->color_plane[color_plane].y << 16;
+       /* TODO: consider tiling and auxiliary surfaces */
+       val = (clip->y1 + plane_state->color_plane[color_plane].y) << 16;
        val |= plane_state->color_plane[color_plane].x;
        intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_OFFSET(pipe, plane->id),
                          val);
 
        /* Sizes are 0 based */
-       val = ((drm_rect_height(&plane_state->uapi.src) >> 16) - 1) << 16;
+       val = (drm_rect_height(clip) - 1) << 16;
        val |= (drm_rect_width(&plane_state->uapi.src) >> 16) - 1;
        intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_SIZE(pipe, plane->id), val);
 }
@@ -1279,7 +1284,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
 
        for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state,
                                             new_plane_state, i) {
-               struct drm_rect temp;
+               struct drm_rect *sel_fetch_area, temp;
 
                if (new_plane_state->uapi.crtc != crtc_state->uapi.crtc)
                        continue;
@@ -1302,8 +1307,13 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
                 * For now doing a selective fetch in the whole plane area,
                 * optimizations will come in the future.
                 */
-               temp.y1 = new_plane_state->uapi.dst.y1;
-               temp.y2 = new_plane_state->uapi.dst.y2;
+               sel_fetch_area = &new_plane_state->psr2_sel_fetch_area;
+               sel_fetch_area->y1 = new_plane_state->uapi.src.y1 >> 16;
+               sel_fetch_area->y2 = new_plane_state->uapi.src.y2 >> 16;
+
+               temp = *sel_fetch_area;
+               temp.y1 += new_plane_state->uapi.dst.y1;
+               temp.y2 += new_plane_state->uapi.dst.y2;
                clip_area_update(&pipe_clip, &temp);
        }
 
index 019a2d6d807a6873fe7a184f12a52c6c6f62aeb8..cf3589fd0ddb3ee6d912eb847f5a88ebf61cf5ae 100644 (file)
@@ -49,6 +49,7 @@
 #include "intel_psr.h"
 #include "intel_dsi.h"
 #include "intel_sprite.h"
+#include "i9xx_plane.h"
 
 int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode,
                             int usecs)
@@ -61,14 +62,6 @@ int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode,
                            1000 * adjusted_mode->crtc_htotal);
 }
 
-/* FIXME: We should instead only take spinlocks once for the entire update
- * instead of once per mmio. */
-#if IS_ENABLED(CONFIG_PROVE_LOCKING)
-#define VBLANK_EVASION_TIME_US 250
-#else
-#define VBLANK_EVASION_TIME_US 100
-#endif
-
 /**
  * intel_pipe_update_start() - start update of a set of display registers
  * @new_crtc_state: the new crtc state
@@ -187,6 +180,36 @@ irq_disable:
        local_irq_disable();
 }
 
+#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_VBLANK_EVADE)
+static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end)
+{
+       u64 delta = ktime_to_ns(ktime_sub(end, crtc->debug.start_vbl_time));
+       unsigned int h;
+
+       h = ilog2(delta >> 9);
+       if (h >= ARRAY_SIZE(crtc->debug.vbl.times))
+               h = ARRAY_SIZE(crtc->debug.vbl.times) - 1;
+       crtc->debug.vbl.times[h]++;
+
+       crtc->debug.vbl.sum += delta;
+       if (!crtc->debug.vbl.min || delta < crtc->debug.vbl.min)
+               crtc->debug.vbl.min = delta;
+       if (delta > crtc->debug.vbl.max)
+               crtc->debug.vbl.max = delta;
+
+       if (delta > 1000 * VBLANK_EVASION_TIME_US) {
+               drm_dbg_kms(crtc->base.dev,
+                           "Atomic update on pipe (%c) took %lld us, max time under evasion is %u us\n",
+                           pipe_name(crtc->pipe),
+                           div_u64(delta, 1000),
+                           VBLANK_EVASION_TIME_US);
+               crtc->debug.vbl.over++;
+       }
+}
+#else
+static void dbg_vblank_evade(struct intel_crtc *crtc, ktime_t end) {}
+#endif
+
 /**
  * intel_pipe_update_end() - end update of a set of display registers
  * @new_crtc_state: the new crtc state
@@ -249,15 +272,8 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state)
                        crtc->debug.min_vbl, crtc->debug.max_vbl,
                        crtc->debug.scanline_start, scanline_end);
        }
-#ifdef CONFIG_DRM_I915_DEBUG_VBLANK_EVADE
-       else if (ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time) >
-                VBLANK_EVASION_TIME_US)
-               drm_warn(&dev_priv->drm,
-                        "Atomic update on pipe (%c) took %lld us, max time under evasion is %u us\n",
-                        pipe_name(pipe),
-                        ktime_us_delta(end_vbl_time, crtc->debug.start_vbl_time),
-                        VBLANK_EVASION_TIME_US);
-#endif
+
+       dbg_vblank_evade(crtc, end_vbl_time);
 }
 
 int intel_plane_check_stride(const struct intel_plane_state *plane_state)
index cd2104ba1ca196ba31377e83851188f320972d1d..76126dd8d584f74382d1913f537bb53483f8ed25 100644 (file)
@@ -17,6 +17,16 @@ struct drm_i915_private;
 struct intel_crtc_state;
 struct intel_plane_state;
 
+/*
+ * FIXME: We should instead only take spinlocks once for the entire update
+ * instead of once per mmio.
+ */
+#if IS_ENABLED(CONFIG_PROVE_LOCKING)
+#define VBLANK_EVASION_TIME_US 250
+#else
+#define VBLANK_EVASION_TIME_US 100
+#endif
+
 int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode,
                             int usecs);
 struct intel_plane *intel_sprite_plane_create(struct drm_i915_private *dev_priv,
index 4346bc1a747a2ee809f846eb7b393c75b1e1b60f..27dc2dad6809ce8553f5442160dee903a1e59e47 100644 (file)
@@ -262,7 +262,7 @@ static u32 tc_port_live_status_mask(struct intel_digital_port *dig_port)
                mask |= BIT(TC_PORT_LEGACY);
 
        /* The sink can be connected only in a single mode. */
-       if (!drm_WARN_ON(&i915->drm, hweight32(mask) > 1))
+       if (!drm_WARN_ON_ONCE(&i915->drm, hweight32(mask) > 1))
                tc_port_fixup_legacy_flag(dig_port, mask);
 
        return mask;
index e2716a67b2816d94f3b32ec2c02456ec5c6f9402..f58cc5700784e2dd46bcbe73fa30ef49909b8bf3 100644 (file)
@@ -454,8 +454,6 @@ int intel_dsc_compute_params(struct intel_encoder *encoder,
        else if (vdsc_cfg->bits_per_component == 12)
                vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_12_BPC;
 
-       /* RC_MODEL_SIZE is a constant across all configurations */
-       vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
        /* InitialScaleValue is a 6 bit value with 3 fractional bits (U3.3) */
        vdsc_cfg->initial_scale_value = (vdsc_cfg->rc_model_size << 3) /
                (vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset);
@@ -741,7 +739,7 @@ static void intel_dsc_pps_configure(const struct intel_crtc_state *crtc_state)
 
        /* Populate PICTURE_PARAMETER_SET_9 registers */
        pps_val = 0;
-       pps_val |= DSC_RC_MODEL_SIZE(DSC_RC_MODEL_SIZE_CONST) |
+       pps_val |= DSC_RC_MODEL_SIZE(vdsc_cfg->rc_model_size) |
                DSC_RC_EDGE_FACTOR(DSC_RC_EDGE_FACTOR_CONST);
        drm_info(&dev_priv->drm, "PPS9 = 0x%08x\n", pps_val);
        if (!is_pipe_dsc(crtc_state)) {
index aa7e75cb3e6afb881af95610c8d9f19297ce750c..3a4f5590640f46abc8e311ab53f3d290529bf5b6 100644 (file)
@@ -3693,7 +3693,7 @@ static inline int mmio_pm_restore_handler(struct intel_gvt *gvt,
        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;
 }
index 77e76b665098f2ca30d6a45c88a74c08a41a758c..a61e9b095896596a7e260c9cb310e3a6264722d0 100644 (file)
@@ -378,308 +378,6 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
        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)
@@ -802,7 +500,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
        } 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",
@@ -847,19 +545,19 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                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 {
@@ -871,24 +569,24 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                }
                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
@@ -896,17 +594,17 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                        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));
@@ -1011,111 +709,6 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
        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 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
        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);
@@ -1233,41 +812,6 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
 
        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 @@ static int i915_runtime_pm_status(struct seq_file *m, void *unused)
                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 @@ static int i915_engine_info(struct seq_file *m, void *unused)
        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 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_drop_caches_fops,
                        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 @@ static const struct file_operations i915_forcewake_fops = {
 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 @@ 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},
index 320856b665a17b69d465c28920439a7c7c51aefa..249f765993f7102d4d469d5f48cdcdc47ec2cf89 100644 (file)
@@ -578,8 +578,6 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
 
        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
@@ -626,7 +624,6 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
 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 @@ static void i915_driver_hw_remove(struct drm_i915_private *dev_priv)
 
        if (pdev->msi_enabled)
                pci_disable_msi(pdev);
-
-       cpu_latency_qos_remove_request(&dev_priv->pm_qos);
 }
 
 /**
@@ -738,6 +733,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
         * 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 @@ void i915_driver_remove(struct drm_i915_private *i915)
 
        i915_gem_suspend(i915);
 
-       drm_atomic_helper_shutdown(&i915->drm);
-
        intel_gvt_driver_remove(i915);
 
        intel_modeset_driver_remove(i915);
index 0a3ee4f9dc0a77d46eda29821a9df04e5a2e7ad1..2688f3e3e3491034fa99d4577912f1dc26273dd8 100644 (file)
@@ -416,6 +416,7 @@ struct intel_fbc {
                u16 gen9_wa_cfb_stride;
                u16 interval;
                s8 fence_id;
+               bool psr2_active;
        } state_cache;
 
        /*
@@ -891,9 +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;
@@ -1970,43 +1968,6 @@ mkwrite_device_info(struct drm_i915_private *dev_priv)
 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,
index 6cdb052e385050c1e74f45c0a0fd066649d6a3e2..dd1971040bbcc63ee0f5567439b0befb9da180a4 100644 (file)
@@ -327,10 +327,10 @@ i915_hotplug_interrupt_update_locked(struct drm_i915_private *dev_priv,
        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 +376,8 @@ void ilk_update_display_irq(struct drm_i915_private *dev_priv,
        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 +401,15 @@ static void bdw_update_port_irq(struct drm_i915_private *dev_priv,
        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 +440,8 @@ void bdw_update_pipe_irq(struct drm_i915_private *dev_priv,
 
        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 +455,7 @@ void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
                                  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);
 
@@ -466,8 +466,8 @@ void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
        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 +533,8 @@ void i915_enable_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);
 }
 
 void i915_disable_pipestat(struct drm_i915_private *dev_priv,
@@ -556,8 +556,8 @@ 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 +715,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
        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 +1004,9 @@ static void ivb_parity_work(struct 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;
@@ -1020,13 +1020,13 @@ static void ivb_parity_work(struct work_struct *work)
 
                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);
@@ -1047,7 +1047,7 @@ static void ivb_parity_work(struct work_struct *work)
                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 +1062,12 @@ static bool gen11_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
 {
        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 +1091,10 @@ static bool icp_ddi_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
 {
        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 +1104,12 @@ static bool icp_tc_port_hotplug_long_detect(enum hpd_pin pin, u32 val)
 {
        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 +1324,7 @@ static void hsw_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
                                     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 +1332,11 @@ static void ivb_pipe_crc_irq_handler(struct drm_i915_private *dev_priv,
                                     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,
@@ -1358,19 +1345,19 @@ 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 +1366,7 @@ static void i9xx_pipestat_irq_reset(struct drm_i915_private *dev_priv)
        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 +1420,7 @@ static void i9xx_pipestat_irq_ack(struct drm_i915_private *dev_priv,
                        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);
 
                /*
@@ -1446,8 +1433,8 @@ static void i9xx_pipestat_irq_ack(struct drm_i915_private *dev_priv,
                 * 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 +1550,18 @@ static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv)
         * 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 +1610,9 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
                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;
@@ -1645,14 +1632,14 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
                 * 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);
@@ -1670,10 +1657,10 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
                 * 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);
@@ -1710,8 +1697,8 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
                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;
@@ -1731,9 +1718,9 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
                 * 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);
 
@@ -1754,10 +1741,10 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
                 * 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);
@@ -1783,7 +1770,7 @@ static void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv,
         * 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 |
@@ -1792,7 +1779,7 @@ static void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv,
                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 +1824,7 @@ static void ibx_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_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE))
@@ -1856,7 +1843,7 @@ static void ibx_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
 
 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)
@@ -1874,12 +1861,12 @@ static void ivb_err_int_handler(struct drm_i915_private *dev_priv)
                }
        }
 
-       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)
@@ -1889,7 +1876,7 @@ static void cpt_serr_int_handler(struct drm_i915_private *dev_priv)
                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)
@@ -1922,7 +1909,7 @@ 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 +1925,8 @@ static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
        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,
@@ -1950,8 +1937,8 @@ static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
        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 +1963,8 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
        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,
@@ -1988,8 +1975,8 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
        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 +1996,8 @@ static void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv,
 {
        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 +2038,7 @@ static void ilk_display_irq_handler(struct drm_i915_private *dev_priv,
 
        /* 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);
@@ -2059,7 +2046,7 @@ static void ilk_display_irq_handler(struct drm_i915_private *dev_priv,
                        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 +2066,10 @@ static void ivb_display_irq_handler(struct drm_i915_private *dev_priv,
                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)
@@ -2098,12 +2085,12 @@ static void ivb_display_irq_handler(struct drm_i915_private *dev_priv,
 
        /* 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);
        }
 }
 
@@ -2190,8 +2177,8 @@ static void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv,
 {
        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 +2197,8 @@ static void gen11_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
        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,
@@ -2222,8 +2209,8 @@ static void gen11_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
        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 +2287,8 @@ gen8_de_misc_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
                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 +2312,7 @@ static void gen11_dsi_te_interrupt_handler(struct drm_i915_private *dev_priv,
         * 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;
 
        /*
@@ -2337,7 +2324,7 @@ static void gen11_dsi_te_interrupt_handler(struct drm_i915_private *dev_priv,
        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) {
@@ -2346,7 +2333,7 @@ static void gen11_dsi_te_interrupt_handler(struct drm_i915_private *dev_priv,
        }
 
        /* 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;
@@ -2366,8 +2353,8 @@ static void gen11_dsi_te_interrupt_handler(struct drm_i915_private *dev_priv,
 
        /* 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 +2365,9 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
        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 {
@@ -2390,9 +2377,9 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
        }
 
        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 {
@@ -2402,11 +2389,11 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
        }
 
        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)) {
@@ -2459,7 +2446,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
                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");
@@ -2467,7 +2454,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
                }
 
                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);
@@ -2496,9 +2483,9 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
                 * 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)
@@ -2741,7 +2728,7 @@ int i915gm_enable_vblank(struct drm_crtc *crtc)
         * 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 +2785,16 @@ static bool gen11_dsi_configure_te(struct intel_crtc *intel_crtc,
        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 +2856,7 @@ void i915gm_disable_vblank(struct drm_crtc *crtc)
        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 +2922,7 @@ static void ibx_irq_reset(struct drm_i915_private *dev_priv)
        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)
@@ -2948,7 +2935,7 @@ 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 +2998,8 @@ static void ilk_irq_reset(struct drm_i915_private *dev_priv)
 
 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 +3152,8 @@ static void cherryview_irq_reset(struct drm_i915_private *dev_priv)
 {
        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 +3199,7 @@ static void ibx_hpd_detection_setup(struct drm_i915_private *dev_priv)
         * 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 |
@@ -3221,7 +3208,7 @@ static void ibx_hpd_detection_setup(struct drm_i915_private *dev_priv)
                     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 +3257,20 @@ static void icp_ddi_hpd_detection_setup(struct drm_i915_private *dev_priv)
 {
        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) |
@@ -3291,7 +3278,7 @@ static void icp_tc_hpd_detection_setup(struct drm_i915_private *dev_priv)
                     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)
@@ -3302,7 +3289,7 @@ 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 +3317,12 @@ static void dg1_hpd_irq_setup(struct drm_i915_private *dev_priv)
 {
        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 +3331,7 @@ static void gen11_tc_hpd_detection_setup(struct drm_i915_private *dev_priv)
 {
        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) |
@@ -3352,14 +3339,14 @@ static void gen11_tc_hpd_detection_setup(struct drm_i915_private *dev_priv)
                     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) |
@@ -3367,7 +3354,7 @@ static void gen11_tbt_hpd_detection_setup(struct drm_i915_private *dev_priv)
                     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)
@@ -3378,11 +3365,11 @@ 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 +3412,25 @@ static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv)
 
        /* 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)
@@ -3451,7 +3438,7 @@ 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 +3469,11 @@ static void ilk_hpd_detection_setup(struct drm_i915_private *dev_priv)
         * 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 +3523,7 @@ static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv)
 {
        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 |
@@ -3544,7 +3531,7 @@ static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv)
                     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 +3651,8 @@ static void valleyview_irq_postinstall(struct drm_i915_private *dev_priv)
                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 +3765,14 @@ static void gen11_irq_postinstall(struct drm_i915_private *dev_priv)
 
        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 +3785,8 @@ static void cherryview_irq_postinstall(struct drm_i915_private *dev_priv)
                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 +3876,11 @@ static void i9xx_error_irq_ack(struct drm_i915_private *dev_priv,
 {
        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;
 
@@ -3907,9 +3894,9 @@ static void i9xx_error_irq_ack(struct drm_i915_private *dev_priv,
         * (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,
@@ -3975,7 +3962,7 @@ static void i915_irq_reset(struct drm_i915_private *dev_priv)
 
        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 +3976,7 @@ static void i915_irq_postinstall(struct drm_i915_private *dev_priv)
        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 +4029,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
                u32 hotplug_status = 0;
                u32 iir;
 
-               iir = I915_READ(GEN2_IIR);
+               iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
                if (iir == 0)
                        break;
 
@@ -4059,7 +4046,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
                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]);
@@ -4085,7 +4072,7 @@ static void i965_irq_reset(struct drm_i915_private *dev_priv)
        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 +4099,7 @@ static void i965_irq_postinstall(struct drm_i915_private *dev_priv)
                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 +4175,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
                u32 hotplug_status = 0;
                u32 iir;
 
-               iir = I915_READ(GEN2_IIR);
+               iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
                if (iir == 0)
                        break;
 
@@ -4204,7 +4191,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
                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]);
index 5375b219cc3b7c6f7a45046e5e778edc8fe1c866..0023c023f472a7b54fe7ddb5c5d36e26798890cd 100644 (file)
@@ -4352,6 +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
@@ -10851,8 +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)
index db2111fc809e16fda37537448005db34c14d686f..63212df33c9ecee552d3ce501ef5dbee2bb49790 100644 (file)
@@ -24,6 +24,7 @@
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include "display/intel_de.h"
 #include "display/intel_fbc.h"
 #include "display/intel_gmbus.h"
 #include "display/intel_vga.h"
@@ -39,21 +40,21 @@ static void intel_save_swf(struct drm_i915_private *dev_priv)
        /* Scratch space */
        if (IS_GEN(dev_priv, 2) && IS_MOBILE(dev_priv)) {
                for (i = 0; i < 7; i++) {
-                       dev_priv->regfile.saveSWF0[i] = I915_READ(SWF0(i));
-                       dev_priv->regfile.saveSWF1[i] = I915_READ(SWF1(i));
+                       dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv, SWF0(i));
+                       dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv, SWF1(i));
                }
                for (i = 0; i < 3; i++)
-                       dev_priv->regfile.saveSWF3[i] = I915_READ(SWF3(i));
+                       dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv, SWF3(i));
        } else if (IS_GEN(dev_priv, 2)) {
                for (i = 0; i < 7; i++)
-                       dev_priv->regfile.saveSWF1[i] = I915_READ(SWF1(i));
+                       dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv, SWF1(i));
        } else if (HAS_GMCH(dev_priv)) {
                for (i = 0; i < 16; i++) {
-                       dev_priv->regfile.saveSWF0[i] = I915_READ(SWF0(i));
-                       dev_priv->regfile.saveSWF1[i] = I915_READ(SWF1(i));
+                       dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv, SWF0(i));
+                       dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv, SWF1(i));
                }
                for (i = 0; i < 3; i++)
-                       dev_priv->regfile.saveSWF3[i] = I915_READ(SWF3(i));
+                       dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv, SWF3(i));
        }
 }
 
@@ -64,21 +65,21 @@ static void intel_restore_swf(struct drm_i915_private *dev_priv)
        /* Scratch space */
        if (IS_GEN(dev_priv, 2) && IS_MOBILE(dev_priv)) {
                for (i = 0; i < 7; i++) {
-                       I915_WRITE(SWF0(i), dev_priv->regfile.saveSWF0[i]);
-                       I915_WRITE(SWF1(i), dev_priv->regfile.saveSWF1[i]);
+                       intel_de_write(dev_priv, SWF0(i), dev_priv->regfile.saveSWF0[i]);
+                       intel_de_write(dev_priv, SWF1(i), dev_priv->regfile.saveSWF1[i]);
                }
                for (i = 0; i < 3; i++)
-                       I915_WRITE(SWF3(i), dev_priv->regfile.saveSWF3[i]);
+                       intel_de_write(dev_priv, SWF3(i), dev_priv->regfile.saveSWF3[i]);
        } else if (IS_GEN(dev_priv, 2)) {
                for (i = 0; i < 7; i++)
-                       I915_WRITE(SWF1(i), dev_priv->regfile.saveSWF1[i]);
+                       intel_de_write(dev_priv, SWF1(i), dev_priv->regfile.saveSWF1[i]);
        } else if (HAS_GMCH(dev_priv)) {
                for (i = 0; i < 16; i++) {
-                       I915_WRITE(SWF0(i), dev_priv->regfile.saveSWF0[i]);
-                       I915_WRITE(SWF1(i), dev_priv->regfile.saveSWF1[i]);
+                       intel_de_write(dev_priv, SWF0(i), dev_priv->regfile.saveSWF0[i]);
+                       intel_de_write(dev_priv, SWF1(i), dev_priv->regfile.saveSWF1[i]);
                }
                for (i = 0; i < 3; i++)
-                       I915_WRITE(SWF3(i), dev_priv->regfile.saveSWF3[i]);
+                       intel_de_write(dev_priv, SWF3(i), dev_priv->regfile.saveSWF3[i]);
        }
 }
 
@@ -88,7 +89,7 @@ void i915_save_display(struct drm_i915_private *dev_priv)
 
        /* Display arbitration control */
        if (INTEL_GEN(dev_priv) <= 4)
-               dev_priv->regfile.saveDSPARB = I915_READ(DSPARB);
+               dev_priv->regfile.saveDSPARB = intel_de_read(dev_priv, DSPARB);
 
        if (IS_GEN(dev_priv, 4))
                pci_read_config_word(pdev, GCDGMBUS,
@@ -109,7 +110,7 @@ void i915_restore_display(struct drm_i915_private *dev_priv)
 
        /* Display arbitration */
        if (INTEL_GEN(dev_priv) <= 4)
-               I915_WRITE(DSPARB, dev_priv->regfile.saveDSPARB);
+               intel_de_write(dev_priv, DSPARB, dev_priv->regfile.saveDSPARB);
 
        /* only restore FBC info on the platform that supports FBC*/
        intel_fbc_global_disable(dev_priv);
index e67cec8fa2aa4e06b47b676c91f7ee70aa3f097d..ef767f04c37c28d15812b4a9274cc94c5bc5aa81 100644 (file)
@@ -104,7 +104,7 @@ void intel_device_info_print_static(const struct intel_device_info *info,
        drm_printf(p, "ppgtt-type: %d\n", info->ppgtt_type);
        drm_printf(p, "dma_mask_size: %u\n", info->dma_mask_size);
 
-#define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, yesno(info->name));
+#define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, yesno(info->name))
        DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG);
 #undef PRINT_FLAG
 
index a20b5051f18c11b58e58570899f46a4c83b99a05..bbc73df7f753b3ea894ac5552b21b7713288294b 100644 (file)
@@ -82,24 +82,24 @@ static void gen9_init_clock_gating(struct drm_i915_private *dev_priv)
                 * 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 @@ static void bxt_init_clock_gating(struct drm_i915_private *dev_priv)
        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);
 
        /*
@@ -131,20 +131,20 @@ static void bxt_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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 @@ static void glk_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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 @@ static void pnv_get_mem_freq(struct drm_i915_private *dev_priv)
 {
        u32 tmp;
 
-       tmp = I915_READ(CLKCFG);
+       tmp = intel_uncore_read(&dev_priv->uncore, CLKCFG);
 
        switch (tmp & CLKCFG_FSB_MASK) {
        case CLKCFG_FSB_533:
@@ -195,7 +195,7 @@ static void pnv_get_mem_freq(struct drm_i915_private *dev_priv)
        }
 
        /* 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 @@ static bool _intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enabl
        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 @@ static void vlv_get_fifo_size(struct intel_crtc_state *crtc_state)
 
        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;
@@ -525,7 +525,7 @@ static void vlv_get_fifo_size(struct intel_crtc_state *crtc_state)
 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;
@@ -541,7 +541,7 @@ static int i9xx_get_fifo_size(struct drm_i915_private *dev_priv,
 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;
@@ -558,7 +558,7 @@ static int i830_get_fifo_size(struct drm_i915_private *dev_priv,
 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 @@ static void pnv_update_wm(struct intel_crtc *unused_crtc)
                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 @@ static void g4x_write_wm_values(struct drm_i915_private *dev_priv,
        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 @@ static void vlv_write_wm_values(struct drm_i915_private *dev_priv,
        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)) |
@@ -1020,35 +1020,35 @@ static void vlv_write_wm_values(struct drm_i915_private *dev_priv,
         * 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) |
@@ -1060,10 +1060,10 @@ static void vlv_write_wm_values(struct drm_i915_private *dev_priv,
                           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) |
@@ -1073,7 +1073,7 @@ static void vlv_write_wm_values(struct drm_i915_private *dev_priv,
                           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 @@ static void i965_update_wm(struct intel_crtc *unused_crtc)
                    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 @@ static void i9xx_update_wm(struct intel_crtc *unused_crtc)
                        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,
@@ -2464,8 +2464,8 @@ static void i9xx_update_wm(struct intel_crtc *unused_crtc)
        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 @@ static void i845_update_wm(struct intel_crtc *unused_crtc)
                                       &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 @@ static bool _ilk_disable_lp_wm(struct drm_i915_private *dev_priv,
 
        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 @@ static void ilk_write_wm_values(struct drm_i915_private *dev_priv,
        _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 @@ u8 intel_enabled_dbuf_slices_mask(struct drm_i915_private *dev_priv)
        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 @@ skl_ddb_get_hw_plane_state(struct drm_i915_private *dev_priv,
 
        /* 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)
@@ -4314,11 +4314,11 @@ skl_ddb_get_hw_plane_state(struct drm_i915_private *dev_priv,
                                              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 @@ void skl_pipe_wm_get_hw_state(struct intel_crtc *crtc,
 
                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]);
                }
@@ -6242,9 +6242,9 @@ void skl_pipe_wm_get_hw_state(struct intel_crtc *crtc,
                        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 @@ static void ilk_pipe_wm_get_hw_state(struct intel_crtc *crtc)
        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 @@ static void g4x_read_wm_values(struct drm_i915_private *dev_priv,
 {
        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);
@@ -6338,7 +6338,7 @@ static void g4x_read_wm_values(struct drm_i915_private *dev_priv,
        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 @@ static void vlv_read_wm_values(struct drm_i915_private *dev_priv,
        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);
@@ -6364,34 +6364,34 @@ static void vlv_read_wm_values(struct drm_i915_private *dev_priv,
                        (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;
@@ -6403,11 +6403,11 @@ static void vlv_read_wm_values(struct drm_i915_private *dev_priv,
                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 @@ void g4x_wm_get_hw_state(struct drm_i915_private *dev_priv)
 
        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 @@ void vlv_wm_get_hw_state(struct drm_i915_private *dev_priv)
 
        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 @@ void vlv_wm_sanitize(struct drm_i915_private *dev_priv)
  */
 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 @@ void ilk_wm_get_hw_state(struct drm_i915_private *dev_priv)
        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 @@ void intel_enable_ipc(struct drm_i915_private *dev_priv)
        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 @@ static void ibx_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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)
@@ -6858,12 +6858,12 @@ 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 @@ static void ilk_init_clock_gating(struct drm_i915_private *dev_priv)
                   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);
 
        /*
@@ -6892,12 +6892,12 @@ static void ilk_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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));
 
        /*
@@ -6909,18 +6909,18 @@ static void ilk_init_clock_gating(struct drm_i915_private *dev_priv)
         */
        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 @@ static void cpt_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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 @@ static void gen6_check_mch_setup(struct drm_i915_private *dev_priv)
 {
        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 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv)
 {
        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);
 
@@ -7002,7 +7002,7 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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);
 
@@ -7017,14 +7017,14 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv)
         *
         * 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 @@ static void lpt_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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,33 +7070,33 @@ static void gen8_set_l3sqc_credits(struct drm_i915_private *dev_priv,
        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,
@@ -7106,12 +7106,12 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv)
 static void tgl_init_clock_gating(struct drm_i915_private *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 */
@@ -7123,7 +7123,7 @@ static void dg1_init_clock_gating(struct drm_i915_private *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 +7133,7 @@ static void cnp_init_clock_gating(struct drm_i915_private *dev_priv)
                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 +7143,35 @@ static void cnl_init_clock_gating(struct drm_i915_private *dev_priv)
        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)
@@ -7180,21 +7180,21 @@ 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 +7203,31 @@ static void kbl_init_clock_gating(struct drm_i915_private *dev_priv)
        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 +7236,32 @@ static void skl_init_clock_gating(struct drm_i915_private *dev_priv)
        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 +7270,42 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)
        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);
@@ -7315,24 +7315,24 @@ static void bdw_init_clock_gating(struct drm_i915_private *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 +7341,26 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv)
 {
        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));
        }
 
@@ -7368,20 +7368,20 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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);
@@ -7392,58 +7392,58 @@ static void ivb_init_clock_gating(struct drm_i915_private *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 +7458,17 @@ static void g4x_init_clock_gating(struct drm_i915_private *dev_priv)
 {
        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 +7489,49 @@ static void i965gm_init_clock_gating(struct drm_i915_private *dev_priv)
 
 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));
 
        /*
@@ -7541,13 +7541,13 @@ static void i85x_init_clock_gating(struct drm_i915_private *dev_priv)
         * 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));
 }
index 02ebf5a04a9bc15fcd6e985e3b4c21e7df3a200e..0ec0cf19195554313c646c201c40aa576a203d9e 100644 (file)
@@ -404,8 +404,8 @@ static int __sandybridge_pcode_rw(struct drm_i915_private *i915,
        lockdep_assert_held(&i915->sb_lock);
 
        /*
-        * GEN6_PCODE_* are outside of the forcewake domain, we can
-        * use te fw I915_READ variants to reduce the amount of work
+        * GEN6_PCODE_* are outside of the forcewake domain, we can use
+        * intel_uncore_read/write_fw variants to reduce the amount of work
         * required when reading/writing.
         */
 
index 1c14a07eba7d6f651b7a66208f1f484b20a8f1e6..9ac501bcfdadb707cee272bd43bd0cbad44a6626 100644 (file)
@@ -2070,7 +2070,7 @@ int i915_reg_read_ioctl(struct drm_device *dev,
  * This routine waits until the target register @reg contains the expected
  * @value after applying the @mask, i.e. it waits until ::
  *
- *     (I915_READ_FW(reg) & mask) == value
+ *     (intel_uncore_read_fw(uncore, reg) & mask) == value
  *
  * Otherwise, the wait will timeout after @slow_timeout_ms milliseconds.
  * For atomic context @slow_timeout_ms must be zero and @fast_timeout_us
@@ -2126,7 +2126,7 @@ int __intel_wait_for_register_fw(struct intel_uncore *uncore,
  * This routine waits until the target register @reg contains the expected
  * @value after applying the @mask, i.e. it waits until ::
  *
- *     (I915_READ(reg) & mask) == value
+ *     (intel_uncore_read(uncore, reg) & mask) == value
  *
  * Otherwise, the wait will timeout after @timeout_ms milliseconds.
  *
index bd2467284295c95140ceb0a09720375f05953c11..59f0da8f1fbb1bfab10238e49c4f76ff075aef51 100644 (file)
@@ -216,7 +216,7 @@ void intel_uncore_forcewake_flush(struct intel_uncore *uncore,
 
 /*
  * Like above but the caller must manage the uncore.lock itself.
- * Must be used with I915_READ_FW and friends.
+ * Must be used with intel_uncore_read_fw() and friends.
  */
 void intel_uncore_forcewake_get__locked(struct intel_uncore *uncore,
                                        enum forcewake_domains domains);
@@ -318,8 +318,8 @@ __uncore_write(write_notrace, 32, l, false)
  * will be implemented using 2 32-bit writes in an arbitrary order with
  * an arbitrary delay between them. This can cause the hardware to
  * act upon the intermediate value, possibly leading to corruption and
- * machine death. For this reason we do not support I915_WRITE64, or
- * uncore->funcs.mmio_writeq.
+ * machine death. For this reason we do not support intel_uncore_write64,
+ * or uncore->funcs.mmio_writeq.
  *
  * When reading a 64-bit value as two 32-bit values, the delay may cause
  * the two reads to mismatch, e.g. a timestamp overflowing. Also note that
index 53c51231b31c40b10b6d3768a10129e586dd58d1..cf43561e60fade84fc9059f80fe63e9f9c7ac811 100644 (file)
@@ -603,6 +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);