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

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
...@@ -3074,7 +3074,7 @@ static int psr_read_residency(void *data, u64 *val) ...@@ -3074,7 +3074,7 @@ static int psr_read_residency(void *data, u64 *val)
struct dc_link *link = connector->dc_link; struct dc_link *link = connector->dc_link;
u32 residency = 0; 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; *val = (u64)residency;
......
...@@ -445,10 +445,13 @@ static void dmub_psr_force_static(struct dmub_psr *dmub, uint8_t panel_inst) ...@@ -445,10 +445,13 @@ static void dmub_psr_force_static(struct dmub_psr *dmub, uint8_t panel_inst)
/* /*
* Get PSR residency from firmware. * 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); uint16_t param = (uint16_t)(panel_inst << 8);
param |= mode;
/* Send gpint command and wait for ack */ /* Send gpint command and wait for ack */
dc_wake_and_execute_gpint(dmub->ctx, DMUB_GPINT__PSR_RESIDENCY, param, residency, dc_wake_and_execute_gpint(dmub->ctx, DMUB_GPINT__PSR_RESIDENCY, param, residency,
DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY); DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY);
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define _DMUB_PSR_H_ #define _DMUB_PSR_H_
#include "dc_types.h" #include "dc_types.h"
#include "dmub_cmd.h"
struct dc_link; struct dc_link;
struct dmub_psr_funcs; struct dmub_psr_funcs;
...@@ -46,7 +47,7 @@ struct dmub_psr_funcs { ...@@ -46,7 +47,7 @@ struct dmub_psr_funcs {
uint8_t panel_inst); uint8_t panel_inst);
void (*psr_force_static)(struct dmub_psr *dmub, 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, 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, void (*psr_set_sink_vtotal_in_psr_active)(struct dmub_psr *dmub,
uint16_t psr_vtotal_idle, uint16_t psr_vtotal_su); 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); void (*psr_set_power_opt)(struct dmub_psr *dmub, unsigned int power_opt, uint8_t panel_inst);
......
...@@ -272,7 +272,7 @@ struct link_service { ...@@ -272,7 +272,7 @@ struct link_service {
uint16_t psr_vtotal_idle, uint16_t psr_vtotal_idle,
uint16_t psr_vtotal_su); uint16_t psr_vtotal_su);
void (*edp_get_psr_residency)( 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)( bool (*edp_get_replay_state)(
const struct dc_link *link, uint64_t *state); const struct dc_link *link, uint64_t *state);
......
...@@ -853,7 +853,7 @@ bool edp_setup_psr(struct dc_link *link, ...@@ -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 dc *dc = link->ctx->dc;
struct dmub_psr *psr = dc->res_pool->psr; 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) ...@@ -864,7 +864,7 @@ void edp_get_psr_residency(const struct dc_link *link, uint32_t *residency)
// PSR residency measurements only supported on DMCUB // PSR residency measurements only supported on DMCUB
if (psr != NULL && link->psr_settings.psr_feature_enabled) 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 else
*residency = 0; *residency = 0;
} }
......
...@@ -51,7 +51,7 @@ bool edp_setup_psr(struct dc_link *link, ...@@ -51,7 +51,7 @@ bool edp_setup_psr(struct dc_link *link,
struct psr_context *psr_context); struct psr_context *psr_context);
bool edp_set_sink_vtotal_in_psr_active(const struct dc_link *link, bool edp_set_sink_vtotal_in_psr_active(const struct dc_link *link,
uint16_t psr_vtotal_idle, uint16_t psr_vtotal_su); uint16_t psr_vtotal_idle, uint16_t psr_vtotal_su);
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);
bool edp_set_replay_allow_active(struct dc_link *dc_link, const bool *enable, bool edp_set_replay_allow_active(struct dc_link *dc_link, const bool *enable,
bool wait, bool force_static, const unsigned int *power_opts); bool wait, bool force_static, const unsigned int *power_opts);
bool edp_setup_replay(struct dc_link *link, bool edp_setup_replay(struct dc_link *link,
......
...@@ -3249,6 +3249,18 @@ struct dmub_rb_cmd_psr_set_power_opt { ...@@ -3249,6 +3249,18 @@ struct dmub_rb_cmd_psr_set_power_opt {
struct dmub_cmd_psr_set_power_opt_data psr_set_power_opt_data; struct dmub_cmd_psr_set_power_opt_data psr_set_power_opt_data;
}; };
/**
* Different PSR residency modes.
* Different modes change the definition of PSR residency.
*/
enum psr_residency_mode {
PSR_RESIDENCY_MODE_PHY = 0,
PSR_RESIDENCY_MODE_ALPM,
PSR_RESIDENCY_MODE_ENABLEMENT_PERIOD,
/* Do not add below. */
PSR_RESIDENCY_MODE_LAST_ELEMENT,
};
/** /**
* Definition of Replay Residency GPINT command. * Definition of Replay Residency GPINT command.
* Bit[0] - Residency mode for Revision 0 * Bit[0] - Residency mode for Revision 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment