FAILED: patch "[PATCH] drm/amd/display: Fix DSC force enable on SST" failed to apply to 5.9-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From bcc6aa61c82d4f12df3ecc884a9eef9d566edae9 Mon Sep 17 00:00:00 2001
From: Eryk Brol <[email protected]>
Date: Fri, 19 Jun 2020 14:42:09 -0400
Subject: [PATCH] drm/amd/display: Fix DSC force enable on SST
[why]
Previously when force enabling DSC on SST display we unknowingly supressed lane count, which caused DSC to be enabled automatically.
[how]
By adding an additional flag to force enable DSC in dc_dsc.c DSC can always be enabled with debugfs dsc_clock_en forced to 1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +3 -0
@@ -4646,6 +4646,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,#if defined(CONFIG_DRM_AMD_DC_DCN )if (dsc_caps.is_dsc_supported) { +/* Set DSC policy according to dsc_clock_en */ +dc_dsc_policy_set_enable_dsc_when_not_needed (aconnector->dsc_settings.dsc_clock_en); + if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0], &dsc_caps, aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override,
drivers/gpu/drm/amd/display/dc/dc_dsc.h +3 -0
@@ -51,6 +51,7 @@ struct dc_dsc_policy {int min_slice_height;// Must not be less than 8 uint32_t max_target_bpp;uint32_t min_target_bpp; +bool enable_dsc_when_not_needed; }; bool dc_dsc_parse_dsc_dpcd(const struct dc *dc,
@@ -80,4 +81,6 @@ void dc_dsc_get_policy_for_timing(const struct dc_crtc_timing *timing,void dc_dsc_policy_set_max_target_bpp_limit (uint32_t limit); +void dc_dsc_policy_set_enable_dsc_when_not_needed (bool enable); +#endif
drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c +15 -1
@@ -34,6 +34,9 @@/* default DSC policy target bitrate limit is 16bpp */ static uint32_t dsc_policy_max_target_bpp_limit =16 ; +/* default DSC policy enables DSC only when needed */ +static bool dsc_policy_enable_dsc_when_not_needed; +static uint32_t dc_dsc_bandwidth_in_kbps_from_timing (const struct dc_crtc_timing *timing) {
@@ -360,7 +363,7 @@ static bool decide_dsc_target_bpp_x16(get_dsc_bandwidth_range (policy->min_target_bpp, policy->max_target_bpp, dsc_common_caps, timing, &range); -if (target_bandwidth_kbps >= range.stream_kbps) { +if (!policy->enable_dsc_when_not_needed && target_bandwidth_kbps >= range.stream_kbps) {/* enough bandwidth without dsc */ *target_bpp_x16 =0 ; should_use_dsc = false;
@@ -961,9 +964,20 @@ void dc_dsc_get_policy_for_timing(const struct dc_crtc_timing *timing, struct dc/* internal upper limit, default 16 bpp */ if (policy->max_target_bpp > dsc_policy_max_target_bpp_limit) policy->max_target_bpp = dsc_policy_max_target_bpp_limit; + +/* enable DSC when not needed, default false */ +if (dsc_policy_enable_dsc_when_not_needed) + policy->enable_dsc_when_not_needed = dsc_policy_enable_dsc_when_not_needed; +else + policy->enable_dsc_when_not_needed = false; }void dc_dsc_policy_set_max_target_bpp_limit (uint32_t limit) { dsc_policy_max_target_bpp_limit = limit; } + +void dc_dsc_policy_set_enable_dsc_when_not_needed (bool enable) +{ + dsc_policy_enable_dsc_when_not_needed = enable; +}