]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/amd/display: Wait before sending idle allow and after idle disallow
authorNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Mon, 15 Jan 2024 22:24:26 +0000 (17:24 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 29 Jan 2024 20:41:29 +0000 (15:41 -0500)
[Why]
We want acknowledgment of the driver idle disallow from DMCUB before
continuing with any further programming.

For idle allow we want to minimize the chance of DMCUB actively
interacing with other firmware components on the system (eg. PMFW)
at the same time.

[How]
Ensure that DMCUB isn't in the middle of processing other command
submissions prior to allowing idle and after disallowing idle by
inserting a wait before the allow and by changing the wait type for
the idle disallow.

Reviewed-by: Charlene Liu <charlene.liu@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c

index 2b79a0e5638e1b757ea3d3527add517db139552e..c365cca0571835c97ee91b9739c3ba4732de9631 100644 (file)
@@ -1195,6 +1195,9 @@ static void dc_dmub_srv_notify_idle(const struct dc *dc, bool allow_idle)
        if (dc->debug.dmcub_emulation)
                return;
 
+       if (!dc->ctx->dmub_srv || !dc->ctx->dmub_srv->dmub)
+               return;
+
        memset(&cmd, 0, sizeof(cmd));
        cmd.idle_opt_notify_idle.header.type = DMUB_CMD__IDLE_OPT;
        cmd.idle_opt_notify_idle.header.sub_type = DMUB_CMD__IDLE_OPT_DCN_NOTIFY_IDLE;
@@ -1205,13 +1208,15 @@ static void dc_dmub_srv_notify_idle(const struct dc *dc, bool allow_idle)
        cmd.idle_opt_notify_idle.cntl_data.driver_idle = allow_idle;
 
        if (allow_idle) {
+               dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+
                if (dc->hwss.set_idle_state)
                        dc->hwss.set_idle_state(dc, true);
        }
 
        /* NOTE: This does not use the "wake" interface since this is part of the wake path. */
        /* We also do not perform a wait since DMCUB could enter idle after the notification. */
-       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, allow_idle ? DM_DMUB_WAIT_TYPE_NO_WAIT : DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static void dc_dmub_srv_exit_low_power_state(const struct dc *dc)