Compute the most appropriate VS/PE-O index for LT basing on highest
available DP mode.

Use 6th table if encoder supports DP 2.0 or higher. Otherwise use 5th
table for DP.

Warn if encoder does not support DP. In that case fallback to using
default VS/PE tables.

Fill encoder's VS/PE-O buffer with chosen table when overriding
defaults. Return the buffer likewise other _get_buf_trans() hooks.

There are no changes to intel_ddi_dp_level() since selection of correct
row of intel_ddi_buf_trans_entry is same as when no override request has
been done.

v2->v3
- remove unnecessary braces from if block (Suraj)
- return -EINVAL instead of -1 (Suraj)

Signed-off-by: Michał Grzelak <[email protected]>
---
 .../drm/i915/display/intel_ddi_buf_trans.c    | 43 ++++++++++++++++---
 1 file changed, 38 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c 
b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
index 9ae7a780a7639..b6129bcc1996e 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
@@ -1787,9 +1787,32 @@ xe3plpd_get_lt_buf_trans(struct intel_encoder *encoder,
 }
 
 static int
-vspeo_compute_index(struct intel_encoder *encoder)
+lt_compute_index(const struct intel_crtc_state *crtc_state)
 {
-       drm_dbg_kms(to_intel_display(encoder)->drm,
+       if (intel_crtc_has_dp_encoder(crtc_state)) {
+               if (intel_dp_is_uhbr(crtc_state))
+                       return 5;
+               else
+                       return 4;
+       }
+
+       drm_WARN(to_intel_display(crtc_state)->drm, 1,
+                "non-DP (%d) encoder asks to compute VS/PE-O index\n",
+                crtc_state->output_types);
+
+       return -EINVAL;
+}
+
+static int
+vspeo_compute_index(struct intel_encoder *encoder,
+                   const struct intel_crtc_state *crtc_state)
+{
+       struct intel_display *display = to_intel_display(encoder);
+
+       if (HAS_LT_PHY(display))
+               return lt_compute_index(crtc_state);
+
+       drm_dbg_kms(display->drm,
                    "VS/PE-O unsupported, using default VS/PE tables");
 
        return -EINVAL;
@@ -1868,10 +1891,20 @@ const struct intel_ddi_buf_trans 
*intel_ddi_buf_trans_get(struct intel_encoder *
                                                          const struct 
intel_crtc_state *crtc_state,
                                                          int *n_entries)
 {
-       if (!encoder->vspeo)
+       struct intel_display *display = to_intel_display(encoder);
+       struct intel_ddi_buf_trans *buf_trans;
+       int idx;
+
+       buf_trans = (void *) encoder->vspeo;
+       if (!buf_trans)
+               return encoder->get_buf_trans(encoder, crtc_state, n_entries);
+
+       idx = vspeo_compute_index(encoder, crtc_state);
+       if (idx < 0)
                return encoder->get_buf_trans(encoder, crtc_state, n_entries);
 
-       vspeo_compute_index(encoder);
+       buf_trans->entries = display->vbt.vspeo.bufs_mtrx[idx];
+       buf_trans->num_entries = display->vbt.vspeo.num_rows;
 
-       return encoder->get_buf_trans(encoder, crtc_state, n_entries);
+       return intel_get_buf_trans(buf_trans, n_entries);
 }
-- 
2.45.2

Reply via email to