Skip to content

Commit eb92038

Browse files
committed
drivers/gpu/drm/amd/display/dc/hpo/dcn30/dcn30_hpo_hdmi_stream_encoder.c: set audio N and CTS correctly for FRL
Values dumped by running the Windows driver at different FRL rates.
1 parent 098614e commit eb92038

1 file changed

Lines changed: 48 additions & 12 deletions

File tree

drivers/gpu/drm/amd/display/dc/hpo/dcn30/dcn30_hpo_hdmi_stream_encoder.c

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -384,13 +384,55 @@ static void dcn30_hpo_hdmi_stream_enc_setup_stream_attribute(
384384
REG_UPDATE(HDMI_TB_ENC_GC_CONTROL, HDMI_GC_AVMUTE, 0);
385385
}
386386

387+
struct frl_audio_clock_info {
388+
uint32_t frl_lane_rate;
389+
/* N - 32KHz audio */
390+
uint32_t n_32khz;
391+
/* CTS - 32KHz audio*/
392+
uint32_t cts_32khz;
393+
uint32_t n_44khz;
394+
uint32_t cts_44khz;
395+
uint32_t n_48khz;
396+
uint32_t cts_48khz;
397+
};
398+
399+
/* Values set by the Windows driver seem to depend only on FRL rate*/
400+
static const struct frl_audio_clock_info frl_audio_clock_info_table[5] = {
401+
{3, 4224, 171875, 5292, 156250, 5760, 156250},
402+
{6, 4032, 328125, 5292, 312500, 6048, 328125},
403+
{8, 4032, 437500, 3969, 312500, 6048, 437500},
404+
{10, 3456, 468750, 3969, 390625, 5184, 468750},
405+
{12, 3072, 500000, 3969, 468750, 4752, 515625},
406+
};
407+
408+
static void get_frl_audio_clock_info(
409+
struct frl_audio_clock_info *audio_clock_info,
410+
uint8_t frl_rate)
411+
{
412+
uint32_t index;
413+
uint32_t frl_lane_rates[] = { 3, 6, 8, 10, 12 };
414+
uint32_t frl_lane_rate;
415+
416+
ASSERT(frl_rate >= 0 && frl_rate <= 6);
417+
418+
frl_lane_rate = frl_lane_rates[frl_rate - 1];
419+
420+
/* search for FRL rate in table */
421+
for (index = 0; index < sizeof(frl_lane_rates) / sizeof(uint32_t); index++)
422+
if (frl_audio_clock_info_table[index].frl_lane_rate == frl_lane_rate)
423+
*audio_clock_info = frl_audio_clock_info_table[index];
424+
425+
/* Should never happen */
426+
*audio_clock_info = frl_audio_clock_info_table[0];
427+
}
428+
387429
static void setup_hdmi_audio(struct hpo_hdmi_stream_encoder *enc,
388-
const struct audio_crtc_info *crtc_info)
430+
const struct audio_crtc_info *crtc_info, uint8_t frl_rate)
389431
{
390432
struct dcn30_hpo_hdmi_stream_encoder *enc3 =
391433
DCN3_0_HPO_HDMI_STREAM_ENC_FROM_HPO_STREAM_ENC(enc);
392434

393-
struct audio_clock_info audio_clock_info = { 0 };
435+
struct frl_audio_clock_info audio_clock_info = { 0 };
394436

395437
/* Setup audio in AFMT - program AFMT block associated with HPO */
396438
ASSERT(enc->afmt);
@@ -400,14 +442,7 @@ static void setup_hdmi_audio(struct hpo_hdmi_stream_encoder *enc,
400442
HDMI_ACR_SOURCE, 0, HDMI_ACR_AUDIO_PRIORITY, 0);
401443

402444
/* Program audio clock sample/regeneration parameters */
403-
get_audio_clock_info(crtc_info->color_depth,
404-
crtc_info->requested_pixel_clock_100Hz,
405-
crtc_info->calculated_pixel_clock_100Hz,
406-
&audio_clock_info);
407-
DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock_100Hz = %d"
408-
"calculated_pixel_clock_100Hz = %d \n",
409-
__func__, crtc_info->requested_pixel_clock_100Hz,
410-
crtc_info->calculated_pixel_clock_100Hz);
445+
get_frl_audio_clock_info(&audio_clock_info, frl_rate);
411446

412447
REG_UPDATE(HDMI_TB_ENC_ACR_32_0, HDMI_ACR_CTS_32,
413448
audio_clock_info.cts_32khz);
@@ -427,9 +462,10 @@ static void setup_hdmi_audio(struct hpo_hdmi_stream_encoder *enc,
427462

428463
static void dcn30_hpo_hdmi_stream_enc_hdmi_audio_setup(
429464
struct hpo_hdmi_stream_encoder *enc, unsigned int az_inst,
430-
struct audio_info *info, struct audio_crtc_info *audio_crtc_info)
465+
struct audio_info *info, struct audio_crtc_info *audio_crtc_info,
466+
uint8_t frl_rate)
431467
{
432-
setup_hdmi_audio(enc, audio_crtc_info);
468+
setup_hdmi_audio(enc, audio_crtc_info, frl_rate);
433469
ASSERT(enc->afmt);
434470
enc->afmt->funcs->se_audio_setup(enc->afmt, az_inst, info);
435471
}

0 commit comments

Comments
 (0)