> Subject: [PATCH v4 09/10] drm/i915: override Combo's VS/PE when requested
> 
> Add accessor function for Combo to read requested table from VBT #57.
> Parse the requested table and transform data into port's buffer.
> 
> For EHL, in cases when eDP encoder uses low vswing, choose 3rd table if
> encoder supports HBR3. Otherwise use 2nd table for eDP using low vswing.
> 
> In cases when eDP encoder does not use low vswing, choose 2nd table if
> encoder supports mode higher or including HBR2. Otherwise use 3rd table for
> eDP not using low vswing.
> 
> For external DP use 2nd table if encoder supports modes higher than or
> including HBR2. Use 1st table if external DP encoder supports modes lower
> than HBR2.
> 
> For JSL, always use 1st table for external DP. For eDPs not using low vswing
> use 1st table as well.
> 
> In cases when eDP encoder uses low vswing, choose 1st table if encoder
> supports HBR3. When encoder supports HBR2 choose 3rd table. When
> encoder supports modes lower than HBR2 choose 2nd table.
> 
> 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.
> 
> Looking from other OSes, in case when encoder does not support DP we could
> theoretically use 1st table. However, as of now, use default tables.
> 
> Signed-off-by: Michał Grzelak <[email protected]>
> ---
>  drivers/gpu/drm/i915/display/intel_bios.c     | 41 ++++++++++++++
>  drivers/gpu/drm/i915/display/intel_bios.h     |  3 ++
>  .../drm/i915/display/intel_ddi_buf_trans.c    | 54 +++++++++++++++++--
>  .../drm/i915/display/intel_ddi_buf_trans.h    |  6 +++
>  4 files changed, 101 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c
> b/drivers/gpu/drm/i915/display/intel_bios.c
> index 2d357d332cb0..6adec6e60df3 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -3933,6 +3933,47 @@ intel_bios_encoder_get_cx0_vspeo(const struct
> intel_bios_encoder_data *devdata,
>       return vspeo;
>  }
> 
> +const struct intel_ddi_buf_trans *
> +intel_bios_encoder_get_combo_vspeo(const struct intel_bios_encoder_data
> *devdata,
> +                                int idx)
> +{
> +     struct intel_display *display = devdata->display;
> +     struct intel_ddi_buf_trans *vspeo = (void *) devdata->vspeo;
> +     union intel_ddi_buf_trans_entry *entries = (void *) vspeo->entries;
> +     const u32 *tables = display->vbt.vspeo.tables;
> +     int num_columns = display->vbt.vspeo.num_columns;
> +     int num_rows = display->vbt.vspeo.num_rows;
> +     size_t offset = 0;
> +     int level;
> +
> +     INTEL_DISPLAY_STATE_WARN(display,
> +                              idx < COMBO_HIGH_VSWING_HBR3 ||
> +                              idx > COMBO_LOW_VSWING_EDP_HBR3,
> +                              "Combo requested invalid VS/PE-O table:
> %d\n", idx);

Same comment as previous patch

> +
> +     offset += idx * num_rows * num_columns;
> +
> +     for (level = 0; level < num_rows; level++) {
> +
> +             u32 dw2_swing_sel = tables[offset];
> +             u32 dw7_n_scalar = tables[offset+1];
> +             u32 dw4_cursor_coeff = tables[offset+2];
> +             u32 dw4_post_cursor_2 = tables[offset+3];
> +             u32 dw4_post_cursor_1 = tables[offset+4];

Spaces around operator

Regards,
Suraj Kandpal

> +
> +             entries[level].icl.dw2_swing_sel = dw2_swing_sel;
> +             entries[level].icl.dw7_n_scalar = dw7_n_scalar;
> +             entries[level].icl.dw4_cursor_coeff = dw4_cursor_coeff;
> +             entries[level].icl.dw4_post_cursor_2 = dw4_post_cursor_2;
> +             entries[level].icl.dw4_post_cursor_1 = dw4_post_cursor_1;
> +
> +             offset += num_columns;
> +     }
> +
> +     vspeo->num_entries = num_rows;
> +     return vspeo;
> +}
> +
>  bool intel_bios_encoder_is_dedicated_external(const struct
> intel_bios_encoder_data *devdata)  {
>       return devdata->display->vbt.version >= 264 && diff --git
> a/drivers/gpu/drm/i915/display/intel_bios.h
> b/drivers/gpu/drm/i915/display/intel_bios.h
> index b153c009efc9..c6c1f73a774a 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.h
> +++ b/drivers/gpu/drm/i915/display/intel_bios.h
> @@ -79,6 +79,9 @@ intel_bios_encoder_get_lt_vspeo(const struct
> intel_bios_encoder_data *devdata,  const struct intel_ddi_buf_trans *
> intel_bios_encoder_get_cx0_vspeo(const struct intel_bios_encoder_data
> *devdata,
>                                int table);
> +const struct intel_ddi_buf_trans *
> +intel_bios_encoder_get_combo_vspeo(const struct intel_bios_encoder_data
> *devdata,
> +                                int table);
> 
>  bool intel_bios_encoder_requests_vspeo(const struct
> intel_bios_encoder_data *devdata);  bool
> intel_bios_encoder_supports_dvi(const struct intel_bios_encoder_data
> *devdata); 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 3b444665c31d..d1503318636b 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
> @@ -1786,6 +1786,50 @@ xe3plpd_get_lt_buf_trans(struct intel_encoder
> *encoder,
>               return intel_get_buf_trans(&xe3plpd_lt_trans_dp14,
> n_entries);  }
> 
> +static int
> +jsl_get_combo_vspeo_index(struct intel_encoder *encoder,
> +                       const struct intel_crtc_state *crtc_state) {
> +     if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) {
> +             if (use_edp_low_vswing(encoder)) {
> +                     if (crtc_state->port_clock > 540000)
> +                             return COMBO_HIGH_VSWING_HBR3;
> +                     else if (crtc_state->port_clock > 270000)
> +                             return COMBO_LOW_VSWING_EDP_HBR3;
> +                     else
> +                             return COMBO_LOW_VSWING_EDP_HBR2;
> +             }
> +     }
> +
> +     if (intel_crtc_has_dp_encoder(crtc_state))
> +             return COMBO_HIGH_VSWING_HBR3;
> +
> +     return -EINVAL;
> +}
> +
> +static int
> +ehl_get_combo_vspeo_index(struct intel_encoder *encoder,
> +                       const struct intel_crtc_state *crtc_state) {
> +     if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) {
> +             if (use_edp_low_vswing(encoder)) {
> +                     if (crtc_state->port_clock > 540000)
> +                             return COMBO_LOW_VSWING_EDP_HBR3;
> +                     else
> +                             return COMBO_LOW_VSWING_EDP_HBR2;
> +             }
> +     }
> +
> +     if (intel_crtc_has_dp_encoder(crtc_state)) {
> +             if (crtc_state->port_clock > 270000)
> +                     return COMBO_LOW_VSWING_EDP_HBR2;
> +             else
> +                     return COMBO_HIGH_VSWING_HBR3;
> +     }
> +
> +     return -EINVAL;
> +}
> +
>  static int
>  snps_get_c10_vspeo_index(struct intel_encoder *encoder,
>                        const struct intel_crtc_state *crtc_state) @@ -
> 1881,11 +1925,15 @@ void intel_ddi_buf_trans_init(struct intel_encoder
> *encoder)
>               else
>                       encoder->get_buf_trans = tgl_get_dkl_buf_trans;
>       } else if (DISPLAY_VER(display) == 11) {
> -             if (display->platform.jasperlake)
> +             if (display->platform.jasperlake) {
>                       encoder->get_buf_trans = jsl_get_combo_buf_trans;
> -             else if (display->platform.elkhartlake)
> +                     encoder->get_phy_vspeo_index =
> jsl_get_combo_vspeo_index;
> +                     encoder->get_phy_vspeo =
> intel_bios_encoder_get_combo_vspeo;
> +             } else if (display->platform.elkhartlake) {
>                       encoder->get_buf_trans = ehl_get_combo_buf_trans;
> -             else if (intel_encoder_is_combo(encoder))
> +                     encoder->get_phy_vspeo_index =
> ehl_get_combo_vspeo_index;
> +                     encoder->get_phy_vspeo =
> intel_bios_encoder_get_combo_vspeo;
> +             } else if (intel_encoder_is_combo(encoder))
>                       encoder->get_buf_trans = icl_get_combo_buf_trans;
>               else
>                       encoder->get_buf_trans = icl_get_mg_buf_trans; diff
> --git a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
> b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
> index 7d3e0b7535fe..a72cf0ed7999 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
> +++ b/drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
> @@ -101,6 +101,12 @@ enum intel_c10_vspeo {
>       C10_EDP_HBR3
>  };
> 
> +enum intel_combo_vspeo {
> +     COMBO_HIGH_VSWING_HBR3 = 0,
> +     COMBO_LOW_VSWING_EDP_HBR2,
> +     COMBO_LOW_VSWING_EDP_HBR3
> +};
> +
>  bool is_hobl_buf_trans(const struct intel_ddi_buf_trans *table);
> 
>  void intel_ddi_buf_trans_init(struct intel_encoder *encoder);
> --
> 2.45.2

Reply via email to