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

drm/amd/display: Add interface to get Calibrated Avg Level from FIFO

[WHY]
Hardware has handed down a new sequence requiring the value of this
register be read from clk_mgr.

Signed-off-by: Wesley Chalmers <Wesley.Chalmers@amd.com>
Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: Anson Jacob <Anson.Jacob@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Wesley Chalmers and committed by
Alex Deucher
a659f2fd 9cf9498f

+60
+24
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
··· 52 52 SRI(AFMT_60958_1, DIG, id), \ 53 53 SRI(AFMT_60958_2, DIG, id), \ 54 54 SRI(DIG_FE_CNTL, DIG, id), \ 55 + SRI(DIG_FIFO_STATUS, DIG, id), \ 55 56 SRI(HDMI_CONTROL, DIG, id), \ 56 57 SRI(HDMI_DB_CONTROL, DIG, id), \ 57 58 SRI(HDMI_GC, DIG, id), \ ··· 125 124 uint32_t AFMT_60958_2; 126 125 uint32_t DIG_FE_CNTL; 127 126 uint32_t DIG_FE_CNTL2; 127 + uint32_t DIG_FIFO_STATUS; 128 128 uint32_t DP_MSE_RATE_CNTL; 129 129 uint32_t DP_MSE_RATE_UPDATE; 130 130 uint32_t DP_PIXEL_FORMAT; ··· 268 266 SE_SF(DIG0_DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh),\ 269 267 SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\ 270 268 SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\ 269 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_LEVEL_ERROR, mask_sh),\ 270 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_USE_OVERWRITE_LEVEL, mask_sh),\ 271 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_OVERWRITE_LEVEL, mask_sh),\ 272 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_ERROR_ACK, mask_sh),\ 273 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_CAL_AVERAGE_LEVEL, mask_sh),\ 274 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_MAXIMUM_LEVEL, mask_sh),\ 275 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_MINIMUM_LEVEL, mask_sh),\ 276 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_READ_CLOCK_SRC, mask_sh),\ 277 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_CALIBRATED, mask_sh),\ 278 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_FORCE_RECAL_AVERAGE, mask_sh),\ 279 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_FORCE_RECOMP_MINMAX, mask_sh),\ 271 280 SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL, AFMT_GENERIC_LOCK_STATUS, mask_sh),\ 272 281 SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL, AFMT_GENERIC_CONFLICT, mask_sh),\ 273 282 SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL, AFMT_GENERIC_CONFLICT_CLR, mask_sh),\ ··· 501 488 type DP_VID_N_MUL;\ 502 489 type DP_VID_M_DOUBLE_VALUE_EN;\ 503 490 type DIG_SOURCE_SELECT;\ 491 + type DIG_FIFO_LEVEL_ERROR;\ 492 + type DIG_FIFO_USE_OVERWRITE_LEVEL;\ 493 + type DIG_FIFO_OVERWRITE_LEVEL;\ 494 + type DIG_FIFO_ERROR_ACK;\ 495 + type DIG_FIFO_CAL_AVERAGE_LEVEL;\ 496 + type DIG_FIFO_MAXIMUM_LEVEL;\ 497 + type DIG_FIFO_MINIMUM_LEVEL;\ 498 + type DIG_FIFO_READ_CLOCK_SRC;\ 499 + type DIG_FIFO_CALIBRATED;\ 500 + type DIG_FIFO_FORCE_RECAL_AVERAGE;\ 501 + type DIG_FIFO_FORCE_RECOMP_MINMAX;\ 504 502 type DIG_CLOCK_PATTERN 505 503 506 504 #define SE_REG_FIELD_LIST_DCN2_0(type) \
+12
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.c
··· 552 552 DP_SST_SDP_SPLITTING, enable_sdp_splitting); 553 553 } 554 554 555 + uint32_t enc2_get_fifo_cal_average_level( 556 + struct stream_encoder *enc) 557 + { 558 + struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc); 559 + uint32_t fifo_level; 560 + 561 + REG_GET(DIG_FIFO_STATUS, 562 + DIG_FIFO_CAL_AVERAGE_LEVEL, &fifo_level); 563 + return fifo_level; 564 + } 565 + 555 566 static const struct stream_encoder_funcs dcn20_str_enc_funcs = { 556 567 .dp_set_odm_combine = 557 568 enc2_dp_set_odm_combine, ··· 609 598 .dp_set_dsc_pps_info_packet = enc2_dp_set_dsc_pps_info_packet, 610 599 .set_dynamic_metadata = enc2_set_dynamic_metadata, 611 600 .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute, 601 + .get_fifo_cal_average_level = enc2_get_fifo_cal_average_level, 612 602 }; 613 603 614 604 void dcn20_stream_encoder_construct(
+3
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_stream_encoder.h
··· 112 112 uint32_t hubp_requestor_id, 113 113 enum dynamic_metadata_mode dmdata_mode); 114 114 115 + uint32_t enc2_get_fifo_cal_average_level( 116 + struct stream_encoder *enc); 117 + 115 118 #endif /* __DC_STREAM_ENCODER_DCN20_H__ */
+2
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
··· 823 823 .dp_set_dsc_pps_info_packet = enc3_dp_set_dsc_pps_info_packet, 824 824 .set_dynamic_metadata = enc2_set_dynamic_metadata, 825 825 .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute, 826 + 827 + .get_fifo_cal_average_level = enc2_get_fifo_cal_average_level, 826 828 }; 827 829 828 830 void dcn30_dio_stream_encoder_construct(
+12
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.h
··· 106 106 SRI(DP_SEC_METADATA_TRANSMISSION, DP, id), \ 107 107 SRI(HDMI_METADATA_PACKET_CONTROL, DIG, id), \ 108 108 SRI(DIG_FE_CNTL, DIG, id), \ 109 + SRI(DIG_FIFO_STATUS, DIG, id), \ 109 110 SRI(DIG_CLOCK_PATTERN, DIG, id) 110 111 111 112 ··· 168 167 SE_SF(DIG0_DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh),\ 169 168 SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\ 170 169 SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\ 170 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_LEVEL_ERROR, mask_sh),\ 171 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_USE_OVERWRITE_LEVEL, mask_sh),\ 172 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_OVERWRITE_LEVEL, mask_sh),\ 173 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_ERROR_ACK, mask_sh),\ 174 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_CAL_AVERAGE_LEVEL, mask_sh),\ 175 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_MAXIMUM_LEVEL, mask_sh),\ 176 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_MINIMUM_LEVEL, mask_sh),\ 177 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_READ_CLOCK_SRC, mask_sh),\ 178 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_CALIBRATED, mask_sh),\ 179 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_FORCE_RECAL_AVERAGE, mask_sh),\ 180 + SE_SF(DIG0_DIG_FIFO_STATUS, DIG_FIFO_FORCE_RECOMP_MINMAX, mask_sh),\ 171 181 SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, mask_sh),\ 172 182 SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\ 173 183 SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
+3
drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h
··· 237 237 void (*dp_set_odm_combine)( 238 238 struct stream_encoder *enc, 239 239 bool odm_combine); 240 + 241 + uint32_t (*get_fifo_cal_average_level)( 242 + struct stream_encoder *enc); 240 243 }; 241 244 242 245 #endif /* STREAM_ENCODER_H_ */
+2
drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_0_1_sh_mask.h
··· 29292 29292 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_OVERWRITE_LEVEL_MASK 0x000000FCL 29293 29293 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_ERROR_ACK_MASK 0x00000100L 29294 29294 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_CAL_AVERAGE_LEVEL_MASK 0x0000FC00L 29295 + #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_MAXIMUM_LEVEL_MASK 0x001F0000L 29295 29296 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_MINIMUM_LEVEL_MASK 0x03C00000L 29296 29297 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_READ_CLOCK_SRC_MASK 0x04000000L 29297 29298 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_CALIBRATED_MASK 0x20000000L ··· 34432 34431 #define DIG3_DIG_FIFO_STATUS__DIG_FIFO_OVERWRITE_LEVEL__SHIFT 0x2 34433 34432 #define DIG3_DIG_FIFO_STATUS__DIG_FIFO_ERROR_ACK__SHIFT 0x8 34434 34433 #define DIG3_DIG_FIFO_STATUS__DIG_FIFO_CAL_AVERAGE_LEVEL__SHIFT 0xa 34434 + #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_MAXIMUM_LEVEL__SHIFT 0x10 34435 34435 #define DIG3_DIG_FIFO_STATUS__DIG_FIFO_MINIMUM_LEVEL__SHIFT 0x16 34436 34436 #define DIG3_DIG_FIFO_STATUS__DIG_FIFO_READ_CLOCK_SRC__SHIFT 0x1a 34437 34437 #define DIG3_DIG_FIFO_STATUS__DIG_FIFO_CALIBRATED__SHIFT 0x1d
+2
drivers/gpu/drm/amd/include/asic_reg/dcn/dcn_3_1_2_sh_mask.h
··· 33869 33869 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_OVERWRITE_LEVEL__SHIFT 0x2 33870 33870 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_ERROR_ACK__SHIFT 0x8 33871 33871 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_CAL_AVERAGE_LEVEL__SHIFT 0xa 33872 + #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_MAXIMUM_LEVEL__SHIFT 0x10 33872 33873 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_MINIMUM_LEVEL__SHIFT 0x16 33873 33874 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_READ_CLOCK_SRC__SHIFT 0x1a 33874 33875 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_CALIBRATED__SHIFT 0x1d ··· 33880 33879 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_OVERWRITE_LEVEL_MASK 0x000000FCL 33881 33880 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_ERROR_ACK_MASK 0x00000100L 33882 33881 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_CAL_AVERAGE_LEVEL_MASK 0x0000FC00L 33882 + #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_MAXIMUM_LEVEL_MASK 0x001F0000L 33883 33883 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_MINIMUM_LEVEL_MASK 0x03C00000L 33884 33884 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_READ_CLOCK_SRC_MASK 0x04000000L 33885 33885 #define DIG0_DIG_FIFO_STATUS__DIG_FIFO_CALIBRATED_MASK 0x20000000L