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

drm/amd/display:Use Pixel clock in 100Hz units for HDMI Audio wall clock DTO

[Why]
-Pass and use pixel clock in 100 Hz to Audio for HDMI
audio DTO for Audio wall clock programming so audio DTO gets
increased precision for timings with /1001 factor.
-For HDMI TMDS for N and CTS ACR tables are based on 10 KHz
units, these does not need to be modified as N and CTS values
are still valid using current tables.

Signed-off-by: Nevenko Stupar <Nevenko.Stupar@amd.com>
Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
Acked-by: Leo Li <sunpeng.li@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Nevenko Stupar and committed by
Alex Deucher
40fd9090 7cecfe9d

+59 -59
+14 -14
drivers/gpu/drm/amd/display/dc/dce/dce_audio.c
··· 145 145 if (channel_count > 2) { 146 146 147 147 /* Based on HDMI spec 1.3 Table 7.5 */ 148 - if ((crtc_info->requested_pixel_clock <= 27000) && 148 + if ((crtc_info->requested_pixel_clock_100Hz <= 270000) && 149 149 (crtc_info->v_active <= 576) && 150 150 !(crtc_info->interlaced) && 151 151 !(crtc_info->pixel_repetition == 2 || 152 152 crtc_info->pixel_repetition == 4)) { 153 153 limit_freq_to_48_khz = true; 154 154 155 - } else if ((crtc_info->requested_pixel_clock <= 27000) && 155 + } else if ((crtc_info->requested_pixel_clock_100Hz <= 270000) && 156 156 (crtc_info->v_active <= 576) && 157 157 (crtc_info->interlaced) && 158 158 (crtc_info->pixel_repetition == 2)) { 159 159 limit_freq_to_88_2_khz = true; 160 160 161 - } else if ((crtc_info->requested_pixel_clock <= 54000) && 161 + } else if ((crtc_info->requested_pixel_clock_100Hz <= 540000) && 162 162 (crtc_info->v_active <= 576) && 163 163 !(crtc_info->interlaced)) { 164 164 limit_freq_to_174_4_khz = true; ··· 737 737 738 738 /* search pixel clock value for Azalia HDMI Audio */ 739 739 static void get_azalia_clock_info_hdmi( 740 - uint32_t crtc_pixel_clock_in_khz, 741 - uint32_t actual_pixel_clock_in_khz, 740 + uint32_t crtc_pixel_clock_100hz, 741 + uint32_t actual_pixel_clock_100Hz, 742 742 struct azalia_clock_info *azalia_clock_info) 743 743 { 744 744 /* audio_dto_phase= 24 * 10,000; ··· 749 749 /* audio_dto_module = PCLKFrequency * 10,000; 750 750 * [khz] -> [100Hz] */ 751 751 azalia_clock_info->audio_dto_module = 752 - actual_pixel_clock_in_khz * 10; 752 + actual_pixel_clock_100Hz; 753 753 } 754 754 755 755 static void get_azalia_clock_info_dp( 756 - uint32_t requested_pixel_clock_in_khz, 756 + uint32_t requested_pixel_clock_100Hz, 757 757 const struct audio_pll_info *pll_info, 758 758 struct azalia_clock_info *azalia_clock_info) 759 759 { ··· 792 792 793 793 /* calculate DTO settings */ 794 794 get_azalia_clock_info_hdmi( 795 - crtc_info->requested_pixel_clock, 796 - crtc_info->calculated_pixel_clock, 795 + crtc_info->requested_pixel_clock_100Hz, 796 + crtc_info->calculated_pixel_clock_100Hz, 797 797 &clock_info); 798 798 799 - DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock = %d"\ 800 - "calculated_pixel_clock =%d\n"\ 799 + DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock_100Hz = %d"\ 800 + "calculated_pixel_clock_100Hz =%d\n"\ 801 801 "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\ 802 - crtc_info->requested_pixel_clock,\ 803 - crtc_info->calculated_pixel_clock,\ 802 + crtc_info->requested_pixel_clock_100Hz,\ 803 + crtc_info->calculated_pixel_clock_100Hz,\ 804 804 clock_info.audio_dto_module,\ 805 805 clock_info.audio_dto_phase); 806 806 ··· 833 833 834 834 calculate DTO settings */ 835 835 get_azalia_clock_info_dp( 836 - crtc_info->requested_pixel_clock, 836 + crtc_info->requested_pixel_clock_100Hz, 837 837 pll_info, 838 838 &clock_info); 839 839
+15 -15
drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
··· 1251 1251 1252 1252 static void get_audio_clock_info( 1253 1253 enum dc_color_depth color_depth, 1254 - uint32_t crtc_pixel_clock_in_khz, 1255 - uint32_t actual_pixel_clock_in_khz, 1254 + uint32_t crtc_pixel_clock_100Hz, 1255 + uint32_t actual_pixel_clock_100Hz, 1256 1256 struct audio_clock_info *audio_clock_info) 1257 1257 { 1258 1258 const struct audio_clock_info *clock_info; 1259 1259 uint32_t index; 1260 - uint32_t crtc_pixel_clock_in_10khz = crtc_pixel_clock_in_khz / 10; 1260 + uint32_t crtc_pixel_clock_in_10khz = crtc_pixel_clock_100Hz / 100; 1261 1261 uint32_t audio_array_size; 1262 1262 1263 1263 switch (color_depth) { ··· 1294 1294 } 1295 1295 1296 1296 /* not found */ 1297 - if (actual_pixel_clock_in_khz == 0) 1298 - actual_pixel_clock_in_khz = crtc_pixel_clock_in_khz; 1297 + if (actual_pixel_clock_100Hz == 0) 1298 + actual_pixel_clock_100Hz = crtc_pixel_clock_100Hz; 1299 1299 1300 1300 /* See HDMI spec the table entry under 1301 1301 * pixel clock of "Other". */ 1302 1302 audio_clock_info->pixel_clock_in_10khz = 1303 - actual_pixel_clock_in_khz / 10; 1304 - audio_clock_info->cts_32khz = actual_pixel_clock_in_khz; 1305 - audio_clock_info->cts_44khz = actual_pixel_clock_in_khz; 1306 - audio_clock_info->cts_48khz = actual_pixel_clock_in_khz; 1303 + actual_pixel_clock_100Hz / 100; 1304 + audio_clock_info->cts_32khz = actual_pixel_clock_100Hz / 10; 1305 + audio_clock_info->cts_44khz = actual_pixel_clock_100Hz / 10; 1306 + audio_clock_info->cts_48khz = actual_pixel_clock_100Hz / 10; 1307 1307 1308 1308 audio_clock_info->n_32khz = 4096; 1309 1309 audio_clock_info->n_44khz = 6272; ··· 1369 1369 1370 1370 /* Program audio clock sample/regeneration parameters */ 1371 1371 get_audio_clock_info(crtc_info->color_depth, 1372 - crtc_info->requested_pixel_clock, 1373 - crtc_info->calculated_pixel_clock, 1372 + crtc_info->requested_pixel_clock_100Hz, 1373 + crtc_info->calculated_pixel_clock_100Hz, 1374 1374 &audio_clock_info); 1375 1375 DC_LOG_HW_AUDIO( 1376 - "\n%s:Input::requested_pixel_clock = %d" \ 1377 - "calculated_pixel_clock = %d \n", __func__, \ 1378 - crtc_info->requested_pixel_clock, \ 1379 - crtc_info->calculated_pixel_clock); 1376 + "\n%s:Input::requested_pixel_clock_100Hz = %d" \ 1377 + "calculated_pixel_clock_100Hz = %d \n", __func__, \ 1378 + crtc_info->requested_pixel_clock_100Hz, \ 1379 + crtc_info->calculated_pixel_clock_100Hz); 1380 1380 1381 1381 /* HDMI_ACR_32_0__HDMI_ACR_CTS_32_MASK */ 1382 1382 REG_UPDATE(HDMI_ACR_32_0, HDMI_ACR_CTS_32, audio_clock_info.cts_32khz);
+11 -11
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
··· 1162 1162 stream->timing.flags.INTERLACE; 1163 1163 1164 1164 audio_output->crtc_info.refresh_rate = 1165 - (stream->timing.pix_clk_100hz*10000)/ 1165 + (stream->timing.pix_clk_100hz*100)/ 1166 1166 (stream->timing.h_total*stream->timing.v_total); 1167 1167 1168 1168 audio_output->crtc_info.color_depth = 1169 1169 stream->timing.display_color_depth; 1170 1170 1171 - audio_output->crtc_info.requested_pixel_clock = 1172 - pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10; 1171 + audio_output->crtc_info.requested_pixel_clock_100Hz = 1172 + pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz; 1173 1173 1174 - audio_output->crtc_info.calculated_pixel_clock = 1175 - pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10; 1174 + audio_output->crtc_info.calculated_pixel_clock_100Hz = 1175 + pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz; 1176 1176 1177 1177 /*for HDMI, audio ACR is with deep color ratio factor*/ 1178 1178 if (dc_is_hdmi_signal(pipe_ctx->stream->signal) && 1179 - audio_output->crtc_info.requested_pixel_clock == 1180 - (stream->timing.pix_clk_100hz / 10)) { 1179 + audio_output->crtc_info.requested_pixel_clock_100Hz == 1180 + (stream->timing.pix_clk_100hz)) { 1181 1181 if (pipe_ctx->stream_res.pix_clk_params.pixel_encoding == PIXEL_ENCODING_YCBCR420) { 1182 - audio_output->crtc_info.requested_pixel_clock = 1183 - audio_output->crtc_info.requested_pixel_clock/2; 1184 - audio_output->crtc_info.calculated_pixel_clock = 1185 - pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz/20; 1182 + audio_output->crtc_info.requested_pixel_clock_100Hz = 1183 + audio_output->crtc_info.requested_pixel_clock_100Hz/2; 1184 + audio_output->crtc_info.calculated_pixel_clock_100Hz = 1185 + pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz/2; 1186 1186 1187 1187 } 1188 1188 }
+15 -15
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
··· 1196 1196 1197 1197 void get_audio_clock_info( 1198 1198 enum dc_color_depth color_depth, 1199 - uint32_t crtc_pixel_clock_in_khz, 1200 - uint32_t actual_pixel_clock_in_khz, 1199 + uint32_t crtc_pixel_clock_100Hz, 1200 + uint32_t actual_pixel_clock_100Hz, 1201 1201 struct audio_clock_info *audio_clock_info) 1202 1202 { 1203 1203 const struct audio_clock_info *clock_info; 1204 1204 uint32_t index; 1205 - uint32_t crtc_pixel_clock_in_10khz = crtc_pixel_clock_in_khz / 10; 1205 + uint32_t crtc_pixel_clock_in_10khz = crtc_pixel_clock_100Hz / 100; 1206 1206 uint32_t audio_array_size; 1207 1207 1208 1208 switch (color_depth) { ··· 1239 1239 } 1240 1240 1241 1241 /* not found */ 1242 - if (actual_pixel_clock_in_khz == 0) 1243 - actual_pixel_clock_in_khz = crtc_pixel_clock_in_khz; 1242 + if (actual_pixel_clock_100Hz == 0) 1243 + actual_pixel_clock_100Hz = crtc_pixel_clock_100Hz; 1244 1244 1245 1245 /* See HDMI spec the table entry under 1246 1246 * pixel clock of "Other". */ 1247 1247 audio_clock_info->pixel_clock_in_10khz = 1248 - actual_pixel_clock_in_khz / 10; 1249 - audio_clock_info->cts_32khz = actual_pixel_clock_in_khz; 1250 - audio_clock_info->cts_44khz = actual_pixel_clock_in_khz; 1251 - audio_clock_info->cts_48khz = actual_pixel_clock_in_khz; 1248 + actual_pixel_clock_100Hz / 100; 1249 + audio_clock_info->cts_32khz = actual_pixel_clock_100Hz / 10; 1250 + audio_clock_info->cts_44khz = actual_pixel_clock_100Hz / 10; 1251 + audio_clock_info->cts_48khz = actual_pixel_clock_100Hz / 10; 1252 1252 1253 1253 audio_clock_info->n_32khz = 4096; 1254 1254 audio_clock_info->n_44khz = 6272; ··· 1308 1308 1309 1309 /* Program audio clock sample/regeneration parameters */ 1310 1310 get_audio_clock_info(crtc_info->color_depth, 1311 - crtc_info->requested_pixel_clock, 1312 - crtc_info->calculated_pixel_clock, 1311 + crtc_info->requested_pixel_clock_100Hz, 1312 + crtc_info->calculated_pixel_clock_100Hz, 1313 1313 &audio_clock_info); 1314 1314 DC_LOG_HW_AUDIO( 1315 - "\n%s:Input::requested_pixel_clock = %d" \ 1316 - "calculated_pixel_clock = %d \n", __func__, \ 1317 - crtc_info->requested_pixel_clock, \ 1318 - crtc_info->calculated_pixel_clock); 1315 + "\n%s:Input::requested_pixel_clock_100Hz = %d" \ 1316 + "calculated_pixel_clock_100Hz = %d \n", __func__, \ 1317 + crtc_info->requested_pixel_clock_100Hz, \ 1318 + crtc_info->calculated_pixel_clock_100Hz); 1319 1319 1320 1320 /* HDMI_ACR_32_0__HDMI_ACR_CTS_32_MASK */ 1321 1321 REG_UPDATE(HDMI_ACR_32_0, HDMI_ACR_CTS_32, audio_clock_info.cts_32khz);
+2 -2
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h
··· 605 605 606 606 void get_audio_clock_info( 607 607 enum dc_color_depth color_depth, 608 - uint32_t crtc_pixel_clock_in_khz, 609 - uint32_t actual_pixel_clock_in_khz, 608 + uint32_t crtc_pixel_clock_100Hz, 609 + uint32_t actual_pixel_clock_100Hz, 610 610 struct audio_clock_info *audio_clock_info); 611 611 612 612 #endif /* __DC_STREAM_ENCODER_DCN10_H__ */
+2 -2
drivers/gpu/drm/amd/display/include/audio_types.h
··· 38 38 uint32_t h_active; 39 39 uint32_t v_active; 40 40 uint32_t pixel_repetition; 41 - uint32_t requested_pixel_clock; /* in KHz */ 42 - uint32_t calculated_pixel_clock; /* in KHz */ 41 + uint32_t requested_pixel_clock_100Hz; /* in 100Hz */ 42 + uint32_t calculated_pixel_clock_100Hz; /* in 100Hz */ 43 43 uint32_t refresh_rate; 44 44 enum dc_color_depth color_depth; 45 45 bool interlaced;