aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3957-SWDEV-202843-drm-amd-display-dc-map-TRANSMITTER_UNIP.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3957-SWDEV-202843-drm-amd-display-dc-map-TRANSMITTER_UNIP.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3957-SWDEV-202843-drm-amd-display-dc-map-TRANSMITTER_UNIP.patch515
1 files changed, 515 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3957-SWDEV-202843-drm-amd-display-dc-map-TRANSMITTER_UNIP.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3957-SWDEV-202843-drm-amd-display-dc-map-TRANSMITTER_UNIP.patch
new file mode 100644
index 00000000..110f3ac3
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3957-SWDEV-202843-drm-amd-display-dc-map-TRANSMITTER_UNIP.patch
@@ -0,0 +1,515 @@
+From f193f8d3319e7276dd520fcfcc21348d5cc680fe Mon Sep 17 00:00:00 2001
+From: Yogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
+Date: Wed, 2 Oct 2019 12:36:33 +0530
+Subject: [PATCH 3957/4256] SWDEV-202843 - drm/amd/display/dc: map
+ TRANSMITTER_UNIPHY_x to LINK_REGS_x
+
+[Why]
+The enum value for TRANSMITTER_UNIPHY_G is 9. In resource dc_xx_resource
+file structure link_enc_regs[], the TRANSMITTER_UNIPHY_G registers are
+initialized at index 6. Due to this mismatch, if monitor is attached to
+port using TRANSMITTER_UNIPHY_G then the monitor blanks out.
+
+[How]
+add function map_transmitter_id_to_phy_instance() and use the function
+to map enum transmitter to link regs.
+
+Change-Id: I1475721eefeed5b802697c7b3e05d9aeaf6e38ca
+Signed-off-by: Yogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
+Reviewed-by: Eric Yang <eric.yang2@amd.com>
+---
+ .../amd/display/dc/dce100/dce100_resource.c | 37 +++++++++++++-
+ .../amd/display/dc/dce110/dce110_resource.c | 37 +++++++++++++-
+ .../amd/display/dc/dce112/dce112_resource.c | 37 +++++++++++++-
+ .../amd/display/dc/dce120/dce120_resource.c | 37 +++++++++++++-
+ .../drm/amd/display/dc/dce80/dce80_resource.c | 37 +++++++++++++-
+ .../drm/amd/display/dc/dcn10/dcn10_resource.c | 28 ++++++++++-
+ .../drm/amd/display/dc/dcn20/dcn20_resource.c | 33 +++++++++++-
+ .../drm/amd/display/dc/dcn21/dcn21_resource.c | 50 +++++++++++++++++++
+ 8 files changed, 289 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+index 99c9c5e7476d..e39c9a732f07 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+@@ -396,6 +396,37 @@ static const struct dc_plane_cap plane_cap = {
+ #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+ #endif
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ case TRANSMITTER_UNIPHY_E:
++ return 4;
++ break;
++ case TRANSMITTER_UNIPHY_F:
++ return 5;
++ break;
++ case TRANSMITTER_UNIPHY_G:
++ return 6;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
++
+ static void read_dce_straps(
+ struct dc_context *ctx,
+ struct resource_straps *straps)
+@@ -568,14 +599,18 @@ struct link_encoder *dce100_link_encoder_create(
+ {
+ struct dce110_link_encoder *enc110 =
+ kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
++ int link_regs_id;
+
+ if (!enc110)
+ return NULL;
+
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
+ dce110_link_encoder_construct(enc110,
+ enc_init_data,
+ &link_enc_feature,
+- &link_enc_regs[enc_init_data->transmitter],
++ &link_enc_regs[link_regs_id],
+ &link_enc_aux_regs[enc_init_data->channel - 1],
+ &link_enc_hpd_regs[enc_init_data->hpd_source]);
+ return &enc110->base;
+diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
+index b35caf9fad49..e8e018e2a67b 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
+@@ -438,6 +438,37 @@ static const struct dc_plane_cap underlay_plane_cap = {
+ #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+ #endif
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ case TRANSMITTER_UNIPHY_E:
++ return 4;
++ break;
++ case TRANSMITTER_UNIPHY_F:
++ return 5;
++ break;
++ case TRANSMITTER_UNIPHY_G:
++ return 6;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
++
+ static void read_dce_straps(
+ struct dc_context *ctx,
+ struct resource_straps *straps)
+@@ -615,14 +646,18 @@ static struct link_encoder *dce110_link_encoder_create(
+ {
+ struct dce110_link_encoder *enc110 =
+ kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
++ int link_regs_id;
+
+ if (!enc110)
+ return NULL;
+
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
+ dce110_link_encoder_construct(enc110,
+ enc_init_data,
+ &link_enc_feature,
+- &link_enc_regs[enc_init_data->transmitter],
++ &link_enc_regs[link_regs_id],
+ &link_enc_aux_regs[enc_init_data->channel - 1],
+ &link_enc_hpd_regs[enc_init_data->hpd_source]);
+ return &enc110->base;
+diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+index 254a6452b2b3..de0b3785f0d2 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+@@ -415,6 +415,37 @@ static const struct dc_plane_cap plane_cap = {
+ #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+ #endif
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ case TRANSMITTER_UNIPHY_E:
++ return 4;
++ break;
++ case TRANSMITTER_UNIPHY_F:
++ return 5;
++ break;
++ case TRANSMITTER_UNIPHY_G:
++ return 6;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
++
+ static void read_dce_straps(
+ struct dc_context *ctx,
+ struct resource_straps *straps)
+@@ -573,14 +604,18 @@ struct link_encoder *dce112_link_encoder_create(
+ {
+ struct dce110_link_encoder *enc110 =
+ kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
++ int link_regs_id;
+
+ if (!enc110)
+ return NULL;
+
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
+ dce110_link_encoder_construct(enc110,
+ enc_init_data,
+ &link_enc_feature,
+- &link_enc_regs[enc_init_data->transmitter],
++ &link_enc_regs[link_regs_id],
+ &link_enc_aux_regs[enc_init_data->channel - 1],
+ &link_enc_hpd_regs[enc_init_data->hpd_source]);
+ return &enc110->base;
+diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
+index fde60d41f865..c47961549f0b 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
+@@ -354,6 +354,37 @@ static const struct dce_audio_mask audio_mask = {
+ DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+ };
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ case TRANSMITTER_UNIPHY_E:
++ return 4;
++ break;
++ case TRANSMITTER_UNIPHY_F:
++ return 5;
++ break;
++ case TRANSMITTER_UNIPHY_G:
++ return 6;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
++
+ #define clk_src_regs(index, id)\
+ [index] = {\
+ CS_COMMON_REG_LIST_DCE_112(id),\
+@@ -652,14 +683,18 @@ static struct link_encoder *dce120_link_encoder_create(
+ {
+ struct dce110_link_encoder *enc110 =
+ kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
++ int link_regs_id;
+
+ if (!enc110)
+ return NULL;
+
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
+ dce110_link_encoder_construct(enc110,
+ enc_init_data,
+ &link_enc_feature,
+- &link_enc_regs[enc_init_data->transmitter],
++ &link_enc_regs[link_regs_id],
+ &link_enc_aux_regs[enc_init_data->channel - 1],
+ &link_enc_hpd_regs[enc_init_data->hpd_source]);
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+index 86be482b6816..ff35eff3f34b 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+@@ -429,6 +429,37 @@ static const struct dce_abm_mask abm_mask = {
+ #define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+ #endif
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ case TRANSMITTER_UNIPHY_E:
++ return 4;
++ break;
++ case TRANSMITTER_UNIPHY_F:
++ return 5;
++ break;
++ case TRANSMITTER_UNIPHY_G:
++ return 6;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
++
+ static void read_dce_straps(
+ struct dc_context *ctx,
+ struct resource_straps *straps)
+@@ -667,14 +698,18 @@ struct link_encoder *dce80_link_encoder_create(
+ {
+ struct dce110_link_encoder *enc110 =
+ kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
++ int link_regs_id;
+
+ if (!enc110)
+ return NULL;
+
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
+ dce110_link_encoder_construct(enc110,
+ enc_init_data,
+ &link_enc_feature,
+- &link_enc_regs[enc_init_data->transmitter],
++ &link_enc_regs[link_regs_id],
+ &link_enc_aux_regs[enc_init_data->channel - 1],
+ &link_enc_hpd_regs[enc_init_data->hpd_source]);
+ return &enc110->base;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
+index 4e633f3a99d4..eb8bc5538626 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
+@@ -469,6 +469,28 @@ static const struct dcn_hubbub_mask hubbub_mask = {
+ HUBBUB_MASK_SH_LIST_DCN10(_MASK)
+ };
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
++
+ #define clk_src_regs(index, pllid)\
+ [index] = {\
+ CS_COMMON_REG_LIST_DCN1_0(index, pllid),\
+@@ -749,14 +771,18 @@ struct link_encoder *dcn10_link_encoder_create(
+ {
+ struct dcn10_link_encoder *enc10 =
+ kzalloc(sizeof(struct dcn10_link_encoder), GFP_KERNEL);
++ int link_regs_id;
+
+ if (!enc10)
+ return NULL;
+
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
+ dcn10_link_encoder_construct(enc10,
+ enc_init_data,
+ &link_enc_feature,
+- &link_enc_regs[enc_init_data->transmitter],
++ &link_enc_regs[link_regs_id],
+ &link_enc_aux_regs[enc_init_data->channel - 1],
+ &link_enc_hpd_regs[enc_init_data->hpd_source],
+ &le_shift,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
+index 8d81c65157d4..035ef83be6cf 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
+@@ -891,6 +891,33 @@ struct input_pixel_processor *dcn20_ipp_create(
+ return &ipp->base;
+ }
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ case TRANSMITTER_UNIPHY_E:
++ return 4;
++ break;
++ case TRANSMITTER_UNIPHY_F:
++ return 5;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
+
+ struct output_pixel_processor *dcn20_opp_create(
+ struct dc_context *ctx, uint32_t inst)
+@@ -1040,14 +1067,18 @@ struct link_encoder *dcn20_link_encoder_create(
+ {
+ struct dcn20_link_encoder *enc20 =
+ kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
++ int link_regs_id;
+
+ if (!enc20)
+ return NULL;
+
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
+ dcn20_link_encoder_construct(enc20,
+ enc_init_data,
+ &link_enc_feature,
+- &link_enc_regs[enc_init_data->transmitter],
++ &link_enc_regs[link_regs_id],
+ &link_enc_aux_regs[enc_init_data->channel - 1],
+ &link_enc_hpd_regs[enc_init_data->hpd_source],
+ &le_shift,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
+index de182185fe1f..5a6e55b7d536 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
+@@ -1418,6 +1418,56 @@ static const struct resource_create_funcs res_create_maximus_funcs = {
+ .create_hwseq = dcn21_hwseq_create,
+ };
+
++static int map_transmitter_id_to_phy_instance(
++ enum transmitter transmitter)
++{
++ switch (transmitter) {
++ case TRANSMITTER_UNIPHY_A:
++ return 0;
++ break;
++ case TRANSMITTER_UNIPHY_B:
++ return 1;
++ break;
++ case TRANSMITTER_UNIPHY_C:
++ return 2;
++ break;
++ case TRANSMITTER_UNIPHY_D:
++ return 3;
++ break;
++ case TRANSMITTER_UNIPHY_E:
++ return 4;
++ break;
++ default:
++ ASSERT(0);
++ return 0;
++ }
++}
++
++static struct link_encoder *dcn21_link_encoder_create(
++ const struct encoder_init_data *enc_init_data)
++{
++ struct dcn21_link_encoder *enc21 =
++ kzalloc(sizeof(struct dcn21_link_encoder), GFP_KERNEL);
++ int link_regs_id;
++
++ if (!enc21)
++ return NULL;
++
++ link_regs_id =
++ map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
++
++ dcn21_link_encoder_construct(enc21,
++ enc_init_data,
++ &link_enc_feature,
++ &link_enc_regs[link_regs_id],
++ &link_enc_aux_regs[enc_init_data->channel - 1],
++ &link_enc_hpd_regs[enc_init_data->hpd_source],
++ &le_shift,
++ &le_mask);
++
++ return &enc21->enc10.base;
++}
++
+ static struct resource_funcs dcn21_res_pool_funcs = {
+ .destroy = dcn21_destroy_resource_pool,
+ .link_enc_create = dcn20_link_encoder_create,
+--
+2.17.1
+