Commit b8e0b3d6 authored by Wyatt Wood's avatar Wyatt Wood Committed by Alex Deucher
Browse files

drm/amd/display: Hook up PSR residency command to DSAT



[Why]
Use GPINT command to get PSR residency from FW.

[How]
Hook up PSR residency command to DSAT.
Since PSR Count Request is deprecated, we will use this.

Signed-off-by: default avatarWyatt Wood <wyatt.wood@amd.com>
Acked-by: default avatarBindu Ramamurthy <bindu.r@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 58cae8ac
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -2783,6 +2783,18 @@ bool dc_link_setup_psr(struct dc_link *link,

}

void dc_link_get_psr_residency(const struct dc_link *link, uint32_t *residency)
{
	struct dc  *dc = link->ctx->dc;
	struct dmub_psr *psr = dc->res_pool->psr;

	// PSR residency measurements only supported on DMCUB
	if (psr != NULL && link->psr_settings.psr_feature_enabled)
		psr->funcs->psr_get_residency(psr, residency);
	else
		*residency = 0;
}

const struct dc_link_status *dc_link_get_status(const struct dc_link *link)
{
	return &link->link_status;
+2 −0
Original line number Diff line number Diff line
@@ -228,6 +228,8 @@ bool dc_link_setup_psr(struct dc_link *dc_link,
		const struct dc_stream_state *stream, struct psr_config *psr_config,
		struct psr_context *psr_context);

void dc_link_get_psr_residency(const struct dc_link *link, uint32_t *residency);

/* Request DC to detect if there is a Panel connected.
 * boot - If this call is during initial boot.
 * Return false for any type of detection failure or MST detection
+14 −0
Original line number Diff line number Diff line
@@ -293,12 +293,26 @@ static void dmub_psr_force_static(struct dmub_psr *dmub)
	dc_dmub_srv_wait_idle(dc->dmub_srv);
}

/**
 * Get PSR residency from firmware.
 */
static void dmub_psr_get_residency(struct dmub_psr *dmub, uint32_t *residency)
{
	struct dmub_srv *srv = dmub->ctx->dmub_srv->dmub;

	// Send gpint command and wait for ack
	dmub_srv_send_gpint_command(srv, DMUB_GPINT__PSR_RESIDENCY, 0, 30);

	dmub_srv_get_gpint_response(srv, residency);
}

static const struct dmub_psr_funcs psr_funcs = {
	.psr_copy_settings		= dmub_psr_copy_settings,
	.psr_enable			= dmub_psr_enable,
	.psr_get_state			= dmub_psr_get_state,
	.psr_set_level			= dmub_psr_set_level,
	.psr_force_static		= dmub_psr_force_static,
	.psr_get_residency		= dmub_psr_get_residency,
};

/**
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ struct dmub_psr_funcs {
	void (*psr_get_state)(struct dmub_psr *dmub, enum dc_psr_state *dc_psr_state);
	void (*psr_set_level)(struct dmub_psr *dmub, uint16_t psr_level);
	void (*psr_force_static)(struct dmub_psr *dmub);
	void (*psr_get_residency)(struct dmub_psr *dmub, uint32_t *residency);
};

struct dmub_psr *dmub_psr_create(struct dc_context *ctx);