]> Git Repo - linux.git/commitdiff
Merge tag 'drm-intel-next-2024-12-11' of https://gitlab.freedesktop.org/drm/i915...
authorSimona Vetter <[email protected]>
Tue, 7 Jan 2025 15:51:19 +0000 (16:51 +0100)
committerSimona Vetter <[email protected]>
Tue, 7 Jan 2025 15:56:40 +0000 (16:56 +0100)
Core Changes:
 - drm/print: add drm_print_hex_dump()

Driver Changes:
 - HDCP fixes and updates for Xe3lpd and for HDCP 1.4 (Suraj)
 - Add dedicated lock for each sideband (Jani)
 - New GSC FW for ARL-H and ARL-U (Daniele)
 - Add support for 3 VDSC engines 12 slices (Ankit)
 - Sanitize MBUS joining (Ville)
 - Fixes in DP MST (Imre)
 - Stop using pixel_format_from_register_bits() to parse VBT (Ville)
 - Declutter CDCLK code (Ville)
 - PSR clean up and fixes (Jouni, Jani, Animesh)
 - DMC wakelock - Fixes and enablement for Xe3_LPD (Gustavo)
 - Demote source OUI read/write failure logging to debug (Jani)
 - Potential boot oops fix and some general cleanups (Ville)
 - Scaler code cleanups (Ville)
 - More conversion towards struct intel_display and general cleanups (Jani)
 - Limit max compressed bpp to 18 when forcing DSC (Ankit)
 - Start to reconcile i915's and xe's display power mgt sequences (Rodrigo)
 - Some correction in the DP Link Training sequence (Arun)
 - Avoid setting YUV420_MODE in PIPE_MISC on Xe3lpd (Ankit)
 - MST and DDI cleanups and refactoring (Jani)
 - Fixed an typo in i915_gem_gtt.c (Zhang)
 - Try to make DPT shrinkable again (Ville)
 - Try to fix CPU MMIO fails during legacy LUT updates (Ville)
 - Some PPS cleanups (Ville, Jani)
 - Use seq buf for printing rates (Jani)
 - Flush DMC wakelock release work at the end of runtime suspend (Gustavo)
 - Fix NULL pointer dereference in capture_engine (Eugene)
 - Fix memory leak by correcting cache object name in error handler (Jiasheng)
 - Small refactor in WM/DPKGC for modifying latency programmed into PKG_C_LATENCY (Suraj)
 - Add drm_printer based hex dumper and use it (Jani)
 - Move g4x code to specific g4x functions (Jani)

Signed-off-by: Simona Vetter <[email protected]>
From: Rodrigo Vivi <[email protected]>
[sima: conflict in intel_dp_mst.c due to conversion to
drm_connector_dynamic_init that landed through drm-misc]
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1  2 
drivers/gpu/drm/i915/display/intel_audio.c
drivers/gpu/drm/i915/display/intel_dp_mst.c
drivers/gpu/drm/i915/display/intel_tc.c
drivers/gpu/drm/i915/i915_driver.c
drivers/gpu/drm/xe/xe_pm.c

index 3902ab8431139c3ff4dc17b841d94b6d3241dec3,c6b251f178c255767b406773adaf8fa980e1ea10..ce8a4319a63c507827a2db1422759abb67af7b5c
@@@ -681,12 -681,11 +681,11 @@@ static void ibx_audio_codec_enable(stru
  
  void intel_audio_sdp_split_update(const 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);
+       struct intel_display *display = to_intel_display(crtc_state);
        enum transcoder trans = crtc_state->cpu_transcoder;
  
-       if (HAS_DP20(i915))
-               intel_de_rmw(i915, AUD_DP_2DOT0_CTRL(trans), AUD_ENABLE_SDP_SPLIT,
+       if (HAS_DP20(display))
+               intel_de_rmw(display, AUD_DP_2DOT0_CTRL(trans), AUD_ENABLE_SDP_SPLIT,
                             crtc_state->sdp_split_enable ? AUD_ENABLE_SDP_SPLIT : 0);
  }
  
@@@ -699,12 -698,10 +698,12 @@@ bool intel_audio_compute_config(struct 
        const struct drm_display_mode *adjusted_mode =
                &crtc_state->hw.adjusted_mode;
  
 +      mutex_lock(&connector->eld_mutex);
        if (!connector->eld[0]) {
                drm_dbg_kms(&i915->drm,
                            "Bogus ELD on [CONNECTOR:%d:%s]\n",
                            connector->base.id, connector->name);
 +              mutex_unlock(&connector->eld_mutex);
                return false;
        }
  
        memcpy(crtc_state->eld, connector->eld, sizeof(crtc_state->eld));
  
        crtc_state->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2;
 +      mutex_unlock(&connector->eld_mutex);
  
        return true;
  }
@@@ -981,6 -977,53 +980,53 @@@ retry
        drm_modeset_acquire_fini(&ctx);
  }
  
+ int intel_audio_min_cdclk(const struct intel_crtc_state *crtc_state)
+ {
+       struct intel_display *display = to_intel_display(crtc_state);
+       struct drm_i915_private *dev_priv = to_i915(display->drm);
+       int min_cdclk = 0;
+       if (!crtc_state->has_audio)
+               return 0;
+       /* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
+        * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
+        * there may be audio corruption or screen corruption." This cdclk
+        * restriction for GLK is 316.8 MHz.
+        */
+       if (intel_crtc_has_dp_encoder(crtc_state) &&
+           crtc_state->port_clock >= 540000 &&
+           crtc_state->lane_count == 4) {
+               if (DISPLAY_VER(display) == 10) {
+                       /* Display WA #1145: glk */
+                       min_cdclk = max(min_cdclk, 316800);
+               } else if (DISPLAY_VER(display) == 9 || IS_BROADWELL(dev_priv)) {
+                       /* Display WA #1144: skl,bxt */
+                       min_cdclk = max(min_cdclk, 432000);
+               }
+       }
+       /*
+        * According to BSpec, "The CD clock frequency must be at least twice
+        * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
+        */
+       if (DISPLAY_VER(display) >= 9)
+               min_cdclk = max(min_cdclk, 2 * 96000);
+       /*
+        * "For DP audio configuration, cdclk frequency shall be set to
+        *  meet the following requirements:
+        *  DP Link Frequency(MHz) | Cdclk frequency(MHz)
+        *  270                    | 320 or higher
+        *  162                    | 200 or higher"
+        */
+       if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
+           intel_crtc_has_dp_encoder(crtc_state))
+               min_cdclk = max(min_cdclk, crtc_state->port_clock);
+       return min_cdclk;
+ }
  static unsigned long i915_audio_component_get_power(struct device *kdev)
  {
        struct intel_display *display = to_intel_display(kdev);
index 56ca571e534c582755a9402eb8b5fd51c16cb54d,123c4ece626883bd2fde997d5752611bb82018ac..debe4d0eee11f36b45f622d2b3b510f576f15462
  #include "intel_vdsc.h"
  #include "skl_scaler.h"
  
+ /*
+  * DP MST (DisplayPort Multi-Stream Transport)
+  *
+  * MST support on the source depends on the platform and port. DP initialization
+  * sets up MST for each MST capable encoder. This will become the primary
+  * encoder for the port.
+  *
+  * MST initialization of each primary encoder creates MST stream encoders, one
+  * per pipe, and initializes the MST topology manager. The MST stream encoders
+  * are sometimes called "fake encoders", because they're virtual, not
+  * physical. Thus there are (number of MST capable ports) x (number of pipes)
+  * MST stream encoders in total.
+  *
+  * Decision to use MST for a sink happens at detect on the connector attached to
+  * the primary encoder, and this will not change while the sink is connected. We
+  * always use MST when possible, including for SST sinks with sideband messaging
+  * support.
+  *
+  * The connectors for the MST streams are added and removed dynamically by the
+  * topology manager. Their connection status is also determined by the topology
+  * manager.
+  *
+  * On hardware, each transcoder may be associated with a single DDI
+  * port. Multiple transcoders may be associated with the same DDI port only if
+  * the port is in MST mode.
+  *
+  * On TGL+, all the transcoders streaming on the same DDI port will indicate a
+  * primary transcoder; the TGL_DP_TP_CTL and TGL_DP_TP_STATUS registers are
+  * relevant only on the primary transcoder. Prior to that, they are port
+  * registers.
+  */
+ /* From fake MST stream encoder to primary encoder */
+ static struct intel_encoder *to_primary_encoder(struct intel_encoder *encoder)
+ {
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
+       struct intel_digital_port *dig_port = intel_mst->primary;
+       return &dig_port->base;
+ }
+ /* From fake MST stream encoder to primary DP */
+ static struct intel_dp *to_primary_dp(struct intel_encoder *encoder)
+ {
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
+       struct intel_digital_port *dig_port = intel_mst->primary;
+       return &dig_port->dp;
+ }
  static int intel_dp_mst_max_dpt_bpp(const struct intel_crtc_state *crtc_state,
                                    bool dsc)
  {
-       struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
+       struct intel_display *display = to_intel_display(crtc_state);
        const struct drm_display_mode *adjusted_mode =
                &crtc_state->hw.adjusted_mode;
  
-       if (!intel_dp_is_uhbr(crtc_state) || DISPLAY_VER(i915) >= 20 || !dsc)
+       if (!intel_dp_is_uhbr(crtc_state) || DISPLAY_VER(display) >= 20 || !dsc)
                return INT_MAX;
  
        /*
@@@ -161,22 -211,18 +211,18 @@@ static int intel_dp_mst_dsc_get_slice_c
                                            num_joined_pipes);
  }
  
- static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
-                                               struct intel_crtc_state *crtc_state,
-                                               int max_bpp,
-                                               int min_bpp,
-                                               struct link_config_limits *limits,
-                                               struct drm_connector_state *conn_state,
-                                               int step,
-                                               bool dsc)
+ static int mst_stream_find_vcpi_slots_for_bpp(struct intel_dp *intel_dp,
+                                             struct intel_crtc_state *crtc_state,
+                                             int max_bpp, int min_bpp,
+                                             struct link_config_limits *limits,
+                                             struct drm_connector_state *conn_state,
+                                             int step, bool dsc)
  {
+       struct intel_display *display = to_intel_display(intel_dp);
        struct drm_atomic_state *state = crtc_state->uapi.state;
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_dp *intel_dp = &intel_mst->primary->dp;
        struct drm_dp_mst_topology_state *mst_state;
        struct intel_connector *connector =
                to_intel_connector(conn_state->connector);
-       struct drm_i915_private *i915 = to_i915(connector->base.dev);
        const struct drm_display_mode *adjusted_mode =
                &crtc_state->hw.adjusted_mode;
        int bpp, slots = -EINVAL;
  
        max_dpt_bpp = intel_dp_mst_max_dpt_bpp(crtc_state, dsc);
        if (max_bpp > max_dpt_bpp) {
-               drm_dbg_kms(&i915->drm, "Limiting bpp to max DPT bpp (%d -> %d)\n",
+               drm_dbg_kms(display->drm, "Limiting bpp to max DPT bpp (%d -> %d)\n",
                            max_bpp, max_dpt_bpp);
                max_bpp = max_dpt_bpp;
        }
  
-       drm_dbg_kms(&i915->drm, "Looking for slots in range min bpp %d max bpp %d\n",
+       drm_dbg_kms(display->drm, "Looking for slots in range min bpp %d max bpp %d\n",
                    min_bpp, max_bpp);
  
        if (dsc) {
                dsc_slice_count = intel_dp_mst_dsc_get_slice_count(connector, crtc_state);
                if (!dsc_slice_count) {
-                       drm_dbg_kms(&i915->drm, "Can't get valid DSC slice count\n");
+                       drm_dbg_kms(display->drm, "Can't get valid DSC slice count\n");
  
                        return -ENOSPC;
                }
                int remote_tu;
                fixed20_12 pbn;
  
-               drm_dbg_kms(&i915->drm, "Trying bpp %d\n", bpp);
+               drm_dbg_kms(display->drm, "Trying bpp %d\n", bpp);
  
                link_bpp_x16 = fxp_q4_from_int(dsc ? bpp :
                                               intel_dp_output_bpp(crtc_state->output_format, bpp));
                pbn.full = remote_tu * mst_state->pbn_div.full;
                crtc_state->pbn = dfixed_trunc(pbn);
  
-               drm_WARN_ON(&i915->drm, remote_tu < crtc_state->dp_m_n.tu);
+               drm_WARN_ON(display->drm, remote_tu < crtc_state->dp_m_n.tu);
                crtc_state->dp_m_n.tu = remote_tu;
  
                slots = drm_dp_atomic_find_time_slots(state, &intel_dp->mst_mgr,
                        return slots;
  
                if (slots >= 0) {
-                       drm_WARN_ON(&i915->drm, slots != crtc_state->dp_m_n.tu);
+                       drm_WARN_ON(display->drm, slots != crtc_state->dp_m_n.tu);
  
                        break;
                }
                slots = ret;
  
        if (slots < 0) {
-               drm_dbg_kms(&i915->drm, "failed finding vcpi slots:%d\n",
+               drm_dbg_kms(display->drm, "failed finding vcpi slots:%d\n",
                            slots);
        } else {
                if (!dsc)
                        crtc_state->pipe_bpp = bpp;
                else
                        crtc_state->dsc.compressed_bpp_x16 = fxp_q4_from_int(bpp);
-               drm_dbg_kms(&i915->drm, "Got %d slots for pipe bpp %d dsc %d\n", slots, bpp, dsc);
+               drm_dbg_kms(display->drm, "Got %d slots for pipe bpp %d dsc %d\n",
+                           slots, bpp, dsc);
        }
  
        return slots;
  }
  
- static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
-                                           struct intel_crtc_state *crtc_state,
-                                           struct drm_connector_state *conn_state,
-                                           struct link_config_limits *limits)
+ static int mst_stream_compute_link_config(struct intel_dp *intel_dp,
+                                         struct intel_crtc_state *crtc_state,
+                                         struct drm_connector_state *conn_state,
+                                         struct link_config_limits *limits)
  {
        int slots = -EINVAL;
  
         * FIXME: allocate the BW according to link_bpp, which in the case of
         * YUV420 is only half of the pipe bpp value.
         */
-       slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state,
-                                                    fxp_q4_to_int(limits->link.max_bpp_x16),
-                                                    fxp_q4_to_int(limits->link.min_bpp_x16),
-                                                    limits,
-                                                    conn_state, 2 * 3, false);
+       slots = mst_stream_find_vcpi_slots_for_bpp(intel_dp, crtc_state,
+                                                  fxp_q4_to_int(limits->link.max_bpp_x16),
+                                                  fxp_q4_to_int(limits->link.min_bpp_x16),
+                                                  limits,
+                                                  conn_state, 2 * 3, false);
  
        if (slots < 0)
                return slots;
        return 0;
  }
  
- static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
-                                               struct intel_crtc_state *crtc_state,
-                                               struct drm_connector_state *conn_state,
-                                               struct link_config_limits *limits)
+ static int mst_stream_dsc_compute_link_config(struct intel_dp *intel_dp,
+                                             struct intel_crtc_state *crtc_state,
+                                             struct drm_connector_state *conn_state,
+                                             struct link_config_limits *limits)
  {
-       struct intel_connector *connector =
-               to_intel_connector(conn_state->connector);
+       struct intel_display *display = to_intel_display(intel_dp);
+       struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct drm_i915_private *i915 = to_i915(connector->base.dev);
        int slots = -EINVAL;
        int i, num_bpc;
        int min_compressed_bpp, max_compressed_bpp;
  
        /* Max DSC Input BPC for ICL is 10 and for TGL+ is 12 */
-       if (DISPLAY_VER(i915) >= 12)
+       if (DISPLAY_VER(display) >= 12)
                dsc_max_bpc = min_t(u8, 12, conn_state->max_requested_bpc);
        else
                dsc_max_bpc = min_t(u8, 10, conn_state->max_requested_bpc);
        num_bpc = drm_dp_dsc_sink_supported_input_bpcs(connector->dp.dsc_dpcd,
                                                       dsc_bpc);
  
-       drm_dbg_kms(&i915->drm, "DSC Source supported min bpp %d max bpp %d\n",
+       drm_dbg_kms(display->drm, "DSC Source supported min bpp %d max bpp %d\n",
                    min_bpp, max_bpp);
  
        sink_max_bpp = dsc_bpc[0] * 3;
                        sink_max_bpp = dsc_bpc[i] * 3;
        }
  
-       drm_dbg_kms(&i915->drm, "DSC Sink supported min bpp %d max bpp %d\n",
+       drm_dbg_kms(display->drm, "DSC Sink supported min bpp %d max bpp %d\n",
                    sink_min_bpp, sink_max_bpp);
  
        if (min_bpp < sink_min_bpp)
        min_compressed_bpp = max(min_compressed_bpp,
                                 fxp_q4_to_int_roundup(limits->link.min_bpp_x16));
  
-       drm_dbg_kms(&i915->drm, "DSC Sink supported compressed min bpp %d compressed max bpp %d\n",
+       drm_dbg_kms(display->drm, "DSC Sink supported compressed min bpp %d compressed max bpp %d\n",
                    min_compressed_bpp, max_compressed_bpp);
  
        /* Align compressed bpps according to our own constraints */
        min_compressed_bpp = intel_dp_dsc_nearest_valid_bpp(i915, min_compressed_bpp,
                                                            crtc_state->pipe_bpp);
  
-       slots = intel_dp_mst_find_vcpi_slots_for_bpp(encoder, crtc_state, max_compressed_bpp,
-                                                    min_compressed_bpp, limits,
-                                                    conn_state, 1, true);
+       slots = mst_stream_find_vcpi_slots_for_bpp(intel_dp, crtc_state, max_compressed_bpp,
+                                                  min_compressed_bpp, limits,
+                                                  conn_state, 1, true);
  
        if (slots < 0)
                return slots;
  
        return 0;
  }
- static int intel_dp_mst_update_slots(struct intel_encoder *encoder,
-                                    struct intel_crtc_state *crtc_state,
-                                    struct drm_connector_state *conn_state)
+ static int mst_stream_update_slots(struct intel_dp *intel_dp,
+                                  struct intel_crtc_state *crtc_state,
+                                  struct drm_connector_state *conn_state)
  {
-       struct drm_i915_private *i915 = to_i915(encoder->base.dev);
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_dp *intel_dp = &intel_mst->primary->dp;
+       struct intel_display *display = to_intel_display(intel_dp);
        struct drm_dp_mst_topology_mgr *mgr = &intel_dp->mst_mgr;
        struct drm_dp_mst_topology_state *topology_state;
        u8 link_coding_cap = intel_dp_is_uhbr(crtc_state) ?
  
        topology_state = drm_atomic_get_mst_topology_state(conn_state->state, mgr);
        if (IS_ERR(topology_state)) {
-               drm_dbg_kms(&i915->drm, "slot update failed\n");
+               drm_dbg_kms(display->drm, "slot update failed\n");
                return PTR_ERR(topology_state);
        }
  
@@@ -479,7 -525,7 +525,7 @@@ adjust_limits_for_dsc_hblank_expansion_
                                             struct link_config_limits *limits,
                                             bool dsc)
  {
-       struct drm_i915_private *i915 = to_i915(connector->base.dev);
+       struct intel_display *display = to_intel_display(connector);
        const struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        int min_bpp_x16 = limits->link.min_bpp_x16;
  
  
        if (!dsc) {
                if (intel_dp_supports_dsc(connector, crtc_state)) {
-                       drm_dbg_kms(&i915->drm,
+                       drm_dbg_kms(display->drm,
                                    "[CRTC:%d:%s][CONNECTOR:%d:%s] DSC needed by hblank expansion quirk\n",
                                    crtc->base.base.id, crtc->base.name,
                                    connector->base.base.id, connector->base.name);
                        return false;
                }
  
-               drm_dbg_kms(&i915->drm,
+               drm_dbg_kms(display->drm,
                            "[CRTC:%d:%s][CONNECTOR:%d:%s] Increasing link min bpp to 24 due to hblank expansion quirk\n",
                            crtc->base.base.id, crtc->base.name,
                            connector->base.base.id, connector->base.name);
                return true;
        }
  
-       drm_WARN_ON(&i915->drm, limits->min_rate != limits->max_rate);
+       drm_WARN_ON(display->drm, limits->min_rate != limits->max_rate);
  
        if (limits->max_rate < 540000)
                min_bpp_x16 = fxp_q4_from_int(13);
        if (limits->link.min_bpp_x16 >= min_bpp_x16)
                return true;
  
-       drm_dbg_kms(&i915->drm,
+       drm_dbg_kms(display->drm,
                    "[CRTC:%d:%s][CONNECTOR:%d:%s] Increasing link min bpp to " FXP_Q4_FMT " in DSC mode due to hblank expansion quirk\n",
                    crtc->base.base.id, crtc->base.name,
                    connector->base.base.id, connector->base.name,
  }
  
  static bool
intel_dp_mst_compute_config_limits(struct intel_dp *intel_dp,
-                                  const struct intel_connector *connector,
-                                  struct intel_crtc_state *crtc_state,
-                                  bool dsc,
-                                  struct link_config_limits *limits)
mst_stream_compute_config_limits(struct intel_dp *intel_dp,
+                                const struct intel_connector *connector,
+                                struct intel_crtc_state *crtc_state,
+                                bool dsc,
+                                struct link_config_limits *limits)
  {
        /*
         * for MST we always configure max link bw - the spec doesn't
                                                            dsc);
  }
  
- static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
-                                      struct intel_crtc_state *pipe_config,
-                                      struct drm_connector_state *conn_state)
+ static int mst_stream_compute_config(struct intel_encoder *encoder,
+                                    struct intel_crtc_state *pipe_config,
+                                    struct drm_connector_state *conn_state)
  {
+       struct intel_display *display = to_intel_display(encoder);
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_atomic_state *state = to_intel_atomic_state(conn_state->state);
        struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_dp *intel_dp = &intel_mst->primary->dp;
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
        struct intel_connector *connector =
                to_intel_connector(conn_state->connector);
        const struct drm_display_mode *adjusted_mode =
        joiner_needs_dsc = intel_dp_joiner_needs_dsc(dev_priv, num_joined_pipes);
  
        dsc_needed = joiner_needs_dsc || intel_dp->force_dsc_en ||
-                    !intel_dp_mst_compute_config_limits(intel_dp,
-                                                        connector,
-                                                        pipe_config,
-                                                        false,
-                                                        &limits);
+               !mst_stream_compute_config_limits(intel_dp, connector,
+                                                 pipe_config, false, &limits);
  
        if (!dsc_needed) {
-               ret = intel_dp_mst_compute_link_config(encoder, pipe_config,
-                                                      conn_state, &limits);
+               ret = mst_stream_compute_link_config(intel_dp, pipe_config,
+                                                    conn_state, &limits);
  
                if (ret == -EDEADLK)
                        return ret;
  
        /* enable compression if the mode doesn't fit available BW */
        if (dsc_needed) {
-               drm_dbg_kms(&dev_priv->drm, "Try DSC (fallback=%s, joiner=%s, force=%s)\n",
+               drm_dbg_kms(display->drm, "Try DSC (fallback=%s, joiner=%s, force=%s)\n",
                            str_yes_no(ret), str_yes_no(joiner_needs_dsc),
                            str_yes_no(intel_dp->force_dsc_en));
  
                if (!intel_dp_supports_dsc(connector, pipe_config))
                        return -EINVAL;
  
-               if (!intel_dp_mst_compute_config_limits(intel_dp,
-                                                       connector,
-                                                       pipe_config,
-                                                       true,
-                                                       &limits))
+               if (!mst_stream_compute_config_limits(intel_dp, connector,
+                                                     pipe_config, true,
+                                                     &limits))
                        return -EINVAL;
  
                /*
                 * FIXME: As bpc is hardcoded to 8, as mentioned above,
                 * WARN and ignore the debug flag force_dsc_bpc for now.
                 */
-               drm_WARN(&dev_priv->drm, intel_dp->force_dsc_bpc, "Cannot Force BPC for MST\n");
+               drm_WARN(display->drm, intel_dp->force_dsc_bpc,
+                        "Cannot Force BPC for MST\n");
                /*
                 * Try to get at least some timeslots and then see, if
                 * we can fit there with DSC.
                 */
-               drm_dbg_kms(&dev_priv->drm, "Trying to find VCPI slots in DSC mode\n");
+               drm_dbg_kms(display->drm, "Trying to find VCPI slots in DSC mode\n");
  
-               ret = intel_dp_dsc_mst_compute_link_config(encoder, pipe_config,
-                                                          conn_state, &limits);
+               ret = mst_stream_dsc_compute_link_config(intel_dp, pipe_config,
+                                                        conn_state, &limits);
                if (ret < 0)
                        return ret;
  
        if (ret)
                return ret;
  
-       ret = intel_dp_mst_update_slots(encoder, pipe_config, conn_state);
+       ret = mst_stream_update_slots(intel_dp, pipe_config, conn_state);
        if (ret)
                return ret;
  
        pipe_config->limited_color_range =
                intel_dp_limited_color_range(pipe_config, conn_state);
  
-       if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
+       if (display->platform.geminilake || display->platform.broxton)
                pipe_config->lane_lat_optim_mask =
                        bxt_dpio_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
  
@@@ -698,13 -740,13 +740,13 @@@ static unsigned in
  intel_dp_mst_transcoder_mask(struct intel_atomic_state *state,
                             struct intel_dp *mst_port)
  {
-       struct drm_i915_private *dev_priv = to_i915(state->base.dev);
+       struct intel_display *display = to_intel_display(state);
        const struct intel_digital_connector_state *conn_state;
        struct intel_connector *connector;
        u8 transcoders = 0;
        int i;
  
-       if (DISPLAY_VER(dev_priv) < 12)
+       if (DISPLAY_VER(display) < 12)
                return 0;
  
        for_each_new_intel_connector_in_state(state, connector, conn_state, i) {
@@@ -758,7 -800,7 +800,7 @@@ static int intel_dp_mst_check_fec_chang
                                         struct drm_dp_mst_topology_mgr *mst_mgr,
                                         struct intel_link_bw_limits *limits)
  {
-       struct drm_i915_private *i915 = to_i915(state->base.dev);
+       struct intel_display *display = to_intel_display(state);
        struct intel_crtc *crtc;
        u8 mst_pipe_mask;
        u8 fec_pipe_mask = 0;
  
        mst_pipe_mask = get_pipes_downstream_of_mst_port(state, mst_mgr, NULL);
  
-       for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, mst_pipe_mask) {
+       for_each_intel_crtc_in_pipe_mask(display->drm, crtc, mst_pipe_mask) {
                struct intel_crtc_state *crtc_state =
                        intel_atomic_get_new_crtc_state(state, crtc);
  
                /* Atomic connector check should've added all the MST CRTCs. */
-               if (drm_WARN_ON(&i915->drm, !crtc_state))
+               if (drm_WARN_ON(display->drm, !crtc_state))
                        return -EINVAL;
  
                if (crtc_state->fec_enable)
@@@ -850,13 -892,12 +892,12 @@@ int intel_dp_mst_atomic_check_link(stru
        return 0;
  }
  
- static int intel_dp_mst_compute_config_late(struct intel_encoder *encoder,
-                                           struct intel_crtc_state *crtc_state,
-                                           struct drm_connector_state *conn_state)
+ static int mst_stream_compute_config_late(struct intel_encoder *encoder,
+                                         struct intel_crtc_state *crtc_state,
+                                         struct drm_connector_state *conn_state)
  {
        struct intel_atomic_state *state = to_intel_atomic_state(conn_state->state);
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_dp *intel_dp = &intel_mst->primary->dp;
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
  
        /* lowest numbered transcoder will be designated master */
        crtc_state->mst_master_transcoder =
   * recomputation of the corresponding CRTC states.
   */
  static int
intel_dp_mst_atomic_topology_check(struct intel_connector *connector,
-                                  struct intel_atomic_state *state)
mst_connector_atomic_topology_check(struct intel_connector *connector,
+                                   struct intel_atomic_state *state)
  {
-       struct drm_i915_private *dev_priv = to_i915(state->base.dev);
+       struct intel_display *display = to_intel_display(connector);
        struct drm_connector_list_iter connector_list_iter;
        struct intel_connector *connector_iter;
        int ret = 0;
        if (!intel_connector_needs_modeset(state, &connector->base))
                return 0;
  
-       drm_connector_list_iter_begin(&dev_priv->drm, &connector_list_iter);
+       drm_connector_list_iter_begin(display->drm, &connector_list_iter);
        for_each_intel_connector_iter(connector_iter, &connector_list_iter) {
                struct intel_digital_connector_state *conn_iter_state;
                struct intel_crtc_state *crtc_state;
  }
  
  static int
intel_dp_mst_atomic_check(struct drm_connector *connector,
-                         struct drm_atomic_state *_state)
mst_connector_atomic_check(struct drm_connector *connector,
+                          struct drm_atomic_state *_state)
  {
        struct intel_atomic_state *state = to_intel_atomic_state(_state);
        struct intel_connector *intel_connector =
        if (ret)
                return ret;
  
-       ret = intel_dp_mst_atomic_topology_check(intel_connector, state);
+       ret = mst_connector_atomic_topology_check(intel_connector, state);
        if (ret)
                return ret;
  
                                                intel_connector->port);
  }
  
- static void clear_act_sent(struct intel_encoder *encoder,
-                          const struct intel_crtc_state *crtc_state)
- {
-       struct drm_i915_private *i915 = to_i915(encoder->base.dev);
-       intel_de_write(i915, dp_tp_status_reg(encoder, crtc_state),
-                      DP_TP_STATUS_ACT_SENT);
- }
- static void wait_for_act_sent(struct intel_encoder *encoder,
-                             const struct intel_crtc_state *crtc_state)
- {
-       struct drm_i915_private *i915 = to_i915(encoder->base.dev);
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_dp *intel_dp = &intel_mst->primary->dp;
-       if (intel_de_wait_for_set(i915, dp_tp_status_reg(encoder, crtc_state),
-                                 DP_TP_STATUS_ACT_SENT, 1))
-               drm_err(&i915->drm, "Timed out waiting for ACT sent\n");
-       drm_dp_check_act_status(&intel_dp->mst_mgr);
- }
- static void intel_mst_disable_dp(struct intel_atomic_state *state,
-                                struct intel_encoder *encoder,
-                                const struct intel_crtc_state *old_crtc_state,
-                                const struct drm_connector_state *old_conn_state)
+ static void mst_stream_disable(struct intel_atomic_state *state,
+                              struct intel_encoder *encoder,
+                              const struct intel_crtc_state *old_crtc_state,
+                              const struct drm_connector_state *old_conn_state)
  {
+       struct intel_display *display = to_intel_display(state);
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
-       struct intel_dp *intel_dp = &dig_port->dp;
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
        struct intel_connector *connector =
                to_intel_connector(old_conn_state->connector);
-       struct drm_i915_private *i915 = to_i915(connector->base.dev);
  
-       drm_dbg_kms(&i915->drm, "active links %d\n",
+       drm_dbg_kms(display->drm, "active links %d\n",
                    intel_dp->active_mst_links);
  
        if (intel_dp->active_mst_links == 1)
        intel_dp_sink_disable_decompression(state, connector, old_crtc_state);
  }
  
- static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
-                                     struct intel_encoder *encoder,
-                                     const struct intel_crtc_state *old_crtc_state,
-                                     const struct drm_connector_state *old_conn_state)
+ static void mst_stream_post_disable(struct intel_atomic_state *state,
+                                   struct intel_encoder *encoder,
+                                   const struct intel_crtc_state *old_crtc_state,
+                                   const struct drm_connector_state *old_conn_state)
  {
        struct intel_display *display = to_intel_display(encoder);
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
-       struct intel_dp *intel_dp = &dig_port->dp;
+       struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
        struct intel_connector *connector =
                to_intel_connector(old_conn_state->connector);
        struct drm_dp_mst_topology_state *old_mst_state =
                drm_atomic_get_mst_payload_state(old_mst_state, connector->port);
        struct drm_dp_mst_atomic_payload *new_payload =
                drm_atomic_get_mst_payload_state(new_mst_state, connector->port);
-       struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_crtc *pipe_crtc;
        bool last_mst_stream;
        int i;
  
        intel_dp->active_mst_links--;
        last_mst_stream = intel_dp->active_mst_links == 0;
-       drm_WARN_ON(&dev_priv->drm,
-                   DISPLAY_VER(dev_priv) >= 12 && last_mst_stream &&
+       drm_WARN_ON(display->drm, DISPLAY_VER(display) >= 12 && last_mst_stream &&
                    !intel_dp_mst_is_master_trans(old_crtc_state));
  
        for_each_pipe_crtc_modeset_disable(display, pipe_crtc, old_crtc_state, i) {
  
        drm_dp_remove_payload_part1(&intel_dp->mst_mgr, new_mst_state, new_payload);
  
-       clear_act_sent(encoder, old_crtc_state);
+       intel_ddi_clear_act_sent(encoder, old_crtc_state);
  
-       intel_de_rmw(dev_priv,
-                    TRANS_DDI_FUNC_CTL(dev_priv, old_crtc_state->cpu_transcoder),
+       intel_de_rmw(display,
+                    TRANS_DDI_FUNC_CTL(display, old_crtc_state->cpu_transcoder),
                     TRANS_DDI_DP_VC_PAYLOAD_ALLOC, 0);
  
-       wait_for_act_sent(encoder, old_crtc_state);
+       intel_ddi_wait_for_act_sent(encoder, old_crtc_state);
+       drm_dp_check_act_status(&intel_dp->mst_mgr);
  
        drm_dp_remove_payload_part2(&intel_dp->mst_mgr, new_mst_state,
                                    old_payload, new_payload);
  
                intel_dsc_disable(old_pipe_crtc_state);
  
-               if (DISPLAY_VER(dev_priv) >= 9)
+               if (DISPLAY_VER(display) >= 9)
                        skl_scaler_disable(old_pipe_crtc_state);
                else
                        ilk_pfit_disable(old_pipe_crtc_state);
         * BSpec 4287: disable DIP after the transcoder is disabled and before
         * the transcoder clock select is set to none.
         */
-       intel_dp_set_infoframes(&dig_port->base, false,
-                               old_crtc_state, NULL);
+       intel_dp_set_infoframes(primary_encoder, false, old_crtc_state, NULL);
        /*
         * From TGL spec: "If multi-stream slave transcoder: Configure
         * Transcoder Clock Select to direct no clock to the transcoder"
         * From older GENs spec: "Configure Transcoder Clock Select to direct
         * no clock to the transcoder"
         */
-       if (DISPLAY_VER(dev_priv) < 12 || !last_mst_stream)
+       if (DISPLAY_VER(display) < 12 || !last_mst_stream)
                intel_ddi_disable_transcoder_clock(old_crtc_state);
  
  
        intel_mst->connector = NULL;
        if (last_mst_stream)
-               dig_port->base.post_disable(state, &dig_port->base,
-                                                 old_crtc_state, NULL);
+               primary_encoder->post_disable(state, primary_encoder,
+                                             old_crtc_state, NULL);
  
-       drm_dbg_kms(&dev_priv->drm, "active links %d\n",
+       drm_dbg_kms(display->drm, "active links %d\n",
                    intel_dp->active_mst_links);
  }
  
- static void intel_mst_post_pll_disable_dp(struct intel_atomic_state *state,
-                                         struct intel_encoder *encoder,
-                                         const struct intel_crtc_state *old_crtc_state,
-                                         const struct drm_connector_state *old_conn_state)
+ static void mst_stream_post_pll_disable(struct intel_atomic_state *state,
+                                       struct intel_encoder *encoder,
+                                       const struct intel_crtc_state *old_crtc_state,
+                                       const struct drm_connector_state *old_conn_state)
  {
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
-       struct intel_dp *intel_dp = &dig_port->dp;
+       struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
  
        if (intel_dp->active_mst_links == 0 &&
-           dig_port->base.post_pll_disable)
-               dig_port->base.post_pll_disable(state, encoder, old_crtc_state, old_conn_state);
+           primary_encoder->post_pll_disable)
+               primary_encoder->post_pll_disable(state, primary_encoder, old_crtc_state, old_conn_state);
  }
  
- static void intel_mst_pre_pll_enable_dp(struct intel_atomic_state *state,
-                                       struct intel_encoder *encoder,
-                                       const struct intel_crtc_state *pipe_config,
-                                       const struct drm_connector_state *conn_state)
+ static void mst_stream_pre_pll_enable(struct intel_atomic_state *state,
+                                     struct intel_encoder *encoder,
+                                     const struct intel_crtc_state *pipe_config,
+                                     const struct drm_connector_state *conn_state)
  {
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
-       struct intel_dp *intel_dp = &dig_port->dp;
+       struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
  
        if (intel_dp->active_mst_links == 0)
-               dig_port->base.pre_pll_enable(state, &dig_port->base,
-                                                   pipe_config, NULL);
+               primary_encoder->pre_pll_enable(state, primary_encoder,
+                                               pipe_config, NULL);
        else
                /*
                 * The port PLL state needs to get updated for secondary
                 * streams as for the primary stream.
                 */
-               intel_ddi_update_active_dpll(state, &dig_port->base,
+               intel_ddi_update_active_dpll(state, primary_encoder,
                                             to_intel_crtc(pipe_config->uapi.crtc));
  }
  
@@@ -1164,15 -1177,15 +1177,15 @@@ static void intel_mst_reprobe_topology(
                                         crtc_state->port_clock, crtc_state->lane_count);
  }
  
- static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
-                                   struct intel_encoder *encoder,
-                                   const struct intel_crtc_state *pipe_config,
-                                   const struct drm_connector_state *conn_state)
+ static void mst_stream_pre_enable(struct intel_atomic_state *state,
+                                 struct intel_encoder *encoder,
+                                 const struct intel_crtc_state *pipe_config,
+                                 const struct drm_connector_state *conn_state)
  {
+       struct intel_display *display = to_intel_display(state);
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
-       struct intel_dp *intel_dp = &dig_port->dp;
-       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+       struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
        struct intel_connector *connector =
                to_intel_connector(conn_state->connector);
        struct drm_dp_mst_topology_state *mst_state =
        connector->encoder = encoder;
        intel_mst->connector = connector;
        first_mst_stream = intel_dp->active_mst_links == 0;
-       drm_WARN_ON(&dev_priv->drm,
-                   DISPLAY_VER(dev_priv) >= 12 && first_mst_stream &&
+       drm_WARN_ON(display->drm, DISPLAY_VER(display) >= 12 && first_mst_stream &&
                    !intel_dp_mst_is_master_trans(pipe_config));
  
-       drm_dbg_kms(&dev_priv->drm, "active links %d\n",
+       drm_dbg_kms(display->drm, "active links %d\n",
                    intel_dp->active_mst_links);
  
        if (first_mst_stream)
        intel_dp_sink_enable_decompression(state, connector, pipe_config);
  
        if (first_mst_stream) {
-               dig_port->base.pre_enable(state, &dig_port->base,
-                                               pipe_config, NULL);
+               primary_encoder->pre_enable(state, primary_encoder,
+                                           pipe_config, NULL);
  
                intel_mst_reprobe_topology(intel_dp, pipe_config);
        }
        ret = drm_dp_add_payload_part1(&intel_dp->mst_mgr, mst_state,
                                       drm_atomic_get_mst_payload_state(mst_state, connector->port));
        if (ret < 0)
-               intel_dp_queue_modeset_retry_for_link(state, &dig_port->base, pipe_config);
+               intel_dp_queue_modeset_retry_for_link(state, primary_encoder, pipe_config);
  
        /*
         * Before Gen 12 this is not done as part of
-        * dig_port->base.pre_enable() and should be done here. For
+        * primary_encoder->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 (DISPLAY_VER(dev_priv) < 12 || !first_mst_stream)
+       if (DISPLAY_VER(display) < 12 || !first_mst_stream)
                intel_ddi_enable_transcoder_clock(encoder, pipe_config);
  
-       intel_dsc_dp_pps_write(&dig_port->base, pipe_config);
+       if (DISPLAY_VER(display) >= 13 && !first_mst_stream)
+               intel_ddi_config_transcoder_func(encoder, pipe_config);
+       intel_dsc_dp_pps_write(primary_encoder, pipe_config);
        intel_ddi_set_dp_msa(pipe_config, conn_state);
  }
  
  static void enable_bs_jitter_was(const struct intel_crtc_state *crtc_state)
  {
+       struct intel_display *display = to_intel_display(crtc_state);
        struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
        u32 clear = 0;
        u32 set = 0;
        if (!IS_ALDERLAKE_P(i915))
                return;
  
-       if (!IS_DISPLAY_STEP(i915, STEP_D0, STEP_FOREVER))
+       if (!IS_DISPLAY_STEP(display, STEP_D0, STEP_FOREVER))
                return;
  
        /* Wa_14013163432:adlp */
                set |= DP_MST_FEC_BS_JITTER_WA(crtc_state->cpu_transcoder);
  
        /* Wa_14014143976:adlp */
-       if (IS_DISPLAY_STEP(i915, STEP_E0, STEP_FOREVER)) {
+       if (IS_DISPLAY_STEP(display, STEP_E0, STEP_FOREVER)) {
                if (intel_dp_is_uhbr(crtc_state))
                        set |= DP_MST_SHORT_HBLANK_WA(crtc_state->cpu_transcoder);
                else if (crtc_state->fec_enable)
        if (!clear && !set)
                return;
  
-       intel_de_rmw(i915, CHICKEN_MISC_3, clear, set);
+       intel_de_rmw(display, CHICKEN_MISC_3, clear, set);
  }
  
- static void intel_mst_enable_dp(struct intel_atomic_state *state,
-                               struct intel_encoder *encoder,
-                               const struct intel_crtc_state *pipe_config,
-                               const struct drm_connector_state *conn_state)
+ static void mst_stream_enable(struct intel_atomic_state *state,
+                             struct intel_encoder *encoder,
+                             const struct intel_crtc_state *pipe_config,
+                             const struct drm_connector_state *conn_state)
  {
        struct intel_display *display = to_intel_display(encoder);
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
-       struct intel_dp *intel_dp = &dig_port->dp;
+       struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
+       struct intel_dp *intel_dp = to_primary_dp(encoder);
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
-       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct drm_dp_mst_topology_state *mst_state =
                drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr);
        enum transcoder trans = pipe_config->cpu_transcoder;
        struct intel_crtc *pipe_crtc;
        int ret, i;
  
-       drm_WARN_ON(&dev_priv->drm, pipe_config->has_pch_encoder);
+       drm_WARN_ON(display->drm, pipe_config->has_pch_encoder);
  
        if (intel_dp_is_uhbr(pipe_config)) {
                const struct drm_display_mode *adjusted_mode =
                        &pipe_config->hw.adjusted_mode;
                u64 crtc_clock_hz = KHz(adjusted_mode->crtc_clock);
  
-               intel_de_write(dev_priv, TRANS_DP2_VFREQHIGH(pipe_config->cpu_transcoder),
+               intel_de_write(display, TRANS_DP2_VFREQHIGH(pipe_config->cpu_transcoder),
                               TRANS_DP2_VFREQ_PIXEL_CLOCK(crtc_clock_hz >> 24));
-               intel_de_write(dev_priv, TRANS_DP2_VFREQLOW(pipe_config->cpu_transcoder),
+               intel_de_write(display, TRANS_DP2_VFREQLOW(pipe_config->cpu_transcoder),
                               TRANS_DP2_VFREQ_PIXEL_CLOCK(crtc_clock_hz & 0xffffff));
        }
  
  
        intel_ddi_enable_transcoder_func(encoder, pipe_config);
  
-       clear_act_sent(encoder, pipe_config);
+       intel_ddi_clear_act_sent(encoder, pipe_config);
  
-       intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL(dev_priv, trans), 0,
+       intel_de_rmw(display, TRANS_DDI_FUNC_CTL(display, trans), 0,
                     TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
  
-       drm_dbg_kms(&dev_priv->drm, "active links %d\n",
+       drm_dbg_kms(display->drm, "active links %d\n",
                    intel_dp->active_mst_links);
  
-       wait_for_act_sent(encoder, pipe_config);
+       intel_ddi_wait_for_act_sent(encoder, pipe_config);
+       drm_dp_check_act_status(&intel_dp->mst_mgr);
  
        if (first_mst_stream)
                intel_ddi_wait_for_fec_status(encoder, pipe_config, true);
                                       drm_atomic_get_mst_payload_state(mst_state,
                                                                        connector->port));
        if (ret < 0)
-               intel_dp_queue_modeset_retry_for_link(state, &dig_port->base, pipe_config);
+               intel_dp_queue_modeset_retry_for_link(state, primary_encoder, pipe_config);
  
-       if (DISPLAY_VER(dev_priv) >= 12)
-               intel_de_rmw(dev_priv, hsw_chicken_trans_reg(dev_priv, trans),
+       if (DISPLAY_VER(display) >= 12)
+               intel_de_rmw(display, CHICKEN_TRANS(display, trans),
                             FECSTALL_DIS_DPTSTREAM_DPTTG,
                             pipe_config->fec_enable ? FECSTALL_DIS_DPTSTREAM_DPTTG : 0);
  
        intel_hdcp_enable(state, encoder, pipe_config, conn_state);
  }
  
- static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
-                                     enum pipe *pipe)
+ static bool mst_stream_get_hw_state(struct intel_encoder *encoder,
+                                   enum pipe *pipe)
  {
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
        *pipe = intel_mst->pipe;
        return false;
  }
  
- static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
-                                       struct intel_crtc_state *pipe_config)
+ static void mst_stream_get_config(struct intel_encoder *encoder,
+                                 struct intel_crtc_state *pipe_config)
  {
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
+       struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
  
-       dig_port->base.get_config(&dig_port->base, pipe_config);
+       primary_encoder->get_config(primary_encoder, pipe_config);
  }
  
- static bool intel_dp_mst_initial_fastset_check(struct intel_encoder *encoder,
-                                              struct intel_crtc_state *crtc_state)
+ static bool mst_stream_initial_fastset_check(struct intel_encoder *encoder,
+                                            struct intel_crtc_state *crtc_state)
  {
-       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
-       struct intel_digital_port *dig_port = intel_mst->primary;
+       struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
  
-       return intel_dp_initial_fastset_check(&dig_port->base, crtc_state);
+       return intel_dp_initial_fastset_check(primary_encoder, crtc_state);
  }
  
- static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
+ static int mst_connector_get_ddc_modes(struct drm_connector *connector)
  {
+       struct intel_display *display = to_intel_display(connector->dev);
        struct intel_connector *intel_connector = to_intel_connector(connector);
-       struct drm_i915_private *i915 = to_i915(intel_connector->base.dev);
        struct intel_dp *intel_dp = intel_connector->mst_port;
        const struct drm_edid *drm_edid;
        int ret;
        if (drm_connector_is_unregistered(connector))
                return intel_connector_update_modes(connector, NULL);
  
-       if (!intel_display_driver_check_access(i915))
+       if (!intel_display_driver_check_access(display))
                return drm_edid_connector_add_modes(connector);
  
        drm_edid = drm_dp_mst_edid_read(connector, &intel_dp->mst_mgr, intel_connector->port);
  }
  
  static int
intel_dp_mst_connector_late_register(struct drm_connector *connector)
+ mst_connector_late_register(struct drm_connector *connector)
  {
        struct intel_connector *intel_connector = to_intel_connector(connector);
        int ret;
  }
  
  static void
intel_dp_mst_connector_early_unregister(struct drm_connector *connector)
+ mst_connector_early_unregister(struct drm_connector *connector)
  {
        struct intel_connector *intel_connector = to_intel_connector(connector);
  
                                              intel_connector->port);
  }
  
- static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
+ static const struct drm_connector_funcs mst_connector_funcs = {
        .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,
-       .late_register = intel_dp_mst_connector_late_register,
-       .early_unregister = intel_dp_mst_connector_early_unregister,
+       .late_register = mst_connector_late_register,
+       .early_unregister = mst_connector_early_unregister,
        .destroy = intel_connector_destroy,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
        .atomic_duplicate_state = intel_digital_connector_duplicate_state,
  };
  
- static int intel_dp_mst_get_modes(struct drm_connector *connector)
+ static int mst_connector_get_modes(struct drm_connector *connector)
  {
-       return intel_dp_mst_get_ddc_modes(connector);
+       return mst_connector_get_ddc_modes(connector);
  }
  
  static int
intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
-                           struct drm_display_mode *mode,
-                           struct drm_modeset_acquire_ctx *ctx,
-                           enum drm_mode_status *status)
mst_connector_mode_valid_ctx(struct drm_connector *connector,
+                            struct drm_display_mode *mode,
+                            struct drm_modeset_acquire_ctx *ctx,
+                            enum drm_mode_status *status)
  {
+       struct intel_display *display = to_intel_display(connector->dev);
        struct drm_i915_private *dev_priv = to_i915(connector->dev);
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct intel_dp *intel_dp = intel_connector->mst_port;
        struct drm_dp_mst_topology_mgr *mgr = &intel_dp->mst_mgr;
        struct drm_dp_mst_port *port = intel_connector->port;
        const int min_bpp = 18;
-       int max_dotclk = to_i915(connector->dev)->display.cdclk.max_dotclk_freq;
+       int max_dotclk = display->cdclk.max_dotclk_freq;
        int max_rate, mode_rate, max_lanes, max_link_clock;
        int ret;
        bool dsc = false;
        return 0;
  }
  
- static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *connector,
-                                                        struct drm_atomic_state *state)
+ static struct drm_encoder *
+ mst_connector_atomic_best_encoder(struct drm_connector *connector,
+                                 struct drm_atomic_state *state)
  {
        struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
                                                                                         connector);
  }
  
  static int
intel_dp_mst_detect(struct drm_connector *connector,
-                   struct drm_modeset_acquire_ctx *ctx, bool force)
mst_connector_detect_ctx(struct drm_connector *connector,
+                        struct drm_modeset_acquire_ctx *ctx, bool force)
  {
-       struct drm_i915_private *i915 = to_i915(connector->dev);
+       struct intel_display *display = to_intel_display(connector->dev);
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct intel_dp *intel_dp = intel_connector->mst_port;
  
-       if (!intel_display_device_enabled(i915))
+       if (!intel_display_device_enabled(display))
                return connector_status_disconnected;
  
        if (drm_connector_is_unregistered(connector))
                return connector_status_disconnected;
  
-       if (!intel_display_driver_check_access(i915))
+       if (!intel_display_driver_check_access(display))
                return connector->status;
  
        intel_dp_flush_connector_commits(intel_connector);
                                      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_ctx = intel_dp_mst_mode_valid_ctx,
-       .atomic_best_encoder = intel_mst_atomic_best_encoder,
-       .atomic_check = intel_dp_mst_atomic_check,
-       .detect_ctx = intel_dp_mst_detect,
+ static const struct drm_connector_helper_funcs mst_connector_helper_funcs = {
+       .get_modes = mst_connector_get_modes,
+       .mode_valid_ctx = mst_connector_mode_valid_ctx,
+       .atomic_best_encoder = mst_connector_atomic_best_encoder,
+       .atomic_check = mst_connector_atomic_check,
+       .detect_ctx = mst_connector_detect_ctx,
  };
  
- static void intel_dp_mst_encoder_destroy(struct drm_encoder *encoder)
+ static void mst_stream_encoder_destroy(struct drm_encoder *encoder)
  {
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(to_intel_encoder(encoder));
  
        kfree(intel_mst);
  }
  
- static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = {
-       .destroy = intel_dp_mst_encoder_destroy,
+ static const struct drm_encoder_funcs mst_stream_encoder_funcs = {
+       .destroy = mst_stream_encoder_destroy,
  };
  
- static bool intel_dp_mst_get_hw_state(struct intel_connector *connector)
+ static bool mst_connector_get_hw_state(struct intel_connector *connector)
  {
-       if (intel_attached_encoder(connector) && connector->base.state->crtc) {
-               enum pipe pipe;
-               if (!intel_attached_encoder(connector)->get_hw_state(intel_attached_encoder(connector), &pipe))
-                       return false;
-               return true;
-       }
-       return false;
+       /* This is the MST stream encoder set in ->pre_enable, if any */
+       struct intel_encoder *encoder = intel_attached_encoder(connector);
+       enum pipe pipe;
+       if (!encoder || !connector->base.state->crtc)
+               return false;
+       return encoder->get_hw_state(encoder, &pipe);
  }
  
- static int intel_dp_mst_add_properties(struct intel_dp *intel_dp,
-                                      struct drm_connector *connector,
-                                      const char *pathprop)
+ static int mst_topology_add_connector_properties(struct intel_dp *intel_dp,
+                                                struct drm_connector *connector,
+                                                const char *pathprop)
  {
-       struct drm_i915_private *i915 = to_i915(connector->dev);
+       struct intel_display *display = to_intel_display(intel_dp);
  
        drm_object_attach_property(&connector->base,
-                                  i915->drm.mode_config.path_property, 0);
+                                  display->drm->mode_config.path_property, 0);
        drm_object_attach_property(&connector->base,
-                                  i915->drm.mode_config.tile_property, 0);
+                                  display->drm->mode_config.tile_property, 0);
  
        intel_attach_force_audio_property(connector);
        intel_attach_broadcast_rgb_property(connector);
@@@ -1653,7 -1669,7 +1669,7 @@@ intel_dp_mst_read_decompression_port_ds
  
  static bool detect_dsc_hblank_expansion_quirk(const struct intel_connector *connector)
  {
-       struct drm_i915_private *i915 = to_i915(connector->base.dev);
+       struct intel_display *display = to_intel_display(connector);
        struct drm_dp_aux *aux = connector->dp.dsc_decompression_aux;
        struct drm_dp_desc desc;
        u8 dpcd[DP_RECEIVER_CAP_SIZE];
            !(dpcd[DP_RECEIVE_PORT_0_CAP_0] & DP_HBLANK_EXPANSION_CAPABLE))
                return false;
  
-       drm_dbg_kms(&i915->drm,
+       drm_dbg_kms(display->drm,
                    "[CONNECTOR:%d:%s] DSC HBLANK expansion quirk detected\n",
                    connector->base.base.id, connector->base.name);
  
        return true;
  }
  
- static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
-                                                       struct drm_dp_mst_port *port,
-                                                       const char *pathprop)
+ static struct drm_connector *
+ mst_topology_add_connector(struct drm_dp_mst_topology_mgr *mgr,
+                          struct drm_dp_mst_port *port,
+                          const char *pathprop)
  {
        struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
+       struct intel_display *display = to_intel_display(intel_dp);
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = dig_port->base.base.dev;
-       struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_connector *intel_connector;
        struct drm_connector *connector;
        enum pipe pipe;
        if (!intel_connector)
                return NULL;
  
-       intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
 +      connector = &intel_connector->base;
 +
+       intel_connector->get_hw_state = mst_connector_get_hw_state;
        intel_connector->sync_state = intel_dp_connector_sync_state;
        intel_connector->mst_port = intel_dp;
        intel_connector->port = port;
  
        intel_dp_init_modeset_retry_work(intel_connector);
  
-       ret = drm_connector_dynamic_init(&dev_priv->drm, connector, &intel_dp_mst_connector_funcs,
 -      /*
 -       * TODO: The following drm_connector specific initialization belongs
 -       * to DRM core, however it happens atm too late in
 -       * drm_connector_init(). That function will also expose the connector
 -       * to in-kernel users, so it can't be called until the connector is
 -       * sufficiently initialized; init the device pointer used by the
 -       * following DSC setup, until a fix moving this to DRM core.
 -       */
 -      intel_connector->base.dev = mgr->dev;
 -
 -      intel_connector->dp.dsc_decompression_aux = drm_dp_mst_dsc_aux_for_port(port);
 -      intel_dp_mst_read_decompression_port_dsc_caps(intel_dp, intel_connector);
 -      intel_connector->dp.dsc_hblank_expansion_quirk =
 -              detect_dsc_hblank_expansion_quirk(intel_connector);
 -
 -      connector = &intel_connector->base;
 -      ret = drm_connector_init(display->drm, connector, &mst_connector_funcs,
 -                               DRM_MODE_CONNECTOR_DisplayPort);
++      ret = drm_connector_dynamic_init(display->drm, connector, &mst_connector_funcs,
 +                                       DRM_MODE_CONNECTOR_DisplayPort, NULL);
        if (ret) {
                drm_dp_mst_put_port_malloc(port);
                intel_connector_free(intel_connector);
                return NULL;
        }
  
-       drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs);
 +      intel_connector->dp.dsc_decompression_aux = drm_dp_mst_dsc_aux_for_port(port);
 +      intel_dp_mst_read_decompression_port_dsc_caps(intel_dp, intel_connector);
 +      intel_connector->dp.dsc_hblank_expansion_quirk =
 +              detect_dsc_hblank_expansion_quirk(intel_connector);
 +
+       drm_connector_helper_add(connector, &mst_connector_helper_funcs);
  
-       for_each_pipe(dev_priv, pipe) {
+       for_each_pipe(display, pipe) {
                struct drm_encoder *enc =
                        &intel_dp->mst_encoders[pipe]->base.base;
  
                        goto err;
        }
  
-       ret = intel_dp_mst_add_properties(intel_dp, connector, pathprop);
+       ret = mst_topology_add_connector_properties(intel_dp, connector, pathprop);
        if (ret)
                goto err;
  
        ret = intel_dp_hdcp_init(dig_port, intel_connector);
        if (ret)
-               drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP MST init failed, skipping.\n",
+               drm_dbg_kms(display->drm, "[%s:%d] HDCP MST init failed, skipping.\n",
                            connector->name, connector->base.id);
  
        return connector;
  }
  
  static void
intel_dp_mst_poll_hpd_irq(struct drm_dp_mst_topology_mgr *mgr)
mst_topology_poll_hpd_irq(struct drm_dp_mst_topology_mgr *mgr)
  {
        struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
  
        intel_hpd_trigger_irq(dp_to_dig_port(intel_dp));
  }
  
- static const struct drm_dp_mst_topology_cbs mst_cbs = {
-       .add_connector = intel_dp_add_mst_connector,
-       .poll_hpd_irq = intel_dp_mst_poll_hpd_irq,
+ static const struct drm_dp_mst_topology_cbs mst_topology_cbs = {
+       .add_connector = mst_topology_add_connector,
+       .poll_hpd_irq = mst_topology_poll_hpd_irq,
  };
  
+ /* Create a fake encoder for an individual MST stream */
  static struct intel_dp_mst_encoder *
intel_dp_create_fake_mst_encoder(struct intel_digital_port *dig_port, enum pipe pipe)
mst_stream_encoder_create(struct intel_digital_port *dig_port, enum pipe pipe)
  {
+       struct intel_display *display = to_intel_display(dig_port);
+       struct intel_encoder *primary_encoder = &dig_port->base;
        struct intel_dp_mst_encoder *intel_mst;
-       struct intel_encoder *intel_encoder;
-       struct drm_device *dev = dig_port->base.base.dev;
+       struct intel_encoder *encoder;
  
        intel_mst = kzalloc(sizeof(*intel_mst), GFP_KERNEL);
  
                return NULL;
  
        intel_mst->pipe = pipe;
-       intel_encoder = &intel_mst->base;
+       encoder = &intel_mst->base;
        intel_mst->primary = dig_port;
  
-       drm_encoder_init(dev, &intel_encoder->base, &intel_dp_mst_enc_funcs,
+       drm_encoder_init(display->drm, &encoder->base, &mst_stream_encoder_funcs,
                         DRM_MODE_ENCODER_DPMST, "DP-MST %c", pipe_name(pipe));
  
-       intel_encoder->type = INTEL_OUTPUT_DP_MST;
-       intel_encoder->power_domain = dig_port->base.power_domain;
-       intel_encoder->port = dig_port->base.port;
-       intel_encoder->cloneable = 0;
+       encoder->type = INTEL_OUTPUT_DP_MST;
+       encoder->power_domain = primary_encoder->power_domain;
+       encoder->port = primary_encoder->port;
+       encoder->cloneable = 0;
        /*
         * This is wrong, but broken userspace uses the intersection
         * of possible_crtcs of all the encoders of a given connector
         * To keep such userspace functioning we must misconfigure
         * this to make sure the intersection is not empty :(
         */
-       intel_encoder->pipe_mask = ~0;
-       intel_encoder->compute_config = intel_dp_mst_compute_config;
-       intel_encoder->compute_config_late = intel_dp_mst_compute_config_late;
-       intel_encoder->disable = intel_mst_disable_dp;
-       intel_encoder->post_disable = intel_mst_post_disable_dp;
-       intel_encoder->post_pll_disable = intel_mst_post_pll_disable_dp;
-       intel_encoder->update_pipe = intel_ddi_update_pipe;
-       intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp;
-       intel_encoder->pre_enable = intel_mst_pre_enable_dp;
-       intel_encoder->enable = intel_mst_enable_dp;
-       intel_encoder->audio_enable = intel_audio_codec_enable;
-       intel_encoder->audio_disable = intel_audio_codec_disable;
-       intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
-       intel_encoder->get_config = intel_dp_mst_enc_get_config;
-       intel_encoder->initial_fastset_check = intel_dp_mst_initial_fastset_check;
+       encoder->pipe_mask = ~0;
+       encoder->compute_config = mst_stream_compute_config;
+       encoder->compute_config_late = mst_stream_compute_config_late;
+       encoder->disable = mst_stream_disable;
+       encoder->post_disable = mst_stream_post_disable;
+       encoder->post_pll_disable = mst_stream_post_pll_disable;
+       encoder->update_pipe = intel_ddi_update_pipe;
+       encoder->pre_pll_enable = mst_stream_pre_pll_enable;
+       encoder->pre_enable = mst_stream_pre_enable;
+       encoder->enable = mst_stream_enable;
+       encoder->audio_enable = intel_audio_codec_enable;
+       encoder->audio_disable = intel_audio_codec_disable;
+       encoder->get_hw_state = mst_stream_get_hw_state;
+       encoder->get_config = mst_stream_get_config;
+       encoder->initial_fastset_check = mst_stream_initial_fastset_check;
  
        return intel_mst;
  
  }
  
+ /* Create the fake encoders for MST streams */
  static bool
intel_dp_create_fake_mst_encoders(struct intel_digital_port *dig_port)
mst_stream_encoders_create(struct intel_digital_port *dig_port)
  {
+       struct intel_display *display = to_intel_display(dig_port);
        struct intel_dp *intel_dp = &dig_port->dp;
-       struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
        enum pipe pipe;
  
-       for_each_pipe(dev_priv, pipe)
-               intel_dp->mst_encoders[pipe] = intel_dp_create_fake_mst_encoder(dig_port, pipe);
+       for_each_pipe(display, pipe)
+               intel_dp->mst_encoders[pipe] = mst_stream_encoder_create(dig_port, pipe);
        return true;
  }
  
@@@ -1851,25 -1879,25 +1870,25 @@@ intel_dp_mst_encoder_active_links(struc
  int
  intel_dp_mst_encoder_init(struct intel_digital_port *dig_port, int conn_base_id)
  {
-       struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
+       struct intel_display *display = to_intel_display(dig_port);
        struct intel_dp *intel_dp = &dig_port->dp;
        enum port port = dig_port->base.port;
        int ret;
  
-       if (!HAS_DP_MST(i915) || intel_dp_is_edp(intel_dp))
+       if (!HAS_DP_MST(display) || intel_dp_is_edp(intel_dp))
                return 0;
  
-       if (DISPLAY_VER(i915) < 12 && port == PORT_A)
+       if (DISPLAY_VER(display) < 12 && port == PORT_A)
                return 0;
  
-       if (DISPLAY_VER(i915) < 11 && port == PORT_E)
+       if (DISPLAY_VER(display) < 11 && port == PORT_E)
                return 0;
  
-       intel_dp->mst_mgr.cbs = &mst_cbs;
+       intel_dp->mst_mgr.cbs = &mst_topology_cbs;
  
        /* create encoders */
-       intel_dp_create_fake_mst_encoders(dig_port);
-       ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, &i915->drm,
+       mst_stream_encoders_create(dig_port);
+       ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, display->drm,
                                           &intel_dp->aux, 16, 3, conn_base_id);
        if (ret) {
                intel_dp->mst_mgr.cbs = NULL;
index 33b8f27720760c3065d830d795e7c7ce829ca1fd,0e4d78b146f6b2fe9bc050fe8c073bbb9af1c321..13811244c82bbbbc0378a02a2b04779a4ea1bffb
@@@ -390,7 -390,7 +390,7 @@@ void intel_tc_port_set_fia_lane_count(s
  {
        struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
        struct intel_tc_port *tc = to_tc_port(dig_port);
-       bool lane_reversal = dig_port->saved_port_bits & DDI_BUF_PORT_REVERSAL;
+       bool lane_reversal = dig_port->lane_reversal;
        u32 val;
  
        if (DISPLAY_VER(i915) >= 14)
@@@ -1013,52 -1013,21 +1013,52 @@@ xelpdp_tc_phy_wait_for_tcss_power(struc
        return true;
  }
  
 +/*
 + * Gfx driver WA 14020908590 for PTL tcss_rxdetect_clkswb_req/ack
 + * handshake violation when pwwreq= 0->1 during TC7/10 entry
 + */
 +static void xelpdp_tc_power_request_wa(struct intel_display *display, bool enable)
 +{
 +      /* check if mailbox is running busy */
 +      if (intel_de_wait_for_clear(display, TCSS_DISP_MAILBOX_IN_CMD,
 +                                  TCSS_DISP_MAILBOX_IN_CMD_RUN_BUSY, 10)) {
 +              drm_dbg_kms(display->drm,
 +                          "Timeout waiting for TCSS mailbox run/busy bit to clear\n");
 +              return;
 +      }
 +
 +      intel_de_write(display, TCSS_DISP_MAILBOX_IN_DATA, enable ? 1 : 0);
 +      intel_de_write(display, TCSS_DISP_MAILBOX_IN_CMD,
 +                     TCSS_DISP_MAILBOX_IN_CMD_RUN_BUSY |
 +                     TCSS_DISP_MAILBOX_IN_CMD_DATA(0x1));
 +
 +      /* wait to clear mailbox running busy bit before continuing */
 +      if (intel_de_wait_for_clear(display, TCSS_DISP_MAILBOX_IN_CMD,
 +                                  TCSS_DISP_MAILBOX_IN_CMD_RUN_BUSY, 10)) {
 +              drm_dbg_kms(display->drm,
 +                          "Timeout after writing data to mailbox. Mailbox run/busy bit did not clear\n");
 +              return;
 +      }
 +}
 +
  static void __xelpdp_tc_phy_enable_tcss_power(struct intel_tc_port *tc, bool enable)
  {
 -      struct drm_i915_private *i915 = tc_to_i915(tc);
 +      struct intel_display *display = to_intel_display(tc->dig_port);
        enum port port = tc->dig_port->base.port;
 -      i915_reg_t reg = XELPDP_PORT_BUF_CTL1(i915, port);
 +      i915_reg_t reg = XELPDP_PORT_BUF_CTL1(display, port);
        u32 val;
  
        assert_tc_cold_blocked(tc);
  
 -      val = intel_de_read(i915, reg);
 +      if (DISPLAY_VER(display) == 30)
 +              xelpdp_tc_power_request_wa(display, enable);
 +
 +      val = intel_de_read(display, reg);
        if (enable)
                val |= XELPDP_TCSS_POWER_REQUEST;
        else
                val &= ~XELPDP_TCSS_POWER_REQUEST;
 -      intel_de_write(i915, reg, val);
 +      intel_de_write(display, reg, val);
  }
  
  static bool xelpdp_tc_phy_enable_tcss_power(struct intel_tc_port *tc, bool enable)
index 1bafefb726f546aae82cc5a8b97fb2c78a6e87d1,bcf854dc93b46ac34bf3ff947b9b0db618a7b941..eb3fcc9e77a5fa099a9c68e445e349cb53aac38c
@@@ -45,6 -45,7 +45,7 @@@
  #include <drm/drm_managed.h>
  #include <drm/drm_probe_helper.h>
  
+ #include "display/i9xx_display_sr.h"
  #include "display/intel_acpi.h"
  #include "display/intel_bw.h"
  #include "display/intel_cdclk.h"
@@@ -60,6 -61,7 +61,7 @@@
  #include "display/intel_pch_refclk.h"
  #include "display/intel_pps.h"
  #include "display/intel_sprite_uapi.h"
+ #include "display/intel_vga.h"
  #include "display/skl_watermark.h"
  
  #include "gem/i915_gem_context.h"
@@@ -93,7 -95,6 +95,6 @@@
  #include "i915_memcpy.h"
  #include "i915_perf.h"
  #include "i915_query.h"
- #include "i915_suspend.h"
  #include "i915_switcheroo.h"
  #include "i915_sysfs.h"
  #include "i915_utils.h"
  #include "intel_pci_config.h"
  #include "intel_pcode.h"
  #include "intel_region_ttm.h"
+ #include "intel_sbi.h"
+ #include "vlv_sideband.h"
  #include "vlv_suspend.h"
  
  static const struct drm_driver i915_drm_driver;
@@@ -217,6 -220,7 +220,7 @@@ static void sanitize_gpu(struct drm_i91
   */
  static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
  {
+       struct intel_display *display = &dev_priv->display;
        int ret = 0;
  
        if (i915_inject_probe_failure(dev_priv))
        spin_lock_init(&dev_priv->irq_lock);
        spin_lock_init(&dev_priv->gpu_error.lock);
  
+       intel_sbi_init(dev_priv);
+       vlv_iosf_sb_init(dev_priv);
        mutex_init(&dev_priv->sb_lock);
-       cpu_latency_qos_add_request(&dev_priv->sb_qos, PM_QOS_DEFAULT_VALUE);
  
        i915_memcpy_init_early(dev_priv);
        intel_runtime_pm_init_early(&dev_priv->runtime_pm);
        intel_detect_pch(dev_priv);
  
        intel_irq_init(dev_priv);
-       intel_display_driver_early_probe(dev_priv);
+       intel_display_driver_early_probe(display);
        intel_clock_gating_hooks_init(dev_priv);
  
        intel_detect_preproduction_hw(dev_priv);
@@@ -282,16 -287,19 +287,19 @@@ err_workqueues
   */
  static void i915_driver_late_release(struct drm_i915_private *dev_priv)
  {
+       struct intel_display *display = &dev_priv->display;
        intel_irq_fini(dev_priv);
-       intel_power_domains_cleanup(dev_priv);
+       intel_power_domains_cleanup(display);
        i915_gem_cleanup_early(dev_priv);
        intel_gt_driver_late_release_all(dev_priv);
        intel_region_ttm_device_fini(dev_priv);
        vlv_suspend_cleanup(dev_priv);
        i915_workqueues_cleanup(dev_priv);
  
-       cpu_latency_qos_remove_request(&dev_priv->sb_qos);
        mutex_destroy(&dev_priv->sb_lock);
+       vlv_iosf_sb_fini(dev_priv);
+       intel_sbi_fini(dev_priv);
  
        i915_params_free(&dev_priv->params);
  }
   */
  static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
  {
+       struct intel_display *display = &dev_priv->display;
        struct intel_gt *gt;
        int ret, i;
  
        /* Try to make sure MCHBAR is enabled before poking at it */
        intel_gmch_bar_setup(dev_priv);
        intel_device_info_runtime_init(dev_priv);
-       intel_display_device_info_runtime_init(dev_priv);
+       intel_display_device_info_runtime_init(display);
  
        for_each_gt(gt, dev_priv, i) {
                ret = intel_gt_init_mmio(gt);
@@@ -599,6 -608,7 +608,7 @@@ static void i915_driver_hw_remove(struc
   */
  static void i915_driver_register(struct drm_i915_private *dev_priv)
  {
+       struct intel_display *display = &dev_priv->display;
        struct intel_gt *gt;
        unsigned int i;
  
  
        i915_hwmon_register(dev_priv);
  
-       intel_display_driver_register(dev_priv);
+       intel_display_driver_register(display);
  
-       intel_power_domains_enable(dev_priv);
+       intel_power_domains_enable(display);
        intel_runtime_pm_enable(&dev_priv->runtime_pm);
  
        intel_register_dsm_handler();
   */
  static void i915_driver_unregister(struct drm_i915_private *dev_priv)
  {
+       struct intel_display *display = &dev_priv->display;
        struct intel_gt *gt;
        unsigned int i;
  
        intel_unregister_dsm_handler();
  
        intel_runtime_pm_disable(&dev_priv->runtime_pm);
-       intel_power_domains_disable(dev_priv);
+       intel_power_domains_disable(display);
  
-       intel_display_driver_unregister(dev_priv);
+       intel_display_driver_unregister(display);
  
        intel_pxp_fini(dev_priv);
  
@@@ -731,7 -742,7 +742,7 @@@ i915_driver_create(struct pci_dev *pdev
        /* Set up device info and initial runtime info. */
        intel_device_info_driver_create(i915, pdev->device, match_info);
  
-       intel_display_device_probe(i915);
+       intel_display_device_probe(pdev);
  
        return i915;
  }
  int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  {
        struct drm_i915_private *i915;
+       struct intel_display *display;
        int ret;
  
        ret = pci_enable_device(pdev);
                return PTR_ERR(i915);
        }
  
+       display = &i915->display;
        ret = i915_driver_early_probe(i915);
        if (ret < 0)
                goto out_pci_disable;
        if (ret < 0)
                goto out_cleanup_mmio;
  
-       ret = intel_display_driver_probe_noirq(i915);
+       ret = intel_display_driver_probe_noirq(display);
        if (ret < 0)
                goto out_cleanup_hw;
  
        if (ret)
                goto out_cleanup_modeset;
  
-       ret = intel_display_driver_probe_nogem(i915);
+       ret = intel_display_driver_probe_nogem(display);
        if (ret)
                goto out_cleanup_irq;
  
        if (ret && ret != -ENODEV)
                drm_dbg(&i915->drm, "pxp init failed with %d\n", ret);
  
-       ret = intel_display_driver_probe(i915);
+       ret = intel_display_driver_probe(display);
        if (ret)
                goto out_cleanup_gem;
  
@@@ -824,14 -838,14 +838,14 @@@ out_cleanup_gem
        i915_gem_driver_release(i915);
  out_cleanup_modeset2:
        /* FIXME clean up the error path */
-       intel_display_driver_remove(i915);
+       intel_display_driver_remove(display);
        intel_irq_uninstall(i915);
-       intel_display_driver_remove_noirq(i915);
+       intel_display_driver_remove_noirq(display);
        goto out_cleanup_modeset;
  out_cleanup_irq:
        intel_irq_uninstall(i915);
  out_cleanup_modeset:
-       intel_display_driver_remove_nogem(i915);
+       intel_display_driver_remove_nogem(display);
  out_cleanup_hw:
        i915_driver_hw_remove(i915);
        intel_memory_regions_driver_release(i915);
@@@ -851,6 -865,7 +865,7 @@@ out_pci_disable
  
  void i915_driver_remove(struct drm_i915_private *i915)
  {
+       struct intel_display *display = &i915->display;
        intel_wakeref_t wakeref;
  
        wakeref = intel_runtime_pm_get(&i915->runtime_pm);
  
        intel_gvt_driver_remove(i915);
  
-       intel_display_driver_remove(i915);
+       intel_display_driver_remove(display);
  
        intel_irq_uninstall(i915);
  
-       intel_display_driver_remove_noirq(i915);
+       intel_display_driver_remove_noirq(display);
  
        i915_reset_error_state(i915);
        i915_gem_driver_remove(i915);
  
-       intel_display_driver_remove_nogem(i915);
+       intel_display_driver_remove_nogem(display);
  
        i915_driver_hw_remove(i915);
  
  static void i915_driver_release(struct drm_device *dev)
  {
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct intel_display *display = &dev_priv->display;
        struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
        intel_wakeref_t wakeref;
  
  
        i915_driver_late_release(dev_priv);
  
-       intel_display_device_remove(dev_priv);
+       intel_display_device_remove(display);
  }
  
  static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
@@@ -936,14 -952,16 +952,16 @@@ static void i915_driver_postclose(struc
  
  void i915_driver_shutdown(struct drm_i915_private *i915)
  {
+       struct intel_display *display = &i915->display;
        disable_rpm_wakeref_asserts(&i915->runtime_pm);
        intel_runtime_pm_disable(&i915->runtime_pm);
-       intel_power_domains_disable(i915);
+       intel_power_domains_disable(display);
  
        intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
        if (HAS_DISPLAY(i915)) {
                drm_kms_helper_poll_disable(&i915->drm);
-               intel_display_driver_disable_user_access(i915);
+               intel_display_driver_disable_user_access(display);
  
                drm_atomic_helper_shutdown(&i915->drm);
        }
        intel_hpd_cancel_work(i915);
  
        if (HAS_DISPLAY(i915))
-               intel_display_driver_suspend_access(i915);
+               intel_display_driver_suspend_access(display);
  
        intel_encoder_suspend_all(&i915->display);
        intel_encoder_shutdown_all(&i915->display);
         * - unify the driver remove and system/runtime suspend sequences with
         *   the above unified shutdown/poweroff sequence.
         */
-       intel_power_domains_driver_remove(i915);
+       intel_power_domains_driver_remove(display);
        enable_rpm_wakeref_asserts(&i915->runtime_pm);
  
        intel_runtime_pm_driver_last_release(&i915->runtime_pm);
@@@ -1022,24 -1040,22 +1040,22 @@@ static int i915_drm_suspend(struct drm_
  
        /* We do a lot of poking in a lot of registers, make sure they work
         * properly. */
-       intel_power_domains_disable(dev_priv);
+       intel_power_domains_disable(display);
        intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true);
        if (HAS_DISPLAY(dev_priv)) {
                drm_kms_helper_poll_disable(dev);
-               intel_display_driver_disable_user_access(dev_priv);
+               intel_display_driver_disable_user_access(display);
        }
  
        pci_save_state(pdev);
  
-       intel_display_driver_suspend(dev_priv);
-       intel_dp_mst_suspend(dev_priv);
+       intel_display_driver_suspend(display);
  
        intel_irq_suspend(dev_priv);
        intel_hpd_cancel_work(dev_priv);
  
        if (HAS_DISPLAY(dev_priv))
-               intel_display_driver_suspend_access(dev_priv);
+               intel_display_driver_suspend_access(display);
  
        intel_encoder_suspend_all(&dev_priv->display);
  
        intel_dpt_suspend(dev_priv);
        i915_ggtt_suspend(to_gt(dev_priv)->ggtt);
  
-       i915_save_display(dev_priv);
+       i9xx_display_sr_save(display);
  
        opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
        intel_opregion_suspend(display, opregion_target_state);
  static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
  {
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct intel_display *display = &dev_priv->display;
        struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
        struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
        struct intel_gt *gt;
        for_each_gt(gt, dev_priv, i)
                intel_uncore_suspend(gt->uncore);
  
-       intel_power_domains_suspend(dev_priv, s2idle);
-       intel_display_power_suspend_late(dev_priv);
+       intel_display_power_suspend_late(display, s2idle);
  
        ret = vlv_suspend_complete(dev_priv);
        if (ret) {
                drm_err(&dev_priv->drm, "Suspend complete failed: %d\n", ret);
-               intel_power_domains_resume(dev_priv);
+               intel_display_power_resume_early(display);
  
                goto out;
        }
@@@ -1166,7 -1181,12 +1181,12 @@@ static int i915_drm_resume(struct drm_d
  
        intel_dmc_resume(display);
  
-       i915_restore_display(dev_priv);
+       i9xx_display_sr_restore(display);
+       intel_vga_redisable(display);
+       intel_gmbus_reset(display);
        intel_pps_unlock_regs_wa(display);
  
        intel_init_pch_refclk(dev_priv);
  
        i915_gem_resume(dev_priv);
  
-       intel_display_driver_init_hw(dev_priv);
+       intel_display_driver_init_hw(display);
  
        intel_clock_gating_init(dev_priv);
  
        if (HAS_DISPLAY(dev_priv))
-               intel_display_driver_resume_access(dev_priv);
+               intel_display_driver_resume_access(display);
  
        intel_hpd_init(dev_priv);
  
-       /* MST sideband requires HPD interrupts enabled */
-       intel_dp_mst_resume(dev_priv);
-       intel_display_driver_resume(dev_priv);
+       intel_display_driver_resume(display);
  
        if (HAS_DISPLAY(dev_priv)) {
-               intel_display_driver_enable_user_access(dev_priv);
+               intel_display_driver_enable_user_access(display);
                drm_kms_helper_poll_enable(dev);
        }
        intel_hpd_poll_disable(dev_priv);
  
        intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false);
  
-       intel_power_domains_enable(dev_priv);
+       intel_power_domains_enable(display);
  
        intel_gvt_resume(dev_priv);
  
  static int i915_drm_resume_early(struct drm_device *dev)
  {
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct intel_display *display = &dev_priv->display;
        struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
        struct intel_gt *gt;
        int ret, i;
        for_each_gt(gt, dev_priv, i)
                intel_gt_resume_early(gt);
  
-       intel_display_power_resume_early(dev_priv);
-       intel_power_domains_resume(dev_priv);
+       intel_display_power_resume_early(display);
  
        enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
@@@ -1486,7 -1503,7 +1503,7 @@@ static int intel_runtime_suspend(struc
        for_each_gt(gt, dev_priv, i)
                intel_uncore_suspend(gt->uncore);
  
-       intel_display_power_suspend(dev_priv);
+       intel_display_power_suspend(display);
  
        ret = vlv_suspend_complete(dev_priv);
        if (ret) {
@@@ -1580,7 -1597,7 +1597,7 @@@ static int intel_runtime_resume(struct 
                drm_dbg(&dev_priv->drm,
                        "Unclaimed access during suspend, bios?\n");
  
-       intel_display_power_resume(dev_priv);
+       intel_display_power_resume(display);
  
        ret = vlv_resume_prepare(dev_priv, true);
  
@@@ -1785,6 -1802,7 +1802,6 @@@ static const struct drm_driver i915_drm
        .fops = &i915_driver_fops,
        .name = DRIVER_NAME,
        .desc = DRIVER_DESC,
 -      .date = DRIVER_DATE,
        .major = DRIVER_MAJOR,
        .minor = DRIVER_MINOR,
        .patchlevel = DRIVER_PATCHLEVEL,
index 80699dbeb2e9d5f2cf40aee199e89634dd2d5f93,96f3e16a5b7d07e13129c960694abff3f2e8def8..a6761cb769b2ba57380226b6d933da5ce31bfb4a
@@@ -414,8 -414,8 +414,8 @@@ int xe_pm_runtime_suspend(struct xe_dev
  
        xe_irq_suspend(xe);
  
-       if (xe->d3cold.allowed)
-               xe_display_pm_suspend_late(xe);
+       xe_display_pm_runtime_suspend_late(xe);
  out:
        if (err)
                xe_display_pm_runtime_resume(xe);
@@@ -738,6 -738,9 +738,6 @@@ void xe_pm_d3cold_allowed_toggle(struc
                xe->d3cold.allowed = false;
  
        mutex_unlock(&xe->d3cold.lock);
 -
 -      drm_dbg(&xe->drm,
 -              "d3cold: allowed=%s\n", str_yes_no(xe->d3cold.allowed));
  }
  
  /**
This page took 0.167041 seconds and 4 git commands to generate.