Commit 29e82a27 authored by Ovidiu Bunea's avatar Ovidiu Bunea Committed by Alex Deucher
Browse files

drm/amd/display: Add GPINT retries to ips_query_residency_info



[why & how]
GPINTs can timeout without returning any data. Since this path is
only for testing purposes, it should retry several times to ensure
data is collected.

Reviewed-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: default avatarOvidiu Bunea <Ovidiu.Bunea@amd.com>
Signed-off-by: default avatarTom Chung <chiahsuan.chung@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 6d8f7388
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@

#define CTX dc_dmub_srv->ctx
#define DC_LOGGER CTX->logger
#define GPINT_RETRY_NUM 20

static void dc_dmub_srv_construct(struct dc_dmub_srv *dc_srv, struct dc *dc,
				  struct dmub_srv *dmub)
@@ -1888,11 +1889,14 @@ void dc_dmub_srv_ips_query_residency_info(struct dc_dmub_srv *dc_dmub_srv, struc
	if (command_code == DMUB_GPINT__INVALID_COMMAND)
		return;

	// send gpint commands and wait for ack
	if (!dc_wake_and_execute_gpint(dc_dmub_srv->ctx, DMUB_GPINT__GET_IPS_RESIDENCY_PERCENT,
				      (uint16_t)(output->ips_mode),
				       &output->residency_percent, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
		output->residency_percent = 0;
	for (i = 0; i < GPINT_RETRY_NUM; i++) {
		// false could mean GPINT timeout, in which case we should retry
		if (dc_wake_and_execute_gpint(dc_dmub_srv->ctx, DMUB_GPINT__GET_IPS_RESIDENCY_PERCENT,
					      (uint16_t)(output->ips_mode), &output->residency_percent,
					      DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
			break;
		udelay(100);
	}

	if (!dc_wake_and_execute_gpint(dc_dmub_srv->ctx, DMUB_GPINT__GET_IPS_RESIDENCY_ENTRY_COUNTER,
				      (uint16_t)(output->ips_mode),