The VBIOS has a function called ExternalEncoderControl which
controls the DP bridge encoders that some GPUs use for analog
and LVDS output. Fixup this old functionality.

For reference, see the legacy non-DC amdgpu display code:
amdgpu_atombios_encoder_setup_external_encoder()

- Set same parameters for the ENABLE action as the SETUP action
- Add missing enum values for DDC setup and DAC load detection
- Fix the bits per color field
- Clarify the code that sets the link rate
- Expose the function so that it can be called by rest of DC

A subsequent commit will call this function from DCE HWSS.

Signed-off-by: Timur Kristóf <[email protected]>
---
 .../gpu/drm/amd/display/dc/bios/bios_parser.c | 14 +++++++++++
 .../drm/amd/display/dc/bios/command_table.c   | 23 +++++++++----------
 .../gpu/drm/amd/display/dc/dc_bios_types.h    |  3 +++
 .../amd/display/include/bios_parser_types.h   |  2 ++
 4 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c 
b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
index e2b74dda00fc..82877f7b3b6f 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
@@ -780,6 +780,18 @@ static enum bp_result bios_parser_encoder_control(
        return bp->cmd_tbl.dig_encoder_control(bp, cntl);
 }
 
+static enum bp_result bios_parser_external_encoder_control(
+       struct dc_bios *dcb,
+       struct bp_external_encoder_control *cntl)
+{
+       struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+       if (!bp->cmd_tbl.external_encoder_control)
+               return BP_RESULT_UNSUPPORTED;
+
+       return bp->cmd_tbl.external_encoder_control(bp, cntl);
+}
+
 static enum bp_result bios_parser_dac_load_detection(
        struct dc_bios *dcb,
        enum engine_id engine_id)
@@ -2909,6 +2921,8 @@ static const struct dc_vbios_funcs vbios_funcs = {
 
        .encoder_control = bios_parser_encoder_control,
 
+       .external_encoder_control = bios_parser_external_encoder_control,
+
        .dac_load_detection = bios_parser_dac_load_detection,
 
        .transmitter_control = bios_parser_transmitter_control,
diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table.c 
b/drivers/gpu/drm/amd/display/dc/bios/command_table.c
index b638cb5adb92..d2d59732d338 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/command_table.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/command_table.c
@@ -2521,6 +2521,7 @@ static enum bp_result external_encoder_control_v3(
                                
cpu_to_le16((uint16_t)cntl->connector_obj_id.id);
                break;
        case EXTERNAL_ENCODER_CONTROL_SETUP:
+       case EXTERNAL_ENCODER_CONTROL_ENABLE:
                /* EXTERNAL_ENCODER_CONTROL_PARAMETERS_V3 pixel clock unit in
                 * 10KHz
                 * output display device pixel clock frequency in unit of 10KHz.
@@ -2537,26 +2538,24 @@ static enum bp_result external_encoder_control_v3(
                if (is_input_signal_dp) {
                        /* Bit[0]: indicate link rate, =1: 2.7Ghz, =0: 1.62Ghz,
                         * only valid in encoder setup with DP mode. */
-                       if (LINK_RATE_HIGH == cntl->link_rate)
-                               cntl_params->ucConfig |= 1;
+                       if (cntl->link_rate == LINK_RATE_LOW)
+                               cntl_params->ucConfig |=
+                                       
EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_1_62GHZ;
+                       else if (cntl->link_rate == LINK_RATE_HIGH)
+                               cntl_params->ucConfig |=
+                                       
EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
+                       else
+                               dm_error("Link rate not supported by external 
encoder");
+
                        /* output color depth Indicate encoder data bpc format
                         * in DP mode, only valid in encoder setup in DP mode.
                         */
-                       cntl_params->ucBitPerColor =
-                                       (uint8_t)(cntl->color_depth);
+                       cntl_params->ucBitPerColor = 
dc_color_depth_to_atom(cntl->color_depth);
                }
                /* Indicate how many lanes used by external encoder, only valid
                 * in encoder setup and enableoutput. */
                cntl_params->ucLaneNum = (uint8_t)(cntl->lanes_number);
                break;
-       case EXTERNAL_ENCODER_CONTROL_ENABLE:
-               cntl_params->usPixelClock =
-                               cpu_to_le16((uint16_t)(cntl->pixel_clock / 10));
-               cntl_params->ucEncoderMode =
-                               
(uint8_t)bp->cmd_helper->encoder_mode_bp_to_atom(
-                                               cntl->signal, false);
-               cntl_params->ucLaneNum = (uint8_t)cntl->lanes_number;
-               break;
        default:
                break;
        }
diff --git a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h 
b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
index 06fdde281a0c..6f96c5cf39fe 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
@@ -97,6 +97,9 @@ struct dc_vbios_funcs {
        enum bp_result (*encoder_control)(
                struct dc_bios *bios,
                struct bp_encoder_control *cntl);
+       enum bp_result (*external_encoder_control)(
+               struct dc_bios *bios,
+               struct bp_external_encoder_control *cntl);
        enum bp_result (*dac_load_detection)(
                struct dc_bios *bios,
                enum engine_id engine_id);
diff --git a/drivers/gpu/drm/amd/display/include/bios_parser_types.h 
b/drivers/gpu/drm/amd/display/include/bios_parser_types.h
index f40dc612ec73..b5d97b394131 100644
--- a/drivers/gpu/drm/amd/display/include/bios_parser_types.h
+++ b/drivers/gpu/drm/amd/display/include/bios_parser_types.h
@@ -93,6 +93,8 @@ enum bp_external_encoder_control_action {
        EXTERNAL_ENCODER_CONTROL_SETUP = 0xf,
        EXTERNAL_ENCODER_CONTROL_UNBLANK = 0x10,
        EXTERNAL_ENCODER_CONTROL_BLANK = 0x11,
+       EXTERNAL_ENCODER_CONTROL_DAC_LOAD_DETECT = 0x12,
+       EXTERNAL_ENCODER_CONTROL_DDC_SETUP = 0x14,
 };
 
 enum bp_pipe_control_action {
-- 
2.52.0

Reply via email to