Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: set minimum abm backlight level

[Why]
A lot of the time, the backlight characteristic curve maps min backlight
to a non-zero value.
But there are cases where we want the curve to intersect at 0.
In this scenario even if OS never asks to set 0% backlight, the ABM
reduction can result in backlight being lowered close to 0.
This particularly can cause problems in some LED drivers, and in
general just looks like backlight is completely off.

[How]
Add default cap to disallow backlight from dropping below 1%
even after ABM reduction is applied.

Signed-off-by: Anthony Koo <Anthony.Koo@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Leo Li <sunpeng.li@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Anthony Koo and committed by
Alex Deucher
2ad0cdf9 799c5b9c

+48 -33
+5
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 942 942 params.backlight_lut_array_size = 16; 943 943 params.backlight_lut_array = linear_lut; 944 944 945 + /* Min backlight level after ABM reduction, Don't allow below 1% 946 + * 0xFFFF x 0.01 = 0x28F 947 + */ 948 + params.min_abm_backlight = 0x28F; 949 + 945 950 /* todo will enable for navi10 */ 946 951 if (adev->asic_type <= CHIP_RAVEN) { 947 952 ret = dmcu_load_iram(dmcu, params);
+42 -33
drivers/gpu/drm/amd/display/modules/power/power_helpers.c
··· 115 115 /* NOTE: iRAM is 256B in size */ 116 116 struct iram_table_v_2 { 117 117 /* flags */ 118 - uint16_t flags; /* 0x00 U16 */ 118 + uint16_t min_abm_backlight; /* 0x00 U16 */ 119 119 120 120 /* parameters for ABM2.0 algorithm */ 121 121 uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x02 U0.8 */ ··· 140 140 141 141 /* For reading PSR State directly from IRAM */ 142 142 uint8_t psr_state; /* 0xf0 */ 143 - uint8_t dmcu_mcp_interface_version; /* 0xf1 */ 144 - uint8_t dmcu_abm_feature_version; /* 0xf2 */ 145 - uint8_t dmcu_psr_feature_version; /* 0xf3 */ 146 - uint16_t dmcu_version; /* 0xf4 */ 143 + uint8_t dmcu_mcp_interface_version; /* 0xf1 */ 144 + uint8_t dmcu_abm_feature_version; /* 0xf2 */ 145 + uint8_t dmcu_psr_feature_version; /* 0xf3 */ 146 + uint16_t dmcu_version; /* 0xf4 */ 147 147 uint8_t dmcu_state; /* 0xf6 */ 148 148 149 149 uint16_t blRampReduction; /* 0xf7 */ ··· 164 164 uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x16 U0.8 */ 165 165 uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x2a U2.6 */ 166 166 uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x3e U2.6 */ 167 - uint8_t hybrid_factor[NUM_AGGR_LEVEL]; /* 0x52 U0.8 */ 168 - uint8_t contrast_factor[NUM_AGGR_LEVEL]; /* 0x56 U0.8 */ 169 - uint8_t deviation_gain[NUM_AGGR_LEVEL]; /* 0x5a U0.8 */ 170 - uint8_t iir_curve[NUM_AMBI_LEVEL]; /* 0x5e U0.8 */ 171 - uint8_t min_knee[NUM_AGGR_LEVEL]; /* 0x63 U0.8 */ 172 - uint8_t max_knee[NUM_AGGR_LEVEL]; /* 0x67 U0.8 */ 173 - uint8_t pad[21]; /* 0x6b U0.8 */ 167 + uint8_t hybrid_factor[NUM_AGGR_LEVEL]; /* 0x52 U0.8 */ 168 + uint8_t contrast_factor[NUM_AGGR_LEVEL]; /* 0x56 U0.8 */ 169 + uint8_t deviation_gain[NUM_AGGR_LEVEL]; /* 0x5a U0.8 */ 170 + uint8_t iir_curve[NUM_AMBI_LEVEL]; /* 0x5e U0.8 */ 171 + uint8_t min_knee[NUM_AGGR_LEVEL]; /* 0x63 U0.8 */ 172 + uint8_t max_knee[NUM_AGGR_LEVEL]; /* 0x67 U0.8 */ 173 + uint16_t min_abm_backlight; /* 0x6b U16 */ 174 + uint8_t pad[19]; /* 0x6d U0.8 */ 174 175 175 176 /* parameters for crgb conversion */ 176 - uint16_t crgb_thresh[NUM_POWER_FN_SEGS]; /* 0x80 U3.13 */ 177 - uint16_t crgb_offset[NUM_POWER_FN_SEGS]; /* 0x90 U1.15 */ 178 - uint16_t crgb_slope[NUM_POWER_FN_SEGS]; /* 0xa0 U4.12 */ 177 + uint16_t crgb_thresh[NUM_POWER_FN_SEGS]; /* 0x80 U3.13 */ 178 + uint16_t crgb_offset[NUM_POWER_FN_SEGS]; /* 0x90 U1.15 */ 179 + uint16_t crgb_slope[NUM_POWER_FN_SEGS]; /* 0xa0 U4.12 */ 179 180 180 181 /* parameters for custom curve */ 181 182 /* thresholds for brightness --> backlight */ 182 - uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS]; /* 0xb0 U16.0 */ 183 + uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS]; /* 0xb0 U16.0 */ 183 184 /* offsets for brightness --> backlight */ 184 - uint16_t backlight_offsets[NUM_BL_CURVE_SEGS]; /* 0xd0 U16.0 */ 185 + uint16_t backlight_offsets[NUM_BL_CURVE_SEGS]; /* 0xd0 U16.0 */ 185 186 186 187 /* For reading PSR State directly from IRAM */ 187 - uint8_t psr_state; /* 0xf0 */ 188 - uint8_t dmcu_mcp_interface_version; /* 0xf1 */ 189 - uint8_t dmcu_abm_feature_version; /* 0xf2 */ 190 - uint8_t dmcu_psr_feature_version; /* 0xf3 */ 191 - uint16_t dmcu_version; /* 0xf4 */ 192 - uint8_t dmcu_state; /* 0xf6 */ 188 + uint8_t psr_state; /* 0xf0 */ 189 + uint8_t dmcu_mcp_interface_version; /* 0xf1 */ 190 + uint8_t dmcu_abm_feature_version; /* 0xf2 */ 191 + uint8_t dmcu_psr_feature_version; /* 0xf3 */ 192 + uint16_t dmcu_version; /* 0xf4 */ 193 + uint8_t dmcu_state; /* 0xf6 */ 193 194 194 - uint8_t dummy1; /* 0xf7 */ 195 - uint8_t dummy2; /* 0xf8 */ 196 - uint8_t dummy3; /* 0xf9 */ 197 - uint8_t dummy4; /* 0xfa */ 198 - uint8_t dummy5; /* 0xfb */ 199 - uint8_t dummy6; /* 0xfc */ 200 - uint8_t dummy7; /* 0xfd */ 201 - uint8_t dummy8; /* 0xfe */ 202 - uint8_t dummy9; /* 0xff */ 195 + uint8_t dummy1; /* 0xf7 */ 196 + uint8_t dummy2; /* 0xf8 */ 197 + uint8_t dummy3; /* 0xf9 */ 198 + uint8_t dummy4; /* 0xfa */ 199 + uint8_t dummy5; /* 0xfb */ 200 + uint8_t dummy6; /* 0xfc */ 201 + uint8_t dummy7; /* 0xfd */ 202 + uint8_t dummy8; /* 0xfe */ 203 + uint8_t dummy9; /* 0xff */ 203 204 }; 204 205 #pragma pack(pop) 205 206 ··· 272 271 { 273 272 unsigned int set = params.set; 274 273 275 - ram_table->flags = 0x0; 274 + ram_table->min_abm_backlight = 275 + cpu_to_be16(params.min_abm_backlight); 276 276 ram_table->deviation_gain = 0xb3; 277 277 278 278 ram_table->blRampReduction = ··· 447 445 448 446 ram_table->flags = 0x0; 449 447 448 + ram_table->min_abm_backlight = 449 + cpu_to_be16(params.min_abm_backlight); 450 + 450 451 ram_table->deviation_gain[0] = 0xb3; 451 452 ram_table->deviation_gain[1] = 0xa8; 452 453 ram_table->deviation_gain[2] = 0x98; ··· 593 588 unsigned int set = params.set; 594 589 595 590 ram_table->flags = 0x0; 591 + 592 + ram_table->min_abm_backlight = 593 + cpu_to_be16(params.min_abm_backlight); 594 + 596 595 for (i = 0; i < NUM_AGGR_LEVEL; i++) { 597 596 ram_table->hybrid_factor[i] = abm_settings[set][i].brightness_gain; 598 597 ram_table->contrast_factor[i] = abm_settings[set][i].contrast_factor;
+1
drivers/gpu/drm/amd/display/modules/power/power_helpers.h
··· 38 38 unsigned int backlight_lut_array_size; 39 39 unsigned int backlight_ramping_reduction; 40 40 unsigned int backlight_ramping_start; 41 + unsigned int min_abm_backlight; 41 42 unsigned int set; 42 43 }; 43 44