]>
Commit | Line | Data |
---|---|---|
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 |
13 | static 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 |
35 | int 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 | 54 | void 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 | } |