]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blame - drivers/gpu/drm/msm/msm_atomic.c
UBUNTU: Ubuntu-5.3.0-29.31
[mirror_ubuntu-eoan-kernel.git] / drivers / gpu / drm / msm / msm_atomic.c
CommitLineData
caab277b 1// SPDX-License-Identifier: GPL-2.0-only
cf3a7e4c
RC
2/*
3 * Copyright (C) 2014 Red Hat
4 * Author: Rob Clark <robdclark@gmail.com>
cf3a7e4c
RC
5 */
6
72fdb40c
DV
7#include <drm/drm_atomic_uapi.h>
8
cf3a7e4c 9#include "msm_drv.h"
db8f4d5d 10#include "msm_gem.h"
cf3a7e4c 11#include "msm_kms.h"
cf3a7e4c 12
0a5c9aad
HL
13static void msm_atomic_wait_for_commit_done(struct drm_device *dev,
14 struct drm_atomic_state *old_state)
15{
16 struct drm_crtc *crtc;
d7429669 17 struct drm_crtc_state *new_crtc_state;
0a5c9aad
HL
18 struct msm_drm_private *priv = old_state->dev->dev_private;
19 struct msm_kms *kms = priv->kms;
0a5c9aad
HL
20 int i;
21
d7429669
ML
22 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
23 if (!new_crtc_state->active)
0a5c9aad
HL
24 continue;
25
3b712e43
SP
26 if (drm_crtc_vblank_get(crtc))
27 continue;
28
0a5c9aad 29 kms->funcs->wait_for_crtc_commit_done(kms, crtc);
3b712e43
SP
30
31 drm_crtc_vblank_put(crtc);
0a5c9aad
HL
32 }
33}
34
db8f4d5d
SP
35int msm_atomic_prepare_fb(struct drm_plane *plane,
36 struct drm_plane_state *new_state)
37{
38 struct msm_drm_private *priv = plane->dev->dev_private;
39 struct msm_kms *kms = priv->kms;
40 struct drm_gem_object *obj;
db8f4d5d
SP
41 struct dma_fence *fence;
42
43 if (!new_state->fb)
44 return 0;
45
46 obj = msm_framebuffer_bo(new_state->fb, 0);
e2f597a2 47 fence = reservation_object_get_excl_rcu(obj->resv);
db8f4d5d
SP
48
49 drm_atomic_set_fence_for_plane(new_state, fence);
50
51 return msm_framebuffer_prepare(new_state->fb, kms->aspace);
52}
53
d14659f5 54void msm_atomic_commit_tail(struct drm_atomic_state *state)
cf3a7e4c 55{
cf3a7e4c 56 struct drm_device *dev = state->dev;
0b776d45
RC
57 struct msm_drm_private *priv = dev->dev_private;
58 struct msm_kms *kms = priv->kms;
59
60 kms->funcs->prepare_commit(kms, state);
cf3a7e4c 61
1af434a9 62 drm_atomic_helper_commit_modeset_disables(dev, state);
cf3a7e4c 63
2b58e98d 64 drm_atomic_helper_commit_planes(dev, state, 0);
cf3a7e4c 65
1af434a9 66 drm_atomic_helper_commit_modeset_enables(dev, state);
cf3a7e4c 67
2b7ac1a8
JS
68 if (kms->funcs->commit) {
69 DRM_DEBUG_ATOMIC("triggering commit\n");
70 kms->funcs->commit(kms, state);
71 }
72
50bcc689
SP
73 if (!state->legacy_cursor_update)
74 msm_atomic_wait_for_commit_done(dev, state);
cf3a7e4c 75
0b776d45 76 kms->funcs->complete_commit(kms, state);
70db18dc 77
70db18dc
SP
78 drm_atomic_helper_commit_hw_done(state);
79
80 drm_atomic_helper_cleanup_planes(dev, state);
347b90b4 81}