Commit f1934de4 authored by Jack Chang's avatar Jack Chang Committed by Alex Deucher
Browse files

drm/amd/display: Extend PSRSU residency mode



1. To support multiple PSRSU residency measurement mode

Reviewed-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Acked-by: default avatarZaeem Mohamed <zaeem.mohamed@amd.com>
Signed-off-by: default avatarJack Chang <jack.chang@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 0db66572
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3074,7 +3074,7 @@ static int psr_read_residency(void *data, u64 *val)
	struct dc_link *link = connector->dc_link;
	u32 residency = 0;

	link->dc->link_srv->edp_get_psr_residency(link, &residency);
	link->dc->link_srv->edp_get_psr_residency(link, &residency, PSR_RESIDENCY_MODE_PHY);

	*val = (u64)residency;

+4 −1
Original line number Diff line number Diff line
@@ -445,10 +445,13 @@ static void dmub_psr_force_static(struct dmub_psr *dmub, uint8_t panel_inst)
/*
 * Get PSR residency from firmware.
 */
static void dmub_psr_get_residency(struct dmub_psr *dmub, uint32_t *residency, uint8_t panel_inst)
static void dmub_psr_get_residency(struct dmub_psr *dmub, uint32_t *residency,
	uint8_t panel_inst, enum psr_residency_mode mode)
{
	uint16_t param = (uint16_t)(panel_inst << 8);

	param |= mode;

	/* Send gpint command and wait for ack */
	dc_wake_and_execute_gpint(dmub->ctx, DMUB_GPINT__PSR_RESIDENCY, param, residency,
				  DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY);
+2 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#define _DMUB_PSR_H_

#include "dc_types.h"
#include "dmub_cmd.h"
struct dc_link;
struct dmub_psr_funcs;

@@ -46,7 +47,7 @@ struct dmub_psr_funcs {
	uint8_t panel_inst);
	void (*psr_force_static)(struct dmub_psr *dmub, uint8_t panel_inst);
	void (*psr_get_residency)(struct dmub_psr *dmub, uint32_t *residency,
	uint8_t panel_inst);
	uint8_t panel_inst,  enum psr_residency_mode mode);
	void (*psr_set_sink_vtotal_in_psr_active)(struct dmub_psr *dmub,
	uint16_t psr_vtotal_idle, uint16_t psr_vtotal_su);
	void (*psr_set_power_opt)(struct dmub_psr *dmub, unsigned int power_opt, uint8_t panel_inst);
+1 −1
Original line number Diff line number Diff line
@@ -272,7 +272,7 @@ struct link_service {
			uint16_t psr_vtotal_idle,
			uint16_t psr_vtotal_su);
	void (*edp_get_psr_residency)(
			const struct dc_link *link, uint32_t *residency);
			const struct dc_link *link, uint32_t *residency, enum psr_residency_mode mode);

	bool (*edp_get_replay_state)(
			const struct dc_link *link, uint64_t *state);
+2 −2
Original line number Diff line number Diff line
@@ -853,7 +853,7 @@ bool edp_setup_psr(struct dc_link *link,

}

void edp_get_psr_residency(const struct dc_link *link, uint32_t *residency)
void edp_get_psr_residency(const struct dc_link *link, uint32_t *residency, enum psr_residency_mode mode)
{
	struct dc  *dc = link->ctx->dc;
	struct dmub_psr *psr = dc->res_pool->psr;
@@ -864,7 +864,7 @@ void edp_get_psr_residency(const struct dc_link *link, uint32_t *residency)

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