drm/amd/display: Update TX masks correctly
authorAlvin Lee <alvin.lee2@amd.com>
Wed, 22 Jan 2020 19:56:35 +0000 (14:56 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 25 Feb 2020 16:02:41 +0000 (11:02 -0500)
[Why]
Bugs occur when TX interrupt comes in when no USB-C on board.

[How]
Check PHY for USB-C before enabling TX interrupt in DMCU FW.

Signed-off-by: Alvin Lee <alvin.lee2@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c

index 30d953a..f0cebe7 100644 (file)
@@ -378,6 +378,11 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu)
        struct dce_dmcu *dmcu_dce = TO_DCE_DMCU(dmcu);
        const struct dc_config *config = &dmcu->ctx->dc->config;
        bool status = false;
+       struct dc_context *ctx = dmcu->ctx;
+       unsigned int i;
+       //  5 4 3 2 1 0
+       //  F E D C B A - bit 0 is A, bit 5 is F
+       unsigned int tx_interrupt_mask = 0;
 
        PERF_TRACE();
        /*  Definition of DC_DMCU_SCRATCH
@@ -387,6 +392,15 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu)
         */
        dmcu->dmcu_state = REG_READ(DC_DMCU_SCRATCH);
 
+       for (i = 0; i < ctx->dc->link_count; i++) {
+               if (ctx->dc->links[i]->link_enc->features.flags.bits.DP_IS_USB_C) {
+                       if (ctx->dc->links[i]->link_enc->transmitter >= TRANSMITTER_UNIPHY_A &&
+                                       ctx->dc->links[i]->link_enc->transmitter <= TRANSMITTER_UNIPHY_F) {
+                               tx_interrupt_mask |= 1 << ctx->dc->links[i]->link_enc->transmitter;
+                       }
+               }
+       }
+
        switch (dmcu->dmcu_state) {
        case DMCU_UNLOADED:
                status = false;
@@ -401,6 +415,8 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu)
                /* Set backlight ramping stepsize */
                REG_WRITE(MASTER_COMM_DATA_REG2, abm_gain_stepsize);
 
+               REG_WRITE(MASTER_COMM_DATA_REG3, tx_interrupt_mask);
+
                /* Set command to initialize microcontroller */
                REG_UPDATE(MASTER_COMM_CMD_REG, MASTER_COMM_CMD_REG_BYTE0,
                        MCP_INIT_DMCU);