blob: ee03c1ed252109289ad76b5e913fdd043bb5e80f [file] [log] [blame]
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001/*
2 * Copyright (C) 2014 Red Hat
3 * Copyright (C) 2014 Intel Corp.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Authors:
24 * Rob Clark <robdclark@gmail.com>
25 * Daniel Vetter <daniel.vetter@ffwll.ch>
26 */
27
28#include <drm/drmP.h>
29#include <drm/drm_atomic.h>
30#include <drm/drm_plane_helper.h>
31#include <drm/drm_crtc_helper.h>
Daniel Vetter623369e2014-09-16 17:50:47 +020032#include <drm/drm_atomic_helper.h>
Chris Wilsonf54d1862016-10-25 13:00:45 +010033#include <linux/dma-fence.h>
Daniel Vetterc2fcd272014-11-05 00:14:14 +010034
Jose Abreufaf94a02017-05-25 15:19:16 +010035#include "drm_crtc_helper_internal.h"
Marek Szyprowski44d1240d2016-06-13 11:11:26 +020036#include "drm_crtc_internal.h"
37
Daniel Vetter3150c7d2014-11-06 20:53:29 +010038/**
39 * DOC: overview
40 *
41 * This helper library provides implementations of check and commit functions on
42 * top of the CRTC modeset helper callbacks and the plane helper callbacks. It
43 * also provides convenience implementations for the atomic state handling
44 * callbacks for drivers which don't need to subclass the drm core structures to
45 * add their own additional internal state.
46 *
47 * This library also provides default implementations for the check callback in
Daniel Vetter26196f72015-08-25 16:26:03 +020048 * drm_atomic_helper_check() and for the commit callback with
49 * drm_atomic_helper_commit(). But the individual stages and callbacks are
50 * exposed to allow drivers to mix and match and e.g. use the plane helpers only
Daniel Vetter3150c7d2014-11-06 20:53:29 +010051 * together with a driver private modeset implementation.
52 *
53 * This library also provides implementations for all the legacy driver
Daniel Vetter26196f72015-08-25 16:26:03 +020054 * interfaces on top of the atomic interface. See drm_atomic_helper_set_config(),
55 * drm_atomic_helper_disable_plane(), drm_atomic_helper_disable_plane() and the
Daniel Vetter3150c7d2014-11-06 20:53:29 +010056 * various functions to implement set_property callbacks. New drivers must not
57 * implement these functions themselves but must use the provided helpers.
Daniel Vetter092d01d2015-12-04 09:45:44 +010058 *
59 * The atomic helper uses the same function table structures as all other
Daniel Vetterea0dd852016-12-29 21:48:26 +010060 * modesetting helpers. See the documentation for &struct drm_crtc_helper_funcs,
61 * struct &drm_encoder_helper_funcs and &struct drm_connector_helper_funcs. It
62 * also shares the &struct drm_plane_helper_funcs function table with the plane
Daniel Vetter092d01d2015-12-04 09:45:44 +010063 * helpers.
Daniel Vetter3150c7d2014-11-06 20:53:29 +010064 */
Daniel Vetterc2fcd272014-11-05 00:14:14 +010065static void
66drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +010067 struct drm_plane_state *old_plane_state,
Daniel Vetterc2fcd272014-11-05 00:14:14 +010068 struct drm_plane_state *plane_state,
69 struct drm_plane *plane)
70{
71 struct drm_crtc_state *crtc_state;
72
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +010073 if (old_plane_state->crtc) {
Maarten Lankhorstb4d93672017-03-01 10:22:10 +010074 crtc_state = drm_atomic_get_new_crtc_state(state,
75 old_plane_state->crtc);
Daniel Vetterc2fcd272014-11-05 00:14:14 +010076
77 if (WARN_ON(!crtc_state))
78 return;
79
80 crtc_state->planes_changed = true;
81 }
82
83 if (plane_state->crtc) {
Maarten Lankhorstb4d93672017-03-01 10:22:10 +010084 crtc_state = drm_atomic_get_new_crtc_state(state, plane_state->crtc);
Daniel Vetterc2fcd272014-11-05 00:14:14 +010085
86 if (WARN_ON(!crtc_state))
87 return;
88
89 crtc_state->planes_changed = true;
90 }
91}
92
Maarten Lankhorst8248b652016-03-03 10:17:40 +010093static int handle_conflicting_encoders(struct drm_atomic_state *state,
94 bool disable_conflicting_encoders)
Daniel Vetter97ac3202015-12-03 10:49:14 +010095{
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +010096 struct drm_connector_state *new_conn_state;
Daniel Vetter623369e2014-09-16 17:50:47 +020097 struct drm_connector *connector;
Daniel Vetterc36a3252016-12-15 16:58:43 +010098 struct drm_connector_list_iter conn_iter;
Maarten Lankhorst40616a22016-03-03 10:17:39 +010099 struct drm_encoder *encoder;
100 unsigned encoder_mask = 0;
Daniel Vetterc36a3252016-12-15 16:58:43 +0100101 int i, ret = 0;
Daniel Vetter623369e2014-09-16 17:50:47 +0200102
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100103 /*
104 * First loop, find all newly assigned encoders from the connectors
105 * part of the state. If the same encoder is assigned to multiple
106 * connectors bail out.
107 */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100108 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100109 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
110 struct drm_encoder *new_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +0200111
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100112 if (!new_conn_state->crtc)
Daniel Vetter623369e2014-09-16 17:50:47 +0200113 continue;
114
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100115 if (funcs->atomic_best_encoder)
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100116 new_encoder = funcs->atomic_best_encoder(connector, new_conn_state);
Boris Brezillona0909cc2016-06-01 18:03:37 +0200117 else if (funcs->best_encoder)
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100118 new_encoder = funcs->best_encoder(connector);
Boris Brezillona0909cc2016-06-01 18:03:37 +0200119 else
120 new_encoder = drm_atomic_helper_best_encoder(connector);
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100121
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100122 if (new_encoder) {
123 if (encoder_mask & (1 << drm_encoder_index(new_encoder))) {
124 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] on [CONNECTOR:%d:%s] already assigned\n",
125 new_encoder->base.id, new_encoder->name,
126 connector->base.id, connector->name);
127
128 return -EINVAL;
129 }
130
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100131 encoder_mask |= 1 << drm_encoder_index(new_encoder);
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100132 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200133 }
134
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100135 if (!encoder_mask)
136 return 0;
137
138 /*
139 * Second loop, iterate over all connectors not part of the state.
140 *
141 * If a conflicting encoder is found and disable_conflicting_encoders
142 * is not set, an error is returned. Userspace can provide a solution
143 * through the atomic ioctl.
144 *
145 * If the flag is set conflicting connectors are removed from the crtc
146 * and the crtc is disabled if no encoder is left. This preserves
147 * compatibility with the legacy set_config behavior.
148 */
Thierry Redingb982dab2017-02-28 15:46:43 +0100149 drm_connector_list_iter_begin(state->dev, &conn_iter);
Daniel Vetterc36a3252016-12-15 16:58:43 +0100150 drm_for_each_connector_iter(connector, &conn_iter) {
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100151 struct drm_crtc_state *crtc_state;
152
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100153 if (drm_atomic_get_new_connector_state(state, connector))
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100154 continue;
155
156 encoder = connector->state->best_encoder;
157 if (!encoder || !(encoder_mask & (1 << drm_encoder_index(encoder))))
158 continue;
159
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100160 if (!disable_conflicting_encoders) {
161 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s] by [CONNECTOR:%d:%s]\n",
162 encoder->base.id, encoder->name,
163 connector->state->crtc->base.id,
164 connector->state->crtc->name,
165 connector->base.id, connector->name);
Daniel Vetterc36a3252016-12-15 16:58:43 +0100166 ret = -EINVAL;
167 goto out;
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100168 }
169
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100170 new_conn_state = drm_atomic_get_connector_state(state, connector);
171 if (IS_ERR(new_conn_state)) {
172 ret = PTR_ERR(new_conn_state);
Daniel Vetterc36a3252016-12-15 16:58:43 +0100173 goto out;
174 }
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100175
176 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
177 encoder->base.id, encoder->name,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100178 new_conn_state->crtc->base.id, new_conn_state->crtc->name,
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100179 connector->base.id, connector->name);
180
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100181 crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100182
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100183 ret = drm_atomic_set_crtc_for_connector(new_conn_state, NULL);
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100184 if (ret)
Daniel Vetterc36a3252016-12-15 16:58:43 +0100185 goto out;
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100186
187 if (!crtc_state->connector_mask) {
188 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
189 NULL);
190 if (ret < 0)
Daniel Vetterc36a3252016-12-15 16:58:43 +0100191 goto out;
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100192
193 crtc_state->active = false;
194 }
195 }
Daniel Vetterc36a3252016-12-15 16:58:43 +0100196out:
Thierry Redingb982dab2017-02-28 15:46:43 +0100197 drm_connector_list_iter_end(&conn_iter);
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100198
Daniel Vetterc36a3252016-12-15 16:58:43 +0100199 return ret;
Daniel Vetter623369e2014-09-16 17:50:47 +0200200}
201
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100202static void
203set_best_encoder(struct drm_atomic_state *state,
204 struct drm_connector_state *conn_state,
205 struct drm_encoder *encoder)
206{
207 struct drm_crtc_state *crtc_state;
208 struct drm_crtc *crtc;
209
210 if (conn_state->best_encoder) {
211 /* Unset the encoder_mask in the old crtc state. */
212 crtc = conn_state->connector->state->crtc;
213
214 /* A NULL crtc is an error here because we should have
215 * duplicated a NULL best_encoder when crtc was NULL.
216 * As an exception restoring duplicated atomic state
217 * during resume is allowed, so don't warn when
218 * best_encoder is equal to encoder we intend to set.
219 */
220 WARN_ON(!crtc && encoder != conn_state->best_encoder);
221 if (crtc) {
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100222 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100223
224 crtc_state->encoder_mask &=
225 ~(1 << drm_encoder_index(conn_state->best_encoder));
226 }
227 }
228
229 if (encoder) {
230 crtc = conn_state->crtc;
231 WARN_ON(!crtc);
232 if (crtc) {
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100233 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100234
235 crtc_state->encoder_mask |=
236 1 << drm_encoder_index(encoder);
237 }
238 }
239
240 conn_state->best_encoder = encoder;
241}
242
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100243static void
Daniel Vetter623369e2014-09-16 17:50:47 +0200244steal_encoder(struct drm_atomic_state *state,
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100245 struct drm_encoder *encoder)
Daniel Vetter623369e2014-09-16 17:50:47 +0200246{
Daniel Vetter623369e2014-09-16 17:50:47 +0200247 struct drm_crtc_state *crtc_state;
248 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100249 struct drm_connector_state *old_connector_state, *new_connector_state;
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100250 int i;
Daniel Vetter623369e2014-09-16 17:50:47 +0200251
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100252 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100253 struct drm_crtc *encoder_crtc;
Daniel Vetter623369e2014-09-16 17:50:47 +0200254
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100255 if (new_connector_state->best_encoder != encoder)
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100256 continue;
257
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100258 encoder_crtc = old_connector_state->crtc;
Daniel Vetter623369e2014-09-16 17:50:47 +0200259
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100260 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], stealing it\n",
261 encoder->base.id, encoder->name,
262 encoder_crtc->base.id, encoder_crtc->name);
263
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100264 set_best_encoder(state, new_connector_state, NULL);
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100265
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100266 crtc_state = drm_atomic_get_new_crtc_state(state, encoder_crtc);
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100267 crtc_state->connectors_changed = true;
268
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100269 return;
Daniel Vetter623369e2014-09-16 17:50:47 +0200270 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200271}
272
273static int
Maarten Lankhorst94595452016-02-24 09:37:29 +0100274update_connector_routing(struct drm_atomic_state *state,
275 struct drm_connector *connector,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100276 struct drm_connector_state *old_connector_state,
277 struct drm_connector_state *new_connector_state)
Daniel Vetter623369e2014-09-16 17:50:47 +0200278{
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200279 const struct drm_connector_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200280 struct drm_encoder *new_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +0200281 struct drm_crtc_state *crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200282
Daniel Vetter17a38d92015-02-22 12:24:16 +0100283 DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n",
284 connector->base.id,
285 connector->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200286
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100287 if (old_connector_state->crtc != new_connector_state->crtc) {
288 if (old_connector_state->crtc) {
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100289 crtc_state = drm_atomic_get_new_crtc_state(state, old_connector_state->crtc);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200290 crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200291 }
292
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100293 if (new_connector_state->crtc) {
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100294 crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200295 crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200296 }
297 }
298
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100299 if (!new_connector_state->crtc) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100300 DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n",
Daniel Vetter623369e2014-09-16 17:50:47 +0200301 connector->base.id,
302 connector->name);
303
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100304 set_best_encoder(state, new_connector_state, NULL);
Daniel Vetter623369e2014-09-16 17:50:47 +0200305
306 return 0;
307 }
308
309 funcs = connector->helper_private;
Daniel Vetter3b8a6842015-08-03 17:24:08 +0200310
311 if (funcs->atomic_best_encoder)
312 new_encoder = funcs->atomic_best_encoder(connector,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100313 new_connector_state);
Boris Brezillonc61b93fe2016-06-07 13:47:56 +0200314 else if (funcs->best_encoder)
Daniel Vetter3b8a6842015-08-03 17:24:08 +0200315 new_encoder = funcs->best_encoder(connector);
Boris Brezillonc61b93fe2016-06-07 13:47:56 +0200316 else
317 new_encoder = drm_atomic_helper_best_encoder(connector);
Daniel Vetter623369e2014-09-16 17:50:47 +0200318
319 if (!new_encoder) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100320 DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
321 connector->base.id,
322 connector->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200323 return -EINVAL;
324 }
325
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100326 if (!drm_encoder_crtc_ok(new_encoder, new_connector_state->crtc)) {
Russell King6ac7c542017-02-13 12:27:03 +0000327 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d:%s]\n",
Daniel Vetter5481c8f2015-11-18 18:46:48 +0100328 new_encoder->base.id,
329 new_encoder->name,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100330 new_connector_state->crtc->base.id,
331 new_connector_state->crtc->name);
Daniel Vetter5481c8f2015-11-18 18:46:48 +0100332 return -EINVAL;
333 }
334
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100335 if (new_encoder == new_connector_state->best_encoder) {
336 set_best_encoder(state, new_connector_state, new_encoder);
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100337
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200338 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d:%s]\n",
Daniel Vetter17a38d92015-02-22 12:24:16 +0100339 connector->base.id,
340 connector->name,
341 new_encoder->base.id,
342 new_encoder->name,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100343 new_connector_state->crtc->base.id,
344 new_connector_state->crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200345
346 return 0;
347 }
348
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100349 steal_encoder(state, new_encoder);
Daniel Vetter623369e2014-09-16 17:50:47 +0200350
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100351 set_best_encoder(state, new_connector_state, new_encoder);
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100352
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100353 crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200354 crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200355
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200356 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
Daniel Vetter17a38d92015-02-22 12:24:16 +0100357 connector->base.id,
358 connector->name,
359 new_encoder->base.id,
360 new_encoder->name,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100361 new_connector_state->crtc->base.id,
362 new_connector_state->crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200363
364 return 0;
365}
366
367static int
368mode_fixup(struct drm_atomic_state *state)
369{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300370 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100371 struct drm_crtc_state *new_crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300372 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100373 struct drm_connector_state *new_conn_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200374 int i;
Dan Carpenterf9ad86e2017-02-08 02:46:01 +0300375 int ret;
Daniel Vetter623369e2014-09-16 17:50:47 +0200376
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100377 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
378 if (!new_crtc_state->mode_changed &&
379 !new_crtc_state->connectors_changed)
Daniel Vetter623369e2014-09-16 17:50:47 +0200380 continue;
381
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100382 drm_mode_copy(&new_crtc_state->adjusted_mode, &new_crtc_state->mode);
Daniel Vetter623369e2014-09-16 17:50:47 +0200383 }
384
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100385 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200386 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200387 struct drm_encoder *encoder;
388
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100389 WARN_ON(!!new_conn_state->best_encoder != !!new_conn_state->crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +0200390
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100391 if (!new_conn_state->crtc || !new_conn_state->best_encoder)
Daniel Vetter623369e2014-09-16 17:50:47 +0200392 continue;
393
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100394 new_crtc_state =
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100395 drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +0200396
397 /*
398 * Each encoder has at most one connector (since we always steal
399 * it away), so we won't call ->mode_fixup twice.
400 */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100401 encoder = new_conn_state->best_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +0200402 funcs = encoder->helper_private;
403
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100404 ret = drm_bridge_mode_fixup(encoder->bridge, &new_crtc_state->mode,
405 &new_crtc_state->adjusted_mode);
Archit Taneja862e6862015-05-21 11:03:16 +0530406 if (!ret) {
407 DRM_DEBUG_ATOMIC("Bridge fixup failed\n");
408 return -EINVAL;
Daniel Vetter623369e2014-09-16 17:50:47 +0200409 }
410
Noralf Trønnes28276352016-05-11 18:09:20 +0200411 if (funcs && funcs->atomic_check) {
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100412 ret = funcs->atomic_check(encoder, new_crtc_state,
413 new_conn_state);
Thierry Reding4cd4df82014-12-03 16:44:34 +0100414 if (ret) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100415 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n",
416 encoder->base.id, encoder->name);
Thierry Reding4cd4df82014-12-03 16:44:34 +0100417 return ret;
418 }
Noralf Trønnes28276352016-05-11 18:09:20 +0200419 } else if (funcs && funcs->mode_fixup) {
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100420 ret = funcs->mode_fixup(encoder, &new_crtc_state->mode,
421 &new_crtc_state->adjusted_mode);
Thierry Reding4cd4df82014-12-03 16:44:34 +0100422 if (!ret) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100423 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n",
424 encoder->base.id, encoder->name);
Thierry Reding4cd4df82014-12-03 16:44:34 +0100425 return -EINVAL;
426 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200427 }
428 }
429
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100430 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200431 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200432
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100433 if (!new_crtc_state->enable)
Liu Yingf55f1702016-05-27 17:35:54 +0800434 continue;
435
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100436 if (!new_crtc_state->mode_changed &&
437 !new_crtc_state->connectors_changed)
Daniel Vetter623369e2014-09-16 17:50:47 +0200438 continue;
439
440 funcs = crtc->helper_private;
Ander Conselvan de Oliveira840bfe92015-04-21 17:13:18 +0300441 if (!funcs->mode_fixup)
442 continue;
443
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100444 ret = funcs->mode_fixup(crtc, &new_crtc_state->mode,
445 &new_crtc_state->adjusted_mode);
Daniel Vetter623369e2014-09-16 17:50:47 +0200446 if (!ret) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200447 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] fixup failed\n",
448 crtc->base.id, crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200449 return -EINVAL;
450 }
451 }
452
453 return 0;
454}
455
Jose Abreufaf94a02017-05-25 15:19:16 +0100456static enum drm_mode_status mode_valid_path(struct drm_connector *connector,
457 struct drm_encoder *encoder,
458 struct drm_crtc *crtc,
459 struct drm_display_mode *mode)
460{
461 enum drm_mode_status ret;
462
463 ret = drm_encoder_mode_valid(encoder, mode);
464 if (ret != MODE_OK) {
465 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] mode_valid() failed\n",
466 encoder->base.id, encoder->name);
467 return ret;
468 }
469
470 ret = drm_bridge_mode_valid(encoder->bridge, mode);
471 if (ret != MODE_OK) {
472 DRM_DEBUG_ATOMIC("[BRIDGE] mode_valid() failed\n");
473 return ret;
474 }
475
476 ret = drm_crtc_mode_valid(crtc, mode);
477 if (ret != MODE_OK) {
478 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode_valid() failed\n",
479 crtc->base.id, crtc->name);
480 return ret;
481 }
482
483 return ret;
484}
485
486static int
487mode_valid(struct drm_atomic_state *state)
488{
489 struct drm_connector_state *conn_state;
490 struct drm_connector *connector;
491 int i;
492
493 for_each_new_connector_in_state(state, connector, conn_state, i) {
494 struct drm_encoder *encoder = conn_state->best_encoder;
495 struct drm_crtc *crtc = conn_state->crtc;
496 struct drm_crtc_state *crtc_state;
497 enum drm_mode_status mode_status;
498 struct drm_display_mode *mode;
499
500 if (!crtc || !encoder)
501 continue;
502
503 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
504 if (!crtc_state)
505 continue;
506 if (!crtc_state->mode_changed && !crtc_state->connectors_changed)
507 continue;
508
509 mode = &crtc_state->mode;
510
511 mode_status = mode_valid_path(connector, encoder, crtc, mode);
512 if (mode_status != MODE_OK)
513 return -EINVAL;
514 }
515
516 return 0;
517}
518
Daniel Vetterd9b13622014-11-26 16:57:41 +0100519/**
John Hunterf98bd3e2015-03-17 15:30:26 +0800520 * drm_atomic_helper_check_modeset - validate state object for modeset changes
Daniel Vetterd9b13622014-11-26 16:57:41 +0100521 * @dev: DRM device
522 * @state: the driver state object
523 *
524 * Check the state object to see if the requested state is physically possible.
525 * This does all the crtc and connector related computations for an atomic
Maarten Lankhorstce09d762017-04-06 13:19:03 +0200526 * update and adds any additional connectors needed for full modesets. It calls
527 * the various per-object callbacks in the follow order:
528 *
529 * 1. &drm_connector_helper_funcs.atomic_best_encoder for determining the new encoder.
530 * 2. &drm_connector_helper_funcs.atomic_check to validate the connector state.
531 * 3. If it's determined a modeset is needed then all connectors on the affected crtc
532 * crtc are added and &drm_connector_helper_funcs.atomic_check is run on them.
Jose Abreufaf94a02017-05-25 15:19:16 +0100533 * 4. &drm_encoder_helper_funcs.mode_valid, &drm_bridge_funcs.mode_valid and
534 * &drm_crtc_helper_funcs.mode_valid are called on the affected components.
535 * 5. &drm_bridge_funcs.mode_fixup is called on all encoder bridges.
536 * 6. &drm_encoder_helper_funcs.atomic_check is called to validate any encoder state.
Maarten Lankhorstce09d762017-04-06 13:19:03 +0200537 * This function is only called when the encoder will be part of a configured crtc,
538 * it must not be used for implementing connector property validation.
539 * If this function is NULL, &drm_atomic_encoder_helper_funcs.mode_fixup is called
540 * instead.
Jose Abreufaf94a02017-05-25 15:19:16 +0100541 * 7. &drm_crtc_helper_funcs.mode_fixup is called last, to fix up the mode with crtc constraints.
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200542 *
Daniel Vetter6806cdf2017-01-25 07:26:43 +0100543 * &drm_crtc_state.mode_changed is set when the input mode is changed.
544 * &drm_crtc_state.connectors_changed is set when a connector is added or
545 * removed from the crtc. &drm_crtc_state.active_changed is set when
546 * &drm_crtc_state.active changes, which is used for DPMS.
Brian Starkeyd807ed12016-10-13 10:47:08 +0100547 * See also: drm_atomic_crtc_needs_modeset()
Daniel Vetterd9b13622014-11-26 16:57:41 +0100548 *
549 * IMPORTANT:
550 *
Daniel Vetter6806cdf2017-01-25 07:26:43 +0100551 * Drivers which set &drm_crtc_state.mode_changed (e.g. in their
552 * &drm_plane_helper_funcs.atomic_check hooks if a plane update can't be done
553 * without a full modeset) _must_ call this function afterwards after that
554 * change. It is permitted to call this function multiple times for the same
555 * update, e.g. when the &drm_crtc_helper_funcs.atomic_check functions depend
556 * upon the adjusted dotclock for fifo space allocation and watermark
557 * computation.
Daniel Vetterd9b13622014-11-26 16:57:41 +0100558 *
Daniel Vetterc39032a2016-06-08 14:19:19 +0200559 * RETURNS:
Daniel Vetterd9b13622014-11-26 16:57:41 +0100560 * Zero for success or -errno
561 */
562int
Rob Clark934ce1c2014-11-19 16:41:33 -0500563drm_atomic_helper_check_modeset(struct drm_device *dev,
Daniel Vetter623369e2014-09-16 17:50:47 +0200564 struct drm_atomic_state *state)
565{
Daniel Vetter623369e2014-09-16 17:50:47 +0200566 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100567 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300568 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100569 struct drm_connector_state *old_connector_state, *new_connector_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200570 int i, ret;
Maarten Lankhorstce09d762017-04-06 13:19:03 +0200571 unsigned connectors_mask = 0;
Daniel Vetter623369e2014-09-16 17:50:47 +0200572
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100573 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
Maarten Lankhorst970ece82017-04-06 13:19:02 +0200574 bool has_connectors =
575 !!new_crtc_state->connector_mask;
576
Daniel Vetter869e1882017-05-31 10:38:13 +0200577 WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
578
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100579 if (!drm_mode_equal(&old_crtc_state->mode, &new_crtc_state->mode)) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200580 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
581 crtc->base.id, crtc->name);
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100582 new_crtc_state->mode_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200583 }
584
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100585 if (old_crtc_state->enable != new_crtc_state->enable) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200586 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enable changed\n",
587 crtc->base.id, crtc->name);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200588
589 /*
590 * For clarity this assignment is done here, but
591 * enable == 0 is only true when there are no
592 * connectors and a NULL mode.
593 *
594 * The other way around is true as well. enable != 0
595 * iff connectors are attached and a mode is set.
596 */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100597 new_crtc_state->mode_changed = true;
598 new_crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200599 }
Maarten Lankhorst24d66522017-04-06 13:19:01 +0200600
601 if (old_crtc_state->active != new_crtc_state->active) {
602 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active changed\n",
603 crtc->base.id, crtc->name);
604 new_crtc_state->active_changed = true;
605 }
Maarten Lankhorst970ece82017-04-06 13:19:02 +0200606
607 if (new_crtc_state->enable != has_connectors) {
608 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled/connectors mismatch\n",
609 crtc->base.id, crtc->name);
610
611 return -EINVAL;
612 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200613 }
614
Maarten Lankhorst44596b82017-04-06 13:19:00 +0200615 ret = handle_conflicting_encoders(state, false);
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100616 if (ret)
617 return ret;
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100618
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100619 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
Maarten Lankhorstce09d762017-04-06 13:19:03 +0200620 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
621
Daniel Vetter869e1882017-05-31 10:38:13 +0200622 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
623
Daniel Vetter623369e2014-09-16 17:50:47 +0200624 /*
Brian Starkeyd807ed12016-10-13 10:47:08 +0100625 * This only sets crtc->connectors_changed for routing changes,
626 * drivers must set crtc->connectors_changed themselves when
627 * connector properties need to be updated.
Daniel Vetter623369e2014-09-16 17:50:47 +0200628 */
Maarten Lankhorst94595452016-02-24 09:37:29 +0100629 ret = update_connector_routing(state, connector,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100630 old_connector_state,
631 new_connector_state);
Daniel Vetter623369e2014-09-16 17:50:47 +0200632 if (ret)
633 return ret;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100634 if (old_connector_state->crtc) {
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100635 new_crtc_state = drm_atomic_get_new_crtc_state(state,
636 old_connector_state->crtc);
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100637 if (old_connector_state->link_status !=
638 new_connector_state->link_status)
639 new_crtc_state->connectors_changed = true;
Manasi Navare40ee6fb2016-12-16 12:29:06 +0200640 }
Maarten Lankhorstce09d762017-04-06 13:19:03 +0200641
642 if (funcs->atomic_check)
643 ret = funcs->atomic_check(connector, new_connector_state);
644 if (ret)
645 return ret;
646
647 connectors_mask += BIT(i);
Daniel Vetter623369e2014-09-16 17:50:47 +0200648 }
649
650 /*
651 * After all the routing has been prepared we need to add in any
652 * connector which is itself unchanged, but who's crtc changes it's
653 * configuration. This must be done before calling mode_fixup in case a
654 * crtc only changed its mode but has the same set of connectors.
655 */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100656 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100657 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100658 continue;
659
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200660 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] needs all connectors, enable: %c, active: %c\n",
661 crtc->base.id, crtc->name,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100662 new_crtc_state->enable ? 'y' : 'n',
663 new_crtc_state->active ? 'y' : 'n');
Daniel Vetter623369e2014-09-16 17:50:47 +0200664
665 ret = drm_atomic_add_affected_connectors(state, crtc);
666 if (ret != 0)
667 return ret;
668
Maarten Lankhorst57744aa2015-05-19 16:41:03 +0200669 ret = drm_atomic_add_affected_planes(state, crtc);
670 if (ret != 0)
671 return ret;
Daniel Vetter623369e2014-09-16 17:50:47 +0200672 }
673
Maarten Lankhorstce09d762017-04-06 13:19:03 +0200674 /*
675 * Iterate over all connectors again, to make sure atomic_check()
676 * has been called on them when a modeset is forced.
677 */
678 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
679 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
680
681 if (connectors_mask & BIT(i))
682 continue;
683
684 if (funcs->atomic_check)
685 ret = funcs->atomic_check(connector, new_connector_state);
686 if (ret)
687 return ret;
688 }
689
Jose Abreufaf94a02017-05-25 15:19:16 +0100690 ret = mode_valid(state);
691 if (ret)
692 return ret;
693
Daniel Vetter623369e2014-09-16 17:50:47 +0200694 return mode_fixup(state);
695}
Daniel Vetterd9b13622014-11-26 16:57:41 +0100696EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
Daniel Vetter623369e2014-09-16 17:50:47 +0200697
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100698/**
Ville Syrjäläa01cb8b2017-11-01 22:16:19 +0200699 * drm_atomic_helper_check_plane_state() - Check plane state for validity
700 * @plane_state: plane state to check
701 * @crtc_state: crtc state to check
Ville Syrjäläa01cb8b2017-11-01 22:16:19 +0200702 * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
703 * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
704 * @can_position: is it legal to position the plane such that it
705 * doesn't cover the entire crtc? This will generally
706 * only be false for primary planes.
707 * @can_update_disabled: can the plane be updated while the crtc
708 * is disabled?
709 *
710 * Checks that a desired plane update is valid, and updates various
711 * bits of derived state (clipped coordinates etc.). Drivers that provide
712 * their own plane handling rather than helper-provided implementations may
713 * still wish to call this function to avoid duplication of error checking
714 * code.
715 *
716 * RETURNS:
717 * Zero if update appears valid, error code on failure
718 */
719int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
720 const struct drm_crtc_state *crtc_state,
Ville Syrjäläa01cb8b2017-11-01 22:16:19 +0200721 int min_scale,
722 int max_scale,
723 bool can_position,
724 bool can_update_disabled)
725{
726 struct drm_framebuffer *fb = plane_state->fb;
727 struct drm_rect *src = &plane_state->src;
728 struct drm_rect *dst = &plane_state->dst;
729 unsigned int rotation = plane_state->rotation;
Ville Syrjälä81af63a2018-01-23 19:08:57 +0200730 struct drm_rect clip = {};
Ville Syrjäläa01cb8b2017-11-01 22:16:19 +0200731 int hscale, vscale;
732
733 WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
734
735 *src = drm_plane_state_src(plane_state);
736 *dst = drm_plane_state_dest(plane_state);
737
738 if (!fb) {
739 plane_state->visible = false;
740 return 0;
741 }
742
743 /* crtc should only be NULL when disabling (i.e., !fb) */
744 if (WARN_ON(!plane_state->crtc)) {
745 plane_state->visible = false;
746 return 0;
747 }
748
749 if (!crtc_state->enable && !can_update_disabled) {
750 DRM_DEBUG_KMS("Cannot update plane of a disabled CRTC.\n");
751 return -EINVAL;
752 }
753
754 drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
755
756 /* Check scaling */
757 hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
758 vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
759 if (hscale < 0 || vscale < 0) {
760 DRM_DEBUG_KMS("Invalid scaling of plane\n");
761 drm_rect_debug_print("src: ", &plane_state->src, true);
762 drm_rect_debug_print("dst: ", &plane_state->dst, false);
763 return -ERANGE;
764 }
765
Ville Syrjälä81af63a2018-01-23 19:08:57 +0200766 if (crtc_state->enable)
767 drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2);
768
769 plane_state->visible = drm_rect_clip_scaled(src, dst, &clip, hscale, vscale);
Ville Syrjäläa01cb8b2017-11-01 22:16:19 +0200770
771 drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
772
773 if (!plane_state->visible)
774 /*
775 * Plane isn't visible; some drivers can handle this
776 * so we just return success here. Drivers that can't
777 * (including those that use the primary plane helper's
778 * update function) will return an error from their
779 * update_plane handler.
780 */
781 return 0;
782
Ville Syrjälä81af63a2018-01-23 19:08:57 +0200783 if (!can_position && !drm_rect_equals(dst, &clip)) {
Ville Syrjäläa01cb8b2017-11-01 22:16:19 +0200784 DRM_DEBUG_KMS("Plane must cover entire CRTC\n");
785 drm_rect_debug_print("dst: ", dst, false);
Ville Syrjälä81af63a2018-01-23 19:08:57 +0200786 drm_rect_debug_print("clip: ", &clip, false);
Ville Syrjäläa01cb8b2017-11-01 22:16:19 +0200787 return -EINVAL;
788 }
789
790 return 0;
791}
792EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
793
794/**
John Hunterf98bd3e2015-03-17 15:30:26 +0800795 * drm_atomic_helper_check_planes - validate state object for planes changes
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100796 * @dev: DRM device
797 * @state: the driver state object
798 *
799 * Check the state object to see if the requested state is physically possible.
Daniel Vetterd9b13622014-11-26 16:57:41 +0100800 * This does all the plane update related checks using by calling into the
Daniel Vetter6806cdf2017-01-25 07:26:43 +0100801 * &drm_crtc_helper_funcs.atomic_check and &drm_plane_helper_funcs.atomic_check
802 * hooks provided by the driver.
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100803 *
Daniel Vetter6806cdf2017-01-25 07:26:43 +0100804 * It also sets &drm_crtc_state.planes_changed to indicate that a crtc has
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200805 * updated planes.
806 *
Daniel Vetterc39032a2016-06-08 14:19:19 +0200807 * RETURNS:
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100808 * Zero for success or -errno
809 */
Daniel Vetterd9b13622014-11-26 16:57:41 +0100810int
811drm_atomic_helper_check_planes(struct drm_device *dev,
812 struct drm_atomic_state *state)
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100813{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300814 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100815 struct drm_crtc_state *new_crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300816 struct drm_plane *plane;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100817 struct drm_plane_state *new_plane_state, *old_plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100818 int i, ret = 0;
819
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100820 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200821 const struct drm_plane_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100822
Daniel Vetter869e1882017-05-31 10:38:13 +0200823 WARN_ON(!drm_modeset_is_locked(&plane->mutex));
824
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100825 funcs = plane->helper_private;
826
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100827 drm_atomic_helper_plane_changed(state, old_plane_state, new_plane_state, plane);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100828
829 if (!funcs || !funcs->atomic_check)
830 continue;
831
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100832 ret = funcs->atomic_check(plane, new_plane_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100833 if (ret) {
Ville Syrjälä9f4c97a2015-12-08 18:41:54 +0200834 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
835 plane->base.id, plane->name);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100836 return ret;
837 }
838 }
839
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100840 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200841 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100842
843 funcs = crtc->helper_private;
844
845 if (!funcs || !funcs->atomic_check)
846 continue;
847
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100848 ret = funcs->atomic_check(crtc, new_crtc_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100849 if (ret) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200850 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
851 crtc->base.id, crtc->name);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100852 return ret;
853 }
854 }
855
Daniel Vetterd9b13622014-11-26 16:57:41 +0100856 return ret;
857}
858EXPORT_SYMBOL(drm_atomic_helper_check_planes);
859
860/**
861 * drm_atomic_helper_check - validate state object
862 * @dev: DRM device
863 * @state: the driver state object
864 *
865 * Check the state object to see if the requested state is physically possible.
866 * Only crtcs and planes have check callbacks, so for any additional (global)
867 * checking that a driver needs it can simply wrap that around this function.
Daniel Vetter6806cdf2017-01-25 07:26:43 +0100868 * Drivers without such needs can directly use this as their
869 * &drm_mode_config_funcs.atomic_check callback.
Daniel Vetterd9b13622014-11-26 16:57:41 +0100870 *
Daniel Vetterb4274fb2014-11-26 17:02:18 +0100871 * This just wraps the two parts of the state checking for planes and modeset
872 * state in the default order: First it calls drm_atomic_helper_check_modeset()
873 * and then drm_atomic_helper_check_planes(). The assumption is that the
Daniel Vetter6806cdf2017-01-25 07:26:43 +0100874 * @drm_plane_helper_funcs.atomic_check and @drm_crtc_helper_funcs.atomic_check
875 * functions depend upon an updated adjusted_mode.clock to e.g. properly compute
876 * watermarks.
Daniel Vetterb4274fb2014-11-26 17:02:18 +0100877 *
Peter Ujfalusi49efffc2018-03-21 12:20:24 +0200878 * Note that zpos normalization will add all enable planes to the state which
879 * might not desired for some drivers.
880 * For example enable/disable of a cursor plane which have fixed zpos value
881 * would trigger all other enabled planes to be forced to the state change.
882 *
Daniel Vetterc39032a2016-06-08 14:19:19 +0200883 * RETURNS:
Daniel Vetterd9b13622014-11-26 16:57:41 +0100884 * Zero for success or -errno
885 */
886int drm_atomic_helper_check(struct drm_device *dev,
887 struct drm_atomic_state *state)
888{
889 int ret;
890
Daniel Vetterb4274fb2014-11-26 17:02:18 +0100891 ret = drm_atomic_helper_check_modeset(dev, state);
Daniel Vetterd9b13622014-11-26 16:57:41 +0100892 if (ret)
893 return ret;
894
Peter Ujfalusi49efffc2018-03-21 12:20:24 +0200895 if (dev->mode_config.normalize_zpos) {
896 ret = drm_atomic_normalize_zpos(dev, state);
897 if (ret)
898 return ret;
899 }
900
Daniel Vetterb4274fb2014-11-26 17:02:18 +0100901 ret = drm_atomic_helper_check_planes(dev, state);
Rob Clark934ce1c2014-11-19 16:41:33 -0500902 if (ret)
903 return ret;
904
Gustavo Padovanfef9df82017-06-30 15:03:17 -0300905 if (state->legacy_cursor_update)
906 state->async_update = !drm_atomic_helper_async_check(dev, state);
907
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100908 return ret;
909}
910EXPORT_SYMBOL(drm_atomic_helper_check);
911
Daniel Vetter623369e2014-09-16 17:50:47 +0200912static void
913disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
914{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300915 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100916 struct drm_connector_state *old_conn_state, *new_conn_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300917 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100918 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200919 int i;
920
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100921 for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200922 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200923 struct drm_encoder *encoder;
924
Daniel Vetter623369e2014-09-16 17:50:47 +0200925 /* Shut down everything that's in the changeset and currently
926 * still on. So need to check the old, saved state. */
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300927 if (!old_conn_state->crtc)
Daniel Vetter623369e2014-09-16 17:50:47 +0200928 continue;
929
Maarten Lankhorstb4d93672017-03-01 10:22:10 +0100930 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, old_conn_state->crtc);
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100931
Daniel Vetter4218a322015-03-26 22:18:40 +0100932 if (!old_crtc_state->active ||
Daniel Vetter2465ff62015-06-18 09:58:55 +0200933 !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100934 continue;
935
Rob Clark46df9ad2014-11-20 15:40:36 -0500936 encoder = old_conn_state->best_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +0200937
Rob Clark46df9ad2014-11-20 15:40:36 -0500938 /* We shouldn't get this far if we didn't previously have
939 * an encoder.. but WARN_ON() rather than explode.
940 */
941 if (WARN_ON(!encoder))
Daniel Vetter623369e2014-09-16 17:50:47 +0200942 continue;
943
944 funcs = encoder->helper_private;
945
Daniel Vetter17a38d92015-02-22 12:24:16 +0100946 DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
947 encoder->base.id, encoder->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100948
Daniel Vetter623369e2014-09-16 17:50:47 +0200949 /*
950 * Each encoder has at most one connector (since we always steal
John Hunterf98bd3e2015-03-17 15:30:26 +0800951 * it away), so we won't call disable hooks twice.
Daniel Vetter623369e2014-09-16 17:50:47 +0200952 */
Archit Taneja862e6862015-05-21 11:03:16 +0530953 drm_bridge_disable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +0200954
955 /* Right function depends upon target state. */
Noralf Trønnes28276352016-05-11 18:09:20 +0200956 if (funcs) {
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100957 if (new_conn_state->crtc && funcs->prepare)
Noralf Trønnes28276352016-05-11 18:09:20 +0200958 funcs->prepare(encoder);
959 else if (funcs->disable)
960 funcs->disable(encoder);
961 else if (funcs->dpms)
962 funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
963 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200964
Archit Taneja862e6862015-05-21 11:03:16 +0530965 drm_bridge_post_disable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +0200966 }
967
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100968 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200969 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter84014b02017-10-17 17:27:14 +0200970 int ret;
Daniel Vetter623369e2014-09-16 17:50:47 +0200971
972 /* Shut down everything that needs a full modeset. */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100973 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100974 continue;
975
976 if (!old_crtc_state->active)
Daniel Vetter623369e2014-09-16 17:50:47 +0200977 continue;
978
979 funcs = crtc->helper_private;
980
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200981 DRM_DEBUG_ATOMIC("disabling [CRTC:%d:%s]\n",
982 crtc->base.id, crtc->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100983
984
Daniel Vetter623369e2014-09-16 17:50:47 +0200985 /* Right function depends upon target state. */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +0100986 if (new_crtc_state->enable && funcs->prepare)
Daniel Vetter623369e2014-09-16 17:50:47 +0200987 funcs->prepare(crtc);
Liu Yingc9ac8b42016-08-26 15:30:38 +0800988 else if (funcs->atomic_disable)
989 funcs->atomic_disable(crtc, old_crtc_state);
Daniel Vetter623369e2014-09-16 17:50:47 +0200990 else if (funcs->disable)
991 funcs->disable(crtc);
992 else
993 funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
Daniel Vetter84014b02017-10-17 17:27:14 +0200994
995 if (!(dev->irq_enabled && dev->num_crtcs))
996 continue;
997
998 ret = drm_crtc_vblank_get(crtc);
999 WARN_ONCE(ret != -EINVAL, "driver forgot to call drm_crtc_vblank_off()\n");
1000 if (ret == 0)
1001 drm_crtc_vblank_put(crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +02001002 }
1003}
1004
Daniel Vetter4c18d302015-05-12 15:27:37 +02001005/**
1006 * drm_atomic_helper_update_legacy_modeset_state - update legacy modeset state
1007 * @dev: DRM device
1008 * @old_state: atomic state object with old state structures
1009 *
1010 * This function updates all the various legacy modeset state pointers in
1011 * connectors, encoders and crtcs. It also updates the timestamping constants
1012 * used for precise vblank timestamps by calling
1013 * drm_calc_timestamping_constants().
1014 *
1015 * Drivers can use this for building their own atomic commit if they don't have
1016 * a pure helper-based modeset implementation.
Daniel Vetter2e2b96e2017-11-08 21:30:07 +01001017 *
1018 * Since these updates are not synchronized with lockings, only code paths
1019 * called from &drm_mode_config_helper_funcs.atomic_commit_tail can look at the
1020 * legacy state filled out by this helper. Defacto this means this helper and
1021 * the legacy state pointers are only really useful for transitioning an
1022 * existing driver to the atomic world.
Daniel Vetter4c18d302015-05-12 15:27:37 +02001023 */
1024void
1025drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
1026 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +02001027{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001028 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001029 struct drm_connector_state *old_conn_state, *new_conn_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001030 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001031 struct drm_crtc_state *new_crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +02001032 int i;
1033
Maarten Lankhorst8c103422015-07-27 13:24:29 +02001034 /* clear out existing links and update dpms */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001035 for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
Maarten Lankhorst8c103422015-07-27 13:24:29 +02001036 if (connector->encoder) {
1037 WARN_ON(!connector->encoder->crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +02001038
Maarten Lankhorst8c103422015-07-27 13:24:29 +02001039 connector->encoder->crtc = NULL;
1040 connector->encoder = NULL;
1041 }
Daniel Vetter623369e2014-09-16 17:50:47 +02001042
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001043 crtc = new_conn_state->crtc;
Maarten Lankhorst8c103422015-07-27 13:24:29 +02001044 if ((!crtc && old_conn_state->crtc) ||
1045 (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
Maarten Lankhorst8c103422015-07-27 13:24:29 +02001046 int mode = DRM_MODE_DPMS_OFF;
1047
1048 if (crtc && crtc->state->active)
1049 mode = DRM_MODE_DPMS_ON;
1050
1051 connector->dpms = mode;
Maarten Lankhorst8c103422015-07-27 13:24:29 +02001052 }
Daniel Vetter623369e2014-09-16 17:50:47 +02001053 }
1054
1055 /* set new links */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001056 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1057 if (!new_conn_state->crtc)
Daniel Vetter623369e2014-09-16 17:50:47 +02001058 continue;
1059
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001060 if (WARN_ON(!new_conn_state->best_encoder))
Daniel Vetter623369e2014-09-16 17:50:47 +02001061 continue;
1062
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001063 connector->encoder = new_conn_state->best_encoder;
1064 connector->encoder->crtc = new_conn_state->crtc;
Daniel Vetter623369e2014-09-16 17:50:47 +02001065 }
1066
1067 /* set legacy state in the crtc structure */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001068 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
Maarten Lankhorst26608012015-07-16 15:51:01 +02001069 struct drm_plane *primary = crtc->primary;
Maarten Lankhorstb4d93672017-03-01 10:22:10 +01001070 struct drm_plane_state *new_plane_state;
Maarten Lankhorst26608012015-07-16 15:51:01 +02001071
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001072 crtc->mode = new_crtc_state->mode;
1073 crtc->enabled = new_crtc_state->enable;
Maarten Lankhorst26608012015-07-16 15:51:01 +02001074
Maarten Lankhorstb4d93672017-03-01 10:22:10 +01001075 new_plane_state =
1076 drm_atomic_get_new_plane_state(old_state, primary);
1077
1078 if (new_plane_state && new_plane_state->crtc == crtc) {
1079 crtc->x = new_plane_state->src_x >> 16;
1080 crtc->y = new_plane_state->src_y >> 16;
Maarten Lankhorst26608012015-07-16 15:51:01 +02001081 }
Daniel Vetter3d51d2d2015-05-12 15:21:06 +02001082
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001083 if (new_crtc_state->enable)
Daniel Vetter3d51d2d2015-05-12 15:21:06 +02001084 drm_calc_timestamping_constants(crtc,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001085 &new_crtc_state->adjusted_mode);
Daniel Vetter623369e2014-09-16 17:50:47 +02001086 }
1087}
Daniel Vetter4c18d302015-05-12 15:27:37 +02001088EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state);
Daniel Vetter623369e2014-09-16 17:50:47 +02001089
1090static void
1091crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
1092{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001093 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001094 struct drm_crtc_state *new_crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001095 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001096 struct drm_connector_state *new_conn_state;
Daniel Vetter623369e2014-09-16 17:50:47 +02001097 int i;
1098
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001099 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001100 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +02001101
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001102 if (!new_crtc_state->mode_changed)
Daniel Vetter623369e2014-09-16 17:50:47 +02001103 continue;
1104
1105 funcs = crtc->helper_private;
1106
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001107 if (new_crtc_state->enable && funcs->mode_set_nofb) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +02001108 DRM_DEBUG_ATOMIC("modeset on [CRTC:%d:%s]\n",
1109 crtc->base.id, crtc->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +01001110
Daniel Vetter623369e2014-09-16 17:50:47 +02001111 funcs->mode_set_nofb(crtc);
Daniel Vetter95d6eb32015-01-22 16:36:25 +01001112 }
Daniel Vetter623369e2014-09-16 17:50:47 +02001113 }
1114
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001115 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001116 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +02001117 struct drm_encoder *encoder;
1118 struct drm_display_mode *mode, *adjusted_mode;
1119
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001120 if (!new_conn_state->best_encoder)
Daniel Vetter623369e2014-09-16 17:50:47 +02001121 continue;
1122
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001123 encoder = new_conn_state->best_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +02001124 funcs = encoder->helper_private;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001125 new_crtc_state = new_conn_state->crtc->state;
Daniel Vetter623369e2014-09-16 17:50:47 +02001126 mode = &new_crtc_state->mode;
1127 adjusted_mode = &new_crtc_state->adjusted_mode;
1128
Daniel Vettereab3bbe2015-01-22 16:36:21 +01001129 if (!new_crtc_state->mode_changed)
1130 continue;
1131
Daniel Vetter17a38d92015-02-22 12:24:16 +01001132 DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
1133 encoder->base.id, encoder->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +01001134
Daniel Vetter623369e2014-09-16 17:50:47 +02001135 /*
1136 * Each encoder has at most one connector (since we always steal
John Hunterf98bd3e2015-03-17 15:30:26 +08001137 * it away), so we won't call mode_set hooks twice.
Daniel Vetter623369e2014-09-16 17:50:47 +02001138 */
Philipp Zabelfe4a11c2016-07-22 12:20:47 +02001139 if (funcs && funcs->atomic_mode_set) {
1140 funcs->atomic_mode_set(encoder, new_crtc_state,
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001141 new_conn_state);
Philipp Zabelfe4a11c2016-07-22 12:20:47 +02001142 } else if (funcs && funcs->mode_set) {
Daniel Vetterc982bd92015-02-22 12:24:20 +01001143 funcs->mode_set(encoder, mode, adjusted_mode);
Philipp Zabelfe4a11c2016-07-22 12:20:47 +02001144 }
Daniel Vetter623369e2014-09-16 17:50:47 +02001145
Archit Taneja862e6862015-05-21 11:03:16 +05301146 drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
Daniel Vetter623369e2014-09-16 17:50:47 +02001147 }
1148}
1149
1150/**
Daniel Vetter1af434a2015-02-22 12:24:19 +01001151 * drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs
Daniel Vetter623369e2014-09-16 17:50:47 +02001152 * @dev: DRM device
Laurent Pincharta072f802015-02-22 12:24:18 +01001153 * @old_state: atomic state object with old state structures
Daniel Vetter623369e2014-09-16 17:50:47 +02001154 *
Daniel Vetter1af434a2015-02-22 12:24:19 +01001155 * This function shuts down all the outputs that need to be shut down and
Daniel Vetter623369e2014-09-16 17:50:47 +02001156 * prepares them (if required) with the new mode.
Daniel Vetter1af434a2015-02-22 12:24:19 +01001157 *
Laurent Pinchart60acc4e2015-05-27 15:05:42 +03001158 * For compatibility with legacy crtc helpers this should be called before
Daniel Vetter1af434a2015-02-22 12:24:19 +01001159 * drm_atomic_helper_commit_planes(), which is what the default commit function
1160 * does. But drivers with different needs can group the modeset commits together
1161 * and do the plane commits at the end. This is useful for drivers doing runtime
1162 * PM since planes updates then only happen when the CRTC is actually enabled.
Daniel Vetter623369e2014-09-16 17:50:47 +02001163 */
Daniel Vetter1af434a2015-02-22 12:24:19 +01001164void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
1165 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +02001166{
Laurent Pincharta072f802015-02-22 12:24:18 +01001167 disable_outputs(dev, old_state);
Daniel Vetter4c18d302015-05-12 15:27:37 +02001168
1169 drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
1170
Laurent Pincharta072f802015-02-22 12:24:18 +01001171 crtc_set_mode(dev, old_state);
Daniel Vetter623369e2014-09-16 17:50:47 +02001172}
Daniel Vetter1af434a2015-02-22 12:24:19 +01001173EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
Daniel Vetter623369e2014-09-16 17:50:47 +02001174
1175/**
Daniel Vetter1af434a2015-02-22 12:24:19 +01001176 * drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs
Daniel Vetter623369e2014-09-16 17:50:47 +02001177 * @dev: DRM device
1178 * @old_state: atomic state object with old state structures
1179 *
Daniel Vetter1af434a2015-02-22 12:24:19 +01001180 * This function enables all the outputs with the new configuration which had to
1181 * be turned off for the update.
1182 *
Laurent Pinchart60acc4e2015-05-27 15:05:42 +03001183 * For compatibility with legacy crtc helpers this should be called after
Daniel Vetter1af434a2015-02-22 12:24:19 +01001184 * drm_atomic_helper_commit_planes(), which is what the default commit function
1185 * does. But drivers with different needs can group the modeset commits together
1186 * and do the plane commits at the end. This is useful for drivers doing runtime
1187 * PM since planes updates then only happen when the CRTC is actually enabled.
Daniel Vetter623369e2014-09-16 17:50:47 +02001188 */
Daniel Vetter1af434a2015-02-22 12:24:19 +01001189void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
1190 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +02001191{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001192 struct drm_crtc *crtc;
Laurent Pinchart0b20a0f2017-06-30 12:36:44 +03001193 struct drm_crtc_state *old_crtc_state;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001194 struct drm_crtc_state *new_crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001195 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001196 struct drm_connector_state *new_conn_state;
Daniel Vetter623369e2014-09-16 17:50:47 +02001197 int i;
1198
Laurent Pinchart0b20a0f2017-06-30 12:36:44 +03001199 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001200 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +02001201
1202 /* Need to filter out CRTCs where only planes change. */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001203 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +01001204 continue;
1205
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001206 if (!new_crtc_state->active)
Daniel Vetter623369e2014-09-16 17:50:47 +02001207 continue;
1208
1209 funcs = crtc->helper_private;
1210
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001211 if (new_crtc_state->enable) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +02001212 DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
1213 crtc->base.id, crtc->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +01001214
Laurent Pinchart0b20a0f2017-06-30 12:36:44 +03001215 if (funcs->atomic_enable)
1216 funcs->atomic_enable(crtc, old_crtc_state);
Daniel Vetteree0a89c2015-01-22 16:36:24 +01001217 else
1218 funcs->commit(crtc);
1219 }
Daniel Vetter623369e2014-09-16 17:50:47 +02001220 }
1221
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001222 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001223 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +02001224 struct drm_encoder *encoder;
1225
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001226 if (!new_conn_state->best_encoder)
Daniel Vetter623369e2014-09-16 17:50:47 +02001227 continue;
1228
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001229 if (!new_conn_state->crtc->state->active ||
1230 !drm_atomic_crtc_needs_modeset(new_conn_state->crtc->state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +01001231 continue;
1232
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001233 encoder = new_conn_state->best_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +02001234 funcs = encoder->helper_private;
1235
Daniel Vetter17a38d92015-02-22 12:24:16 +01001236 DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
1237 encoder->base.id, encoder->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +01001238
Daniel Vetter623369e2014-09-16 17:50:47 +02001239 /*
1240 * Each encoder has at most one connector (since we always steal
John Hunterf98bd3e2015-03-17 15:30:26 +08001241 * it away), so we won't call enable hooks twice.
Daniel Vetter623369e2014-09-16 17:50:47 +02001242 */
Archit Taneja862e6862015-05-21 11:03:16 +05301243 drm_bridge_pre_enable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +02001244
Noralf Trønnes28276352016-05-11 18:09:20 +02001245 if (funcs) {
1246 if (funcs->enable)
1247 funcs->enable(encoder);
1248 else if (funcs->commit)
1249 funcs->commit(encoder);
1250 }
Daniel Vetter623369e2014-09-16 17:50:47 +02001251
Archit Taneja862e6862015-05-21 11:03:16 +05301252 drm_bridge_enable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +02001253 }
1254}
Daniel Vetter1af434a2015-02-22 12:24:19 +01001255EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
Daniel Vetter623369e2014-09-16 17:50:47 +02001256
Rob Clark4c5b7f32016-03-18 19:14:55 -04001257/**
1258 * drm_atomic_helper_wait_for_fences - wait for fences stashed in plane state
1259 * @dev: DRM device
1260 * @state: atomic state object with old state structures
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001261 * @pre_swap: If true, do an interruptible wait, and @state is the new state.
1262 * Otherwise @state is the old state.
Rob Clark4c5b7f32016-03-18 19:14:55 -04001263 *
1264 * For implicit sync, driver should fish the exclusive fence out from the
1265 * incoming fb's and stash it in the drm_plane_state. This is called after
1266 * drm_atomic_helper_swap_state() so it uses the current plane state (and
1267 * just uses the atomic state to find the changed planes)
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001268 *
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001269 * Note that @pre_swap is needed since the point where we block for fences moves
1270 * around depending upon whether an atomic commit is blocking or
Gustavo Padovan42590372017-04-27 11:35:06 -03001271 * non-blocking. For non-blocking commit all waiting needs to happen after
1272 * drm_atomic_helper_swap_state() is called, but for blocking commits we want
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001273 * to wait **before** we do anything that can't be easily rolled back. That is
1274 * before we call drm_atomic_helper_swap_state().
1275 *
Chris Wilsonf54d1862016-10-25 13:00:45 +01001276 * Returns zero if success or < 0 if dma_fence_wait() fails.
Rob Clark4c5b7f32016-03-18 19:14:55 -04001277 */
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001278int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
1279 struct drm_atomic_state *state,
1280 bool pre_swap)
Daniel Vettere2330f02014-10-29 11:34:56 +01001281{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001282 struct drm_plane *plane;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001283 struct drm_plane_state *new_plane_state;
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001284 int i, ret;
Daniel Vettere2330f02014-10-29 11:34:56 +01001285
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001286 for_each_new_plane_in_state(state, plane, new_plane_state, i) {
1287 if (!new_plane_state->fence)
Daniel Vettere2330f02014-10-29 11:34:56 +01001288 continue;
1289
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001290 WARN_ON(!new_plane_state->fb);
Daniel Vettere2330f02014-10-29 11:34:56 +01001291
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001292 /*
1293 * If waiting for fences pre-swap (ie: nonblock), userspace can
1294 * still interrupt the operation. Instead of blocking until the
1295 * timer expires, make the wait interruptible.
1296 */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001297 ret = dma_fence_wait(new_plane_state->fence, pre_swap);
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001298 if (ret)
1299 return ret;
1300
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001301 dma_fence_put(new_plane_state->fence);
1302 new_plane_state->fence = NULL;
Daniel Vettere2330f02014-10-29 11:34:56 +01001303 }
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001304
1305 return 0;
Daniel Vettere2330f02014-10-29 11:34:56 +01001306}
Rob Clark4c5b7f32016-03-18 19:14:55 -04001307EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
Daniel Vettere2330f02014-10-29 11:34:56 +01001308
John Keepingc2409062016-01-19 10:46:58 +00001309/**
Rob Clark5ee32292014-11-11 19:38:59 -05001310 * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
1311 * @dev: DRM device
1312 * @old_state: atomic state object with old state structures
1313 *
1314 * Helper to, after atomic commit, wait for vblanks on all effected
1315 * crtcs (ie. before cleaning up old framebuffers using
Boris Brezillon01086482017-06-02 10:32:06 +02001316 * drm_atomic_helper_cleanup_planes()). It will only wait on CRTCs where the
Daniel Vetterab58e332014-11-24 20:42:42 +01001317 * framebuffers have actually changed to optimize for the legacy cursor and
1318 * plane update use-case.
Boris Brezillon01086482017-06-02 10:32:06 +02001319 *
1320 * Drivers using the nonblocking commit tracking support initialized by calling
1321 * drm_atomic_helper_setup_commit() should look at
1322 * drm_atomic_helper_wait_for_flip_done() as an alternative.
Rob Clark5ee32292014-11-11 19:38:59 -05001323 */
1324void
1325drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
1326 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +02001327{
1328 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001329 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +02001330 int i, ret;
Maarten Lankhorstbdc57142016-12-15 12:51:42 +01001331 unsigned crtc_mask = 0;
1332
1333 /*
1334 * Legacy cursor ioctls are completely unsynced, and userspace
1335 * relies on that (by doing tons of cursor updates).
1336 */
1337 if (old_state->legacy_cursor_update)
1338 return;
Daniel Vetter623369e2014-09-16 17:50:47 +02001339
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001340 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
Lucas Stacha76dfe32017-11-29 12:04:31 +01001341 if (!new_crtc_state->active)
Daniel Vetterab58e332014-11-24 20:42:42 +01001342 continue;
1343
Daniel Vetter623369e2014-09-16 17:50:47 +02001344 ret = drm_crtc_vblank_get(crtc);
1345 if (ret != 0)
1346 continue;
1347
Maarten Lankhorstbdc57142016-12-15 12:51:42 +01001348 crtc_mask |= drm_crtc_mask(crtc);
1349 old_state->crtcs[i].last_vblank_count = drm_crtc_vblank_count(crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +02001350 }
1351
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001352 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Maarten Lankhorstbdc57142016-12-15 12:51:42 +01001353 if (!(crtc_mask & drm_crtc_mask(crtc)))
Daniel Vetter623369e2014-09-16 17:50:47 +02001354 continue;
1355
1356 ret = wait_event_timeout(dev->vblank[i].queue,
Maarten Lankhorstbdc57142016-12-15 12:51:42 +01001357 old_state->crtcs[i].last_vblank_count !=
Thierry Redingd4853632015-08-12 17:00:35 +02001358 drm_crtc_vblank_count(crtc),
Daniel Vetter623369e2014-09-16 17:50:47 +02001359 msecs_to_jiffies(50));
1360
Russell King6ac7c542017-02-13 12:27:03 +00001361 WARN(!ret, "[CRTC:%d:%s] vblank wait timed out\n",
1362 crtc->base.id, crtc->name);
Ville Syrjälä8d4d0d72016-04-18 14:29:33 +03001363
Daniel Vetter623369e2014-09-16 17:50:47 +02001364 drm_crtc_vblank_put(crtc);
1365 }
1366}
Rob Clark5ee32292014-11-11 19:38:59 -05001367EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
Daniel Vetter623369e2014-09-16 17:50:47 +02001368
1369/**
Boris Brezillon01086482017-06-02 10:32:06 +02001370 * drm_atomic_helper_wait_for_flip_done - wait for all page flips to be done
1371 * @dev: DRM device
1372 * @old_state: atomic state object with old state structures
1373 *
1374 * Helper to, after atomic commit, wait for page flips on all effected
1375 * crtcs (ie. before cleaning up old framebuffers using
1376 * drm_atomic_helper_cleanup_planes()). Compared to
1377 * drm_atomic_helper_wait_for_vblanks() this waits for the completion of on all
1378 * CRTCs, assuming that cursors-only updates are signalling their completion
1379 * immediately (or using a different path).
1380 *
1381 * This requires that drivers use the nonblocking commit tracking support
1382 * initialized using drm_atomic_helper_setup_commit().
1383 */
1384void drm_atomic_helper_wait_for_flip_done(struct drm_device *dev,
1385 struct drm_atomic_state *old_state)
1386{
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02001387 struct drm_crtc_state *new_crtc_state;
Boris Brezillon01086482017-06-02 10:32:06 +02001388 struct drm_crtc *crtc;
1389 int i;
1390
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02001391 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
1392 struct drm_crtc_commit *commit = new_crtc_state->commit;
Boris Brezillon01086482017-06-02 10:32:06 +02001393 int ret;
1394
1395 if (!commit)
1396 continue;
1397
1398 ret = wait_for_completion_timeout(&commit->flip_done, 10 * HZ);
1399 if (ret == 0)
1400 DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1401 crtc->base.id, crtc->name);
1402 }
1403}
1404EXPORT_SYMBOL(drm_atomic_helper_wait_for_flip_done);
1405
1406/**
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001407 * drm_atomic_helper_commit_tail - commit atomic update to hardware
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001408 * @old_state: atomic state object with old state structures
Daniel Vetter623369e2014-09-16 17:50:47 +02001409 *
Daniel Vetter6806cdf2017-01-25 07:26:43 +01001410 * This is the default implementation for the
Maxime Ripard81a099a2017-07-20 15:01:16 +02001411 * &drm_mode_config_helper_funcs.atomic_commit_tail hook, for drivers
1412 * that do not support runtime_pm or do not need the CRTC to be
1413 * enabled to perform a commit. Otherwise, see
1414 * drm_atomic_helper_commit_tail_rpm().
Daniel Vetter623369e2014-09-16 17:50:47 +02001415 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001416 * Note that the default ordering of how the various stages are called is to
Maxime Ripard81a099a2017-07-20 15:01:16 +02001417 * match the legacy modeset helper library closest.
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001418 */
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001419void drm_atomic_helper_commit_tail(struct drm_atomic_state *old_state)
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001420{
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001421 struct drm_device *dev = old_state->dev;
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001422
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001423 drm_atomic_helper_commit_modeset_disables(dev, old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001424
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001425 drm_atomic_helper_commit_planes(dev, old_state, 0);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001426
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001427 drm_atomic_helper_commit_modeset_enables(dev, old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001428
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001429 drm_atomic_helper_commit_hw_done(old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001430
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001431 drm_atomic_helper_wait_for_vblanks(dev, old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001432
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001433 drm_atomic_helper_cleanup_planes(dev, old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001434}
1435EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
1436
Maxime Ripard81a099a2017-07-20 15:01:16 +02001437/**
1438 * drm_atomic_helper_commit_tail_rpm - commit atomic update to hardware
1439 * @old_state: new modeset state to be committed
1440 *
1441 * This is an alternative implementation for the
1442 * &drm_mode_config_helper_funcs.atomic_commit_tail hook, for drivers
1443 * that support runtime_pm or need the CRTC to be enabled to perform a
1444 * commit. Otherwise, one should use the default implementation
1445 * drm_atomic_helper_commit_tail().
1446 */
1447void drm_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state)
1448{
1449 struct drm_device *dev = old_state->dev;
1450
1451 drm_atomic_helper_commit_modeset_disables(dev, old_state);
1452
1453 drm_atomic_helper_commit_modeset_enables(dev, old_state);
1454
1455 drm_atomic_helper_commit_planes(dev, old_state,
1456 DRM_PLANE_COMMIT_ACTIVE_ONLY);
1457
1458 drm_atomic_helper_commit_hw_done(old_state);
1459
1460 drm_atomic_helper_wait_for_vblanks(dev, old_state);
1461
1462 drm_atomic_helper_cleanup_planes(dev, old_state);
1463}
1464EXPORT_SYMBOL(drm_atomic_helper_commit_tail_rpm);
1465
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001466static void commit_tail(struct drm_atomic_state *old_state)
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001467{
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001468 struct drm_device *dev = old_state->dev;
Laurent Pincharta4b10cc2017-01-02 11:16:13 +02001469 const struct drm_mode_config_helper_funcs *funcs;
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001470
1471 funcs = dev->mode_config.helper_private;
1472
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001473 drm_atomic_helper_wait_for_fences(dev, old_state, false);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001474
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001475 drm_atomic_helper_wait_for_dependencies(old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001476
1477 if (funcs && funcs->atomic_commit_tail)
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001478 funcs->atomic_commit_tail(old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001479 else
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001480 drm_atomic_helper_commit_tail(old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001481
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001482 drm_atomic_helper_commit_cleanup_done(old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001483
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001484 drm_atomic_state_put(old_state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001485}
1486
1487static void commit_work(struct work_struct *work)
1488{
1489 struct drm_atomic_state *state = container_of(work,
1490 struct drm_atomic_state,
1491 commit_work);
1492 commit_tail(state);
1493}
1494
1495/**
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001496 * drm_atomic_helper_async_check - check if state can be commited asynchronously
1497 * @dev: DRM device
1498 * @state: the driver state object
1499 *
1500 * This helper will check if it is possible to commit the state asynchronously.
1501 * Async commits are not supposed to swap the states like normal sync commits
1502 * but just do in-place changes on the current state.
1503 *
1504 * It will return 0 if the commit can happen in an asynchronous fashion or error
1505 * if not. Note that error just mean it can't be commited asynchronously, if it
1506 * fails the commit should be treated like a normal synchronous commit.
1507 */
1508int drm_atomic_helper_async_check(struct drm_device *dev,
1509 struct drm_atomic_state *state)
1510{
1511 struct drm_crtc *crtc;
1512 struct drm_crtc_state *crtc_state;
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001513 struct drm_plane *plane;
1514 struct drm_plane_state *old_plane_state, *new_plane_state;
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001515 const struct drm_plane_helper_funcs *funcs;
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001516 int i, n_planes = 0;
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001517
1518 for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
1519 if (drm_atomic_crtc_needs_modeset(crtc_state))
1520 return -EINVAL;
1521 }
1522
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001523 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i)
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001524 n_planes++;
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001525
1526 /* FIXME: we support only single plane updates for now */
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001527 if (n_planes != 1)
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001528 return -EINVAL;
1529
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001530 if (!new_plane_state->crtc)
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001531 return -EINVAL;
1532
1533 funcs = plane->helper_private;
1534 if (!funcs->atomic_async_update)
1535 return -EINVAL;
1536
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001537 if (new_plane_state->fence)
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001538 return -EINVAL;
1539
1540 /*
1541 * Don't do an async update if there is an outstanding commit modifying
1542 * the plane. This prevents our async update's changes from getting
1543 * overridden by a previous synchronous update's state.
1544 */
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001545 if (old_plane_state->commit &&
1546 !try_wait_for_completion(&old_plane_state->commit->hw_done))
1547 return -EBUSY;
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001548
Maarten Lankhorst669c9212017-09-04 12:48:38 +02001549 return funcs->atomic_async_check(plane, new_plane_state);
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001550}
1551EXPORT_SYMBOL(drm_atomic_helper_async_check);
1552
1553/**
1554 * drm_atomic_helper_async_commit - commit state asynchronously
1555 * @dev: DRM device
1556 * @state: the driver state object
1557 *
1558 * This function commits a state asynchronously, i.e., not vblank
1559 * synchronized. It should be used on a state only when
1560 * drm_atomic_async_check() succeeds. Async commits are not supposed to swap
1561 * the states like normal sync commits, but just do in-place changes on the
1562 * current state.
1563 */
1564void drm_atomic_helper_async_commit(struct drm_device *dev,
1565 struct drm_atomic_state *state)
1566{
1567 struct drm_plane *plane;
1568 struct drm_plane_state *plane_state;
1569 const struct drm_plane_helper_funcs *funcs;
1570 int i;
1571
1572 for_each_new_plane_in_state(state, plane, plane_state, i) {
1573 funcs = plane->helper_private;
1574 funcs->atomic_async_update(plane, plane_state);
1575 }
1576}
1577EXPORT_SYMBOL(drm_atomic_helper_async_commit);
1578
1579/**
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001580 * drm_atomic_helper_commit - commit validated state object
1581 * @dev: DRM device
1582 * @state: the driver state object
1583 * @nonblock: whether nonblocking behavior is requested.
1584 *
1585 * This function commits a with drm_atomic_helper_check() pre-validated state
1586 * object. This can still fail when e.g. the framebuffer reservation fails. This
1587 * function implements nonblocking commits, using
1588 * drm_atomic_helper_setup_commit() and related functions.
1589 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001590 * Committing the actual hardware state is done through the
Daniel Vetter6806cdf2017-01-25 07:26:43 +01001591 * &drm_mode_config_helper_funcs.atomic_commit_tail callback, or it's default
1592 * implementation drm_atomic_helper_commit_tail().
Daniel Vetter6e48ae32015-09-08 13:52:45 +02001593 *
Daniel Vetterc39032a2016-06-08 14:19:19 +02001594 * RETURNS:
Daniel Vetter623369e2014-09-16 17:50:47 +02001595 * Zero for success or -errno.
1596 */
1597int drm_atomic_helper_commit(struct drm_device *dev,
1598 struct drm_atomic_state *state,
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001599 bool nonblock)
Daniel Vetter623369e2014-09-16 17:50:47 +02001600{
1601 int ret;
1602
Gustavo Padovanfef9df82017-06-30 15:03:17 -03001603 if (state->async_update) {
1604 ret = drm_atomic_helper_prepare_planes(dev, state);
1605 if (ret)
1606 return ret;
1607
1608 drm_atomic_helper_async_commit(dev, state);
1609 drm_atomic_helper_cleanup_planes(dev, state);
1610
1611 return 0;
1612 }
1613
Daniel Vettera095caa2016-06-08 17:15:36 +02001614 ret = drm_atomic_helper_setup_commit(state, nonblock);
1615 if (ret)
1616 return ret;
1617
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001618 INIT_WORK(&state->commit_work, commit_work);
1619
Daniel Vetter623369e2014-09-16 17:50:47 +02001620 ret = drm_atomic_helper_prepare_planes(dev, state);
1621 if (ret)
1622 return ret;
1623
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001624 if (!nonblock) {
1625 ret = drm_atomic_helper_wait_for_fences(dev, state, true);
Maarten Lankhorstc066d232017-07-11 16:33:04 +02001626 if (ret)
1627 goto err;
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001628 }
1629
Daniel Vetter623369e2014-09-16 17:50:47 +02001630 /*
1631 * This is the point of no return - everything below never fails except
1632 * when the hw goes bonghits. Which means we can commit the new state on
1633 * the software side now.
1634 */
1635
Maarten Lankhorstc066d232017-07-11 16:33:04 +02001636 ret = drm_atomic_helper_swap_state(state, true);
1637 if (ret)
1638 goto err;
Daniel Vetter623369e2014-09-16 17:50:47 +02001639
1640 /*
1641 * Everything below can be run asynchronously without the need to grab
John Hunterf98bd3e2015-03-17 15:30:26 +08001642 * any modeset locks at all under one condition: It must be guaranteed
Daniel Vetter623369e2014-09-16 17:50:47 +02001643 * that the asynchronous work has either been cancelled (if the driver
1644 * supports it, which at least requires that the framebuffers get
1645 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
1646 * before the new state gets committed on the software side with
1647 * drm_atomic_helper_swap_state().
1648 *
1649 * This scheme allows new atomic state updates to be prepared and
1650 * checked in parallel to the asynchronous completion of the previous
1651 * update. Which is important since compositors need to figure out the
1652 * composition of the next frame right after having submitted the
1653 * current layout.
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001654 *
1655 * NOTE: Commit work has multiple phases, first hardware commit, then
1656 * cleanup. We want them to overlap, hence need system_unbound_wq to
1657 * make sure work items don't artifically stall on each another.
Daniel Vetter623369e2014-09-16 17:50:47 +02001658 */
1659
Chris Wilson08536952016-10-14 13:18:18 +01001660 drm_atomic_state_get(state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001661 if (nonblock)
1662 queue_work(system_unbound_wq, &state->commit_work);
1663 else
1664 commit_tail(state);
Daniel Vetter623369e2014-09-16 17:50:47 +02001665
1666 return 0;
Maarten Lankhorstc066d232017-07-11 16:33:04 +02001667
1668err:
1669 drm_atomic_helper_cleanup_planes(dev, state);
1670 return ret;
Daniel Vetter623369e2014-09-16 17:50:47 +02001671}
1672EXPORT_SYMBOL(drm_atomic_helper_commit);
1673
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001674/**
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001675 * DOC: implementing nonblocking commit
Daniel Vettere8c833a2014-07-27 18:30:19 +02001676 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001677 * Nonblocking atomic commits have to be implemented in the following sequence:
Daniel Vettere8c833a2014-07-27 18:30:19 +02001678 *
1679 * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function
1680 * which commit needs to call which can fail, so we want to run it first and
1681 * synchronously.
1682 *
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001683 * 2. Synchronize with any outstanding nonblocking commit worker threads which
Daniel Vettere8c833a2014-07-27 18:30:19 +02001684 * might be affected the new state update. This can be done by either cancelling
1685 * or flushing the work items, depending upon whether the driver can deal with
1686 * cancelled updates. Note that it is important to ensure that the framebuffer
1687 * cleanup is still done when cancelling.
1688 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001689 * Asynchronous workers need to have sufficient parallelism to be able to run
1690 * different atomic commits on different CRTCs in parallel. The simplest way to
1691 * achive this is by running them on the &system_unbound_wq work queue. Note
1692 * that drivers are not required to split up atomic commits and run an
1693 * individual commit in parallel - userspace is supposed to do that if it cares.
1694 * But it might be beneficial to do that for modesets, since those necessarily
1695 * must be done as one global operation, and enabling or disabling a CRTC can
1696 * take a long time. But even that is not required.
Daniel Vettere8c833a2014-07-27 18:30:19 +02001697 *
1698 * 3. The software state is updated synchronously with
Daniel Vetter26196f72015-08-25 16:26:03 +02001699 * drm_atomic_helper_swap_state(). Doing this under the protection of all modeset
Daniel Vettere8c833a2014-07-27 18:30:19 +02001700 * locks means concurrent callers never see inconsistent state. And doing this
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001701 * while it's guaranteed that no relevant nonblocking worker runs means that
1702 * nonblocking workers do not need grab any locks. Actually they must not grab
1703 * locks, for otherwise the work flushing will deadlock.
Daniel Vettere8c833a2014-07-27 18:30:19 +02001704 *
1705 * 4. Schedule a work item to do all subsequent steps, using the split-out
1706 * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and
1707 * then cleaning up the framebuffers after the old framebuffer is no longer
1708 * being displayed.
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001709 *
1710 * The above scheme is implemented in the atomic helper libraries in
1711 * drm_atomic_helper_commit() using a bunch of helper functions. See
1712 * drm_atomic_helper_setup_commit() for a starting point.
Daniel Vettere8c833a2014-07-27 18:30:19 +02001713 */
1714
Daniel Vettera095caa2016-06-08 17:15:36 +02001715static int stall_checks(struct drm_crtc *crtc, bool nonblock)
1716{
1717 struct drm_crtc_commit *commit, *stall_commit = NULL;
1718 bool completed = true;
1719 int i;
1720 long ret = 0;
1721
1722 spin_lock(&crtc->commit_lock);
1723 i = 0;
1724 list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
1725 if (i == 0) {
1726 completed = try_wait_for_completion(&commit->flip_done);
1727 /* Userspace is not allowed to get ahead of the previous
1728 * commit with nonblocking ones. */
1729 if (!completed && nonblock) {
1730 spin_unlock(&crtc->commit_lock);
1731 return -EBUSY;
1732 }
1733 } else if (i == 1) {
Maarten Lankhorstf46640b2017-09-04 12:48:36 +02001734 stall_commit = drm_crtc_commit_get(commit);
Daniel Vettera095caa2016-06-08 17:15:36 +02001735 break;
Daniel Vetter723c3e52016-06-14 19:50:58 +02001736 }
Daniel Vettera095caa2016-06-08 17:15:36 +02001737
1738 i++;
1739 }
1740 spin_unlock(&crtc->commit_lock);
1741
1742 if (!stall_commit)
1743 return 0;
1744
1745 /* We don't want to let commits get ahead of cleanup work too much,
1746 * stalling on 2nd previous commit means triple-buffer won't ever stall.
1747 */
Daniel Vetter723c3e52016-06-14 19:50:58 +02001748 ret = wait_for_completion_interruptible_timeout(&stall_commit->cleanup_done,
Daniel Vettera095caa2016-06-08 17:15:36 +02001749 10*HZ);
1750 if (ret == 0)
1751 DRM_ERROR("[CRTC:%d:%s] cleanup_done timed out\n",
1752 crtc->base.id, crtc->name);
1753
1754 drm_crtc_commit_put(stall_commit);
1755
1756 return ret < 0 ? ret : 0;
1757}
1758
Wei Yongjun899cc5f2017-01-12 14:21:57 +00001759static void release_crtc_commit(struct completion *completion)
Daniel Vetter24835e42016-12-21 11:23:30 +01001760{
1761 struct drm_crtc_commit *commit = container_of(completion,
1762 typeof(*commit),
1763 flip_done);
1764
1765 drm_crtc_commit_put(commit);
1766}
1767
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001768static void init_commit(struct drm_crtc_commit *commit, struct drm_crtc *crtc)
1769{
1770 init_completion(&commit->flip_done);
1771 init_completion(&commit->hw_done);
1772 init_completion(&commit->cleanup_done);
1773 INIT_LIST_HEAD(&commit->commit_entry);
1774 kref_init(&commit->ref);
1775 commit->crtc = crtc;
1776}
1777
1778static struct drm_crtc_commit *
1779crtc_or_fake_commit(struct drm_atomic_state *state, struct drm_crtc *crtc)
1780{
1781 if (crtc) {
1782 struct drm_crtc_state *new_crtc_state;
1783
1784 new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
1785
1786 return new_crtc_state->commit;
1787 }
1788
1789 if (!state->fake_commit) {
1790 state->fake_commit = kzalloc(sizeof(*state->fake_commit), GFP_KERNEL);
1791 if (!state->fake_commit)
1792 return NULL;
1793
1794 init_commit(state->fake_commit, NULL);
1795 }
1796
1797 return state->fake_commit;
1798}
1799
Daniel Vettera095caa2016-06-08 17:15:36 +02001800/**
1801 * drm_atomic_helper_setup_commit - setup possibly nonblocking commit
1802 * @state: new modeset state to be committed
1803 * @nonblock: whether nonblocking behavior is requested.
1804 *
1805 * This function prepares @state to be used by the atomic helper's support for
1806 * nonblocking commits. Drivers using the nonblocking commit infrastructure
Daniel Vetter6806cdf2017-01-25 07:26:43 +01001807 * should always call this function from their
1808 * &drm_mode_config_funcs.atomic_commit hook.
Daniel Vettera095caa2016-06-08 17:15:36 +02001809 *
1810 * To be able to use this support drivers need to use a few more helper
1811 * functions. drm_atomic_helper_wait_for_dependencies() must be called before
1812 * actually committing the hardware state, and for nonblocking commits this call
1813 * must be placed in the async worker. See also drm_atomic_helper_swap_state()
1814 * and it's stall parameter, for when a driver's commit hooks look at the
Daniel Vetter6806cdf2017-01-25 07:26:43 +01001815 * &drm_crtc.state, &drm_plane.state or &drm_connector.state pointer directly.
Daniel Vettera095caa2016-06-08 17:15:36 +02001816 *
1817 * Completion of the hardware commit step must be signalled using
1818 * drm_atomic_helper_commit_hw_done(). After this step the driver is not allowed
1819 * to read or change any permanent software or hardware modeset state. The only
1820 * exception is state protected by other means than &drm_modeset_lock locks.
1821 * Only the free standing @state with pointers to the old state structures can
1822 * be inspected, e.g. to clean up old buffers using
1823 * drm_atomic_helper_cleanup_planes().
1824 *
1825 * At the very end, before cleaning up @state drivers must call
1826 * drm_atomic_helper_commit_cleanup_done().
1827 *
1828 * This is all implemented by in drm_atomic_helper_commit(), giving drivers a
Thierry Reding9ac07812017-10-12 16:06:16 +02001829 * complete and easy-to-use default implementation of the atomic_commit() hook.
Daniel Vettera095caa2016-06-08 17:15:36 +02001830 *
1831 * The tracking of asynchronously executed and still pending commits is done
1832 * using the core structure &drm_crtc_commit.
1833 *
1834 * By default there's no need to clean up resources allocated by this function
1835 * explicitly: drm_atomic_state_default_clear() will take care of that
1836 * automatically.
1837 *
1838 * Returns:
1839 *
1840 * 0 on success. -EBUSY when userspace schedules nonblocking commits too fast,
1841 * -ENOMEM on allocation failures and -EINTR when a signal is pending.
1842 */
1843int drm_atomic_helper_setup_commit(struct drm_atomic_state *state,
1844 bool nonblock)
1845{
1846 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001847 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001848 struct drm_connector *conn;
1849 struct drm_connector_state *old_conn_state, *new_conn_state;
1850 struct drm_plane *plane;
1851 struct drm_plane_state *old_plane_state, *new_plane_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02001852 struct drm_crtc_commit *commit;
1853 int i, ret;
1854
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001855 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
Daniel Vettera095caa2016-06-08 17:15:36 +02001856 commit = kzalloc(sizeof(*commit), GFP_KERNEL);
1857 if (!commit)
1858 return -ENOMEM;
1859
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001860 init_commit(commit, crtc);
Daniel Vettera095caa2016-06-08 17:15:36 +02001861
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02001862 new_crtc_state->commit = commit;
Daniel Vettera095caa2016-06-08 17:15:36 +02001863
1864 ret = stall_checks(crtc, nonblock);
1865 if (ret)
1866 return ret;
1867
1868 /* Drivers only send out events when at least either current or
1869 * new CRTC state is active. Complete right away if everything
1870 * stays off. */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001871 if (!old_crtc_state->active && !new_crtc_state->active) {
Daniel Vettera095caa2016-06-08 17:15:36 +02001872 complete_all(&commit->flip_done);
1873 continue;
1874 }
1875
1876 /* Legacy cursor updates are fully unsynced. */
1877 if (state->legacy_cursor_update) {
1878 complete_all(&commit->flip_done);
1879 continue;
1880 }
1881
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001882 if (!new_crtc_state->event) {
Daniel Vettera095caa2016-06-08 17:15:36 +02001883 commit->event = kzalloc(sizeof(*commit->event),
1884 GFP_KERNEL);
1885 if (!commit->event)
1886 return -ENOMEM;
1887
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001888 new_crtc_state->event = commit->event;
Daniel Vettera095caa2016-06-08 17:15:36 +02001889 }
1890
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01001891 new_crtc_state->event->base.completion = &commit->flip_done;
1892 new_crtc_state->event->base.completion_release = release_crtc_commit;
Daniel Vetter24835e42016-12-21 11:23:30 +01001893 drm_crtc_commit_get(commit);
Leo (Sunpeng) Li1c6ceee2018-01-17 12:51:08 +01001894
1895 commit->abort_completion = true;
Daniel Vettera095caa2016-06-08 17:15:36 +02001896 }
1897
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001898 for_each_oldnew_connector_in_state(state, conn, old_conn_state, new_conn_state, i) {
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001899 /* Userspace is not allowed to get ahead of the previous
1900 * commit with nonblocking ones. */
1901 if (nonblock && old_conn_state->commit &&
1902 !try_wait_for_completion(&old_conn_state->commit->flip_done))
1903 return -EBUSY;
1904
Daniel Vetter1f2d9bd2017-11-10 11:53:12 +01001905 /* Always track connectors explicitly for e.g. link retraining. */
1906 commit = crtc_or_fake_commit(state, new_conn_state->crtc ?: old_conn_state->crtc);
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001907 if (!commit)
1908 return -ENOMEM;
1909
1910 new_conn_state->commit = drm_crtc_commit_get(commit);
1911 }
1912
1913 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001914 /* Userspace is not allowed to get ahead of the previous
1915 * commit with nonblocking ones. */
1916 if (nonblock && old_plane_state->commit &&
1917 !try_wait_for_completion(&old_plane_state->commit->flip_done))
1918 return -EBUSY;
1919
Daniel Vetter1f2d9bd2017-11-10 11:53:12 +01001920 /* Always track planes explicitly for async pageflip support. */
Maarten Lankhorst4edd6082017-10-17 07:20:47 +02001921 commit = crtc_or_fake_commit(state, new_plane_state->crtc ?: old_plane_state->crtc);
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001922 if (!commit)
1923 return -ENOMEM;
1924
1925 new_plane_state->commit = drm_crtc_commit_get(commit);
1926 }
1927
Daniel Vettera095caa2016-06-08 17:15:36 +02001928 return 0;
1929}
1930EXPORT_SYMBOL(drm_atomic_helper_setup_commit);
1931
Daniel Vettera095caa2016-06-08 17:15:36 +02001932/**
1933 * drm_atomic_helper_wait_for_dependencies - wait for required preceeding commits
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001934 * @old_state: atomic state object with old state structures
Daniel Vettera095caa2016-06-08 17:15:36 +02001935 *
1936 * This function waits for all preceeding commits that touch the same CRTC as
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001937 * @old_state to both be committed to the hardware (as signalled by
Daniel Vettera095caa2016-06-08 17:15:36 +02001938 * drm_atomic_helper_commit_hw_done) and executed by the hardware (as signalled
Thierry Reding277b09c2017-10-12 16:08:57 +02001939 * by calling drm_crtc_send_vblank_event() on the &drm_crtc_state.event).
Daniel Vettera095caa2016-06-08 17:15:36 +02001940 *
1941 * This is part of the atomic helper support for nonblocking commits, see
1942 * drm_atomic_helper_setup_commit() for an overview.
1943 */
Daniel Vetter1ea0c022016-11-21 18:18:02 +01001944void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *old_state)
Daniel Vettera095caa2016-06-08 17:15:36 +02001945{
1946 struct drm_crtc *crtc;
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02001947 struct drm_crtc_state *old_crtc_state;
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001948 struct drm_plane *plane;
1949 struct drm_plane_state *old_plane_state;
1950 struct drm_connector *conn;
1951 struct drm_connector_state *old_conn_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02001952 struct drm_crtc_commit *commit;
1953 int i;
1954 long ret;
1955
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02001956 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1957 commit = old_crtc_state->commit;
Daniel Vettera095caa2016-06-08 17:15:36 +02001958
1959 if (!commit)
1960 continue;
1961
1962 ret = wait_for_completion_timeout(&commit->hw_done,
1963 10*HZ);
1964 if (ret == 0)
1965 DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
1966 crtc->base.id, crtc->name);
1967
1968 /* Currently no support for overwriting flips, hence
1969 * stall for previous one to execute completely. */
1970 ret = wait_for_completion_timeout(&commit->flip_done,
1971 10*HZ);
1972 if (ret == 0)
1973 DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1974 crtc->base.id, crtc->name);
Daniel Vettera095caa2016-06-08 17:15:36 +02001975 }
Daniel Vettera095caa2016-06-08 17:15:36 +02001976
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02001977 for_each_old_connector_in_state(old_state, conn, old_conn_state, i) {
1978 commit = old_conn_state->commit;
1979
1980 if (!commit)
1981 continue;
1982
1983 ret = wait_for_completion_timeout(&commit->hw_done,
1984 10*HZ);
1985 if (ret == 0)
1986 DRM_ERROR("[CONNECTOR:%d:%s] hw_done timed out\n",
1987 conn->base.id, conn->name);
1988
1989 /* Currently no support for overwriting flips, hence
1990 * stall for previous one to execute completely. */
1991 ret = wait_for_completion_timeout(&commit->flip_done,
1992 10*HZ);
1993 if (ret == 0)
1994 DRM_ERROR("[CONNECTOR:%d:%s] flip_done timed out\n",
1995 conn->base.id, conn->name);
1996 }
1997
1998 for_each_old_plane_in_state(old_state, plane, old_plane_state, i) {
1999 commit = old_plane_state->commit;
2000
2001 if (!commit)
2002 continue;
2003
2004 ret = wait_for_completion_timeout(&commit->hw_done,
2005 10*HZ);
2006 if (ret == 0)
2007 DRM_ERROR("[PLANE:%d:%s] hw_done timed out\n",
2008 plane->base.id, plane->name);
2009
2010 /* Currently no support for overwriting flips, hence
2011 * stall for previous one to execute completely. */
2012 ret = wait_for_completion_timeout(&commit->flip_done,
2013 10*HZ);
2014 if (ret == 0)
2015 DRM_ERROR("[PLANE:%d:%s] flip_done timed out\n",
2016 plane->base.id, plane->name);
Daniel Vettera095caa2016-06-08 17:15:36 +02002017 }
2018}
2019EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
2020
2021/**
2022 * drm_atomic_helper_commit_hw_done - setup possible nonblocking commit
Daniel Vetter1ea0c022016-11-21 18:18:02 +01002023 * @old_state: atomic state object with old state structures
Daniel Vettera095caa2016-06-08 17:15:36 +02002024 *
2025 * This function is used to signal completion of the hardware commit step. After
2026 * this step the driver is not allowed to read or change any permanent software
2027 * or hardware modeset state. The only exception is state protected by other
2028 * means than &drm_modeset_lock locks.
2029 *
2030 * Drivers should try to postpone any expensive or delayed cleanup work after
2031 * this function is called.
2032 *
2033 * This is part of the atomic helper support for nonblocking commits, see
2034 * drm_atomic_helper_setup_commit() for an overview.
2035 */
Daniel Vetter1ea0c022016-11-21 18:18:02 +01002036void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *old_state)
Daniel Vettera095caa2016-06-08 17:15:36 +02002037{
2038 struct drm_crtc *crtc;
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002039 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02002040 struct drm_crtc_commit *commit;
2041 int i;
2042
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002043 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2044 commit = new_crtc_state->commit;
Daniel Vettera095caa2016-06-08 17:15:36 +02002045 if (!commit)
2046 continue;
2047
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002048 /*
2049 * copy new_crtc_state->commit to old_crtc_state->commit,
2050 * it's unsafe to touch new_crtc_state after hw_done,
2051 * but we still need to do so in cleanup_done().
2052 */
2053 if (old_crtc_state->commit)
2054 drm_crtc_commit_put(old_crtc_state->commit);
2055
2056 old_crtc_state->commit = drm_crtc_commit_get(commit);
2057
Daniel Vettera095caa2016-06-08 17:15:36 +02002058 /* backend must have consumed any event by now */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002059 WARN_ON(new_crtc_state->event);
Daniel Vettera095caa2016-06-08 17:15:36 +02002060 complete_all(&commit->hw_done);
Daniel Vettera095caa2016-06-08 17:15:36 +02002061 }
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02002062
2063 if (old_state->fake_commit) {
2064 complete_all(&old_state->fake_commit->hw_done);
2065 complete_all(&old_state->fake_commit->flip_done);
2066 }
Daniel Vettera095caa2016-06-08 17:15:36 +02002067}
2068EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
2069
2070/**
2071 * drm_atomic_helper_commit_cleanup_done - signal completion of commit
Daniel Vetter1ea0c022016-11-21 18:18:02 +01002072 * @old_state: atomic state object with old state structures
Daniel Vettera095caa2016-06-08 17:15:36 +02002073 *
Daniel Vetter1ea0c022016-11-21 18:18:02 +01002074 * This signals completion of the atomic update @old_state, including any
2075 * cleanup work. If used, it must be called right before calling
Chris Wilson08536952016-10-14 13:18:18 +01002076 * drm_atomic_state_put().
Daniel Vettera095caa2016-06-08 17:15:36 +02002077 *
2078 * This is part of the atomic helper support for nonblocking commits, see
2079 * drm_atomic_helper_setup_commit() for an overview.
2080 */
Daniel Vetter1ea0c022016-11-21 18:18:02 +01002081void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
Daniel Vettera095caa2016-06-08 17:15:36 +02002082{
2083 struct drm_crtc *crtc;
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002084 struct drm_crtc_state *old_crtc_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02002085 struct drm_crtc_commit *commit;
2086 int i;
Daniel Vettera095caa2016-06-08 17:15:36 +02002087
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002088 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
2089 commit = old_crtc_state->commit;
Daniel Vettera095caa2016-06-08 17:15:36 +02002090 if (WARN_ON(!commit))
2091 continue;
2092
Daniel Vettera095caa2016-06-08 17:15:36 +02002093 complete_all(&commit->cleanup_done);
2094 WARN_ON(!try_wait_for_completion(&commit->hw_done));
2095
Daniel Vetter7141fd32017-06-21 11:16:27 +02002096 spin_lock(&crtc->commit_lock);
Daniel Vettera095caa2016-06-08 17:15:36 +02002097 list_del(&commit->commit_entry);
2098 spin_unlock(&crtc->commit_lock);
2099 }
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02002100
2101 if (old_state->fake_commit)
2102 complete_all(&old_state->fake_commit->cleanup_done);
Daniel Vettera095caa2016-06-08 17:15:36 +02002103}
2104EXPORT_SYMBOL(drm_atomic_helper_commit_cleanup_done);
2105
Daniel Vettere8c833a2014-07-27 18:30:19 +02002106/**
Daniel Vetter2e3afd42015-02-26 14:17:38 +01002107 * drm_atomic_helper_prepare_planes - prepare plane resources before commit
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002108 * @dev: DRM device
Daniel Vetter2e3afd42015-02-26 14:17:38 +01002109 * @state: atomic state object with new state structures
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002110 *
2111 * This function prepares plane state, specifically framebuffers, for the new
Daniel Vetter6806cdf2017-01-25 07:26:43 +01002112 * configuration, by calling &drm_plane_helper_funcs.prepare_fb. If any failure
2113 * is encountered this function will call &drm_plane_helper_funcs.cleanup_fb on
2114 * any already successfully prepared framebuffer.
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002115 *
2116 * Returns:
2117 * 0 on success, negative error code on failure.
2118 */
2119int drm_atomic_helper_prepare_planes(struct drm_device *dev,
2120 struct drm_atomic_state *state)
2121{
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002122 struct drm_plane *plane;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002123 struct drm_plane_state *new_plane_state;
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002124 int ret, i, j;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002125
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002126 for_each_new_plane_in_state(state, plane, new_plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02002127 const struct drm_plane_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002128
2129 funcs = plane->helper_private;
2130
Maarten Lankhorst844f9112015-09-02 10:42:40 +02002131 if (funcs->prepare_fb) {
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002132 ret = funcs->prepare_fb(plane, new_plane_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002133 if (ret)
2134 goto fail;
2135 }
2136 }
2137
2138 return 0;
2139
2140fail:
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002141 for_each_new_plane_in_state(state, plane, new_plane_state, j) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02002142 const struct drm_plane_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002143
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002144 if (j >= i)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002145 continue;
2146
2147 funcs = plane->helper_private;
2148
Maarten Lankhorst844f9112015-09-02 10:42:40 +02002149 if (funcs->cleanup_fb)
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002150 funcs->cleanup_fb(plane, new_plane_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002151 }
2152
2153 return ret;
2154}
2155EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
2156
Ville Syrjälä7135ac52016-09-19 16:33:42 +03002157static bool plane_crtc_active(const struct drm_plane_state *state)
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02002158{
2159 return state->crtc && state->crtc->state->active;
2160}
2161
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002162/**
2163 * drm_atomic_helper_commit_planes - commit plane state
2164 * @dev: DRM device
Daniel Vetterb0fcfc82014-11-19 18:38:11 +01002165 * @old_state: atomic state object with old state structures
Liu Ying2b58e982016-08-29 17:12:03 +08002166 * @flags: flags for committing plane state
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002167 *
2168 * This function commits the new plane state using the plane and atomic helper
2169 * functions for planes and crtcs. It assumes that the atomic state has already
2170 * been pushed into the relevant object state pointers, since this step can no
2171 * longer fail.
2172 *
Daniel Vetterb0fcfc82014-11-19 18:38:11 +01002173 * It still requires the global state object @old_state to know which planes and
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002174 * crtcs need to be updated though.
Maarten Lankhorstde28d022015-05-19 16:41:01 +02002175 *
2176 * Note that this function does all plane updates across all CRTCs in one step.
2177 * If the hardware can't support this approach look at
2178 * drm_atomic_helper_commit_planes_on_crtc() instead.
Daniel Vetter6e48ae32015-09-08 13:52:45 +02002179 *
2180 * Plane parameters can be updated by applications while the associated CRTC is
2181 * disabled. The DRM/KMS core will store the parameters in the plane state,
2182 * which will be available to the driver when the CRTC is turned on. As a result
2183 * most drivers don't need to be immediately notified of plane updates for a
2184 * disabled CRTC.
2185 *
Liu Ying2b58e982016-08-29 17:12:03 +08002186 * Unless otherwise needed, drivers are advised to set the ACTIVE_ONLY flag in
2187 * @flags in order not to receive plane update notifications related to a
2188 * disabled CRTC. This avoids the need to manually ignore plane updates in
Daniel Vetter6e48ae32015-09-08 13:52:45 +02002189 * driver code when the driver and/or hardware can't or just don't need to deal
2190 * with updates on disabled CRTCs, for example when supporting runtime PM.
2191 *
Liu Ying2b58e982016-08-29 17:12:03 +08002192 * Drivers may set the NO_DISABLE_AFTER_MODESET flag in @flags if the relevant
2193 * display controllers require to disable a CRTC's planes when the CRTC is
Daniel Vetter6806cdf2017-01-25 07:26:43 +01002194 * disabled. This function would skip the &drm_plane_helper_funcs.atomic_disable
2195 * call for a plane if the CRTC of the old plane state needs a modesetting
2196 * operation. Of course, the drivers need to disable the planes in their CRTC
2197 * disable callbacks since no one else would do that.
Liu Ying2b58e982016-08-29 17:12:03 +08002198 *
2199 * The drm_atomic_helper_commit() default implementation doesn't set the
2200 * ACTIVE_ONLY flag to most closely match the behaviour of the legacy helpers.
2201 * This should not be copied blindly by drivers.
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002202 */
2203void drm_atomic_helper_commit_planes(struct drm_device *dev,
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02002204 struct drm_atomic_state *old_state,
Liu Ying2b58e982016-08-29 17:12:03 +08002205 uint32_t flags)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002206{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002207 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002208 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002209 struct drm_plane *plane;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002210 struct drm_plane_state *old_plane_state, *new_plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002211 int i;
Liu Ying2b58e982016-08-29 17:12:03 +08002212 bool active_only = flags & DRM_PLANE_COMMIT_ACTIVE_ONLY;
2213 bool no_disable = flags & DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002214
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002215 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02002216 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002217
2218 funcs = crtc->helper_private;
2219
2220 if (!funcs || !funcs->atomic_begin)
2221 continue;
2222
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002223 if (active_only && !new_crtc_state->active)
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02002224 continue;
2225
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02002226 funcs->atomic_begin(crtc, old_crtc_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002227 }
2228
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002229 for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02002230 const struct drm_plane_helper_funcs *funcs;
Laurent Pinchart216c59d2015-09-11 00:07:19 +03002231 bool disabling;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002232
2233 funcs = plane->helper_private;
2234
Thierry Reding3cad4b62014-11-25 13:05:12 +01002235 if (!funcs)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002236 continue;
2237
Maarten Lankhorst51ffa122017-02-16 15:47:07 +01002238 disabling = drm_atomic_plane_disabling(old_plane_state,
2239 new_plane_state);
Laurent Pinchart216c59d2015-09-11 00:07:19 +03002240
2241 if (active_only) {
2242 /*
2243 * Skip planes related to inactive CRTCs. If the plane
2244 * is enabled use the state of the current CRTC. If the
2245 * plane is being disabled use the state of the old
2246 * CRTC to avoid skipping planes being disabled on an
2247 * active CRTC.
2248 */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002249 if (!disabling && !plane_crtc_active(new_plane_state))
Laurent Pinchart216c59d2015-09-11 00:07:19 +03002250 continue;
2251 if (disabling && !plane_crtc_active(old_plane_state))
2252 continue;
2253 }
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02002254
Thierry Reding407b8bd2014-11-20 12:05:50 +01002255 /*
2256 * Special-case disabling the plane if drivers support it.
2257 */
Liu Ying2b58e982016-08-29 17:12:03 +08002258 if (disabling && funcs->atomic_disable) {
2259 struct drm_crtc_state *crtc_state;
2260
2261 crtc_state = old_plane_state->crtc->state;
2262
2263 if (drm_atomic_crtc_needs_modeset(crtc_state) &&
2264 no_disable)
2265 continue;
2266
Thierry Reding407b8bd2014-11-20 12:05:50 +01002267 funcs->atomic_disable(plane, old_plane_state);
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002268 } else if (new_plane_state->crtc || disabling) {
Thierry Reding407b8bd2014-11-20 12:05:50 +01002269 funcs->atomic_update(plane, old_plane_state);
Liu Ying2b58e982016-08-29 17:12:03 +08002270 }
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002271 }
2272
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002273 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02002274 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002275
2276 funcs = crtc->helper_private;
2277
2278 if (!funcs || !funcs->atomic_flush)
2279 continue;
2280
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002281 if (active_only && !new_crtc_state->active)
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02002282 continue;
2283
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02002284 funcs->atomic_flush(crtc, old_crtc_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002285 }
2286}
2287EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
2288
2289/**
Maarten Lankhorstde28d022015-05-19 16:41:01 +02002290 * drm_atomic_helper_commit_planes_on_crtc - commit plane state for a crtc
2291 * @old_crtc_state: atomic state object with the old crtc state
2292 *
2293 * This function commits the new plane state using the plane and atomic helper
2294 * functions for planes on the specific crtc. It assumes that the atomic state
2295 * has already been pushed into the relevant object state pointers, since this
2296 * step can no longer fail.
2297 *
2298 * This function is useful when plane updates should be done crtc-by-crtc
2299 * instead of one global step like drm_atomic_helper_commit_planes() does.
2300 *
2301 * This function can only be savely used when planes are not allowed to move
2302 * between different CRTCs because this function doesn't handle inter-CRTC
2303 * depencies. Callers need to ensure that either no such depencies exist,
2304 * resolve them through ordering of commit calls or through some other means.
2305 */
2306void
2307drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
2308{
2309 const struct drm_crtc_helper_funcs *crtc_funcs;
2310 struct drm_crtc *crtc = old_crtc_state->crtc;
2311 struct drm_atomic_state *old_state = old_crtc_state->state;
2312 struct drm_plane *plane;
2313 unsigned plane_mask;
2314
2315 plane_mask = old_crtc_state->plane_mask;
2316 plane_mask |= crtc->state->plane_mask;
2317
2318 crtc_funcs = crtc->helper_private;
2319 if (crtc_funcs && crtc_funcs->atomic_begin)
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02002320 crtc_funcs->atomic_begin(crtc, old_crtc_state);
Maarten Lankhorstde28d022015-05-19 16:41:01 +02002321
2322 drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
2323 struct drm_plane_state *old_plane_state =
Maarten Lankhorstb4d93672017-03-01 10:22:10 +01002324 drm_atomic_get_old_plane_state(old_state, plane);
Maarten Lankhorstde28d022015-05-19 16:41:01 +02002325 const struct drm_plane_helper_funcs *plane_funcs;
2326
2327 plane_funcs = plane->helper_private;
2328
2329 if (!old_plane_state || !plane_funcs)
2330 continue;
2331
2332 WARN_ON(plane->state->crtc && plane->state->crtc != crtc);
2333
Maarten Lankhorst51ffa122017-02-16 15:47:07 +01002334 if (drm_atomic_plane_disabling(old_plane_state, plane->state) &&
Maarten Lankhorstde28d022015-05-19 16:41:01 +02002335 plane_funcs->atomic_disable)
2336 plane_funcs->atomic_disable(plane, old_plane_state);
2337 else if (plane->state->crtc ||
Maarten Lankhorst51ffa122017-02-16 15:47:07 +01002338 drm_atomic_plane_disabling(old_plane_state, plane->state))
Maarten Lankhorstde28d022015-05-19 16:41:01 +02002339 plane_funcs->atomic_update(plane, old_plane_state);
2340 }
2341
2342 if (crtc_funcs && crtc_funcs->atomic_flush)
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02002343 crtc_funcs->atomic_flush(crtc, old_crtc_state);
Maarten Lankhorstde28d022015-05-19 16:41:01 +02002344}
2345EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
2346
2347/**
Jyri Sarha6753ba92015-11-27 16:14:01 +02002348 * drm_atomic_helper_disable_planes_on_crtc - helper to disable CRTC's planes
Liu Ying28500292016-08-26 15:30:39 +08002349 * @old_crtc_state: atomic state object with the old CRTC state
Jyri Sarha6753ba92015-11-27 16:14:01 +02002350 * @atomic: if set, synchronize with CRTC's atomic_begin/flush hooks
2351 *
2352 * Disables all planes associated with the given CRTC. This can be
Liu Ying28500292016-08-26 15:30:39 +08002353 * used for instance in the CRTC helper atomic_disable callback to disable
2354 * all planes.
Jyri Sarha6753ba92015-11-27 16:14:01 +02002355 *
2356 * If the atomic-parameter is set the function calls the CRTC's
2357 * atomic_begin hook before and atomic_flush hook after disabling the
2358 * planes.
2359 *
2360 * It is a bug to call this function without having implemented the
Daniel Vetter6806cdf2017-01-25 07:26:43 +01002361 * &drm_plane_helper_funcs.atomic_disable plane hook.
Jyri Sarha6753ba92015-11-27 16:14:01 +02002362 */
Liu Ying28500292016-08-26 15:30:39 +08002363void
2364drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc_state *old_crtc_state,
2365 bool atomic)
Jyri Sarha6753ba92015-11-27 16:14:01 +02002366{
Liu Ying28500292016-08-26 15:30:39 +08002367 struct drm_crtc *crtc = old_crtc_state->crtc;
Jyri Sarha6753ba92015-11-27 16:14:01 +02002368 const struct drm_crtc_helper_funcs *crtc_funcs =
2369 crtc->helper_private;
2370 struct drm_plane *plane;
2371
2372 if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
2373 crtc_funcs->atomic_begin(crtc, NULL);
2374
Liu Ying28500292016-08-26 15:30:39 +08002375 drm_atomic_crtc_state_for_each_plane(plane, old_crtc_state) {
Jyri Sarha6753ba92015-11-27 16:14:01 +02002376 const struct drm_plane_helper_funcs *plane_funcs =
2377 plane->helper_private;
2378
Liu Ying28500292016-08-26 15:30:39 +08002379 if (!plane_funcs)
Jyri Sarha6753ba92015-11-27 16:14:01 +02002380 continue;
2381
2382 WARN_ON(!plane_funcs->atomic_disable);
2383 if (plane_funcs->atomic_disable)
2384 plane_funcs->atomic_disable(plane, NULL);
2385 }
2386
2387 if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
2388 crtc_funcs->atomic_flush(crtc, NULL);
2389}
2390EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
2391
2392/**
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002393 * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
2394 * @dev: DRM device
2395 * @old_state: atomic state object with old state structures
2396 *
2397 * This function cleans up plane state, specifically framebuffers, from the old
2398 * configuration. Hence the old configuration must be perserved in @old_state to
2399 * be able to call this function.
2400 *
2401 * This function must also be called on the new state when the atomic update
2402 * fails at any point after calling drm_atomic_helper_prepare_planes().
2403 */
2404void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
2405 struct drm_atomic_state *old_state)
2406{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002407 struct drm_plane *plane;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002408 struct drm_plane_state *old_plane_state, *new_plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002409 int i;
2410
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002411 for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02002412 const struct drm_plane_helper_funcs *funcs;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002413 struct drm_plane_state *plane_state;
2414
2415 /*
2416 * This might be called before swapping when commit is aborted,
2417 * in which case we have to cleanup the new state.
2418 */
2419 if (old_plane_state == plane->state)
2420 plane_state = new_plane_state;
2421 else
2422 plane_state = old_plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002423
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002424 funcs = plane->helper_private;
2425
Maarten Lankhorst844f9112015-09-02 10:42:40 +02002426 if (funcs->cleanup_fb)
2427 funcs->cleanup_fb(plane, plane_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002428 }
2429}
2430EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
2431
2432/**
2433 * drm_atomic_helper_swap_state - store atomic state into current sw state
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002434 * @state: atomic state
Maarten Lankhorstc066d232017-07-11 16:33:04 +02002435 * @stall: stall for preceeding commits
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002436 *
2437 * This function stores the atomic state into the current state pointers in all
2438 * driver objects. It should be called after all failing steps have been done
2439 * and succeeded, but before the actual hardware state is committed.
2440 *
2441 * For cleanup and error recovery the current state for all changed objects will
Maarten Lankhorstc066d232017-07-11 16:33:04 +02002442 * be swapped into @state.
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002443 *
2444 * With that sequence it fits perfectly into the plane prepare/cleanup sequence:
2445 *
2446 * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state.
2447 *
2448 * 2. Do any other steps that might fail.
2449 *
2450 * 3. Put the staged state into the current state pointers with this function.
2451 *
2452 * 4. Actually commit the hardware state.
2453 *
Daniel Vetter26196f72015-08-25 16:26:03 +02002454 * 5. Call drm_atomic_helper_cleanup_planes() with @state, which since step 3
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002455 * contains the old state. Also do any other cleanup required with that state.
Daniel Vettera095caa2016-06-08 17:15:36 +02002456 *
2457 * @stall must be set when nonblocking commits for this driver directly access
Daniel Vetter6806cdf2017-01-25 07:26:43 +01002458 * the &drm_plane.state, &drm_crtc.state or &drm_connector.state pointer. With
2459 * the current atomic helpers this is almost always the case, since the helpers
Daniel Vettera095caa2016-06-08 17:15:36 +02002460 * don't pass the right state structures to the callbacks.
Maarten Lankhorstc066d232017-07-11 16:33:04 +02002461 *
2462 * Returns:
2463 *
Maarten Lankhorstc4bbb732017-07-11 16:33:14 +02002464 * Returns 0 on success. Can return -ERESTARTSYS when @stall is true and the
2465 * waiting for the previous commits has been interrupted.
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002466 */
Maarten Lankhorstc066d232017-07-11 16:33:04 +02002467int drm_atomic_helper_swap_state(struct drm_atomic_state *state,
Daniel Vetter5e84c262016-06-10 00:06:32 +02002468 bool stall)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002469{
Maarten Lankhorstc4bbb732017-07-11 16:33:14 +02002470 int i, ret;
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002471 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002472 struct drm_connector_state *old_conn_state, *new_conn_state;
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002473 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002474 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002475 struct drm_plane *plane;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002476 struct drm_plane_state *old_plane_state, *new_plane_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02002477 struct drm_crtc_commit *commit;
Ville Syrjäläa4370c72017-07-12 18:51:02 +03002478 struct drm_private_obj *obj;
2479 struct drm_private_state *old_obj_state, *new_obj_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02002480
2481 if (stall) {
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02002482 /*
2483 * We have to stall for hw_done here before
2484 * drm_atomic_helper_wait_for_dependencies() because flip
2485 * depth > 1 is not yet supported by all drivers. As long as
2486 * obj->state is directly dereferenced anywhere in the drivers
2487 * atomic_commit_tail function, then it's unsafe to swap state
2488 * before drm_atomic_helper_commit_hw_done() is called.
2489 */
2490
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002491 for_each_old_crtc_in_state(state, crtc, old_crtc_state, i) {
2492 commit = old_crtc_state->commit;
Daniel Vettera095caa2016-06-08 17:15:36 +02002493
2494 if (!commit)
2495 continue;
2496
Maarten Lankhorstc4bbb732017-07-11 16:33:14 +02002497 ret = wait_for_completion_interruptible(&commit->hw_done);
Maarten Lankhorstc4bbb732017-07-11 16:33:14 +02002498 if (ret)
2499 return ret;
Daniel Vettera095caa2016-06-08 17:15:36 +02002500 }
Daniel Vettera095caa2016-06-08 17:15:36 +02002501
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02002502 for_each_old_connector_in_state(state, connector, old_conn_state, i) {
2503 commit = old_conn_state->commit;
2504
2505 if (!commit)
2506 continue;
2507
2508 ret = wait_for_completion_interruptible(&commit->hw_done);
2509 if (ret)
2510 return ret;
2511 }
2512
2513 for_each_old_plane_in_state(state, plane, old_plane_state, i) {
2514 commit = old_plane_state->commit;
2515
2516 if (!commit)
2517 continue;
2518
2519 ret = wait_for_completion_interruptible(&commit->hw_done);
Daniel Vettera095caa2016-06-08 17:15:36 +02002520 if (ret)
2521 return ret;
Daniel Vettera095caa2016-06-08 17:15:36 +02002522 }
2523 }
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002524
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002525 for_each_oldnew_connector_in_state(state, connector, old_conn_state, new_conn_state, i) {
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01002526 WARN_ON(connector->state != old_conn_state);
2527
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002528 old_conn_state->state = state;
2529 new_conn_state->state = NULL;
2530
2531 state->connectors[i].state = old_conn_state;
2532 connector->state = new_conn_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002533 }
2534
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002535 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01002536 WARN_ON(crtc->state != old_crtc_state);
2537
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002538 old_crtc_state->state = state;
2539 new_crtc_state->state = NULL;
2540
2541 state->crtcs[i].state = old_crtc_state;
2542 crtc->state = new_crtc_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02002543
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002544 if (new_crtc_state->commit) {
Daniel Vettera095caa2016-06-08 17:15:36 +02002545 spin_lock(&crtc->commit_lock);
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002546 list_add(&new_crtc_state->commit->commit_entry,
Daniel Vettera095caa2016-06-08 17:15:36 +02002547 &crtc->commit_list);
2548 spin_unlock(&crtc->commit_lock);
2549
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02002550 new_crtc_state->commit->event = NULL;
Daniel Vettera095caa2016-06-08 17:15:36 +02002551 }
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002552 }
2553
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002554 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01002555 WARN_ON(plane->state != old_plane_state);
2556
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002557 old_plane_state->state = state;
2558 new_plane_state->state = NULL;
2559
2560 state->planes[i].state = old_plane_state;
2561 plane->state = new_plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002562 }
Pandiyan, Dhinakaranb430c272017-04-20 22:51:30 -07002563
Ville Syrjäläa4370c72017-07-12 18:51:02 +03002564 for_each_oldnew_private_obj_in_state(state, obj, old_obj_state, new_obj_state, i) {
2565 WARN_ON(obj->state != old_obj_state);
2566
2567 old_obj_state->state = state;
2568 new_obj_state->state = NULL;
2569
2570 state->private_objs[i].state = old_obj_state;
2571 obj->state = new_obj_state;
2572 }
Maarten Lankhorstc066d232017-07-11 16:33:04 +02002573
2574 return 0;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002575}
2576EXPORT_SYMBOL(drm_atomic_helper_swap_state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002577
2578/**
2579 * drm_atomic_helper_update_plane - Helper for primary plane update using atomic
2580 * @plane: plane object to update
2581 * @crtc: owning CRTC of owning plane
2582 * @fb: framebuffer to flip onto plane
2583 * @crtc_x: x offset of primary plane on crtc
2584 * @crtc_y: y offset of primary plane on crtc
2585 * @crtc_w: width of primary plane rectangle on crtc
2586 * @crtc_h: height of primary plane rectangle on crtc
2587 * @src_x: x offset of @fb for panning
2588 * @src_y: y offset of @fb for panning
2589 * @src_w: width of source rectangle in @fb
2590 * @src_h: height of source rectangle in @fb
Daniel Vetter34a2ab52017-03-22 22:50:41 +01002591 * @ctx: lock acquire context
Daniel Vetter042652e2014-07-27 13:46:52 +02002592 *
2593 * Provides a default plane update handler using the atomic driver interface.
2594 *
2595 * RETURNS:
2596 * Zero on success, error code on failure
2597 */
2598int drm_atomic_helper_update_plane(struct drm_plane *plane,
2599 struct drm_crtc *crtc,
2600 struct drm_framebuffer *fb,
2601 int crtc_x, int crtc_y,
2602 unsigned int crtc_w, unsigned int crtc_h,
2603 uint32_t src_x, uint32_t src_y,
Daniel Vetter34a2ab52017-03-22 22:50:41 +01002604 uint32_t src_w, uint32_t src_h,
2605 struct drm_modeset_acquire_ctx *ctx)
Daniel Vetter042652e2014-07-27 13:46:52 +02002606{
2607 struct drm_atomic_state *state;
2608 struct drm_plane_state *plane_state;
2609 int ret = 0;
2610
2611 state = drm_atomic_state_alloc(plane->dev);
2612 if (!state)
2613 return -ENOMEM;
2614
Daniel Vetterd26f96c2017-03-22 22:50:44 +01002615 state->acquire_ctx = ctx;
Daniel Vetter042652e2014-07-27 13:46:52 +02002616 plane_state = drm_atomic_get_plane_state(state, plane);
2617 if (IS_ERR(plane_state)) {
2618 ret = PTR_ERR(plane_state);
2619 goto fail;
2620 }
2621
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01002622 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
Daniel Vetter042652e2014-07-27 13:46:52 +02002623 if (ret != 0)
2624 goto fail;
Daniel Vetter321ebf02014-11-04 22:57:27 +01002625 drm_atomic_set_fb_for_plane(plane_state, fb);
Daniel Vetter042652e2014-07-27 13:46:52 +02002626 plane_state->crtc_x = crtc_x;
2627 plane_state->crtc_y = crtc_y;
Daniel Vetter042652e2014-07-27 13:46:52 +02002628 plane_state->crtc_w = crtc_w;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002629 plane_state->crtc_h = crtc_h;
Daniel Vetter042652e2014-07-27 13:46:52 +02002630 plane_state->src_x = src_x;
2631 plane_state->src_y = src_y;
Daniel Vetter042652e2014-07-27 13:46:52 +02002632 plane_state->src_w = src_w;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002633 plane_state->src_h = src_h;
Daniel Vetter042652e2014-07-27 13:46:52 +02002634
Daniel Vetter3671c582015-05-04 15:40:52 +02002635 if (plane == crtc->cursor)
2636 state->legacy_cursor_update = true;
2637
Daniel Vetter042652e2014-07-27 13:46:52 +02002638 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002639fail:
Chris Wilson08536952016-10-14 13:18:18 +01002640 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002641 return ret;
Daniel Vetter042652e2014-07-27 13:46:52 +02002642}
2643EXPORT_SYMBOL(drm_atomic_helper_update_plane);
2644
2645/**
2646 * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic
2647 * @plane: plane to disable
Daniel Vetter19315292017-03-22 22:50:43 +01002648 * @ctx: lock acquire context
Daniel Vetter042652e2014-07-27 13:46:52 +02002649 *
2650 * Provides a default plane disable handler using the atomic driver interface.
2651 *
2652 * RETURNS:
2653 * Zero on success, error code on failure
2654 */
Daniel Vetter19315292017-03-22 22:50:43 +01002655int drm_atomic_helper_disable_plane(struct drm_plane *plane,
2656 struct drm_modeset_acquire_ctx *ctx)
Daniel Vetter042652e2014-07-27 13:46:52 +02002657{
2658 struct drm_atomic_state *state;
2659 struct drm_plane_state *plane_state;
2660 int ret = 0;
2661
2662 state = drm_atomic_state_alloc(plane->dev);
2663 if (!state)
2664 return -ENOMEM;
2665
Daniel Vetterd26f96c2017-03-22 22:50:44 +01002666 state->acquire_ctx = ctx;
Daniel Vetter042652e2014-07-27 13:46:52 +02002667 plane_state = drm_atomic_get_plane_state(state, plane);
2668 if (IS_ERR(plane_state)) {
2669 ret = PTR_ERR(plane_state);
2670 goto fail;
2671 }
2672
Ville Syrjäläa36c0272018-03-22 17:22:58 +02002673 if (plane_state->crtc && plane_state->crtc->cursor == plane)
Maarten Lankhorst24e79d02015-11-11 11:29:07 +01002674 plane_state->state->legacy_cursor_update = true;
2675
Rob Clarkbbb1e522015-08-25 15:35:58 -04002676 ret = __drm_atomic_helper_disable_plane(plane, plane_state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002677 if (ret != 0)
2678 goto fail;
Daniel Vetterf02ad902015-01-22 16:36:23 +01002679
Daniel Vetter042652e2014-07-27 13:46:52 +02002680 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002681fail:
Chris Wilson08536952016-10-14 13:18:18 +01002682 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002683 return ret;
Daniel Vetter042652e2014-07-27 13:46:52 +02002684}
2685EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
2686
Rob Clarkbbb1e522015-08-25 15:35:58 -04002687/* just used from fb-helper and atomic-helper: */
2688int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
2689 struct drm_plane_state *plane_state)
2690{
2691 int ret;
2692
2693 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
2694 if (ret != 0)
2695 return ret;
2696
2697 drm_atomic_set_fb_for_plane(plane_state, NULL);
2698 plane_state->crtc_x = 0;
2699 plane_state->crtc_y = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002700 plane_state->crtc_w = 0;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002701 plane_state->crtc_h = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002702 plane_state->src_x = 0;
2703 plane_state->src_y = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002704 plane_state->src_w = 0;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002705 plane_state->src_h = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002706
Rob Clarkbbb1e522015-08-25 15:35:58 -04002707 return 0;
2708}
2709
Daniel Vetter042652e2014-07-27 13:46:52 +02002710static int update_output_state(struct drm_atomic_state *state,
2711 struct drm_mode_set *set)
2712{
2713 struct drm_device *dev = set->crtc->dev;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002714 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002715 struct drm_crtc_state *new_crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002716 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002717 struct drm_connector_state *new_conn_state;
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002718 int ret, i;
Daniel Vetter042652e2014-07-27 13:46:52 +02002719
2720 ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
2721 state->acquire_ctx);
2722 if (ret)
2723 return ret;
2724
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002725 /* First disable all connectors on the target crtc. */
2726 ret = drm_atomic_add_affected_connectors(state, set->crtc);
2727 if (ret)
2728 return ret;
Daniel Vetter042652e2014-07-27 13:46:52 +02002729
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002730 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
2731 if (new_conn_state->crtc == set->crtc) {
2732 ret = drm_atomic_set_crtc_for_connector(new_conn_state,
Daniel Vetter042652e2014-07-27 13:46:52 +02002733 NULL);
2734 if (ret)
2735 return ret;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002736
Manasi Navare40ee6fb2016-12-16 12:29:06 +02002737 /* Make sure legacy setCrtc always re-trains */
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002738 new_conn_state->link_status = DRM_LINK_STATUS_GOOD;
Daniel Vetter042652e2014-07-27 13:46:52 +02002739 }
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002740 }
Daniel Vetter042652e2014-07-27 13:46:52 +02002741
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002742 /* Then set all connectors from set->connectors on the target crtc */
2743 for (i = 0; i < set->num_connectors; i++) {
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002744 new_conn_state = drm_atomic_get_connector_state(state,
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002745 set->connectors[i]);
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002746 if (IS_ERR(new_conn_state))
2747 return PTR_ERR(new_conn_state);
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002748
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002749 ret = drm_atomic_set_crtc_for_connector(new_conn_state,
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002750 set->crtc);
2751 if (ret)
2752 return ret;
Daniel Vetter042652e2014-07-27 13:46:52 +02002753 }
2754
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002755 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
Daniel Vetter042652e2014-07-27 13:46:52 +02002756 /* Don't update ->enable for the CRTC in the set_config request,
2757 * since a mismatch would indicate a bug in the upper layers.
2758 * The actual modeset code later on will catch any
2759 * inconsistencies here. */
2760 if (crtc == set->crtc)
2761 continue;
2762
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002763 if (!new_crtc_state->connector_mask) {
2764 ret = drm_atomic_set_mode_prop_for_crtc(new_crtc_state,
Laurent Pinchartc30f55a2015-06-22 13:37:46 +03002765 NULL);
2766 if (ret < 0)
2767 return ret;
2768
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01002769 new_crtc_state->active = false;
Laurent Pinchartc30f55a2015-06-22 13:37:46 +03002770 }
Daniel Vetter042652e2014-07-27 13:46:52 +02002771 }
2772
2773 return 0;
2774}
2775
2776/**
2777 * drm_atomic_helper_set_config - set a new config from userspace
2778 * @set: mode set configuration
Daniel Vettera4eff9a2017-03-22 22:50:57 +01002779 * @ctx: lock acquisition context
Daniel Vetter042652e2014-07-27 13:46:52 +02002780 *
2781 * Provides a default crtc set_config handler using the atomic driver interface.
2782 *
Manasi Navare40ee6fb2016-12-16 12:29:06 +02002783 * NOTE: For backwards compatibility with old userspace this automatically
2784 * resets the "link-status" property to GOOD, to force any link
2785 * re-training. The SETCRTC ioctl does not define whether an update does
2786 * need a full modeset or just a plane update, hence we're allowed to do
2787 * that. See also drm_mode_connector_set_link_status_property().
2788 *
Daniel Vetter042652e2014-07-27 13:46:52 +02002789 * Returns:
2790 * Returns 0 on success, negative errno numbers on failure.
2791 */
Daniel Vettera4eff9a2017-03-22 22:50:57 +01002792int drm_atomic_helper_set_config(struct drm_mode_set *set,
2793 struct drm_modeset_acquire_ctx *ctx)
Daniel Vetter042652e2014-07-27 13:46:52 +02002794{
2795 struct drm_atomic_state *state;
2796 struct drm_crtc *crtc = set->crtc;
Daniel Vetter042652e2014-07-27 13:46:52 +02002797 int ret = 0;
2798
2799 state = drm_atomic_state_alloc(crtc->dev);
2800 if (!state)
2801 return -ENOMEM;
2802
Daniel Vetter38b64412017-03-22 22:50:58 +01002803 state->acquire_ctx = ctx;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002804 ret = __drm_atomic_helper_set_config(set, state);
Daniel Stone819364d2015-05-26 14:36:48 +01002805 if (ret != 0)
Daniel Vetter1fa4da02017-03-29 19:41:36 +02002806 goto fail;
Daniel Stone819364d2015-05-26 14:36:48 +01002807
Maarten Lankhorst44596b82017-04-06 13:19:00 +02002808 ret = handle_conflicting_encoders(state, true);
2809 if (ret)
2810 return ret;
2811
Daniel Vetter042652e2014-07-27 13:46:52 +02002812 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002813
Daniel Vetter1fa4da02017-03-29 19:41:36 +02002814fail:
Chris Wilson08536952016-10-14 13:18:18 +01002815 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002816 return ret;
Daniel Vetter042652e2014-07-27 13:46:52 +02002817}
2818EXPORT_SYMBOL(drm_atomic_helper_set_config);
2819
Rob Clarkbbb1e522015-08-25 15:35:58 -04002820/* just used from fb-helper and atomic-helper: */
2821int __drm_atomic_helper_set_config(struct drm_mode_set *set,
2822 struct drm_atomic_state *state)
2823{
2824 struct drm_crtc_state *crtc_state;
2825 struct drm_plane_state *primary_state;
2826 struct drm_crtc *crtc = set->crtc;
Ville Syrjälä83926112015-11-16 17:02:34 +02002827 int hdisplay, vdisplay;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002828 int ret;
2829
2830 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2831 if (IS_ERR(crtc_state))
2832 return PTR_ERR(crtc_state);
2833
2834 primary_state = drm_atomic_get_plane_state(state, crtc->primary);
2835 if (IS_ERR(primary_state))
2836 return PTR_ERR(primary_state);
2837
2838 if (!set->mode) {
2839 WARN_ON(set->fb);
2840 WARN_ON(set->num_connectors);
2841
2842 ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
2843 if (ret != 0)
2844 return ret;
2845
2846 crtc_state->active = false;
2847
2848 ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
2849 if (ret != 0)
2850 return ret;
2851
2852 drm_atomic_set_fb_for_plane(primary_state, NULL);
2853
2854 goto commit;
2855 }
2856
2857 WARN_ON(!set->fb);
2858 WARN_ON(!set->num_connectors);
2859
2860 ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
2861 if (ret != 0)
2862 return ret;
2863
2864 crtc_state->active = true;
2865
2866 ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
2867 if (ret != 0)
2868 return ret;
2869
Daniel Vetter196cd5d2017-01-25 07:26:56 +01002870 drm_mode_get_hv_timing(set->mode, &hdisplay, &vdisplay);
Ville Syrjälä83926112015-11-16 17:02:34 +02002871
Rob Clarkbbb1e522015-08-25 15:35:58 -04002872 drm_atomic_set_fb_for_plane(primary_state, set->fb);
2873 primary_state->crtc_x = 0;
2874 primary_state->crtc_y = 0;
Ville Syrjälä83926112015-11-16 17:02:34 +02002875 primary_state->crtc_w = hdisplay;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002876 primary_state->crtc_h = vdisplay;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002877 primary_state->src_x = set->x << 16;
2878 primary_state->src_y = set->y << 16;
Ville Syrjäläbd2ef252016-09-26 19:30:46 +03002879 if (drm_rotation_90_or_270(primary_state->rotation)) {
Ville Syrjälä83926112015-11-16 17:02:34 +02002880 primary_state->src_w = vdisplay << 16;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002881 primary_state->src_h = hdisplay << 16;
Ville Syrjälä41121242015-10-15 20:39:59 +03002882 } else {
Ville Syrjälä83926112015-11-16 17:02:34 +02002883 primary_state->src_w = hdisplay << 16;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002884 primary_state->src_h = vdisplay << 16;
Ville Syrjälä41121242015-10-15 20:39:59 +03002885 }
Rob Clarkbbb1e522015-08-25 15:35:58 -04002886
2887commit:
2888 ret = update_output_state(state, set);
2889 if (ret)
2890 return ret;
2891
2892 return 0;
2893}
2894
Ville Syrjälä5e9cfeb2018-03-22 17:22:51 +02002895static int __drm_atomic_helper_disable_all(struct drm_device *dev,
2896 struct drm_modeset_acquire_ctx *ctx,
2897 bool clean_old_fbs)
Thierry Reding14942762015-12-02 17:50:04 +01002898{
2899 struct drm_atomic_state *state;
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002900 struct drm_connector_state *conn_state;
Thierry Reding14942762015-12-02 17:50:04 +01002901 struct drm_connector *conn;
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002902 struct drm_plane_state *plane_state;
2903 struct drm_plane *plane;
2904 struct drm_crtc_state *crtc_state;
2905 struct drm_crtc *crtc;
Daniel Vetter49d70ae2017-07-15 11:31:06 +02002906 unsigned plane_mask = 0;
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002907 int ret, i;
Thierry Reding14942762015-12-02 17:50:04 +01002908
2909 state = drm_atomic_state_alloc(dev);
2910 if (!state)
2911 return -ENOMEM;
2912
2913 state->acquire_ctx = ctx;
2914
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002915 drm_for_each_crtc(crtc, dev) {
Thierry Reding14942762015-12-02 17:50:04 +01002916 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2917 if (IS_ERR(crtc_state)) {
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002918 ret = PTR_ERR(crtc_state);
Thierry Reding14942762015-12-02 17:50:04 +01002919 goto free;
2920 }
2921
2922 crtc_state->active = false;
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002923
2924 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state, NULL);
2925 if (ret < 0)
2926 goto free;
2927
2928 ret = drm_atomic_add_affected_planes(state, crtc);
2929 if (ret < 0)
2930 goto free;
2931
2932 ret = drm_atomic_add_affected_connectors(state, crtc);
2933 if (ret < 0)
2934 goto free;
Thierry Reding14942762015-12-02 17:50:04 +01002935 }
2936
Maarten Lankhorstdfb8bb32017-07-12 10:13:31 +02002937 for_each_new_connector_in_state(state, conn, conn_state, i) {
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002938 ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
2939 if (ret < 0)
2940 goto free;
2941 }
2942
Maarten Lankhorstdfb8bb32017-07-12 10:13:31 +02002943 for_each_new_plane_in_state(state, plane, plane_state, i) {
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002944 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
2945 if (ret < 0)
2946 goto free;
2947
2948 drm_atomic_set_fb_for_plane(plane_state, NULL);
Ville Syrjälä5e9cfeb2018-03-22 17:22:51 +02002949
2950 if (clean_old_fbs) {
2951 plane->old_fb = plane->fb;
2952 plane_mask |= BIT(drm_plane_index(plane));
2953 }
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002954 }
2955
2956 ret = drm_atomic_commit(state);
Thierry Reding14942762015-12-02 17:50:04 +01002957free:
Daniel Vetter49d70ae2017-07-15 11:31:06 +02002958 if (plane_mask)
2959 drm_atomic_clean_old_fb(dev, plane_mask, ret);
Chris Wilson08536952016-10-14 13:18:18 +01002960 drm_atomic_state_put(state);
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002961 return ret;
Thierry Reding14942762015-12-02 17:50:04 +01002962}
Maarten Lankhorst9b2104f2017-02-21 14:51:40 +01002963
Ville Syrjälä5e9cfeb2018-03-22 17:22:51 +02002964/**
2965 * drm_atomic_helper_disable_all - disable all currently active outputs
2966 * @dev: DRM device
2967 * @ctx: lock acquisition context
2968 *
2969 * Loops through all connectors, finding those that aren't turned off and then
2970 * turns them off by setting their DPMS mode to OFF and deactivating the CRTC
2971 * that they are connected to.
2972 *
2973 * This is used for example in suspend/resume to disable all currently active
2974 * functions when suspending. If you just want to shut down everything at e.g.
2975 * driver unload, look at drm_atomic_helper_shutdown().
2976 *
2977 * Note that if callers haven't already acquired all modeset locks this might
2978 * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
2979 *
2980 * Returns:
2981 * 0 on success or a negative error code on failure.
2982 *
2983 * See also:
2984 * drm_atomic_helper_suspend(), drm_atomic_helper_resume() and
2985 * drm_atomic_helper_shutdown().
2986 */
2987int drm_atomic_helper_disable_all(struct drm_device *dev,
2988 struct drm_modeset_acquire_ctx *ctx)
2989{
2990 return __drm_atomic_helper_disable_all(dev, ctx, false);
2991}
Thierry Reding14942762015-12-02 17:50:04 +01002992EXPORT_SYMBOL(drm_atomic_helper_disable_all);
2993
2994/**
Daniel Vetter18dddad2017-03-21 17:41:49 +01002995 * drm_atomic_helper_shutdown - shutdown all CRTC
2996 * @dev: DRM device
2997 *
2998 * This shuts down all CRTC, which is useful for driver unloading. Shutdown on
2999 * suspend should instead be handled with drm_atomic_helper_suspend(), since
3000 * that also takes a snapshot of the modeset state to be restored on resume.
3001 *
3002 * This is just a convenience wrapper around drm_atomic_helper_disable_all(),
3003 * and it is the atomic version of drm_crtc_force_disable_all().
3004 */
3005void drm_atomic_helper_shutdown(struct drm_device *dev)
3006{
3007 struct drm_modeset_acquire_ctx ctx;
3008 int ret;
3009
3010 drm_modeset_acquire_init(&ctx, 0);
3011 while (1) {
3012 ret = drm_modeset_lock_all_ctx(dev, &ctx);
3013 if (!ret)
Ville Syrjälä5e9cfeb2018-03-22 17:22:51 +02003014 ret = __drm_atomic_helper_disable_all(dev, &ctx, true);
Daniel Vetter18dddad2017-03-21 17:41:49 +01003015
3016 if (ret != -EDEADLK)
3017 break;
3018
3019 drm_modeset_backoff(&ctx);
3020 }
3021
3022 if (ret)
3023 DRM_ERROR("Disabling all crtc's during unload failed with %i\n", ret);
3024
3025 drm_modeset_drop_locks(&ctx);
3026 drm_modeset_acquire_fini(&ctx);
3027}
3028EXPORT_SYMBOL(drm_atomic_helper_shutdown);
3029
3030/**
Thierry Reding14942762015-12-02 17:50:04 +01003031 * drm_atomic_helper_suspend - subsystem-level suspend helper
3032 * @dev: DRM device
3033 *
3034 * Duplicates the current atomic state, disables all active outputs and then
3035 * returns a pointer to the original atomic state to the caller. Drivers can
3036 * pass this pointer to the drm_atomic_helper_resume() helper upon resume to
3037 * restore the output configuration that was active at the time the system
3038 * entered suspend.
3039 *
3040 * Note that it is potentially unsafe to use this. The atomic state object
3041 * returned by this function is assumed to be persistent. Drivers must ensure
3042 * that this holds true. Before calling this function, drivers must make sure
3043 * to suspend fbdev emulation so that nothing can be using the device.
3044 *
3045 * Returns:
3046 * A pointer to a copy of the state before suspend on success or an ERR_PTR()-
3047 * encoded error code on failure. Drivers should store the returned atomic
3048 * state object and pass it to the drm_atomic_helper_resume() helper upon
3049 * resume.
3050 *
3051 * See also:
3052 * drm_atomic_helper_duplicate_state(), drm_atomic_helper_disable_all(),
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003053 * drm_atomic_helper_resume(), drm_atomic_helper_commit_duplicated_state()
Thierry Reding14942762015-12-02 17:50:04 +01003054 */
3055struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
3056{
3057 struct drm_modeset_acquire_ctx ctx;
3058 struct drm_atomic_state *state;
3059 int err;
3060
3061 drm_modeset_acquire_init(&ctx, 0);
3062
3063retry:
3064 err = drm_modeset_lock_all_ctx(dev, &ctx);
3065 if (err < 0) {
3066 state = ERR_PTR(err);
3067 goto unlock;
3068 }
3069
3070 state = drm_atomic_helper_duplicate_state(dev, &ctx);
3071 if (IS_ERR(state))
3072 goto unlock;
3073
3074 err = drm_atomic_helper_disable_all(dev, &ctx);
3075 if (err < 0) {
Chris Wilson08536952016-10-14 13:18:18 +01003076 drm_atomic_state_put(state);
Thierry Reding14942762015-12-02 17:50:04 +01003077 state = ERR_PTR(err);
3078 goto unlock;
3079 }
3080
3081unlock:
3082 if (PTR_ERR(state) == -EDEADLK) {
3083 drm_modeset_backoff(&ctx);
3084 goto retry;
3085 }
3086
3087 drm_modeset_drop_locks(&ctx);
3088 drm_modeset_acquire_fini(&ctx);
3089 return state;
3090}
3091EXPORT_SYMBOL(drm_atomic_helper_suspend);
3092
3093/**
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003094 * drm_atomic_helper_commit_duplicated_state - commit duplicated state
3095 * @state: duplicated atomic state to commit
3096 * @ctx: pointer to acquire_ctx to use for commit.
3097 *
3098 * The state returned by drm_atomic_helper_duplicate_state() and
3099 * drm_atomic_helper_suspend() is partially invalid, and needs to
3100 * be fixed up before commit.
3101 *
3102 * Returns:
3103 * 0 on success or a negative error code on failure.
3104 *
3105 * See also:
3106 * drm_atomic_helper_suspend()
3107 */
3108int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
3109 struct drm_modeset_acquire_ctx *ctx)
3110{
3111 int i;
3112 struct drm_plane *plane;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01003113 struct drm_plane_state *new_plane_state;
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003114 struct drm_connector *connector;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01003115 struct drm_connector_state *new_conn_state;
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003116 struct drm_crtc *crtc;
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01003117 struct drm_crtc_state *new_crtc_state;
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003118
3119 state->acquire_ctx = ctx;
3120
Ville Syrjälä5e78d012018-03-22 17:22:54 +02003121 for_each_new_plane_in_state(state, plane, new_plane_state, i) {
3122 WARN_ON(plane->crtc != new_plane_state->crtc);
3123 WARN_ON(plane->fb != new_plane_state->fb);
3124 WARN_ON(plane->old_fb);
3125
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003126 state->planes[i].old_state = plane->state;
Ville Syrjälä5e78d012018-03-22 17:22:54 +02003127 }
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003128
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01003129 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003130 state->crtcs[i].old_state = crtc->state;
3131
Maarten Lankhorst415c3ac2017-03-01 10:21:26 +01003132 for_each_new_connector_in_state(state, connector, new_conn_state, i)
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003133 state->connectors[i].old_state = connector->state;
3134
Ville Syrjälä5e9cfeb2018-03-22 17:22:51 +02003135 return drm_atomic_commit(state);
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003136}
3137EXPORT_SYMBOL(drm_atomic_helper_commit_duplicated_state);
3138
3139/**
Thierry Reding14942762015-12-02 17:50:04 +01003140 * drm_atomic_helper_resume - subsystem-level resume helper
3141 * @dev: DRM device
3142 * @state: atomic state to resume to
3143 *
3144 * Calls drm_mode_config_reset() to synchronize hardware and software states,
3145 * grabs all modeset locks and commits the atomic state object. This can be
3146 * used in conjunction with the drm_atomic_helper_suspend() helper to
3147 * implement suspend/resume for drivers that support atomic mode-setting.
3148 *
3149 * Returns:
3150 * 0 on success or a negative error code on failure.
3151 *
3152 * See also:
3153 * drm_atomic_helper_suspend()
3154 */
3155int drm_atomic_helper_resume(struct drm_device *dev,
3156 struct drm_atomic_state *state)
3157{
Daniel Vettera5b84442017-04-03 10:32:53 +02003158 struct drm_modeset_acquire_ctx ctx;
Thierry Reding14942762015-12-02 17:50:04 +01003159 int err;
3160
3161 drm_mode_config_reset(dev);
Maarten Lankhorst581e49f2017-01-16 10:37:38 +01003162
Daniel Vettera5b84442017-04-03 10:32:53 +02003163 drm_modeset_acquire_init(&ctx, 0);
3164 while (1) {
Daniel Vetter869e1882017-05-31 10:38:13 +02003165 err = drm_modeset_lock_all_ctx(dev, &ctx);
3166 if (err)
3167 goto out;
3168
Daniel Vettera5b84442017-04-03 10:32:53 +02003169 err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
Daniel Vetter869e1882017-05-31 10:38:13 +02003170out:
Daniel Vettera5b84442017-04-03 10:32:53 +02003171 if (err != -EDEADLK)
3172 break;
3173
3174 drm_modeset_backoff(&ctx);
3175 }
3176
Jeffy Chen6d281b12017-10-09 14:46:41 +08003177 drm_atomic_state_put(state);
Daniel Vettera5b84442017-04-03 10:32:53 +02003178 drm_modeset_drop_locks(&ctx);
3179 drm_modeset_acquire_fini(&ctx);
Thierry Reding14942762015-12-02 17:50:04 +01003180
3181 return err;
3182}
3183EXPORT_SYMBOL(drm_atomic_helper_resume);
3184
Daniel Vetter8c3a8182017-06-27 16:59:36 +02003185static int page_flip_common(struct drm_atomic_state *state,
3186 struct drm_crtc *crtc,
3187 struct drm_framebuffer *fb,
3188 struct drm_pending_vblank_event *event,
3189 uint32_t flags)
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003190{
3191 struct drm_plane *plane = crtc->primary;
3192 struct drm_plane_state *plane_state;
3193 struct drm_crtc_state *crtc_state;
3194 int ret = 0;
3195
3196 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3197 if (IS_ERR(crtc_state))
3198 return PTR_ERR(crtc_state);
3199
3200 crtc_state->event = event;
Andrey Grodzovsky6cbe5c42017-02-02 16:56:29 -05003201 crtc_state->pageflip_flags = flags;
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003202
3203 plane_state = drm_atomic_get_plane_state(state, plane);
3204 if (IS_ERR(plane_state))
3205 return PTR_ERR(plane_state);
3206
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003207 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
3208 if (ret != 0)
3209 return ret;
3210 drm_atomic_set_fb_for_plane(plane_state, fb);
3211
3212 /* Make sure we don't accidentally do a full modeset. */
3213 state->allow_modeset = false;
3214 if (!crtc_state->active) {
Russell King6ac7c542017-02-13 12:27:03 +00003215 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] disabled, rejecting legacy flip\n",
3216 crtc->base.id, crtc->name);
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003217 return -EINVAL;
3218 }
3219
3220 return ret;
3221}
3222
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003223/**
3224 * drm_atomic_helper_page_flip - execute a legacy page flip
3225 * @crtc: DRM crtc
3226 * @fb: DRM framebuffer
3227 * @event: optional DRM event to signal upon completion
3228 * @flags: flip flags for non-vblank sync'ed updates
Daniel Vetter41292b1f2017-03-22 22:50:50 +01003229 * @ctx: lock acquisition context
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003230 *
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003231 * Provides a default &drm_crtc_funcs.page_flip implementation
3232 * using the atomic driver interface.
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003233 *
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003234 * Returns:
3235 * Returns 0 on success, negative errno numbers on failure.
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003236 *
3237 * See also:
3238 * drm_atomic_helper_page_flip_target()
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003239 */
3240int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
3241 struct drm_framebuffer *fb,
3242 struct drm_pending_vblank_event *event,
Daniel Vetter41292b1f2017-03-22 22:50:50 +01003243 uint32_t flags,
3244 struct drm_modeset_acquire_ctx *ctx)
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003245{
3246 struct drm_plane *plane = crtc->primary;
3247 struct drm_atomic_state *state;
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003248 int ret = 0;
3249
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003250 state = drm_atomic_state_alloc(plane->dev);
3251 if (!state)
3252 return -ENOMEM;
3253
Daniel Vetter043e7fb2017-03-22 22:50:51 +01003254 state->acquire_ctx = ctx;
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003255
Andrey Grodzovsky6cbe5c42017-02-02 16:56:29 -05003256 ret = page_flip_common(state, crtc, fb, event, flags);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003257 if (ret != 0)
3258 goto fail;
Daniel Vetter4cba6852015-12-08 09:49:20 +01003259
Maarten Lankhorstb837ba02016-04-26 16:11:35 +02003260 ret = drm_atomic_nonblocking_commit(state);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003261fail:
Chris Wilson08536952016-10-14 13:18:18 +01003262 drm_atomic_state_put(state);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003263 return ret;
Daniel Vetter8bc0f312014-07-27 18:42:37 +02003264}
3265EXPORT_SYMBOL(drm_atomic_helper_page_flip);
Daniel Vetterd4617012014-11-03 15:56:43 +01003266
3267/**
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003268 * drm_atomic_helper_page_flip_target - do page flip on target vblank period.
3269 * @crtc: DRM crtc
3270 * @fb: DRM framebuffer
3271 * @event: optional DRM event to signal upon completion
3272 * @flags: flip flags for non-vblank sync'ed updates
3273 * @target: specifying the target vblank period when the flip to take effect
Daniel Vetter41292b1f2017-03-22 22:50:50 +01003274 * @ctx: lock acquisition context
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003275 *
3276 * Provides a default &drm_crtc_funcs.page_flip_target implementation.
3277 * Similar to drm_atomic_helper_page_flip() with extra parameter to specify
3278 * target vblank period to flip.
3279 *
3280 * Returns:
3281 * Returns 0 on success, negative errno numbers on failure.
3282 */
Daniel Vetter8c3a8182017-06-27 16:59:36 +02003283int drm_atomic_helper_page_flip_target(struct drm_crtc *crtc,
3284 struct drm_framebuffer *fb,
3285 struct drm_pending_vblank_event *event,
3286 uint32_t flags,
3287 uint32_t target,
3288 struct drm_modeset_acquire_ctx *ctx)
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003289{
3290 struct drm_plane *plane = crtc->primary;
3291 struct drm_atomic_state *state;
3292 struct drm_crtc_state *crtc_state;
3293 int ret = 0;
3294
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003295 state = drm_atomic_state_alloc(plane->dev);
3296 if (!state)
3297 return -ENOMEM;
3298
Daniel Vetter043e7fb2017-03-22 22:50:51 +01003299 state->acquire_ctx = ctx;
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003300
Andrey Grodzovsky6cbe5c42017-02-02 16:56:29 -05003301 ret = page_flip_common(state, crtc, fb, event, flags);
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003302 if (ret != 0)
3303 goto fail;
3304
Maarten Lankhorstb4d93672017-03-01 10:22:10 +01003305 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003306 if (WARN_ON(!crtc_state)) {
3307 ret = -EINVAL;
3308 goto fail;
3309 }
3310 crtc_state->target_vblank = target;
3311
3312 ret = drm_atomic_nonblocking_commit(state);
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003313fail:
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003314 drm_atomic_state_put(state);
3315 return ret;
Andrey Grodzovskyf869a6e2017-01-06 15:39:40 -05003316}
3317EXPORT_SYMBOL(drm_atomic_helper_page_flip_target);
3318
3319/**
Daniel Vetter6806cdf2017-01-25 07:26:43 +01003320 * drm_atomic_helper_best_encoder - Helper for
3321 * &drm_connector_helper_funcs.best_encoder callback
Noralf Trønnes9ecb5492016-05-11 18:09:21 +02003322 * @connector: Connector control structure
3323 *
Daniel Vetter6806cdf2017-01-25 07:26:43 +01003324 * This is a &drm_connector_helper_funcs.best_encoder callback helper for
Noralf Trønnes9ecb5492016-05-11 18:09:21 +02003325 * connectors that support exactly 1 encoder, statically determined at driver
3326 * init time.
3327 */
3328struct drm_encoder *
3329drm_atomic_helper_best_encoder(struct drm_connector *connector)
3330{
3331 WARN_ON(connector->encoder_ids[1]);
Keith Packard418da172017-03-14 23:25:07 -07003332 return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
Noralf Trønnes9ecb5492016-05-11 18:09:21 +02003333}
3334EXPORT_SYMBOL(drm_atomic_helper_best_encoder);
3335
3336/**
Daniel Vetter3150c7d2014-11-06 20:53:29 +01003337 * DOC: atomic state reset and initialization
3338 *
3339 * Both the drm core and the atomic helpers assume that there is always the full
3340 * and correct atomic software state for all connectors, CRTCs and planes
3341 * available. Which is a bit a problem on driver load and also after system
3342 * suspend. One way to solve this is to have a hardware state read-out
3343 * infrastructure which reconstructs the full software state (e.g. the i915
3344 * driver).
3345 *
3346 * The simpler solution is to just reset the software state to everything off,
3347 * which is easiest to do by calling drm_mode_config_reset(). To facilitate this
3348 * the atomic helpers provide default reset implementations for all hooks.
Daniel Vetter7f8ee3e2015-12-04 09:46:06 +01003349 *
3350 * On the upside the precise state tracking of atomic simplifies system suspend
3351 * and resume a lot. For drivers using drm_mode_config_reset() a complete recipe
3352 * is implemented in drm_atomic_helper_suspend() and drm_atomic_helper_resume().
3353 * For other drivers the building blocks are split out, see the documentation
3354 * for these functions.
Daniel Vetter3150c7d2014-11-06 20:53:29 +01003355 */
3356
3357/**
Daniel Vetter6806cdf2017-01-25 07:26:43 +01003358 * drm_atomic_helper_crtc_reset - default &drm_crtc_funcs.reset hook for CRTCs
Daniel Vetterd4617012014-11-03 15:56:43 +01003359 * @crtc: drm CRTC
3360 *
3361 * Resets the atomic state for @crtc by freeing the state pointer (which might
3362 * be NULL, e.g. at driver load time) and allocating a new empty state object.
3363 */
3364void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
3365{
Daniel Vetterb0b55112016-04-22 22:10:29 +02003366 if (crtc->state)
Daniel Vetterec2dc6a2016-05-09 16:34:09 +02003367 __drm_atomic_helper_crtc_destroy_state(crtc->state);
Daniel Vetterb0b55112016-04-22 22:10:29 +02003368
Daniel Vetterd4617012014-11-03 15:56:43 +01003369 kfree(crtc->state);
3370 crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01003371
3372 if (crtc->state)
3373 crtc->state->crtc = crtc;
Daniel Vetterd4617012014-11-03 15:56:43 +01003374}
3375EXPORT_SYMBOL(drm_atomic_helper_crtc_reset);
3376
3377/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003378 * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state
3379 * @crtc: CRTC object
3380 * @state: atomic CRTC state
3381 *
3382 * Copies atomic state from a CRTC's current state and resets inferred values.
3383 * This is useful for drivers that subclass the CRTC state.
3384 */
3385void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
3386 struct drm_crtc_state *state)
3387{
3388 memcpy(state, crtc->state, sizeof(*state));
3389
Daniel Stone99cf4a22015-05-25 19:11:51 +01003390 if (state->mode_blob)
Thierry Reding6472e502017-02-28 15:46:42 +01003391 drm_property_blob_get(state->mode_blob);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003392 if (state->degamma_lut)
Thierry Reding6472e502017-02-28 15:46:42 +01003393 drm_property_blob_get(state->degamma_lut);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003394 if (state->ctm)
Thierry Reding6472e502017-02-28 15:46:42 +01003395 drm_property_blob_get(state->ctm);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003396 if (state->gamma_lut)
Thierry Reding6472e502017-02-28 15:46:42 +01003397 drm_property_blob_get(state->gamma_lut);
Thierry Redingf5e78402015-01-28 14:54:32 +01003398 state->mode_changed = false;
3399 state->active_changed = false;
3400 state->planes_changed = false;
Maarten Lankhorstfc596662015-07-21 13:28:57 +02003401 state->connectors_changed = false;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003402 state->color_mgmt_changed = false;
Marek Szyprowski44d1240d2016-06-13 11:11:26 +02003403 state->zpos_changed = false;
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02003404 state->commit = NULL;
Thierry Redingf5e78402015-01-28 14:54:32 +01003405 state->event = NULL;
Andrey Grodzovsky6cbe5c42017-02-02 16:56:29 -05003406 state->pageflip_flags = 0;
Thierry Redingf5e78402015-01-28 14:54:32 +01003407}
3408EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state);
3409
3410/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003411 * drm_atomic_helper_crtc_duplicate_state - default state duplicate hook
3412 * @crtc: drm CRTC
3413 *
3414 * Default CRTC state duplicate hook for drivers which don't have their own
3415 * subclassed CRTC state structure.
3416 */
3417struct drm_crtc_state *
3418drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc)
3419{
3420 struct drm_crtc_state *state;
3421
3422 if (WARN_ON(!crtc->state))
3423 return NULL;
3424
Thierry Redingf5e78402015-01-28 14:54:32 +01003425 state = kmalloc(sizeof(*state), GFP_KERNEL);
3426 if (state)
3427 __drm_atomic_helper_crtc_duplicate_state(crtc, state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003428
3429 return state;
3430}
3431EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
3432
3433/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003434 * __drm_atomic_helper_crtc_destroy_state - release CRTC state
Thierry Redingf5e78402015-01-28 14:54:32 +01003435 * @state: CRTC state object to release
3436 *
3437 * Releases all resources stored in the CRTC state without actually freeing
3438 * the memory of the CRTC state. This is useful for drivers that subclass the
3439 * CRTC state.
3440 */
Daniel Vetterec2dc6a2016-05-09 16:34:09 +02003441void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state)
Thierry Redingf5e78402015-01-28 14:54:32 +01003442{
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02003443 if (state->commit) {
Leo (Sunpeng) Li1c6ceee2018-01-17 12:51:08 +01003444 /*
3445 * In the event that a non-blocking commit returns
3446 * -ERESTARTSYS before the commit_tail work is queued, we will
3447 * have an extra reference to the commit object. Release it, if
3448 * the event has not been consumed by the worker.
3449 *
3450 * state->event may be freed, so we can't directly look at
3451 * state->event->base.completion.
3452 */
3453 if (state->event && state->commit->abort_completion)
3454 drm_crtc_commit_put(state->commit);
3455
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02003456 kfree(state->commit->event);
3457 state->commit->event = NULL;
Leo (Sunpeng) Li1c6ceee2018-01-17 12:51:08 +01003458
Maarten Lankhorst163bcc22017-09-04 17:04:56 +02003459 drm_crtc_commit_put(state->commit);
3460 }
3461
Thierry Reding6472e502017-02-28 15:46:42 +01003462 drm_property_blob_put(state->mode_blob);
3463 drm_property_blob_put(state->degamma_lut);
3464 drm_property_blob_put(state->ctm);
3465 drm_property_blob_put(state->gamma_lut);
Thierry Redingf5e78402015-01-28 14:54:32 +01003466}
3467EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
3468
3469/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003470 * drm_atomic_helper_crtc_destroy_state - default state destroy hook
3471 * @crtc: drm CRTC
3472 * @state: CRTC state object to release
3473 *
3474 * Default CRTC state destroy hook for drivers which don't have their own
3475 * subclassed CRTC state structure.
3476 */
3477void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
3478 struct drm_crtc_state *state)
3479{
Daniel Vetterec2dc6a2016-05-09 16:34:09 +02003480 __drm_atomic_helper_crtc_destroy_state(state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003481 kfree(state);
3482}
3483EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
3484
3485/**
Daniel Vetter6806cdf2017-01-25 07:26:43 +01003486 * drm_atomic_helper_plane_reset - default &drm_plane_funcs.reset hook for planes
Daniel Vetterd4617012014-11-03 15:56:43 +01003487 * @plane: drm plane
3488 *
3489 * Resets the atomic state for @plane by freeing the state pointer (which might
3490 * be NULL, e.g. at driver load time) and allocating a new empty state object.
3491 */
3492void drm_atomic_helper_plane_reset(struct drm_plane *plane)
3493{
Daniel Vetterb0b55112016-04-22 22:10:29 +02003494 if (plane->state)
Daniel Vetter2f701692016-05-09 16:34:10 +02003495 __drm_atomic_helper_plane_destroy_state(plane->state);
Daniel Vetter321ebf02014-11-04 22:57:27 +01003496
Daniel Vetterd4617012014-11-03 15:56:43 +01003497 kfree(plane->state);
3498 plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01003499
Marek Szyprowski25aaa3a2016-01-19 09:26:48 +01003500 if (plane->state) {
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01003501 plane->state->plane = plane;
Robert Fossc2c446a2017-05-19 16:50:17 -04003502 plane->state->rotation = DRM_MODE_ROTATE_0;
Marek Szyprowski25aaa3a2016-01-19 09:26:48 +01003503 }
Daniel Vetterd4617012014-11-03 15:56:43 +01003504}
3505EXPORT_SYMBOL(drm_atomic_helper_plane_reset);
3506
3507/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003508 * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state
3509 * @plane: plane object
3510 * @state: atomic plane state
3511 *
3512 * Copies atomic state from a plane's current state. This is useful for
3513 * drivers that subclass the plane state.
3514 */
3515void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
3516 struct drm_plane_state *state)
3517{
3518 memcpy(state, plane->state, sizeof(*state));
3519
3520 if (state->fb)
Thierry Redinga4a69da2017-02-28 15:46:40 +01003521 drm_framebuffer_get(state->fb);
Gustavo Padovan96260142016-11-15 22:06:39 +09003522
3523 state->fence = NULL;
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02003524 state->commit = NULL;
Thierry Redingf5e78402015-01-28 14:54:32 +01003525}
3526EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state);
3527
3528/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003529 * drm_atomic_helper_plane_duplicate_state - default state duplicate hook
3530 * @plane: drm plane
3531 *
3532 * Default plane state duplicate hook for drivers which don't have their own
3533 * subclassed plane state structure.
3534 */
3535struct drm_plane_state *
3536drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane)
3537{
Daniel Vetter321ebf02014-11-04 22:57:27 +01003538 struct drm_plane_state *state;
3539
Daniel Vetterd4617012014-11-03 15:56:43 +01003540 if (WARN_ON(!plane->state))
3541 return NULL;
3542
Thierry Redingf5e78402015-01-28 14:54:32 +01003543 state = kmalloc(sizeof(*state), GFP_KERNEL);
3544 if (state)
3545 __drm_atomic_helper_plane_duplicate_state(plane, state);
Daniel Vetter321ebf02014-11-04 22:57:27 +01003546
3547 return state;
Daniel Vetterd4617012014-11-03 15:56:43 +01003548}
3549EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state);
3550
3551/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003552 * __drm_atomic_helper_plane_destroy_state - release plane state
Thierry Redingf5e78402015-01-28 14:54:32 +01003553 * @state: plane state object to release
3554 *
3555 * Releases all resources stored in the plane state without actually freeing
3556 * the memory of the plane state. This is useful for drivers that subclass the
3557 * plane state.
3558 */
Daniel Vetter2f701692016-05-09 16:34:10 +02003559void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state)
Thierry Redingf5e78402015-01-28 14:54:32 +01003560{
3561 if (state->fb)
Thierry Redinga4a69da2017-02-28 15:46:40 +01003562 drm_framebuffer_put(state->fb);
Gustavo Padovan96260142016-11-15 22:06:39 +09003563
3564 if (state->fence)
3565 dma_fence_put(state->fence);
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02003566
3567 if (state->commit)
3568 drm_crtc_commit_put(state->commit);
Thierry Redingf5e78402015-01-28 14:54:32 +01003569}
3570EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
3571
3572/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003573 * drm_atomic_helper_plane_destroy_state - default state destroy hook
3574 * @plane: drm plane
3575 * @state: plane state object to release
3576 *
3577 * Default plane state destroy hook for drivers which don't have their own
3578 * subclassed plane state structure.
3579 */
3580void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
Daniel Vetter321ebf02014-11-04 22:57:27 +01003581 struct drm_plane_state *state)
Daniel Vetterd4617012014-11-03 15:56:43 +01003582{
Daniel Vetter2f701692016-05-09 16:34:10 +02003583 __drm_atomic_helper_plane_destroy_state(state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003584 kfree(state);
3585}
3586EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state);
3587
3588/**
Maarten Lankhorst4cd39912016-01-04 12:53:16 +01003589 * __drm_atomic_helper_connector_reset - reset state on connector
3590 * @connector: drm connector
3591 * @conn_state: connector state to assign
3592 *
3593 * Initializes the newly allocated @conn_state and assigns it to
Daniel Vetter6806cdf2017-01-25 07:26:43 +01003594 * the &drm_conector->state pointer of @connector, usually required when
3595 * initializing the drivers or when called from the &drm_connector_funcs.reset
3596 * hook.
Maarten Lankhorst4cd39912016-01-04 12:53:16 +01003597 *
3598 * This is useful for drivers that subclass the connector state.
3599 */
3600void
3601__drm_atomic_helper_connector_reset(struct drm_connector *connector,
3602 struct drm_connector_state *conn_state)
3603{
3604 if (conn_state)
3605 conn_state->connector = connector;
3606
3607 connector->state = conn_state;
3608}
3609EXPORT_SYMBOL(__drm_atomic_helper_connector_reset);
3610
3611/**
Daniel Vetter6806cdf2017-01-25 07:26:43 +01003612 * drm_atomic_helper_connector_reset - default &drm_connector_funcs.reset hook for connectors
Daniel Vetterd4617012014-11-03 15:56:43 +01003613 * @connector: drm connector
3614 *
3615 * Resets the atomic state for @connector by freeing the state pointer (which
3616 * might be NULL, e.g. at driver load time) and allocating a new empty state
3617 * object.
3618 */
3619void drm_atomic_helper_connector_reset(struct drm_connector *connector)
3620{
Maarten Lankhorst4cd39912016-01-04 12:53:16 +01003621 struct drm_connector_state *conn_state =
3622 kzalloc(sizeof(*conn_state), GFP_KERNEL);
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01003623
Daniel Vetterb0b55112016-04-22 22:10:29 +02003624 if (connector->state)
Daniel Vetterfabd9102016-05-09 16:34:11 +02003625 __drm_atomic_helper_connector_destroy_state(connector->state);
Daniel Vetterb0b55112016-04-22 22:10:29 +02003626
Maarten Lankhorst4cd39912016-01-04 12:53:16 +01003627 kfree(connector->state);
3628 __drm_atomic_helper_connector_reset(connector, conn_state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003629}
3630EXPORT_SYMBOL(drm_atomic_helper_connector_reset);
3631
3632/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003633 * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state
3634 * @connector: connector object
3635 * @state: atomic connector state
3636 *
3637 * Copies atomic state from a connector's current state. This is useful for
3638 * drivers that subclass the connector state.
3639 */
3640void
3641__drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
3642 struct drm_connector_state *state)
3643{
3644 memcpy(state, connector->state, sizeof(*state));
Dave Airlied2307de2016-04-27 11:27:39 +10003645 if (state->crtc)
Thierry Redingad093602017-02-28 15:46:39 +01003646 drm_connector_get(connector);
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02003647 state->commit = NULL;
Thierry Redingf5e78402015-01-28 14:54:32 +01003648}
3649EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
3650
3651/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003652 * drm_atomic_helper_connector_duplicate_state - default state duplicate hook
3653 * @connector: drm connector
3654 *
3655 * Default connector state duplicate hook for drivers which don't have their own
3656 * subclassed connector state structure.
3657 */
3658struct drm_connector_state *
3659drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector)
3660{
Thierry Redingf5e78402015-01-28 14:54:32 +01003661 struct drm_connector_state *state;
3662
Daniel Vetterd4617012014-11-03 15:56:43 +01003663 if (WARN_ON(!connector->state))
3664 return NULL;
3665
Thierry Redingf5e78402015-01-28 14:54:32 +01003666 state = kmalloc(sizeof(*state), GFP_KERNEL);
3667 if (state)
3668 __drm_atomic_helper_connector_duplicate_state(connector, state);
3669
3670 return state;
Daniel Vetterd4617012014-11-03 15:56:43 +01003671}
3672EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
3673
3674/**
Thierry Reding397fd772015-09-08 15:00:45 +02003675 * drm_atomic_helper_duplicate_state - duplicate an atomic state object
3676 * @dev: DRM device
3677 * @ctx: lock acquisition context
3678 *
3679 * Makes a copy of the current atomic state by looping over all objects and
Thierry Reding14942762015-12-02 17:50:04 +01003680 * duplicating their respective states. This is used for example by suspend/
3681 * resume support code to save the state prior to suspend such that it can
3682 * be restored upon resume.
Thierry Reding397fd772015-09-08 15:00:45 +02003683 *
3684 * Note that this treats atomic state as persistent between save and restore.
3685 * Drivers must make sure that this is possible and won't result in confusion
3686 * or erroneous behaviour.
3687 *
3688 * Note that if callers haven't already acquired all modeset locks this might
3689 * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
3690 *
3691 * Returns:
3692 * A pointer to the copy of the atomic state object on success or an
3693 * ERR_PTR()-encoded error code on failure.
Thierry Reding14942762015-12-02 17:50:04 +01003694 *
3695 * See also:
3696 * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
Thierry Reding397fd772015-09-08 15:00:45 +02003697 */
3698struct drm_atomic_state *
3699drm_atomic_helper_duplicate_state(struct drm_device *dev,
3700 struct drm_modeset_acquire_ctx *ctx)
3701{
3702 struct drm_atomic_state *state;
3703 struct drm_connector *conn;
Daniel Vetterc36a3252016-12-15 16:58:43 +01003704 struct drm_connector_list_iter conn_iter;
Thierry Reding397fd772015-09-08 15:00:45 +02003705 struct drm_plane *plane;
3706 struct drm_crtc *crtc;
3707 int err = 0;
3708
3709 state = drm_atomic_state_alloc(dev);
3710 if (!state)
3711 return ERR_PTR(-ENOMEM);
3712
3713 state->acquire_ctx = ctx;
3714
3715 drm_for_each_crtc(crtc, dev) {
3716 struct drm_crtc_state *crtc_state;
3717
3718 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3719 if (IS_ERR(crtc_state)) {
3720 err = PTR_ERR(crtc_state);
3721 goto free;
3722 }
3723 }
3724
3725 drm_for_each_plane(plane, dev) {
3726 struct drm_plane_state *plane_state;
3727
3728 plane_state = drm_atomic_get_plane_state(state, plane);
3729 if (IS_ERR(plane_state)) {
3730 err = PTR_ERR(plane_state);
3731 goto free;
3732 }
3733 }
3734
Thierry Redingb982dab2017-02-28 15:46:43 +01003735 drm_connector_list_iter_begin(dev, &conn_iter);
Daniel Vetterc36a3252016-12-15 16:58:43 +01003736 drm_for_each_connector_iter(conn, &conn_iter) {
Thierry Reding397fd772015-09-08 15:00:45 +02003737 struct drm_connector_state *conn_state;
3738
3739 conn_state = drm_atomic_get_connector_state(state, conn);
3740 if (IS_ERR(conn_state)) {
3741 err = PTR_ERR(conn_state);
Thierry Redingb982dab2017-02-28 15:46:43 +01003742 drm_connector_list_iter_end(&conn_iter);
Thierry Reding397fd772015-09-08 15:00:45 +02003743 goto free;
3744 }
3745 }
Thierry Redingb982dab2017-02-28 15:46:43 +01003746 drm_connector_list_iter_end(&conn_iter);
Thierry Reding397fd772015-09-08 15:00:45 +02003747
3748 /* clear the acquire context so that it isn't accidentally reused */
3749 state->acquire_ctx = NULL;
3750
3751free:
3752 if (err < 0) {
Chris Wilson08536952016-10-14 13:18:18 +01003753 drm_atomic_state_put(state);
Thierry Reding397fd772015-09-08 15:00:45 +02003754 state = ERR_PTR(err);
3755 }
3756
3757 return state;
3758}
3759EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
3760
3761/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003762 * __drm_atomic_helper_connector_destroy_state - release connector state
Thierry Redingf5e78402015-01-28 14:54:32 +01003763 * @state: connector state object to release
3764 *
3765 * Releases all resources stored in the connector state without actually
3766 * freeing the memory of the connector state. This is useful for drivers that
3767 * subclass the connector state.
3768 */
3769void
Daniel Vetterfabd9102016-05-09 16:34:11 +02003770__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
Thierry Redingf5e78402015-01-28 14:54:32 +01003771{
Dave Airlied2307de2016-04-27 11:27:39 +10003772 if (state->crtc)
Thierry Redingad093602017-02-28 15:46:39 +01003773 drm_connector_put(state->connector);
Maarten Lankhorst21a01ab2017-09-04 12:48:37 +02003774
3775 if (state->commit)
3776 drm_crtc_commit_put(state->commit);
Thierry Redingf5e78402015-01-28 14:54:32 +01003777}
3778EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
3779
3780/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003781 * drm_atomic_helper_connector_destroy_state - default state destroy hook
3782 * @connector: drm connector
3783 * @state: connector state object to release
3784 *
3785 * Default connector state destroy hook for drivers which don't have their own
3786 * subclassed connector state structure.
3787 */
3788void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
3789 struct drm_connector_state *state)
3790{
Daniel Vetterfabd9102016-05-09 16:34:11 +02003791 __drm_atomic_helper_connector_destroy_state(state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003792 kfree(state);
3793}
3794EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003795
3796/**
3797 * drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table
3798 * @crtc: CRTC object
3799 * @red: red correction table
3800 * @green: green correction table
3801 * @blue: green correction table
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003802 * @size: size of the tables
Daniel Vetter6d124ff2017-04-03 10:33:01 +02003803 * @ctx: lock acquire context
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003804 *
3805 * Implements support for legacy gamma correction table for drivers
3806 * that support color management through the DEGAMMA_LUT/GAMMA_LUT
Daniel Vetter2e381782017-04-12 17:20:06 +02003807 * properties. See drm_crtc_enable_color_mgmt() and the containing chapter for
3808 * how the atomic color management and gamma tables work.
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003809 */
Maarten Lankhorst7ea77282016-06-07 12:49:30 +02003810int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
3811 u16 *red, u16 *green, u16 *blue,
Daniel Vetter6d124ff2017-04-03 10:33:01 +02003812 uint32_t size,
3813 struct drm_modeset_acquire_ctx *ctx)
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003814{
3815 struct drm_device *dev = crtc->dev;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003816 struct drm_atomic_state *state;
3817 struct drm_crtc_state *crtc_state;
3818 struct drm_property_blob *blob = NULL;
3819 struct drm_color_lut *blob_data;
3820 int i, ret = 0;
Peter Rosine2b9dd32017-07-13 18:25:26 +02003821 bool replaced;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003822
3823 state = drm_atomic_state_alloc(crtc->dev);
3824 if (!state)
Maarten Lankhorst7ea77282016-06-07 12:49:30 +02003825 return -ENOMEM;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003826
3827 blob = drm_property_create_blob(dev,
3828 sizeof(struct drm_color_lut) * size,
3829 NULL);
Lionel Landwerlin562c5b42016-03-10 12:04:21 +00003830 if (IS_ERR(blob)) {
3831 ret = PTR_ERR(blob);
Lionel Landwerlinc1f415c2016-03-11 12:17:26 +00003832 blob = NULL;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003833 goto fail;
3834 }
3835
3836 /* Prepare GAMMA_LUT with the legacy values. */
Ville Syrjälä11b83e32018-02-23 21:25:02 +02003837 blob_data = blob->data;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003838 for (i = 0; i < size; i++) {
3839 blob_data[i].red = red[i];
3840 blob_data[i].green = green[i];
3841 blob_data[i].blue = blue[i];
3842 }
3843
Daniel Vetter3a09f732017-04-03 10:33:02 +02003844 state->acquire_ctx = ctx;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003845 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3846 if (IS_ERR(crtc_state)) {
3847 ret = PTR_ERR(crtc_state);
3848 goto fail;
3849 }
3850
3851 /* Reset DEGAMMA_LUT and CTM properties. */
Peter Rosine2b9dd32017-07-13 18:25:26 +02003852 replaced = drm_property_replace_blob(&crtc_state->degamma_lut, NULL);
3853 replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL);
3854 replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob);
3855 crtc_state->color_mgmt_changed |= replaced;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003856
3857 ret = drm_atomic_commit(state);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003858
Daniel Vetter3a09f732017-04-03 10:33:02 +02003859fail:
Chris Wilson08536952016-10-14 13:18:18 +01003860 drm_atomic_state_put(state);
Thierry Reding6472e502017-02-28 15:46:42 +01003861 drm_property_blob_put(blob);
Maarten Lankhorst7ea77282016-06-07 12:49:30 +02003862 return ret;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003863}
3864EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);
Ville Syrjäläa4370c72017-07-12 18:51:02 +03003865
3866/**
3867 * __drm_atomic_helper_private_duplicate_state - copy atomic private state
3868 * @obj: CRTC object
3869 * @state: new private object state
3870 *
3871 * Copies atomic state from a private objects's current state and resets inferred values.
3872 * This is useful for drivers that subclass the private state.
3873 */
3874void __drm_atomic_helper_private_obj_duplicate_state(struct drm_private_obj *obj,
3875 struct drm_private_state *state)
3876{
3877 memcpy(state, obj->state, sizeof(*state));
3878}
3879EXPORT_SYMBOL(__drm_atomic_helper_private_obj_duplicate_state);