On 2026-05-20 16:29, Harry Wentland wrote:
> From: Fangzhi Zuo <[email protected]>
> 
> FRL links don't yet support VRR. If we enable it by default
> users will see a functional regression when connected to an FRL
> capable display as the driver will now default to FRL and not
> allow VRR.
> 
> VRR support will come soon, so instead of making an elaborate
> TMDS fallback mechanism simply default FRL to disabled, but
> provide a dcfeaturemask of 0x400 to enable it if anyone wants
> to already try it out.
> 
> Signed-off-by: Fangzhi Zuo <[email protected]>
> Signed-off-by: Harry Wentland <[email protected]>

Reviewed-by: Harry Wentland <[email protected]>

Harry

> ---
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  3 ++
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 +-
>  .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 30 ++++++++++---------
>  drivers/gpu/drm/amd/display/dc/dc.h           |  1 +
>  drivers/gpu/drm/amd/include/amd_shared.h      |  4 +++
>  5 files changed, 25 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 63fd63ea1310..15ebad9c9a76 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -2081,6 +2081,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
>       if (amdgpu_dc_feature_mask & DC_DISABLE_LTTPR_DP2_0)
>               init_data.flags.allow_lttpr_non_transparent_mode.bits.DP2_0 = 
> true;
>  
> +     if (amdgpu_dc_feature_mask & DC_FRL_MASK)
> +             init_data.flags.enable_frl = true;
> +
>       init_data.flags.seamless_boot_edp_requested = false;
>  
>       if (amdgpu_device_seamless_boot_supported(adev)) {
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> index 5efbcf6eae86..7d37c1612131 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> @@ -1116,7 +1116,7 @@ int amdgpu_dm_update_plane_color_mgmt(struct 
> dm_crtc_state *crtc,
>  void amdgpu_dm_update_connector_after_detect(
>               struct amdgpu_dm_connector *aconnector);
>  
> -void populate_hdmi_info_from_connector(struct drm_hdmi_info *info,
> +void populate_hdmi_info_from_connector(bool enable_frl, struct drm_hdmi_info 
> *info,
>                                     struct dc_edid_caps *edid_caps);
>  
>  extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs;
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c 
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> index f9ec006e08c4..af32202f8c10 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> @@ -179,7 +179,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
>       edid_caps->edid_hdmi = connector->display_info.is_hdmi;
>  
>       if (edid_caps->edid_hdmi) {
> -             
> populate_hdmi_info_from_connector(&connector->display_info.hdmi, edid_caps);
> +             populate_hdmi_info_from_connector(link->dc->config.enable_frl, 
> &connector->display_info.hdmi, edid_caps);
>               drm_dbg_driver(connector->dev, "%s: HDMI_FRL [%s] max_frl_rate 
> %d\n", __func__, connector->name, edid_caps->max_frl_rate);
>               if (edid_caps->frl_dsc_support)
>                       drm_dbg_driver(connector->dev, "%s: HDMI_FRL_DSC [%s] 
> frl_dsc_10bpc %d, frl_dsc_12bpc %d, frl_dsc_all_bpp %d, frl_dsc_native_420 
> %d, frl_dsc_max_slices %d, frl_dsc_max_frl_rate %d, 
> frl_dsc_total_chunk_kbytes %d\n",
> @@ -1124,21 +1124,23 @@ static uint8_t get_dsc_max_slices(uint8_t max_slices, 
> int clk_per_slice)
>       return dsc_max_slices;
>  }
>  
> -void populate_hdmi_info_from_connector(struct drm_hdmi_info *hdmi, struct 
> dc_edid_caps *edid_caps)
> +void populate_hdmi_info_from_connector(bool enable_frl, struct drm_hdmi_info 
> *hdmi, struct dc_edid_caps *edid_caps)
>  {
>       edid_caps->scdc_present = hdmi->scdc.supported;
> -     edid_caps->max_frl_rate = get_max_frl_rate(hdmi->max_lanes, 
> hdmi->max_frl_rate_per_lane);
> -     edid_caps->frl_dsc_support = hdmi->dsc_cap.v_1p2;
> -     if (edid_caps->frl_dsc_support) {
> -             if (hdmi->dsc_cap.bpc_supported == 10)
> -                     edid_caps->frl_dsc_10bpc = true;
> -             else if (hdmi->dsc_cap.bpc_supported == 12)
> -                     edid_caps->frl_dsc_12bpc = true;
> -             edid_caps->frl_dsc_all_bpp = hdmi->dsc_cap.all_bpp;
> -             edid_caps->frl_dsc_native_420 = hdmi->dsc_cap.native_420;
> -             edid_caps->frl_dsc_max_slices = 
> get_dsc_max_slices(hdmi->dsc_cap.max_slices, hdmi->dsc_cap.clk_per_slice);
> -             edid_caps->frl_dsc_max_frl_rate = 
> get_max_frl_rate(hdmi->dsc_cap.max_lanes, 
> hdmi->dsc_cap.max_frl_rate_per_lane);
> -             edid_caps->frl_dsc_total_chunk_kbytes = 
> hdmi->dsc_cap.total_chunk_kbytes;
> +     if (enable_frl) {
> +             edid_caps->max_frl_rate = get_max_frl_rate(hdmi->max_lanes, 
> hdmi->max_frl_rate_per_lane);
> +             edid_caps->frl_dsc_support = hdmi->dsc_cap.v_1p2;
> +             if (edid_caps->frl_dsc_support) {
> +                     if (hdmi->dsc_cap.bpc_supported == 10)
> +                             edid_caps->frl_dsc_10bpc = true;
> +                     else if (hdmi->dsc_cap.bpc_supported == 12)
> +                             edid_caps->frl_dsc_12bpc = true;
> +                     edid_caps->frl_dsc_all_bpp = hdmi->dsc_cap.all_bpp;
> +                     edid_caps->frl_dsc_native_420 = 
> hdmi->dsc_cap.native_420;
> +                     edid_caps->frl_dsc_max_slices = 
> get_dsc_max_slices(hdmi->dsc_cap.max_slices, hdmi->dsc_cap.clk_per_slice);
> +                     edid_caps->frl_dsc_max_frl_rate = 
> get_max_frl_rate(hdmi->dsc_cap.max_lanes, 
> hdmi->dsc_cap.max_frl_rate_per_lane);
> +                     edid_caps->frl_dsc_total_chunk_kbytes = 
> hdmi->dsc_cap.total_chunk_kbytes;
> +             }
>       }
>  }
>  
> diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
> b/drivers/gpu/drm/amd/display/dc/dc.h
> index d3273709bb8d..907757a44da2 100644
> --- a/drivers/gpu/drm/amd/display/dc/dc.h
> +++ b/drivers/gpu/drm/amd/display/dc/dc.h
> @@ -589,6 +589,7 @@ struct dc_config {
>       int smart_mux_version;
>       bool ignore_dpref_ss;
>       bool enable_mipi_converter_optimization;
> +     bool enable_frl;
>       bool force_hdmi21_frl_enc_enable;
>       bool skip_frl_pretraining;
>       bool use_default_clock_table;
> diff --git a/drivers/gpu/drm/amd/include/amd_shared.h 
> b/drivers/gpu/drm/amd/include/amd_shared.h
> index ac2d3701e2bd..3fd38323a88b 100644
> --- a/drivers/gpu/drm/amd/include/amd_shared.h
> +++ b/drivers/gpu/drm/amd/include/amd_shared.h
> @@ -286,6 +286,10 @@ enum DC_FEATURE_MASK {
>        * @DC_REPLAY_MASK: (0x200) disabled by default for DCN < 3.1.4
>        */
>       DC_REPLAY_MASK = (1 << 9),
> +     /**
> +      * @DC_FRL_MASK: (0x400) disabled by default
> +      */
> +     DC_FRL_MASK = (1 << 10),
>  };
>  
>  /**

Reply via email to