drm/amd/display: unhard code link to phy idx mapping in dc link and clean up
authorWenjing Liu <wenjing.liu@amd.com>
Mon, 13 Dec 2021 23:29:27 +0000 (18:29 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 7 Jan 2022 22:21:20 +0000 (17:21 -0500)
[why]
1. Current code hard codes link to PHY mapping in dc link level per asic
per revision.
This is not scalable. In long term the mapping will be obatined from
DMUB and store in dc resource.

2. Depending on DCN revision and endpoint type, the definition of
dio_output_idx dio_output_type and phy_idx are not  consistent. We need
to unify the meaning of these hardware indices across different system
configuration.

[how]
1. Temporarly move the hardcoded mapping to dc_resource level, which
should have full awareness of asic specific configuration and add a TODO
comment to move the mapping to DMUB.

2. populate dio_output_idx/phy_idx for all configuration, define
usb4_enabled bit instead of dio_output_type as an external enum.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Eric Yang <Eric.Yang2@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dm_cp_psp.h
drivers/gpu/drm/amd/display/dc/inc/resource.h
drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h

index dc1380b6c5e09bd67c00599566b4536ba7066f6f..b5e570d33ca947d1d4eb97190f682f0e56356801 100644 (file)
@@ -3971,102 +3971,73 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
 static void update_psp_stream_config(struct pipe_ctx *pipe_ctx, bool dpms_off)
 {
        struct cp_psp *cp_psp = &pipe_ctx->stream->ctx->cp_psp;
-#if defined(CONFIG_DRM_AMD_DC_DCN)
        struct link_encoder *link_enc = NULL;
-#endif
+       struct cp_psp_stream_config config = {0};
+       enum dp_panel_mode panel_mode =
+                       dp_get_panel_mode(pipe_ctx->stream->link);
 
-       if (cp_psp && cp_psp->funcs.update_stream_config) {
-               struct cp_psp_stream_config config = {0};
-               enum dp_panel_mode panel_mode =
-                               dp_get_panel_mode(pipe_ctx->stream->link);
+       if (cp_psp == NULL || cp_psp->funcs.update_stream_config == NULL)
+               return;
 
-               config.otg_inst = (uint8_t) pipe_ctx->stream_res.tg->inst;
-               /*stream_enc_inst*/
-               config.dig_fe = (uint8_t) pipe_ctx->stream_res.stream_enc->stream_enc_inst;
-               config.dig_be = pipe_ctx->stream->link->link_enc_hw_inst;
-#if defined(CONFIG_DRM_AMD_DC_DCN)
-               config.stream_enc_idx = pipe_ctx->stream_res.stream_enc->id - ENGINE_ID_DIGA;
-
-               if (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_PHY ||
-                               pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) {
-                       if (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_PHY)
-                               link_enc = pipe_ctx->stream->link->link_enc;
-                       else if (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA)
-                               if (pipe_ctx->stream->link->dc->res_pool->funcs->link_encs_assign) {
-                                       link_enc = link_enc_cfg_get_link_enc_used_by_stream(
-                                                       pipe_ctx->stream->ctx->dc,
-                                                       pipe_ctx->stream);
-                       }
-                       ASSERT(link_enc);
+       if (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_PHY)
+               link_enc = pipe_ctx->stream->link->link_enc;
+       else if (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA &&
+                       pipe_ctx->stream->link->dc->res_pool->funcs->link_encs_assign)
+               link_enc = link_enc_cfg_get_link_enc_used_by_stream(
+                               pipe_ctx->stream->ctx->dc,
+                               pipe_ctx->stream);
+       ASSERT(link_enc);
+       if (link_enc == NULL)
+               return;
 
-                       // Initialize PHY ID with ABCDE - 01234 mapping except when it is B0
-                       config.phy_idx = link_enc->transmitter - TRANSMITTER_UNIPHY_A;
+       /* otg instance */
+       config.otg_inst = (uint8_t) pipe_ctx->stream_res.tg->inst;
 
-                       // Add flag to guard new A0 DIG mapping
-                       if (pipe_ctx->stream->ctx->dc->enable_c20_dtm_b0 == true &&
-                                       pipe_ctx->stream->link->dc->ctx->dce_version == DCN_VERSION_3_1) {
-                               config.dig_be = link_enc->preferred_engine;
-                               config.dio_output_type = pipe_ctx->stream->link->ep_type;
-                               config.dio_output_idx = link_enc->transmitter - TRANSMITTER_UNIPHY_A;
-                       } else {
-                               config.dio_output_type = 0;
-                               config.dio_output_idx = 0;
-                       }
+       /* dig front end */
+       config.dig_fe = (uint8_t) pipe_ctx->stream_res.stream_enc->stream_enc_inst;
 
-                       // Add flag to guard B0 implementation
-                       if (pipe_ctx->stream->ctx->dc->enable_c20_dtm_b0 == true &&
-                                       link_enc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0) {
-                               if (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) {
-                                       // enum ID 1-4 maps to DPIA PHY ID 0-3
-                                       config.phy_idx = pipe_ctx->stream->link->link_id.enum_id - ENUM_ID_1;
-                               } else {  // for non DPIA mode over B0, ABCDE maps to 01564
-
-                                       switch (link_enc->transmitter) {
-                                       case TRANSMITTER_UNIPHY_A:
-                                               config.phy_idx = 0;
-                                               break;
-                                       case TRANSMITTER_UNIPHY_B:
-                                               config.phy_idx = 1;
-                                               break;
-                                       case TRANSMITTER_UNIPHY_C:
-                                               config.phy_idx = 5;
-                                               break;
-                                       case TRANSMITTER_UNIPHY_D:
-                                               config.phy_idx = 6;
-                                               break;
-                                       case TRANSMITTER_UNIPHY_E:
-                                               config.phy_idx = 4;
-                                               break;
-                                       default:
-                                               config.phy_idx = 0;
-                                               break;
-                                       }
+       /* stream encoder index */
+       config.stream_enc_idx = pipe_ctx->stream_res.stream_enc->id - ENGINE_ID_DIGA;
+#if defined(CONFIG_DRM_AMD_DC_DCN)
+       if (is_dp_128b_132b_signal(pipe_ctx))
+               config.stream_enc_idx =
+                               pipe_ctx->stream_res.hpo_dp_stream_enc->id - ENGINE_ID_HPO_DP_0;
+#endif
 
-                               }
-                       }
-               } else if (pipe_ctx->stream->link->dc->res_pool->funcs->link_encs_assign) {
-                       link_enc = link_enc_cfg_get_link_enc_used_by_stream(
-                                       pipe_ctx->stream->ctx->dc,
-                                       pipe_ctx->stream);
-                       config.phy_idx = 0; /* Clear phy_idx for non-physical display endpoints. */
-               }
-               ASSERT(link_enc);
-               if (link_enc)
-                       config.link_enc_idx = link_enc->transmitter - TRANSMITTER_UNIPHY_A;
-               if (is_dp_128b_132b_signal(pipe_ctx)) {
-                       config.stream_enc_idx = pipe_ctx->stream_res.hpo_dp_stream_enc->id - ENGINE_ID_HPO_DP_0;
+       /* dig back end */
+       config.dig_be = pipe_ctx->stream->link->link_enc_hw_inst;
 
-                       config.link_enc_idx = pipe_ctx->link_res.hpo_dp_link_enc->inst;
-                       config.dp2_enabled = 1;
-               }
+       /* link encoder index */
+       config.link_enc_idx = link_enc->transmitter - TRANSMITTER_UNIPHY_A;
+#if defined(CONFIG_DRM_AMD_DC_DCN)
+       if (is_dp_128b_132b_signal(pipe_ctx))
+               config.link_enc_idx = pipe_ctx->link_res.hpo_dp_link_enc->inst;
 #endif
-               config.dpms_off = dpms_off;
-               config.dm_stream_ctx = pipe_ctx->stream->dm_stream_context;
-               config.assr_enabled = (panel_mode == DP_PANEL_MODE_EDP);
-               config.mst_enabled = (pipe_ctx->stream->signal ==
-                               SIGNAL_TYPE_DISPLAY_PORT_MST);
-               cp_psp->funcs.update_stream_config(cp_psp->handle, &config);
-       }
+       /* dio output index */
+       config.dio_output_idx = link_enc->transmitter - TRANSMITTER_UNIPHY_A;
+
+       /* phy index */
+       config.phy_idx = resource_transmitter_to_phy_idx(
+                       pipe_ctx->stream->link->dc, link_enc->transmitter);
+       if (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA)
+               /* USB4 DPIA doesn't use PHY in our soc, initialize it to 0 */
+               config.phy_idx = 0;
+
+       /* stream properties */
+       config.assr_enabled = (panel_mode == DP_PANEL_MODE_EDP) ? 1 : 0;
+       config.mst_enabled = (pipe_ctx->stream->signal ==
+                       SIGNAL_TYPE_DISPLAY_PORT_MST) ? 1 : 0;
+#if defined(CONFIG_DRM_AMD_DC_DCN)
+       config.dp2_enabled = is_dp_128b_132b_signal(pipe_ctx) ? 1 : 0;
+#endif
+       config.usb4_enabled = (pipe_ctx->stream->link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) ?
+                       1 : 0;
+       config.dpms_off = dpms_off;
+
+       /* dm stream context */
+       config.dm_stream_ctx = pipe_ctx->stream->dm_stream_context;
+
+       cp_psp->funcs.update_stream_config(cp_psp->handle, &config);
 }
 #endif
 
index eaeef72773f6947f6fd4f490406163c475a4c037..b3912ff9dc91135b5aceb37972876a44bba7a42e 100644 (file)
@@ -3270,3 +3270,36 @@ void check_syncd_pipes_for_disabled_master_pipe(struct dc *dc,
                                i, disabled_master_pipe_idx);
        }
 }
+
+uint8_t resource_transmitter_to_phy_idx(const struct dc *dc, enum transmitter transmitter)
+{
+       /* TODO - get transmitter to phy idx mapping from DMUB */
+       uint8_t phy_idx = transmitter - TRANSMITTER_UNIPHY_A;
+
+#if defined(CONFIG_DRM_AMD_DC_DCN)
+       if (dc->ctx->dce_version == DCN_VERSION_3_1 &&
+                       dc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0) {
+               switch (transmitter) {
+               case TRANSMITTER_UNIPHY_A:
+                       phy_idx = 0;
+                       break;
+               case TRANSMITTER_UNIPHY_B:
+                       phy_idx = 1;
+                       break;
+               case TRANSMITTER_UNIPHY_C:
+                       phy_idx = 5;
+                       break;
+               case TRANSMITTER_UNIPHY_D:
+                       phy_idx = 6;
+                       break;
+               case TRANSMITTER_UNIPHY_E:
+                       phy_idx = 4;
+                       break;
+               default:
+                       phy_idx = 0;
+                       break;
+               }
+       }
+#endif
+       return phy_idx;
+}
index 511f9e1159c73126d83331650467f08fdc10e2f2..4229369c57f4b4e8123697ac922ae76e8106ed33 100644 (file)
@@ -34,12 +34,12 @@ struct cp_psp_stream_config {
        uint8_t dig_fe;
        uint8_t link_enc_idx;
        uint8_t stream_enc_idx;
-       uint8_t phy_idx;
        uint8_t dio_output_idx;
-       uint8_t dio_output_type;
+       uint8_t phy_idx;
        uint8_t assr_enabled;
        uint8_t mst_enabled;
        uint8_t dp2_enabled;
+       uint8_t usb4_enabled;
        void *dm_stream_ctx;
        bool dpms_off;
 };
index ee4a5df428e36778171de2d2455337f56c6c5176..028180f58f71d8603975e71c4eb7eb93a4611ec8 100644 (file)
@@ -218,5 +218,6 @@ void reset_syncd_pipes_from_disabled_pipes(struct dc *dc,
 void check_syncd_pipes_for_disabled_master_pipe(struct dc *dc,
        struct dc_state *context,
        uint8_t disabled_master_pipe_idx);
+uint8_t resource_transmitter_to_phy_idx(const struct dc *dc, enum transmitter transmitter);
 
 #endif /* DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_RESOURCE_H_ */
index 6d648c889866d82aeecee96ed012c924eead4b29..f7420c3f56724352a6faa0e87e01550a68e0dd6b 100644 (file)
@@ -104,6 +104,7 @@ struct mod_hdcp_displayport {
        uint8_t rev;
        uint8_t assr_enabled;
        uint8_t mst_enabled;
+       uint8_t usb4_enabled;
 };
 
 struct mod_hdcp_hdmi {
@@ -249,7 +250,6 @@ struct mod_hdcp_link {
        uint8_t ddc_line;
        uint8_t link_enc_idx;
        uint8_t phy_idx;
-       uint8_t dio_output_type;
        uint8_t dio_output_id;
        uint8_t hdcp_supported_informational;
        union {