Skip to content

Commit

Permalink
drm/amd/display: Exit idle optimizations before HDCP execution
Browse files Browse the repository at this point in the history
[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 <[email protected]>
Cc: Alex Deucher <[email protected]>
Reviewed-by: Charlene Liu <[email protected]>
Acked-by: Alex Hung <[email protected]>
Signed-off-by: Nicholas Kazlauskas <[email protected]>
Tested-by: Daniel Wheeler <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
  • Loading branch information
Nicholas Kazlauskas authored and alexdeucher committed Mar 20, 2024
1 parent bc55c34 commit f30a3be
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,14 @@ static uint8_t is_cp_desired_hdcp2(struct mod_hdcp *hdcp)
!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,
struct mod_hdcp_event_context *event_ctx,
union mod_hdcp_transition_input *input)
Expand Down Expand Up @@ -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));
event_ctx.event = event;

exit_idle_optimizations(hdcp);

/* execute and transition */
exec_status = execution(hdcp, &event_ctx, &hdcp->auth.trans_input);
trans_status = transition(
Expand Down
8 changes: 8 additions & 0 deletions drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,13 @@ struct mod_hdcp_ddc {
} funcs;
};

struct mod_hdcp_dm {
void *handle;
struct {
void (*exit_idle_optimizations)(void *handle);
} funcs;
};

struct mod_hdcp_psp {
void *handle;
void *funcs;
Expand Down Expand Up @@ -272,6 +279,7 @@ struct mod_hdcp_display_query {
struct mod_hdcp_config {
struct mod_hdcp_psp psp;
struct mod_hdcp_ddc ddc;
struct mod_hdcp_dm dm;
uint8_t index;
};

Expand Down

0 comments on commit f30a3be

Please sign in to comment.