]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - drivers/gpu/drm/drm_atomic_helper.c
drm: drop _mode_ from drm_mode_connector_attach_encoder
[mirror_ubuntu-jammy-kernel.git] / drivers / gpu / drm / drm_atomic_helper.c
CommitLineData
c2fcd274
DV
1/*
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>
623369e5 32#include <drm/drm_atomic_helper.h>
935774cd 33#include <drm/drm_writeback.h>
f54d1867 34#include <linux/dma-fence.h>
c2fcd274 35
faf94a08 36#include "drm_crtc_helper_internal.h"
44d1240d
MS
37#include "drm_crtc_internal.h"
38
3150c7d0
DV
39/**
40 * DOC: overview
41 *
42 * This helper library provides implementations of check and commit functions on
43 * top of the CRTC modeset helper callbacks and the plane helper callbacks. It
44 * also provides convenience implementations for the atomic state handling
45 * callbacks for drivers which don't need to subclass the drm core structures to
46 * add their own additional internal state.
47 *
48 * This library also provides default implementations for the check callback in
26196f7e
DV
49 * drm_atomic_helper_check() and for the commit callback with
50 * drm_atomic_helper_commit(). But the individual stages and callbacks are
51 * exposed to allow drivers to mix and match and e.g. use the plane helpers only
3150c7d0
DV
52 * together with a driver private modeset implementation.
53 *
54 * This library also provides implementations for all the legacy driver
26196f7e
DV
55 * interfaces on top of the atomic interface. See drm_atomic_helper_set_config(),
56 * drm_atomic_helper_disable_plane(), drm_atomic_helper_disable_plane() and the
3150c7d0
DV
57 * various functions to implement set_property callbacks. New drivers must not
58 * implement these functions themselves but must use the provided helpers.
092d01da
DV
59 *
60 * The atomic helper uses the same function table structures as all other
ea0dd85a
DV
61 * modesetting helpers. See the documentation for &struct drm_crtc_helper_funcs,
62 * struct &drm_encoder_helper_funcs and &struct drm_connector_helper_funcs. It
63 * also shares the &struct drm_plane_helper_funcs function table with the plane
092d01da 64 * helpers.
3150c7d0 65 */
c2fcd274
DV
66static void
67drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
415c3ac3 68 struct drm_plane_state *old_plane_state,
c2fcd274
DV
69 struct drm_plane_state *plane_state,
70 struct drm_plane *plane)
71{
72 struct drm_crtc_state *crtc_state;
73
415c3ac3 74 if (old_plane_state->crtc) {
b4d93679
ML
75 crtc_state = drm_atomic_get_new_crtc_state(state,
76 old_plane_state->crtc);
c2fcd274
DV
77
78 if (WARN_ON(!crtc_state))
79 return;
80
81 crtc_state->planes_changed = true;
82 }
83
84 if (plane_state->crtc) {
b4d93679 85 crtc_state = drm_atomic_get_new_crtc_state(state, plane_state->crtc);
c2fcd274
DV
86
87 if (WARN_ON(!crtc_state))
88 return;
89
90 crtc_state->planes_changed = true;
91 }
92}
93
8248b65d
ML
94static int handle_conflicting_encoders(struct drm_atomic_state *state,
95 bool disable_conflicting_encoders)
97ac3204 96{
415c3ac3 97 struct drm_connector_state *new_conn_state;
40616a26 98 struct drm_connector *connector;
c36a3254 99 struct drm_connector_list_iter conn_iter;
40616a26
ML
100 struct drm_encoder *encoder;
101 unsigned encoder_mask = 0;
c36a3254 102 int i, ret = 0;
97ac3204 103
8248b65d
ML
104 /*
105 * First loop, find all newly assigned encoders from the connectors
106 * part of the state. If the same encoder is assigned to multiple
107 * connectors bail out.
108 */
415c3ac3 109 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
40616a26
ML
110 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
111 struct drm_encoder *new_encoder;
112
415c3ac3 113 if (!new_conn_state->crtc)
97ac3204
DV
114 continue;
115
40616a26 116 if (funcs->atomic_best_encoder)
415c3ac3 117 new_encoder = funcs->atomic_best_encoder(connector, new_conn_state);
a0909cc5 118 else if (funcs->best_encoder)
40616a26 119 new_encoder = funcs->best_encoder(connector);
a0909cc5
BB
120 else
121 new_encoder = drm_atomic_helper_best_encoder(connector);
40616a26 122
8248b65d 123 if (new_encoder) {
6f3be036 124 if (encoder_mask & drm_encoder_mask(new_encoder)) {
8248b65d
ML
125 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] on [CONNECTOR:%d:%s] already assigned\n",
126 new_encoder->base.id, new_encoder->name,
127 connector->base.id, connector->name);
128
129 return -EINVAL;
130 }
131
6f3be036 132 encoder_mask |= drm_encoder_mask(new_encoder);
8248b65d 133 }
97ac3204
DV
134 }
135
8248b65d
ML
136 if (!encoder_mask)
137 return 0;
97ac3204 138
8248b65d
ML
139 /*
140 * Second loop, iterate over all connectors not part of the state.
141 *
142 * If a conflicting encoder is found and disable_conflicting_encoders
143 * is not set, an error is returned. Userspace can provide a solution
144 * through the atomic ioctl.
145 *
146 * If the flag is set conflicting connectors are removed from the crtc
147 * and the crtc is disabled if no encoder is left. This preserves
148 * compatibility with the legacy set_config behavior.
149 */
b982dab1 150 drm_connector_list_iter_begin(state->dev, &conn_iter);
c36a3254 151 drm_for_each_connector_iter(connector, &conn_iter) {
40616a26 152 struct drm_crtc_state *crtc_state;
623369e5 153
b4d93679 154 if (drm_atomic_get_new_connector_state(state, connector))
40616a26 155 continue;
623369e5 156
40616a26 157 encoder = connector->state->best_encoder;
6f3be036 158 if (!encoder || !(encoder_mask & drm_encoder_mask(encoder)))
623369e5
DV
159 continue;
160
8248b65d
ML
161 if (!disable_conflicting_encoders) {
162 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s] by [CONNECTOR:%d:%s]\n",
163 encoder->base.id, encoder->name,
164 connector->state->crtc->base.id,
165 connector->state->crtc->name,
166 connector->base.id, connector->name);
c36a3254
DV
167 ret = -EINVAL;
168 goto out;
8248b65d
ML
169 }
170
415c3ac3
ML
171 new_conn_state = drm_atomic_get_connector_state(state, connector);
172 if (IS_ERR(new_conn_state)) {
173 ret = PTR_ERR(new_conn_state);
c36a3254
DV
174 goto out;
175 }
40616a26
ML
176
177 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
178 encoder->base.id, encoder->name,
415c3ac3 179 new_conn_state->crtc->base.id, new_conn_state->crtc->name,
40616a26
ML
180 connector->base.id, connector->name);
181
b4d93679 182 crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
40616a26 183
415c3ac3 184 ret = drm_atomic_set_crtc_for_connector(new_conn_state, NULL);
40616a26 185 if (ret)
c36a3254 186 goto out;
40616a26
ML
187
188 if (!crtc_state->connector_mask) {
189 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
190 NULL);
191 if (ret < 0)
c36a3254 192 goto out;
40616a26
ML
193
194 crtc_state->active = false;
195 }
623369e5 196 }
c36a3254 197out:
b982dab1 198 drm_connector_list_iter_end(&conn_iter);
623369e5 199
c36a3254 200 return ret;
623369e5
DV
201}
202
e87a52b3
ML
203static void
204set_best_encoder(struct drm_atomic_state *state,
205 struct drm_connector_state *conn_state,
206 struct drm_encoder *encoder)
207{
208 struct drm_crtc_state *crtc_state;
209 struct drm_crtc *crtc;
210
211 if (conn_state->best_encoder) {
212 /* Unset the encoder_mask in the old crtc state. */
213 crtc = conn_state->connector->state->crtc;
214
215 /* A NULL crtc is an error here because we should have
216 * duplicated a NULL best_encoder when crtc was NULL.
217 * As an exception restoring duplicated atomic state
218 * during resume is allowed, so don't warn when
219 * best_encoder is equal to encoder we intend to set.
220 */
221 WARN_ON(!crtc && encoder != conn_state->best_encoder);
222 if (crtc) {
b4d93679 223 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
e87a52b3
ML
224
225 crtc_state->encoder_mask &=
6f3be036 226 ~drm_encoder_mask(conn_state->best_encoder);
e87a52b3
ML
227 }
228 }
229
230 if (encoder) {
231 crtc = conn_state->crtc;
232 WARN_ON(!crtc);
233 if (crtc) {
b4d93679 234 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
e87a52b3
ML
235
236 crtc_state->encoder_mask |=
6f3be036 237 drm_encoder_mask(encoder);
e87a52b3
ML
238 }
239 }
240
241 conn_state->best_encoder = encoder;
242}
243
ec5aaa58 244static void
623369e5 245steal_encoder(struct drm_atomic_state *state,
ff19b786 246 struct drm_encoder *encoder)
623369e5 247{
623369e5
DV
248 struct drm_crtc_state *crtc_state;
249 struct drm_connector *connector;
415c3ac3 250 struct drm_connector_state *old_connector_state, *new_connector_state;
ec5aaa58 251 int i;
623369e5 252
415c3ac3 253 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
ff19b786 254 struct drm_crtc *encoder_crtc;
623369e5 255
415c3ac3 256 if (new_connector_state->best_encoder != encoder)
623369e5
DV
257 continue;
258
415c3ac3 259 encoder_crtc = old_connector_state->crtc;
623369e5 260
ff19b786
ML
261 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], stealing it\n",
262 encoder->base.id, encoder->name,
263 encoder_crtc->base.id, encoder_crtc->name);
e87a52b3 264
415c3ac3 265 set_best_encoder(state, new_connector_state, NULL);
623369e5 266
b4d93679 267 crtc_state = drm_atomic_get_new_crtc_state(state, encoder_crtc);
ff19b786
ML
268 crtc_state->connectors_changed = true;
269
ec5aaa58 270 return;
623369e5 271 }
623369e5
DV
272}
273
274static int
9459545b
ML
275update_connector_routing(struct drm_atomic_state *state,
276 struct drm_connector *connector,
415c3ac3
ML
277 struct drm_connector_state *old_connector_state,
278 struct drm_connector_state *new_connector_state)
623369e5 279{
b5ceff20 280 const struct drm_connector_helper_funcs *funcs;
623369e5 281 struct drm_encoder *new_encoder;
623369e5 282 struct drm_crtc_state *crtc_state;
623369e5 283
17a38d9c
DV
284 DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n",
285 connector->base.id,
286 connector->name);
623369e5 287
415c3ac3
ML
288 if (old_connector_state->crtc != new_connector_state->crtc) {
289 if (old_connector_state->crtc) {
b4d93679 290 crtc_state = drm_atomic_get_new_crtc_state(state, old_connector_state->crtc);
fc596660 291 crtc_state->connectors_changed = true;
623369e5
DV
292 }
293
415c3ac3 294 if (new_connector_state->crtc) {
b4d93679 295 crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
fc596660 296 crtc_state->connectors_changed = true;
623369e5
DV
297 }
298 }
299
415c3ac3 300 if (!new_connector_state->crtc) {
17a38d9c 301 DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n",
623369e5
DV
302 connector->base.id,
303 connector->name);
304
415c3ac3 305 set_best_encoder(state, new_connector_state, NULL);
623369e5
DV
306
307 return 0;
308 }
309
310 funcs = connector->helper_private;
3b8a684b
DV
311
312 if (funcs->atomic_best_encoder)
313 new_encoder = funcs->atomic_best_encoder(connector,
415c3ac3 314 new_connector_state);
c61b93fe 315 else if (funcs->best_encoder)
3b8a684b 316 new_encoder = funcs->best_encoder(connector);
c61b93fe
BB
317 else
318 new_encoder = drm_atomic_helper_best_encoder(connector);
623369e5
DV
319
320 if (!new_encoder) {
17a38d9c
DV
321 DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
322 connector->base.id,
323 connector->name);
623369e5
DV
324 return -EINVAL;
325 }
326
415c3ac3 327 if (!drm_encoder_crtc_ok(new_encoder, new_connector_state->crtc)) {
6ac7c548 328 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d:%s]\n",
5481c8fb
DV
329 new_encoder->base.id,
330 new_encoder->name,
415c3ac3
ML
331 new_connector_state->crtc->base.id,
332 new_connector_state->crtc->name);
5481c8fb
DV
333 return -EINVAL;
334 }
335
415c3ac3
ML
336 if (new_encoder == new_connector_state->best_encoder) {
337 set_best_encoder(state, new_connector_state, new_encoder);
e87a52b3 338
fa3ab4c2 339 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d:%s]\n",
17a38d9c
DV
340 connector->base.id,
341 connector->name,
342 new_encoder->base.id,
343 new_encoder->name,
415c3ac3
ML
344 new_connector_state->crtc->base.id,
345 new_connector_state->crtc->name);
623369e5
DV
346
347 return 0;
348 }
349
ec5aaa58 350 steal_encoder(state, new_encoder);
6ea76f3c 351
415c3ac3 352 set_best_encoder(state, new_connector_state, new_encoder);
e87a52b3 353
b4d93679 354 crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
fc596660 355 crtc_state->connectors_changed = true;
623369e5 356
fa3ab4c2 357 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
17a38d9c
DV
358 connector->base.id,
359 connector->name,
360 new_encoder->base.id,
361 new_encoder->name,
415c3ac3
ML
362 new_connector_state->crtc->base.id,
363 new_connector_state->crtc->name);
623369e5
DV
364
365 return 0;
366}
367
368static int
369mode_fixup(struct drm_atomic_state *state)
370{
df63b999 371 struct drm_crtc *crtc;
415c3ac3 372 struct drm_crtc_state *new_crtc_state;
df63b999 373 struct drm_connector *connector;
415c3ac3 374 struct drm_connector_state *new_conn_state;
623369e5 375 int i;
f9ad86e4 376 int ret;
623369e5 377
415c3ac3
ML
378 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
379 if (!new_crtc_state->mode_changed &&
380 !new_crtc_state->connectors_changed)
623369e5
DV
381 continue;
382
415c3ac3 383 drm_mode_copy(&new_crtc_state->adjusted_mode, &new_crtc_state->mode);
623369e5
DV
384 }
385
415c3ac3 386 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
b5ceff20 387 const struct drm_encoder_helper_funcs *funcs;
623369e5
DV
388 struct drm_encoder *encoder;
389
415c3ac3 390 WARN_ON(!!new_conn_state->best_encoder != !!new_conn_state->crtc);
623369e5 391
415c3ac3 392 if (!new_conn_state->crtc || !new_conn_state->best_encoder)
623369e5
DV
393 continue;
394
415c3ac3 395 new_crtc_state =
b4d93679 396 drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
623369e5
DV
397
398 /*
399 * Each encoder has at most one connector (since we always steal
400 * it away), so we won't call ->mode_fixup twice.
401 */
415c3ac3 402 encoder = new_conn_state->best_encoder;
623369e5
DV
403 funcs = encoder->helper_private;
404
415c3ac3
ML
405 ret = drm_bridge_mode_fixup(encoder->bridge, &new_crtc_state->mode,
406 &new_crtc_state->adjusted_mode);
862e686c
AT
407 if (!ret) {
408 DRM_DEBUG_ATOMIC("Bridge fixup failed\n");
409 return -EINVAL;
623369e5
DV
410 }
411
2827635e 412 if (funcs && funcs->atomic_check) {
415c3ac3
ML
413 ret = funcs->atomic_check(encoder, new_crtc_state,
414 new_conn_state);
4cd4df80 415 if (ret) {
17a38d9c
DV
416 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n",
417 encoder->base.id, encoder->name);
4cd4df80
TR
418 return ret;
419 }
2827635e 420 } else if (funcs && funcs->mode_fixup) {
415c3ac3
ML
421 ret = funcs->mode_fixup(encoder, &new_crtc_state->mode,
422 &new_crtc_state->adjusted_mode);
4cd4df80 423 if (!ret) {
17a38d9c
DV
424 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n",
425 encoder->base.id, encoder->name);
4cd4df80
TR
426 return -EINVAL;
427 }
623369e5
DV
428 }
429 }
430
415c3ac3 431 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
b5ceff20 432 const struct drm_crtc_helper_funcs *funcs;
623369e5 433
415c3ac3 434 if (!new_crtc_state->enable)
f55f1701
LY
435 continue;
436
415c3ac3
ML
437 if (!new_crtc_state->mode_changed &&
438 !new_crtc_state->connectors_changed)
623369e5
DV
439 continue;
440
441 funcs = crtc->helper_private;
840bfe95
ACO
442 if (!funcs->mode_fixup)
443 continue;
444
415c3ac3
ML
445 ret = funcs->mode_fixup(crtc, &new_crtc_state->mode,
446 &new_crtc_state->adjusted_mode);
623369e5 447 if (!ret) {
fa3ab4c2
VS
448 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] fixup failed\n",
449 crtc->base.id, crtc->name);
623369e5
DV
450 return -EINVAL;
451 }
452 }
453
454 return 0;
455}
456
faf94a08
JA
457static enum drm_mode_status mode_valid_path(struct drm_connector *connector,
458 struct drm_encoder *encoder,
459 struct drm_crtc *crtc,
460 struct drm_display_mode *mode)
461{
462 enum drm_mode_status ret;
463
464 ret = drm_encoder_mode_valid(encoder, mode);
465 if (ret != MODE_OK) {
466 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] mode_valid() failed\n",
467 encoder->base.id, encoder->name);
468 return ret;
469 }
470
471 ret = drm_bridge_mode_valid(encoder->bridge, mode);
472 if (ret != MODE_OK) {
473 DRM_DEBUG_ATOMIC("[BRIDGE] mode_valid() failed\n");
474 return ret;
475 }
476
477 ret = drm_crtc_mode_valid(crtc, mode);
478 if (ret != MODE_OK) {
479 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode_valid() failed\n",
480 crtc->base.id, crtc->name);
481 return ret;
482 }
483
484 return ret;
485}
486
487static int
488mode_valid(struct drm_atomic_state *state)
489{
490 struct drm_connector_state *conn_state;
491 struct drm_connector *connector;
492 int i;
493
494 for_each_new_connector_in_state(state, connector, conn_state, i) {
495 struct drm_encoder *encoder = conn_state->best_encoder;
496 struct drm_crtc *crtc = conn_state->crtc;
497 struct drm_crtc_state *crtc_state;
498 enum drm_mode_status mode_status;
499 struct drm_display_mode *mode;
500
501 if (!crtc || !encoder)
502 continue;
503
504 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
505 if (!crtc_state)
506 continue;
507 if (!crtc_state->mode_changed && !crtc_state->connectors_changed)
508 continue;
509
510 mode = &crtc_state->mode;
511
512 mode_status = mode_valid_path(connector, encoder, crtc, mode);
513 if (mode_status != MODE_OK)
514 return -EINVAL;
515 }
516
517 return 0;
518}
519
d9b13620 520/**
f98bd3ef 521 * drm_atomic_helper_check_modeset - validate state object for modeset changes
d9b13620
DV
522 * @dev: DRM device
523 * @state: the driver state object
524 *
525 * Check the state object to see if the requested state is physically possible.
526 * This does all the crtc and connector related computations for an atomic
ce09d766
ML
527 * update and adds any additional connectors needed for full modesets. It calls
528 * the various per-object callbacks in the follow order:
529 *
530 * 1. &drm_connector_helper_funcs.atomic_best_encoder for determining the new encoder.
531 * 2. &drm_connector_helper_funcs.atomic_check to validate the connector state.
532 * 3. If it's determined a modeset is needed then all connectors on the affected crtc
533 * crtc are added and &drm_connector_helper_funcs.atomic_check is run on them.
faf94a08
JA
534 * 4. &drm_encoder_helper_funcs.mode_valid, &drm_bridge_funcs.mode_valid and
535 * &drm_crtc_helper_funcs.mode_valid are called on the affected components.
536 * 5. &drm_bridge_funcs.mode_fixup is called on all encoder bridges.
537 * 6. &drm_encoder_helper_funcs.atomic_check is called to validate any encoder state.
ce09d766
ML
538 * This function is only called when the encoder will be part of a configured crtc,
539 * it must not be used for implementing connector property validation.
540 * If this function is NULL, &drm_atomic_encoder_helper_funcs.mode_fixup is called
541 * instead.
faf94a08 542 * 7. &drm_crtc_helper_funcs.mode_fixup is called last, to fix up the mode with crtc constraints.
6806cdf9
DV
543 *
544 * &drm_crtc_state.mode_changed is set when the input mode is changed.
545 * &drm_crtc_state.connectors_changed is set when a connector is added or
546 * removed from the crtc. &drm_crtc_state.active_changed is set when
547 * &drm_crtc_state.active changes, which is used for DPMS.
d807ed1c 548 * See also: drm_atomic_crtc_needs_modeset()
d9b13620
DV
549 *
550 * IMPORTANT:
551 *
6806cdf9
DV
552 * Drivers which set &drm_crtc_state.mode_changed (e.g. in their
553 * &drm_plane_helper_funcs.atomic_check hooks if a plane update can't be done
554 * without a full modeset) _must_ call this function afterwards after that
555 * change. It is permitted to call this function multiple times for the same
556 * update, e.g. when the &drm_crtc_helper_funcs.atomic_check functions depend
557 * upon the adjusted dotclock for fifo space allocation and watermark
558 * computation.
d9b13620 559 *
c39032a8 560 * RETURNS:
d9b13620
DV
561 * Zero for success or -errno
562 */
563int
934ce1c2 564drm_atomic_helper_check_modeset(struct drm_device *dev,
623369e5
DV
565 struct drm_atomic_state *state)
566{
623369e5 567 struct drm_crtc *crtc;
415c3ac3 568 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
df63b999 569 struct drm_connector *connector;
415c3ac3 570 struct drm_connector_state *old_connector_state, *new_connector_state;
623369e5 571 int i, ret;
ce09d766 572 unsigned connectors_mask = 0;
623369e5 573
415c3ac3 574 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
970ece83
ML
575 bool has_connectors =
576 !!new_crtc_state->connector_mask;
577
869e188a
DV
578 WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
579
415c3ac3 580 if (!drm_mode_equal(&old_crtc_state->mode, &new_crtc_state->mode)) {
fa3ab4c2
VS
581 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
582 crtc->base.id, crtc->name);
415c3ac3 583 new_crtc_state->mode_changed = true;
623369e5
DV
584 }
585
415c3ac3 586 if (old_crtc_state->enable != new_crtc_state->enable) {
fa3ab4c2
VS
587 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enable changed\n",
588 crtc->base.id, crtc->name);
fc596660
ML
589
590 /*
591 * For clarity this assignment is done here, but
592 * enable == 0 is only true when there are no
593 * connectors and a NULL mode.
594 *
595 * The other way around is true as well. enable != 0
596 * iff connectors are attached and a mode is set.
597 */
415c3ac3
ML
598 new_crtc_state->mode_changed = true;
599 new_crtc_state->connectors_changed = true;
623369e5 600 }
24d6652c
ML
601
602 if (old_crtc_state->active != new_crtc_state->active) {
603 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active changed\n",
604 crtc->base.id, crtc->name);
605 new_crtc_state->active_changed = true;
606 }
970ece83
ML
607
608 if (new_crtc_state->enable != has_connectors) {
609 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled/connectors mismatch\n",
610 crtc->base.id, crtc->name);
611
612 return -EINVAL;
613 }
623369e5
DV
614 }
615
44596b8c 616 ret = handle_conflicting_encoders(state, false);
8248b65d
ML
617 if (ret)
618 return ret;
40616a26 619
415c3ac3 620 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
ce09d766
ML
621 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
622
869e188a
DV
623 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
624
623369e5 625 /*
d807ed1c
BS
626 * This only sets crtc->connectors_changed for routing changes,
627 * drivers must set crtc->connectors_changed themselves when
628 * connector properties need to be updated.
623369e5 629 */
9459545b 630 ret = update_connector_routing(state, connector,
415c3ac3
ML
631 old_connector_state,
632 new_connector_state);
623369e5
DV
633 if (ret)
634 return ret;
415c3ac3 635 if (old_connector_state->crtc) {
b4d93679
ML
636 new_crtc_state = drm_atomic_get_new_crtc_state(state,
637 old_connector_state->crtc);
415c3ac3
ML
638 if (old_connector_state->link_status !=
639 new_connector_state->link_status)
640 new_crtc_state->connectors_changed = true;
40ee6fbe 641 }
ce09d766
ML
642
643 if (funcs->atomic_check)
644 ret = funcs->atomic_check(connector, new_connector_state);
645 if (ret)
646 return ret;
647
ca52bea9 648 connectors_mask |= BIT(i);
623369e5
DV
649 }
650
651 /*
652 * After all the routing has been prepared we need to add in any
653 * connector which is itself unchanged, but who's crtc changes it's
654 * configuration. This must be done before calling mode_fixup in case a
655 * crtc only changed its mode but has the same set of connectors.
656 */
415c3ac3 657 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
415c3ac3 658 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
623369e5
DV
659 continue;
660
fa3ab4c2
VS
661 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] needs all connectors, enable: %c, active: %c\n",
662 crtc->base.id, crtc->name,
415c3ac3
ML
663 new_crtc_state->enable ? 'y' : 'n',
664 new_crtc_state->active ? 'y' : 'n');
623369e5
DV
665
666 ret = drm_atomic_add_affected_connectors(state, crtc);
667 if (ret != 0)
668 return ret;
669
57744aa7
ML
670 ret = drm_atomic_add_affected_planes(state, crtc);
671 if (ret != 0)
672 return ret;
623369e5
DV
673 }
674
ce09d766
ML
675 /*
676 * Iterate over all connectors again, to make sure atomic_check()
677 * has been called on them when a modeset is forced.
678 */
679 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
680 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
681
682 if (connectors_mask & BIT(i))
683 continue;
684
685 if (funcs->atomic_check)
686 ret = funcs->atomic_check(connector, new_connector_state);
687 if (ret)
688 return ret;
689 }
690
faf94a08
JA
691 ret = mode_valid(state);
692 if (ret)
693 return ret;
694
623369e5
DV
695 return mode_fixup(state);
696}
d9b13620 697EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
623369e5 698
a01cb8ba
VS
699/**
700 * drm_atomic_helper_check_plane_state() - Check plane state for validity
701 * @plane_state: plane state to check
702 * @crtc_state: crtc state to check
a01cb8ba
VS
703 * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
704 * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
705 * @can_position: is it legal to position the plane such that it
706 * doesn't cover the entire crtc? This will generally
707 * only be false for primary planes.
708 * @can_update_disabled: can the plane be updated while the crtc
709 * is disabled?
710 *
711 * Checks that a desired plane update is valid, and updates various
712 * bits of derived state (clipped coordinates etc.). Drivers that provide
713 * their own plane handling rather than helper-provided implementations may
714 * still wish to call this function to avoid duplication of error checking
715 * code.
716 *
717 * RETURNS:
718 * Zero if update appears valid, error code on failure
719 */
720int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
721 const struct drm_crtc_state *crtc_state,
a01cb8ba
VS
722 int min_scale,
723 int max_scale,
724 bool can_position,
725 bool can_update_disabled)
726{
727 struct drm_framebuffer *fb = plane_state->fb;
728 struct drm_rect *src = &plane_state->src;
729 struct drm_rect *dst = &plane_state->dst;
730 unsigned int rotation = plane_state->rotation;
81af63a4 731 struct drm_rect clip = {};
a01cb8ba
VS
732 int hscale, vscale;
733
734 WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
735
736 *src = drm_plane_state_src(plane_state);
737 *dst = drm_plane_state_dest(plane_state);
738
739 if (!fb) {
740 plane_state->visible = false;
741 return 0;
742 }
743
744 /* crtc should only be NULL when disabling (i.e., !fb) */
745 if (WARN_ON(!plane_state->crtc)) {
746 plane_state->visible = false;
747 return 0;
748 }
749
750 if (!crtc_state->enable && !can_update_disabled) {
751 DRM_DEBUG_KMS("Cannot update plane of a disabled CRTC.\n");
752 return -EINVAL;
753 }
754
755 drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
756
757 /* Check scaling */
758 hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
759 vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
760 if (hscale < 0 || vscale < 0) {
761 DRM_DEBUG_KMS("Invalid scaling of plane\n");
762 drm_rect_debug_print("src: ", &plane_state->src, true);
763 drm_rect_debug_print("dst: ", &plane_state->dst, false);
764 return -ERANGE;
765 }
766
81af63a4
VS
767 if (crtc_state->enable)
768 drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2);
769
f96bdf56 770 plane_state->visible = drm_rect_clip_scaled(src, dst, &clip);
a01cb8ba
VS
771
772 drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
773
774 if (!plane_state->visible)
775 /*
776 * Plane isn't visible; some drivers can handle this
777 * so we just return success here. Drivers that can't
778 * (including those that use the primary plane helper's
779 * update function) will return an error from their
780 * update_plane handler.
781 */
782 return 0;
783
81af63a4 784 if (!can_position && !drm_rect_equals(dst, &clip)) {
a01cb8ba
VS
785 DRM_DEBUG_KMS("Plane must cover entire CRTC\n");
786 drm_rect_debug_print("dst: ", dst, false);
81af63a4 787 drm_rect_debug_print("clip: ", &clip, false);
a01cb8ba
VS
788 return -EINVAL;
789 }
790
791 return 0;
792}
793EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
794
c2fcd274 795/**
f98bd3ef 796 * drm_atomic_helper_check_planes - validate state object for planes changes
c2fcd274
DV
797 * @dev: DRM device
798 * @state: the driver state object
799 *
800 * Check the state object to see if the requested state is physically possible.
d9b13620 801 * This does all the plane update related checks using by calling into the
6806cdf9
DV
802 * &drm_crtc_helper_funcs.atomic_check and &drm_plane_helper_funcs.atomic_check
803 * hooks provided by the driver.
c2fcd274 804 *
6806cdf9 805 * It also sets &drm_crtc_state.planes_changed to indicate that a crtc has
fc596660
ML
806 * updated planes.
807 *
c39032a8 808 * RETURNS:
c2fcd274
DV
809 * Zero for success or -errno
810 */
d9b13620
DV
811int
812drm_atomic_helper_check_planes(struct drm_device *dev,
813 struct drm_atomic_state *state)
c2fcd274 814{
df63b999 815 struct drm_crtc *crtc;
415c3ac3 816 struct drm_crtc_state *new_crtc_state;
df63b999 817 struct drm_plane *plane;
415c3ac3 818 struct drm_plane_state *new_plane_state, *old_plane_state;
c2fcd274
DV
819 int i, ret = 0;
820
415c3ac3 821 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
b5ceff20 822 const struct drm_plane_helper_funcs *funcs;
c2fcd274 823
869e188a
DV
824 WARN_ON(!drm_modeset_is_locked(&plane->mutex));
825
c2fcd274
DV
826 funcs = plane->helper_private;
827
415c3ac3 828 drm_atomic_helper_plane_changed(state, old_plane_state, new_plane_state, plane);
c2fcd274
DV
829
830 if (!funcs || !funcs->atomic_check)
831 continue;
832
415c3ac3 833 ret = funcs->atomic_check(plane, new_plane_state);
c2fcd274 834 if (ret) {
9f4c97a2
VS
835 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
836 plane->base.id, plane->name);
c2fcd274
DV
837 return ret;
838 }
839 }
840
415c3ac3 841 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
b5ceff20 842 const struct drm_crtc_helper_funcs *funcs;
c2fcd274
DV
843
844 funcs = crtc->helper_private;
845
846 if (!funcs || !funcs->atomic_check)
847 continue;
848
415c3ac3 849 ret = funcs->atomic_check(crtc, new_crtc_state);
c2fcd274 850 if (ret) {
fa3ab4c2
VS
851 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
852 crtc->base.id, crtc->name);
c2fcd274
DV
853 return ret;
854 }
855 }
856
d9b13620
DV
857 return ret;
858}
859EXPORT_SYMBOL(drm_atomic_helper_check_planes);
860
861/**
862 * drm_atomic_helper_check - validate state object
863 * @dev: DRM device
864 * @state: the driver state object
865 *
866 * Check the state object to see if the requested state is physically possible.
867 * Only crtcs and planes have check callbacks, so for any additional (global)
868 * checking that a driver needs it can simply wrap that around this function.
6806cdf9
DV
869 * Drivers without such needs can directly use this as their
870 * &drm_mode_config_funcs.atomic_check callback.
d9b13620 871 *
b4274fbe
DV
872 * This just wraps the two parts of the state checking for planes and modeset
873 * state in the default order: First it calls drm_atomic_helper_check_modeset()
874 * and then drm_atomic_helper_check_planes(). The assumption is that the
6806cdf9
DV
875 * @drm_plane_helper_funcs.atomic_check and @drm_crtc_helper_funcs.atomic_check
876 * functions depend upon an updated adjusted_mode.clock to e.g. properly compute
877 * watermarks.
b4274fbe 878 *
49efffc7
PU
879 * Note that zpos normalization will add all enable planes to the state which
880 * might not desired for some drivers.
881 * For example enable/disable of a cursor plane which have fixed zpos value
882 * would trigger all other enabled planes to be forced to the state change.
883 *
c39032a8 884 * RETURNS:
d9b13620
DV
885 * Zero for success or -errno
886 */
887int drm_atomic_helper_check(struct drm_device *dev,
888 struct drm_atomic_state *state)
889{
890 int ret;
891
b4274fbe 892 ret = drm_atomic_helper_check_modeset(dev, state);
d9b13620
DV
893 if (ret)
894 return ret;
895
49efffc7
PU
896 if (dev->mode_config.normalize_zpos) {
897 ret = drm_atomic_normalize_zpos(dev, state);
898 if (ret)
899 return ret;
900 }
901
b4274fbe 902 ret = drm_atomic_helper_check_planes(dev, state);
934ce1c2
RC
903 if (ret)
904 return ret;
905
fef9df8b
GP
906 if (state->legacy_cursor_update)
907 state->async_update = !drm_atomic_helper_async_check(dev, state);
908
c2fcd274
DV
909 return ret;
910}
911EXPORT_SYMBOL(drm_atomic_helper_check);
912
623369e5
DV
913static void
914disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
915{
df63b999 916 struct drm_connector *connector;
415c3ac3 917 struct drm_connector_state *old_conn_state, *new_conn_state;
df63b999 918 struct drm_crtc *crtc;
415c3ac3 919 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
623369e5
DV
920 int i;
921
415c3ac3 922 for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
b5ceff20 923 const struct drm_encoder_helper_funcs *funcs;
623369e5
DV
924 struct drm_encoder *encoder;
925
623369e5
DV
926 /* Shut down everything that's in the changeset and currently
927 * still on. So need to check the old, saved state. */
df63b999 928 if (!old_conn_state->crtc)
623369e5
DV
929 continue;
930
b4d93679 931 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, old_conn_state->crtc);
eab3bbef 932
4218a32f 933 if (!old_crtc_state->active ||
2465ff62 934 !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
eab3bbef
DV
935 continue;
936
46df9adb 937 encoder = old_conn_state->best_encoder;
623369e5 938
46df9adb
RC
939 /* We shouldn't get this far if we didn't previously have
940 * an encoder.. but WARN_ON() rather than explode.
941 */
942 if (WARN_ON(!encoder))
623369e5
DV
943 continue;
944
945 funcs = encoder->helper_private;
946
17a38d9c
DV
947 DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
948 encoder->base.id, encoder->name);
95d6eb3b 949
623369e5
DV
950 /*
951 * Each encoder has at most one connector (since we always steal
f98bd3ef 952 * it away), so we won't call disable hooks twice.
623369e5 953 */
862e686c 954 drm_bridge_disable(encoder->bridge);
623369e5
DV
955
956 /* Right function depends upon target state. */
2827635e 957 if (funcs) {
415c3ac3 958 if (new_conn_state->crtc && funcs->prepare)
2827635e
NT
959 funcs->prepare(encoder);
960 else if (funcs->disable)
961 funcs->disable(encoder);
962 else if (funcs->dpms)
963 funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
964 }
623369e5 965
862e686c 966 drm_bridge_post_disable(encoder->bridge);
623369e5
DV
967 }
968
415c3ac3 969 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
b5ceff20 970 const struct drm_crtc_helper_funcs *funcs;
84014b0a 971 int ret;
623369e5
DV
972
973 /* Shut down everything that needs a full modeset. */
415c3ac3 974 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
eab3bbef
DV
975 continue;
976
977 if (!old_crtc_state->active)
623369e5
DV
978 continue;
979
980 funcs = crtc->helper_private;
981
fa3ab4c2
VS
982 DRM_DEBUG_ATOMIC("disabling [CRTC:%d:%s]\n",
983 crtc->base.id, crtc->name);
95d6eb3b
DV
984
985
623369e5 986 /* Right function depends upon target state. */
415c3ac3 987 if (new_crtc_state->enable && funcs->prepare)
623369e5 988 funcs->prepare(crtc);
c9ac8b4c
LY
989 else if (funcs->atomic_disable)
990 funcs->atomic_disable(crtc, old_crtc_state);
623369e5
DV
991 else if (funcs->disable)
992 funcs->disable(crtc);
993 else
994 funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
84014b0a
DV
995
996 if (!(dev->irq_enabled && dev->num_crtcs))
997 continue;
998
999 ret = drm_crtc_vblank_get(crtc);
1000 WARN_ONCE(ret != -EINVAL, "driver forgot to call drm_crtc_vblank_off()\n");
1001 if (ret == 0)
1002 drm_crtc_vblank_put(crtc);
623369e5
DV
1003 }
1004}
1005
4c18d301
DV
1006/**
1007 * drm_atomic_helper_update_legacy_modeset_state - update legacy modeset state
1008 * @dev: DRM device
1009 * @old_state: atomic state object with old state structures
1010 *
1011 * This function updates all the various legacy modeset state pointers in
1012 * connectors, encoders and crtcs. It also updates the timestamping constants
1013 * used for precise vblank timestamps by calling
1014 * drm_calc_timestamping_constants().
1015 *
1016 * Drivers can use this for building their own atomic commit if they don't have
1017 * a pure helper-based modeset implementation.
2e2b96ef
DV
1018 *
1019 * Since these updates are not synchronized with lockings, only code paths
1020 * called from &drm_mode_config_helper_funcs.atomic_commit_tail can look at the
1021 * legacy state filled out by this helper. Defacto this means this helper and
1022 * the legacy state pointers are only really useful for transitioning an
1023 * existing driver to the atomic world.
4c18d301
DV
1024 */
1025void
1026drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
1027 struct drm_atomic_state *old_state)
623369e5 1028{
df63b999 1029 struct drm_connector *connector;
415c3ac3 1030 struct drm_connector_state *old_conn_state, *new_conn_state;
df63b999 1031 struct drm_crtc *crtc;
415c3ac3 1032 struct drm_crtc_state *new_crtc_state;
623369e5
DV
1033 int i;
1034
8c10342c 1035 /* clear out existing links and update dpms */
415c3ac3 1036 for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
8c10342c
ML
1037 if (connector->encoder) {
1038 WARN_ON(!connector->encoder->crtc);
1039
1040 connector->encoder->crtc = NULL;
1041 connector->encoder = NULL;
1042 }
623369e5 1043
415c3ac3 1044 crtc = new_conn_state->crtc;
8c10342c
ML
1045 if ((!crtc && old_conn_state->crtc) ||
1046 (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
8c10342c 1047 int mode = DRM_MODE_DPMS_OFF;
623369e5 1048
8c10342c
ML
1049 if (crtc && crtc->state->active)
1050 mode = DRM_MODE_DPMS_ON;
1051
1052 connector->dpms = mode;
8c10342c 1053 }
623369e5
DV
1054 }
1055
1056 /* set new links */
415c3ac3
ML
1057 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1058 if (!new_conn_state->crtc)
623369e5
DV
1059 continue;
1060
415c3ac3 1061 if (WARN_ON(!new_conn_state->best_encoder))
623369e5
DV
1062 continue;
1063
415c3ac3
ML
1064 connector->encoder = new_conn_state->best_encoder;
1065 connector->encoder->crtc = new_conn_state->crtc;
623369e5
DV
1066 }
1067
1068 /* set legacy state in the crtc structure */
415c3ac3 1069 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
2660801f 1070 struct drm_plane *primary = crtc->primary;
b4d93679 1071 struct drm_plane_state *new_plane_state;
2660801f 1072
415c3ac3
ML
1073 crtc->mode = new_crtc_state->mode;
1074 crtc->enabled = new_crtc_state->enable;
2660801f 1075
b4d93679
ML
1076 new_plane_state =
1077 drm_atomic_get_new_plane_state(old_state, primary);
1078
1079 if (new_plane_state && new_plane_state->crtc == crtc) {
1080 crtc->x = new_plane_state->src_x >> 16;
1081 crtc->y = new_plane_state->src_y >> 16;
2660801f 1082 }
3d51d2d2 1083
415c3ac3 1084 if (new_crtc_state->enable)
3d51d2d2 1085 drm_calc_timestamping_constants(crtc,
415c3ac3 1086 &new_crtc_state->adjusted_mode);
623369e5
DV
1087 }
1088}
4c18d301 1089EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state);
623369e5
DV
1090
1091static void
1092crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
1093{
df63b999 1094 struct drm_crtc *crtc;
415c3ac3 1095 struct drm_crtc_state *new_crtc_state;
df63b999 1096 struct drm_connector *connector;
415c3ac3 1097 struct drm_connector_state *new_conn_state;
623369e5
DV
1098 int i;
1099
415c3ac3 1100 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
b5ceff20 1101 const struct drm_crtc_helper_funcs *funcs;
623369e5 1102
415c3ac3 1103 if (!new_crtc_state->mode_changed)
623369e5
DV
1104 continue;
1105
1106 funcs = crtc->helper_private;
1107
415c3ac3 1108 if (new_crtc_state->enable && funcs->mode_set_nofb) {
fa3ab4c2
VS
1109 DRM_DEBUG_ATOMIC("modeset on [CRTC:%d:%s]\n",
1110 crtc->base.id, crtc->name);
95d6eb3b 1111
623369e5 1112 funcs->mode_set_nofb(crtc);
95d6eb3b 1113 }
623369e5
DV
1114 }
1115
415c3ac3 1116 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
b5ceff20 1117 const struct drm_encoder_helper_funcs *funcs;
623369e5
DV
1118 struct drm_encoder *encoder;
1119 struct drm_display_mode *mode, *adjusted_mode;
1120
415c3ac3 1121 if (!new_conn_state->best_encoder)
623369e5
DV
1122 continue;
1123
415c3ac3 1124 encoder = new_conn_state->best_encoder;
623369e5 1125 funcs = encoder->helper_private;
415c3ac3 1126 new_crtc_state = new_conn_state->crtc->state;
623369e5
DV
1127 mode = &new_crtc_state->mode;
1128 adjusted_mode = &new_crtc_state->adjusted_mode;
1129
eab3bbef
DV
1130 if (!new_crtc_state->mode_changed)
1131 continue;
1132
17a38d9c
DV
1133 DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
1134 encoder->base.id, encoder->name);
95d6eb3b 1135
623369e5
DV
1136 /*
1137 * Each encoder has at most one connector (since we always steal
f98bd3ef 1138 * it away), so we won't call mode_set hooks twice.
623369e5 1139 */
fe4a11c9
PZ
1140 if (funcs && funcs->atomic_mode_set) {
1141 funcs->atomic_mode_set(encoder, new_crtc_state,
415c3ac3 1142 new_conn_state);
fe4a11c9 1143 } else if (funcs && funcs->mode_set) {
c982bd90 1144 funcs->mode_set(encoder, mode, adjusted_mode);
fe4a11c9 1145 }
623369e5 1146
862e686c 1147 drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
623369e5
DV
1148 }
1149}
1150
1151/**
1af434a9 1152 * drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs
623369e5 1153 * @dev: DRM device
a072f809 1154 * @old_state: atomic state object with old state structures
623369e5 1155 *
1af434a9 1156 * This function shuts down all the outputs that need to be shut down and
623369e5 1157 * prepares them (if required) with the new mode.
1af434a9 1158 *
60acc4eb 1159 * For compatibility with legacy crtc helpers this should be called before
1af434a9
DV
1160 * drm_atomic_helper_commit_planes(), which is what the default commit function
1161 * does. But drivers with different needs can group the modeset commits together
1162 * and do the plane commits at the end. This is useful for drivers doing runtime
1163 * PM since planes updates then only happen when the CRTC is actually enabled.
623369e5 1164 */
1af434a9
DV
1165void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
1166 struct drm_atomic_state *old_state)
623369e5 1167{
a072f809 1168 disable_outputs(dev, old_state);
4c18d301
DV
1169
1170 drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
1171
a072f809 1172 crtc_set_mode(dev, old_state);
623369e5 1173}
1af434a9 1174EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
623369e5 1175
935774cd
BS
1176static void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
1177 struct drm_atomic_state *old_state)
1178{
1179 struct drm_connector *connector;
1180 struct drm_connector_state *new_conn_state;
1181 int i;
1182
1183 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1184 const struct drm_connector_helper_funcs *funcs;
1185
1186 funcs = connector->helper_private;
814bde99
BB
1187 if (!funcs->atomic_commit)
1188 continue;
935774cd
BS
1189
1190 if (new_conn_state->writeback_job && new_conn_state->writeback_job->fb) {
1191 WARN_ON(connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK);
425132fd 1192 funcs->atomic_commit(connector, new_conn_state);
935774cd
BS
1193 }
1194 }
1195}
1196
623369e5 1197/**
1af434a9 1198 * drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs
623369e5
DV
1199 * @dev: DRM device
1200 * @old_state: atomic state object with old state structures
1201 *
1af434a9
DV
1202 * This function enables all the outputs with the new configuration which had to
1203 * be turned off for the update.
1204 *
60acc4eb 1205 * For compatibility with legacy crtc helpers this should be called after
1af434a9
DV
1206 * drm_atomic_helper_commit_planes(), which is what the default commit function
1207 * does. But drivers with different needs can group the modeset commits together
1208 * and do the plane commits at the end. This is useful for drivers doing runtime
1209 * PM since planes updates then only happen when the CRTC is actually enabled.
623369e5 1210 */
1af434a9
DV
1211void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
1212 struct drm_atomic_state *old_state)
623369e5 1213{
df63b999 1214 struct drm_crtc *crtc;
0b20a0f8 1215 struct drm_crtc_state *old_crtc_state;
415c3ac3 1216 struct drm_crtc_state *new_crtc_state;
df63b999 1217 struct drm_connector *connector;
415c3ac3 1218 struct drm_connector_state *new_conn_state;
623369e5
DV
1219 int i;
1220
0b20a0f8 1221 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
b5ceff20 1222 const struct drm_crtc_helper_funcs *funcs;
623369e5
DV
1223
1224 /* Need to filter out CRTCs where only planes change. */
415c3ac3 1225 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
eab3bbef
DV
1226 continue;
1227
415c3ac3 1228 if (!new_crtc_state->active)
623369e5
DV
1229 continue;
1230
1231 funcs = crtc->helper_private;
1232
415c3ac3 1233 if (new_crtc_state->enable) {
fa3ab4c2
VS
1234 DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
1235 crtc->base.id, crtc->name);
95d6eb3b 1236
0b20a0f8
LP
1237 if (funcs->atomic_enable)
1238 funcs->atomic_enable(crtc, old_crtc_state);
ee0a89cf
DV
1239 else
1240 funcs->commit(crtc);
1241 }
623369e5
DV
1242 }
1243
415c3ac3 1244 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
b5ceff20 1245 const struct drm_encoder_helper_funcs *funcs;
623369e5
DV
1246 struct drm_encoder *encoder;
1247
415c3ac3 1248 if (!new_conn_state->best_encoder)
623369e5
DV
1249 continue;
1250
415c3ac3
ML
1251 if (!new_conn_state->crtc->state->active ||
1252 !drm_atomic_crtc_needs_modeset(new_conn_state->crtc->state))
eab3bbef
DV
1253 continue;
1254
415c3ac3 1255 encoder = new_conn_state->best_encoder;
623369e5
DV
1256 funcs = encoder->helper_private;
1257
17a38d9c
DV
1258 DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
1259 encoder->base.id, encoder->name);
95d6eb3b 1260
623369e5
DV
1261 /*
1262 * Each encoder has at most one connector (since we always steal
f98bd3ef 1263 * it away), so we won't call enable hooks twice.
623369e5 1264 */
862e686c 1265 drm_bridge_pre_enable(encoder->bridge);
623369e5 1266
2827635e
NT
1267 if (funcs) {
1268 if (funcs->enable)
1269 funcs->enable(encoder);
1270 else if (funcs->commit)
1271 funcs->commit(encoder);
1272 }
623369e5 1273
862e686c 1274 drm_bridge_enable(encoder->bridge);
623369e5 1275 }
935774cd
BS
1276
1277 drm_atomic_helper_commit_writebacks(dev, old_state);
623369e5 1278}
1af434a9 1279EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
623369e5 1280
4c5b7f3a
RC
1281/**
1282 * drm_atomic_helper_wait_for_fences - wait for fences stashed in plane state
1283 * @dev: DRM device
1284 * @state: atomic state object with old state structures
1ea0c02e
DV
1285 * @pre_swap: If true, do an interruptible wait, and @state is the new state.
1286 * Otherwise @state is the old state.
4c5b7f3a
RC
1287 *
1288 * For implicit sync, driver should fish the exclusive fence out from the
1289 * incoming fb's and stash it in the drm_plane_state. This is called after
1290 * drm_atomic_helper_swap_state() so it uses the current plane state (and
1291 * just uses the atomic state to find the changed planes)
f6ce410a 1292 *
1ea0c02e
DV
1293 * Note that @pre_swap is needed since the point where we block for fences moves
1294 * around depending upon whether an atomic commit is blocking or
42590372
GP
1295 * non-blocking. For non-blocking commit all waiting needs to happen after
1296 * drm_atomic_helper_swap_state() is called, but for blocking commits we want
1ea0c02e
DV
1297 * to wait **before** we do anything that can't be easily rolled back. That is
1298 * before we call drm_atomic_helper_swap_state().
1299 *
f54d1867 1300 * Returns zero if success or < 0 if dma_fence_wait() fails.
4c5b7f3a 1301 */
f6ce410a
GP
1302int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
1303 struct drm_atomic_state *state,
1304 bool pre_swap)
e2330f07 1305{
df63b999 1306 struct drm_plane *plane;
415c3ac3 1307 struct drm_plane_state *new_plane_state;
f6ce410a 1308 int i, ret;
e2330f07 1309
415c3ac3
ML
1310 for_each_new_plane_in_state(state, plane, new_plane_state, i) {
1311 if (!new_plane_state->fence)
e2330f07
DV
1312 continue;
1313
415c3ac3 1314 WARN_ON(!new_plane_state->fb);
f6ce410a
GP
1315
1316 /*
1317 * If waiting for fences pre-swap (ie: nonblock), userspace can
1318 * still interrupt the operation. Instead of blocking until the
1319 * timer expires, make the wait interruptible.
1320 */
415c3ac3 1321 ret = dma_fence_wait(new_plane_state->fence, pre_swap);
f6ce410a
GP
1322 if (ret)
1323 return ret;
e2330f07 1324
415c3ac3
ML
1325 dma_fence_put(new_plane_state->fence);
1326 new_plane_state->fence = NULL;
e2330f07 1327 }
f6ce410a
GP
1328
1329 return 0;
e2330f07 1330}
4c5b7f3a 1331EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
e2330f07 1332
5ee3229c
RC
1333/**
1334 * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
1335 * @dev: DRM device
1336 * @old_state: atomic state object with old state structures
1337 *
1338 * Helper to, after atomic commit, wait for vblanks on all effected
1339 * crtcs (ie. before cleaning up old framebuffers using
01086487 1340 * drm_atomic_helper_cleanup_planes()). It will only wait on CRTCs where the
ab58e338
DV
1341 * framebuffers have actually changed to optimize for the legacy cursor and
1342 * plane update use-case.
01086487
BB
1343 *
1344 * Drivers using the nonblocking commit tracking support initialized by calling
1345 * drm_atomic_helper_setup_commit() should look at
1346 * drm_atomic_helper_wait_for_flip_done() as an alternative.
5ee3229c
RC
1347 */
1348void
1349drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
1350 struct drm_atomic_state *old_state)
623369e5
DV
1351{
1352 struct drm_crtc *crtc;
415c3ac3 1353 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
623369e5 1354 int i, ret;
bdc57146 1355 unsigned crtc_mask = 0;
623369e5 1356
bdc57146
ML
1357 /*
1358 * Legacy cursor ioctls are completely unsynced, and userspace
1359 * relies on that (by doing tons of cursor updates).
1360 */
1361 if (old_state->legacy_cursor_update)
1362 return;
623369e5 1363
415c3ac3 1364 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
a76dfe35 1365 if (!new_crtc_state->active)
ab58e338
DV
1366 continue;
1367
623369e5
DV
1368 ret = drm_crtc_vblank_get(crtc);
1369 if (ret != 0)
1370 continue;
1371
bdc57146
ML
1372 crtc_mask |= drm_crtc_mask(crtc);
1373 old_state->crtcs[i].last_vblank_count = drm_crtc_vblank_count(crtc);
623369e5
DV
1374 }
1375
415c3ac3 1376 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
bdc57146 1377 if (!(crtc_mask & drm_crtc_mask(crtc)))
623369e5
DV
1378 continue;
1379
1380 ret = wait_event_timeout(dev->vblank[i].queue,
bdc57146 1381 old_state->crtcs[i].last_vblank_count !=
d4853630 1382 drm_crtc_vblank_count(crtc),
623369e5
DV
1383 msecs_to_jiffies(50));
1384
6ac7c548
RK
1385 WARN(!ret, "[CRTC:%d:%s] vblank wait timed out\n",
1386 crtc->base.id, crtc->name);
8d4d0d70 1387
623369e5
DV
1388 drm_crtc_vblank_put(crtc);
1389 }
1390}
5ee3229c 1391EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
623369e5 1392
01086487
BB
1393/**
1394 * drm_atomic_helper_wait_for_flip_done - wait for all page flips to be done
1395 * @dev: DRM device
1396 * @old_state: atomic state object with old state structures
1397 *
1398 * Helper to, after atomic commit, wait for page flips on all effected
1399 * crtcs (ie. before cleaning up old framebuffers using
1400 * drm_atomic_helper_cleanup_planes()). Compared to
1401 * drm_atomic_helper_wait_for_vblanks() this waits for the completion of on all
1402 * CRTCs, assuming that cursors-only updates are signalling their completion
1403 * immediately (or using a different path).
1404 *
1405 * This requires that drivers use the nonblocking commit tracking support
1406 * initialized using drm_atomic_helper_setup_commit().
1407 */
1408void drm_atomic_helper_wait_for_flip_done(struct drm_device *dev,
1409 struct drm_atomic_state *old_state)
1410{
163bcc2c 1411 struct drm_crtc_state *new_crtc_state;
01086487
BB
1412 struct drm_crtc *crtc;
1413 int i;
1414
163bcc2c
ML
1415 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
1416 struct drm_crtc_commit *commit = new_crtc_state->commit;
01086487
BB
1417 int ret;
1418
1419 if (!commit)
1420 continue;
1421
1422 ret = wait_for_completion_timeout(&commit->flip_done, 10 * HZ);
1423 if (ret == 0)
1424 DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1425 crtc->base.id, crtc->name);
1426 }
1427}
1428EXPORT_SYMBOL(drm_atomic_helper_wait_for_flip_done);
1429
623369e5 1430/**
9f2a7950 1431 * drm_atomic_helper_commit_tail - commit atomic update to hardware
1ea0c02e 1432 * @old_state: atomic state object with old state structures
623369e5 1433 *
6806cdf9 1434 * This is the default implementation for the
81a099ac
MR
1435 * &drm_mode_config_helper_funcs.atomic_commit_tail hook, for drivers
1436 * that do not support runtime_pm or do not need the CRTC to be
1437 * enabled to perform a commit. Otherwise, see
1438 * drm_atomic_helper_commit_tail_rpm().
623369e5 1439 *
9f2a7950 1440 * Note that the default ordering of how the various stages are called is to
81a099ac 1441 * match the legacy modeset helper library closest.
9f2a7950 1442 */
1ea0c02e 1443void drm_atomic_helper_commit_tail(struct drm_atomic_state *old_state)
9f2a7950 1444{
1ea0c02e 1445 struct drm_device *dev = old_state->dev;
9f2a7950 1446
1ea0c02e 1447 drm_atomic_helper_commit_modeset_disables(dev, old_state);
9f2a7950 1448
1ea0c02e 1449 drm_atomic_helper_commit_planes(dev, old_state, 0);
9f2a7950 1450
1ea0c02e 1451 drm_atomic_helper_commit_modeset_enables(dev, old_state);
9f2a7950 1452
6fb42b66
BB
1453 drm_atomic_helper_fake_vblank(old_state);
1454
1ea0c02e 1455 drm_atomic_helper_commit_hw_done(old_state);
9f2a7950 1456
1ea0c02e 1457 drm_atomic_helper_wait_for_vblanks(dev, old_state);
9f2a7950 1458
1ea0c02e 1459 drm_atomic_helper_cleanup_planes(dev, old_state);
9f2a7950
DV
1460}
1461EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
1462
81a099ac
MR
1463/**
1464 * drm_atomic_helper_commit_tail_rpm - commit atomic update to hardware
1465 * @old_state: new modeset state to be committed
1466 *
1467 * This is an alternative implementation for the
1468 * &drm_mode_config_helper_funcs.atomic_commit_tail hook, for drivers
1469 * that support runtime_pm or need the CRTC to be enabled to perform a
1470 * commit. Otherwise, one should use the default implementation
1471 * drm_atomic_helper_commit_tail().
1472 */
1473void drm_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state)
1474{
1475 struct drm_device *dev = old_state->dev;
1476
1477 drm_atomic_helper_commit_modeset_disables(dev, old_state);
1478
1479 drm_atomic_helper_commit_modeset_enables(dev, old_state);
1480
1481 drm_atomic_helper_commit_planes(dev, old_state,
1482 DRM_PLANE_COMMIT_ACTIVE_ONLY);
1483
6fb42b66
BB
1484 drm_atomic_helper_fake_vblank(old_state);
1485
81a099ac
MR
1486 drm_atomic_helper_commit_hw_done(old_state);
1487
1488 drm_atomic_helper_wait_for_vblanks(dev, old_state);
1489
1490 drm_atomic_helper_cleanup_planes(dev, old_state);
1491}
1492EXPORT_SYMBOL(drm_atomic_helper_commit_tail_rpm);
1493
1ea0c02e 1494static void commit_tail(struct drm_atomic_state *old_state)
9f2a7950 1495{
1ea0c02e 1496 struct drm_device *dev = old_state->dev;
a4b10cce 1497 const struct drm_mode_config_helper_funcs *funcs;
9f2a7950
DV
1498
1499 funcs = dev->mode_config.helper_private;
1500
1ea0c02e 1501 drm_atomic_helper_wait_for_fences(dev, old_state, false);
9f2a7950 1502
1ea0c02e 1503 drm_atomic_helper_wait_for_dependencies(old_state);
9f2a7950
DV
1504
1505 if (funcs && funcs->atomic_commit_tail)
1ea0c02e 1506 funcs->atomic_commit_tail(old_state);
9f2a7950 1507 else
1ea0c02e 1508 drm_atomic_helper_commit_tail(old_state);
9f2a7950 1509
1ea0c02e 1510 drm_atomic_helper_commit_cleanup_done(old_state);
9f2a7950 1511
1ea0c02e 1512 drm_atomic_state_put(old_state);
9f2a7950
DV
1513}
1514
1515static void commit_work(struct work_struct *work)
1516{
1517 struct drm_atomic_state *state = container_of(work,
1518 struct drm_atomic_state,
1519 commit_work);
1520 commit_tail(state);
1521}
1522
fef9df8b
GP
1523/**
1524 * drm_atomic_helper_async_check - check if state can be commited asynchronously
1525 * @dev: DRM device
1526 * @state: the driver state object
1527 *
1528 * This helper will check if it is possible to commit the state asynchronously.
1529 * Async commits are not supposed to swap the states like normal sync commits
1530 * but just do in-place changes on the current state.
1531 *
1532 * It will return 0 if the commit can happen in an asynchronous fashion or error
1533 * if not. Note that error just mean it can't be commited asynchronously, if it
1534 * fails the commit should be treated like a normal synchronous commit.
1535 */
1536int drm_atomic_helper_async_check(struct drm_device *dev,
1537 struct drm_atomic_state *state)
1538{
1539 struct drm_crtc *crtc;
1540 struct drm_crtc_state *crtc_state;
669c9215
ML
1541 struct drm_plane *plane;
1542 struct drm_plane_state *old_plane_state, *new_plane_state;
fef9df8b 1543 const struct drm_plane_helper_funcs *funcs;
669c9215 1544 int i, n_planes = 0;
fef9df8b
GP
1545
1546 for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
1547 if (drm_atomic_crtc_needs_modeset(crtc_state))
1548 return -EINVAL;
1549 }
1550
669c9215 1551 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i)
fef9df8b 1552 n_planes++;
fef9df8b
GP
1553
1554 /* FIXME: we support only single plane updates for now */
669c9215 1555 if (n_planes != 1)
fef9df8b
GP
1556 return -EINVAL;
1557
669c9215 1558 if (!new_plane_state->crtc)
fef9df8b
GP
1559 return -EINVAL;
1560
1561 funcs = plane->helper_private;
1562 if (!funcs->atomic_async_update)
1563 return -EINVAL;
1564
669c9215 1565 if (new_plane_state->fence)
fef9df8b
GP
1566 return -EINVAL;
1567
1568 /*
1569 * Don't do an async update if there is an outstanding commit modifying
1570 * the plane. This prevents our async update's changes from getting
1571 * overridden by a previous synchronous update's state.
1572 */
669c9215
ML
1573 if (old_plane_state->commit &&
1574 !try_wait_for_completion(&old_plane_state->commit->hw_done))
1575 return -EBUSY;
fef9df8b 1576
669c9215 1577 return funcs->atomic_async_check(plane, new_plane_state);
fef9df8b
GP
1578}
1579EXPORT_SYMBOL(drm_atomic_helper_async_check);
1580
1581/**
1582 * drm_atomic_helper_async_commit - commit state asynchronously
1583 * @dev: DRM device
1584 * @state: the driver state object
1585 *
1586 * This function commits a state asynchronously, i.e., not vblank
1587 * synchronized. It should be used on a state only when
1588 * drm_atomic_async_check() succeeds. Async commits are not supposed to swap
1589 * the states like normal sync commits, but just do in-place changes on the
1590 * current state.
1591 */
1592void drm_atomic_helper_async_commit(struct drm_device *dev,
1593 struct drm_atomic_state *state)
1594{
1595 struct drm_plane *plane;
1596 struct drm_plane_state *plane_state;
1597 const struct drm_plane_helper_funcs *funcs;
1598 int i;
1599
1600 for_each_new_plane_in_state(state, plane, plane_state, i) {
1601 funcs = plane->helper_private;
1602 funcs->atomic_async_update(plane, plane_state);
02edfd9c
BB
1603
1604 /*
1605 * ->atomic_async_update() is supposed to update the
1606 * plane->state in-place, make sure at least common
1607 * properties have been properly updated.
1608 */
1609 WARN_ON_ONCE(plane->state->fb != plane_state->fb);
1610 WARN_ON_ONCE(plane->state->crtc_x != plane_state->crtc_x);
1611 WARN_ON_ONCE(plane->state->crtc_y != plane_state->crtc_y);
1612 WARN_ON_ONCE(plane->state->src_x != plane_state->src_x);
1613 WARN_ON_ONCE(plane->state->src_y != plane_state->src_y);
fef9df8b
GP
1614 }
1615}
1616EXPORT_SYMBOL(drm_atomic_helper_async_commit);
1617
9f2a7950
DV
1618/**
1619 * drm_atomic_helper_commit - commit validated state object
1620 * @dev: DRM device
1621 * @state: the driver state object
1622 * @nonblock: whether nonblocking behavior is requested.
1623 *
1624 * This function commits a with drm_atomic_helper_check() pre-validated state
1625 * object. This can still fail when e.g. the framebuffer reservation fails. This
1626 * function implements nonblocking commits, using
1627 * drm_atomic_helper_setup_commit() and related functions.
1628 *
9f2a7950 1629 * Committing the actual hardware state is done through the
6806cdf9
DV
1630 * &drm_mode_config_helper_funcs.atomic_commit_tail callback, or it's default
1631 * implementation drm_atomic_helper_commit_tail().
6e48ae32 1632 *
c39032a8 1633 * RETURNS:
623369e5
DV
1634 * Zero for success or -errno.
1635 */
1636int drm_atomic_helper_commit(struct drm_device *dev,
1637 struct drm_atomic_state *state,
286dbb8d 1638 bool nonblock)
623369e5
DV
1639{
1640 int ret;
1641
fef9df8b
GP
1642 if (state->async_update) {
1643 ret = drm_atomic_helper_prepare_planes(dev, state);
1644 if (ret)
1645 return ret;
1646
1647 drm_atomic_helper_async_commit(dev, state);
1648 drm_atomic_helper_cleanup_planes(dev, state);
1649
1650 return 0;
1651 }
1652
a095caa7
DV
1653 ret = drm_atomic_helper_setup_commit(state, nonblock);
1654 if (ret)
1655 return ret;
1656
9f2a7950
DV
1657 INIT_WORK(&state->commit_work, commit_work);
1658
623369e5
DV
1659 ret = drm_atomic_helper_prepare_planes(dev, state);
1660 if (ret)
1661 return ret;
1662
f6ce410a
GP
1663 if (!nonblock) {
1664 ret = drm_atomic_helper_wait_for_fences(dev, state, true);
c066d231
ML
1665 if (ret)
1666 goto err;
f6ce410a
GP
1667 }
1668
623369e5
DV
1669 /*
1670 * This is the point of no return - everything below never fails except
1671 * when the hw goes bonghits. Which means we can commit the new state on
1672 * the software side now.
1673 */
1674
c066d231
ML
1675 ret = drm_atomic_helper_swap_state(state, true);
1676 if (ret)
1677 goto err;
623369e5
DV
1678
1679 /*
1680 * Everything below can be run asynchronously without the need to grab
f98bd3ef 1681 * any modeset locks at all under one condition: It must be guaranteed
623369e5
DV
1682 * that the asynchronous work has either been cancelled (if the driver
1683 * supports it, which at least requires that the framebuffers get
1684 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
1685 * before the new state gets committed on the software side with
1686 * drm_atomic_helper_swap_state().
1687 *
1688 * This scheme allows new atomic state updates to be prepared and
1689 * checked in parallel to the asynchronous completion of the previous
1690 * update. Which is important since compositors need to figure out the
1691 * composition of the next frame right after having submitted the
1692 * current layout.
9f2a7950
DV
1693 *
1694 * NOTE: Commit work has multiple phases, first hardware commit, then
1695 * cleanup. We want them to overlap, hence need system_unbound_wq to
1696 * make sure work items don't artifically stall on each another.
623369e5
DV
1697 */
1698
0853695c 1699 drm_atomic_state_get(state);
9f2a7950
DV
1700 if (nonblock)
1701 queue_work(system_unbound_wq, &state->commit_work);
1702 else
1703 commit_tail(state);
623369e5
DV
1704
1705 return 0;
c066d231
ML
1706
1707err:
1708 drm_atomic_helper_cleanup_planes(dev, state);
1709 return ret;
623369e5
DV
1710}
1711EXPORT_SYMBOL(drm_atomic_helper_commit);
1712
e8c833a7 1713/**
286dbb8d 1714 * DOC: implementing nonblocking commit
e8c833a7 1715 *
9f2a7950 1716 * Nonblocking atomic commits have to be implemented in the following sequence:
e8c833a7
DV
1717 *
1718 * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function
1719 * which commit needs to call which can fail, so we want to run it first and
1720 * synchronously.
1721 *
286dbb8d 1722 * 2. Synchronize with any outstanding nonblocking commit worker threads which
e8c833a7
DV
1723 * might be affected the new state update. This can be done by either cancelling
1724 * or flushing the work items, depending upon whether the driver can deal with
1725 * cancelled updates. Note that it is important to ensure that the framebuffer
1726 * cleanup is still done when cancelling.
1727 *
9f2a7950
DV
1728 * Asynchronous workers need to have sufficient parallelism to be able to run
1729 * different atomic commits on different CRTCs in parallel. The simplest way to
1730 * achive this is by running them on the &system_unbound_wq work queue. Note
1731 * that drivers are not required to split up atomic commits and run an
1732 * individual commit in parallel - userspace is supposed to do that if it cares.
1733 * But it might be beneficial to do that for modesets, since those necessarily
1734 * must be done as one global operation, and enabling or disabling a CRTC can
1735 * take a long time. But even that is not required.
e8c833a7
DV
1736 *
1737 * 3. The software state is updated synchronously with
26196f7e 1738 * drm_atomic_helper_swap_state(). Doing this under the protection of all modeset
e8c833a7 1739 * locks means concurrent callers never see inconsistent state. And doing this
286dbb8d
ML
1740 * while it's guaranteed that no relevant nonblocking worker runs means that
1741 * nonblocking workers do not need grab any locks. Actually they must not grab
1742 * locks, for otherwise the work flushing will deadlock.
e8c833a7
DV
1743 *
1744 * 4. Schedule a work item to do all subsequent steps, using the split-out
1745 * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and
1746 * then cleaning up the framebuffers after the old framebuffer is no longer
1747 * being displayed.
9f2a7950
DV
1748 *
1749 * The above scheme is implemented in the atomic helper libraries in
1750 * drm_atomic_helper_commit() using a bunch of helper functions. See
1751 * drm_atomic_helper_setup_commit() for a starting point.
e8c833a7
DV
1752 */
1753
a095caa7
DV
1754static int stall_checks(struct drm_crtc *crtc, bool nonblock)
1755{
1756 struct drm_crtc_commit *commit, *stall_commit = NULL;
1757 bool completed = true;
1758 int i;
1759 long ret = 0;
1760
1761 spin_lock(&crtc->commit_lock);
1762 i = 0;
1763 list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
1764 if (i == 0) {
1765 completed = try_wait_for_completion(&commit->flip_done);
1766 /* Userspace is not allowed to get ahead of the previous
1767 * commit with nonblocking ones. */
1768 if (!completed && nonblock) {
1769 spin_unlock(&crtc->commit_lock);
1770 return -EBUSY;
1771 }
1772 } else if (i == 1) {
f46640b9 1773 stall_commit = drm_crtc_commit_get(commit);
a095caa7 1774 break;
723c3e55 1775 }
a095caa7
DV
1776
1777 i++;
1778 }
1779 spin_unlock(&crtc->commit_lock);
1780
1781 if (!stall_commit)
1782 return 0;
1783
1784 /* We don't want to let commits get ahead of cleanup work too much,
1785 * stalling on 2nd previous commit means triple-buffer won't ever stall.
1786 */
723c3e55 1787 ret = wait_for_completion_interruptible_timeout(&stall_commit->cleanup_done,
a095caa7
DV
1788 10*HZ);
1789 if (ret == 0)
1790 DRM_ERROR("[CRTC:%d:%s] cleanup_done timed out\n",
1791 crtc->base.id, crtc->name);
1792
1793 drm_crtc_commit_put(stall_commit);
1794
1795 return ret < 0 ? ret : 0;
1796}
1797
899cc5f1 1798static void release_crtc_commit(struct completion *completion)
24835e44
DV
1799{
1800 struct drm_crtc_commit *commit = container_of(completion,
1801 typeof(*commit),
1802 flip_done);
1803
1804 drm_crtc_commit_put(commit);
1805}
1806
21a01abb
ML
1807static void init_commit(struct drm_crtc_commit *commit, struct drm_crtc *crtc)
1808{
1809 init_completion(&commit->flip_done);
1810 init_completion(&commit->hw_done);
1811 init_completion(&commit->cleanup_done);
1812 INIT_LIST_HEAD(&commit->commit_entry);
1813 kref_init(&commit->ref);
1814 commit->crtc = crtc;
1815}
1816
1817static struct drm_crtc_commit *
1818crtc_or_fake_commit(struct drm_atomic_state *state, struct drm_crtc *crtc)
1819{
1820 if (crtc) {
1821 struct drm_crtc_state *new_crtc_state;
1822
1823 new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
1824
1825 return new_crtc_state->commit;
1826 }
1827
1828 if (!state->fake_commit) {
1829 state->fake_commit = kzalloc(sizeof(*state->fake_commit), GFP_KERNEL);
1830 if (!state->fake_commit)
1831 return NULL;
1832
1833 init_commit(state->fake_commit, NULL);
1834 }
1835
1836 return state->fake_commit;
1837}
1838
a095caa7
DV
1839/**
1840 * drm_atomic_helper_setup_commit - setup possibly nonblocking commit
1841 * @state: new modeset state to be committed
1842 * @nonblock: whether nonblocking behavior is requested.
1843 *
1844 * This function prepares @state to be used by the atomic helper's support for
1845 * nonblocking commits. Drivers using the nonblocking commit infrastructure
6806cdf9
DV
1846 * should always call this function from their
1847 * &drm_mode_config_funcs.atomic_commit hook.
a095caa7
DV
1848 *
1849 * To be able to use this support drivers need to use a few more helper
1850 * functions. drm_atomic_helper_wait_for_dependencies() must be called before
1851 * actually committing the hardware state, and for nonblocking commits this call
1852 * must be placed in the async worker. See also drm_atomic_helper_swap_state()
1853 * and it's stall parameter, for when a driver's commit hooks look at the
6806cdf9 1854 * &drm_crtc.state, &drm_plane.state or &drm_connector.state pointer directly.
a095caa7
DV
1855 *
1856 * Completion of the hardware commit step must be signalled using
1857 * drm_atomic_helper_commit_hw_done(). After this step the driver is not allowed
1858 * to read or change any permanent software or hardware modeset state. The only
1859 * exception is state protected by other means than &drm_modeset_lock locks.
1860 * Only the free standing @state with pointers to the old state structures can
1861 * be inspected, e.g. to clean up old buffers using
1862 * drm_atomic_helper_cleanup_planes().
1863 *
1864 * At the very end, before cleaning up @state drivers must call
1865 * drm_atomic_helper_commit_cleanup_done().
1866 *
1867 * This is all implemented by in drm_atomic_helper_commit(), giving drivers a
9ac07815 1868 * complete and easy-to-use default implementation of the atomic_commit() hook.
a095caa7
DV
1869 *
1870 * The tracking of asynchronously executed and still pending commits is done
1871 * using the core structure &drm_crtc_commit.
1872 *
1873 * By default there's no need to clean up resources allocated by this function
1874 * explicitly: drm_atomic_state_default_clear() will take care of that
1875 * automatically.
1876 *
1877 * Returns:
1878 *
1879 * 0 on success. -EBUSY when userspace schedules nonblocking commits too fast,
1880 * -ENOMEM on allocation failures and -EINTR when a signal is pending.
1881 */
1882int drm_atomic_helper_setup_commit(struct drm_atomic_state *state,
1883 bool nonblock)
1884{
1885 struct drm_crtc *crtc;
415c3ac3 1886 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
21a01abb
ML
1887 struct drm_connector *conn;
1888 struct drm_connector_state *old_conn_state, *new_conn_state;
1889 struct drm_plane *plane;
1890 struct drm_plane_state *old_plane_state, *new_plane_state;
a095caa7
DV
1891 struct drm_crtc_commit *commit;
1892 int i, ret;
1893
415c3ac3 1894 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
a095caa7
DV
1895 commit = kzalloc(sizeof(*commit), GFP_KERNEL);
1896 if (!commit)
1897 return -ENOMEM;
1898
21a01abb 1899 init_commit(commit, crtc);
a095caa7 1900
163bcc2c 1901 new_crtc_state->commit = commit;
a095caa7
DV
1902
1903 ret = stall_checks(crtc, nonblock);
1904 if (ret)
1905 return ret;
1906
1907 /* Drivers only send out events when at least either current or
1908 * new CRTC state is active. Complete right away if everything
1909 * stays off. */
415c3ac3 1910 if (!old_crtc_state->active && !new_crtc_state->active) {
a095caa7
DV
1911 complete_all(&commit->flip_done);
1912 continue;
1913 }
1914
1915 /* Legacy cursor updates are fully unsynced. */
1916 if (state->legacy_cursor_update) {
1917 complete_all(&commit->flip_done);
1918 continue;
1919 }
1920
415c3ac3 1921 if (!new_crtc_state->event) {
a095caa7
DV
1922 commit->event = kzalloc(sizeof(*commit->event),
1923 GFP_KERNEL);
1924 if (!commit->event)
1925 return -ENOMEM;
1926
415c3ac3 1927 new_crtc_state->event = commit->event;
a095caa7
DV
1928 }
1929
415c3ac3
ML
1930 new_crtc_state->event->base.completion = &commit->flip_done;
1931 new_crtc_state->event->base.completion_release = release_crtc_commit;
24835e44 1932 drm_crtc_commit_get(commit);
1c6ceeee
LSL
1933
1934 commit->abort_completion = true;
a095caa7
DV
1935 }
1936
21a01abb 1937 for_each_oldnew_connector_in_state(state, conn, old_conn_state, new_conn_state, i) {
21a01abb
ML
1938 /* Userspace is not allowed to get ahead of the previous
1939 * commit with nonblocking ones. */
1940 if (nonblock && old_conn_state->commit &&
1941 !try_wait_for_completion(&old_conn_state->commit->flip_done))
1942 return -EBUSY;
a095caa7 1943
1f2d9bdc
DV
1944 /* Always track connectors explicitly for e.g. link retraining. */
1945 commit = crtc_or_fake_commit(state, new_conn_state->crtc ?: old_conn_state->crtc);
21a01abb
ML
1946 if (!commit)
1947 return -ENOMEM;
a095caa7 1948
21a01abb
ML
1949 new_conn_state->commit = drm_crtc_commit_get(commit);
1950 }
1951
1952 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
21a01abb
ML
1953 /* Userspace is not allowed to get ahead of the previous
1954 * commit with nonblocking ones. */
1955 if (nonblock && old_plane_state->commit &&
1956 !try_wait_for_completion(&old_plane_state->commit->flip_done))
1957 return -EBUSY;
1958
1f2d9bdc 1959 /* Always track planes explicitly for async pageflip support. */
4edd6084 1960 commit = crtc_or_fake_commit(state, new_plane_state->crtc ?: old_plane_state->crtc);
21a01abb
ML
1961 if (!commit)
1962 return -ENOMEM;
1963
1964 new_plane_state->commit = drm_crtc_commit_get(commit);
a095caa7
DV
1965 }
1966
a095caa7 1967 return 0;
a095caa7 1968}
a095caa7 1969EXPORT_SYMBOL(drm_atomic_helper_setup_commit);
a095caa7
DV
1970
1971/**
1972 * drm_atomic_helper_wait_for_dependencies - wait for required preceeding commits
1ea0c02e 1973 * @old_state: atomic state object with old state structures
a095caa7
DV
1974 *
1975 * This function waits for all preceeding commits that touch the same CRTC as
1ea0c02e 1976 * @old_state to both be committed to the hardware (as signalled by
a095caa7 1977 * drm_atomic_helper_commit_hw_done) and executed by the hardware (as signalled
277b09cf 1978 * by calling drm_crtc_send_vblank_event() on the &drm_crtc_state.event).
a095caa7
DV
1979 *
1980 * This is part of the atomic helper support for nonblocking commits, see
1981 * drm_atomic_helper_setup_commit() for an overview.
1982 */
1ea0c02e 1983void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *old_state)
a095caa7
DV
1984{
1985 struct drm_crtc *crtc;
163bcc2c 1986 struct drm_crtc_state *old_crtc_state;
21a01abb
ML
1987 struct drm_plane *plane;
1988 struct drm_plane_state *old_plane_state;
1989 struct drm_connector *conn;
1990 struct drm_connector_state *old_conn_state;
a095caa7
DV
1991 struct drm_crtc_commit *commit;
1992 int i;
1993 long ret;
1994
163bcc2c
ML
1995 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1996 commit = old_crtc_state->commit;
a095caa7
DV
1997
1998 if (!commit)
1999 continue;
2000
2001 ret = wait_for_completion_timeout(&commit->hw_done,
2002 10*HZ);
2003 if (ret == 0)
2004 DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
2005 crtc->base.id, crtc->name);
2006
2007 /* Currently no support for overwriting flips, hence
2008 * stall for previous one to execute completely. */
2009 ret = wait_for_completion_timeout(&commit->flip_done,
2010 10*HZ);
2011 if (ret == 0)
2012 DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
2013 crtc->base.id, crtc->name);
a095caa7 2014 }
21a01abb
ML
2015
2016 for_each_old_connector_in_state(old_state, conn, old_conn_state, i) {
2017 commit = old_conn_state->commit;
a095caa7 2018
21a01abb
ML
2019 if (!commit)
2020 continue;
2021
2022 ret = wait_for_completion_timeout(&commit->hw_done,
2023 10*HZ);
2024 if (ret == 0)
2025 DRM_ERROR("[CONNECTOR:%d:%s] hw_done timed out\n",
2026 conn->base.id, conn->name);
2027
2028 /* Currently no support for overwriting flips, hence
2029 * stall for previous one to execute completely. */
2030 ret = wait_for_completion_timeout(&commit->flip_done,
2031 10*HZ);
2032 if (ret == 0)
2033 DRM_ERROR("[CONNECTOR:%d:%s] flip_done timed out\n",
2034 conn->base.id, conn->name);
2035 }
2036
2037 for_each_old_plane_in_state(old_state, plane, old_plane_state, i) {
2038 commit = old_plane_state->commit;
2039
2040 if (!commit)
2041 continue;
2042
2043 ret = wait_for_completion_timeout(&commit->hw_done,
2044 10*HZ);
2045 if (ret == 0)
2046 DRM_ERROR("[PLANE:%d:%s] hw_done timed out\n",
2047 plane->base.id, plane->name);
2048
2049 /* Currently no support for overwriting flips, hence
2050 * stall for previous one to execute completely. */
2051 ret = wait_for_completion_timeout(&commit->flip_done,
2052 10*HZ);
2053 if (ret == 0)
2054 DRM_ERROR("[PLANE:%d:%s] flip_done timed out\n",
2055 plane->base.id, plane->name);
a095caa7
DV
2056 }
2057}
2058EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
2059
b25c60af
BB
2060/**
2061 * drm_atomic_helper_fake_vblank - fake VBLANK events if needed
2062 * @old_state: atomic state object with old state structures
2063 *
2064 * This function walks all CRTCs and fake VBLANK events on those with
2065 * &drm_crtc_state.no_vblank set to true and &drm_crtc_state.event != NULL.
2066 * The primary use of this function is writeback connectors working in oneshot
2067 * mode and faking VBLANK events. In this case they only fake the VBLANK event
2068 * when a job is queued, and any change to the pipeline that does not touch the
2069 * connector is leading to timeouts when calling
2070 * drm_atomic_helper_wait_for_vblanks() or
2071 * drm_atomic_helper_wait_for_flip_done().
2072 *
2073 * This is part of the atomic helper support for nonblocking commits, see
2074 * drm_atomic_helper_setup_commit() for an overview.
2075 */
2076void drm_atomic_helper_fake_vblank(struct drm_atomic_state *old_state)
2077{
2078 struct drm_crtc_state *new_crtc_state;
2079 struct drm_crtc *crtc;
2080 int i;
2081
2082 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
2083 unsigned long flags;
2084
2085 if (!new_crtc_state->no_vblank)
2086 continue;
2087
2088 spin_lock_irqsave(&old_state->dev->event_lock, flags);
2089 if (new_crtc_state->event) {
2090 drm_crtc_send_vblank_event(crtc,
2091 new_crtc_state->event);
2092 new_crtc_state->event = NULL;
2093 }
2094 spin_unlock_irqrestore(&old_state->dev->event_lock, flags);
2095 }
2096}
2097EXPORT_SYMBOL(drm_atomic_helper_fake_vblank);
2098
a095caa7
DV
2099/**
2100 * drm_atomic_helper_commit_hw_done - setup possible nonblocking commit
1ea0c02e 2101 * @old_state: atomic state object with old state structures
a095caa7
DV
2102 *
2103 * This function is used to signal completion of the hardware commit step. After
2104 * this step the driver is not allowed to read or change any permanent software
2105 * or hardware modeset state. The only exception is state protected by other
2106 * means than &drm_modeset_lock locks.
2107 *
2108 * Drivers should try to postpone any expensive or delayed cleanup work after
2109 * this function is called.
2110 *
2111 * This is part of the atomic helper support for nonblocking commits, see
2112 * drm_atomic_helper_setup_commit() for an overview.
2113 */
1ea0c02e 2114void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *old_state)
a095caa7
DV
2115{
2116 struct drm_crtc *crtc;
163bcc2c 2117 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
a095caa7
DV
2118 struct drm_crtc_commit *commit;
2119 int i;
2120
163bcc2c
ML
2121 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2122 commit = new_crtc_state->commit;
a095caa7
DV
2123 if (!commit)
2124 continue;
2125
163bcc2c
ML
2126 /*
2127 * copy new_crtc_state->commit to old_crtc_state->commit,
2128 * it's unsafe to touch new_crtc_state after hw_done,
2129 * but we still need to do so in cleanup_done().
2130 */
2131 if (old_crtc_state->commit)
2132 drm_crtc_commit_put(old_crtc_state->commit);
2133
2134 old_crtc_state->commit = drm_crtc_commit_get(commit);
2135
a095caa7 2136 /* backend must have consumed any event by now */
415c3ac3 2137 WARN_ON(new_crtc_state->event);
a095caa7 2138 complete_all(&commit->hw_done);
a095caa7 2139 }
21a01abb
ML
2140
2141 if (old_state->fake_commit) {
2142 complete_all(&old_state->fake_commit->hw_done);
2143 complete_all(&old_state->fake_commit->flip_done);
2144 }
a095caa7
DV
2145}
2146EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
2147
2148/**
2149 * drm_atomic_helper_commit_cleanup_done - signal completion of commit
1ea0c02e 2150 * @old_state: atomic state object with old state structures
a095caa7 2151 *
1ea0c02e
DV
2152 * This signals completion of the atomic update @old_state, including any
2153 * cleanup work. If used, it must be called right before calling
0853695c 2154 * drm_atomic_state_put().
a095caa7
DV
2155 *
2156 * This is part of the atomic helper support for nonblocking commits, see
2157 * drm_atomic_helper_setup_commit() for an overview.
2158 */
1ea0c02e 2159void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
a095caa7
DV
2160{
2161 struct drm_crtc *crtc;
163bcc2c 2162 struct drm_crtc_state *old_crtc_state;
a095caa7
DV
2163 struct drm_crtc_commit *commit;
2164 int i;
a095caa7 2165
163bcc2c
ML
2166 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
2167 commit = old_crtc_state->commit;
a095caa7
DV
2168 if (WARN_ON(!commit))
2169 continue;
2170
a095caa7
DV
2171 complete_all(&commit->cleanup_done);
2172 WARN_ON(!try_wait_for_completion(&commit->hw_done));
2173
7141fd3e 2174 spin_lock(&crtc->commit_lock);
a095caa7
DV
2175 list_del(&commit->commit_entry);
2176 spin_unlock(&crtc->commit_lock);
2177 }
21a01abb
ML
2178
2179 if (old_state->fake_commit)
2180 complete_all(&old_state->fake_commit->cleanup_done);
a095caa7
DV
2181}
2182EXPORT_SYMBOL(drm_atomic_helper_commit_cleanup_done);
2183
c2fcd274 2184/**
2e3afd47 2185 * drm_atomic_helper_prepare_planes - prepare plane resources before commit
c2fcd274 2186 * @dev: DRM device
2e3afd47 2187 * @state: atomic state object with new state structures
c2fcd274
DV
2188 *
2189 * This function prepares plane state, specifically framebuffers, for the new
6806cdf9
DV
2190 * configuration, by calling &drm_plane_helper_funcs.prepare_fb. If any failure
2191 * is encountered this function will call &drm_plane_helper_funcs.cleanup_fb on
2192 * any already successfully prepared framebuffer.
c2fcd274
DV
2193 *
2194 * Returns:
2195 * 0 on success, negative error code on failure.
2196 */
2197int drm_atomic_helper_prepare_planes(struct drm_device *dev,
2198 struct drm_atomic_state *state)
2199{
be9174a4 2200 struct drm_plane *plane;
415c3ac3 2201 struct drm_plane_state *new_plane_state;
be9174a4 2202 int ret, i, j;
c2fcd274 2203
415c3ac3 2204 for_each_new_plane_in_state(state, plane, new_plane_state, i) {
b5ceff20 2205 const struct drm_plane_helper_funcs *funcs;
c2fcd274
DV
2206
2207 funcs = plane->helper_private;
2208
844f9111 2209 if (funcs->prepare_fb) {
415c3ac3 2210 ret = funcs->prepare_fb(plane, new_plane_state);
c2fcd274
DV
2211 if (ret)
2212 goto fail;
2213 }
2214 }
2215
2216 return 0;
2217
2218fail:
415c3ac3 2219 for_each_new_plane_in_state(state, plane, new_plane_state, j) {
b5ceff20 2220 const struct drm_plane_helper_funcs *funcs;
c2fcd274 2221
be9174a4 2222 if (j >= i)
c2fcd274
DV
2223 continue;
2224
2225 funcs = plane->helper_private;
2226
844f9111 2227 if (funcs->cleanup_fb)
415c3ac3 2228 funcs->cleanup_fb(plane, new_plane_state);
c2fcd274
DV
2229 }
2230
2231 return ret;
2232}
2233EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
2234
7135ac54 2235static bool plane_crtc_active(const struct drm_plane_state *state)
aef9dbb8
DV
2236{
2237 return state->crtc && state->crtc->state->active;
2238}
2239
c2fcd274
DV
2240/**
2241 * drm_atomic_helper_commit_planes - commit plane state
2242 * @dev: DRM device
b0fcfc89 2243 * @old_state: atomic state object with old state structures
2b58e98d 2244 * @flags: flags for committing plane state
c2fcd274
DV
2245 *
2246 * This function commits the new plane state using the plane and atomic helper
2247 * functions for planes and crtcs. It assumes that the atomic state has already
2248 * been pushed into the relevant object state pointers, since this step can no
2249 * longer fail.
2250 *
b0fcfc89 2251 * It still requires the global state object @old_state to know which planes and
c2fcd274 2252 * crtcs need to be updated though.
de28d021
ML
2253 *
2254 * Note that this function does all plane updates across all CRTCs in one step.
2255 * If the hardware can't support this approach look at
2256 * drm_atomic_helper_commit_planes_on_crtc() instead.
6e48ae32
DV
2257 *
2258 * Plane parameters can be updated by applications while the associated CRTC is
2259 * disabled. The DRM/KMS core will store the parameters in the plane state,
2260 * which will be available to the driver when the CRTC is turned on. As a result
2261 * most drivers don't need to be immediately notified of plane updates for a
2262 * disabled CRTC.
2263 *
2b58e98d
LY
2264 * Unless otherwise needed, drivers are advised to set the ACTIVE_ONLY flag in
2265 * @flags in order not to receive plane update notifications related to a
2266 * disabled CRTC. This avoids the need to manually ignore plane updates in
6e48ae32
DV
2267 * driver code when the driver and/or hardware can't or just don't need to deal
2268 * with updates on disabled CRTCs, for example when supporting runtime PM.
2269 *
2b58e98d
LY
2270 * Drivers may set the NO_DISABLE_AFTER_MODESET flag in @flags if the relevant
2271 * display controllers require to disable a CRTC's planes when the CRTC is
6806cdf9
DV
2272 * disabled. This function would skip the &drm_plane_helper_funcs.atomic_disable
2273 * call for a plane if the CRTC of the old plane state needs a modesetting
2274 * operation. Of course, the drivers need to disable the planes in their CRTC
2275 * disable callbacks since no one else would do that.
2b58e98d
LY
2276 *
2277 * The drm_atomic_helper_commit() default implementation doesn't set the
2278 * ACTIVE_ONLY flag to most closely match the behaviour of the legacy helpers.
2279 * This should not be copied blindly by drivers.
c2fcd274
DV
2280 */
2281void drm_atomic_helper_commit_planes(struct drm_device *dev,
aef9dbb8 2282 struct drm_atomic_state *old_state,
2b58e98d 2283 uint32_t flags)
c2fcd274 2284{
df63b999 2285 struct drm_crtc *crtc;
415c3ac3 2286 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
df63b999 2287 struct drm_plane *plane;
415c3ac3 2288 struct drm_plane_state *old_plane_state, *new_plane_state;
c2fcd274 2289 int i;
2b58e98d
LY
2290 bool active_only = flags & DRM_PLANE_COMMIT_ACTIVE_ONLY;
2291 bool no_disable = flags & DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET;
c2fcd274 2292
415c3ac3 2293 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
b5ceff20 2294 const struct drm_crtc_helper_funcs *funcs;
c2fcd274
DV
2295
2296 funcs = crtc->helper_private;
2297
2298 if (!funcs || !funcs->atomic_begin)
2299 continue;
2300
415c3ac3 2301 if (active_only && !new_crtc_state->active)
aef9dbb8
DV
2302 continue;
2303
613d2b27 2304 funcs->atomic_begin(crtc, old_crtc_state);
c2fcd274
DV
2305 }
2306
415c3ac3 2307 for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
b5ceff20 2308 const struct drm_plane_helper_funcs *funcs;
216c59d6 2309 bool disabling;
c2fcd274
DV
2310
2311 funcs = plane->helper_private;
2312
3cad4b68 2313 if (!funcs)
c2fcd274
DV
2314 continue;
2315
51ffa12d
ML
2316 disabling = drm_atomic_plane_disabling(old_plane_state,
2317 new_plane_state);
216c59d6
LP
2318
2319 if (active_only) {
2320 /*
2321 * Skip planes related to inactive CRTCs. If the plane
2322 * is enabled use the state of the current CRTC. If the
2323 * plane is being disabled use the state of the old
2324 * CRTC to avoid skipping planes being disabled on an
2325 * active CRTC.
2326 */
415c3ac3 2327 if (!disabling && !plane_crtc_active(new_plane_state))
216c59d6
LP
2328 continue;
2329 if (disabling && !plane_crtc_active(old_plane_state))
2330 continue;
2331 }
aef9dbb8 2332
407b8bd9
TR
2333 /*
2334 * Special-case disabling the plane if drivers support it.
2335 */
2b58e98d
LY
2336 if (disabling && funcs->atomic_disable) {
2337 struct drm_crtc_state *crtc_state;
2338
2339 crtc_state = old_plane_state->crtc->state;
2340
2341 if (drm_atomic_crtc_needs_modeset(crtc_state) &&
2342 no_disable)
2343 continue;
2344
407b8bd9 2345 funcs->atomic_disable(plane, old_plane_state);
415c3ac3 2346 } else if (new_plane_state->crtc || disabling) {
407b8bd9 2347 funcs->atomic_update(plane, old_plane_state);
2b58e98d 2348 }
c2fcd274
DV
2349 }
2350
415c3ac3 2351 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
b5ceff20 2352 const struct drm_crtc_helper_funcs *funcs;
c2fcd274
DV
2353
2354 funcs = crtc->helper_private;
2355
2356 if (!funcs || !funcs->atomic_flush)
2357 continue;
2358
415c3ac3 2359 if (active_only && !new_crtc_state->active)
aef9dbb8
DV
2360 continue;
2361
613d2b27 2362 funcs->atomic_flush(crtc, old_crtc_state);
c2fcd274
DV
2363 }
2364}
2365EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
2366
de28d021
ML
2367/**
2368 * drm_atomic_helper_commit_planes_on_crtc - commit plane state for a crtc
2369 * @old_crtc_state: atomic state object with the old crtc state
2370 *
2371 * This function commits the new plane state using the plane and atomic helper
2372 * functions for planes on the specific crtc. It assumes that the atomic state
2373 * has already been pushed into the relevant object state pointers, since this
2374 * step can no longer fail.
2375 *
2376 * This function is useful when plane updates should be done crtc-by-crtc
2377 * instead of one global step like drm_atomic_helper_commit_planes() does.
2378 *
2379 * This function can only be savely used when planes are not allowed to move
2380 * between different CRTCs because this function doesn't handle inter-CRTC
2381 * depencies. Callers need to ensure that either no such depencies exist,
2382 * resolve them through ordering of commit calls or through some other means.
2383 */
2384void
2385drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
2386{
2387 const struct drm_crtc_helper_funcs *crtc_funcs;
2388 struct drm_crtc *crtc = old_crtc_state->crtc;
2389 struct drm_atomic_state *old_state = old_crtc_state->state;
e35a2f9a
VS
2390 struct drm_crtc_state *new_crtc_state =
2391 drm_atomic_get_new_crtc_state(old_state, crtc);
de28d021
ML
2392 struct drm_plane *plane;
2393 unsigned plane_mask;
2394
2395 plane_mask = old_crtc_state->plane_mask;
e35a2f9a 2396 plane_mask |= new_crtc_state->plane_mask;
de28d021
ML
2397
2398 crtc_funcs = crtc->helper_private;
2399 if (crtc_funcs && crtc_funcs->atomic_begin)
613d2b27 2400 crtc_funcs->atomic_begin(crtc, old_crtc_state);
de28d021
ML
2401
2402 drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
2403 struct drm_plane_state *old_plane_state =
b4d93679 2404 drm_atomic_get_old_plane_state(old_state, plane);
e35a2f9a
VS
2405 struct drm_plane_state *new_plane_state =
2406 drm_atomic_get_new_plane_state(old_state, plane);
de28d021
ML
2407 const struct drm_plane_helper_funcs *plane_funcs;
2408
2409 plane_funcs = plane->helper_private;
2410
2411 if (!old_plane_state || !plane_funcs)
2412 continue;
2413
e35a2f9a
VS
2414 WARN_ON(new_plane_state->crtc &&
2415 new_plane_state->crtc != crtc);
de28d021 2416
e35a2f9a 2417 if (drm_atomic_plane_disabling(old_plane_state, new_plane_state) &&
de28d021
ML
2418 plane_funcs->atomic_disable)
2419 plane_funcs->atomic_disable(plane, old_plane_state);
e35a2f9a
VS
2420 else if (new_plane_state->crtc ||
2421 drm_atomic_plane_disabling(old_plane_state, new_plane_state))
de28d021
ML
2422 plane_funcs->atomic_update(plane, old_plane_state);
2423 }
2424
2425 if (crtc_funcs && crtc_funcs->atomic_flush)
613d2b27 2426 crtc_funcs->atomic_flush(crtc, old_crtc_state);
de28d021
ML
2427}
2428EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
2429
6753ba97
JS
2430/**
2431 * drm_atomic_helper_disable_planes_on_crtc - helper to disable CRTC's planes
28500291 2432 * @old_crtc_state: atomic state object with the old CRTC state
6753ba97
JS
2433 * @atomic: if set, synchronize with CRTC's atomic_begin/flush hooks
2434 *
2435 * Disables all planes associated with the given CRTC. This can be
28500291
LY
2436 * used for instance in the CRTC helper atomic_disable callback to disable
2437 * all planes.
6753ba97
JS
2438 *
2439 * If the atomic-parameter is set the function calls the CRTC's
2440 * atomic_begin hook before and atomic_flush hook after disabling the
2441 * planes.
2442 *
2443 * It is a bug to call this function without having implemented the
6806cdf9 2444 * &drm_plane_helper_funcs.atomic_disable plane hook.
6753ba97 2445 */
28500291
LY
2446void
2447drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc_state *old_crtc_state,
2448 bool atomic)
6753ba97 2449{
28500291 2450 struct drm_crtc *crtc = old_crtc_state->crtc;
6753ba97
JS
2451 const struct drm_crtc_helper_funcs *crtc_funcs =
2452 crtc->helper_private;
2453 struct drm_plane *plane;
2454
2455 if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
2456 crtc_funcs->atomic_begin(crtc, NULL);
2457
28500291 2458 drm_atomic_crtc_state_for_each_plane(plane, old_crtc_state) {
6753ba97
JS
2459 const struct drm_plane_helper_funcs *plane_funcs =
2460 plane->helper_private;
2461
28500291 2462 if (!plane_funcs)
6753ba97
JS
2463 continue;
2464
2465 WARN_ON(!plane_funcs->atomic_disable);
2466 if (plane_funcs->atomic_disable)
2467 plane_funcs->atomic_disable(plane, NULL);
2468 }
2469
2470 if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
2471 crtc_funcs->atomic_flush(crtc, NULL);
2472}
2473EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
2474
c2fcd274
DV
2475/**
2476 * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
2477 * @dev: DRM device
2478 * @old_state: atomic state object with old state structures
2479 *
2480 * This function cleans up plane state, specifically framebuffers, from the old
2481 * configuration. Hence the old configuration must be perserved in @old_state to
2482 * be able to call this function.
2483 *
2484 * This function must also be called on the new state when the atomic update
2485 * fails at any point after calling drm_atomic_helper_prepare_planes().
2486 */
2487void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
2488 struct drm_atomic_state *old_state)
2489{
df63b999 2490 struct drm_plane *plane;
415c3ac3 2491 struct drm_plane_state *old_plane_state, *new_plane_state;
c2fcd274
DV
2492 int i;
2493
415c3ac3 2494 for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
b5ceff20 2495 const struct drm_plane_helper_funcs *funcs;
415c3ac3
ML
2496 struct drm_plane_state *plane_state;
2497
2498 /*
2499 * This might be called before swapping when commit is aborted,
2500 * in which case we have to cleanup the new state.
2501 */
2502 if (old_plane_state == plane->state)
2503 plane_state = new_plane_state;
2504 else
2505 plane_state = old_plane_state;
c2fcd274 2506
c2fcd274
DV
2507 funcs = plane->helper_private;
2508
844f9111
ML
2509 if (funcs->cleanup_fb)
2510 funcs->cleanup_fb(plane, plane_state);
c2fcd274
DV
2511 }
2512}
2513EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
2514
2515/**
2516 * drm_atomic_helper_swap_state - store atomic state into current sw state
c2fcd274 2517 * @state: atomic state
c066d231 2518 * @stall: stall for preceeding commits
c2fcd274
DV
2519 *
2520 * This function stores the atomic state into the current state pointers in all
2521 * driver objects. It should be called after all failing steps have been done
2522 * and succeeded, but before the actual hardware state is committed.
2523 *
2524 * For cleanup and error recovery the current state for all changed objects will
c066d231 2525 * be swapped into @state.
c2fcd274
DV
2526 *
2527 * With that sequence it fits perfectly into the plane prepare/cleanup sequence:
2528 *
2529 * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state.
2530 *
2531 * 2. Do any other steps that might fail.
2532 *
2533 * 3. Put the staged state into the current state pointers with this function.
2534 *
2535 * 4. Actually commit the hardware state.
2536 *
26196f7e 2537 * 5. Call drm_atomic_helper_cleanup_planes() with @state, which since step 3
c2fcd274 2538 * contains the old state. Also do any other cleanup required with that state.
a095caa7
DV
2539 *
2540 * @stall must be set when nonblocking commits for this driver directly access
6806cdf9
DV
2541 * the &drm_plane.state, &drm_crtc.state or &drm_connector.state pointer. With
2542 * the current atomic helpers this is almost always the case, since the helpers
a095caa7 2543 * don't pass the right state structures to the callbacks.
c066d231
ML
2544 *
2545 * Returns:
2546 *
c4bbb735
ML
2547 * Returns 0 on success. Can return -ERESTARTSYS when @stall is true and the
2548 * waiting for the previous commits has been interrupted.
c2fcd274 2549 */
c066d231 2550int drm_atomic_helper_swap_state(struct drm_atomic_state *state,
5e84c269 2551 bool stall)
c2fcd274 2552{
c4bbb735 2553 int i, ret;
be9174a4 2554 struct drm_connector *connector;
415c3ac3 2555 struct drm_connector_state *old_conn_state, *new_conn_state;
be9174a4 2556 struct drm_crtc *crtc;
415c3ac3 2557 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
be9174a4 2558 struct drm_plane *plane;
415c3ac3 2559 struct drm_plane_state *old_plane_state, *new_plane_state;
a095caa7 2560 struct drm_crtc_commit *commit;
a4370c77
VS
2561 struct drm_private_obj *obj;
2562 struct drm_private_state *old_obj_state, *new_obj_state;
a095caa7
DV
2563
2564 if (stall) {
21a01abb
ML
2565 /*
2566 * We have to stall for hw_done here before
2567 * drm_atomic_helper_wait_for_dependencies() because flip
2568 * depth > 1 is not yet supported by all drivers. As long as
2569 * obj->state is directly dereferenced anywhere in the drivers
2570 * atomic_commit_tail function, then it's unsafe to swap state
2571 * before drm_atomic_helper_commit_hw_done() is called.
2572 */
2573
163bcc2c
ML
2574 for_each_old_crtc_in_state(state, crtc, old_crtc_state, i) {
2575 commit = old_crtc_state->commit;
a095caa7
DV
2576
2577 if (!commit)
2578 continue;
2579
c4bbb735 2580 ret = wait_for_completion_interruptible(&commit->hw_done);
c4bbb735
ML
2581 if (ret)
2582 return ret;
a095caa7 2583 }
21a01abb
ML
2584
2585 for_each_old_connector_in_state(state, connector, old_conn_state, i) {
2586 commit = old_conn_state->commit;
a095caa7
DV
2587
2588 if (!commit)
2589 continue;
2590
c4bbb735 2591 ret = wait_for_completion_interruptible(&commit->hw_done);
21a01abb
ML
2592 if (ret)
2593 return ret;
2594 }
c4bbb735 2595
21a01abb
ML
2596 for_each_old_plane_in_state(state, plane, old_plane_state, i) {
2597 commit = old_plane_state->commit;
2598
2599 if (!commit)
2600 continue;
2601
2602 ret = wait_for_completion_interruptible(&commit->hw_done);
c4bbb735
ML
2603 if (ret)
2604 return ret;
a095caa7
DV
2605 }
2606 }
c2fcd274 2607
415c3ac3 2608 for_each_oldnew_connector_in_state(state, connector, old_conn_state, new_conn_state, i) {
581e49fe
ML
2609 WARN_ON(connector->state != old_conn_state);
2610
415c3ac3
ML
2611 old_conn_state->state = state;
2612 new_conn_state->state = NULL;
2613
2614 state->connectors[i].state = old_conn_state;
2615 connector->state = new_conn_state;
c2fcd274
DV
2616 }
2617
415c3ac3 2618 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
581e49fe
ML
2619 WARN_ON(crtc->state != old_crtc_state);
2620
415c3ac3
ML
2621 old_crtc_state->state = state;
2622 new_crtc_state->state = NULL;
2623
2624 state->crtcs[i].state = old_crtc_state;
2625 crtc->state = new_crtc_state;
a095caa7 2626
163bcc2c 2627 if (new_crtc_state->commit) {
a095caa7 2628 spin_lock(&crtc->commit_lock);
163bcc2c 2629 list_add(&new_crtc_state->commit->commit_entry,
a095caa7
DV
2630 &crtc->commit_list);
2631 spin_unlock(&crtc->commit_lock);
2632
163bcc2c 2633 new_crtc_state->commit->event = NULL;
a095caa7 2634 }
c2fcd274
DV
2635 }
2636
415c3ac3 2637 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
581e49fe
ML
2638 WARN_ON(plane->state != old_plane_state);
2639
415c3ac3
ML
2640 old_plane_state->state = state;
2641 new_plane_state->state = NULL;
2642
2643 state->planes[i].state = old_plane_state;
2644 plane->state = new_plane_state;
c2fcd274 2645 }
b430c27a 2646
a4370c77
VS
2647 for_each_oldnew_private_obj_in_state(state, obj, old_obj_state, new_obj_state, i) {
2648 WARN_ON(obj->state != old_obj_state);
2649
2650 old_obj_state->state = state;
2651 new_obj_state->state = NULL;
2652
2653 state->private_objs[i].state = old_obj_state;
2654 obj->state = new_obj_state;
2655 }
c066d231
ML
2656
2657 return 0;
c2fcd274
DV
2658}
2659EXPORT_SYMBOL(drm_atomic_helper_swap_state);
042652ed
DV
2660
2661/**
2662 * drm_atomic_helper_update_plane - Helper for primary plane update using atomic
2663 * @plane: plane object to update
2664 * @crtc: owning CRTC of owning plane
2665 * @fb: framebuffer to flip onto plane
2666 * @crtc_x: x offset of primary plane on crtc
2667 * @crtc_y: y offset of primary plane on crtc
2668 * @crtc_w: width of primary plane rectangle on crtc
2669 * @crtc_h: height of primary plane rectangle on crtc
2670 * @src_x: x offset of @fb for panning
2671 * @src_y: y offset of @fb for panning
2672 * @src_w: width of source rectangle in @fb
2673 * @src_h: height of source rectangle in @fb
34a2ab5e 2674 * @ctx: lock acquire context
042652ed
DV
2675 *
2676 * Provides a default plane update handler using the atomic driver interface.
2677 *
2678 * RETURNS:
2679 * Zero on success, error code on failure
2680 */
2681int drm_atomic_helper_update_plane(struct drm_plane *plane,
2682 struct drm_crtc *crtc,
2683 struct drm_framebuffer *fb,
2684 int crtc_x, int crtc_y,
2685 unsigned int crtc_w, unsigned int crtc_h,
2686 uint32_t src_x, uint32_t src_y,
34a2ab5e
DV
2687 uint32_t src_w, uint32_t src_h,
2688 struct drm_modeset_acquire_ctx *ctx)
042652ed
DV
2689{
2690 struct drm_atomic_state *state;
2691 struct drm_plane_state *plane_state;
2692 int ret = 0;
2693
2694 state = drm_atomic_state_alloc(plane->dev);
2695 if (!state)
2696 return -ENOMEM;
2697
d26f96c7 2698 state->acquire_ctx = ctx;
042652ed
DV
2699 plane_state = drm_atomic_get_plane_state(state, plane);
2700 if (IS_ERR(plane_state)) {
2701 ret = PTR_ERR(plane_state);
2702 goto fail;
2703 }
2704
07cc0ef6 2705 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
042652ed
DV
2706 if (ret != 0)
2707 goto fail;
321ebf04 2708 drm_atomic_set_fb_for_plane(plane_state, fb);
042652ed
DV
2709 plane_state->crtc_x = crtc_x;
2710 plane_state->crtc_y = crtc_y;
042652ed 2711 plane_state->crtc_w = crtc_w;
02e6f379 2712 plane_state->crtc_h = crtc_h;
042652ed
DV
2713 plane_state->src_x = src_x;
2714 plane_state->src_y = src_y;
042652ed 2715 plane_state->src_w = src_w;
02e6f379 2716 plane_state->src_h = src_h;
042652ed 2717
3671c580
DV
2718 if (plane == crtc->cursor)
2719 state->legacy_cursor_update = true;
2720
042652ed 2721 ret = drm_atomic_commit(state);
042652ed 2722fail:
0853695c 2723 drm_atomic_state_put(state);
042652ed 2724 return ret;
042652ed
DV
2725}
2726EXPORT_SYMBOL(drm_atomic_helper_update_plane);
2727
2728/**
2729 * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic
2730 * @plane: plane to disable
19315294 2731 * @ctx: lock acquire context
042652ed
DV
2732 *
2733 * Provides a default plane disable handler using the atomic driver interface.
2734 *
2735 * RETURNS:
2736 * Zero on success, error code on failure
2737 */
19315294
DV
2738int drm_atomic_helper_disable_plane(struct drm_plane *plane,
2739 struct drm_modeset_acquire_ctx *ctx)
042652ed
DV
2740{
2741 struct drm_atomic_state *state;
2742 struct drm_plane_state *plane_state;
2743 int ret = 0;
2744
2745 state = drm_atomic_state_alloc(plane->dev);
2746 if (!state)
2747 return -ENOMEM;
2748
d26f96c7 2749 state->acquire_ctx = ctx;
042652ed
DV
2750 plane_state = drm_atomic_get_plane_state(state, plane);
2751 if (IS_ERR(plane_state)) {
2752 ret = PTR_ERR(plane_state);
2753 goto fail;
2754 }
2755
a36c027d 2756 if (plane_state->crtc && plane_state->crtc->cursor == plane)
24e79d0d
ML
2757 plane_state->state->legacy_cursor_update = true;
2758
bbb1e524 2759 ret = __drm_atomic_helper_disable_plane(plane, plane_state);
042652ed
DV
2760 if (ret != 0)
2761 goto fail;
f02ad907 2762
042652ed 2763 ret = drm_atomic_commit(state);
042652ed 2764fail:
0853695c 2765 drm_atomic_state_put(state);
042652ed 2766 return ret;
042652ed
DV
2767}
2768EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
2769
bbb1e524
RC
2770/* just used from fb-helper and atomic-helper: */
2771int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
2772 struct drm_plane_state *plane_state)
2773{
2774 int ret;
2775
2776 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
2777 if (ret != 0)
2778 return ret;
2779
2780 drm_atomic_set_fb_for_plane(plane_state, NULL);
2781 plane_state->crtc_x = 0;
2782 plane_state->crtc_y = 0;
bbb1e524 2783 plane_state->crtc_w = 0;
02e6f379 2784 plane_state->crtc_h = 0;
bbb1e524
RC
2785 plane_state->src_x = 0;
2786 plane_state->src_y = 0;
bbb1e524 2787 plane_state->src_w = 0;
02e6f379 2788 plane_state->src_h = 0;
bbb1e524 2789
bbb1e524
RC
2790 return 0;
2791}
2792
042652ed
DV
2793static int update_output_state(struct drm_atomic_state *state,
2794 struct drm_mode_set *set)
2795{
2796 struct drm_device *dev = set->crtc->dev;
df63b999 2797 struct drm_crtc *crtc;
415c3ac3 2798 struct drm_crtc_state *new_crtc_state;
df63b999 2799 struct drm_connector *connector;
415c3ac3 2800 struct drm_connector_state *new_conn_state;
6ab520a2 2801 int ret, i;
042652ed
DV
2802
2803 ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
2804 state->acquire_ctx);
2805 if (ret)
2806 return ret;
2807
6ab520a2
ML
2808 /* First disable all connectors on the target crtc. */
2809 ret = drm_atomic_add_affected_connectors(state, set->crtc);
2810 if (ret)
2811 return ret;
042652ed 2812
415c3ac3
ML
2813 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
2814 if (new_conn_state->crtc == set->crtc) {
2815 ret = drm_atomic_set_crtc_for_connector(new_conn_state,
042652ed
DV
2816 NULL);
2817 if (ret)
2818 return ret;
415c3ac3 2819
40ee6fbe 2820 /* Make sure legacy setCrtc always re-trains */
415c3ac3 2821 new_conn_state->link_status = DRM_LINK_STATUS_GOOD;
042652ed 2822 }
6ab520a2 2823 }
042652ed 2824
6ab520a2
ML
2825 /* Then set all connectors from set->connectors on the target crtc */
2826 for (i = 0; i < set->num_connectors; i++) {
415c3ac3 2827 new_conn_state = drm_atomic_get_connector_state(state,
6ab520a2 2828 set->connectors[i]);
415c3ac3
ML
2829 if (IS_ERR(new_conn_state))
2830 return PTR_ERR(new_conn_state);
6ab520a2 2831
415c3ac3 2832 ret = drm_atomic_set_crtc_for_connector(new_conn_state,
6ab520a2
ML
2833 set->crtc);
2834 if (ret)
2835 return ret;
042652ed
DV
2836 }
2837
415c3ac3 2838 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
042652ed
DV
2839 /* Don't update ->enable for the CRTC in the set_config request,
2840 * since a mismatch would indicate a bug in the upper layers.
2841 * The actual modeset code later on will catch any
2842 * inconsistencies here. */
2843 if (crtc == set->crtc)
2844 continue;
2845
415c3ac3
ML
2846 if (!new_crtc_state->connector_mask) {
2847 ret = drm_atomic_set_mode_prop_for_crtc(new_crtc_state,
c30f55a7
LP
2848 NULL);
2849 if (ret < 0)
2850 return ret;
2851
415c3ac3 2852 new_crtc_state->active = false;
c30f55a7 2853 }
042652ed
DV
2854 }
2855
2856 return 0;
2857}
2858
2859/**
2860 * drm_atomic_helper_set_config - set a new config from userspace
2861 * @set: mode set configuration
a4eff9aa 2862 * @ctx: lock acquisition context
042652ed
DV
2863 *
2864 * Provides a default crtc set_config handler using the atomic driver interface.
2865 *
40ee6fbe
MN
2866 * NOTE: For backwards compatibility with old userspace this automatically
2867 * resets the "link-status" property to GOOD, to force any link
2868 * re-training. The SETCRTC ioctl does not define whether an update does
2869 * need a full modeset or just a plane update, hence we're allowed to do
2870 * that. See also drm_mode_connector_set_link_status_property().
2871 *
042652ed
DV
2872 * Returns:
2873 * Returns 0 on success, negative errno numbers on failure.
2874 */
a4eff9aa
DV
2875int drm_atomic_helper_set_config(struct drm_mode_set *set,
2876 struct drm_modeset_acquire_ctx *ctx)
042652ed
DV
2877{
2878 struct drm_atomic_state *state;
2879 struct drm_crtc *crtc = set->crtc;
042652ed
DV
2880 int ret = 0;
2881
2882 state = drm_atomic_state_alloc(crtc->dev);
2883 if (!state)
2884 return -ENOMEM;
2885
38b6441e 2886 state->acquire_ctx = ctx;
bbb1e524
RC
2887 ret = __drm_atomic_helper_set_config(set, state);
2888 if (ret != 0)
1fa4da04 2889 goto fail;
042652ed 2890
44596b8c
ML
2891 ret = handle_conflicting_encoders(state, true);
2892 if (ret)
2893 return ret;
2894
bbb1e524 2895 ret = drm_atomic_commit(state);
bbb1e524 2896
1fa4da04 2897fail:
0853695c 2898 drm_atomic_state_put(state);
bbb1e524 2899 return ret;
bbb1e524
RC
2900}
2901EXPORT_SYMBOL(drm_atomic_helper_set_config);
2902
2903/* just used from fb-helper and atomic-helper: */
2904int __drm_atomic_helper_set_config(struct drm_mode_set *set,
2905 struct drm_atomic_state *state)
2906{
2907 struct drm_crtc_state *crtc_state;
2908 struct drm_plane_state *primary_state;
2909 struct drm_crtc *crtc = set->crtc;
83926117 2910 int hdisplay, vdisplay;
bbb1e524
RC
2911 int ret;
2912
2913 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2914 if (IS_ERR(crtc_state))
2915 return PTR_ERR(crtc_state);
2916
2917 primary_state = drm_atomic_get_plane_state(state, crtc->primary);
2918 if (IS_ERR(primary_state))
2919 return PTR_ERR(primary_state);
e5b5341c 2920
042652ed
DV
2921 if (!set->mode) {
2922 WARN_ON(set->fb);
2923 WARN_ON(set->num_connectors);
2924
819364da
DS
2925 ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
2926 if (ret != 0)
bbb1e524 2927 return ret;
819364da 2928
eab3bbef 2929 crtc_state->active = false;
e5b5341c 2930
07cc0ef6 2931 ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
e5b5341c 2932 if (ret != 0)
bbb1e524 2933 return ret;
e5b5341c
RC
2934
2935 drm_atomic_set_fb_for_plane(primary_state, NULL);
2936
042652ed
DV
2937 goto commit;
2938 }
2939
2940 WARN_ON(!set->fb);
2941 WARN_ON(!set->num_connectors);
2942
819364da
DS
2943 ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
2944 if (ret != 0)
bbb1e524 2945 return ret;
819364da 2946
eab3bbef 2947 crtc_state->active = true;
042652ed 2948
07cc0ef6 2949 ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
042652ed 2950 if (ret != 0)
bbb1e524
RC
2951 return ret;
2952
196cd5d3 2953 drm_mode_get_hv_timing(set->mode, &hdisplay, &vdisplay);
83926117 2954
321ebf04 2955 drm_atomic_set_fb_for_plane(primary_state, set->fb);
042652ed
DV
2956 primary_state->crtc_x = 0;
2957 primary_state->crtc_y = 0;
83926117 2958 primary_state->crtc_w = hdisplay;
02e6f379 2959 primary_state->crtc_h = vdisplay;
042652ed
DV
2960 primary_state->src_x = set->x << 16;
2961 primary_state->src_y = set->y << 16;
bd2ef25d 2962 if (drm_rotation_90_or_270(primary_state->rotation)) {
83926117 2963 primary_state->src_w = vdisplay << 16;
02e6f379 2964 primary_state->src_h = hdisplay << 16;
41121248 2965 } else {
83926117 2966 primary_state->src_w = hdisplay << 16;
02e6f379 2967 primary_state->src_h = vdisplay << 16;
41121248 2968 }
042652ed
DV
2969
2970commit:
2971 ret = update_output_state(state, set);
2972 if (ret)
bbb1e524 2973 return ret;
042652ed 2974
042652ed 2975 return 0;
042652ed 2976}
042652ed 2977
5e9cfeba
VS
2978static int __drm_atomic_helper_disable_all(struct drm_device *dev,
2979 struct drm_modeset_acquire_ctx *ctx,
2980 bool clean_old_fbs)
14942760
TR
2981{
2982 struct drm_atomic_state *state;
9b2104f4 2983 struct drm_connector_state *conn_state;
14942760 2984 struct drm_connector *conn;
9b2104f4
ML
2985 struct drm_plane_state *plane_state;
2986 struct drm_plane *plane;
2987 struct drm_crtc_state *crtc_state;
2988 struct drm_crtc *crtc;
2989 int ret, i;
14942760
TR
2990
2991 state = drm_atomic_state_alloc(dev);
2992 if (!state)
2993 return -ENOMEM;
2994
2995 state->acquire_ctx = ctx;
2996
9b2104f4 2997 drm_for_each_crtc(crtc, dev) {
14942760
TR
2998 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2999 if (IS_ERR(crtc_state)) {
9b2104f4 3000 ret = PTR_ERR(crtc_state);
14942760
TR
3001 goto free;
3002 }
3003
3004 crtc_state->active = false;
9b2104f4
ML
3005
3006 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state, NULL);
3007 if (ret < 0)
3008 goto free;
3009
3010 ret = drm_atomic_add_affected_planes(state, crtc);
3011 if (ret < 0)
3012 goto free;
3013
3014 ret = drm_atomic_add_affected_connectors(state, crtc);
3015 if (ret < 0)
3016 goto free;
3017 }
3018
dfb8bb3b 3019 for_each_new_connector_in_state(state, conn, conn_state, i) {
9b2104f4
ML
3020 ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
3021 if (ret < 0)
3022 goto free;
3023 }
3024
dfb8bb3b 3025 for_each_new_plane_in_state(state, plane, plane_state, i) {
9b2104f4
ML
3026 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
3027 if (ret < 0)
3028 goto free;
3029
3030 drm_atomic_set_fb_for_plane(plane_state, NULL);
14942760
TR
3031 }
3032
9b2104f4 3033 ret = drm_atomic_commit(state);
14942760 3034free:
0853695c 3035 drm_atomic_state_put(state);
9b2104f4 3036 return ret;
14942760 3037}
9b2104f4 3038
5e9cfeba
VS
3039/**
3040 * drm_atomic_helper_disable_all - disable all currently active outputs
3041 * @dev: DRM device
3042 * @ctx: lock acquisition context
3043 *
3044 * Loops through all connectors, finding those that aren't turned off and then
3045 * turns them off by setting their DPMS mode to OFF and deactivating the CRTC
3046 * that they are connected to.
3047 *
3048 * This is used for example in suspend/resume to disable all currently active
3049 * functions when suspending. If you just want to shut down everything at e.g.
3050 * driver unload, look at drm_atomic_helper_shutdown().
3051 *
3052 * Note that if callers haven't already acquired all modeset locks this might
3053 * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
3054 *
3055 * Returns:
3056 * 0 on success or a negative error code on failure.
3057 *
3058 * See also:
3059 * drm_atomic_helper_suspend(), drm_atomic_helper_resume() and
3060 * drm_atomic_helper_shutdown().
3061 */
3062int drm_atomic_helper_disable_all(struct drm_device *dev,
3063 struct drm_modeset_acquire_ctx *ctx)
3064{
3065 return __drm_atomic_helper_disable_all(dev, ctx, false);
3066}
14942760
TR
3067EXPORT_SYMBOL(drm_atomic_helper_disable_all);
3068
18dddadc
DV
3069/**
3070 * drm_atomic_helper_shutdown - shutdown all CRTC
3071 * @dev: DRM device
3072 *
3073 * This shuts down all CRTC, which is useful for driver unloading. Shutdown on
3074 * suspend should instead be handled with drm_atomic_helper_suspend(), since
3075 * that also takes a snapshot of the modeset state to be restored on resume.
3076 *
3077 * This is just a convenience wrapper around drm_atomic_helper_disable_all(),
3078 * and it is the atomic version of drm_crtc_force_disable_all().
3079 */
3080void drm_atomic_helper_shutdown(struct drm_device *dev)
3081{
3082 struct drm_modeset_acquire_ctx ctx;
3083 int ret;
3084
3085 drm_modeset_acquire_init(&ctx, 0);
3086 while (1) {
3087 ret = drm_modeset_lock_all_ctx(dev, &ctx);
3088 if (!ret)
5e9cfeba 3089 ret = __drm_atomic_helper_disable_all(dev, &ctx, true);
18dddadc
DV
3090
3091 if (ret != -EDEADLK)
3092 break;
3093
3094 drm_modeset_backoff(&ctx);
3095 }
3096
3097 if (ret)
3098 DRM_ERROR("Disabling all crtc's during unload failed with %i\n", ret);
3099
3100 drm_modeset_drop_locks(&ctx);
3101 drm_modeset_acquire_fini(&ctx);
3102}
3103EXPORT_SYMBOL(drm_atomic_helper_shutdown);
3104
14942760
TR
3105/**
3106 * drm_atomic_helper_suspend - subsystem-level suspend helper
3107 * @dev: DRM device
3108 *
3109 * Duplicates the current atomic state, disables all active outputs and then
3110 * returns a pointer to the original atomic state to the caller. Drivers can
3111 * pass this pointer to the drm_atomic_helper_resume() helper upon resume to
3112 * restore the output configuration that was active at the time the system
3113 * entered suspend.
3114 *
3115 * Note that it is potentially unsafe to use this. The atomic state object
3116 * returned by this function is assumed to be persistent. Drivers must ensure
3117 * that this holds true. Before calling this function, drivers must make sure
3118 * to suspend fbdev emulation so that nothing can be using the device.
3119 *
3120 * Returns:
3121 * A pointer to a copy of the state before suspend on success or an ERR_PTR()-
3122 * encoded error code on failure. Drivers should store the returned atomic
3123 * state object and pass it to the drm_atomic_helper_resume() helper upon
3124 * resume.
3125 *
3126 * See also:
3127 * drm_atomic_helper_duplicate_state(), drm_atomic_helper_disable_all(),
581e49fe 3128 * drm_atomic_helper_resume(), drm_atomic_helper_commit_duplicated_state()
14942760
TR
3129 */
3130struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
3131{
3132 struct drm_modeset_acquire_ctx ctx;
3133 struct drm_atomic_state *state;
3134 int err;
3135
3136 drm_modeset_acquire_init(&ctx, 0);
3137
3138retry:
3139 err = drm_modeset_lock_all_ctx(dev, &ctx);
3140 if (err < 0) {
3141 state = ERR_PTR(err);
3142 goto unlock;
3143 }
3144
3145 state = drm_atomic_helper_duplicate_state(dev, &ctx);
3146 if (IS_ERR(state))
3147 goto unlock;
3148
3149 err = drm_atomic_helper_disable_all(dev, &ctx);
3150 if (err < 0) {
0853695c 3151 drm_atomic_state_put(state);
14942760
TR
3152 state = ERR_PTR(err);
3153 goto unlock;
3154 }
3155
3156unlock:
3157 if (PTR_ERR(state) == -EDEADLK) {
3158 drm_modeset_backoff(&ctx);
3159 goto retry;
3160 }
3161
3162 drm_modeset_drop_locks(&ctx);
3163 drm_modeset_acquire_fini(&ctx);
3164 return state;
3165}
3166EXPORT_SYMBOL(drm_atomic_helper_suspend);
3167
581e49fe
ML
3168/**
3169 * drm_atomic_helper_commit_duplicated_state - commit duplicated state
3170 * @state: duplicated atomic state to commit
3171 * @ctx: pointer to acquire_ctx to use for commit.
3172 *
3173 * The state returned by drm_atomic_helper_duplicate_state() and
3174 * drm_atomic_helper_suspend() is partially invalid, and needs to
3175 * be fixed up before commit.
3176 *
3177 * Returns:
3178 * 0 on success or a negative error code on failure.
3179 *
3180 * See also:
3181 * drm_atomic_helper_suspend()
3182 */
3183int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
3184 struct drm_modeset_acquire_ctx *ctx)
3185{
3186 int i;
3187 struct drm_plane *plane;
415c3ac3 3188 struct drm_plane_state *new_plane_state;
581e49fe 3189 struct drm_connector *connector;
415c3ac3 3190 struct drm_connector_state *new_conn_state;
581e49fe 3191 struct drm_crtc *crtc;
415c3ac3 3192 struct drm_crtc_state *new_crtc_state;
581e49fe
ML
3193
3194 state->acquire_ctx = ctx;
3195
e00fb856 3196 for_each_new_plane_in_state(state, plane, new_plane_state, i)
581e49fe
ML
3197 state->planes[i].old_state = plane->state;
3198
415c3ac3 3199 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
581e49fe
ML
3200 state->crtcs[i].old_state = crtc->state;
3201
415c3ac3 3202 for_each_new_connector_in_state(state, connector, new_conn_state, i)
581e49fe
ML
3203 state->connectors[i].old_state = connector->state;
3204
5e9cfeba 3205 return drm_atomic_commit(state);
581e49fe
ML
3206}
3207EXPORT_SYMBOL(drm_atomic_helper_commit_duplicated_state);
3208
14942760
TR
3209/**
3210 * drm_atomic_helper_resume - subsystem-level resume helper
3211 * @dev: DRM device
3212 * @state: atomic state to resume to
3213 *
3214 * Calls drm_mode_config_reset() to synchronize hardware and software states,
3215 * grabs all modeset locks and commits the atomic state object. This can be
3216 * used in conjunction with the drm_atomic_helper_suspend() helper to
3217 * implement suspend/resume for drivers that support atomic mode-setting.
3218 *
3219 * Returns:
3220 * 0 on success or a negative error code on failure.
3221 *
3222 * See also:
3223 * drm_atomic_helper_suspend()
3224 */
3225int drm_atomic_helper_resume(struct drm_device *dev,
3226 struct drm_atomic_state *state)
3227{
a5b8444e 3228 struct drm_modeset_acquire_ctx ctx;
14942760
TR
3229 int err;
3230
3231 drm_mode_config_reset(dev);
581e49fe 3232
a5b8444e
DV
3233 drm_modeset_acquire_init(&ctx, 0);
3234 while (1) {
869e188a
DV
3235 err = drm_modeset_lock_all_ctx(dev, &ctx);
3236 if (err)
3237 goto out;
3238
a5b8444e 3239 err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
869e188a 3240out:
a5b8444e
DV
3241 if (err != -EDEADLK)
3242 break;
3243
3244 drm_modeset_backoff(&ctx);
3245 }
3246
6d281b1f 3247 drm_atomic_state_put(state);
a5b8444e
DV
3248 drm_modeset_drop_locks(&ctx);
3249 drm_modeset_acquire_fini(&ctx);
14942760
TR
3250
3251 return err;
3252}
3253EXPORT_SYMBOL(drm_atomic_helper_resume);
3254
8c3a8181
DV
3255static int page_flip_common(struct drm_atomic_state *state,
3256 struct drm_crtc *crtc,
3257 struct drm_framebuffer *fb,
3258 struct drm_pending_vblank_event *event,
3259 uint32_t flags)
f869a6ec
AG
3260{
3261 struct drm_plane *plane = crtc->primary;
3262 struct drm_plane_state *plane_state;
3263 struct drm_crtc_state *crtc_state;
3264 int ret = 0;
3265
3266 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3267 if (IS_ERR(crtc_state))
3268 return PTR_ERR(crtc_state);
3269
3270 crtc_state->event = event;
6cbe5c46 3271 crtc_state->pageflip_flags = flags;
f869a6ec
AG
3272
3273 plane_state = drm_atomic_get_plane_state(state, plane);
3274 if (IS_ERR(plane_state))
3275 return PTR_ERR(plane_state);
3276
f869a6ec
AG
3277 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
3278 if (ret != 0)
3279 return ret;
3280 drm_atomic_set_fb_for_plane(plane_state, fb);
3281
3282 /* Make sure we don't accidentally do a full modeset. */
3283 state->allow_modeset = false;
3284 if (!crtc_state->active) {
6ac7c548
RK
3285 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] disabled, rejecting legacy flip\n",
3286 crtc->base.id, crtc->name);
f869a6ec
AG
3287 return -EINVAL;
3288 }
3289
3290 return ret;
3291}
3292
8bc0f312
DV
3293/**
3294 * drm_atomic_helper_page_flip - execute a legacy page flip
3295 * @crtc: DRM crtc
3296 * @fb: DRM framebuffer
3297 * @event: optional DRM event to signal upon completion
3298 * @flags: flip flags for non-vblank sync'ed updates
41292b1f 3299 * @ctx: lock acquisition context
8bc0f312 3300 *
f869a6ec
AG
3301 * Provides a default &drm_crtc_funcs.page_flip implementation
3302 * using the atomic driver interface.
8bc0f312 3303 *
8bc0f312
DV
3304 * Returns:
3305 * Returns 0 on success, negative errno numbers on failure.
f869a6ec
AG
3306 *
3307 * See also:
3308 * drm_atomic_helper_page_flip_target()
8bc0f312
DV
3309 */
3310int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
3311 struct drm_framebuffer *fb,
3312 struct drm_pending_vblank_event *event,
41292b1f
DV
3313 uint32_t flags,
3314 struct drm_modeset_acquire_ctx *ctx)
8bc0f312
DV
3315{
3316 struct drm_plane *plane = crtc->primary;
3317 struct drm_atomic_state *state;
8bc0f312
DV
3318 int ret = 0;
3319
8bc0f312
DV
3320 state = drm_atomic_state_alloc(plane->dev);
3321 if (!state)
3322 return -ENOMEM;
3323
043e7fb6 3324 state->acquire_ctx = ctx;
f869a6ec 3325
6cbe5c46 3326 ret = page_flip_common(state, crtc, fb, event, flags);
f869a6ec 3327 if (ret != 0)
8bc0f312 3328 goto fail;
8bc0f312 3329
f869a6ec 3330 ret = drm_atomic_nonblocking_commit(state);
f869a6ec 3331fail:
f869a6ec
AG
3332 drm_atomic_state_put(state);
3333 return ret;
f869a6ec
AG
3334}
3335EXPORT_SYMBOL(drm_atomic_helper_page_flip);
3336
3337/**
3338 * drm_atomic_helper_page_flip_target - do page flip on target vblank period.
3339 * @crtc: DRM crtc
3340 * @fb: DRM framebuffer
3341 * @event: optional DRM event to signal upon completion
3342 * @flags: flip flags for non-vblank sync'ed updates
3343 * @target: specifying the target vblank period when the flip to take effect
41292b1f 3344 * @ctx: lock acquisition context
f869a6ec
AG
3345 *
3346 * Provides a default &drm_crtc_funcs.page_flip_target implementation.
3347 * Similar to drm_atomic_helper_page_flip() with extra parameter to specify
3348 * target vblank period to flip.
3349 *
3350 * Returns:
3351 * Returns 0 on success, negative errno numbers on failure.
3352 */
8c3a8181
DV
3353int drm_atomic_helper_page_flip_target(struct drm_crtc *crtc,
3354 struct drm_framebuffer *fb,
3355 struct drm_pending_vblank_event *event,
3356 uint32_t flags,
3357 uint32_t target,
3358 struct drm_modeset_acquire_ctx *ctx)
f869a6ec
AG
3359{
3360 struct drm_plane *plane = crtc->primary;
3361 struct drm_atomic_state *state;
3362 struct drm_crtc_state *crtc_state;
3363 int ret = 0;
3364
f869a6ec
AG
3365 state = drm_atomic_state_alloc(plane->dev);
3366 if (!state)
3367 return -ENOMEM;
3368
043e7fb6 3369 state->acquire_ctx = ctx;
f869a6ec 3370
6cbe5c46 3371 ret = page_flip_common(state, crtc, fb, event, flags);
8bc0f312
DV
3372 if (ret != 0)
3373 goto fail;
8bc0f312 3374
b4d93679 3375 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
f869a6ec 3376 if (WARN_ON(!crtc_state)) {
4cba6850
DV
3377 ret = -EINVAL;
3378 goto fail;
3379 }
f869a6ec 3380 crtc_state->target_vblank = target;
4cba6850 3381
b837ba0a 3382 ret = drm_atomic_nonblocking_commit(state);
8bc0f312 3383fail:
0853695c 3384 drm_atomic_state_put(state);
8bc0f312 3385 return ret;
8bc0f312 3386}
f869a6ec 3387EXPORT_SYMBOL(drm_atomic_helper_page_flip_target);
d461701c 3388
9ecb5498 3389/**
6806cdf9
DV
3390 * drm_atomic_helper_best_encoder - Helper for
3391 * &drm_connector_helper_funcs.best_encoder callback
9ecb5498
NT
3392 * @connector: Connector control structure
3393 *
6806cdf9 3394 * This is a &drm_connector_helper_funcs.best_encoder callback helper for
9ecb5498
NT
3395 * connectors that support exactly 1 encoder, statically determined at driver
3396 * init time.
3397 */
3398struct drm_encoder *
3399drm_atomic_helper_best_encoder(struct drm_connector *connector)
3400{
3401 WARN_ON(connector->encoder_ids[1]);
418da172 3402 return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
9ecb5498
NT
3403}
3404EXPORT_SYMBOL(drm_atomic_helper_best_encoder);
3405
3150c7d0
DV
3406/**
3407 * DOC: atomic state reset and initialization
3408 *
3409 * Both the drm core and the atomic helpers assume that there is always the full
3410 * and correct atomic software state for all connectors, CRTCs and planes
3411 * available. Which is a bit a problem on driver load and also after system
3412 * suspend. One way to solve this is to have a hardware state read-out
3413 * infrastructure which reconstructs the full software state (e.g. the i915
3414 * driver).
3415 *
3416 * The simpler solution is to just reset the software state to everything off,
3417 * which is easiest to do by calling drm_mode_config_reset(). To facilitate this
3418 * the atomic helpers provide default reset implementations for all hooks.
7f8ee3e5
DV
3419 *
3420 * On the upside the precise state tracking of atomic simplifies system suspend
3421 * and resume a lot. For drivers using drm_mode_config_reset() a complete recipe
3422 * is implemented in drm_atomic_helper_suspend() and drm_atomic_helper_resume().
3423 * For other drivers the building blocks are split out, see the documentation
3424 * for these functions.
3150c7d0
DV
3425 */
3426
d461701c 3427/**
6806cdf9 3428 * drm_atomic_helper_crtc_reset - default &drm_crtc_funcs.reset hook for CRTCs
d461701c
DV
3429 * @crtc: drm CRTC
3430 *
3431 * Resets the atomic state for @crtc by freeing the state pointer (which might
3432 * be NULL, e.g. at driver load time) and allocating a new empty state object.
3433 */
3434void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
3435{
b0b5511b 3436 if (crtc->state)
ec2dc6a0 3437 __drm_atomic_helper_crtc_destroy_state(crtc->state);
b0b5511b 3438
d461701c
DV
3439 kfree(crtc->state);
3440 crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
07cc0ef6
DV
3441
3442 if (crtc->state)
3443 crtc->state->crtc = crtc;
d461701c
DV
3444}
3445EXPORT_SYMBOL(drm_atomic_helper_crtc_reset);
3446
f5e7840b
TR
3447/**
3448 * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state
3449 * @crtc: CRTC object
3450 * @state: atomic CRTC state
3451 *
3452 * Copies atomic state from a CRTC's current state and resets inferred values.
3453 * This is useful for drivers that subclass the CRTC state.
3454 */
3455void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
3456 struct drm_crtc_state *state)
3457{
3458 memcpy(state, crtc->state, sizeof(*state));
3459
99cf4a29 3460 if (state->mode_blob)
6472e509 3461 drm_property_blob_get(state->mode_blob);
5488dc16 3462 if (state->degamma_lut)
6472e509 3463 drm_property_blob_get(state->degamma_lut);
5488dc16 3464 if (state->ctm)
6472e509 3465 drm_property_blob_get(state->ctm);
5488dc16 3466 if (state->gamma_lut)
6472e509 3467 drm_property_blob_get(state->gamma_lut);
f5e7840b
TR
3468 state->mode_changed = false;
3469 state->active_changed = false;
3470 state->planes_changed = false;
fc596660 3471 state->connectors_changed = false;
5488dc16 3472 state->color_mgmt_changed = false;
44d1240d 3473 state->zpos_changed = false;
163bcc2c 3474 state->commit = NULL;
f5e7840b 3475 state->event = NULL;
6cbe5c46 3476 state->pageflip_flags = 0;
f5e7840b
TR
3477}
3478EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state);
3479
d461701c
DV
3480/**
3481 * drm_atomic_helper_crtc_duplicate_state - default state duplicate hook
3482 * @crtc: drm CRTC
3483 *
3484 * Default CRTC state duplicate hook for drivers which don't have their own
3485 * subclassed CRTC state structure.
3486 */
3487struct drm_crtc_state *
3488drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc)
3489{
3490 struct drm_crtc_state *state;
3491
3492 if (WARN_ON(!crtc->state))
3493 return NULL;
3494
f5e7840b
TR
3495 state = kmalloc(sizeof(*state), GFP_KERNEL);
3496 if (state)
3497 __drm_atomic_helper_crtc_duplicate_state(crtc, state);
d461701c
DV
3498
3499 return state;
3500}
3501EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
3502
f5e7840b
TR
3503/**
3504 * __drm_atomic_helper_crtc_destroy_state - release CRTC state
f5e7840b
TR
3505 * @state: CRTC state object to release
3506 *
3507 * Releases all resources stored in the CRTC state without actually freeing
3508 * the memory of the CRTC state. This is useful for drivers that subclass the
3509 * CRTC state.
3510 */
ec2dc6a0 3511void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state)
f5e7840b 3512{
163bcc2c 3513 if (state->commit) {
1c6ceeee
LSL
3514 /*
3515 * In the event that a non-blocking commit returns
3516 * -ERESTARTSYS before the commit_tail work is queued, we will
3517 * have an extra reference to the commit object. Release it, if
3518 * the event has not been consumed by the worker.
3519 *
3520 * state->event may be freed, so we can't directly look at
3521 * state->event->base.completion.
3522 */
3523 if (state->event && state->commit->abort_completion)
3524 drm_crtc_commit_put(state->commit);
3525
163bcc2c
ML
3526 kfree(state->commit->event);
3527 state->commit->event = NULL;
1c6ceeee 3528
163bcc2c
ML
3529 drm_crtc_commit_put(state->commit);
3530 }
3531
6472e509
TR
3532 drm_property_blob_put(state->mode_blob);
3533 drm_property_blob_put(state->degamma_lut);
3534 drm_property_blob_put(state->ctm);
3535 drm_property_blob_put(state->gamma_lut);
f5e7840b
TR
3536}
3537EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
3538
d461701c
DV
3539/**
3540 * drm_atomic_helper_crtc_destroy_state - default state destroy hook
3541 * @crtc: drm CRTC
3542 * @state: CRTC state object to release
3543 *
3544 * Default CRTC state destroy hook for drivers which don't have their own
3545 * subclassed CRTC state structure.
3546 */
3547void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
3548 struct drm_crtc_state *state)
3549{
ec2dc6a0 3550 __drm_atomic_helper_crtc_destroy_state(state);
d461701c
DV
3551 kfree(state);
3552}
3553EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
3554
3555/**
6806cdf9 3556 * drm_atomic_helper_plane_reset - default &drm_plane_funcs.reset hook for planes
d461701c
DV
3557 * @plane: drm plane
3558 *
3559 * Resets the atomic state for @plane by freeing the state pointer (which might
3560 * be NULL, e.g. at driver load time) and allocating a new empty state object.
3561 */
3562void drm_atomic_helper_plane_reset(struct drm_plane *plane)
3563{
b0b5511b 3564 if (plane->state)
2f701695 3565 __drm_atomic_helper_plane_destroy_state(plane->state);
321ebf04 3566
d461701c
DV
3567 kfree(plane->state);
3568 plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);
07cc0ef6 3569
25aaa3a1 3570 if (plane->state) {
07cc0ef6 3571 plane->state->plane = plane;
c2c446ad 3572 plane->state->rotation = DRM_MODE_ROTATE_0;
ae0e2826
MR
3573
3574 /* Reset the alpha value to fully opaque if it matters */
3575 if (plane->alpha_property)
3576 plane->state->alpha = plane->alpha_property->values[1];
25aaa3a1 3577 }
d461701c
DV
3578}
3579EXPORT_SYMBOL(drm_atomic_helper_plane_reset);
3580
f5e7840b
TR
3581/**
3582 * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state
3583 * @plane: plane object
3584 * @state: atomic plane state
3585 *
3586 * Copies atomic state from a plane's current state. This is useful for
3587 * drivers that subclass the plane state.
3588 */
3589void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
3590 struct drm_plane_state *state)
3591{
3592 memcpy(state, plane->state, sizeof(*state));
3593
3594 if (state->fb)
a4a69da0 3595 drm_framebuffer_get(state->fb);
96260142
GP
3596
3597 state->fence = NULL;
21a01abb 3598 state->commit = NULL;
f5e7840b
TR
3599}
3600EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state);
3601
d461701c
DV
3602/**
3603 * drm_atomic_helper_plane_duplicate_state - default state duplicate hook
3604 * @plane: drm plane
3605 *
3606 * Default plane state duplicate hook for drivers which don't have their own
3607 * subclassed plane state structure.
3608 */
3609struct drm_plane_state *
3610drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane)
3611{
321ebf04
DV
3612 struct drm_plane_state *state;
3613
d461701c
DV
3614 if (WARN_ON(!plane->state))
3615 return NULL;
3616
f5e7840b
TR
3617 state = kmalloc(sizeof(*state), GFP_KERNEL);
3618 if (state)
3619 __drm_atomic_helper_plane_duplicate_state(plane, state);
321ebf04
DV
3620
3621 return state;
d461701c
DV
3622}
3623EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state);
3624
f5e7840b
TR
3625/**
3626 * __drm_atomic_helper_plane_destroy_state - release plane state
f5e7840b
TR
3627 * @state: plane state object to release
3628 *
3629 * Releases all resources stored in the plane state without actually freeing
3630 * the memory of the plane state. This is useful for drivers that subclass the
3631 * plane state.
3632 */
2f701695 3633void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state)
f5e7840b
TR
3634{
3635 if (state->fb)
a4a69da0 3636 drm_framebuffer_put(state->fb);
96260142
GP
3637
3638 if (state->fence)
3639 dma_fence_put(state->fence);
21a01abb
ML
3640
3641 if (state->commit)
3642 drm_crtc_commit_put(state->commit);
f5e7840b
TR
3643}
3644EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
3645
d461701c
DV
3646/**
3647 * drm_atomic_helper_plane_destroy_state - default state destroy hook
3648 * @plane: drm plane
3649 * @state: plane state object to release
3650 *
3651 * Default plane state destroy hook for drivers which don't have their own
3652 * subclassed plane state structure.
3653 */
3654void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
321ebf04 3655 struct drm_plane_state *state)
d461701c 3656{
2f701695 3657 __drm_atomic_helper_plane_destroy_state(state);
d461701c
DV
3658 kfree(state);
3659}
3660EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state);
3661
4cd39917
ML
3662/**
3663 * __drm_atomic_helper_connector_reset - reset state on connector
3664 * @connector: drm connector
3665 * @conn_state: connector state to assign
3666 *
3667 * Initializes the newly allocated @conn_state and assigns it to
6806cdf9
DV
3668 * the &drm_conector->state pointer of @connector, usually required when
3669 * initializing the drivers or when called from the &drm_connector_funcs.reset
3670 * hook.
4cd39917
ML
3671 *
3672 * This is useful for drivers that subclass the connector state.
3673 */
3674void
3675__drm_atomic_helper_connector_reset(struct drm_connector *connector,
3676 struct drm_connector_state *conn_state)
3677{
3678 if (conn_state)
3679 conn_state->connector = connector;
3680
3681 connector->state = conn_state;
3682}
3683EXPORT_SYMBOL(__drm_atomic_helper_connector_reset);
3684
d461701c 3685/**
6806cdf9 3686 * drm_atomic_helper_connector_reset - default &drm_connector_funcs.reset hook for connectors
d461701c
DV
3687 * @connector: drm connector
3688 *
3689 * Resets the atomic state for @connector by freeing the state pointer (which
3690 * might be NULL, e.g. at driver load time) and allocating a new empty state
3691 * object.
3692 */
3693void drm_atomic_helper_connector_reset(struct drm_connector *connector)
3694{
4cd39917
ML
3695 struct drm_connector_state *conn_state =
3696 kzalloc(sizeof(*conn_state), GFP_KERNEL);
07cc0ef6 3697
b0b5511b 3698 if (connector->state)
fabd9106 3699 __drm_atomic_helper_connector_destroy_state(connector->state);
b0b5511b 3700
4cd39917
ML
3701 kfree(connector->state);
3702 __drm_atomic_helper_connector_reset(connector, conn_state);
d461701c
DV
3703}
3704EXPORT_SYMBOL(drm_atomic_helper_connector_reset);
3705
f5e7840b
TR
3706/**
3707 * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state
3708 * @connector: connector object
3709 * @state: atomic connector state
3710 *
3711 * Copies atomic state from a connector's current state. This is useful for
3712 * drivers that subclass the connector state.
3713 */
3714void
3715__drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
3716 struct drm_connector_state *state)
3717{
3718 memcpy(state, connector->state, sizeof(*state));
d2307dea 3719 if (state->crtc)
ad093607 3720 drm_connector_get(connector);
21a01abb 3721 state->commit = NULL;
935774cd
BS
3722
3723 /* Don't copy over a writeback job, they are used only once */
3724 state->writeback_job = NULL;
f5e7840b
TR
3725}
3726EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
3727
d461701c
DV
3728/**
3729 * drm_atomic_helper_connector_duplicate_state - default state duplicate hook
3730 * @connector: drm connector
3731 *
3732 * Default connector state duplicate hook for drivers which don't have their own
3733 * subclassed connector state structure.
3734 */
3735struct drm_connector_state *
3736drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector)
3737{
f5e7840b
TR
3738 struct drm_connector_state *state;
3739
d461701c
DV
3740 if (WARN_ON(!connector->state))
3741 return NULL;
3742
f5e7840b
TR
3743 state = kmalloc(sizeof(*state), GFP_KERNEL);
3744 if (state)
3745 __drm_atomic_helper_connector_duplicate_state(connector, state);
3746
3747 return state;
d461701c
DV
3748}
3749EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
3750
397fd77c
TR
3751/**
3752 * drm_atomic_helper_duplicate_state - duplicate an atomic state object
3753 * @dev: DRM device
3754 * @ctx: lock acquisition context
3755 *
3756 * Makes a copy of the current atomic state by looping over all objects and
14942760
TR
3757 * duplicating their respective states. This is used for example by suspend/
3758 * resume support code to save the state prior to suspend such that it can
3759 * be restored upon resume.
397fd77c
TR
3760 *
3761 * Note that this treats atomic state as persistent between save and restore.
3762 * Drivers must make sure that this is possible and won't result in confusion
3763 * or erroneous behaviour.
3764 *
3765 * Note that if callers haven't already acquired all modeset locks this might
3766 * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
3767 *
3768 * Returns:
3769 * A pointer to the copy of the atomic state object on success or an
3770 * ERR_PTR()-encoded error code on failure.
14942760
TR
3771 *
3772 * See also:
3773 * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
397fd77c
TR
3774 */
3775struct drm_atomic_state *
3776drm_atomic_helper_duplicate_state(struct drm_device *dev,
3777 struct drm_modeset_acquire_ctx *ctx)
3778{
3779 struct drm_atomic_state *state;
3780 struct drm_connector *conn;
c36a3254 3781 struct drm_connector_list_iter conn_iter;
397fd77c
TR
3782 struct drm_plane *plane;
3783 struct drm_crtc *crtc;
3784 int err = 0;
3785
3786 state = drm_atomic_state_alloc(dev);
3787 if (!state)
3788 return ERR_PTR(-ENOMEM);
3789
3790 state->acquire_ctx = ctx;
3791
3792 drm_for_each_crtc(crtc, dev) {
3793 struct drm_crtc_state *crtc_state;
3794
3795 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3796 if (IS_ERR(crtc_state)) {
3797 err = PTR_ERR(crtc_state);
3798 goto free;
3799 }
3800 }
3801
3802 drm_for_each_plane(plane, dev) {
3803 struct drm_plane_state *plane_state;
3804
3805 plane_state = drm_atomic_get_plane_state(state, plane);
3806 if (IS_ERR(plane_state)) {
3807 err = PTR_ERR(plane_state);
3808 goto free;
3809 }
3810 }
3811
b982dab1 3812 drm_connector_list_iter_begin(dev, &conn_iter);
c36a3254 3813 drm_for_each_connector_iter(conn, &conn_iter) {
397fd77c
TR
3814 struct drm_connector_state *conn_state;
3815
3816 conn_state = drm_atomic_get_connector_state(state, conn);
3817 if (IS_ERR(conn_state)) {
3818 err = PTR_ERR(conn_state);
b982dab1 3819 drm_connector_list_iter_end(&conn_iter);
397fd77c
TR
3820 goto free;
3821 }
3822 }
b982dab1 3823 drm_connector_list_iter_end(&conn_iter);
397fd77c
TR
3824
3825 /* clear the acquire context so that it isn't accidentally reused */
3826 state->acquire_ctx = NULL;
3827
3828free:
3829 if (err < 0) {
0853695c 3830 drm_atomic_state_put(state);
397fd77c
TR
3831 state = ERR_PTR(err);
3832 }
3833
3834 return state;
3835}
3836EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
3837
f5e7840b
TR
3838/**
3839 * __drm_atomic_helper_connector_destroy_state - release connector state
f5e7840b
TR
3840 * @state: connector state object to release
3841 *
3842 * Releases all resources stored in the connector state without actually
3843 * freeing the memory of the connector state. This is useful for drivers that
3844 * subclass the connector state.
3845 */
3846void
fabd9106 3847__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
f5e7840b 3848{
d2307dea 3849 if (state->crtc)
ad093607 3850 drm_connector_put(state->connector);
21a01abb
ML
3851
3852 if (state->commit)
3853 drm_crtc_commit_put(state->commit);
f5e7840b
TR
3854}
3855EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
3856
d461701c
DV
3857/**
3858 * drm_atomic_helper_connector_destroy_state - default state destroy hook
3859 * @connector: drm connector
3860 * @state: connector state object to release
3861 *
3862 * Default connector state destroy hook for drivers which don't have their own
3863 * subclassed connector state structure.
3864 */
3865void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
3866 struct drm_connector_state *state)
3867{
fabd9106 3868 __drm_atomic_helper_connector_destroy_state(state);
d461701c
DV
3869 kfree(state);
3870}
3871EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
5488dc16
LL
3872
3873/**
3874 * drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table
3875 * @crtc: CRTC object
3876 * @red: red correction table
3877 * @green: green correction table
3878 * @blue: green correction table
5488dc16 3879 * @size: size of the tables
6d124ff8 3880 * @ctx: lock acquire context
5488dc16
LL
3881 *
3882 * Implements support for legacy gamma correction table for drivers
3883 * that support color management through the DEGAMMA_LUT/GAMMA_LUT
2e38178e
DV
3884 * properties. See drm_crtc_enable_color_mgmt() and the containing chapter for
3885 * how the atomic color management and gamma tables work.
5488dc16 3886 */
7ea77283
ML
3887int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
3888 u16 *red, u16 *green, u16 *blue,
6d124ff8
DV
3889 uint32_t size,
3890 struct drm_modeset_acquire_ctx *ctx)
5488dc16
LL
3891{
3892 struct drm_device *dev = crtc->dev;
5488dc16
LL
3893 struct drm_atomic_state *state;
3894 struct drm_crtc_state *crtc_state;
3895 struct drm_property_blob *blob = NULL;
3896 struct drm_color_lut *blob_data;
3897 int i, ret = 0;
e2b9dd30 3898 bool replaced;
5488dc16
LL
3899
3900 state = drm_atomic_state_alloc(crtc->dev);
3901 if (!state)
7ea77283 3902 return -ENOMEM;
5488dc16
LL
3903
3904 blob = drm_property_create_blob(dev,
3905 sizeof(struct drm_color_lut) * size,
3906 NULL);
562c5b4d
LL
3907 if (IS_ERR(blob)) {
3908 ret = PTR_ERR(blob);
c1f415c9 3909 blob = NULL;
5488dc16
LL
3910 goto fail;
3911 }
3912
3913 /* Prepare GAMMA_LUT with the legacy values. */
11b83e3f 3914 blob_data = blob->data;
5488dc16
LL
3915 for (i = 0; i < size; i++) {
3916 blob_data[i].red = red[i];
3917 blob_data[i].green = green[i];
3918 blob_data[i].blue = blue[i];
3919 }
3920
3a09f737 3921 state->acquire_ctx = ctx;
5488dc16
LL
3922 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3923 if (IS_ERR(crtc_state)) {
3924 ret = PTR_ERR(crtc_state);
3925 goto fail;
3926 }
3927
3928 /* Reset DEGAMMA_LUT and CTM properties. */
e2b9dd30
PR
3929 replaced = drm_property_replace_blob(&crtc_state->degamma_lut, NULL);
3930 replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL);
3931 replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob);
3932 crtc_state->color_mgmt_changed |= replaced;
5488dc16
LL
3933
3934 ret = drm_atomic_commit(state);
5488dc16 3935
3a09f737 3936fail:
0853695c 3937 drm_atomic_state_put(state);
6472e509 3938 drm_property_blob_put(blob);
7ea77283 3939 return ret;
5488dc16
LL
3940}
3941EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);
a4370c77
VS
3942
3943/**
3944 * __drm_atomic_helper_private_duplicate_state - copy atomic private state
3945 * @obj: CRTC object
3946 * @state: new private object state
3947 *
3948 * Copies atomic state from a private objects's current state and resets inferred values.
3949 * This is useful for drivers that subclass the private state.
3950 */
3951void __drm_atomic_helper_private_obj_duplicate_state(struct drm_private_obj *obj,
3952 struct drm_private_state *state)
3953{
3954 memcpy(state, obj->state, sizeof(*state));
3955}
3956EXPORT_SYMBOL(__drm_atomic_helper_private_obj_duplicate_state);