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