Commit f30a3bea authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher

drm/amd/display: Exit idle optimizations before HDCP execution

[WHY]
PSP can access DCN registers during command submission and we need
to ensure that DCN is not in PG before doing so.

[HOW]
Add a callback to DM to lock and notify DC for idle optimization exit.
It can't be DC directly because of a potential race condition with the
link protection thread and the rest of DM operation.

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarCharlene Liu <charlene.liu@amd.com>
Acked-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent bc55c344
...@@ -88,6 +88,14 @@ static uint8_t is_cp_desired_hdcp2(struct mod_hdcp *hdcp) ...@@ -88,6 +88,14 @@ static uint8_t is_cp_desired_hdcp2(struct mod_hdcp *hdcp)
!hdcp->connection.is_hdcp2_revoked; !hdcp->connection.is_hdcp2_revoked;
} }
static void exit_idle_optimizations(struct mod_hdcp *hdcp)
{
struct mod_hdcp_dm *dm = &hdcp->config.dm;
if (dm->funcs.exit_idle_optimizations)
dm->funcs.exit_idle_optimizations(dm->handle);
}
static enum mod_hdcp_status execution(struct mod_hdcp *hdcp, static enum mod_hdcp_status execution(struct mod_hdcp *hdcp,
struct mod_hdcp_event_context *event_ctx, struct mod_hdcp_event_context *event_ctx,
union mod_hdcp_transition_input *input) union mod_hdcp_transition_input *input)
...@@ -543,6 +551,8 @@ enum mod_hdcp_status mod_hdcp_process_event(struct mod_hdcp *hdcp, ...@@ -543,6 +551,8 @@ enum mod_hdcp_status mod_hdcp_process_event(struct mod_hdcp *hdcp,
memset(&event_ctx, 0, sizeof(struct mod_hdcp_event_context)); memset(&event_ctx, 0, sizeof(struct mod_hdcp_event_context));
event_ctx.event = event; event_ctx.event = event;
exit_idle_optimizations(hdcp);
/* execute and transition */ /* execute and transition */
exec_status = execution(hdcp, &event_ctx, &hdcp->auth.trans_input); exec_status = execution(hdcp, &event_ctx, &hdcp->auth.trans_input);
trans_status = transition( trans_status = transition(
......
...@@ -156,6 +156,13 @@ struct mod_hdcp_ddc { ...@@ -156,6 +156,13 @@ struct mod_hdcp_ddc {
} funcs; } funcs;
}; };
struct mod_hdcp_dm {
void *handle;
struct {
void (*exit_idle_optimizations)(void *handle);
} funcs;
};
struct mod_hdcp_psp { struct mod_hdcp_psp {
void *handle; void *handle;
void *funcs; void *funcs;
...@@ -272,6 +279,7 @@ struct mod_hdcp_display_query { ...@@ -272,6 +279,7 @@ struct mod_hdcp_display_query {
struct mod_hdcp_config { struct mod_hdcp_config {
struct mod_hdcp_psp psp; struct mod_hdcp_psp psp;
struct mod_hdcp_ddc ddc; struct mod_hdcp_ddc ddc;
struct mod_hdcp_dm dm;
uint8_t index; uint8_t index;
}; };
......
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