mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-01 01:14:19 -04:00
drm/amd/display: Add new Replay command and Disabled Replay Timing Resync
[why] To support dynamic switching for Replay timing sync mechanism. Reviewed-by: ChunTao Tso <chuntao.tso@amd.com> Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com> Signed-off-by: Dennis Chan <dennis.chan@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
223aad1be3
commit
cee6de1224
@@ -1022,6 +1022,16 @@ enum replay_coasting_vtotal_type {
|
||||
PR_COASTING_TYPE_NUM,
|
||||
};
|
||||
|
||||
/*
|
||||
* This is general Interface for Replay to
|
||||
* set an 32 bit variable to dmub
|
||||
* The Message_type indicates which variable
|
||||
* passed to DMUB.
|
||||
*/
|
||||
enum replay_FW_Message_type {
|
||||
Replay_Set_Timing_Sync_Supported,
|
||||
};
|
||||
|
||||
union replay_error_status {
|
||||
struct {
|
||||
unsigned char STATE_TRANSITION_ERROR :1;
|
||||
|
||||
@@ -45,6 +45,9 @@ struct dmub_replay_funcs {
|
||||
struct replay_context *replay_context, uint8_t panel_inst);
|
||||
void (*replay_set_power_opt)(struct dmub_replay *dmub, unsigned int power_opt,
|
||||
uint8_t panel_inst);
|
||||
void (*replay_send_cmd)(struct dmub_replay *dmub,
|
||||
enum replay_FW_Message_type msg, unsigned int panel_inst,
|
||||
uint32_t cmd_data);
|
||||
void (*replay_set_coasting_vtotal)(struct dmub_replay *dmub, uint16_t coasting_vtotal,
|
||||
uint8_t panel_inst);
|
||||
void (*replay_residency)(struct dmub_replay *dmub,
|
||||
|
||||
@@ -281,6 +281,9 @@ struct link_service {
|
||||
const unsigned int *power_opts);
|
||||
bool (*edp_setup_replay)(struct dc_link *link,
|
||||
const struct dc_stream_state *stream);
|
||||
bool (*edp_send_replay_cmd)(struct dc_link *link,
|
||||
enum replay_FW_Message_type msg,
|
||||
uint32_t params);
|
||||
bool (*edp_set_coasting_vtotal)(
|
||||
struct dc_link *link, uint16_t coasting_vtotal);
|
||||
bool (*edp_replay_residency)(const struct dc_link *link,
|
||||
|
||||
@@ -213,6 +213,7 @@ static void construct_link_service_edp_panel_control(struct link_service *link_s
|
||||
link_srv->edp_get_replay_state = edp_get_replay_state;
|
||||
link_srv->edp_set_replay_allow_active = edp_set_replay_allow_active;
|
||||
link_srv->edp_setup_replay = edp_setup_replay;
|
||||
link_srv->edp_send_replay_cmd = edp_send_replay_cmd;
|
||||
link_srv->edp_set_coasting_vtotal = edp_set_coasting_vtotal;
|
||||
link_srv->edp_replay_residency = edp_replay_residency;
|
||||
|
||||
|
||||
@@ -1007,6 +1007,30 @@ bool edp_setup_replay(struct dc_link *link, const struct dc_stream_state *stream
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is general Interface for Replay to set an 32 bit variable to dmub
|
||||
* replay_FW_Message_type: Indicates which instruction or variable pass to DMUB
|
||||
* cmd_data: Value of the config.
|
||||
*/
|
||||
bool edp_send_replay_cmd(struct dc_link *link,
|
||||
enum replay_FW_Message_type msg,
|
||||
uint32_t cmd_data)
|
||||
{
|
||||
struct dc *dc = link->ctx->dc;
|
||||
struct dmub_replay *replay = dc->res_pool->replay;
|
||||
unsigned int panel_inst;
|
||||
|
||||
if (!replay)
|
||||
return false;
|
||||
|
||||
if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst))
|
||||
return false;
|
||||
|
||||
replay->funcs->replay_send_cmd(replay, msg, cmd_data, panel_inst);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool edp_set_coasting_vtotal(struct dc_link *link, uint16_t coasting_vtotal)
|
||||
{
|
||||
struct dc *dc = link->ctx->dc;
|
||||
|
||||
@@ -57,6 +57,9 @@ 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 edp_setup_replay(struct dc_link *link,
|
||||
const struct dc_stream_state *stream);
|
||||
bool edp_send_replay_cmd(struct dc_link *link,
|
||||
enum replay_FW_Message_type msg,
|
||||
uint32_t params);
|
||||
bool edp_set_coasting_vtotal(struct dc_link *link, uint16_t coasting_vtotal);
|
||||
bool edp_replay_residency(const struct dc_link *link,
|
||||
unsigned int *residency, const bool is_start, const bool is_alpm);
|
||||
|
||||
Reference in New Issue
Block a user