diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4499-drm-amd-display-add-automated-audio-test-support.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4499-drm-amd-display-add-automated-audio-test-support.patch | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4499-drm-amd-display-add-automated-audio-test-support.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4499-drm-amd-display-add-automated-audio-test-support.patch new file mode 100644 index 00000000..38ff0e30 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4499-drm-amd-display-add-automated-audio-test-support.patch @@ -0,0 +1,234 @@ +From c8b372b25d04f3b1747ce7df0680b109740d9f0f Mon Sep 17 00:00:00 2001 +From: abdoulaye berthe <abdoulaye.berthe@amd.com> +Date: Fri, 26 Jul 2019 11:25:43 -0400 +Subject: [PATCH 4499/4736] drm/amd/display: add automated audio test support + +Change-Id: I2b01c053888b2bb3e1f117af591c8dd3f3a36111 +Signed-off-by: abdoulaye berthe <abdoulaye.berthe@amd.com> +Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com> +Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> +Signed-off-by: Rahul Kumar <rahul.kumar1@amd.com> +--- + .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 92 +++++++++++++++++++ + drivers/gpu/drm/amd/display/dc/dc_dp_types.h | 48 ++++++++-- + drivers/gpu/drm/amd/display/dc/dc_link.h | 1 + + include/drm/drm_dp_helper.h | 15 +++ + 4 files changed, 149 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +index 4e0ca8d1b484..a32626864154 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +@@ -2568,6 +2568,92 @@ static void dp_test_send_link_test_pattern(struct dc_link *link) + 0); + } + ++static void dp_test_get_audio_test_data(struct dc_link *link, bool disable_video) ++{ ++ union audio_test_mode dpcd_test_mode = {0}; ++ struct audio_test_pattern_type dpcd_pattern_type = {0}; ++ union audio_test_pattern_period dpcd_pattern_period[AUDIO_CHANNELS_COUNT] = {0}; ++ enum dp_test_pattern test_pattern = DP_TEST_PATTERN_AUDIO_OPERATOR_DEFINED; ++ ++ struct pipe_ctx *pipes = link->dc->current_state->res_ctx.pipe_ctx; ++ struct pipe_ctx *pipe_ctx = &pipes[0]; ++ unsigned int channel_count; ++ unsigned int channel = 0; ++ unsigned int modes = 0; ++ unsigned int sampling_rate_in_hz = 0; ++ ++ // get audio test mode and test pattern parameters ++ core_link_read_dpcd( ++ link, ++ DP_TEST_AUDIO_MODE, ++ &dpcd_test_mode.raw, ++ sizeof(dpcd_test_mode)); ++ ++ core_link_read_dpcd( ++ link, ++ DP_TEST_AUDIO_PATTERN_TYPE, ++ &dpcd_pattern_type.value, ++ sizeof(dpcd_pattern_type)); ++ ++ channel_count = dpcd_test_mode.bits.channel_count + 1; ++ ++ // read pattern periods for requested channels when sawTooth pattern is requested ++ if (dpcd_pattern_type.value == AUDIO_TEST_PATTERN_SAWTOOTH || ++ dpcd_pattern_type.value == AUDIO_TEST_PATTERN_OPERATOR_DEFINED) { ++ ++ test_pattern = (dpcd_pattern_type.value == AUDIO_TEST_PATTERN_SAWTOOTH) ? ++ DP_TEST_PATTERN_AUDIO_SAWTOOTH : DP_TEST_PATTERN_AUDIO_OPERATOR_DEFINED; ++ // read period for each channel ++ for (channel = 0; channel < channel_count; channel++) { ++ core_link_read_dpcd( ++ link, ++ DP_TEST_AUDIO_PERIOD_CH1 + channel, ++ &dpcd_pattern_period[channel].raw, ++ sizeof(dpcd_pattern_period[channel])); ++ } ++ } ++ ++ // translate sampling rate ++ switch (dpcd_test_mode.bits.sampling_rate) { ++ case AUDIO_SAMPLING_RATE_32KHZ: ++ sampling_rate_in_hz = 32000; ++ break; ++ case AUDIO_SAMPLING_RATE_44_1KHZ: ++ sampling_rate_in_hz = 44100; ++ break; ++ case AUDIO_SAMPLING_RATE_48KHZ: ++ sampling_rate_in_hz = 48000; ++ break; ++ case AUDIO_SAMPLING_RATE_88_2KHZ: ++ sampling_rate_in_hz = 88200; ++ break; ++ case AUDIO_SAMPLING_RATE_96KHZ: ++ sampling_rate_in_hz = 96000; ++ break; ++ case AUDIO_SAMPLING_RATE_176_4KHZ: ++ sampling_rate_in_hz = 176400; ++ break; ++ case AUDIO_SAMPLING_RATE_192KHZ: ++ sampling_rate_in_hz = 192000; ++ break; ++ default: ++ sampling_rate_in_hz = 0; ++ break; ++ } ++ ++ link->audio_test_data.flags.test_requested = 1; ++ link->audio_test_data.flags.disable_video = disable_video; ++ link->audio_test_data.sampling_rate = sampling_rate_in_hz; ++ link->audio_test_data.channel_count = channel_count; ++ link->audio_test_data.pattern_type = test_pattern; ++ ++ if (test_pattern == DP_TEST_PATTERN_AUDIO_SAWTOOTH) { ++ for (modes = 0; modes < pipe_ctx->stream->audio_info.mode_count; modes++) { ++ link->audio_test_data.pattern_period[modes] = dpcd_pattern_period[modes].bits.pattern_period; ++ } ++ } ++} ++ + static void handle_automated_test(struct dc_link *link) + { + union test_request test_request; +@@ -2597,6 +2683,12 @@ static void handle_automated_test(struct dc_link *link) + dp_test_send_link_test_pattern(link); + test_response.bits.ACK = 1; + } ++ ++ if (test_request.bits.AUDIO_TEST_PATTERN) { ++ dp_test_get_audio_test_data(link, test_request.bits.TEST_AUDIO_DISABLED_VIDEO); ++ test_response.bits.ACK = 1; ++ } ++ + if (test_request.bits.PHY_TEST_PATTERN) { + dp_test_send_phy_test_pattern(link); + test_response.bits.ACK = 1; +diff --git a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h +index f0a6e25d2d4a..28234d8fdb2c 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h +@@ -471,13 +471,13 @@ union training_aux_rd_interval { + /* Automated test structures */ + union test_request { + struct { +- uint8_t LINK_TRAINING :1; +- uint8_t LINK_TEST_PATTRN :1; +- uint8_t EDID_READ :1; +- uint8_t PHY_TEST_PATTERN :1; +- uint8_t AUDIO_TEST_PATTERN :1; +- uint8_t RESERVED :1; +- uint8_t TEST_STEREO_3D :1; ++ uint8_t LINK_TRAINING :1; ++ uint8_t LINK_TEST_PATTRN :1; ++ uint8_t EDID_READ :1; ++ uint8_t PHY_TEST_PATTERN :1; ++ uint8_t RESERVED :1; ++ uint8_t AUDIO_TEST_PATTERN :1; ++ uint8_t TEST_AUDIO_DISABLED_VIDEO :1; + } bits; + uint8_t raw; + }; +@@ -536,6 +536,40 @@ union test_misc { + unsigned char raw; + }; + ++union audio_test_mode { ++ struct { ++ unsigned char sampling_rate :4; ++ unsigned char channel_count :4; ++ } bits; ++ unsigned char raw; ++}; ++ ++union audio_test_pattern_period { ++ struct { ++ unsigned char pattern_period :4; ++ unsigned char reserved :4; ++ } bits; ++ unsigned char raw; ++}; ++ ++struct audio_test_pattern_type { ++ unsigned char value; ++}; ++ ++struct dp_audio_test_data_flags { ++ uint8_t test_requested :1; ++ uint8_t disable_video :1; ++}; ++ ++struct dp_audio_test_data { ++ ++ struct dp_audio_test_data_flags flags; ++ uint8_t sampling_rate; ++ uint8_t channel_count; ++ uint8_t pattern_type; ++ uint8_t pattern_period[8]; ++}; ++ + #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT + /* FEC capability DPCD register field bits-*/ + union dpcd_fec_capability { +diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h +index ccb68c14a806..03efdc1a7b03 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_link.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_link.h +@@ -96,6 +96,7 @@ struct dc_link { + struct dc_lane_settings cur_lane_setting; + struct dc_link_settings preferred_link_setting; + struct dc_link_training_overrides preferred_training_settings; ++ struct dp_audio_test_data audio_test_data; + + uint8_t ddc_hw_inst; + +diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h +index 4f9184a238dd..5de6fa29300e 100644 +--- a/include/drm/drm_dp_helper.h ++++ b/include/drm/drm_dp_helper.h +@@ -61,6 +61,21 @@ + #define DP_AUX_I2C_REPLY_DEFER (0x2 << 2) + #define DP_AUX_I2C_REPLY_MASK (0x3 << 2) + ++ ++#if !defined(DP_TEST_AUDIO_MODE) ++#define DP_TEST_AUDIO_MODE 0x271 ++#endif ++ ++#if !defined(DP_TEST_AUDIO_PATTERN_TYPE) ++#define DP_TEST_AUDIO_PATTERN_TYPE 0x272 ++#endif ++ ++#if !defined(DP_TEST_AUDIO_PERIOD_CH1) ++#define DP_TEST_AUDIO_PERIOD_CH1 0x273 ++#endif ++ ++ ++ + /* AUX CH addresses */ + /* DPCD */ + #define DP_DPCD_REV 0x000 +-- +2.17.1 + |