int offdelay;
 
        if (acrtc_state) {
-               if (amdgpu_ip_version(adev, DCE_HWIP, 0) <
-                   IP_VERSION(3, 5, 0) ||
-                   acrtc_state->stream->link->psr_settings.psr_version <
-                   DC_PSR_VERSION_UNSUPPORTED ||
-                   !(adev->flags & AMD_IS_APU)) {
-                       timing = &acrtc_state->stream->timing;
-
-                       /* at least 2 frames */
+               timing = &acrtc_state->stream->timing;
+
+               /*
+                * Depending on when the HW latching event of double-buffered
+                * registers happen relative to the PSR SDP deadline, and how
+                * bad the Panel clock has drifted since the last ALPM off
+                * event, there can be up to 3 frames of delay between sending
+                * the PSR exit cmd to DMUB fw, and when the panel starts
+                * displaying live frames.
+                *
+                * We can set:
+                *
+                * 20/100 * offdelay_ms = 3_frames_ms
+                * => offdelay_ms = 5 * 3_frames_ms
+                *
+                * This ensures that `3_frames_ms` will only be experienced as a
+                * 20% delay on top how long the display has been static, and
+                * thus make the delay less perceivable.
+                */
+               if (acrtc_state->stream->link->psr_settings.psr_version <
+                   DC_PSR_VERSION_UNSUPPORTED) {
+                       offdelay = DIV64_U64_ROUND_UP((u64)5 * 3 * 10 *
+                                                     timing->v_total *
+                                                     timing->h_total,
+                                                     timing->pix_clk_100hz);
+                       config.offdelay_ms = offdelay ?: 30;
+               } else if (amdgpu_ip_version(adev, DCE_HWIP, 0) <
+                          IP_VERSION(3, 5, 0) ||
+                          !(adev->flags & AMD_IS_APU)) {
+                       /*
+                        * Older HW and DGPU have issues with instant off;
+                        * use a 2 frame offdelay.
+                        */
                        offdelay = DIV64_U64_ROUND_UP((u64)20 *
                                                      timing->v_total *
                                                      timing->h_total,