1caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2cf3a7e4cSRob Clark /* 3cf3a7e4cSRob Clark * Copyright (C) 2014 Red Hat 4cf3a7e4cSRob Clark * Author: Rob Clark <robdclark@gmail.com> 5cf3a7e4cSRob Clark */ 6cf3a7e4cSRob Clark 772fdb40cSDaniel Vetter #include <drm/drm_atomic_uapi.h> 8e78ad765SDaniel Vetter #include <drm/drm_gem_framebuffer_helper.h> 9*feea39a8SSam Ravnborg #include <drm/drm_vblank.h> 1072fdb40cSDaniel Vetter 11cf3a7e4cSRob Clark #include "msm_drv.h" 12db8f4d5dSSean Paul #include "msm_gem.h" 13cf3a7e4cSRob Clark #include "msm_kms.h" 14cf3a7e4cSRob Clark 150a5c9aadSHai Li static void msm_atomic_wait_for_commit_done(struct drm_device *dev, 160a5c9aadSHai Li struct drm_atomic_state *old_state) 170a5c9aadSHai Li { 180a5c9aadSHai Li struct drm_crtc *crtc; 19d7429669SMaarten Lankhorst struct drm_crtc_state *new_crtc_state; 200a5c9aadSHai Li struct msm_drm_private *priv = old_state->dev->dev_private; 210a5c9aadSHai Li struct msm_kms *kms = priv->kms; 220a5c9aadSHai Li int i; 230a5c9aadSHai Li 24d7429669SMaarten Lankhorst for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) { 25d7429669SMaarten Lankhorst if (!new_crtc_state->active) 260a5c9aadSHai Li continue; 270a5c9aadSHai Li 283b712e43SSean Paul if (drm_crtc_vblank_get(crtc)) 293b712e43SSean Paul continue; 303b712e43SSean Paul 310a5c9aadSHai Li kms->funcs->wait_for_crtc_commit_done(kms, crtc); 323b712e43SSean Paul 333b712e43SSean Paul drm_crtc_vblank_put(crtc); 340a5c9aadSHai Li } 350a5c9aadSHai Li } 360a5c9aadSHai Li 37db8f4d5dSSean Paul int msm_atomic_prepare_fb(struct drm_plane *plane, 38db8f4d5dSSean Paul struct drm_plane_state *new_state) 39db8f4d5dSSean Paul { 40db8f4d5dSSean Paul struct msm_drm_private *priv = plane->dev->dev_private; 41db8f4d5dSSean Paul struct msm_kms *kms = priv->kms; 42db8f4d5dSSean Paul 43db8f4d5dSSean Paul if (!new_state->fb) 44db8f4d5dSSean Paul return 0; 45db8f4d5dSSean Paul 46e78ad765SDaniel Vetter drm_gem_fb_prepare_fb(plane, new_state); 47db8f4d5dSSean Paul 48db8f4d5dSSean Paul return msm_framebuffer_prepare(new_state->fb, kms->aspace); 49db8f4d5dSSean Paul } 50db8f4d5dSSean Paul 51d14659f5SSean Paul void msm_atomic_commit_tail(struct drm_atomic_state *state) 52cf3a7e4cSRob Clark { 53cf3a7e4cSRob Clark struct drm_device *dev = state->dev; 540b776d45SRob Clark struct msm_drm_private *priv = dev->dev_private; 550b776d45SRob Clark struct msm_kms *kms = priv->kms; 560b776d45SRob Clark 570b776d45SRob Clark kms->funcs->prepare_commit(kms, state); 58cf3a7e4cSRob Clark 591af434a9SDaniel Vetter drm_atomic_helper_commit_modeset_disables(dev, state); 60cf3a7e4cSRob Clark 612b58e98dSLiu Ying drm_atomic_helper_commit_planes(dev, state, 0); 62cf3a7e4cSRob Clark 631af434a9SDaniel Vetter drm_atomic_helper_commit_modeset_enables(dev, state); 64cf3a7e4cSRob Clark 652b7ac1a8SJeykumar Sankaran if (kms->funcs->commit) { 662b7ac1a8SJeykumar Sankaran DRM_DEBUG_ATOMIC("triggering commit\n"); 672b7ac1a8SJeykumar Sankaran kms->funcs->commit(kms, state); 682b7ac1a8SJeykumar Sankaran } 692b7ac1a8SJeykumar Sankaran 7050bcc689SSean Paul if (!state->legacy_cursor_update) 710a5c9aadSHai Li msm_atomic_wait_for_commit_done(dev, state); 72cf3a7e4cSRob Clark 730b776d45SRob Clark kms->funcs->complete_commit(kms, state); 7470db18dcSSean Paul 7570db18dcSSean Paul drm_atomic_helper_commit_hw_done(state); 7670db18dcSSean Paul 7770db18dcSSean Paul drm_atomic_helper_cleanup_planes(dev, state); 78347b90b4SSean Paul } 79