Apparently the DAC encoder needs to be set up before use.
The BIOS parser in DC did not support this so I assumed it was
not necessary, but the DAC doesn't work without it on some GPUs.

Fixes: 6c51114c17d6 ("drm/amd/display: Hook up DAC to 
bios_parser_encoder_control")
Signed-off-by: Timur Kristóf <[email protected]>
---
 .../gpu/drm/amd/display/dc/bios/bios_parser.c |  4 ++--
 .../drm/amd/display/dc/bios/command_table.c   | 19 +++++++++++--------
 .../drm/amd/display/dc/bios/command_table.h   |  4 ++--
 3 files changed, 15 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 4120d6c4c5e4..7c49a4d59cd9 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
@@ -763,14 +763,14 @@ static enum bp_result bios_parser_encoder_control(
                        return BP_RESULT_FAILURE;
 
                return bp->cmd_tbl.dac1_encoder_control(
-                       bp, cntl->action == ENCODER_CONTROL_ENABLE,
+                       bp, cntl->action,
                        cntl->pixel_clock, ATOM_DAC1_PS2);
        } else if (cntl->engine_id == ENGINE_ID_DACB) {
                if (!bp->cmd_tbl.dac2_encoder_control)
                        return BP_RESULT_FAILURE;
 
                return bp->cmd_tbl.dac2_encoder_control(
-                       bp, cntl->action == ENCODER_CONTROL_ENABLE,
+                       bp, cntl->action,
                        cntl->pixel_clock, ATOM_DAC1_PS2);
        }
 
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 d56c0d3763dd..76a3559f0ddc 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/command_table.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/command_table.c
@@ -1838,12 +1838,12 @@ static enum bp_result select_crtc_source_v3(
 
 static enum bp_result dac1_encoder_control_v1(
        struct bios_parser *bp,
-       bool enable,
+       enum bp_encoder_control_action action,
        uint32_t pixel_clock,
        uint8_t dac_standard);
 static enum bp_result dac2_encoder_control_v1(
        struct bios_parser *bp,
-       bool enable,
+       enum bp_encoder_control_action action,
        uint32_t pixel_clock,
        uint8_t dac_standard);
 
@@ -1869,12 +1869,15 @@ static void init_dac_encoder_control(struct bios_parser 
*bp)
 
 static void dac_encoder_control_prepare_params(
        DAC_ENCODER_CONTROL_PS_ALLOCATION *params,
-       bool enable,
+       enum bp_encoder_control_action action,
        uint32_t pixel_clock,
        uint8_t dac_standard)
 {
        params->ucDacStandard = dac_standard;
-       if (enable)
+       if (action == ENCODER_CONTROL_SETUP ||
+           action == ENCODER_CONTROL_INIT)
+               params->ucAction = ATOM_ENCODER_INIT;
+       else if (action == ENCODER_CONTROL_ENABLE)
                params->ucAction = ATOM_ENABLE;
        else
                params->ucAction = ATOM_DISABLE;
@@ -1887,7 +1890,7 @@ static void dac_encoder_control_prepare_params(
 
 static enum bp_result dac1_encoder_control_v1(
        struct bios_parser *bp,
-       bool enable,
+       enum bp_encoder_control_action action,
        uint32_t pixel_clock,
        uint8_t dac_standard)
 {
@@ -1896,7 +1899,7 @@ static enum bp_result dac1_encoder_control_v1(
 
        dac_encoder_control_prepare_params(
                &params,
-               enable,
+               action,
                pixel_clock,
                dac_standard);
 
@@ -1908,7 +1911,7 @@ static enum bp_result dac1_encoder_control_v1(
 
 static enum bp_result dac2_encoder_control_v1(
        struct bios_parser *bp,
-       bool enable,
+       enum bp_encoder_control_action action,
        uint32_t pixel_clock,
        uint8_t dac_standard)
 {
@@ -1917,7 +1920,7 @@ static enum bp_result dac2_encoder_control_v1(
 
        dac_encoder_control_prepare_params(
                &params,
-               enable,
+               action,
                pixel_clock,
                dac_standard);
 
diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table.h 
b/drivers/gpu/drm/amd/display/dc/bios/command_table.h
index e89b1ba0048b..78bdbcaa61c8 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/command_table.h
+++ b/drivers/gpu/drm/amd/display/dc/bios/command_table.h
@@ -57,12 +57,12 @@ struct cmd_tbl {
                struct bp_crtc_source_select *bp_params);
        enum bp_result (*dac1_encoder_control)(
                struct bios_parser *bp,
-               bool enable,
+               enum bp_encoder_control_action action,
                uint32_t pixel_clock,
                uint8_t dac_standard);
        enum bp_result (*dac2_encoder_control)(
                struct bios_parser *bp,
-               bool enable,
+               enum bp_encoder_control_action action,
                uint32_t pixel_clock,
                uint8_t dac_standard);
        enum bp_result (*dac1_output_control)(
-- 
2.52.0

Reply via email to