Merge drm/drm-next into drm-intel-next-queued
authorJani Nikula <jani.nikula@intel.com>
Fri, 15 Nov 2019 11:17:39 +0000 (13:17 +0200)
committerJani Nikula <jani.nikula@intel.com>
Fri, 15 Nov 2019 11:17:39 +0000 (13:17 +0200)
Backmerge to get dfce90259d74 ("Backmerge i915 security patches from
commit 'ea0b163b13ff' into drm-next") and thus 100d46bd72ec ("Merge
Intel Gen8/Gen9 graphics fixes from Jon Bloomfield.").

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
12 files changed:
1  2 
drivers/gpu/drm/Kconfig
drivers/gpu/drm/i915/Kconfig.debug
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp_mst.c
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/gem/i915_gem_context_types.h
drivers/gpu/drm/i915/gt/intel_rc6.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_pm.c

diff --combined drivers/gpu/drm/Kconfig
@@@ -54,9 -54,6 +54,9 @@@ config DRM_DEBUG_M
  
          If in doubt, say "N".
  
 +config DRM_EXPORT_FOR_TESTS
 +      bool
 +
  config DRM_DEBUG_SELFTEST
        tristate "kselftests for DRM"
        depends on DRM
@@@ -64,7 -61,6 +64,7 @@@
        select PRIME_NUMBERS
        select DRM_LIB_RANDOM
        select DRM_KMS_HELPER
 +      select DRM_EXPORT_FOR_TESTS if m
        default n
        help
          This option provides kernel modules that can be used to run
@@@ -97,6 -93,20 +97,20 @@@ config DRM_KMS_FB_HELPE
        help
          FBDEV helpers for KMS drivers.
  
+ config DRM_DEBUG_DP_MST_TOPOLOGY_REFS
+         bool "Enable refcount backtrace history in the DP MST helpers"
+         select STACKDEPOT
+         depends on DRM_KMS_HELPER
+         depends on DEBUG_KERNEL
+         depends on EXPERT
+         help
+           Enables debug tracing for topology refs in DRM's DP MST helpers. A
+           history of each topology reference/dereference will be printed to the
+           kernel log once a port or branch device's topology refcount reaches 0.
+           This has the potential to use a lot of memory and print some very
+           large kernel messages. If in doubt, say "N".
  config DRM_FBDEV_EMULATION
        bool "Enable legacy fbdev support for your modesetting driver"
        depends on DRM
@@@ -169,6 -179,13 +183,13 @@@ config DRM_TT
          GPU memory types. Will be enabled automatically if a device driver
          uses it.
  
+ config DRM_TTM_DMA_PAGE_POOL
+       bool
+       depends on DRM_TTM && (SWIOTLB || INTEL_IOMMU)
+       default y
+       help
+         Choose this if you need the TTM dma page pool
  config DRM_VRAM_HELPER
        tristate
        depends on DRM
@@@ -236,9 -253,9 +257,9 @@@ config DRM_AMDGP
        tristate "AMD GPU"
        depends on DRM && PCI && MMU
        select FW_LOADER
-         select DRM_KMS_HELPER
+       select DRM_KMS_HELPER
        select DRM_SCHED
-         select DRM_TTM
+       select DRM_TTM
        select POWER_SUPPLY
        select HWMON
        select BACKLIGHT_CLASS_DEVICE
@@@ -267,6 -284,7 +288,7 @@@ config DRM_VKM
        tristate "Virtual KMS (EXPERIMENTAL)"
        depends on DRM
        select DRM_KMS_HELPER
+       select CRC32
        default n
        help
          Virtual Kernel Mode-Setting (VKMS) is used for testing or for
@@@ -407,7 -425,7 +429,7 @@@ config DRM_R12
  
  config DRM_I810
        tristate "Intel I810"
-       # !PREEMPT because of missing ioctl locking
+       # !PREEMPTION because of missing ioctl locking
        depends on DRM && AGP && AGP_INTEL && (!PREEMPTION || BROKEN)
        help
          Choose this option if you have an Intel I810 graphics card.  If M is
@@@ -29,7 -29,6 +29,7 @@@ config DRM_I915_DEBU
        select X86_MSR # used by igt/pm_rpm
        select DRM_VGEM # used by igt/prime_vgem (dmabuf interop checks)
        select DRM_DEBUG_MM if DRM=y
 +      select DRM_EXPORT_FOR_TESTS if m
        select DRM_DEBUG_SELFTEST
        select DMABUF_SELFTESTS
        select SW_SYNC # signaling validation framework (igt/syncobj*)
@@@ -37,7 -36,6 +37,6 @@@
        select DRM_I915_SELFTEST
        select DRM_I915_DEBUG_RUNTIME_PM
        select DRM_I915_DEBUG_MMIO
-       select BROKEN # for prototype uAPI
        default n
        help
          Choose this option to turn on extra driver debugging that may affect
@@@ -153,7 -151,6 +152,7 @@@ config DRM_I915_SELFTES
        bool "Enable selftests upon driver load"
        depends on DRM_I915
        default n
 +      select DRM_EXPORT_FOR_TESTS if m
        select FAULT_INJECTION
        select PRIME_NUMBERS
        help
@@@ -1999,7 -1999,7 +1999,7 @@@ intel_dp_compute_link_config_wide(struc
                                  struct intel_crtc_state *pipe_config,
                                  const struct link_config_limits *limits)
  {
 -      struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
 +      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
        int bpp, clock, lane_count;
        int mode_rate, link_clock, link_avail;
  
@@@ -2053,7 -2053,7 +2053,7 @@@ static int intel_dp_dsc_compute_config(
  {
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
        struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
 -      struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
 +      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
        u8 dsc_max_bpc;
        int pipe_bpp;
        int ret;
                }
        }
  
 -      ret = intel_dp_compute_dsc_params(intel_dp, pipe_config);
 +      ret = intel_dsc_compute_params(&dig_port->base, pipe_config);
        if (ret < 0) {
                DRM_DEBUG_KMS("Cannot compute valid DSC parameters for Input Bpp = %d "
                              "Compressed BPP = %d\n",
@@@ -2164,7 -2164,7 +2164,7 @@@ intel_dp_compute_link_config(struct int
                             struct intel_crtc_state *pipe_config,
                             struct drm_connector_state *conn_state)
  {
 -      struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
 +      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
        struct link_config_limits limits;
        int common_len;
@@@ -2252,8 -2252,8 +2252,8 @@@ intel_dp_ycbcr420_config(struct intel_d
  {
        const struct drm_display_info *info = &connector->display_info;
        const struct drm_display_mode *adjusted_mode =
 -              &crtc_state->base.adjusted_mode;
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +              &crtc_state->hw.adjusted_mode;
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        int ret;
  
        if (!drm_mode_is_420_only(info, adjusted_mode) ||
@@@ -2281,7 -2281,7 +2281,7 @@@ bool intel_dp_limited_color_range(cons
        const struct intel_digital_connector_state *intel_conn_state =
                to_intel_digital_connector_state(conn_state);
        const struct drm_display_mode *adjusted_mode =
 -              &crtc_state->base.adjusted_mode;
 +              &crtc_state->hw.adjusted_mode;
  
        /*
         * Our YCbCr output is always limited range.
@@@ -2314,11 -2314,11 +2314,11 @@@ intel_dp_compute_config(struct intel_en
                        struct drm_connector_state *conn_state)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
 +      struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
        struct intel_lspcon *lspcon = enc_to_intel_lspcon(&encoder->base);
        enum port port = encoder->port;
 -      struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
 +      struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
        struct intel_connector *intel_connector = intel_dp->attached_connector;
        struct intel_digital_connector_state *intel_conn_state =
                to_intel_digital_connector_state(conn_state);
@@@ -2436,8 -2436,8 +2436,8 @@@ static void intel_dp_prepare(struct int
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
        enum port port = encoder->port;
 -      struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
 -      const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
 +      struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
 +      const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
  
        intel_dp_set_link_params(intel_dp, pipe_config->port_clock,
                                 pipe_config->lane_count,
@@@ -3034,7 -3034,7 +3034,7 @@@ static void assert_edp_pll(struct drm_i
  static void ironlake_edp_pll_on(struct intel_dp *intel_dp,
                                const struct intel_crtc_state *pipe_config)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
  
        assert_pipe_disabled(dev_priv, crtc->pipe);
  static void ironlake_edp_pll_off(struct intel_dp *intel_dp,
                                 const struct intel_crtc_state *old_crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
  
        assert_pipe_disabled(dev_priv, crtc->pipe);
@@@ -3234,7 -3234,7 +3234,7 @@@ static void intel_dp_get_config(struct 
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
        u32 tmp, flags = 0;
        enum port port = encoder->port;
 -      struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
  
        if (encoder->type == INTEL_OUTPUT_EDP)
                pipe_config->output_types |= BIT(INTEL_OUTPUT_EDP);
                        flags |= DRM_MODE_FLAG_NVSYNC;
        }
  
 -      pipe_config->base.adjusted_mode.flags |= flags;
 +      pipe_config->hw.adjusted_mode.flags |= flags;
  
        if (IS_G4X(dev_priv) && tmp & DP_COLOR_RANGE_16_235)
                pipe_config->limited_color_range = true;
                        pipe_config->port_clock = 270000;
        }
  
 -      pipe_config->base.adjusted_mode.crtc_clock =
 +      pipe_config->hw.adjusted_mode.crtc_clock =
                intel_dotclock_calculate(pipe_config->port_clock,
                                         &pipe_config->dp_m_n);
  
@@@ -3501,7 -3501,7 +3501,7 @@@ static void intel_enable_dp(struct inte
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 -      struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
        u32 dp_reg = I915_READ(intel_dp->output_reg);
        enum pipe pipe = crtc->pipe;
        intel_wakeref_t wakeref;
@@@ -3634,7 -3634,7 +3634,7 @@@ static void vlv_init_panel_power_sequen
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        lockdep_assert_held(&dev_priv->pps_mutex);
  
@@@ -4156,7 -4156,7 +4156,7 @@@ intel_dp_link_down(struct intel_encode
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 -      struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
        enum port port = encoder->port;
        u32 DP = intel_dp->DP;
  
@@@ -5079,7 -5079,7 +5079,7 @@@ int intel_dp_retrain_link(struct intel_
  
        WARN_ON(!intel_crtc_has_dp_encoder(crtc_state));
  
 -      if (!crtc_state->base.active)
 +      if (!crtc_state->hw.active)
                return 0;
  
        if (conn_state->commit &&
@@@ -6914,7 -6914,7 +6914,7 @@@ static void intel_dp_set_drrs_state(str
                                    int refresh_rate)
  {
        struct intel_dp *intel_dp = dev_priv->drrs.dp;
 -      struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
        enum drrs_refresh_rate_type index = DRRS_HIGH_RR;
  
        if (refresh_rate <= 0) {
                return;
        }
  
 -      if (!crtc_state->base.active) {
 +      if (!crtc_state->hw.active) {
                DRM_DEBUG_KMS("eDP encoder disabled. CRTC not Active\n");
                return;
        }
@@@ -7640,7 -7640,8 +7640,8 @@@ void intel_dp_mst_resume(struct drm_i91
                if (!intel_dp->can_mst)
                        continue;
  
-               ret = drm_dp_mst_topology_mgr_resume(&intel_dp->mst_mgr);
+               ret = drm_dp_mst_topology_mgr_resume(&intel_dp->mst_mgr,
+                                                    true);
                if (ret) {
                        intel_dp->is_mst = false;
                        drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
@@@ -42,13 -42,13 +42,13 @@@ static int intel_dp_mst_compute_link_co
                                            struct drm_connector_state *conn_state,
                                            struct link_config_limits *limits)
  {
 -      struct drm_atomic_state *state = crtc_state->base.state;
 +      struct drm_atomic_state *state = crtc_state->uapi.state;
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
        struct intel_dp *intel_dp = &intel_mst->primary->dp;
        struct intel_connector *connector =
                to_intel_connector(conn_state->connector);
        const struct drm_display_mode *adjusted_mode =
 -              &crtc_state->base.adjusted_mode;
 +              &crtc_state->hw.adjusted_mode;
        void *port = connector->port;
        bool constant_n = drm_dp_has_quirk(&intel_dp->desc,
                                           DP_DPCD_QUIRK_CONSTANT_N);
@@@ -99,7 -99,7 +99,7 @@@ static int intel_dp_mst_compute_config(
        struct intel_digital_connector_state *intel_conn_state =
                to_intel_digital_connector_state(conn_state);
        const struct drm_display_mode *adjusted_mode =
 -              &pipe_config->base.adjusted_mode;
 +              &pipe_config->hw.adjusted_mode;
        void *port = connector->port;
        struct link_config_limits limits;
        int ret;
@@@ -168,6 -168,7 +168,6 @@@ intel_dp_mst_atomic_check(struct drm_co
        struct intel_connector *intel_connector =
                to_intel_connector(connector);
        struct drm_crtc *new_crtc = new_conn_state->crtc;
 -      struct drm_crtc_state *crtc_state;
        struct drm_dp_mst_topology_mgr *mgr;
        int ret;
  
         * connector
         */
        if (new_crtc) {
 -              crtc_state = drm_atomic_get_new_crtc_state(state, new_crtc);
 +              struct intel_atomic_state *intel_state =
 +                      to_intel_atomic_state(state);
 +              struct intel_crtc *intel_crtc = to_intel_crtc(new_crtc);
 +              struct intel_crtc_state *crtc_state =
 +                      intel_atomic_get_new_crtc_state(intel_state,
 +                                                      intel_crtc);
  
                if (!crtc_state ||
 -                  !drm_atomic_crtc_needs_modeset(crtc_state) ||
 -                  crtc_state->enable)
 +                  !drm_atomic_crtc_needs_modeset(&crtc_state->uapi) ||
 +                  crtc_state->hw.enable)
                        return 0;
        }
  
@@@ -303,23 -299,21 +303,23 @@@ static void intel_mst_pre_enable_dp(str
                to_intel_connector(conn_state->connector);
        int ret;
        u32 temp;
 +      bool first_mst_stream;
  
        /* MST encoders are bound to a crtc, not to a connector,
         * force the mapping here for get_hw_state.
         */
        connector->encoder = encoder;
        intel_mst->connector = connector;
 +      first_mst_stream = intel_dp->active_mst_links == 0;
  
        DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
  
 -      if (intel_dp->active_mst_links == 0)
 +      if (first_mst_stream)
                intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
  
        drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port, true);
  
 -      if (intel_dp->active_mst_links == 0)
 +      if (first_mst_stream)
                intel_dig_port->base.pre_enable(&intel_dig_port->base,
                                                pipe_config, NULL);
  
  
        ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
  
 -      intel_ddi_enable_pipe_clock(pipe_config);
 +      /*
 +       * Before Gen 12 this is not done as part of
 +       * intel_dig_port->base.pre_enable() and should be done here. For
 +       * Gen 12+ the step in which this should be done is different for the
 +       * first MST stream, so it's done on the DDI for the first stream and
 +       * here for the following ones.
 +       */
 +      if (INTEL_GEN(dev_priv) < 12 || !first_mst_stream)
 +              intel_ddi_enable_pipe_clock(pipe_config);
  
        intel_ddi_set_dp_msa(pipe_config, conn_state);
  }
@@@ -407,20 -393,7 +407,7 @@@ static int intel_dp_mst_get_ddc_modes(s
        return ret;
  }
  
- static enum drm_connector_status
- intel_dp_mst_detect(struct drm_connector *connector, bool force)
- {
-       struct intel_connector *intel_connector = to_intel_connector(connector);
-       struct intel_dp *intel_dp = intel_connector->mst_port;
-       if (drm_connector_is_unregistered(connector))
-               return connector_status_disconnected;
-       return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr,
-                                     intel_connector->port);
- }
  static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
-       .detect = intel_dp_mst_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .atomic_get_property = intel_digital_connector_atomic_get_property,
        .atomic_set_property = intel_digital_connector_atomic_set_property,
@@@ -481,11 -454,26 +468,26 @@@ static struct drm_encoder *intel_mst_at
        return &intel_dp->mst_encoders[crtc->pipe]->base.base;
  }
  
+ static int
+ intel_dp_mst_detect(struct drm_connector *connector,
+                   struct drm_modeset_acquire_ctx *ctx, bool force)
+ {
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+       struct intel_dp *intel_dp = intel_connector->mst_port;
+       if (drm_connector_is_unregistered(connector))
+               return connector_status_disconnected;
+       return drm_dp_mst_detect_port(connector, ctx, &intel_dp->mst_mgr,
+                                     intel_connector->port);
+ }
  static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = {
        .get_modes = intel_dp_mst_get_modes,
        .mode_valid = intel_dp_mst_mode_valid,
        .atomic_best_encoder = intel_mst_atomic_best_encoder,
        .atomic_check = intel_dp_mst_atomic_check,
+       .detect_ctx = intel_dp_mst_detect,
  };
  
  static void intel_dp_mst_encoder_destroy(struct drm_encoder *encoder)
@@@ -169,44 -169,6 +169,44 @@@ lookup_user_engine(struct i915_gem_cont
        return i915_gem_context_get_engine(ctx, idx);
  }
  
 +static struct i915_address_space *
 +context_get_vm_rcu(struct i915_gem_context *ctx)
 +{
 +      GEM_BUG_ON(!rcu_access_pointer(ctx->vm));
 +
 +      do {
 +              struct i915_address_space *vm;
 +
 +              /*
 +               * We do not allow downgrading from full-ppgtt [to a shared
 +               * global gtt], so ctx->vm cannot become NULL.
 +               */
 +              vm = rcu_dereference(ctx->vm);
 +              if (!kref_get_unless_zero(&vm->ref))
 +                      continue;
 +
 +              /*
 +               * This ppgtt may have be reallocated between
 +               * the read and the kref, and reassigned to a third
 +               * context. In order to avoid inadvertent sharing
 +               * of this ppgtt with that third context (and not
 +               * src), we have to confirm that we have the same
 +               * ppgtt after passing through the strong memory
 +               * barrier implied by a successful
 +               * kref_get_unless_zero().
 +               *
 +               * Once we have acquired the current ppgtt of ctx,
 +               * we no longer care if it is released from ctx, as
 +               * it cannot be reallocated elsewhere.
 +               */
 +
 +              if (vm == rcu_access_pointer(ctx->vm))
 +                      return rcu_pointer_handoff(vm);
 +
 +              i915_vm_put(vm);
 +      } while (1);
 +}
 +
  static void __free_engines(struct i915_gem_engines *e, unsigned int count)
  {
        while (count--) {
@@@ -274,10 -236,14 +274,12 @@@ static void i915_gem_context_free(struc
        free_engines(rcu_access_pointer(ctx->engines));
        mutex_destroy(&ctx->engines_mutex);
  
+       kfree(ctx->jump_whitelist);
        if (ctx->timeline)
                intel_timeline_put(ctx->timeline);
  
 -      kfree(ctx->name);
        put_pid(ctx->pid);
 -
        mutex_destroy(&ctx->mutex);
  
        kfree_rcu(ctx, rcu);
@@@ -461,29 -427,11 +463,29 @@@ static void kill_context(struct i915_ge
        }
  }
  
 +static void set_closed_name(struct i915_gem_context *ctx)
 +{
 +      char *s;
 +
 +      /* Replace '[]' with '<>' to indicate closed in debug prints */
 +
 +      s = strrchr(ctx->name, '[');
 +      if (!s)
 +              return;
 +
 +      *s = '<';
 +
 +      s = strchr(s + 1, ']');
 +      if (s)
 +              *s = '>';
 +}
 +
  static void context_close(struct i915_gem_context *ctx)
  {
        struct i915_address_space *vm;
  
        i915_gem_context_set_closed(ctx);
 +      set_closed_name(ctx);
  
        mutex_lock(&ctx->mutex);
  
@@@ -581,6 -529,9 +583,9 @@@ __create_context(struct drm_i915_privat
        for (i = 0; i < ARRAY_SIZE(ctx->hang_timestamp); i++)
                ctx->hang_timestamp[i] = jiffies - CONTEXT_FAST_HANG_JIFFIES;
  
+       ctx->jump_whitelist = NULL;
+       ctx->jump_whitelist_cmds = 0;
        spin_lock(&i915->gem.contexts.lock);
        list_add_tail(&ctx->link, &i915->gem.contexts.list);
        spin_unlock(&i915->gem.contexts.lock);
@@@ -776,7 -727,6 +781,7 @@@ int i915_gem_init_contexts(struct drm_i
  void i915_gem_driver_release__contexts(struct drm_i915_private *i915)
  {
        destroy_kernel_context(&i915->kernel_context);
 +      flush_work(&i915->gem.contexts.free_work);
  }
  
  static int context_idr_cleanup(int id, void *p, void *data)
@@@ -806,8 -756,12 +811,8 @@@ static int gem_context_register(struct 
        mutex_unlock(&ctx->mutex);
  
        ctx->pid = get_task_pid(current, PIDTYPE_PID);
 -      ctx->name = kasprintf(GFP_KERNEL, "%s[%d]",
 -                            current->comm, pid_nr(ctx->pid));
 -      if (!ctx->name) {
 -              ret = -ENOMEM;
 -              goto err_pid;
 -      }
 +      snprintf(ctx->name, sizeof(ctx->name), "%s[%d]",
 +               current->comm, pid_nr(ctx->pid));
  
        /* And finally expose ourselves to userspace via the idr */
        mutex_lock(&fpriv->context_idr_lock);
        if (ret >= 0)
                goto out;
  
 -      kfree(fetch_and_zero(&ctx->name));
 -err_pid:
        put_pid(fetch_and_zero(&ctx->pid));
  out:
        return ret;
@@@ -1055,7 -1011,7 +1060,7 @@@ static int get_ppgtt(struct drm_i915_fi
                return -ENODEV;
  
        rcu_read_lock();
 -      vm = i915_vm_get(ctx->vm);
 +      vm = context_get_vm_rcu(ctx);
        rcu_read_unlock();
  
        ret = mutex_lock_interruptible(&file_priv->vm_idr_lock);
@@@ -2084,21 -2040,47 +2089,21 @@@ static int clone_vm(struct i915_gem_con
        struct i915_address_space *vm;
        int err = 0;
  
 -      rcu_read_lock();
 -      do {
 -              vm = rcu_dereference(src->vm);
 -              if (!vm)
 -                      break;
 -
 -              if (!kref_get_unless_zero(&vm->ref))
 -                      continue;
 -
 -              /*
 -               * This ppgtt may have be reallocated between
 -               * the read and the kref, and reassigned to a third
 -               * context. In order to avoid inadvertent sharing
 -               * of this ppgtt with that third context (and not
 -               * src), we have to confirm that we have the same
 -               * ppgtt after passing through the strong memory
 -               * barrier implied by a successful
 -               * kref_get_unless_zero().
 -               *
 -               * Once we have acquired the current ppgtt of src,
 -               * we no longer care if it is released from src, as
 -               * it cannot be reallocated elsewhere.
 -               */
 -
 -              if (vm == rcu_access_pointer(src->vm))
 -                      break;
 +      if (!rcu_access_pointer(src->vm))
 +              return 0;
  
 -              i915_vm_put(vm);
 -      } while (1);
 +      rcu_read_lock();
 +      vm = context_get_vm_rcu(src);
        rcu_read_unlock();
  
 -      if (vm) {
 -              if (!mutex_lock_interruptible(&dst->mutex)) {
 -                      __assign_ppgtt(dst, vm);
 -                      mutex_unlock(&dst->mutex);
 -              } else {
 -                      err = -EINTR;
 -              }
 -              i915_vm_put(vm);
 +      if (!mutex_lock_interruptible(&dst->mutex)) {
 +              __assign_ppgtt(dst, vm);
 +              mutex_unlock(&dst->mutex);
 +      } else {
 +              err = -EINTR;
        }
  
 +      i915_vm_put(vm);
        return err;
  }
  
@@@ -100,6 -100,15 +100,6 @@@ struct i915_gem_context 
         */
        struct pid *pid;
  
 -      /**
 -       * @name: arbitrary name
 -       *
 -       * A name is constructed for the context from the creator's process
 -       * name, pid and user handle in order to uniquely identify the
 -       * context in messages.
 -       */
 -      const char *name;
 -
        /** link: place with &drm_i915_private.context_list */
        struct list_head link;
        struct llist_node free_link;
         */
        struct radix_tree_root handles_vma;
  
+       /** jump_whitelist: Bit array for tracking cmds during cmdparsing
+        *  Guarded by struct_mutex
+        */
+       unsigned long *jump_whitelist;
+       /** jump_whitelist_cmds: No of cmd slots available */
+       u32 jump_whitelist_cmds;
++
 +      /**
 +       * @name: arbitrary name, used for user debug
 +       *
 +       * A name is constructed for the context from the creator's process
 +       * name, pid and user handle in order to uniquely identify the
 +       * context in messages.
 +       */
 +      char name[TASK_COMM_LEN + 8];
  };
  
  #endif /* __I915_GEM_CONTEXT_TYPES_H__ */
@@@ -88,12 -88,15 +88,12 @@@ static void gen11_rc6_enable(struct int
         * do not want the enable hysteresis to less than the wakeup latency.
         *
         * igt/gem_exec_nop/sequential provides a rough estimate for the
 -       * service latency, and puts it around 10us for Broadwell (and other
 -       * big core) and around 40us for Broxton (and other low power cores).
 -       * [Note that for legacy ringbuffer submission, this is less than 1us!]
 -       * However, the wakeup latency on Broxton is closer to 100us. To be
 -       * conservative, we have to factor in a context switch on top (due
 -       * to ksoftirqd).
 +       * service latency, and puts it under 10us for Icelake, similar to
 +       * Broadwell+, To be conservative, we want to factor in a context
 +       * switch on top (due to ksoftirqd).
         */
 -      set(uncore, GEN9_MEDIA_PG_IDLE_HYSTERESIS, 250);
 -      set(uncore, GEN9_RENDER_PG_IDLE_HYSTERESIS, 250);
 +      set(uncore, GEN9_MEDIA_PG_IDLE_HYSTERESIS, 60);
 +      set(uncore, GEN9_RENDER_PG_IDLE_HYSTERESIS, 60);
  
        /* 3a: Enable RC6 */
        set(uncore, GEN6_RC_CONTROL,
@@@ -175,13 -178,8 +175,13 @@@ static void gen9_rc6_enable(struct inte
            GEN6_RC_CTL_RC6_ENABLE |
            rc6_mode);
  
 -      set(uncore, GEN9_PG_ENABLE,
 -          GEN9_RENDER_PG_ENABLE | GEN9_MEDIA_PG_ENABLE);
 +      /*
 +       * WaRsDisableCoarsePowerGating:skl,cnl
 +       *   - Render/Media PG need to be disabled with RC6.
 +       */
 +      if (!NEEDS_WaRsDisableCoarsePowerGating(rc6_to_i915(rc6)))
 +              set(uncore, GEN9_PG_ENABLE,
 +                  GEN9_RENDER_PG_ENABLE | GEN9_MEDIA_PG_ENABLE);
  }
  
  static void gen8_rc6_enable(struct intel_rc6 *rc6)
@@@ -488,6 -486,66 +488,66 @@@ static void rpm_put(struct intel_rc6 *r
        rc6->wakeref = false;
  }
  
+ static bool intel_rc6_ctx_corrupted(struct intel_rc6 *rc6)
+ {
+       return !intel_uncore_read(rc6_to_uncore(rc6), GEN8_RC6_CTX_INFO);
+ }
+ static void intel_rc6_ctx_wa_init(struct intel_rc6 *rc6)
+ {
+       struct drm_i915_private *i915 = rc6_to_i915(rc6);
+       if (!NEEDS_RC6_CTX_CORRUPTION_WA(i915))
+               return;
+       if (intel_rc6_ctx_corrupted(rc6)) {
+               DRM_INFO("RC6 context corrupted, disabling runtime power management\n");
+               rc6->ctx_corrupted = true;
+       }
+ }
+ /**
+  * intel_rc6_ctx_wa_resume - system resume sequence for the RC6 CTX WA
+  * @rc6: rc6 state
+  *
+  * Perform any steps needed to re-init the RC6 CTX WA after system resume.
+  */
+ void intel_rc6_ctx_wa_resume(struct intel_rc6 *rc6)
+ {
+       if (rc6->ctx_corrupted && !intel_rc6_ctx_corrupted(rc6)) {
+               DRM_INFO("RC6 context restored, re-enabling runtime power management\n");
+               rc6->ctx_corrupted = false;
+       }
+ }
+ /**
+  * intel_rc6_ctx_wa_check - check for a new RC6 CTX corruption
+  * @rc6: rc6 state
+  *
+  * Check if an RC6 CTX corruption has happened since the last check and if so
+  * disable RC6 and runtime power management.
+ */
+ void intel_rc6_ctx_wa_check(struct intel_rc6 *rc6)
+ {
+       struct drm_i915_private *i915 = rc6_to_i915(rc6);
+       if (!NEEDS_RC6_CTX_CORRUPTION_WA(i915))
+               return;
+       if (rc6->ctx_corrupted)
+               return;
+       if (!intel_rc6_ctx_corrupted(rc6))
+               return;
+       DRM_NOTE("RC6 context corruption, disabling runtime power management\n");
+       intel_rc6_disable(rc6);
+       rc6->ctx_corrupted = true;
+       return;
+ }
  static void __intel_rc6_disable(struct intel_rc6 *rc6)
  {
        struct drm_i915_private *i915 = rc6_to_i915(rc6);
@@@ -512,6 -570,8 +572,8 @@@ void intel_rc6_init(struct intel_rc6 *r
        if (!rc6_supported(rc6))
                return;
  
+       intel_rc6_ctx_wa_init(rc6);
        if (IS_CHERRYVIEW(i915))
                err = chv_rc6_init(rc6);
        else if (IS_VALLEYVIEW(i915))
@@@ -546,6 -606,9 +608,9 @@@ void intel_rc6_enable(struct intel_rc6 
  
        GEM_BUG_ON(rc6->enabled);
  
+       if (rc6->ctx_corrupted)
+               return;
        intel_uncore_forcewake_get(uncore, FORCEWAKE_ALL);
  
        if (IS_CHERRYVIEW(i915))
@@@ -63,6 -63,7 +63,7 @@@
  #include "gem/i915_gem_ioctls.h"
  #include "gt/intel_gt.h"
  #include "gt/intel_gt_pm.h"
+ #include "gt/intel_rc6.h"
  
  #include "i915_debugfs.h"
  #include "i915_drv.h"
@@@ -296,6 -297,9 +297,6 @@@ static int i915_driver_modeset_probe(st
        if (ret)
                goto cleanup_vga_client;
  
 -      /* must happen before intel_power_domains_init_hw() on VLV/CHV */
 -      intel_update_rawclk(i915);
 -
        intel_power_domains_init_hw(i915, false);
  
        intel_csr_ucode_init(i915);
@@@ -1816,6 -1820,8 +1817,8 @@@ static int i915_drm_resume(struct drm_d
  
        disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
+       intel_rc6_ctx_wa_resume(&dev_priv->gt.rc6);
        intel_gt_sanitize(&dev_priv->gt, true);
  
        ret = i915_ggtt_enable_hw(dev_priv);
@@@ -2781,3 -2787,7 +2784,3 @@@ static struct drm_driver driver = 
        .minor = DRIVER_MINOR,
        .patchlevel = DRIVER_PATCHLEVEL,
  };
 -
 -#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
 -#include "selftests/mock_drm.c"
 -#endif
@@@ -627,9 -627,13 +627,9 @@@ struct ddi_vbt_port_info 
  
        int max_tmds_clock;
  
 -      /*
 -       * This is an index in the HDMI/DVI DDI buffer translation table.
 -       * The special value HDMI_LEVEL_SHIFT_UNKNOWN means the VBT didn't
 -       * populate this field.
 -       */
 -#define HDMI_LEVEL_SHIFT_UNKNOWN      0xff
 +      /* This is an index in the HDMI/DVI DDI buffer translation table. */
        u8 hdmi_level_shift;
 +      u8 hdmi_level_shift_set:1;
  
        u8 supports_dvi:1;
        u8 supports_hdmi:1;
@@@ -720,7 -724,8 +720,7 @@@ struct intel_vbt_data 
  
        int crt_ddc_pin;
  
 -      int child_dev_num;
 -      struct child_device_config *child_dev;
 +      struct list_head display_devices;
  
        struct ddi_vbt_port_info ddi_port_info[I915_MAX_PORTS];
        struct sdvo_device_mapping sdvo_mappings[2];
@@@ -886,10 -891,6 +886,10 @@@ struct intel_cdclk_state 
        u8 voltage_level;
  };
  
 +struct i915_selftest_stash {
 +      atomic_t counter;
 +};
 +
  struct drm_i915_private {
        struct drm_device drm;
  
        struct intel_gt gt;
  
        struct {
 -              struct notifier_block pm_notifier;
 -
                struct i915_gem_contexts {
                        spinlock_t lock; /* locks list */
                        struct list_head list;
        /* Mutex to protect the above hdcp component related values. */
        struct mutex hdcp_comp_mutex;
  
 +      I915_SELFTEST_DECLARE(struct i915_selftest_stash selftest;)
 +
        /*
         * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
         * will be rejected. Instead look for a better place.
@@@ -1613,9 -1614,16 +1613,16 @@@ IS_SUBPLATFORM(const struct drm_i915_pr
  #define VEBOX_MASK(dev_priv) \
        ENGINE_INSTANCES_MASK(dev_priv, VECS0, I915_MAX_VECS)
  
+ /*
+  * The Gen7 cmdparser copies the scanned buffer to the ggtt for execution
+  * All later gens can run the final buffer from the ppgtt
+  */
+ #define CMDPARSER_USES_GGTT(dev_priv) IS_GEN(dev_priv, 7)
  #define HAS_LLC(dev_priv)     (INTEL_INFO(dev_priv)->has_llc)
  #define HAS_SNOOP(dev_priv)   (INTEL_INFO(dev_priv)->has_snoop)
  #define HAS_EDRAM(dev_priv)   ((dev_priv)->edram_size_mb)
+ #define HAS_SECURE_BATCHES(dev_priv) (INTEL_GEN(dev_priv) < 6)
  #define HAS_WT(dev_priv)      ((IS_HASWELL(dev_priv) || \
                                 IS_BROADWELL(dev_priv)) && HAS_EDRAM(dev_priv))
  
  /* Early gen2 have a totally busted CS tlb and require pinned batches. */
  #define HAS_BROKEN_CS_TLB(dev_priv)   (IS_I830(dev_priv) || IS_I845G(dev_priv))
  
+ #define NEEDS_RC6_CTX_CORRUPTION_WA(dev_priv) \
+       (IS_BROADWELL(dev_priv) || IS_GEN(dev_priv, 9))
  /* WaRsDisableCoarsePowerGating:skl,cnl */
  #define NEEDS_WaRsDisableCoarsePowerGating(dev_priv) \
-       (IS_CANNONLAKE(dev_priv) || \
-        IS_SKL_GT3(dev_priv) || IS_SKL_GT4(dev_priv))
+       (IS_CANNONLAKE(dev_priv) || IS_GEN(dev_priv, 9))
  
  #define HAS_GMBUS_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4)
  #define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \
@@@ -1833,6 -1843,14 +1842,14 @@@ int i915_gem_object_unbind(struct drm_i
                           unsigned long flags);
  #define I915_GEM_OBJECT_UNBIND_ACTIVE BIT(0)
  
+ struct i915_vma * __must_check
+ i915_gem_object_pin(struct drm_i915_gem_object *obj,
+                   struct i915_address_space *vm,
+                   const struct i915_ggtt_view *view,
+                   u64 size,
+                   u64 alignment,
+                   u64 flags);
  void i915_gem_runtime_suspend(struct drm_i915_private *dev_priv);
  
  static inline int __must_check
@@@ -1938,12 -1956,14 +1955,14 @@@ const char *i915_cache_level_str(struc
  int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv);
  void intel_engine_init_cmd_parser(struct intel_engine_cs *engine);
  void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine);
- int intel_engine_cmd_parser(struct intel_engine_cs *engine,
+ int intel_engine_cmd_parser(struct i915_gem_context *cxt,
+                           struct intel_engine_cs *engine,
                            struct drm_i915_gem_object *batch_obj,
-                           struct drm_i915_gem_object *shadow_batch_obj,
+                           u64 user_batch_start,
                            u32 batch_start_offset,
                            u32 batch_len,
-                           bool is_master);
+                           struct drm_i915_gem_object *shadow_batch_obj,
+                           u64 shadow_batch_start);
  
  /* intel_device_info.c */
  static inline struct intel_device_info *
@@@ -893,6 -893,20 +893,20 @@@ i915_gem_object_ggtt_pin(struct drm_i91
  {
        struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
        struct i915_address_space *vm = &dev_priv->ggtt.vm;
+       return i915_gem_object_pin(obj, vm, view, size, alignment,
+                                  flags | PIN_GLOBAL);
+ }
+ struct i915_vma *
+ i915_gem_object_pin(struct drm_i915_gem_object *obj,
+                   struct i915_address_space *vm,
+                   const struct i915_ggtt_view *view,
+                   u64 size,
+                   u64 alignment,
+                   u64 flags)
+ {
+       struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
        struct i915_vma *vma;
        int ret;
  
                        return ERR_PTR(ret);
        }
  
-       ret = i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
+       ret = i915_vma_pin(vma, size, alignment, flags);
        if (ret)
                return ERR_PTR(ret);
  
@@@ -1195,6 -1209,8 +1209,6 @@@ int i915_gem_init(struct drm_i915_priva
                mkwrite_device_info(dev_priv)->page_sizes =
                        I915_GTT_PAGE_SIZE_4K;
  
 -      intel_timelines_init(dev_priv);
 -
        ret = i915_gem_init_userptr(dev_priv);
        if (ret)
                return ret;
@@@ -1308,6 -1324,7 +1322,6 @@@ err_unlock
        if (ret != -EIO) {
                intel_uc_cleanup_firmwares(&dev_priv->gt.uc);
                i915_gem_cleanup_userptr(dev_priv);
 -              intel_timelines_fini(dev_priv);
        }
  
        if (ret == -EIO) {
@@@ -1371,6 -1388,7 +1385,6 @@@ void i915_gem_driver_release(struct drm
  
        intel_uc_cleanup_firmwares(&dev_priv->gt.uc);
        i915_gem_cleanup_userptr(dev_priv);
 -      intel_timelines_fini(dev_priv);
  
        i915_gem_drain_freed_objects(dev_priv);
  
@@@ -474,6 -474,8 +474,8 @@@ static inline bool i915_mmio_reg_valid(
  #define   ECOCHK_PPGTT_WT_HSW         (0x2 << 3)
  #define   ECOCHK_PPGTT_WB_HSW         (0x3 << 3)
  
+ #define GEN8_RC6_CTX_INFO             _MMIO(0x8504)
  #define GAC_ECO_BITS                  _MMIO(0x14090)
  #define   ECOBITS_SNB_BIT             (1 << 13)
  #define   ECOBITS_PPGTT_CACHE64B      (3 << 8)
   */
  #define BCS_SWCTRL _MMIO(0x22200)
  
+ /* There are 16 GPR registers */
+ #define BCS_GPR(n)    _MMIO(0x22600 + (n) * 8)
+ #define BCS_GPR_UDW(n)        _MMIO(0x22600 + (n) * 8 + 4)
  #define GPGPU_THREADS_DISPATCHED        _MMIO(0x2290)
  #define GPGPU_THREADS_DISPATCHED_UDW  _MMIO(0x2290 + 4)
  #define HS_INVOCATION_COUNT             _MMIO(0x2300)
@@@ -5036,20 -5042,14 +5042,20 @@@ enum 
  #define   BLM_PCH_POLARITY                    (1 << 29)
  #define BLC_PWM_PCH_CTL2      _MMIO(0xc8254)
  
 -#define UTIL_PIN_CTL          _MMIO(0x48400)
 -#define   UTIL_PIN_ENABLE     (1 << 31)
 -
 -#define   UTIL_PIN_PIPE(x)     ((x) << 29)
 -#define   UTIL_PIN_PIPE_MASK   (3 << 29)
 -#define   UTIL_PIN_MODE_PWM    (1 << 24)
 -#define   UTIL_PIN_MODE_MASK   (0xf << 24)
 -#define   UTIL_PIN_POLARITY    (1 << 22)
 +#define UTIL_PIN_CTL                  _MMIO(0x48400)
 +#define   UTIL_PIN_ENABLE             (1 << 31)
 +#define   UTIL_PIN_PIPE_MASK          (3 << 29)
 +#define   UTIL_PIN_PIPE(x)            ((x) << 29)
 +#define   UTIL_PIN_MODE_MASK          (0xf << 24)
 +#define   UTIL_PIN_MODE_DATA          (0 << 24)
 +#define   UTIL_PIN_MODE_PWM           (1 << 24)
 +#define   UTIL_PIN_MODE_VBLANK                (4 << 24)
 +#define   UTIL_PIN_MODE_VSYNC         (5 << 24)
 +#define   UTIL_PIN_MODE_EYE_LEVEL     (8 << 24)
 +#define   UTIL_PIN_OUTPUT_DATA                (1 << 23)
 +#define   UTIL_PIN_POLARITY           (1 << 22)
 +#define   UTIL_PIN_DIRECTION_INPUT    (1 << 19)
 +#define   UTIL_PIN_INPUT_DATA         (1 << 16)
  
  /* BXT backlight register definition. */
  #define _BXT_BLC_PWM_CTL1                     0xC8250
  #define   DISPPLANE_RGBX101010                        (0x8 << 26)
  #define   DISPPLANE_RGBA101010                        (0x9 << 26)
  #define   DISPPLANE_BGRX101010                        (0xa << 26)
 +#define   DISPPLANE_BGRA101010                        (0xb << 26)
  #define   DISPPLANE_RGBX161616                        (0xc << 26)
  #define   DISPPLANE_RGBX888                   (0xe << 26)
  #define   DISPPLANE_RGBA888                   (0xf << 26)
  #define   SP_ENABLE                   (1 << 31)
  #define   SP_GAMMA_ENABLE             (1 << 30)
  #define   SP_PIXFORMAT_MASK           (0xf << 26)
 -#define   SP_FORMAT_YUV422            (0 << 26)
 -#define   SP_FORMAT_BGR565            (5 << 26)
 -#define   SP_FORMAT_BGRX8888          (6 << 26)
 -#define   SP_FORMAT_BGRA8888          (7 << 26)
 -#define   SP_FORMAT_RGBX1010102               (8 << 26)
 -#define   SP_FORMAT_RGBA1010102               (9 << 26)
 +#define   SP_FORMAT_YUV422            (0x0 << 26)
 +#define   SP_FORMAT_8BPP              (0x2 << 26)
 +#define   SP_FORMAT_BGR565            (0x5 << 26)
 +#define   SP_FORMAT_BGRX8888          (0x6 << 26)
 +#define   SP_FORMAT_BGRA8888          (0x7 << 26)
 +#define   SP_FORMAT_RGBX1010102               (0x8 << 26)
 +#define   SP_FORMAT_RGBA1010102               (0x9 << 26)
 +#define   SP_FORMAT_BGRX1010102               (0xa << 26) /* CHV pipe B */
 +#define   SP_FORMAT_BGRA1010102               (0xb << 26) /* CHV pipe B */
  #define   SP_FORMAT_RGBX8888          (0xe << 26)
  #define   SP_FORMAT_RGBA8888          (0xf << 26)
  #define   SP_ALPHA_PREMULTIPLY                (1 << 23) /* CHV pipe B */
  
  #define DMC_DEBUG3            _MMIO(0x101090)
  
+ /* Display Internal Timeout Register */
+ #define RM_TIMEOUT            _MMIO(0x42060)
+ #define  MMIO_TIMEOUT_US(us)  ((us) << 0)
  /* interrupts */
  #define DE_MASTER_IRQ_CONTROL   (1 << 31)
  #define DE_SPRITEB_FLIP_DONE    (1 << 29)
  #define GEN8_DE_PORT_IMR _MMIO(0x44444)
  #define GEN8_DE_PORT_IIR _MMIO(0x44448)
  #define GEN8_DE_PORT_IER _MMIO(0x4444c)
 +#define  DSI1_NON_TE                  (1 << 31)
 +#define  DSI0_NON_TE                  (1 << 30)
  #define  ICL_AUX_CHANNEL_E            (1 << 29)
  #define  CNL_AUX_CHANNEL_F            (1 << 28)
  #define  GEN9_AUX_CHANNEL_D           (1 << 27)
  #define  GEN9_AUX_CHANNEL_C           (1 << 26)
  #define  GEN9_AUX_CHANNEL_B           (1 << 25)
 +#define  DSI1_TE                      (1 << 24)
 +#define  DSI0_TE                      (1 << 23)
  #define  BXT_DE_PORT_HP_DDIC          (1 << 5)
  #define  BXT_DE_PORT_HP_DDIB          (1 << 4)
  #define  BXT_DE_PORT_HP_DDIA          (1 << 3)
@@@ -9675,8 -9671,7 +9685,8 @@@ enum skl_power_gate 
  #define  TRANS_DDI_EDP_INPUT_A_ONOFF  (4 << 12)
  #define  TRANS_DDI_EDP_INPUT_B_ONOFF  (5 << 12)
  #define  TRANS_DDI_EDP_INPUT_C_ONOFF  (6 << 12)
 -#define  TRANS_DDI_MST_TRANSPORT_SELECT_MASK  REG_GENMASK(12, 10)
 +#define  TRANS_DDI_EDP_INPUT_D_ONOFF  (7 << 12)
 +#define  TRANS_DDI_MST_TRANSPORT_SELECT_MASK  REG_GENMASK(11, 10)
  #define  TRANS_DDI_MST_TRANSPORT_SELECT(trans)        \
        REG_FIELD_PREP(TRANS_DDI_MST_TRANSPORT_SELECT_MASK, trans)
  #define  TRANS_DDI_HDCP_SIGNALLING    (1 << 9)
  #define  ICL_ESC_CLK_DIV_SHIFT                        0
  #define DSI_MAX_ESC_CLK                       20000           /* in KHz */
  
 +#define _DSI_CMD_FRMCTL_0             0x6b034
 +#define _DSI_CMD_FRMCTL_1             0x6b834
 +#define DSI_CMD_FRMCTL(port)          _MMIO_PORT(port,        \
 +                                                 _DSI_CMD_FRMCTL_0,\
 +                                                 _DSI_CMD_FRMCTL_1)
 +#define   DSI_FRAME_UPDATE_REQUEST            (1 << 31)
 +#define   DSI_PERIODIC_FRAME_UPDATE_ENABLE    (1 << 29)
 +#define   DSI_NULL_PACKET_ENABLE              (1 << 28)
 +#define   DSI_FRAME_IN_PROGRESS                       (1 << 0)
 +
 +#define _DSI_INTR_MASK_REG_0          0x6b070
 +#define _DSI_INTR_MASK_REG_1          0x6b870
 +#define DSI_INTR_MASK_REG(port)               _MMIO_PORT(port,        \
 +                                                 _DSI_INTR_MASK_REG_0,\
 +                                                 _DSI_INTR_MASK_REG_1)
 +
 +#define _DSI_INTR_IDENT_REG_0         0x6b074
 +#define _DSI_INTR_IDENT_REG_1         0x6b874
 +#define DSI_INTR_IDENT_REG(port)      _MMIO_PORT(port,        \
 +                                                 _DSI_INTR_IDENT_REG_0,\
 +                                                 _DSI_INTR_IDENT_REG_1)
 +#define   DSI_TE_EVENT                                (1 << 31)
 +#define   DSI_RX_DATA_OR_BTA_TERMINATED               (1 << 30)
 +#define   DSI_TX_DATA                         (1 << 29)
 +#define   DSI_ULPS_ENTRY_DONE                 (1 << 28)
 +#define   DSI_NON_TE_TRIGGER_RECEIVED         (1 << 27)
 +#define   DSI_HOST_CHKSUM_ERROR                       (1 << 26)
 +#define   DSI_HOST_MULTI_ECC_ERROR            (1 << 25)
 +#define   DSI_HOST_SINGL_ECC_ERROR            (1 << 24)
 +#define   DSI_HOST_CONTENTION_DETECTED                (1 << 23)
 +#define   DSI_HOST_FALSE_CONTROL_ERROR                (1 << 22)
 +#define   DSI_HOST_TIMEOUT_ERROR              (1 << 21)
 +#define   DSI_HOST_LOW_POWER_TX_SYNC_ERROR    (1 << 20)
 +#define   DSI_HOST_ESCAPE_MODE_ENTRY_ERROR    (1 << 19)
 +#define   DSI_FRAME_UPDATE_DONE                       (1 << 16)
 +#define   DSI_PROTOCOL_VIOLATION_REPORTED     (1 << 15)
 +#define   DSI_INVALID_TX_LENGTH                       (1 << 13)
 +#define   DSI_INVALID_VC                      (1 << 12)
 +#define   DSI_INVALID_DATA_TYPE                       (1 << 11)
 +#define   DSI_PERIPHERAL_CHKSUM_ERROR         (1 << 10)
 +#define   DSI_PERIPHERAL_MULTI_ECC_ERROR      (1 << 9)
 +#define   DSI_PERIPHERAL_SINGLE_ECC_ERROR     (1 << 8)
 +#define   DSI_PERIPHERAL_CONTENTION_DETECTED  (1 << 7)
 +#define   DSI_PERIPHERAL_FALSE_CTRL_ERROR     (1 << 6)
 +#define   DSI_PERIPHERAL_TIMEOUT_ERROR                (1 << 5)
 +#define   DSI_PERIPHERAL_LP_TX_SYNC_ERROR     (1 << 4)
 +#define   DSI_PERIPHERAL_ESC_MODE_ENTRY_CMD_ERR       (1 << 3)
 +#define   DSI_EOT_SYNC_ERROR                  (1 << 2)
 +#define   DSI_SOT_SYNC_ERROR                  (1 << 1)
 +#define   DSI_SOT_ERROR                               (1 << 0)
 +
  /* Gen4+ Timestamp and Pipe Frame time stamp registers */
  #define GEN4_TIMESTAMP                _MMIO(0x2358)
  #define ILK_TIMESTAMP_HI      _MMIO(0x70070)
  #define  CMD_MODE_TE_GATE             (0x1 << 28)
  #define  VIDEO_MODE_SYNC_EVENT                (0x2 << 28)
  #define  VIDEO_MODE_SYNC_PULSE                (0x3 << 28)
 +#define  TE_SOURCE_GPIO                       (1 << 27)
  #define  LINK_READY                   (1 << 20)
  #define  PIX_FMT_MASK                 (0x3 << 16)
  #define  PIX_FMT_SHIFT                        16
  /* MOCS (Memory Object Control State) registers */
  #define GEN9_LNCFCMOCS(i)     _MMIO(0xb020 + (i) * 4) /* L3 Cache Control */
  
 -#define GEN9_GFX_MOCS(i)      _MMIO(0xc800 + (i) * 4) /* Graphics MOCS registers */
 -#define GEN9_MFX0_MOCS(i)     _MMIO(0xc900 + (i) * 4) /* Media 0 MOCS registers */
 -#define GEN9_MFX1_MOCS(i)     _MMIO(0xca00 + (i) * 4) /* Media 1 MOCS registers */
 -#define GEN9_VEBOX_MOCS(i)    _MMIO(0xcb00 + (i) * 4) /* Video MOCS registers */
 -#define GEN9_BLT_MOCS(i)      _MMIO(0xcc00 + (i) * 4) /* Blitter MOCS registers */
 -/* Media decoder 2 MOCS registers */
 -#define GEN11_MFX2_MOCS(i)    _MMIO(0x10000 + (i) * 4)
 +#define __GEN9_RCS0_MOCS0     0xc800
 +#define GEN9_GFX_MOCS(i)      _MMIO(__GEN9_RCS0_MOCS0 + (i) * 4)
 +#define __GEN9_VCS0_MOCS0     0xc900
 +#define GEN9_MFX0_MOCS(i)     _MMIO(__GEN9_VCS0_MOCS0 + (i) * 4)
 +#define __GEN9_VCS1_MOCS0     0xca00
 +#define GEN9_MFX1_MOCS(i)     _MMIO(__GEN9_VCS1_MOCS0 + (i) * 4)
 +#define __GEN9_VECS0_MOCS0    0xcb00
 +#define GEN9_VEBOX_MOCS(i)    _MMIO(__GEN9_VECS0_MOCS0 + (i) * 4)
 +#define __GEN9_BCS0_MOCS0     0xcc00
 +#define GEN9_BLT_MOCS(i)      _MMIO(__GEN9_BCS0_MOCS0 + (i) * 4)
 +#define __GEN11_VCS2_MOCS0    0x10000
 +#define GEN11_MFX2_MOCS(i)    _MMIO(__GEN11_VCS2_MOCS0 + (i) * 4)
  
  #define GEN10_SCRATCH_LNCF2           _MMIO(0xb0a0)
  #define   PMFLUSHDONE_LNICRSDROP      (1 << 20)
@@@ -107,6 -107,14 +107,14 @@@ static void bxt_init_clock_gating(struc
         */
        I915_WRITE(GEN9_CLKGATE_DIS_0, I915_READ(GEN9_CLKGATE_DIS_0) |
                   PWM1_GATING_DIS | PWM2_GATING_DIS);
+       /*
+        * Lower the display internal timeout.
+        * This is needed to avoid any hard hangs when DSI port PLL
+        * 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));
  }
  
  static void glk_init_clock_gating(struct drm_i915_private *dev_priv)
@@@ -455,7 -463,7 +463,7 @@@ static const int pessimal_latency_ns = 
  
  static void vlv_get_fifo_size(struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct vlv_fifo_state *fifo_state = &crtc_state->wm.vlv.fifo_state;
        enum pipe pipe = crtc->pipe;
@@@ -786,10 -794,10 +794,10 @@@ static int intel_wm_num_levels(struct d
  static bool intel_wm_plane_visible(const struct intel_crtc_state *crtc_state,
                                   const struct intel_plane_state *plane_state)
  {
 -      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 +      struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
  
        /* FIXME check the 'enable' instead */
 -      if (!crtc_state->base.active)
 +      if (!crtc_state->hw.active)
                return false;
  
        /*
         * around this problem with the watermark code.
         */
        if (plane->id == PLANE_CURSOR)
 -              return plane_state->base.fb != NULL;
 +              return plane_state->hw.fb != NULL;
        else
 -              return plane_state->base.visible;
 +              return plane_state->uapi.visible;
  }
  
  static struct intel_crtc *single_enabled_crtc(struct drm_i915_private *dev_priv)
@@@ -842,7 -850,7 +850,7 @@@ static void pineview_update_wm(struct i
        crtc = single_enabled_crtc(dev_priv);
        if (crtc) {
                const struct drm_display_mode *adjusted_mode =
 -                      &crtc->config->base.adjusted_mode;
 +                      &crtc->config->hw.adjusted_mode;
                const struct drm_framebuffer *fb =
                        crtc->base.primary->state->fb;
                int cpp = fb->format->cpp[0];
@@@ -1075,10 -1083,10 +1083,10 @@@ static u16 g4x_compute_wm(const struct 
                          const struct intel_plane_state *plane_state,
                          int level)
  {
 -      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 +      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_display_mode *adjusted_mode =
 -              &crtc_state->base.adjusted_mode;
 +              &crtc_state->hw.adjusted_mode;
        unsigned int latency = dev_priv->wm.pri_latency[level] * 10;
        unsigned int clock, htotal, cpp, width, wm;
  
        if (!intel_wm_plane_visible(crtc_state, plane_state))
                return 0;
  
 -      cpp = plane_state->base.fb->format->cpp[0];
 +      cpp = plane_state->hw.fb->format->cpp[0];
  
        /*
         * Not 100% sure which way ELK should go here as the
        clock = adjusted_mode->crtc_clock;
        htotal = adjusted_mode->crtc_htotal;
  
 -      width = drm_rect_width(&plane_state->base.dst);
 +      width = drm_rect_width(&plane_state->uapi.dst);
  
        if (plane->id == PLANE_CURSOR) {
                wm = intel_wm_method2(clock, htotal, width, cpp, latency);
  static bool g4x_raw_plane_wm_set(struct intel_crtc_state *crtc_state,
                                 int level, enum plane_id plane_id, u16 value)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        bool dirty = false;
  
        for (; level < intel_wm_num_levels(dev_priv); level++) {
  static bool g4x_raw_fbc_wm_set(struct intel_crtc_state *crtc_state,
                               int level, u16 value)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        bool dirty = false;
  
        /* NORMAL level doesn't have an FBC watermark */
@@@ -1174,7 -1182,7 +1182,7 @@@ static u32 ilk_compute_fbc_wm(const str
  static bool g4x_raw_plane_wm_compute(struct intel_crtc_state *crtc_state,
                                     const struct intel_plane_state *plane_state)
  {
 -      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 +      struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
        int num_levels = intel_wm_num_levels(to_i915(plane->base.dev));
        enum plane_id plane_id = plane->id;
        bool dirty = false;
@@@ -1253,7 -1261,7 +1261,7 @@@ static bool g4x_raw_plane_wm_is_valid(c
  static bool g4x_raw_crtc_wm_is_valid(const struct intel_crtc_state *crtc_state,
                                     int level)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
  
        if (level > dev_priv->wm.max_level)
                return false;
@@@ -1291,9 -1299,9 +1299,9 @@@ static void g4x_invalidate_wms(struct i
  
  static int g4x_compute_pipe_wm(struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct intel_atomic_state *state =
 -              to_intel_atomic_state(crtc_state->base.state);
 +              to_intel_atomic_state(crtc_state->uapi.state);
        struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal;
        int num_active_planes = hweight8(crtc_state->active_planes &
                                         ~BIT(PLANE_CURSOR));
        for_each_oldnew_intel_plane_in_state(state, plane,
                                             old_plane_state,
                                             new_plane_state, i) {
 -              if (new_plane_state->base.crtc != &crtc->base &&
 -                  old_plane_state->base.crtc != &crtc->base)
 +              if (new_plane_state->hw.crtc != &crtc->base &&
 +                  old_plane_state->hw.crtc != &crtc->base)
                        continue;
  
                if (g4x_raw_plane_wm_compute(crtc_state, new_plane_state))
  
  static int g4x_compute_intermediate_wm(struct intel_crtc_state *new_crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
        struct g4x_wm_state *intermediate = &new_crtc_state->wm.g4x.intermediate;
        const struct g4x_wm_state *optimal = &new_crtc_state->wm.g4x.optimal;
        struct intel_atomic_state *intel_state =
 -              to_intel_atomic_state(new_crtc_state->base.state);
 +              to_intel_atomic_state(new_crtc_state->uapi.state);
        const struct intel_crtc_state *old_crtc_state =
                intel_atomic_get_old_crtc_state(intel_state, crtc);
        const struct g4x_wm_state *active = &old_crtc_state->wm.g4x.optimal;
        enum plane_id plane_id;
  
 -      if (!new_crtc_state->base.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->base)) {
 +      if (!new_crtc_state->hw.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) {
                *intermediate = *optimal;
  
                intermediate->cxsr = false;
@@@ -1522,8 -1530,8 +1530,8 @@@ static void g4x_program_watermarks(stru
  static void g4x_initial_watermarks(struct intel_atomic_state *state,
                                   struct intel_crtc_state *crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        mutex_lock(&dev_priv->wm.wm_mutex);
        crtc->wm.active.g4x = crtc_state->wm.g4x.intermediate;
  static void g4x_optimize_watermarks(struct intel_atomic_state *state,
                                    struct intel_crtc_state *crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        if (!crtc_state->wm.need_postvbl_update)
                return;
@@@ -1581,10 -1589,10 +1589,10 @@@ static u16 vlv_compute_wm_level(const s
                                const struct intel_plane_state *plane_state,
                                int level)
  {
 -      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 +      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_display_mode *adjusted_mode =
 -              &crtc_state->base.adjusted_mode;
 +              &crtc_state->hw.adjusted_mode;
        unsigned int clock, htotal, cpp, width, wm;
  
        if (dev_priv->wm.pri_latency[level] == 0)
        if (!intel_wm_plane_visible(crtc_state, plane_state))
                return 0;
  
 -      cpp = plane_state->base.fb->format->cpp[0];
 +      cpp = plane_state->hw.fb->format->cpp[0];
        clock = adjusted_mode->crtc_clock;
        htotal = adjusted_mode->crtc_htotal;
        width = crtc_state->pipe_src_w;
@@@ -1622,7 -1630,7 +1630,7 @@@ static bool vlv_need_sprite0_fifo_worka
  
  static int vlv_compute_fifo(struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        const struct g4x_pipe_wm *raw =
                &crtc_state->wm.vlv.raw[VLV_WM_LEVEL_PM2];
        struct vlv_fifo_state *fifo_state = &crtc_state->wm.vlv.fifo_state;
@@@ -1734,7 -1742,7 +1742,7 @@@ static u16 vlv_invert_wm_value(u16 wm, 
  static bool vlv_raw_plane_wm_set(struct intel_crtc_state *crtc_state,
                                 int level, enum plane_id plane_id, u16 value)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        int num_levels = intel_wm_num_levels(dev_priv);
        bool dirty = false;
  
  static bool vlv_raw_plane_wm_compute(struct intel_crtc_state *crtc_state,
                                     const struct intel_plane_state *plane_state)
  {
 -      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 +      struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
        enum plane_id plane_id = plane->id;
        int num_levels = intel_wm_num_levels(to_i915(plane->base.dev));
        int level;
@@@ -1809,16 -1817,16 +1817,16 @@@ static bool vlv_raw_crtc_wm_is_valid(co
  
  static int vlv_compute_pipe_wm(struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct intel_atomic_state *state =
 -              to_intel_atomic_state(crtc_state->base.state);
 +              to_intel_atomic_state(crtc_state->uapi.state);
        struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal;
        const struct vlv_fifo_state *fifo_state =
                &crtc_state->wm.vlv.fifo_state;
        int num_active_planes = hweight8(crtc_state->active_planes &
                                         ~BIT(PLANE_CURSOR));
 -      bool needs_modeset = drm_atomic_crtc_needs_modeset(&crtc_state->base);
 +      bool needs_modeset = drm_atomic_crtc_needs_modeset(&crtc_state->uapi);
        const struct intel_plane_state *old_plane_state;
        const struct intel_plane_state *new_plane_state;
        struct intel_plane *plane;
        for_each_oldnew_intel_plane_in_state(state, plane,
                                             old_plane_state,
                                             new_plane_state, i) {
 -              if (new_plane_state->base.crtc != &crtc->base &&
 -                  old_plane_state->base.crtc != &crtc->base)
 +              if (new_plane_state->hw.crtc != &crtc->base &&
 +                  old_plane_state->hw.crtc != &crtc->base)
                        continue;
  
                if (vlv_raw_plane_wm_compute(crtc_state, new_plane_state))
  static void vlv_atomic_update_fifo(struct intel_atomic_state *state,
                                   struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct intel_uncore *uncore = &dev_priv->uncore;
        const struct vlv_fifo_state *fifo_state =
  
  static int vlv_compute_intermediate_wm(struct intel_crtc_state *new_crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
        struct vlv_wm_state *intermediate = &new_crtc_state->wm.vlv.intermediate;
        const struct vlv_wm_state *optimal = &new_crtc_state->wm.vlv.optimal;
        struct intel_atomic_state *intel_state =
 -              to_intel_atomic_state(new_crtc_state->base.state);
 +              to_intel_atomic_state(new_crtc_state->uapi.state);
        const struct intel_crtc_state *old_crtc_state =
                intel_atomic_get_old_crtc_state(intel_state, crtc);
        const struct vlv_wm_state *active = &old_crtc_state->wm.vlv.optimal;
        int level;
  
 -      if (!new_crtc_state->base.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->base)) {
 +      if (!new_crtc_state->hw.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) {
                *intermediate = *optimal;
  
                intermediate->cxsr = false;
@@@ -2141,8 -2149,8 +2149,8 @@@ static void vlv_program_watermarks(stru
  static void vlv_initial_watermarks(struct intel_atomic_state *state,
                                   struct intel_crtc_state *crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        mutex_lock(&dev_priv->wm.wm_mutex);
        crtc->wm.active.vlv = crtc_state->wm.vlv.intermediate;
  static void vlv_optimize_watermarks(struct intel_atomic_state *state,
                                    struct intel_crtc_state *crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        if (!crtc_state->wm.need_postvbl_update)
                return;
@@@ -2179,7 -2187,7 +2187,7 @@@ static void i965_update_wm(struct intel
                /* self-refresh has much higher latency */
                static const int sr_latency_ns = 12000;
                const struct drm_display_mode *adjusted_mode =
 -                      &crtc->config->base.adjusted_mode;
 +                      &crtc->config->hw.adjusted_mode;
                const struct drm_framebuffer *fb =
                        crtc->base.primary->state->fb;
                int clock = adjusted_mode->crtc_clock;
@@@ -2260,7 -2268,7 +2268,7 @@@ static void i9xx_update_wm(struct intel
        crtc = intel_get_crtc_for_plane(dev_priv, PLANE_A);
        if (intel_crtc_active(crtc)) {
                const struct drm_display_mode *adjusted_mode =
 -                      &crtc->config->base.adjusted_mode;
 +                      &crtc->config->hw.adjusted_mode;
                const struct drm_framebuffer *fb =
                        crtc->base.primary->state->fb;
                int cpp;
        crtc = intel_get_crtc_for_plane(dev_priv, PLANE_B);
        if (intel_crtc_active(crtc)) {
                const struct drm_display_mode *adjusted_mode =
 -                      &crtc->config->base.adjusted_mode;
 +                      &crtc->config->hw.adjusted_mode;
                const struct drm_framebuffer *fb =
                        crtc->base.primary->state->fb;
                int cpp;
                /* self-refresh has much higher latency */
                static const int sr_latency_ns = 6000;
                const struct drm_display_mode *adjusted_mode =
 -                      &enabled->config->base.adjusted_mode;
 +                      &enabled->config->hw.adjusted_mode;
                const struct drm_framebuffer *fb =
                        enabled->base.primary->state->fb;
                int clock = adjusted_mode->crtc_clock;
@@@ -2393,7 -2401,7 +2401,7 @@@ static void i845_update_wm(struct intel
        if (crtc == NULL)
                return;
  
 -      adjusted_mode = &crtc->config->base.adjusted_mode;
 +      adjusted_mode = &crtc->config->hw.adjusted_mode;
        planea_wm = intel_calculate_wm(adjusted_mode->crtc_clock,
                                       &i845_wm_info,
                                       dev_priv->display.get_fifo_size(dev_priv, PLANE_A),
@@@ -2475,7 -2483,7 +2483,7 @@@ static u32 ilk_compute_pri_wm(const str
        if (!intel_wm_plane_visible(crtc_state, plane_state))
                return 0;
  
 -      cpp = plane_state->base.fb->format->cpp[0];
 +      cpp = plane_state->hw.fb->format->cpp[0];
  
        method1 = ilk_wm_method1(crtc_state->pixel_rate, cpp, mem_value);
  
                return method1;
  
        method2 = ilk_wm_method2(crtc_state->pixel_rate,
 -                               crtc_state->base.adjusted_mode.crtc_htotal,
 -                               drm_rect_width(&plane_state->base.dst),
 +                               crtc_state->hw.adjusted_mode.crtc_htotal,
 +                               drm_rect_width(&plane_state->uapi.dst),
                                 cpp, mem_value);
  
        return min(method1, method2);
@@@ -2507,12 -2515,12 +2515,12 @@@ static u32 ilk_compute_spr_wm(const str
        if (!intel_wm_plane_visible(crtc_state, plane_state))
                return 0;
  
 -      cpp = plane_state->base.fb->format->cpp[0];
 +      cpp = plane_state->hw.fb->format->cpp[0];
  
        method1 = ilk_wm_method1(crtc_state->pixel_rate, cpp, mem_value);
        method2 = ilk_wm_method2(crtc_state->pixel_rate,
 -                               crtc_state->base.adjusted_mode.crtc_htotal,
 -                               drm_rect_width(&plane_state->base.dst),
 +                               crtc_state->hw.adjusted_mode.crtc_htotal,
 +                               drm_rect_width(&plane_state->uapi.dst),
                                 cpp, mem_value);
        return min(method1, method2);
  }
@@@ -2533,11 -2541,11 +2541,11 @@@ static u32 ilk_compute_cur_wm(const str
        if (!intel_wm_plane_visible(crtc_state, plane_state))
                return 0;
  
 -      cpp = plane_state->base.fb->format->cpp[0];
 +      cpp = plane_state->hw.fb->format->cpp[0];
  
        return ilk_wm_method2(crtc_state->pixel_rate,
 -                            crtc_state->base.adjusted_mode.crtc_htotal,
 -                            drm_rect_width(&plane_state->base.dst),
 +                            crtc_state->hw.adjusted_mode.crtc_htotal,
 +                            drm_rect_width(&plane_state->uapi.dst),
                              cpp, mem_value);
  }
  
@@@ -2551,10 -2559,9 +2559,10 @@@ static u32 ilk_compute_fbc_wm(const str
        if (!intel_wm_plane_visible(crtc_state, plane_state))
                return 0;
  
 -      cpp = plane_state->base.fb->format->cpp[0];
 +      cpp = plane_state->hw.fb->format->cpp[0];
  
 -      return ilk_wm_fbc(pri_val, drm_rect_width(&plane_state->base.dst), cpp);
 +      return ilk_wm_fbc(pri_val, drm_rect_width(&plane_state->uapi.dst),
 +                        cpp);
  }
  
  static unsigned int
@@@ -2759,12 -2766,12 +2767,12 @@@ static u3
  hsw_compute_linetime_wm(const struct intel_crtc_state *crtc_state)
  {
        const struct intel_atomic_state *intel_state =
 -              to_intel_atomic_state(crtc_state->base.state);
 +              to_intel_atomic_state(crtc_state->uapi.state);
        const struct drm_display_mode *adjusted_mode =
 -              &crtc_state->base.adjusted_mode;
 +              &crtc_state->hw.adjusted_mode;
        u32 linetime, ips_linetime;
  
 -      if (!crtc_state->base.active)
 +      if (!crtc_state->hw.active)
                return 0;
        if (WARN_ON(adjusted_mode->crtc_clock == 0))
                return 0;
@@@ -3074,9 -3081,11 +3082,9 @@@ static bool ilk_validate_pipe_wm(const 
  /* Compute new watermarks for the pipe */
  static int ilk_compute_pipe_wm(struct intel_crtc_state *crtc_state)
  {
 -      struct drm_atomic_state *state = crtc_state->base.state;
 -      struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 +      struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct intel_pipe_wm *pipe_wm;
 -      struct drm_device *dev = state->dev;
 -      const struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane *plane;
        const struct intel_plane_state *plane_state;
        const struct intel_plane_state *pristate = NULL;
                        curstate = plane_state;
        }
  
 -      pipe_wm->pipe_enabled = crtc_state->base.active;
 +      pipe_wm->pipe_enabled = crtc_state->hw.active;
        if (sprstate) {
 -              pipe_wm->sprites_enabled = sprstate->base.visible;
 -              pipe_wm->sprites_scaled = sprstate->base.visible &&
 -                      (drm_rect_width(&sprstate->base.dst) != drm_rect_width(&sprstate->base.src) >> 16 ||
 -                       drm_rect_height(&sprstate->base.dst) != drm_rect_height(&sprstate->base.src) >> 16);
 +              pipe_wm->sprites_enabled = sprstate->uapi.visible;
 +              pipe_wm->sprites_scaled = sprstate->uapi.visible &&
 +                      (drm_rect_width(&sprstate->uapi.dst) != drm_rect_width(&sprstate->uapi.src) >> 16 ||
 +                       drm_rect_height(&sprstate->uapi.dst) != drm_rect_height(&sprstate->uapi.src) >> 16);
        }
  
        usable_level = max_level;
   */
  static int ilk_compute_intermediate_wm(struct intel_crtc_state *newstate)
  {
 -      struct intel_crtc *intel_crtc = to_intel_crtc(newstate->base.crtc);
 +      struct intel_crtc *intel_crtc = to_intel_crtc(newstate->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
        struct intel_pipe_wm *a = &newstate->wm.ilk.intermediate;
        struct intel_atomic_state *intel_state =
 -              to_intel_atomic_state(newstate->base.state);
 +              to_intel_atomic_state(newstate->uapi.state);
        const struct intel_crtc_state *oldstate =
                intel_atomic_get_old_crtc_state(intel_state, intel_crtc);
        const struct intel_pipe_wm *b = &oldstate->wm.ilk.optimal;
         * and after the vblank.
         */
        *a = newstate->wm.ilk.optimal;
 -      if (!newstate->base.active || drm_atomic_crtc_needs_modeset(&newstate->base) ||
 +      if (!newstate->hw.active || drm_atomic_crtc_needs_modeset(&newstate->uapi) ||
            intel_state->skip_intermediate_wm)
                return 0;
  
@@@ -3771,7 -3780,7 +3779,7 @@@ bool intel_can_enable_sagv(struct intel
        crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
        crtc_state = to_intel_crtc_state(crtc->base.state);
  
 -      if (crtc->base.state->adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
 +      if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
                return false;
  
        for_each_intel_plane_on_crtc(dev, crtc, plane) {
@@@ -3821,7 -3830,7 +3829,7 @@@ static u16 intel_get_ddb_size(struct dr
        if (INTEL_GEN(dev_priv) < 11)
                return ddb_size - 4; /* 4 blocks for bypass path allocation */
  
 -      adjusted_mode = &crtc_state->base.adjusted_mode;
 +      adjusted_mode = &crtc_state->hw.adjusted_mode;
        total_data_bw = total_data_rate * drm_mode_vrefresh(adjusted_mode);
  
        /*
@@@ -3850,16 -3859,16 +3858,16 @@@ skl_ddb_get_pipe_allocation_limits(stru
                                   struct skl_ddb_entry *alloc, /* out */
                                   int *num_active /* out */)
  {
 -      struct drm_atomic_state *state = crtc_state->base.state;
 +      struct drm_atomic_state *state = crtc_state->uapi.state;
        struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
 -      struct drm_crtc *for_crtc = crtc_state->base.crtc;
 +      struct drm_crtc *for_crtc = crtc_state->uapi.crtc;
        const struct intel_crtc *crtc;
        u32 pipe_width = 0, total_width = 0, width_before_pipe = 0;
        enum pipe for_pipe = to_intel_crtc(for_crtc)->pipe;
        u16 ddb_size;
        u32 i;
  
 -      if (WARN_ON(!state) || !crtc_state->base.active) {
 +      if (WARN_ON(!state) || !crtc_state->hw.active) {
                alloc->start = 0;
                alloc->end = 0;
                *num_active = hweight8(dev_priv->active_pipes);
         */
        for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
                const struct drm_display_mode *adjusted_mode =
 -                      &crtc_state->base.adjusted_mode;
 +                      &crtc_state->hw.adjusted_mode;
                enum pipe pipe = crtc->pipe;
                int hdisplay, vdisplay;
  
 -              if (!crtc_state->base.enable)
 +              if (!crtc_state->hw.enable)
                        continue;
  
                drm_mode_get_hv_timing(adjusted_mode, &hdisplay, &vdisplay);
@@@ -3933,7 -3942,7 +3941,7 @@@ static unsigned in
  skl_cursor_allocation(const struct intel_crtc_state *crtc_state,
                      int num_active)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        int level, max_level = ilk_wm_max_level(dev_priv);
        struct skl_wm_level wm = {};
        int ret, min_ddb_alloc = 0;
@@@ -4073,10 -4082,10 +4081,10 @@@ skl_plane_downscale_amount(const struc
         *
         * n.b., src is 16.16 fixed point, dst is whole integer.
         */
 -      src_w = drm_rect_width(&plane_state->base.src) >> 16;
 -      src_h = drm_rect_height(&plane_state->base.src) >> 16;
 -      dst_w = drm_rect_width(&plane_state->base.dst);
 -      dst_h = drm_rect_height(&plane_state->base.dst);
 +      src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
 +      src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
 +      dst_w = drm_rect_width(&plane_state->uapi.dst);
 +      dst_h = drm_rect_height(&plane_state->uapi.dst);
  
        fp_w_ratio = div_fixed16(src_w, dst_w);
        fp_h_ratio = div_fixed16(src_h, dst_h);
@@@ -4091,14 -4100,14 +4099,14 @@@ skl_plane_relative_data_rate(const stru
                             const struct intel_plane_state *plane_state,
                             int color_plane)
  {
 -      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 -      const struct drm_framebuffer *fb = plane_state->base.fb;
 +      struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
 +      const struct drm_framebuffer *fb = plane_state->hw.fb;
        u32 data_rate;
        u32 width = 0, height = 0;
        uint_fixed_16_16_t down_scale_amount;
        u64 rate;
  
 -      if (!plane_state->base.visible)
 +      if (!plane_state->uapi.visible)
                return 0;
  
        if (plane->id == PLANE_CURSOR)
         * the 90/270 degree plane rotation cases (to match the
         * GTT mapping), hence no need to account for rotation here.
         */
 -      width = drm_rect_width(&plane_state->base.src) >> 16;
 -      height = drm_rect_height(&plane_state->base.src) >> 16;
 +      width = drm_rect_width(&plane_state->uapi.src) >> 16;
 +      height = drm_rect_height(&plane_state->uapi.src) >> 16;
  
        /* UV plane does 1/2 pixel sub-sampling */
        if (color_plane == 1) {
@@@ -4137,7 -4146,7 +4145,7 @@@ skl_get_total_relative_data_rate(struc
                                 u64 *plane_data_rate,
                                 u64 *uv_plane_data_rate)
  {
 -      struct drm_atomic_state *state = crtc_state->base.state;
 +      struct drm_atomic_state *state = crtc_state->uapi.state;
        struct intel_plane *plane;
        const struct intel_plane_state *plane_state;
        u64 total_data_rate = 0;
@@@ -4172,7 -4181,7 +4180,7 @@@ icl_get_total_relative_data_rate(struc
        const struct intel_plane_state *plane_state;
        u64 total_data_rate = 0;
  
 -      if (WARN_ON(!crtc_state->base.state))
 +      if (WARN_ON(!crtc_state->uapi.state))
                return 0;
  
        /* Calculate and cache data rate for each plane */
@@@ -4216,8 -4225,8 +4224,8 @@@ static in
  skl_allocate_pipe_ddb(struct intel_crtc_state *crtc_state,
                      struct skl_ddb_allocation *ddb /* out */)
  {
 -      struct drm_atomic_state *state = crtc_state->base.state;
 -      struct drm_crtc *crtc = crtc_state->base.crtc;
 +      struct drm_atomic_state *state = crtc_state->uapi.state;
 +      struct drm_crtc *crtc = crtc_state->uapi.crtc;
        struct drm_i915_private *dev_priv = to_i915(crtc->dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct skl_ddb_entry *alloc = &crtc_state->wm.skl.ddb;
        if (WARN_ON(!state))
                return 0;
  
 -      if (!crtc_state->base.active) {
 +      if (!crtc_state->hw.active) {
                alloc->start = alloc->end = 0;
                return 0;
        }
@@@ -4481,7 -4490,7 +4489,7 @@@ intel_get_linetime_us(const struct inte
        u32 crtc_htotal;
        uint_fixed_16_16_t linetime_us;
  
 -      if (!crtc_state->base.active)
 +      if (!crtc_state->hw.active)
                return u32_to_fixed16(0);
  
        pixel_rate = crtc_state->pixel_rate;
        if (WARN_ON(pixel_rate == 0))
                return u32_to_fixed16(0);
  
 -      crtc_htotal = crtc_state->base.adjusted_mode.crtc_htotal;
 +      crtc_htotal = crtc_state->hw.adjusted_mode.crtc_htotal;
        linetime_us = div_fixed16(crtc_htotal * 1000, pixel_rate);
  
        return linetime_us;
@@@ -4524,7 -4533,7 +4532,7 @@@ skl_compute_wm_params(const struct inte
                      u32 plane_pixel_rate, struct skl_wm_params *wp,
                      int color_plane)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        u32 interm_pbpl;
  
@@@ -4613,7 -4622,7 +4621,7 @@@ skl_compute_plane_wm_params(const struc
                            const struct intel_plane_state *plane_state,
                            struct skl_wm_params *wp, int color_plane)
  {
 -      const struct drm_framebuffer *fb = plane_state->base.fb;
 +      const struct drm_framebuffer *fb = plane_state->hw.fb;
        int width;
  
        /*
         * the 90/270 degree plane rotation cases (to match the
         * GTT mapping), hence no need to account for rotation here.
         */
 -      width = drm_rect_width(&plane_state->base.src) >> 16;
 +      width = drm_rect_width(&plane_state->uapi.src) >> 16;
  
        return skl_compute_wm_params(crtc_state, width,
                                     fb->format, fb->modifier,
 -                                   plane_state->base.rotation,
 +                                   plane_state->hw.rotation,
                                     skl_adjusted_plane_pixel_rate(crtc_state, plane_state),
                                     wp, color_plane);
  }
@@@ -4645,7 -4654,7 +4653,7 @@@ static void skl_compute_plane_wm(const 
                                 const struct skl_wm_level *result_prev,
                                 struct skl_wm_level *result /* out */)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        u32 latency = dev_priv->wm.skl_latency[level];
        uint_fixed_16_16_t method1, method2;
        uint_fixed_16_16_t selected_result;
        method1 = skl_wm_method1(dev_priv, wp->plane_pixel_rate,
                                 wp->cpp, latency, wp->dbuf_block_size);
        method2 = skl_wm_method2(wp->plane_pixel_rate,
 -                               crtc_state->base.adjusted_mode.crtc_htotal,
 +                               crtc_state->hw.adjusted_mode.crtc_htotal,
                                 latency,
                                 wp->plane_blocks_per_line);
  
        if (wp->y_tiled) {
                selected_result = max_fixed16(method2, wp->y_tile_minimum);
        } else {
 -              if ((wp->cpp * crtc_state->base.adjusted_mode.crtc_htotal /
 +              if ((wp->cpp * crtc_state->hw.adjusted_mode.crtc_htotal /
                     wp->dbuf_block_size < 1) &&
                     (wp->plane_bytes_per_line / wp->dbuf_block_size < 1)) {
                        selected_result = method2;
@@@ -4769,7 -4778,7 +4777,7 @@@ skl_compute_wm_levels(const struct inte
                      const struct skl_wm_params *wm_params,
                      struct skl_wm_level *levels)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        int level, max_level = ilk_wm_max_level(dev_priv);
        struct skl_wm_level *result_prev = &levels[0];
  
  static u32
  skl_compute_linetime_wm(const struct intel_crtc_state *crtc_state)
  {
 -      struct drm_atomic_state *state = crtc_state->base.state;
 +      struct drm_atomic_state *state = crtc_state->uapi.state;
        struct drm_i915_private *dev_priv = to_i915(state->dev);
        uint_fixed_16_16_t linetime_us;
        u32 linetime_wm;
@@@ -4805,7 -4814,7 +4813,7 @@@ static void skl_compute_transition_wm(c
                                      const struct skl_wm_params *wp,
                                      struct skl_plane_wm *wm)
  {
 -      struct drm_device *dev = crtc_state->base.crtc->dev;
 +      struct drm_device *dev = crtc_state->uapi.crtc->dev;
        const struct drm_i915_private *dev_priv = to_i915(dev);
        u16 trans_min, trans_y_tile_min;
        const u16 trans_amount = 10; /* This is configurable amount */
@@@ -4903,8 -4912,8 +4911,8 @@@ static int skl_build_plane_wm_uv(struc
  static int skl_build_plane_wm(struct intel_crtc_state *crtc_state,
                              const struct intel_plane_state *plane_state)
  {
 -      struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
 -      const struct drm_framebuffer *fb = plane_state->base.fb;
 +      struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
 +      const struct drm_framebuffer *fb = plane_state->hw.fb;
        enum plane_id plane_id = plane->id;
        int ret;
  
  static int icl_build_plane_wm(struct intel_crtc_state *crtc_state,
                              const struct intel_plane_state *plane_state)
  {
 -      enum plane_id plane_id = to_intel_plane(plane_state->base.plane)->id;
 +      enum plane_id plane_id = to_intel_plane(plane_state->uapi.plane)->id;
        int ret;
  
        /* Watermarks calculated in master */
                return 0;
  
        if (plane_state->planar_linked_plane) {
 -              const struct drm_framebuffer *fb = plane_state->base.fb;
 +              const struct drm_framebuffer *fb = plane_state->hw.fb;
                enum plane_id y_plane_id = plane_state->planar_linked_plane->id;
  
                WARN_ON(!intel_wm_plane_visible(crtc_state, plane_state));
  
  static int skl_build_pipe_wm(struct intel_crtc_state *crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
        struct skl_pipe_wm *pipe_wm = &crtc_state->wm.skl.optimal;
        struct intel_plane *plane;
        const struct intel_plane_state *plane_state;
@@@ -5142,8 -5151,8 +5150,8 @@@ static in
  skl_ddb_add_affected_planes(const struct intel_crtc_state *old_crtc_state,
                            struct intel_crtc_state *new_crtc_state)
  {
 -      struct intel_atomic_state *state = to_intel_atomic_state(new_crtc_state->base.state);
 -      struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->base.crtc);
 +      struct intel_atomic_state *state = to_intel_atomic_state(new_crtc_state->uapi.state);
 +      struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct intel_plane *plane;
  
@@@ -5427,7 -5436,7 +5435,7 @@@ static int skl_wm_add_affected_planes(s
                 * power well the hardware state will go out of sync
                 * with the software state.
                 */
 -              if (!drm_atomic_crtc_needs_modeset(&new_crtc_state->base) &&
 +              if (!drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi) &&
                    skl_plane_wm_equals(dev_priv,
                                        &old_crtc_state->wm.skl.optimal.planes[plane_id],
                                        &new_crtc_state->wm.skl.optimal.planes[plane_id]))
@@@ -5493,7 -5502,7 +5501,7 @@@ skl_compute_wm(struct intel_atomic_stat
  static void skl_atomic_update_crtc_wm(struct intel_atomic_state *state,
                                      struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
        struct skl_pipe_wm *pipe_wm = &crtc_state->wm.skl.optimal;
        enum pipe pipe = crtc->pipe;
  static void skl_initial_wm(struct intel_atomic_state *state,
                           struct intel_crtc_state *crtc_state)
  {
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct skl_ddb_values *results = &state->wm_results;
  
  
        mutex_lock(&dev_priv->wm.wm_mutex);
  
 -      if (crtc_state->base.active_changed)
 +      if (crtc_state->uapi.active_changed)
                skl_atomic_update_crtc_wm(state, crtc_state);
  
        mutex_unlock(&dev_priv->wm.wm_mutex);
@@@ -5575,8 -5584,8 +5583,8 @@@ static void ilk_program_watermarks(stru
  static void ilk_initial_watermarks(struct intel_atomic_state *state,
                                   struct intel_crtc_state *crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        mutex_lock(&dev_priv->wm.wm_mutex);
        crtc->wm.active.ilk = crtc_state->wm.ilk.intermediate;
  static void ilk_optimize_watermarks(struct intel_atomic_state *state,
                                    struct intel_crtc_state *crtc_state)
  {
 -      struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
 -      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
  
        if (!crtc_state->wm.need_postvbl_update)
                return;
@@@ -5929,7 -5938,7 +5937,7 @@@ void g4x_wm_sanitize(struct drm_i915_pr
                enum plane_id plane_id = plane->id;
                int level;
  
 -              if (plane_state->base.visible)
 +              if (plane_state->uapi.visible)
                        continue;
  
                for (level = 0; level < 3; level++) {
@@@ -6084,7 -6093,7 +6092,7 @@@ void vlv_wm_sanitize(struct drm_i915_pr
                enum plane_id plane_id = plane->id;
                int level;
  
 -              if (plane_state->base.visible)
 +              if (plane_state->uapi.visible)
                        continue;
  
                for (level = 0; level < wm_state->num_levels; level++) {