diff options
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.patch | 515 |
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 + |