drm/amd/display: Retry getting PSR state if command times out

[Why]
GPINT command to get PSR state from FW times out.

[How]
Add retry to get valid PSR state.

Signed-off-by: Wyatt Wood <wyatt.wood@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Wyatt Wood 2021-03-19 13:44:55 -04:00 committed by Alex Deucher
parent 719a9b3323
commit 04f3c88f09
2 changed files with 19 additions and 11 deletions

View File

@ -687,7 +687,8 @@ enum dc_psr_state {
PSR_STATE5,
PSR_STATE5a,
PSR_STATE5b,
PSR_STATE5c
PSR_STATE5c,
PSR_STATE_INVALID = 0xFF
};
struct psr_config {

View File

@ -80,19 +80,26 @@ static enum dc_psr_state convert_psr_state(uint32_t raw_state)
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;
uint32_t raw_state = 0;
uint32_t retry_count = 0;
enum dmub_status status;
// Send gpint command and wait for ack
status = dmub_srv_send_gpint_command(srv, DMUB_GPINT__GET_PSR_STATE, 0, 30);
do {
// Send gpint command and wait for ack
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;
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 = PSR_STATE_INVALID;
// Assert if max retry hit
if (retry_count >= 1000)
ASSERT(0);
} while (++retry_count <= 1000 && *state == PSR_STATE_INVALID);
}
/*