mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 01:20:01 -04:00
drm/amd/display: Expand supported Replay residency mode
[Why] Dmub provides several Replay residency calculation methods, but current interface only supports either ALPM or PHY mode [How] Modify the interface for supporting different types of Replay residency calculation. Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> Signed-off-by: Leon Huang <Leon.Huang1@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -239,23 +239,39 @@ static void dmub_replay_set_coasting_vtotal(struct dmub_replay *dmub,
|
||||
* Get Replay residency from firmware.
|
||||
*/
|
||||
static void dmub_replay_residency(struct dmub_replay *dmub, uint8_t panel_inst,
|
||||
uint32_t *residency, const bool is_start, const bool is_alpm)
|
||||
uint32_t *residency, const bool is_start, enum pr_residency_mode mode)
|
||||
{
|
||||
struct dmub_srv *srv = dmub->ctx->dmub_srv->dmub;
|
||||
uint16_t param = (uint16_t)(panel_inst << 8);
|
||||
|
||||
if (is_alpm)
|
||||
switch (mode) {
|
||||
case PR_RESIDENCY_MODE_PHY:
|
||||
param |= REPLAY_RESIDENCY_FIELD_MODE_PHY;
|
||||
break;
|
||||
case PR_RESIDENCY_MODE_ALPM:
|
||||
param |= REPLAY_RESIDENCY_FIELD_MODE_ALPM;
|
||||
break;
|
||||
case PR_RESIDENCY_MODE_IPS2:
|
||||
param |= REPLAY_RESIDENCY_REVISION_1;
|
||||
param |= REPLAY_RESIDENCY_FIELD_MODE2_IPS;
|
||||
break;
|
||||
case PR_RESIDENCY_MODE_FRAME_CNT:
|
||||
param |= REPLAY_RESIDENCY_REVISION_1;
|
||||
param |= REPLAY_RESIDENCY_FIELD_MODE2_FRAME_CNT;
|
||||
break;
|
||||
case PR_RESIDENCY_MODE_ENABLEMENT_PERIOD:
|
||||
param |= REPLAY_RESIDENCY_REVISION_1;
|
||||
param |= REPLAY_RESIDENCY_FIELD_MODE2_EN_PERIOD;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_start)
|
||||
param |= REPLAY_RESIDENCY_ENABLE;
|
||||
|
||||
// Send gpint command and wait for ack
|
||||
dmub_srv_send_gpint_command(srv, DMUB_GPINT__REPLAY_RESIDENCY, param, 30);
|
||||
|
||||
if (!is_start)
|
||||
dmub_srv_get_gpint_response(srv, residency);
|
||||
else
|
||||
if (!dc_wake_and_execute_gpint(dmub->ctx, DMUB_GPINT__REPLAY_RESIDENCY, param,
|
||||
residency, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
|
||||
*residency = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ struct dmub_replay_funcs {
|
||||
void (*replay_set_coasting_vtotal)(struct dmub_replay *dmub, uint32_t coasting_vtotal,
|
||||
uint8_t panel_inst);
|
||||
void (*replay_residency)(struct dmub_replay *dmub,
|
||||
uint8_t panel_inst, uint32_t *residency, const bool is_start, const bool is_alpm);
|
||||
uint8_t panel_inst, uint32_t *residency, const bool is_start, const enum pr_residency_mode mode);
|
||||
void (*replay_set_power_opt_and_coasting_vtotal)(struct dmub_replay *dmub,
|
||||
unsigned int power_opt, uint8_t panel_inst, uint32_t coasting_vtotal);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user