]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 May 2021 06:37:19 +0000 (08:37 +0200)
[ Upstream commit 8039bc7130ef4206a58e4dc288621bc97eba08eb ]

[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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c

index 17e84f34ceba1d8c708670ffb3c63f9c4702f7df..e0b195cad9ce8c99b441668e429a4fabf729811e 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;
 }
 
 /**