aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3842-drm-amd-display-update-odm-mode-validation-to-be-in-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3842-drm-amd-display-update-odm-mode-validation-to-be-in-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3842-drm-amd-display-update-odm-mode-validation-to-be-in-.patch113
1 files changed, 113 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3842-drm-amd-display-update-odm-mode-validation-to-be-in-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3842-drm-amd-display-update-odm-mode-validation-to-be-in-.patch
new file mode 100644
index 00000000..6e03c996
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3842-drm-amd-display-update-odm-mode-validation-to-be-in-.patch
@@ -0,0 +1,113 @@
+From 3ce73c2b6ec251fba6b91c0e65b7bb6938f5b9e4 Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Fri, 30 Aug 2019 16:32:13 -0400
+Subject: [PATCH 3842/4256] drm/amd/display: update odm mode validation to be
+ in line with policy
+
+Previously 8k30 worked with dsc and odm combine due to a workaround that ran
+the formula a second time with dsc support enable should dsc validation fail.
+This worked when clocks were low enough for formula to enable odm to lower
+voltage, however now broke due to increased clocks.
+
+This change updates the ODM combine policy within the formula to properly
+reflect our current policy within DC, only enabling ODM when we have to, as
+well as adding a check for viewport width when dsc is enabled.
+
+As a side effect the redundant call to dml when odm is required is now
+unnecessary.
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Reviewed-by: Nikola Cornij <Nikola.Cornij@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ .../drm/amd/display/dc/dcn20/dcn20_resource.c | 22 +------------------
+ .../dc/dml/dcn20/display_mode_vba_20v2.c | 9 +++++++-
+ 2 files changed, 9 insertions(+), 22 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
+index d1901ab5fb8c..8d81c65157d4 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
+@@ -2246,11 +2246,7 @@ bool dcn20_fast_validate_bw(
+ bool out = false;
+
+ int pipe_cnt, i, pipe_idx, vlevel, vlevel_unsplit;
+- bool odm_capable = context->bw_ctx.dml.ip.odm_capable;
+ bool force_split = false;
+-#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+- bool failed_non_odm_dsc = false;
+-#endif
+ int split_threshold = dc->res_pool->pipe_count / 2;
+ bool avoid_split = dc->debug.pipe_split_policy != MPC_SPLIT_DYNAMIC;
+
+@@ -2327,24 +2323,8 @@ bool dcn20_fast_validate_bw(
+ goto validate_out;
+ }
+
+- context->bw_ctx.dml.ip.odm_capable = 0;
+-
+ vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+
+- context->bw_ctx.dml.ip.odm_capable = odm_capable;
+-
+-#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+- /* 1 dsc per stream dsc validation */
+- if (vlevel <= context->bw_ctx.dml.soc.num_states)
+- if (!dcn20_validate_dsc(dc, context)) {
+- failed_non_odm_dsc = true;
+- vlevel = context->bw_ctx.dml.soc.num_states + 1;
+- }
+-#endif
+-
+- if (vlevel > context->bw_ctx.dml.soc.num_states && odm_capable)
+- vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+-
+ if (vlevel > context->bw_ctx.dml.soc.num_states)
+ goto validate_fail;
+
+@@ -2480,7 +2460,7 @@ bool dcn20_fast_validate_bw(
+ }
+ #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+ /* Actual dsc count per stream dsc validation*/
+- if (failed_non_odm_dsc && !dcn20_validate_dsc(dc, context)) {
++ if (!dcn20_validate_dsc(dc, context)) {
+ context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states] =
+ DML_FAIL_DSC_VALIDATION_FAILURE;
+ goto validate_fail;
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
+index 0fafd693ffb4..841ed6c23f93 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
++++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c
+@@ -38,6 +38,7 @@
+
+ #define BPP_INVALID 0
+ #define BPP_BLENDED_PIPE 0xffffffff
++#define DCN20_MAX_DSC_IMAGE_WIDTH 5184
+
+ static double adjust_ReturnBW(
+ struct display_mode_lib *mode_lib,
+@@ -3901,6 +3902,10 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
+ mode_lib->vba.MaximumSwathWidthInLineBuffer);
+ }
+ for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
++ double MaxMaxDispclkRoundedDown = RoundToDFSGranularityDown(
++ mode_lib->vba.MaxDispclk[mode_lib->vba.soc.num_states],
++ mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
++
+ for (j = 0; j < 2; j++) {
+ mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(
+ mode_lib->vba.MaxDispclk[i],
+@@ -3925,7 +3930,9 @@ void dml20v2_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode
+ && i == mode_lib->vba.soc.num_states)
+ mode_lib->vba.PlaneRequiredDISPCLKWithODMCombine = mode_lib->vba.PixelClock[k] / 2
+ * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
+- if (mode_lib->vba.ODMCapability == false || mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine <= mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity) {
++ if (mode_lib->vba.ODMCapability == false ||
++ (locals->PlaneRequiredDISPCLKWithoutODMCombine <= MaxMaxDispclkRoundedDown
++ && (!locals->DSCEnabled[k] || locals->HActive[k] <= DCN20_MAX_DSC_IMAGE_WIDTH))) {
+ locals->ODMCombineEnablePerState[i][k] = false;
+ mode_lib->vba.PlaneRequiredDISPCLK = mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine;
+ } else {
+--
+2.17.1
+