Skip to content

Commit 940f097

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 940f097

3 files changed

Lines changed: 52 additions & 16 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
}

drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,6 @@ struct hpo_dp_stream_encoder_funcs {
380380
};
381381

382382
struct hpo_hdmi_stream_encoder_funcs {
383-
384-
/* Core lifecycle */
385383
void (*enable)(
386384
struct hpo_hdmi_stream_encoder *enc,
387385
uint8_t source_select);
@@ -405,7 +403,8 @@ struct hpo_hdmi_stream_encoder_funcs {
405403
struct hpo_hdmi_stream_encoder *enc,
406404
unsigned int az_inst,
407405
struct audio_info *info,
408-
struct audio_crtc_info *audio_crtc_info);
406+
struct audio_crtc_info *audio_crtc_info,
407+
uint8_t frl_rate);
409408

410409
void (*hdmi_audio_enable)(
411410
struct hpo_hdmi_stream_encoder *enc);

drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_frl.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ static void setup_hpo_hdmi_frl_audio_output(struct pipe_ctx *pipe_ctx,
9393
{
9494
pipe_ctx->stream_res.hpo_hdmi_stream_enc->funcs->hdmi_audio_setup(
9595
pipe_ctx->stream_res.hpo_hdmi_stream_enc, audio_inst,
96-
&pipe_ctx->stream->audio_info, &audio_output->crtc_info);
96+
&pipe_ctx->stream->audio_info, &audio_output->crtc_info,
97+
pipe_ctx->stream->link->cur_link_settings.frl_rate);
9798
}
9899

99100
static void enable_hpo_hdmi_frl_audio_packet(struct pipe_ctx *pipe_ctx)

0 commit comments

Comments
 (0)