aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4194-drm-amd-display-handle-dp-is-usb-c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4194-drm-amd-display-handle-dp-is-usb-c.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4194-drm-amd-display-handle-dp-is-usb-c.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4194-drm-amd-display-handle-dp-is-usb-c.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4194-drm-amd-display-handle-dp-is-usb-c.patch
new file mode 100644
index 00000000..858e7590
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4194-drm-amd-display-handle-dp-is-usb-c.patch
@@ -0,0 +1,204 @@
+From 9f9a2f7528397a663e8472ddaa522e8bea6eece4 Mon Sep 17 00:00:00 2001
+From: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
+Date: Fri, 11 Oct 2019 10:37:49 -0400
+Subject: [PATCH 4194/4736] drm/amd/display: handle dp is usb-c
+
+This patch adds handling of dp is usb-c, it is not tested but is
+needed to support dp over usb-c
+
+Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
+Reviewed-by: Roman Li <Roman.Li@amd.com>
+---
+ .../amd/display/dc/dcn10/dcn10_link_encoder.h | 14 +++
+ .../amd/display/dc/dcn21/dcn21_link_encoder.c | 93 ++++++++++++++++++-
+ .../amd/display/dc/dcn21/dcn21_link_encoder.h | 10 ++
+ 3 files changed, 116 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
+index 239a6c90ffb9..88fcc395adf5 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
+@@ -113,6 +113,20 @@ struct dcn10_link_enc_registers {
+ uint32_t DIG_LANE_ENABLE;
+ /* UNIPHY */
+ uint32_t CHANNEL_XBAR_CNTL;
++ /* DPCS */
++ uint32_t RDPCSTX_PHY_CNTL3;
++ uint32_t RDPCSTX_PHY_CNTL4;
++ uint32_t RDPCSTX_PHY_CNTL5;
++ uint32_t RDPCSTX_PHY_CNTL6;
++ uint32_t RDPCSTX_PHY_CNTL7;
++ uint32_t RDPCSTX_PHY_CNTL8;
++ uint32_t RDPCSTX_PHY_CNTL9;
++ uint32_t RDPCSTX_PHY_CNTL10;
++ uint32_t RDPCSTX_PHY_CNTL11;
++ uint32_t RDPCSTX_PHY_CNTL12;
++ uint32_t RDPCSTX_PHY_CNTL13;
++ uint32_t RDPCSTX_PHY_CNTL14;
++ uint32_t RDPCSTX_PHY_CNTL15;
+ /* indirect registers */
+ uint32_t RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_2;
+ uint32_t RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_3;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.c
+index 526865c43b48..e8a504ca5890 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.c
+@@ -203,6 +203,77 @@ static bool update_cfg_data(
+ return true;
+ }
+
++void dcn21_link_encoder_get_max_link_cap(struct link_encoder *enc,
++ struct dc_link_settings *link_settings)
++{
++ struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
++ uint32_t value;
++
++ REG_GET(RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, &value);
++
++ if (!value && link_settings->lane_count > LANE_COUNT_TWO)
++ link_settings->lane_count = LANE_COUNT_TWO;
++}
++
++bool dcn21_link_encoder_is_in_alt_mode(struct link_encoder *enc)
++{
++ struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
++ uint32_t value;
++
++ REG_GET(RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, &value);
++
++ // if value == 1 alt mode is disabled, otherwise it is enabled
++ return !value;
++}
++
++bool dcn21_link_encoder_acquire_phy(struct link_encoder *enc)
++{
++ struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
++ int value;
++
++ if (enc->features.flags.bits.DP_IS_USB_C) {
++ REG_GET(RDPCSTX_PHY_CNTL6,
++ RDPCS_PHY_DPALT_DISABLE, &value);
++
++ if (value == 1) {
++ ASSERT(0);
++ return false;
++ }
++ REG_UPDATE(RDPCSTX_PHY_CNTL6,
++ RDPCS_PHY_DPALT_DISABLE_ACK, 0);
++
++ udelay(40);
++
++ REG_GET(RDPCSTX_PHY_CNTL6,
++ RDPCS_PHY_DPALT_DISABLE, &value);
++ if (value == 1) {
++ ASSERT(0);
++ REG_UPDATE(RDPCSTX_PHY_CNTL6,
++ RDPCS_PHY_DPALT_DISABLE_ACK, 1);
++ return false;
++ }
++ }
++
++ REG_UPDATE(RDPCSTX_PHY_CNTL6, RDPCS_PHY_DP_REF_CLK_EN, 1);
++
++ return true;
++}
++
++
++
++static void dcn21_link_encoder_release_phy(struct link_encoder *enc)
++{
++ struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
++
++ if (enc->features.flags.bits.DP_IS_USB_C) {
++ REG_UPDATE(RDPCSTX_PHY_CNTL6,
++ RDPCS_PHY_DPALT_DISABLE_ACK, 1);
++ }
++
++ REG_UPDATE(RDPCSTX_PHY_CNTL6, RDPCS_PHY_DP_REF_CLK_EN, 0);
++
++}
++
+ void dcn21_link_encoder_enable_dp_output(
+ struct link_encoder *enc,
+ const struct dc_link_settings *link_settings,
+@@ -212,6 +283,9 @@ void dcn21_link_encoder_enable_dp_output(
+ struct dcn21_link_encoder *enc21 = (struct dcn21_link_encoder *) enc10;
+ struct dpcssys_phy_seq_cfg *cfg = &enc21->phy_seq_cfg;
+
++ if (!dcn21_link_encoder_acquire_phy(enc))
++ return;
++
+ if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+ dcn10_link_encoder_enable_dp_output(enc, link_settings, clock_source);
+ return;
+@@ -226,13 +300,28 @@ void dcn21_link_encoder_enable_dp_output(
+
+ }
+
++void dcn21_link_encoder_enable_dp_mst_output(
++ struct link_encoder *enc,
++ const struct dc_link_settings *link_settings,
++ enum clock_source_id clock_source)
++{
++ if (!dcn21_link_encoder_acquire_phy(enc))
++ return;
++
++ dcn10_link_encoder_enable_dp_mst_output(enc, link_settings, clock_source);
++}
++
+ void dcn21_link_encoder_disable_output(
+ struct link_encoder *enc,
+ enum signal_type signal)
+ {
+ dcn10_link_encoder_disable_output(enc, signal);
+
++ if (dc_is_dp_signal(signal))
++ dcn21_link_encoder_release_phy(enc);
+ }
++
++
+ static const struct link_encoder_funcs dcn21_link_enc_funcs = {
+ #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+ .read_state = link_enc2_read_state,
+@@ -243,7 +332,7 @@ static const struct link_encoder_funcs dcn21_link_enc_funcs = {
+ .setup = dcn10_link_encoder_setup,
+ .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
+ .enable_dp_output = dcn21_link_encoder_enable_dp_output,
+- .enable_dp_mst_output = dcn10_link_encoder_enable_dp_mst_output,
++ .enable_dp_mst_output = dcn21_link_encoder_enable_dp_mst_output,
+ .disable_output = dcn21_link_encoder_disable_output,
+ .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
+ .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
+@@ -261,6 +350,8 @@ static const struct link_encoder_funcs dcn21_link_enc_funcs = {
+ .fec_set_ready = enc2_fec_set_ready,
+ .fec_is_active = enc2_fec_is_active,
+ .get_dig_frontend = dcn10_get_dig_frontend,
++ .is_in_alt_mode = dcn21_link_encoder_is_in_alt_mode,
++ .get_max_link_cap = dcn21_link_encoder_get_max_link_cap,
+ };
+
+ void dcn21_link_encoder_construct(
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.h
+index 438321e547db..1d7a1a51f13d 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_link_encoder.h
+@@ -33,6 +33,16 @@ struct dcn21_link_encoder {
+ struct dpcssys_phy_seq_cfg phy_seq_cfg;
+ };
+
++#define LINK_ENCODER_MASK_SH_LIST_DCN21(mask_sh)\
++ LINK_ENCODER_MASK_SH_LIST_DCN20(mask_sh),\
++ LE_SF(UNIPHYA_CHANNEL_XBAR_CNTL, UNIPHY_CHANNEL0_XBAR_SOURCE, mask_sh),\
++ LE_SF(UNIPHYA_CHANNEL_XBAR_CNTL, UNIPHY_CHANNEL1_XBAR_SOURCE, mask_sh),\
++ LE_SF(UNIPHYA_CHANNEL_XBAR_CNTL, UNIPHY_CHANNEL2_XBAR_SOURCE, mask_sh),\
++ LE_SF(UNIPHYA_CHANNEL_XBAR_CNTL, UNIPHY_CHANNEL3_XBAR_SOURCE, mask_sh), \
++ SRI(RDPCSTX_PHY_FUSE2, RDPCSTX, id), \
++ SRI(RDPCSTX_PHY_FUSE3, RDPCSTX, id), \
++ SR(RDPCSTX0_RDPCSTX_SCRATCH)
++
+ void dcn21_link_encoder_enable_dp_output(
+ struct link_encoder *enc,
+ const struct dc_link_settings *link_settings,
+--
+2.17.1
+