drm/amd/display: Move disable interrupt into commit tail
[Why&How] Since there is no need for accessing crtc state in the interrupt handler, interrupts need not be disabled well in advance, and can be moved to commit_tail where it should be. Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
585d450c76
commit
6d90a208cf
@ -7437,39 +7437,6 @@ static int amdgpu_dm_atomic_commit(struct drm_device *dev,
|
|||||||
struct drm_atomic_state *state,
|
struct drm_atomic_state *state,
|
||||||
bool nonblock)
|
bool nonblock)
|
||||||
{
|
{
|
||||||
struct drm_crtc *crtc;
|
|
||||||
struct drm_crtc_state *old_crtc_state, *new_crtc_state;
|
|
||||||
struct dm_crtc_state *dm_old_crtc_state;
|
|
||||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We evade vblank and pflip interrupts on CRTCs that are undergoing
|
|
||||||
* a modeset, being disabled, or have no active planes.
|
|
||||||
*
|
|
||||||
* It's done in atomic commit rather than commit tail for now since
|
|
||||||
* some of these interrupt handlers access the current CRTC state and
|
|
||||||
* potentially the stream pointer itself.
|
|
||||||
*
|
|
||||||
* Since the atomic state is swapped within atomic commit and not within
|
|
||||||
* commit tail this would leave to new state (that hasn't been committed yet)
|
|
||||||
* being accesssed from within the handlers.
|
|
||||||
*
|
|
||||||
* TODO: Fix this so we can do this in commit tail and not have to block
|
|
||||||
* in atomic check.
|
|
||||||
*/
|
|
||||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
|
||||||
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
|
|
||||||
|
|
||||||
dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
|
|
||||||
|
|
||||||
if (old_crtc_state->active &&
|
|
||||||
(!new_crtc_state->active ||
|
|
||||||
drm_atomic_crtc_needs_modeset(new_crtc_state))) {
|
|
||||||
manage_dm_interrupts(adev, acrtc, false);
|
|
||||||
dc_stream_release(dm_old_crtc_state->stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Add check here for SoC's that support hardware cursor plane, to
|
* Add check here for SoC's that support hardware cursor plane, to
|
||||||
* unset legacy_cursor_update
|
* unset legacy_cursor_update
|
||||||
@ -7519,6 +7486,20 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
|
|||||||
dc_resource_state_copy_construct_current(dm->dc, dc_state);
|
dc_resource_state_copy_construct_current(dm->dc, dc_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for_each_oldnew_crtc_in_state (state, crtc, old_crtc_state,
|
||||||
|
new_crtc_state, i) {
|
||||||
|
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
|
||||||
|
|
||||||
|
dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
|
||||||
|
|
||||||
|
if (old_crtc_state->active &&
|
||||||
|
(!new_crtc_state->active ||
|
||||||
|
drm_atomic_crtc_needs_modeset(new_crtc_state))) {
|
||||||
|
manage_dm_interrupts(adev, acrtc, false);
|
||||||
|
dc_stream_release(dm_old_crtc_state->stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* update changed items */
|
/* update changed items */
|
||||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
||||||
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
|
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user