]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/amd/display: Return invalid state if GPINT times out
authorWyatt Wood <wyatt.wood@amd.com>
Fri, 19 Feb 2021 17:21:47 +0000 (12:21 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 2 Mar 2021 19:06:55 +0000 (14:06 -0500)
[Why]
GPINT timeout is causing PSR_STATE_0 to be returned when it shouldn't.
We must guarantee that PSR is fully disabled before doing hw programming
on driver-side.

[How]
Return invalid state if GPINT command times out. Let existing retry
logic send the GPINT until successful.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Wyatt Wood <wyatt.wood@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c

index 62c019fd326e174f79d3674330bfdc563bfe6c85..03741e170b61f9e2c6d5d2fc6610566e6ec84678 100644 (file)
@@ -81,13 +81,18 @@ static void dmub_psr_get_state(struct dmub_psr *dmub, enum dc_psr_state *state)
 {
        struct dmub_srv *srv = dmub->ctx->dmub_srv->dmub;
        uint32_t raw_state;
+       enum dmub_status status = DMUB_STATUS_INVALID;
 
        // Send gpint command and wait for ack
-       dmub_srv_send_gpint_command(srv, DMUB_GPINT__GET_PSR_STATE, 0, 30);
-
-       dmub_srv_get_gpint_response(srv, &raw_state);
-
-       *state = convert_psr_state(raw_state);
+       status = dmub_srv_send_gpint_command(srv, DMUB_GPINT__GET_PSR_STATE, 0, 30);
+
+       if (status == DMUB_STATUS_OK) {
+               // GPINT was executed, get response
+               dmub_srv_get_gpint_response(srv, &raw_state);
+               *state = convert_psr_state(raw_state);
+       } else
+               // Return invalid state when GPINT times out
+               *state = 0xFF;
 }
 
 /*