1 /*
2  * Copyright (C) 2014 Red Hat
3  * Copyright (C) 2014 Intel Corp.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  * Rob Clark <robdclark@gmail.com>
25  * Daniel Vetter <daniel.vetter@ffwll.ch>
26  */
27 
28 #include <drm/drmP.h>
29 #include <drm/drm_atomic.h>
30 #include <drm/drm_plane_helper.h>
31 #include <drm/drm_crtc_helper.h>
32 #include <drm/drm_atomic_helper.h>
33 #include <linux/fence.h>
34 
35 #include "drm_crtc_internal.h"
36 
37 /**
38  * DOC: overview
39  *
40  * This helper library provides implementations of check and commit functions on
41  * top of the CRTC modeset helper callbacks and the plane helper callbacks. It
42  * also provides convenience implementations for the atomic state handling
43  * callbacks for drivers which don't need to subclass the drm core structures to
44  * add their own additional internal state.
45  *
46  * This library also provides default implementations for the check callback in
47  * drm_atomic_helper_check() and for the commit callback with
48  * drm_atomic_helper_commit(). But the individual stages and callbacks are
49  * exposed to allow drivers to mix and match and e.g. use the plane helpers only
50  * together with a driver private modeset implementation.
51  *
52  * This library also provides implementations for all the legacy driver
53  * interfaces on top of the atomic interface. See drm_atomic_helper_set_config(),
54  * drm_atomic_helper_disable_plane(), drm_atomic_helper_disable_plane() and the
55  * various functions to implement set_property callbacks. New drivers must not
56  * implement these functions themselves but must use the provided helpers.
57  *
58  * The atomic helper uses the same function table structures as all other
59  * modesetting helpers. See the documentation for struct &drm_crtc_helper_funcs,
60  * struct &drm_encoder_helper_funcs and struct &drm_connector_helper_funcs. It
61  * also shares the struct &drm_plane_helper_funcs function table with the plane
62  * helpers.
63  */
64 static void
65 drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
66 				struct drm_plane_state *plane_state,
67 				struct drm_plane *plane)
68 {
69 	struct drm_crtc_state *crtc_state;
70 
71 	if (plane->state->crtc) {
72 		crtc_state = drm_atomic_get_existing_crtc_state(state,
73 								plane->state->crtc);
74 
75 		if (WARN_ON(!crtc_state))
76 			return;
77 
78 		crtc_state->planes_changed = true;
79 	}
80 
81 	if (plane_state->crtc) {
82 		crtc_state = drm_atomic_get_existing_crtc_state(state,
83 								plane_state->crtc);
84 
85 		if (WARN_ON(!crtc_state))
86 			return;
87 
88 		crtc_state->planes_changed = true;
89 	}
90 }
91 
92 static int handle_conflicting_encoders(struct drm_atomic_state *state,
93 				       bool disable_conflicting_encoders)
94 {
95 	struct drm_connector_state *conn_state;
96 	struct drm_connector *connector;
97 	struct drm_encoder *encoder;
98 	unsigned encoder_mask = 0;
99 	int i, ret;
100 
101 	/*
102 	 * First loop, find all newly assigned encoders from the connectors
103 	 * part of the state. If the same encoder is assigned to multiple
104 	 * connectors bail out.
105 	 */
106 	for_each_connector_in_state(state, connector, conn_state, i) {
107 		const struct drm_connector_helper_funcs *funcs = connector->helper_private;
108 		struct drm_encoder *new_encoder;
109 
110 		if (!conn_state->crtc)
111 			continue;
112 
113 		if (funcs->atomic_best_encoder)
114 			new_encoder = funcs->atomic_best_encoder(connector, conn_state);
115 		else if (funcs->best_encoder)
116 			new_encoder = funcs->best_encoder(connector);
117 		else
118 			new_encoder = drm_atomic_helper_best_encoder(connector);
119 
120 		if (new_encoder) {
121 			if (encoder_mask & (1 << drm_encoder_index(new_encoder))) {
122 				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] on [CONNECTOR:%d:%s] already assigned\n",
123 					new_encoder->base.id, new_encoder->name,
124 					connector->base.id, connector->name);
125 
126 				return -EINVAL;
127 			}
128 
129 			encoder_mask |= 1 << drm_encoder_index(new_encoder);
130 		}
131 	}
132 
133 	if (!encoder_mask)
134 		return 0;
135 
136 	/*
137 	 * Second loop, iterate over all connectors not part of the state.
138 	 *
139 	 * If a conflicting encoder is found and disable_conflicting_encoders
140 	 * is not set, an error is returned. Userspace can provide a solution
141 	 * through the atomic ioctl.
142 	 *
143 	 * If the flag is set conflicting connectors are removed from the crtc
144 	 * and the crtc is disabled if no encoder is left. This preserves
145 	 * compatibility with the legacy set_config behavior.
146 	 */
147 	drm_for_each_connector(connector, state->dev) {
148 		struct drm_crtc_state *crtc_state;
149 
150 		if (drm_atomic_get_existing_connector_state(state, connector))
151 			continue;
152 
153 		encoder = connector->state->best_encoder;
154 		if (!encoder || !(encoder_mask & (1 << drm_encoder_index(encoder))))
155 			continue;
156 
157 		if (!disable_conflicting_encoders) {
158 			DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s] by [CONNECTOR:%d:%s]\n",
159 					 encoder->base.id, encoder->name,
160 					 connector->state->crtc->base.id,
161 					 connector->state->crtc->name,
162 					 connector->base.id, connector->name);
163 			return -EINVAL;
164 		}
165 
166 		conn_state = drm_atomic_get_connector_state(state, connector);
167 		if (IS_ERR(conn_state))
168 			return PTR_ERR(conn_state);
169 
170 		DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
171 				 encoder->base.id, encoder->name,
172 				 conn_state->crtc->base.id, conn_state->crtc->name,
173 				 connector->base.id, connector->name);
174 
175 		crtc_state = drm_atomic_get_existing_crtc_state(state, conn_state->crtc);
176 
177 		ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
178 		if (ret)
179 			return ret;
180 
181 		if (!crtc_state->connector_mask) {
182 			ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
183 								NULL);
184 			if (ret < 0)
185 				return ret;
186 
187 			crtc_state->active = false;
188 		}
189 	}
190 
191 	return 0;
192 }
193 
194 static void
195 set_best_encoder(struct drm_atomic_state *state,
196 		 struct drm_connector_state *conn_state,
197 		 struct drm_encoder *encoder)
198 {
199 	struct drm_crtc_state *crtc_state;
200 	struct drm_crtc *crtc;
201 
202 	if (conn_state->best_encoder) {
203 		/* Unset the encoder_mask in the old crtc state. */
204 		crtc = conn_state->connector->state->crtc;
205 
206 		/* A NULL crtc is an error here because we should have
207 		 *  duplicated a NULL best_encoder when crtc was NULL.
208 		 * As an exception restoring duplicated atomic state
209 		 * during resume is allowed, so don't warn when
210 		 * best_encoder is equal to encoder we intend to set.
211 		 */
212 		WARN_ON(!crtc && encoder != conn_state->best_encoder);
213 		if (crtc) {
214 			crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
215 
216 			crtc_state->encoder_mask &=
217 				~(1 << drm_encoder_index(conn_state->best_encoder));
218 		}
219 	}
220 
221 	if (encoder) {
222 		crtc = conn_state->crtc;
223 		WARN_ON(!crtc);
224 		if (crtc) {
225 			crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
226 
227 			crtc_state->encoder_mask |=
228 				1 << drm_encoder_index(encoder);
229 		}
230 	}
231 
232 	conn_state->best_encoder = encoder;
233 }
234 
235 static void
236 steal_encoder(struct drm_atomic_state *state,
237 	      struct drm_encoder *encoder)
238 {
239 	struct drm_crtc_state *crtc_state;
240 	struct drm_connector *connector;
241 	struct drm_connector_state *connector_state;
242 	int i;
243 
244 	for_each_connector_in_state(state, connector, connector_state, i) {
245 		struct drm_crtc *encoder_crtc;
246 
247 		if (connector_state->best_encoder != encoder)
248 			continue;
249 
250 		encoder_crtc = connector->state->crtc;
251 
252 		DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], stealing it\n",
253 				 encoder->base.id, encoder->name,
254 				 encoder_crtc->base.id, encoder_crtc->name);
255 
256 		set_best_encoder(state, connector_state, NULL);
257 
258 		crtc_state = drm_atomic_get_existing_crtc_state(state, encoder_crtc);
259 		crtc_state->connectors_changed = true;
260 
261 		return;
262 	}
263 }
264 
265 static int
266 update_connector_routing(struct drm_atomic_state *state,
267 			 struct drm_connector *connector,
268 			 struct drm_connector_state *connector_state)
269 {
270 	const struct drm_connector_helper_funcs *funcs;
271 	struct drm_encoder *new_encoder;
272 	struct drm_crtc_state *crtc_state;
273 
274 	DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n",
275 			 connector->base.id,
276 			 connector->name);
277 
278 	if (connector->state->crtc != connector_state->crtc) {
279 		if (connector->state->crtc) {
280 			crtc_state = drm_atomic_get_existing_crtc_state(state, connector->state->crtc);
281 			crtc_state->connectors_changed = true;
282 		}
283 
284 		if (connector_state->crtc) {
285 			crtc_state = drm_atomic_get_existing_crtc_state(state, connector_state->crtc);
286 			crtc_state->connectors_changed = true;
287 		}
288 	}
289 
290 	if (!connector_state->crtc) {
291 		DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n",
292 				connector->base.id,
293 				connector->name);
294 
295 		set_best_encoder(state, connector_state, NULL);
296 
297 		return 0;
298 	}
299 
300 	funcs = connector->helper_private;
301 
302 	if (funcs->atomic_best_encoder)
303 		new_encoder = funcs->atomic_best_encoder(connector,
304 							 connector_state);
305 	else if (funcs->best_encoder)
306 		new_encoder = funcs->best_encoder(connector);
307 	else
308 		new_encoder = drm_atomic_helper_best_encoder(connector);
309 
310 	if (!new_encoder) {
311 		DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
312 				 connector->base.id,
313 				 connector->name);
314 		return -EINVAL;
315 	}
316 
317 	if (!drm_encoder_crtc_ok(new_encoder, connector_state->crtc)) {
318 		DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d]\n",
319 				 new_encoder->base.id,
320 				 new_encoder->name,
321 				 connector_state->crtc->base.id);
322 		return -EINVAL;
323 	}
324 
325 	if (new_encoder == connector_state->best_encoder) {
326 		set_best_encoder(state, connector_state, new_encoder);
327 
328 		DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d:%s]\n",
329 				 connector->base.id,
330 				 connector->name,
331 				 new_encoder->base.id,
332 				 new_encoder->name,
333 				 connector_state->crtc->base.id,
334 				 connector_state->crtc->name);
335 
336 		return 0;
337 	}
338 
339 	steal_encoder(state, new_encoder);
340 
341 	set_best_encoder(state, connector_state, new_encoder);
342 
343 	crtc_state = drm_atomic_get_existing_crtc_state(state, connector_state->crtc);
344 	crtc_state->connectors_changed = true;
345 
346 	DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
347 			 connector->base.id,
348 			 connector->name,
349 			 new_encoder->base.id,
350 			 new_encoder->name,
351 			 connector_state->crtc->base.id,
352 			 connector_state->crtc->name);
353 
354 	return 0;
355 }
356 
357 static int
358 mode_fixup(struct drm_atomic_state *state)
359 {
360 	struct drm_crtc *crtc;
361 	struct drm_crtc_state *crtc_state;
362 	struct drm_connector *connector;
363 	struct drm_connector_state *conn_state;
364 	int i;
365 	bool ret;
366 
367 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
368 		if (!crtc_state->mode_changed &&
369 		    !crtc_state->connectors_changed)
370 			continue;
371 
372 		drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode);
373 	}
374 
375 	for_each_connector_in_state(state, connector, conn_state, i) {
376 		const struct drm_encoder_helper_funcs *funcs;
377 		struct drm_encoder *encoder;
378 
379 		WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc);
380 
381 		if (!conn_state->crtc || !conn_state->best_encoder)
382 			continue;
383 
384 		crtc_state = drm_atomic_get_existing_crtc_state(state,
385 								conn_state->crtc);
386 
387 		/*
388 		 * Each encoder has at most one connector (since we always steal
389 		 * it away), so we won't call ->mode_fixup twice.
390 		 */
391 		encoder = conn_state->best_encoder;
392 		funcs = encoder->helper_private;
393 
394 		ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode,
395 				&crtc_state->adjusted_mode);
396 		if (!ret) {
397 			DRM_DEBUG_ATOMIC("Bridge fixup failed\n");
398 			return -EINVAL;
399 		}
400 
401 		if (funcs && funcs->atomic_check) {
402 			ret = funcs->atomic_check(encoder, crtc_state,
403 						  conn_state);
404 			if (ret) {
405 				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n",
406 						 encoder->base.id, encoder->name);
407 				return ret;
408 			}
409 		} else if (funcs && funcs->mode_fixup) {
410 			ret = funcs->mode_fixup(encoder, &crtc_state->mode,
411 						&crtc_state->adjusted_mode);
412 			if (!ret) {
413 				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n",
414 						 encoder->base.id, encoder->name);
415 				return -EINVAL;
416 			}
417 		}
418 	}
419 
420 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
421 		const struct drm_crtc_helper_funcs *funcs;
422 
423 		if (!crtc_state->enable)
424 			continue;
425 
426 		if (!crtc_state->mode_changed &&
427 		    !crtc_state->connectors_changed)
428 			continue;
429 
430 		funcs = crtc->helper_private;
431 		if (!funcs->mode_fixup)
432 			continue;
433 
434 		ret = funcs->mode_fixup(crtc, &crtc_state->mode,
435 					&crtc_state->adjusted_mode);
436 		if (!ret) {
437 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] fixup failed\n",
438 					 crtc->base.id, crtc->name);
439 			return -EINVAL;
440 		}
441 	}
442 
443 	return 0;
444 }
445 
446 /**
447  * drm_atomic_helper_check_modeset - validate state object for modeset changes
448  * @dev: DRM device
449  * @state: the driver state object
450  *
451  * Check the state object to see if the requested state is physically possible.
452  * This does all the crtc and connector related computations for an atomic
453  * update and adds any additional connectors needed for full modesets and calls
454  * down into ->mode_fixup functions of the driver backend.
455  *
456  * crtc_state->mode_changed is set when the input mode is changed.
457  * crtc_state->connectors_changed is set when a connector is added or
458  * removed from the crtc.
459  * crtc_state->active_changed is set when crtc_state->active changes,
460  * which is used for dpms.
461  *
462  * IMPORTANT:
463  *
464  * Drivers which update ->mode_changed (e.g. in their ->atomic_check hooks if a
465  * plane update can't be done without a full modeset) _must_ call this function
466  * afterwards after that change. It is permitted to call this function multiple
467  * times for the same update, e.g. when the ->atomic_check functions depend upon
468  * the adjusted dotclock for fifo space allocation and watermark computation.
469  *
470  * RETURNS:
471  * Zero for success or -errno
472  */
473 int
474 drm_atomic_helper_check_modeset(struct drm_device *dev,
475 				struct drm_atomic_state *state)
476 {
477 	struct drm_crtc *crtc;
478 	struct drm_crtc_state *crtc_state;
479 	struct drm_connector *connector;
480 	struct drm_connector_state *connector_state;
481 	int i, ret;
482 
483 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
484 		if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) {
485 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
486 					 crtc->base.id, crtc->name);
487 			crtc_state->mode_changed = true;
488 		}
489 
490 		if (crtc->state->enable != crtc_state->enable) {
491 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enable changed\n",
492 					 crtc->base.id, crtc->name);
493 
494 			/*
495 			 * For clarity this assignment is done here, but
496 			 * enable == 0 is only true when there are no
497 			 * connectors and a NULL mode.
498 			 *
499 			 * The other way around is true as well. enable != 0
500 			 * iff connectors are attached and a mode is set.
501 			 */
502 			crtc_state->mode_changed = true;
503 			crtc_state->connectors_changed = true;
504 		}
505 	}
506 
507 	ret = handle_conflicting_encoders(state, state->legacy_set_config);
508 	if (ret)
509 		return ret;
510 
511 	for_each_connector_in_state(state, connector, connector_state, i) {
512 		/*
513 		 * This only sets crtc->mode_changed for routing changes,
514 		 * drivers must set crtc->mode_changed themselves when connector
515 		 * properties need to be updated.
516 		 */
517 		ret = update_connector_routing(state, connector,
518 					       connector_state);
519 		if (ret)
520 			return ret;
521 	}
522 
523 	/*
524 	 * After all the routing has been prepared we need to add in any
525 	 * connector which is itself unchanged, but who's crtc changes it's
526 	 * configuration. This must be done before calling mode_fixup in case a
527 	 * crtc only changed its mode but has the same set of connectors.
528 	 */
529 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
530 		bool has_connectors =
531 			!!crtc_state->connector_mask;
532 
533 		/*
534 		 * We must set ->active_changed after walking connectors for
535 		 * otherwise an update that only changes active would result in
536 		 * a full modeset because update_connector_routing force that.
537 		 */
538 		if (crtc->state->active != crtc_state->active) {
539 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active changed\n",
540 					 crtc->base.id, crtc->name);
541 			crtc_state->active_changed = true;
542 		}
543 
544 		if (!drm_atomic_crtc_needs_modeset(crtc_state))
545 			continue;
546 
547 		DRM_DEBUG_ATOMIC("[CRTC:%d:%s] needs all connectors, enable: %c, active: %c\n",
548 				 crtc->base.id, crtc->name,
549 				 crtc_state->enable ? 'y' : 'n',
550 				 crtc_state->active ? 'y' : 'n');
551 
552 		ret = drm_atomic_add_affected_connectors(state, crtc);
553 		if (ret != 0)
554 			return ret;
555 
556 		ret = drm_atomic_add_affected_planes(state, crtc);
557 		if (ret != 0)
558 			return ret;
559 
560 		if (crtc_state->enable != has_connectors) {
561 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled/connectors mismatch\n",
562 					 crtc->base.id, crtc->name);
563 
564 			return -EINVAL;
565 		}
566 	}
567 
568 	return mode_fixup(state);
569 }
570 EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
571 
572 /**
573  * drm_atomic_helper_check_planes - validate state object for planes changes
574  * @dev: DRM device
575  * @state: the driver state object
576  *
577  * Check the state object to see if the requested state is physically possible.
578  * This does all the plane update related checks using by calling into the
579  * ->atomic_check hooks provided by the driver.
580  *
581  * It also sets crtc_state->planes_changed to indicate that a crtc has
582  * updated planes.
583  *
584  * RETURNS:
585  * Zero for success or -errno
586  */
587 int
588 drm_atomic_helper_check_planes(struct drm_device *dev,
589 			       struct drm_atomic_state *state)
590 {
591 	struct drm_crtc *crtc;
592 	struct drm_crtc_state *crtc_state;
593 	struct drm_plane *plane;
594 	struct drm_plane_state *plane_state;
595 	int i, ret = 0;
596 
597 	ret = drm_atomic_helper_normalize_zpos(dev, state);
598 	if (ret)
599 		return ret;
600 
601 	for_each_plane_in_state(state, plane, plane_state, i) {
602 		const struct drm_plane_helper_funcs *funcs;
603 
604 		funcs = plane->helper_private;
605 
606 		drm_atomic_helper_plane_changed(state, plane_state, plane);
607 
608 		if (!funcs || !funcs->atomic_check)
609 			continue;
610 
611 		ret = funcs->atomic_check(plane, plane_state);
612 		if (ret) {
613 			DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
614 					 plane->base.id, plane->name);
615 			return ret;
616 		}
617 	}
618 
619 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
620 		const struct drm_crtc_helper_funcs *funcs;
621 
622 		funcs = crtc->helper_private;
623 
624 		if (!funcs || !funcs->atomic_check)
625 			continue;
626 
627 		ret = funcs->atomic_check(crtc, crtc_state);
628 		if (ret) {
629 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
630 					 crtc->base.id, crtc->name);
631 			return ret;
632 		}
633 	}
634 
635 	return ret;
636 }
637 EXPORT_SYMBOL(drm_atomic_helper_check_planes);
638 
639 /**
640  * drm_atomic_helper_check - validate state object
641  * @dev: DRM device
642  * @state: the driver state object
643  *
644  * Check the state object to see if the requested state is physically possible.
645  * Only crtcs and planes have check callbacks, so for any additional (global)
646  * checking that a driver needs it can simply wrap that around this function.
647  * Drivers without such needs can directly use this as their ->atomic_check()
648  * callback.
649  *
650  * This just wraps the two parts of the state checking for planes and modeset
651  * state in the default order: First it calls drm_atomic_helper_check_modeset()
652  * and then drm_atomic_helper_check_planes(). The assumption is that the
653  * ->atomic_check functions depend upon an updated adjusted_mode.clock to
654  * e.g. properly compute watermarks.
655  *
656  * RETURNS:
657  * Zero for success or -errno
658  */
659 int drm_atomic_helper_check(struct drm_device *dev,
660 			    struct drm_atomic_state *state)
661 {
662 	int ret;
663 
664 	ret = drm_atomic_helper_check_modeset(dev, state);
665 	if (ret)
666 		return ret;
667 
668 	ret = drm_atomic_helper_check_planes(dev, state);
669 	if (ret)
670 		return ret;
671 
672 	return ret;
673 }
674 EXPORT_SYMBOL(drm_atomic_helper_check);
675 
676 static void
677 disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
678 {
679 	struct drm_connector *connector;
680 	struct drm_connector_state *old_conn_state;
681 	struct drm_crtc *crtc;
682 	struct drm_crtc_state *old_crtc_state;
683 	int i;
684 
685 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
686 		const struct drm_encoder_helper_funcs *funcs;
687 		struct drm_encoder *encoder;
688 
689 		/* Shut down everything that's in the changeset and currently
690 		 * still on. So need to check the old, saved state. */
691 		if (!old_conn_state->crtc)
692 			continue;
693 
694 		old_crtc_state = drm_atomic_get_existing_crtc_state(old_state,
695 								    old_conn_state->crtc);
696 
697 		if (!old_crtc_state->active ||
698 		    !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
699 			continue;
700 
701 		encoder = old_conn_state->best_encoder;
702 
703 		/* We shouldn't get this far if we didn't previously have
704 		 * an encoder.. but WARN_ON() rather than explode.
705 		 */
706 		if (WARN_ON(!encoder))
707 			continue;
708 
709 		funcs = encoder->helper_private;
710 
711 		DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
712 				 encoder->base.id, encoder->name);
713 
714 		/*
715 		 * Each encoder has at most one connector (since we always steal
716 		 * it away), so we won't call disable hooks twice.
717 		 */
718 		drm_bridge_disable(encoder->bridge);
719 
720 		/* Right function depends upon target state. */
721 		if (funcs) {
722 			if (connector->state->crtc && funcs->prepare)
723 				funcs->prepare(encoder);
724 			else if (funcs->disable)
725 				funcs->disable(encoder);
726 			else if (funcs->dpms)
727 				funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
728 		}
729 
730 		drm_bridge_post_disable(encoder->bridge);
731 	}
732 
733 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
734 		const struct drm_crtc_helper_funcs *funcs;
735 
736 		/* Shut down everything that needs a full modeset. */
737 		if (!drm_atomic_crtc_needs_modeset(crtc->state))
738 			continue;
739 
740 		if (!old_crtc_state->active)
741 			continue;
742 
743 		funcs = crtc->helper_private;
744 
745 		DRM_DEBUG_ATOMIC("disabling [CRTC:%d:%s]\n",
746 				 crtc->base.id, crtc->name);
747 
748 
749 		/* Right function depends upon target state. */
750 		if (crtc->state->enable && funcs->prepare)
751 			funcs->prepare(crtc);
752 		else if (funcs->disable)
753 			funcs->disable(crtc);
754 		else
755 			funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
756 	}
757 }
758 
759 /**
760  * drm_atomic_helper_update_legacy_modeset_state - update legacy modeset state
761  * @dev: DRM device
762  * @old_state: atomic state object with old state structures
763  *
764  * This function updates all the various legacy modeset state pointers in
765  * connectors, encoders and crtcs. It also updates the timestamping constants
766  * used for precise vblank timestamps by calling
767  * drm_calc_timestamping_constants().
768  *
769  * Drivers can use this for building their own atomic commit if they don't have
770  * a pure helper-based modeset implementation.
771  */
772 void
773 drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
774 					      struct drm_atomic_state *old_state)
775 {
776 	struct drm_connector *connector;
777 	struct drm_connector_state *old_conn_state;
778 	struct drm_crtc *crtc;
779 	struct drm_crtc_state *old_crtc_state;
780 	int i;
781 
782 	/* clear out existing links and update dpms */
783 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
784 		if (connector->encoder) {
785 			WARN_ON(!connector->encoder->crtc);
786 
787 			connector->encoder->crtc = NULL;
788 			connector->encoder = NULL;
789 		}
790 
791 		crtc = connector->state->crtc;
792 		if ((!crtc && old_conn_state->crtc) ||
793 		    (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
794 			struct drm_property *dpms_prop =
795 				dev->mode_config.dpms_property;
796 			int mode = DRM_MODE_DPMS_OFF;
797 
798 			if (crtc && crtc->state->active)
799 				mode = DRM_MODE_DPMS_ON;
800 
801 			connector->dpms = mode;
802 			drm_object_property_set_value(&connector->base,
803 						      dpms_prop, mode);
804 		}
805 	}
806 
807 	/* set new links */
808 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
809 		if (!connector->state->crtc)
810 			continue;
811 
812 		if (WARN_ON(!connector->state->best_encoder))
813 			continue;
814 
815 		connector->encoder = connector->state->best_encoder;
816 		connector->encoder->crtc = connector->state->crtc;
817 	}
818 
819 	/* set legacy state in the crtc structure */
820 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
821 		struct drm_plane *primary = crtc->primary;
822 
823 		crtc->mode = crtc->state->mode;
824 		crtc->enabled = crtc->state->enable;
825 
826 		if (drm_atomic_get_existing_plane_state(old_state, primary) &&
827 		    primary->state->crtc == crtc) {
828 			crtc->x = primary->state->src_x >> 16;
829 			crtc->y = primary->state->src_y >> 16;
830 		}
831 
832 		if (crtc->state->enable)
833 			drm_calc_timestamping_constants(crtc,
834 							&crtc->state->adjusted_mode);
835 	}
836 }
837 EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state);
838 
839 static void
840 crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
841 {
842 	struct drm_crtc *crtc;
843 	struct drm_crtc_state *old_crtc_state;
844 	struct drm_connector *connector;
845 	struct drm_connector_state *old_conn_state;
846 	int i;
847 
848 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
849 		const struct drm_crtc_helper_funcs *funcs;
850 
851 		if (!crtc->state->mode_changed)
852 			continue;
853 
854 		funcs = crtc->helper_private;
855 
856 		if (crtc->state->enable && funcs->mode_set_nofb) {
857 			DRM_DEBUG_ATOMIC("modeset on [CRTC:%d:%s]\n",
858 					 crtc->base.id, crtc->name);
859 
860 			funcs->mode_set_nofb(crtc);
861 		}
862 	}
863 
864 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
865 		const struct drm_encoder_helper_funcs *funcs;
866 		struct drm_crtc_state *new_crtc_state;
867 		struct drm_encoder *encoder;
868 		struct drm_display_mode *mode, *adjusted_mode;
869 
870 		if (!connector->state->best_encoder)
871 			continue;
872 
873 		encoder = connector->state->best_encoder;
874 		funcs = encoder->helper_private;
875 		new_crtc_state = connector->state->crtc->state;
876 		mode = &new_crtc_state->mode;
877 		adjusted_mode = &new_crtc_state->adjusted_mode;
878 
879 		if (!new_crtc_state->mode_changed)
880 			continue;
881 
882 		DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
883 				 encoder->base.id, encoder->name);
884 
885 		/*
886 		 * Each encoder has at most one connector (since we always steal
887 		 * it away), so we won't call mode_set hooks twice.
888 		 */
889 		if (funcs && funcs->mode_set)
890 			funcs->mode_set(encoder, mode, adjusted_mode);
891 
892 		drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
893 	}
894 }
895 
896 /**
897  * drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs
898  * @dev: DRM device
899  * @old_state: atomic state object with old state structures
900  *
901  * This function shuts down all the outputs that need to be shut down and
902  * prepares them (if required) with the new mode.
903  *
904  * For compatibility with legacy crtc helpers this should be called before
905  * drm_atomic_helper_commit_planes(), which is what the default commit function
906  * does. But drivers with different needs can group the modeset commits together
907  * and do the plane commits at the end. This is useful for drivers doing runtime
908  * PM since planes updates then only happen when the CRTC is actually enabled.
909  */
910 void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
911 					       struct drm_atomic_state *old_state)
912 {
913 	disable_outputs(dev, old_state);
914 
915 	drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
916 
917 	crtc_set_mode(dev, old_state);
918 }
919 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
920 
921 /**
922  * drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs
923  * @dev: DRM device
924  * @old_state: atomic state object with old state structures
925  *
926  * This function enables all the outputs with the new configuration which had to
927  * be turned off for the update.
928  *
929  * For compatibility with legacy crtc helpers this should be called after
930  * drm_atomic_helper_commit_planes(), which is what the default commit function
931  * does. But drivers with different needs can group the modeset commits together
932  * and do the plane commits at the end. This is useful for drivers doing runtime
933  * PM since planes updates then only happen when the CRTC is actually enabled.
934  */
935 void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
936 					      struct drm_atomic_state *old_state)
937 {
938 	struct drm_crtc *crtc;
939 	struct drm_crtc_state *old_crtc_state;
940 	struct drm_connector *connector;
941 	struct drm_connector_state *old_conn_state;
942 	int i;
943 
944 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
945 		const struct drm_crtc_helper_funcs *funcs;
946 
947 		/* Need to filter out CRTCs where only planes change. */
948 		if (!drm_atomic_crtc_needs_modeset(crtc->state))
949 			continue;
950 
951 		if (!crtc->state->active)
952 			continue;
953 
954 		funcs = crtc->helper_private;
955 
956 		if (crtc->state->enable) {
957 			DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
958 					 crtc->base.id, crtc->name);
959 
960 			if (funcs->enable)
961 				funcs->enable(crtc);
962 			else
963 				funcs->commit(crtc);
964 		}
965 	}
966 
967 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
968 		const struct drm_encoder_helper_funcs *funcs;
969 		struct drm_encoder *encoder;
970 
971 		if (!connector->state->best_encoder)
972 			continue;
973 
974 		if (!connector->state->crtc->state->active ||
975 		    !drm_atomic_crtc_needs_modeset(connector->state->crtc->state))
976 			continue;
977 
978 		encoder = connector->state->best_encoder;
979 		funcs = encoder->helper_private;
980 
981 		DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
982 				 encoder->base.id, encoder->name);
983 
984 		/*
985 		 * Each encoder has at most one connector (since we always steal
986 		 * it away), so we won't call enable hooks twice.
987 		 */
988 		drm_bridge_pre_enable(encoder->bridge);
989 
990 		if (funcs) {
991 			if (funcs->enable)
992 				funcs->enable(encoder);
993 			else if (funcs->commit)
994 				funcs->commit(encoder);
995 		}
996 
997 		drm_bridge_enable(encoder->bridge);
998 	}
999 }
1000 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
1001 
1002 /**
1003  * drm_atomic_helper_wait_for_fences - wait for fences stashed in plane state
1004  * @dev: DRM device
1005  * @state: atomic state object with old state structures
1006  *
1007  * For implicit sync, driver should fish the exclusive fence out from the
1008  * incoming fb's and stash it in the drm_plane_state.  This is called after
1009  * drm_atomic_helper_swap_state() so it uses the current plane state (and
1010  * just uses the atomic state to find the changed planes)
1011  */
1012 void drm_atomic_helper_wait_for_fences(struct drm_device *dev,
1013 			    struct drm_atomic_state *state)
1014 {
1015 	struct drm_plane *plane;
1016 	struct drm_plane_state *plane_state;
1017 	int i;
1018 
1019 	for_each_plane_in_state(state, plane, plane_state, i) {
1020 		if (!plane->state->fence)
1021 			continue;
1022 
1023 		WARN_ON(!plane->state->fb);
1024 
1025 		fence_wait(plane->state->fence, false);
1026 		fence_put(plane->state->fence);
1027 		plane->state->fence = NULL;
1028 	}
1029 }
1030 EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
1031 
1032 /**
1033  * drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
1034  * @dev: DRM device
1035  * @old_state: atomic state object with old state structures
1036  * @crtc: DRM crtc
1037  *
1038  * Checks whether the framebuffer used for this CRTC changes as a result of
1039  * the atomic update.  This is useful for drivers which cannot use
1040  * drm_atomic_helper_wait_for_vblanks() and need to reimplement its
1041  * functionality.
1042  *
1043  * Returns:
1044  * true if the framebuffer changed.
1045  */
1046 bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
1047 					   struct drm_atomic_state *old_state,
1048 					   struct drm_crtc *crtc)
1049 {
1050 	struct drm_plane *plane;
1051 	struct drm_plane_state *old_plane_state;
1052 	int i;
1053 
1054 	for_each_plane_in_state(old_state, plane, old_plane_state, i) {
1055 		if (plane->state->crtc != crtc &&
1056 		    old_plane_state->crtc != crtc)
1057 			continue;
1058 
1059 		if (plane->state->fb != old_plane_state->fb)
1060 			return true;
1061 	}
1062 
1063 	return false;
1064 }
1065 EXPORT_SYMBOL(drm_atomic_helper_framebuffer_changed);
1066 
1067 /**
1068  * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
1069  * @dev: DRM device
1070  * @old_state: atomic state object with old state structures
1071  *
1072  * Helper to, after atomic commit, wait for vblanks on all effected
1073  * crtcs (ie. before cleaning up old framebuffers using
1074  * drm_atomic_helper_cleanup_planes()). It will only wait on crtcs where the
1075  * framebuffers have actually changed to optimize for the legacy cursor and
1076  * plane update use-case.
1077  */
1078 void
1079 drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
1080 		struct drm_atomic_state *old_state)
1081 {
1082 	struct drm_crtc *crtc;
1083 	struct drm_crtc_state *old_crtc_state;
1084 	int i, ret;
1085 
1086 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1087 		/* No one cares about the old state, so abuse it for tracking
1088 		 * and store whether we hold a vblank reference (and should do a
1089 		 * vblank wait) in the ->enable boolean. */
1090 		old_crtc_state->enable = false;
1091 
1092 		if (!crtc->state->enable)
1093 			continue;
1094 
1095 		/* Legacy cursor ioctls are completely unsynced, and userspace
1096 		 * relies on that (by doing tons of cursor updates). */
1097 		if (old_state->legacy_cursor_update)
1098 			continue;
1099 
1100 		if (!drm_atomic_helper_framebuffer_changed(dev,
1101 				old_state, crtc))
1102 			continue;
1103 
1104 		ret = drm_crtc_vblank_get(crtc);
1105 		if (ret != 0)
1106 			continue;
1107 
1108 		old_crtc_state->enable = true;
1109 		old_crtc_state->last_vblank_count = drm_crtc_vblank_count(crtc);
1110 	}
1111 
1112 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1113 		if (!old_crtc_state->enable)
1114 			continue;
1115 
1116 		ret = wait_event_timeout(dev->vblank[i].queue,
1117 				old_crtc_state->last_vblank_count !=
1118 					drm_crtc_vblank_count(crtc),
1119 				msecs_to_jiffies(50));
1120 
1121 		WARN(!ret, "[CRTC:%d] vblank wait timed out\n", crtc->base.id);
1122 
1123 		drm_crtc_vblank_put(crtc);
1124 	}
1125 }
1126 EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
1127 
1128 /**
1129  * drm_atomic_helper_commit_tail - commit atomic update to hardware
1130  * @state: new modeset state to be committed
1131  *
1132  * This is the default implemenation for the ->atomic_commit_tail() hook of the
1133  * &drm_mode_config_helper_funcs vtable.
1134  *
1135  * Note that the default ordering of how the various stages are called is to
1136  * match the legacy modeset helper library closest. One peculiarity of that is
1137  * that it doesn't mesh well with runtime PM at all.
1138  *
1139  * For drivers supporting runtime PM the recommended sequence is instead ::
1140  *
1141  *     drm_atomic_helper_commit_modeset_disables(dev, state);
1142  *
1143  *     drm_atomic_helper_commit_modeset_enables(dev, state);
1144  *
1145  *     drm_atomic_helper_commit_planes(dev, state, true);
1146  *
1147  * for committing the atomic update to hardware.  See the kerneldoc entries for
1148  * these three functions for more details.
1149  */
1150 void drm_atomic_helper_commit_tail(struct drm_atomic_state *state)
1151 {
1152 	struct drm_device *dev = state->dev;
1153 
1154 	drm_atomic_helper_commit_modeset_disables(dev, state);
1155 
1156 	drm_atomic_helper_commit_planes(dev, state, false);
1157 
1158 	drm_atomic_helper_commit_modeset_enables(dev, state);
1159 
1160 	drm_atomic_helper_commit_hw_done(state);
1161 
1162 	drm_atomic_helper_wait_for_vblanks(dev, state);
1163 
1164 	drm_atomic_helper_cleanup_planes(dev, state);
1165 }
1166 EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
1167 
1168 static void commit_tail(struct drm_atomic_state *state)
1169 {
1170 	struct drm_device *dev = state->dev;
1171 	struct drm_mode_config_helper_funcs *funcs;
1172 
1173 	funcs = dev->mode_config.helper_private;
1174 
1175 	drm_atomic_helper_wait_for_fences(dev, state);
1176 
1177 	drm_atomic_helper_wait_for_dependencies(state);
1178 
1179 	if (funcs && funcs->atomic_commit_tail)
1180 		funcs->atomic_commit_tail(state);
1181 	else
1182 		drm_atomic_helper_commit_tail(state);
1183 
1184 	drm_atomic_helper_commit_cleanup_done(state);
1185 
1186 	drm_atomic_state_free(state);
1187 }
1188 
1189 static void commit_work(struct work_struct *work)
1190 {
1191 	struct drm_atomic_state *state = container_of(work,
1192 						      struct drm_atomic_state,
1193 						      commit_work);
1194 	commit_tail(state);
1195 }
1196 
1197 /**
1198  * drm_atomic_helper_commit - commit validated state object
1199  * @dev: DRM device
1200  * @state: the driver state object
1201  * @nonblock: whether nonblocking behavior is requested.
1202  *
1203  * This function commits a with drm_atomic_helper_check() pre-validated state
1204  * object. This can still fail when e.g. the framebuffer reservation fails. This
1205  * function implements nonblocking commits, using
1206  * drm_atomic_helper_setup_commit() and related functions.
1207  *
1208  * Note that right now this function does not support nonblocking commits, hence
1209  * driver writers must implement their own version for now.
1210  *
1211  * Committing the actual hardware state is done through the
1212  * ->atomic_commit_tail() callback of the &drm_mode_config_helper_funcs vtable,
1213  * or it's default implementation drm_atomic_helper_commit_tail().
1214  *
1215  * RETURNS:
1216  * Zero for success or -errno.
1217  */
1218 int drm_atomic_helper_commit(struct drm_device *dev,
1219 			     struct drm_atomic_state *state,
1220 			     bool nonblock)
1221 {
1222 	int ret;
1223 
1224 	ret = drm_atomic_helper_setup_commit(state, nonblock);
1225 	if (ret)
1226 		return ret;
1227 
1228 	INIT_WORK(&state->commit_work, commit_work);
1229 
1230 	ret = drm_atomic_helper_prepare_planes(dev, state);
1231 	if (ret)
1232 		return ret;
1233 
1234 	/*
1235 	 * This is the point of no return - everything below never fails except
1236 	 * when the hw goes bonghits. Which means we can commit the new state on
1237 	 * the software side now.
1238 	 */
1239 
1240 	drm_atomic_helper_swap_state(state, true);
1241 
1242 	/*
1243 	 * Everything below can be run asynchronously without the need to grab
1244 	 * any modeset locks at all under one condition: It must be guaranteed
1245 	 * that the asynchronous work has either been cancelled (if the driver
1246 	 * supports it, which at least requires that the framebuffers get
1247 	 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
1248 	 * before the new state gets committed on the software side with
1249 	 * drm_atomic_helper_swap_state().
1250 	 *
1251 	 * This scheme allows new atomic state updates to be prepared and
1252 	 * checked in parallel to the asynchronous completion of the previous
1253 	 * update. Which is important since compositors need to figure out the
1254 	 * composition of the next frame right after having submitted the
1255 	 * current layout.
1256 	 *
1257 	 * NOTE: Commit work has multiple phases, first hardware commit, then
1258 	 * cleanup. We want them to overlap, hence need system_unbound_wq to
1259 	 * make sure work items don't artifically stall on each another.
1260 	 */
1261 
1262 	if (nonblock)
1263 		queue_work(system_unbound_wq, &state->commit_work);
1264 	else
1265 		commit_tail(state);
1266 
1267 	return 0;
1268 }
1269 EXPORT_SYMBOL(drm_atomic_helper_commit);
1270 
1271 /**
1272  * DOC: implementing nonblocking commit
1273  *
1274  * Nonblocking atomic commits have to be implemented in the following sequence:
1275  *
1276  * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function
1277  * which commit needs to call which can fail, so we want to run it first and
1278  * synchronously.
1279  *
1280  * 2. Synchronize with any outstanding nonblocking commit worker threads which
1281  * might be affected the new state update. This can be done by either cancelling
1282  * or flushing the work items, depending upon whether the driver can deal with
1283  * cancelled updates. Note that it is important to ensure that the framebuffer
1284  * cleanup is still done when cancelling.
1285  *
1286  * Asynchronous workers need to have sufficient parallelism to be able to run
1287  * different atomic commits on different CRTCs in parallel. The simplest way to
1288  * achive this is by running them on the &system_unbound_wq work queue. Note
1289  * that drivers are not required to split up atomic commits and run an
1290  * individual commit in parallel - userspace is supposed to do that if it cares.
1291  * But it might be beneficial to do that for modesets, since those necessarily
1292  * must be done as one global operation, and enabling or disabling a CRTC can
1293  * take a long time. But even that is not required.
1294  *
1295  * 3. The software state is updated synchronously with
1296  * drm_atomic_helper_swap_state(). Doing this under the protection of all modeset
1297  * locks means concurrent callers never see inconsistent state. And doing this
1298  * while it's guaranteed that no relevant nonblocking worker runs means that
1299  * nonblocking workers do not need grab any locks. Actually they must not grab
1300  * locks, for otherwise the work flushing will deadlock.
1301  *
1302  * 4. Schedule a work item to do all subsequent steps, using the split-out
1303  * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and
1304  * then cleaning up the framebuffers after the old framebuffer is no longer
1305  * being displayed.
1306  *
1307  * The above scheme is implemented in the atomic helper libraries in
1308  * drm_atomic_helper_commit() using a bunch of helper functions. See
1309  * drm_atomic_helper_setup_commit() for a starting point.
1310  */
1311 
1312 static int stall_checks(struct drm_crtc *crtc, bool nonblock)
1313 {
1314 	struct drm_crtc_commit *commit, *stall_commit = NULL;
1315 	bool completed = true;
1316 	int i;
1317 	long ret = 0;
1318 
1319 	spin_lock(&crtc->commit_lock);
1320 	i = 0;
1321 	list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
1322 		if (i == 0) {
1323 			completed = try_wait_for_completion(&commit->flip_done);
1324 			/* Userspace is not allowed to get ahead of the previous
1325 			 * commit with nonblocking ones. */
1326 			if (!completed && nonblock) {
1327 				spin_unlock(&crtc->commit_lock);
1328 				return -EBUSY;
1329 			}
1330 		} else if (i == 1) {
1331 			stall_commit = commit;
1332 			drm_crtc_commit_get(stall_commit);
1333 			break;
1334 		}
1335 
1336 		i++;
1337 	}
1338 	spin_unlock(&crtc->commit_lock);
1339 
1340 	if (!stall_commit)
1341 		return 0;
1342 
1343 	/* We don't want to let commits get ahead of cleanup work too much,
1344 	 * stalling on 2nd previous commit means triple-buffer won't ever stall.
1345 	 */
1346 	ret = wait_for_completion_interruptible_timeout(&stall_commit->cleanup_done,
1347 							10*HZ);
1348 	if (ret == 0)
1349 		DRM_ERROR("[CRTC:%d:%s] cleanup_done timed out\n",
1350 			  crtc->base.id, crtc->name);
1351 
1352 	drm_crtc_commit_put(stall_commit);
1353 
1354 	return ret < 0 ? ret : 0;
1355 }
1356 
1357 /**
1358  * drm_atomic_helper_setup_commit - setup possibly nonblocking commit
1359  * @state: new modeset state to be committed
1360  * @nonblock: whether nonblocking behavior is requested.
1361  *
1362  * This function prepares @state to be used by the atomic helper's support for
1363  * nonblocking commits. Drivers using the nonblocking commit infrastructure
1364  * should always call this function from their ->atomic_commit hook.
1365  *
1366  * To be able to use this support drivers need to use a few more helper
1367  * functions. drm_atomic_helper_wait_for_dependencies() must be called before
1368  * actually committing the hardware state, and for nonblocking commits this call
1369  * must be placed in the async worker. See also drm_atomic_helper_swap_state()
1370  * and it's stall parameter, for when a driver's commit hooks look at the
1371  * ->state pointers of struct &drm_crtc, &drm_plane or &drm_connector directly.
1372  *
1373  * Completion of the hardware commit step must be signalled using
1374  * drm_atomic_helper_commit_hw_done(). After this step the driver is not allowed
1375  * to read or change any permanent software or hardware modeset state. The only
1376  * exception is state protected by other means than &drm_modeset_lock locks.
1377  * Only the free standing @state with pointers to the old state structures can
1378  * be inspected, e.g. to clean up old buffers using
1379  * drm_atomic_helper_cleanup_planes().
1380  *
1381  * At the very end, before cleaning up @state drivers must call
1382  * drm_atomic_helper_commit_cleanup_done().
1383  *
1384  * This is all implemented by in drm_atomic_helper_commit(), giving drivers a
1385  * complete and esay-to-use default implementation of the atomic_commit() hook.
1386  *
1387  * The tracking of asynchronously executed and still pending commits is done
1388  * using the core structure &drm_crtc_commit.
1389  *
1390  * By default there's no need to clean up resources allocated by this function
1391  * explicitly: drm_atomic_state_default_clear() will take care of that
1392  * automatically.
1393  *
1394  * Returns:
1395  *
1396  * 0 on success. -EBUSY when userspace schedules nonblocking commits too fast,
1397  * -ENOMEM on allocation failures and -EINTR when a signal is pending.
1398  */
1399 int drm_atomic_helper_setup_commit(struct drm_atomic_state *state,
1400 				   bool nonblock)
1401 {
1402 	struct drm_crtc *crtc;
1403 	struct drm_crtc_state *crtc_state;
1404 	struct drm_crtc_commit *commit;
1405 	int i, ret;
1406 
1407 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
1408 		commit = kzalloc(sizeof(*commit), GFP_KERNEL);
1409 		if (!commit)
1410 			return -ENOMEM;
1411 
1412 		init_completion(&commit->flip_done);
1413 		init_completion(&commit->hw_done);
1414 		init_completion(&commit->cleanup_done);
1415 		INIT_LIST_HEAD(&commit->commit_entry);
1416 		kref_init(&commit->ref);
1417 		commit->crtc = crtc;
1418 
1419 		state->crtcs[i].commit = commit;
1420 
1421 		ret = stall_checks(crtc, nonblock);
1422 		if (ret)
1423 			return ret;
1424 
1425 		/* Drivers only send out events when at least either current or
1426 		 * new CRTC state is active. Complete right away if everything
1427 		 * stays off. */
1428 		if (!crtc->state->active && !crtc_state->active) {
1429 			complete_all(&commit->flip_done);
1430 			continue;
1431 		}
1432 
1433 		/* Legacy cursor updates are fully unsynced. */
1434 		if (state->legacy_cursor_update) {
1435 			complete_all(&commit->flip_done);
1436 			continue;
1437 		}
1438 
1439 		if (!crtc_state->event) {
1440 			commit->event = kzalloc(sizeof(*commit->event),
1441 						GFP_KERNEL);
1442 			if (!commit->event)
1443 				return -ENOMEM;
1444 
1445 			crtc_state->event = commit->event;
1446 		}
1447 
1448 		crtc_state->event->base.completion = &commit->flip_done;
1449 	}
1450 
1451 	return 0;
1452 }
1453 EXPORT_SYMBOL(drm_atomic_helper_setup_commit);
1454 
1455 
1456 static struct drm_crtc_commit *preceeding_commit(struct drm_crtc *crtc)
1457 {
1458 	struct drm_crtc_commit *commit;
1459 	int i = 0;
1460 
1461 	list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
1462 		/* skip the first entry, that's the current commit */
1463 		if (i == 1)
1464 			return commit;
1465 		i++;
1466 	}
1467 
1468 	return NULL;
1469 }
1470 
1471 /**
1472  * drm_atomic_helper_wait_for_dependencies - wait for required preceeding commits
1473  * @state: new modeset state to be committed
1474  *
1475  * This function waits for all preceeding commits that touch the same CRTC as
1476  * @state to both be committed to the hardware (as signalled by
1477  * drm_atomic_helper_commit_hw_done) and executed by the hardware (as signalled
1478  * by calling drm_crtc_vblank_send_event on the event member of
1479  * &drm_crtc_state).
1480  *
1481  * This is part of the atomic helper support for nonblocking commits, see
1482  * drm_atomic_helper_setup_commit() for an overview.
1483  */
1484 void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *state)
1485 {
1486 	struct drm_crtc *crtc;
1487 	struct drm_crtc_state *crtc_state;
1488 	struct drm_crtc_commit *commit;
1489 	int i;
1490 	long ret;
1491 
1492 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
1493 		spin_lock(&crtc->commit_lock);
1494 		commit = preceeding_commit(crtc);
1495 		if (commit)
1496 			drm_crtc_commit_get(commit);
1497 		spin_unlock(&crtc->commit_lock);
1498 
1499 		if (!commit)
1500 			continue;
1501 
1502 		ret = wait_for_completion_timeout(&commit->hw_done,
1503 						  10*HZ);
1504 		if (ret == 0)
1505 			DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
1506 				  crtc->base.id, crtc->name);
1507 
1508 		/* Currently no support for overwriting flips, hence
1509 		 * stall for previous one to execute completely. */
1510 		ret = wait_for_completion_timeout(&commit->flip_done,
1511 						  10*HZ);
1512 		if (ret == 0)
1513 			DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1514 				  crtc->base.id, crtc->name);
1515 
1516 		drm_crtc_commit_put(commit);
1517 	}
1518 }
1519 EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
1520 
1521 /**
1522  * drm_atomic_helper_commit_hw_done - setup possible nonblocking commit
1523  * @state: new modeset state to be committed
1524  *
1525  * This function is used to signal completion of the hardware commit step. After
1526  * this step the driver is not allowed to read or change any permanent software
1527  * or hardware modeset state. The only exception is state protected by other
1528  * means than &drm_modeset_lock locks.
1529  *
1530  * Drivers should try to postpone any expensive or delayed cleanup work after
1531  * this function is called.
1532  *
1533  * This is part of the atomic helper support for nonblocking commits, see
1534  * drm_atomic_helper_setup_commit() for an overview.
1535  */
1536 void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *state)
1537 {
1538 	struct drm_crtc *crtc;
1539 	struct drm_crtc_state *crtc_state;
1540 	struct drm_crtc_commit *commit;
1541 	int i;
1542 
1543 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
1544 		commit = state->crtcs[i].commit;
1545 		if (!commit)
1546 			continue;
1547 
1548 		/* backend must have consumed any event by now */
1549 		WARN_ON(crtc->state->event);
1550 		spin_lock(&crtc->commit_lock);
1551 		complete_all(&commit->hw_done);
1552 		spin_unlock(&crtc->commit_lock);
1553 	}
1554 }
1555 EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
1556 
1557 /**
1558  * drm_atomic_helper_commit_cleanup_done - signal completion of commit
1559  * @state: new modeset state to be committed
1560  *
1561  * This signals completion of the atomic update @state, including any cleanup
1562  * work. If used, it must be called right before calling
1563  * drm_atomic_state_free().
1564  *
1565  * This is part of the atomic helper support for nonblocking commits, see
1566  * drm_atomic_helper_setup_commit() for an overview.
1567  */
1568 void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *state)
1569 {
1570 	struct drm_crtc *crtc;
1571 	struct drm_crtc_state *crtc_state;
1572 	struct drm_crtc_commit *commit;
1573 	int i;
1574 	long ret;
1575 
1576 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
1577 		commit = state->crtcs[i].commit;
1578 		if (WARN_ON(!commit))
1579 			continue;
1580 
1581 		spin_lock(&crtc->commit_lock);
1582 		complete_all(&commit->cleanup_done);
1583 		WARN_ON(!try_wait_for_completion(&commit->hw_done));
1584 
1585 		/* commit_list borrows our reference, need to remove before we
1586 		 * clean up our drm_atomic_state. But only after it actually
1587 		 * completed, otherwise subsequent commits won't stall properly. */
1588 		if (try_wait_for_completion(&commit->flip_done))
1589 			goto del_commit;
1590 
1591 		spin_unlock(&crtc->commit_lock);
1592 
1593 		/* We must wait for the vblank event to signal our completion
1594 		 * before releasing our reference, since the vblank work does
1595 		 * not hold a reference of its own. */
1596 		ret = wait_for_completion_timeout(&commit->flip_done,
1597 						  10*HZ);
1598 		if (ret == 0)
1599 			DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1600 				  crtc->base.id, crtc->name);
1601 
1602 		spin_lock(&crtc->commit_lock);
1603 del_commit:
1604 		list_del(&commit->commit_entry);
1605 		spin_unlock(&crtc->commit_lock);
1606 	}
1607 }
1608 EXPORT_SYMBOL(drm_atomic_helper_commit_cleanup_done);
1609 
1610 /**
1611  * drm_atomic_helper_prepare_planes - prepare plane resources before commit
1612  * @dev: DRM device
1613  * @state: atomic state object with new state structures
1614  *
1615  * This function prepares plane state, specifically framebuffers, for the new
1616  * configuration. If any failure is encountered this function will call
1617  * ->cleanup_fb on any already successfully prepared framebuffer.
1618  *
1619  * Returns:
1620  * 0 on success, negative error code on failure.
1621  */
1622 int drm_atomic_helper_prepare_planes(struct drm_device *dev,
1623 				     struct drm_atomic_state *state)
1624 {
1625 	struct drm_plane *plane;
1626 	struct drm_plane_state *plane_state;
1627 	int ret, i, j;
1628 
1629 	for_each_plane_in_state(state, plane, plane_state, i) {
1630 		const struct drm_plane_helper_funcs *funcs;
1631 
1632 		funcs = plane->helper_private;
1633 
1634 		if (funcs->prepare_fb) {
1635 			ret = funcs->prepare_fb(plane, plane_state);
1636 			if (ret)
1637 				goto fail;
1638 		}
1639 	}
1640 
1641 	return 0;
1642 
1643 fail:
1644 	for_each_plane_in_state(state, plane, plane_state, j) {
1645 		const struct drm_plane_helper_funcs *funcs;
1646 
1647 		if (j >= i)
1648 			continue;
1649 
1650 		funcs = plane->helper_private;
1651 
1652 		if (funcs->cleanup_fb)
1653 			funcs->cleanup_fb(plane, plane_state);
1654 
1655 	}
1656 
1657 	return ret;
1658 }
1659 EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
1660 
1661 bool plane_crtc_active(struct drm_plane_state *state)
1662 {
1663 	return state->crtc && state->crtc->state->active;
1664 }
1665 
1666 /**
1667  * drm_atomic_helper_commit_planes - commit plane state
1668  * @dev: DRM device
1669  * @old_state: atomic state object with old state structures
1670  * @active_only: Only commit on active CRTC if set
1671  *
1672  * This function commits the new plane state using the plane and atomic helper
1673  * functions for planes and crtcs. It assumes that the atomic state has already
1674  * been pushed into the relevant object state pointers, since this step can no
1675  * longer fail.
1676  *
1677  * It still requires the global state object @old_state to know which planes and
1678  * crtcs need to be updated though.
1679  *
1680  * Note that this function does all plane updates across all CRTCs in one step.
1681  * If the hardware can't support this approach look at
1682  * drm_atomic_helper_commit_planes_on_crtc() instead.
1683  *
1684  * Plane parameters can be updated by applications while the associated CRTC is
1685  * disabled. The DRM/KMS core will store the parameters in the plane state,
1686  * which will be available to the driver when the CRTC is turned on. As a result
1687  * most drivers don't need to be immediately notified of plane updates for a
1688  * disabled CRTC.
1689  *
1690  * Unless otherwise needed, drivers are advised to set the @active_only
1691  * parameters to true in order not to receive plane update notifications related
1692  * to a disabled CRTC. This avoids the need to manually ignore plane updates in
1693  * driver code when the driver and/or hardware can't or just don't need to deal
1694  * with updates on disabled CRTCs, for example when supporting runtime PM.
1695  *
1696  * The drm_atomic_helper_commit() default implementation only sets @active_only
1697  * to false to most closely match the behaviour of the legacy helpers. This should
1698  * not be copied blindly by drivers.
1699  */
1700 void drm_atomic_helper_commit_planes(struct drm_device *dev,
1701 				     struct drm_atomic_state *old_state,
1702 				     bool active_only)
1703 {
1704 	struct drm_crtc *crtc;
1705 	struct drm_crtc_state *old_crtc_state;
1706 	struct drm_plane *plane;
1707 	struct drm_plane_state *old_plane_state;
1708 	int i;
1709 
1710 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1711 		const struct drm_crtc_helper_funcs *funcs;
1712 
1713 		funcs = crtc->helper_private;
1714 
1715 		if (!funcs || !funcs->atomic_begin)
1716 			continue;
1717 
1718 		if (active_only && !crtc->state->active)
1719 			continue;
1720 
1721 		funcs->atomic_begin(crtc, old_crtc_state);
1722 	}
1723 
1724 	for_each_plane_in_state(old_state, plane, old_plane_state, i) {
1725 		const struct drm_plane_helper_funcs *funcs;
1726 		bool disabling;
1727 
1728 		funcs = plane->helper_private;
1729 
1730 		if (!funcs)
1731 			continue;
1732 
1733 		disabling = drm_atomic_plane_disabling(plane, old_plane_state);
1734 
1735 		if (active_only) {
1736 			/*
1737 			 * Skip planes related to inactive CRTCs. If the plane
1738 			 * is enabled use the state of the current CRTC. If the
1739 			 * plane is being disabled use the state of the old
1740 			 * CRTC to avoid skipping planes being disabled on an
1741 			 * active CRTC.
1742 			 */
1743 			if (!disabling && !plane_crtc_active(plane->state))
1744 				continue;
1745 			if (disabling && !plane_crtc_active(old_plane_state))
1746 				continue;
1747 		}
1748 
1749 		/*
1750 		 * Special-case disabling the plane if drivers support it.
1751 		 */
1752 		if (disabling && funcs->atomic_disable)
1753 			funcs->atomic_disable(plane, old_plane_state);
1754 		else if (plane->state->crtc || disabling)
1755 			funcs->atomic_update(plane, old_plane_state);
1756 	}
1757 
1758 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1759 		const struct drm_crtc_helper_funcs *funcs;
1760 
1761 		funcs = crtc->helper_private;
1762 
1763 		if (!funcs || !funcs->atomic_flush)
1764 			continue;
1765 
1766 		if (active_only && !crtc->state->active)
1767 			continue;
1768 
1769 		funcs->atomic_flush(crtc, old_crtc_state);
1770 	}
1771 }
1772 EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
1773 
1774 /**
1775  * drm_atomic_helper_commit_planes_on_crtc - commit plane state for a crtc
1776  * @old_crtc_state: atomic state object with the old crtc state
1777  *
1778  * This function commits the new plane state using the plane and atomic helper
1779  * functions for planes on the specific crtc. It assumes that the atomic state
1780  * has already been pushed into the relevant object state pointers, since this
1781  * step can no longer fail.
1782  *
1783  * This function is useful when plane updates should be done crtc-by-crtc
1784  * instead of one global step like drm_atomic_helper_commit_planes() does.
1785  *
1786  * This function can only be savely used when planes are not allowed to move
1787  * between different CRTCs because this function doesn't handle inter-CRTC
1788  * depencies. Callers need to ensure that either no such depencies exist,
1789  * resolve them through ordering of commit calls or through some other means.
1790  */
1791 void
1792 drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
1793 {
1794 	const struct drm_crtc_helper_funcs *crtc_funcs;
1795 	struct drm_crtc *crtc = old_crtc_state->crtc;
1796 	struct drm_atomic_state *old_state = old_crtc_state->state;
1797 	struct drm_plane *plane;
1798 	unsigned plane_mask;
1799 
1800 	plane_mask = old_crtc_state->plane_mask;
1801 	plane_mask |= crtc->state->plane_mask;
1802 
1803 	crtc_funcs = crtc->helper_private;
1804 	if (crtc_funcs && crtc_funcs->atomic_begin)
1805 		crtc_funcs->atomic_begin(crtc, old_crtc_state);
1806 
1807 	drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
1808 		struct drm_plane_state *old_plane_state =
1809 			drm_atomic_get_existing_plane_state(old_state, plane);
1810 		const struct drm_plane_helper_funcs *plane_funcs;
1811 
1812 		plane_funcs = plane->helper_private;
1813 
1814 		if (!old_plane_state || !plane_funcs)
1815 			continue;
1816 
1817 		WARN_ON(plane->state->crtc && plane->state->crtc != crtc);
1818 
1819 		if (drm_atomic_plane_disabling(plane, old_plane_state) &&
1820 		    plane_funcs->atomic_disable)
1821 			plane_funcs->atomic_disable(plane, old_plane_state);
1822 		else if (plane->state->crtc ||
1823 			 drm_atomic_plane_disabling(plane, old_plane_state))
1824 			plane_funcs->atomic_update(plane, old_plane_state);
1825 	}
1826 
1827 	if (crtc_funcs && crtc_funcs->atomic_flush)
1828 		crtc_funcs->atomic_flush(crtc, old_crtc_state);
1829 }
1830 EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
1831 
1832 /**
1833  * drm_atomic_helper_disable_planes_on_crtc - helper to disable CRTC's planes
1834  * @crtc: CRTC
1835  * @atomic: if set, synchronize with CRTC's atomic_begin/flush hooks
1836  *
1837  * Disables all planes associated with the given CRTC. This can be
1838  * used for instance in the CRTC helper disable callback to disable
1839  * all planes before shutting down the display pipeline.
1840  *
1841  * If the atomic-parameter is set the function calls the CRTC's
1842  * atomic_begin hook before and atomic_flush hook after disabling the
1843  * planes.
1844  *
1845  * It is a bug to call this function without having implemented the
1846  * ->atomic_disable() plane hook.
1847  */
1848 void drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc *crtc,
1849 					      bool atomic)
1850 {
1851 	const struct drm_crtc_helper_funcs *crtc_funcs =
1852 		crtc->helper_private;
1853 	struct drm_plane *plane;
1854 
1855 	if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
1856 		crtc_funcs->atomic_begin(crtc, NULL);
1857 
1858 	drm_for_each_plane(plane, crtc->dev) {
1859 		const struct drm_plane_helper_funcs *plane_funcs =
1860 			plane->helper_private;
1861 
1862 		if (plane->state->crtc != crtc || !plane_funcs)
1863 			continue;
1864 
1865 		WARN_ON(!plane_funcs->atomic_disable);
1866 		if (plane_funcs->atomic_disable)
1867 			plane_funcs->atomic_disable(plane, NULL);
1868 	}
1869 
1870 	if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
1871 		crtc_funcs->atomic_flush(crtc, NULL);
1872 }
1873 EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
1874 
1875 /**
1876  * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
1877  * @dev: DRM device
1878  * @old_state: atomic state object with old state structures
1879  *
1880  * This function cleans up plane state, specifically framebuffers, from the old
1881  * configuration. Hence the old configuration must be perserved in @old_state to
1882  * be able to call this function.
1883  *
1884  * This function must also be called on the new state when the atomic update
1885  * fails at any point after calling drm_atomic_helper_prepare_planes().
1886  */
1887 void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
1888 				      struct drm_atomic_state *old_state)
1889 {
1890 	struct drm_plane *plane;
1891 	struct drm_plane_state *plane_state;
1892 	int i;
1893 
1894 	for_each_plane_in_state(old_state, plane, plane_state, i) {
1895 		const struct drm_plane_helper_funcs *funcs;
1896 
1897 		funcs = plane->helper_private;
1898 
1899 		if (funcs->cleanup_fb)
1900 			funcs->cleanup_fb(plane, plane_state);
1901 	}
1902 }
1903 EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
1904 
1905 /**
1906  * drm_atomic_helper_swap_state - store atomic state into current sw state
1907  * @state: atomic state
1908  * @stall: stall for proceeding commits
1909  *
1910  * This function stores the atomic state into the current state pointers in all
1911  * driver objects. It should be called after all failing steps have been done
1912  * and succeeded, but before the actual hardware state is committed.
1913  *
1914  * For cleanup and error recovery the current state for all changed objects will
1915  * be swaped into @state.
1916  *
1917  * With that sequence it fits perfectly into the plane prepare/cleanup sequence:
1918  *
1919  * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state.
1920  *
1921  * 2. Do any other steps that might fail.
1922  *
1923  * 3. Put the staged state into the current state pointers with this function.
1924  *
1925  * 4. Actually commit the hardware state.
1926  *
1927  * 5. Call drm_atomic_helper_cleanup_planes() with @state, which since step 3
1928  * contains the old state. Also do any other cleanup required with that state.
1929  *
1930  * @stall must be set when nonblocking commits for this driver directly access
1931  * the ->state pointer of &drm_plane, &drm_crtc or &drm_connector. With the
1932  * current atomic helpers this is almost always the case, since the helpers
1933  * don't pass the right state structures to the callbacks.
1934  */
1935 void drm_atomic_helper_swap_state(struct drm_atomic_state *state,
1936 				  bool stall)
1937 {
1938 	int i;
1939 	long ret;
1940 	struct drm_connector *connector;
1941 	struct drm_connector_state *conn_state;
1942 	struct drm_crtc *crtc;
1943 	struct drm_crtc_state *crtc_state;
1944 	struct drm_plane *plane;
1945 	struct drm_plane_state *plane_state;
1946 	struct drm_crtc_commit *commit;
1947 
1948 	if (stall) {
1949 		for_each_crtc_in_state(state, crtc, crtc_state, i) {
1950 			spin_lock(&crtc->commit_lock);
1951 			commit = list_first_entry_or_null(&crtc->commit_list,
1952 					struct drm_crtc_commit, commit_entry);
1953 			if (commit)
1954 				drm_crtc_commit_get(commit);
1955 			spin_unlock(&crtc->commit_lock);
1956 
1957 			if (!commit)
1958 				continue;
1959 
1960 			ret = wait_for_completion_timeout(&commit->hw_done,
1961 							  10*HZ);
1962 			if (ret == 0)
1963 				DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
1964 					  crtc->base.id, crtc->name);
1965 			drm_crtc_commit_put(commit);
1966 		}
1967 	}
1968 
1969 	for_each_connector_in_state(state, connector, conn_state, i) {
1970 		connector->state->state = state;
1971 		swap(state->connectors[i].state, connector->state);
1972 		connector->state->state = NULL;
1973 	}
1974 
1975 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
1976 		crtc->state->state = state;
1977 		swap(state->crtcs[i].state, crtc->state);
1978 		crtc->state->state = NULL;
1979 
1980 		if (state->crtcs[i].commit) {
1981 			spin_lock(&crtc->commit_lock);
1982 			list_add(&state->crtcs[i].commit->commit_entry,
1983 				 &crtc->commit_list);
1984 			spin_unlock(&crtc->commit_lock);
1985 
1986 			state->crtcs[i].commit->event = NULL;
1987 		}
1988 	}
1989 
1990 	for_each_plane_in_state(state, plane, plane_state, i) {
1991 		plane->state->state = state;
1992 		swap(state->planes[i].state, plane->state);
1993 		plane->state->state = NULL;
1994 	}
1995 }
1996 EXPORT_SYMBOL(drm_atomic_helper_swap_state);
1997 
1998 /**
1999  * drm_atomic_helper_update_plane - Helper for primary plane update using atomic
2000  * @plane: plane object to update
2001  * @crtc: owning CRTC of owning plane
2002  * @fb: framebuffer to flip onto plane
2003  * @crtc_x: x offset of primary plane on crtc
2004  * @crtc_y: y offset of primary plane on crtc
2005  * @crtc_w: width of primary plane rectangle on crtc
2006  * @crtc_h: height of primary plane rectangle on crtc
2007  * @src_x: x offset of @fb for panning
2008  * @src_y: y offset of @fb for panning
2009  * @src_w: width of source rectangle in @fb
2010  * @src_h: height of source rectangle in @fb
2011  *
2012  * Provides a default plane update handler using the atomic driver interface.
2013  *
2014  * RETURNS:
2015  * Zero on success, error code on failure
2016  */
2017 int drm_atomic_helper_update_plane(struct drm_plane *plane,
2018 				   struct drm_crtc *crtc,
2019 				   struct drm_framebuffer *fb,
2020 				   int crtc_x, int crtc_y,
2021 				   unsigned int crtc_w, unsigned int crtc_h,
2022 				   uint32_t src_x, uint32_t src_y,
2023 				   uint32_t src_w, uint32_t src_h)
2024 {
2025 	struct drm_atomic_state *state;
2026 	struct drm_plane_state *plane_state;
2027 	int ret = 0;
2028 
2029 	state = drm_atomic_state_alloc(plane->dev);
2030 	if (!state)
2031 		return -ENOMEM;
2032 
2033 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2034 retry:
2035 	plane_state = drm_atomic_get_plane_state(state, plane);
2036 	if (IS_ERR(plane_state)) {
2037 		ret = PTR_ERR(plane_state);
2038 		goto fail;
2039 	}
2040 
2041 	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
2042 	if (ret != 0)
2043 		goto fail;
2044 	drm_atomic_set_fb_for_plane(plane_state, fb);
2045 	plane_state->crtc_x = crtc_x;
2046 	plane_state->crtc_y = crtc_y;
2047 	plane_state->crtc_w = crtc_w;
2048 	plane_state->crtc_h = crtc_h;
2049 	plane_state->src_x = src_x;
2050 	plane_state->src_y = src_y;
2051 	plane_state->src_w = src_w;
2052 	plane_state->src_h = src_h;
2053 
2054 	if (plane == crtc->cursor)
2055 		state->legacy_cursor_update = true;
2056 
2057 	ret = drm_atomic_commit(state);
2058 	if (ret != 0)
2059 		goto fail;
2060 
2061 	/* Driver takes ownership of state on successful commit. */
2062 	return 0;
2063 fail:
2064 	if (ret == -EDEADLK)
2065 		goto backoff;
2066 
2067 	drm_atomic_state_free(state);
2068 
2069 	return ret;
2070 backoff:
2071 	drm_atomic_state_clear(state);
2072 	drm_atomic_legacy_backoff(state);
2073 
2074 	/*
2075 	 * Someone might have exchanged the framebuffer while we dropped locks
2076 	 * in the backoff code. We need to fix up the fb refcount tracking the
2077 	 * core does for us.
2078 	 */
2079 	plane->old_fb = plane->fb;
2080 
2081 	goto retry;
2082 }
2083 EXPORT_SYMBOL(drm_atomic_helper_update_plane);
2084 
2085 /**
2086  * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic
2087  * @plane: plane to disable
2088  *
2089  * Provides a default plane disable handler using the atomic driver interface.
2090  *
2091  * RETURNS:
2092  * Zero on success, error code on failure
2093  */
2094 int drm_atomic_helper_disable_plane(struct drm_plane *plane)
2095 {
2096 	struct drm_atomic_state *state;
2097 	struct drm_plane_state *plane_state;
2098 	int ret = 0;
2099 
2100 	/*
2101 	 * FIXME: Without plane->crtc set we can't get at the implicit legacy
2102 	 * acquire context. The real fix will be to wire the acquire ctx through
2103 	 * everywhere we need it, but meanwhile prevent chaos by just skipping
2104 	 * this noop. The critical case is the cursor ioctls which a) only grab
2105 	 * crtc/cursor-plane locks (so we need the crtc to get at the right
2106 	 * acquire context) and b) can try to disable the plane multiple times.
2107 	 */
2108 	if (!plane->crtc)
2109 		return 0;
2110 
2111 	state = drm_atomic_state_alloc(plane->dev);
2112 	if (!state)
2113 		return -ENOMEM;
2114 
2115 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(plane->crtc);
2116 retry:
2117 	plane_state = drm_atomic_get_plane_state(state, plane);
2118 	if (IS_ERR(plane_state)) {
2119 		ret = PTR_ERR(plane_state);
2120 		goto fail;
2121 	}
2122 
2123 	if (plane_state->crtc && (plane == plane->crtc->cursor))
2124 		plane_state->state->legacy_cursor_update = true;
2125 
2126 	ret = __drm_atomic_helper_disable_plane(plane, plane_state);
2127 	if (ret != 0)
2128 		goto fail;
2129 
2130 	ret = drm_atomic_commit(state);
2131 	if (ret != 0)
2132 		goto fail;
2133 
2134 	/* Driver takes ownership of state on successful commit. */
2135 	return 0;
2136 fail:
2137 	if (ret == -EDEADLK)
2138 		goto backoff;
2139 
2140 	drm_atomic_state_free(state);
2141 
2142 	return ret;
2143 backoff:
2144 	drm_atomic_state_clear(state);
2145 	drm_atomic_legacy_backoff(state);
2146 
2147 	/*
2148 	 * Someone might have exchanged the framebuffer while we dropped locks
2149 	 * in the backoff code. We need to fix up the fb refcount tracking the
2150 	 * core does for us.
2151 	 */
2152 	plane->old_fb = plane->fb;
2153 
2154 	goto retry;
2155 }
2156 EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
2157 
2158 /* just used from fb-helper and atomic-helper: */
2159 int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
2160 		struct drm_plane_state *plane_state)
2161 {
2162 	int ret;
2163 
2164 	ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
2165 	if (ret != 0)
2166 		return ret;
2167 
2168 	drm_atomic_set_fb_for_plane(plane_state, NULL);
2169 	plane_state->crtc_x = 0;
2170 	plane_state->crtc_y = 0;
2171 	plane_state->crtc_w = 0;
2172 	plane_state->crtc_h = 0;
2173 	plane_state->src_x = 0;
2174 	plane_state->src_y = 0;
2175 	plane_state->src_w = 0;
2176 	plane_state->src_h = 0;
2177 
2178 	return 0;
2179 }
2180 
2181 static int update_output_state(struct drm_atomic_state *state,
2182 			       struct drm_mode_set *set)
2183 {
2184 	struct drm_device *dev = set->crtc->dev;
2185 	struct drm_crtc *crtc;
2186 	struct drm_crtc_state *crtc_state;
2187 	struct drm_connector *connector;
2188 	struct drm_connector_state *conn_state;
2189 	int ret, i;
2190 
2191 	ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
2192 			       state->acquire_ctx);
2193 	if (ret)
2194 		return ret;
2195 
2196 	/* First disable all connectors on the target crtc. */
2197 	ret = drm_atomic_add_affected_connectors(state, set->crtc);
2198 	if (ret)
2199 		return ret;
2200 
2201 	for_each_connector_in_state(state, connector, conn_state, i) {
2202 		if (conn_state->crtc == set->crtc) {
2203 			ret = drm_atomic_set_crtc_for_connector(conn_state,
2204 								NULL);
2205 			if (ret)
2206 				return ret;
2207 		}
2208 	}
2209 
2210 	/* Then set all connectors from set->connectors on the target crtc */
2211 	for (i = 0; i < set->num_connectors; i++) {
2212 		conn_state = drm_atomic_get_connector_state(state,
2213 							    set->connectors[i]);
2214 		if (IS_ERR(conn_state))
2215 			return PTR_ERR(conn_state);
2216 
2217 		ret = drm_atomic_set_crtc_for_connector(conn_state,
2218 							set->crtc);
2219 		if (ret)
2220 			return ret;
2221 	}
2222 
2223 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
2224 		/* Don't update ->enable for the CRTC in the set_config request,
2225 		 * since a mismatch would indicate a bug in the upper layers.
2226 		 * The actual modeset code later on will catch any
2227 		 * inconsistencies here. */
2228 		if (crtc == set->crtc)
2229 			continue;
2230 
2231 		if (!crtc_state->connector_mask) {
2232 			ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
2233 								NULL);
2234 			if (ret < 0)
2235 				return ret;
2236 
2237 			crtc_state->active = false;
2238 		}
2239 	}
2240 
2241 	return 0;
2242 }
2243 
2244 /**
2245  * drm_atomic_helper_set_config - set a new config from userspace
2246  * @set: mode set configuration
2247  *
2248  * Provides a default crtc set_config handler using the atomic driver interface.
2249  *
2250  * Returns:
2251  * Returns 0 on success, negative errno numbers on failure.
2252  */
2253 int drm_atomic_helper_set_config(struct drm_mode_set *set)
2254 {
2255 	struct drm_atomic_state *state;
2256 	struct drm_crtc *crtc = set->crtc;
2257 	int ret = 0;
2258 
2259 	state = drm_atomic_state_alloc(crtc->dev);
2260 	if (!state)
2261 		return -ENOMEM;
2262 
2263 	state->legacy_set_config = true;
2264 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2265 retry:
2266 	ret = __drm_atomic_helper_set_config(set, state);
2267 	if (ret != 0)
2268 		goto fail;
2269 
2270 	ret = drm_atomic_commit(state);
2271 	if (ret != 0)
2272 		goto fail;
2273 
2274 	/* Driver takes ownership of state on successful commit. */
2275 	return 0;
2276 fail:
2277 	if (ret == -EDEADLK)
2278 		goto backoff;
2279 
2280 	drm_atomic_state_free(state);
2281 
2282 	return ret;
2283 backoff:
2284 	drm_atomic_state_clear(state);
2285 	drm_atomic_legacy_backoff(state);
2286 
2287 	/*
2288 	 * Someone might have exchanged the framebuffer while we dropped locks
2289 	 * in the backoff code. We need to fix up the fb refcount tracking the
2290 	 * core does for us.
2291 	 */
2292 	crtc->primary->old_fb = crtc->primary->fb;
2293 
2294 	goto retry;
2295 }
2296 EXPORT_SYMBOL(drm_atomic_helper_set_config);
2297 
2298 /* just used from fb-helper and atomic-helper: */
2299 int __drm_atomic_helper_set_config(struct drm_mode_set *set,
2300 		struct drm_atomic_state *state)
2301 {
2302 	struct drm_crtc_state *crtc_state;
2303 	struct drm_plane_state *primary_state;
2304 	struct drm_crtc *crtc = set->crtc;
2305 	int hdisplay, vdisplay;
2306 	int ret;
2307 
2308 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
2309 	if (IS_ERR(crtc_state))
2310 		return PTR_ERR(crtc_state);
2311 
2312 	primary_state = drm_atomic_get_plane_state(state, crtc->primary);
2313 	if (IS_ERR(primary_state))
2314 		return PTR_ERR(primary_state);
2315 
2316 	if (!set->mode) {
2317 		WARN_ON(set->fb);
2318 		WARN_ON(set->num_connectors);
2319 
2320 		ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
2321 		if (ret != 0)
2322 			return ret;
2323 
2324 		crtc_state->active = false;
2325 
2326 		ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
2327 		if (ret != 0)
2328 			return ret;
2329 
2330 		drm_atomic_set_fb_for_plane(primary_state, NULL);
2331 
2332 		goto commit;
2333 	}
2334 
2335 	WARN_ON(!set->fb);
2336 	WARN_ON(!set->num_connectors);
2337 
2338 	ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
2339 	if (ret != 0)
2340 		return ret;
2341 
2342 	crtc_state->active = true;
2343 
2344 	ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
2345 	if (ret != 0)
2346 		return ret;
2347 
2348 	drm_crtc_get_hv_timing(set->mode, &hdisplay, &vdisplay);
2349 
2350 	drm_atomic_set_fb_for_plane(primary_state, set->fb);
2351 	primary_state->crtc_x = 0;
2352 	primary_state->crtc_y = 0;
2353 	primary_state->crtc_w = hdisplay;
2354 	primary_state->crtc_h = vdisplay;
2355 	primary_state->src_x = set->x << 16;
2356 	primary_state->src_y = set->y << 16;
2357 	if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) {
2358 		primary_state->src_w = vdisplay << 16;
2359 		primary_state->src_h = hdisplay << 16;
2360 	} else {
2361 		primary_state->src_w = hdisplay << 16;
2362 		primary_state->src_h = vdisplay << 16;
2363 	}
2364 
2365 commit:
2366 	ret = update_output_state(state, set);
2367 	if (ret)
2368 		return ret;
2369 
2370 	return 0;
2371 }
2372 
2373 /**
2374  * drm_atomic_helper_disable_all - disable all currently active outputs
2375  * @dev: DRM device
2376  * @ctx: lock acquisition context
2377  *
2378  * Loops through all connectors, finding those that aren't turned off and then
2379  * turns them off by setting their DPMS mode to OFF and deactivating the CRTC
2380  * that they are connected to.
2381  *
2382  * This is used for example in suspend/resume to disable all currently active
2383  * functions when suspending.
2384  *
2385  * Note that if callers haven't already acquired all modeset locks this might
2386  * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
2387  *
2388  * Returns:
2389  * 0 on success or a negative error code on failure.
2390  *
2391  * See also:
2392  * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
2393  */
2394 int drm_atomic_helper_disable_all(struct drm_device *dev,
2395 				  struct drm_modeset_acquire_ctx *ctx)
2396 {
2397 	struct drm_atomic_state *state;
2398 	struct drm_connector *conn;
2399 	int err;
2400 
2401 	state = drm_atomic_state_alloc(dev);
2402 	if (!state)
2403 		return -ENOMEM;
2404 
2405 	state->acquire_ctx = ctx;
2406 
2407 	drm_for_each_connector(conn, dev) {
2408 		struct drm_crtc *crtc = conn->state->crtc;
2409 		struct drm_crtc_state *crtc_state;
2410 
2411 		if (!crtc || conn->dpms != DRM_MODE_DPMS_ON)
2412 			continue;
2413 
2414 		crtc_state = drm_atomic_get_crtc_state(state, crtc);
2415 		if (IS_ERR(crtc_state)) {
2416 			err = PTR_ERR(crtc_state);
2417 			goto free;
2418 		}
2419 
2420 		crtc_state->active = false;
2421 	}
2422 
2423 	err = drm_atomic_commit(state);
2424 
2425 free:
2426 	if (err < 0)
2427 		drm_atomic_state_free(state);
2428 
2429 	return err;
2430 }
2431 EXPORT_SYMBOL(drm_atomic_helper_disable_all);
2432 
2433 /**
2434  * drm_atomic_helper_suspend - subsystem-level suspend helper
2435  * @dev: DRM device
2436  *
2437  * Duplicates the current atomic state, disables all active outputs and then
2438  * returns a pointer to the original atomic state to the caller. Drivers can
2439  * pass this pointer to the drm_atomic_helper_resume() helper upon resume to
2440  * restore the output configuration that was active at the time the system
2441  * entered suspend.
2442  *
2443  * Note that it is potentially unsafe to use this. The atomic state object
2444  * returned by this function is assumed to be persistent. Drivers must ensure
2445  * that this holds true. Before calling this function, drivers must make sure
2446  * to suspend fbdev emulation so that nothing can be using the device.
2447  *
2448  * Returns:
2449  * A pointer to a copy of the state before suspend on success or an ERR_PTR()-
2450  * encoded error code on failure. Drivers should store the returned atomic
2451  * state object and pass it to the drm_atomic_helper_resume() helper upon
2452  * resume.
2453  *
2454  * See also:
2455  * drm_atomic_helper_duplicate_state(), drm_atomic_helper_disable_all(),
2456  * drm_atomic_helper_resume()
2457  */
2458 struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
2459 {
2460 	struct drm_modeset_acquire_ctx ctx;
2461 	struct drm_atomic_state *state;
2462 	int err;
2463 
2464 	drm_modeset_acquire_init(&ctx, 0);
2465 
2466 retry:
2467 	err = drm_modeset_lock_all_ctx(dev, &ctx);
2468 	if (err < 0) {
2469 		state = ERR_PTR(err);
2470 		goto unlock;
2471 	}
2472 
2473 	state = drm_atomic_helper_duplicate_state(dev, &ctx);
2474 	if (IS_ERR(state))
2475 		goto unlock;
2476 
2477 	err = drm_atomic_helper_disable_all(dev, &ctx);
2478 	if (err < 0) {
2479 		drm_atomic_state_free(state);
2480 		state = ERR_PTR(err);
2481 		goto unlock;
2482 	}
2483 
2484 unlock:
2485 	if (PTR_ERR(state) == -EDEADLK) {
2486 		drm_modeset_backoff(&ctx);
2487 		goto retry;
2488 	}
2489 
2490 	drm_modeset_drop_locks(&ctx);
2491 	drm_modeset_acquire_fini(&ctx);
2492 	return state;
2493 }
2494 EXPORT_SYMBOL(drm_atomic_helper_suspend);
2495 
2496 /**
2497  * drm_atomic_helper_resume - subsystem-level resume helper
2498  * @dev: DRM device
2499  * @state: atomic state to resume to
2500  *
2501  * Calls drm_mode_config_reset() to synchronize hardware and software states,
2502  * grabs all modeset locks and commits the atomic state object. This can be
2503  * used in conjunction with the drm_atomic_helper_suspend() helper to
2504  * implement suspend/resume for drivers that support atomic mode-setting.
2505  *
2506  * Returns:
2507  * 0 on success or a negative error code on failure.
2508  *
2509  * See also:
2510  * drm_atomic_helper_suspend()
2511  */
2512 int drm_atomic_helper_resume(struct drm_device *dev,
2513 			     struct drm_atomic_state *state)
2514 {
2515 	struct drm_mode_config *config = &dev->mode_config;
2516 	int err;
2517 
2518 	drm_mode_config_reset(dev);
2519 	drm_modeset_lock_all(dev);
2520 	state->acquire_ctx = config->acquire_ctx;
2521 	err = drm_atomic_commit(state);
2522 	drm_modeset_unlock_all(dev);
2523 
2524 	return err;
2525 }
2526 EXPORT_SYMBOL(drm_atomic_helper_resume);
2527 
2528 /**
2529  * drm_atomic_helper_crtc_set_property - helper for crtc properties
2530  * @crtc: DRM crtc
2531  * @property: DRM property
2532  * @val: value of property
2533  *
2534  * Provides a default crtc set_property handler using the atomic driver
2535  * interface.
2536  *
2537  * RETURNS:
2538  * Zero on success, error code on failure
2539  */
2540 int
2541 drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc,
2542 				    struct drm_property *property,
2543 				    uint64_t val)
2544 {
2545 	struct drm_atomic_state *state;
2546 	struct drm_crtc_state *crtc_state;
2547 	int ret = 0;
2548 
2549 	state = drm_atomic_state_alloc(crtc->dev);
2550 	if (!state)
2551 		return -ENOMEM;
2552 
2553 	/* ->set_property is always called with all locks held. */
2554 	state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
2555 retry:
2556 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
2557 	if (IS_ERR(crtc_state)) {
2558 		ret = PTR_ERR(crtc_state);
2559 		goto fail;
2560 	}
2561 
2562 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
2563 			property, val);
2564 	if (ret)
2565 		goto fail;
2566 
2567 	ret = drm_atomic_commit(state);
2568 	if (ret != 0)
2569 		goto fail;
2570 
2571 	/* Driver takes ownership of state on successful commit. */
2572 	return 0;
2573 fail:
2574 	if (ret == -EDEADLK)
2575 		goto backoff;
2576 
2577 	drm_atomic_state_free(state);
2578 
2579 	return ret;
2580 backoff:
2581 	drm_atomic_state_clear(state);
2582 	drm_atomic_legacy_backoff(state);
2583 
2584 	goto retry;
2585 }
2586 EXPORT_SYMBOL(drm_atomic_helper_crtc_set_property);
2587 
2588 /**
2589  * drm_atomic_helper_plane_set_property - helper for plane properties
2590  * @plane: DRM plane
2591  * @property: DRM property
2592  * @val: value of property
2593  *
2594  * Provides a default plane set_property handler using the atomic driver
2595  * interface.
2596  *
2597  * RETURNS:
2598  * Zero on success, error code on failure
2599  */
2600 int
2601 drm_atomic_helper_plane_set_property(struct drm_plane *plane,
2602 				    struct drm_property *property,
2603 				    uint64_t val)
2604 {
2605 	struct drm_atomic_state *state;
2606 	struct drm_plane_state *plane_state;
2607 	int ret = 0;
2608 
2609 	state = drm_atomic_state_alloc(plane->dev);
2610 	if (!state)
2611 		return -ENOMEM;
2612 
2613 	/* ->set_property is always called with all locks held. */
2614 	state->acquire_ctx = plane->dev->mode_config.acquire_ctx;
2615 retry:
2616 	plane_state = drm_atomic_get_plane_state(state, plane);
2617 	if (IS_ERR(plane_state)) {
2618 		ret = PTR_ERR(plane_state);
2619 		goto fail;
2620 	}
2621 
2622 	ret = drm_atomic_plane_set_property(plane, plane_state,
2623 			property, val);
2624 	if (ret)
2625 		goto fail;
2626 
2627 	ret = drm_atomic_commit(state);
2628 	if (ret != 0)
2629 		goto fail;
2630 
2631 	/* Driver takes ownership of state on successful commit. */
2632 	return 0;
2633 fail:
2634 	if (ret == -EDEADLK)
2635 		goto backoff;
2636 
2637 	drm_atomic_state_free(state);
2638 
2639 	return ret;
2640 backoff:
2641 	drm_atomic_state_clear(state);
2642 	drm_atomic_legacy_backoff(state);
2643 
2644 	goto retry;
2645 }
2646 EXPORT_SYMBOL(drm_atomic_helper_plane_set_property);
2647 
2648 /**
2649  * drm_atomic_helper_connector_set_property - helper for connector properties
2650  * @connector: DRM connector
2651  * @property: DRM property
2652  * @val: value of property
2653  *
2654  * Provides a default connector set_property handler using the atomic driver
2655  * interface.
2656  *
2657  * RETURNS:
2658  * Zero on success, error code on failure
2659  */
2660 int
2661 drm_atomic_helper_connector_set_property(struct drm_connector *connector,
2662 				    struct drm_property *property,
2663 				    uint64_t val)
2664 {
2665 	struct drm_atomic_state *state;
2666 	struct drm_connector_state *connector_state;
2667 	int ret = 0;
2668 
2669 	state = drm_atomic_state_alloc(connector->dev);
2670 	if (!state)
2671 		return -ENOMEM;
2672 
2673 	/* ->set_property is always called with all locks held. */
2674 	state->acquire_ctx = connector->dev->mode_config.acquire_ctx;
2675 retry:
2676 	connector_state = drm_atomic_get_connector_state(state, connector);
2677 	if (IS_ERR(connector_state)) {
2678 		ret = PTR_ERR(connector_state);
2679 		goto fail;
2680 	}
2681 
2682 	ret = drm_atomic_connector_set_property(connector, connector_state,
2683 			property, val);
2684 	if (ret)
2685 		goto fail;
2686 
2687 	ret = drm_atomic_commit(state);
2688 	if (ret != 0)
2689 		goto fail;
2690 
2691 	/* Driver takes ownership of state on successful commit. */
2692 	return 0;
2693 fail:
2694 	if (ret == -EDEADLK)
2695 		goto backoff;
2696 
2697 	drm_atomic_state_free(state);
2698 
2699 	return ret;
2700 backoff:
2701 	drm_atomic_state_clear(state);
2702 	drm_atomic_legacy_backoff(state);
2703 
2704 	goto retry;
2705 }
2706 EXPORT_SYMBOL(drm_atomic_helper_connector_set_property);
2707 
2708 /**
2709  * drm_atomic_helper_page_flip - execute a legacy page flip
2710  * @crtc: DRM crtc
2711  * @fb: DRM framebuffer
2712  * @event: optional DRM event to signal upon completion
2713  * @flags: flip flags for non-vblank sync'ed updates
2714  *
2715  * Provides a default page flip implementation using the atomic driver interface.
2716  *
2717  * Note that for now so called async page flips (i.e. updates which are not
2718  * synchronized to vblank) are not supported, since the atomic interfaces have
2719  * no provisions for this yet.
2720  *
2721  * Returns:
2722  * Returns 0 on success, negative errno numbers on failure.
2723  */
2724 int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
2725 				struct drm_framebuffer *fb,
2726 				struct drm_pending_vblank_event *event,
2727 				uint32_t flags)
2728 {
2729 	struct drm_plane *plane = crtc->primary;
2730 	struct drm_atomic_state *state;
2731 	struct drm_plane_state *plane_state;
2732 	struct drm_crtc_state *crtc_state;
2733 	int ret = 0;
2734 
2735 	if (flags & DRM_MODE_PAGE_FLIP_ASYNC)
2736 		return -EINVAL;
2737 
2738 	state = drm_atomic_state_alloc(plane->dev);
2739 	if (!state)
2740 		return -ENOMEM;
2741 
2742 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2743 retry:
2744 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
2745 	if (IS_ERR(crtc_state)) {
2746 		ret = PTR_ERR(crtc_state);
2747 		goto fail;
2748 	}
2749 	crtc_state->event = event;
2750 
2751 	plane_state = drm_atomic_get_plane_state(state, plane);
2752 	if (IS_ERR(plane_state)) {
2753 		ret = PTR_ERR(plane_state);
2754 		goto fail;
2755 	}
2756 
2757 	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
2758 	if (ret != 0)
2759 		goto fail;
2760 	drm_atomic_set_fb_for_plane(plane_state, fb);
2761 
2762 	/* Make sure we don't accidentally do a full modeset. */
2763 	state->allow_modeset = false;
2764 	if (!crtc_state->active) {
2765 		DRM_DEBUG_ATOMIC("[CRTC:%d] disabled, rejecting legacy flip\n",
2766 				 crtc->base.id);
2767 		ret = -EINVAL;
2768 		goto fail;
2769 	}
2770 
2771 	ret = drm_atomic_nonblocking_commit(state);
2772 	if (ret != 0)
2773 		goto fail;
2774 
2775 	/* Driver takes ownership of state on successful commit. */
2776 	return 0;
2777 fail:
2778 	if (ret == -EDEADLK)
2779 		goto backoff;
2780 
2781 	drm_atomic_state_free(state);
2782 
2783 	return ret;
2784 backoff:
2785 	drm_atomic_state_clear(state);
2786 	drm_atomic_legacy_backoff(state);
2787 
2788 	/*
2789 	 * Someone might have exchanged the framebuffer while we dropped locks
2790 	 * in the backoff code. We need to fix up the fb refcount tracking the
2791 	 * core does for us.
2792 	 */
2793 	plane->old_fb = plane->fb;
2794 
2795 	goto retry;
2796 }
2797 EXPORT_SYMBOL(drm_atomic_helper_page_flip);
2798 
2799 /**
2800  * drm_atomic_helper_connector_dpms() - connector dpms helper implementation
2801  * @connector: affected connector
2802  * @mode: DPMS mode
2803  *
2804  * This is the main helper function provided by the atomic helper framework for
2805  * implementing the legacy DPMS connector interface. It computes the new desired
2806  * ->active state for the corresponding CRTC (if the connector is enabled) and
2807  * updates it.
2808  *
2809  * Returns:
2810  * Returns 0 on success, negative errno numbers on failure.
2811  */
2812 int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
2813 				     int mode)
2814 {
2815 	struct drm_mode_config *config = &connector->dev->mode_config;
2816 	struct drm_atomic_state *state;
2817 	struct drm_crtc_state *crtc_state;
2818 	struct drm_crtc *crtc;
2819 	struct drm_connector *tmp_connector;
2820 	int ret;
2821 	bool active = false;
2822 	int old_mode = connector->dpms;
2823 
2824 	if (mode != DRM_MODE_DPMS_ON)
2825 		mode = DRM_MODE_DPMS_OFF;
2826 
2827 	connector->dpms = mode;
2828 	crtc = connector->state->crtc;
2829 
2830 	if (!crtc)
2831 		return 0;
2832 
2833 	state = drm_atomic_state_alloc(connector->dev);
2834 	if (!state)
2835 		return -ENOMEM;
2836 
2837 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2838 retry:
2839 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
2840 	if (IS_ERR(crtc_state)) {
2841 		ret = PTR_ERR(crtc_state);
2842 		goto fail;
2843 	}
2844 
2845 	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
2846 
2847 	drm_for_each_connector(tmp_connector, connector->dev) {
2848 		if (tmp_connector->state->crtc != crtc)
2849 			continue;
2850 
2851 		if (tmp_connector->dpms == DRM_MODE_DPMS_ON) {
2852 			active = true;
2853 			break;
2854 		}
2855 	}
2856 	crtc_state->active = active;
2857 
2858 	ret = drm_atomic_commit(state);
2859 	if (ret != 0)
2860 		goto fail;
2861 
2862 	/* Driver takes ownership of state on successful commit. */
2863 	return 0;
2864 fail:
2865 	if (ret == -EDEADLK)
2866 		goto backoff;
2867 
2868 	connector->dpms = old_mode;
2869 	drm_atomic_state_free(state);
2870 
2871 	return ret;
2872 backoff:
2873 	drm_atomic_state_clear(state);
2874 	drm_atomic_legacy_backoff(state);
2875 
2876 	goto retry;
2877 }
2878 EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
2879 
2880 /**
2881  * drm_atomic_helper_best_encoder - Helper for &drm_connector_helper_funcs
2882  *                                  ->best_encoder callback
2883  * @connector: Connector control structure
2884  *
2885  * This is a &drm_connector_helper_funcs ->best_encoder callback helper for
2886  * connectors that support exactly 1 encoder, statically determined at driver
2887  * init time.
2888  */
2889 struct drm_encoder *
2890 drm_atomic_helper_best_encoder(struct drm_connector *connector)
2891 {
2892 	WARN_ON(connector->encoder_ids[1]);
2893 	return drm_encoder_find(connector->dev, connector->encoder_ids[0]);
2894 }
2895 EXPORT_SYMBOL(drm_atomic_helper_best_encoder);
2896 
2897 /**
2898  * DOC: atomic state reset and initialization
2899  *
2900  * Both the drm core and the atomic helpers assume that there is always the full
2901  * and correct atomic software state for all connectors, CRTCs and planes
2902  * available. Which is a bit a problem on driver load and also after system
2903  * suspend. One way to solve this is to have a hardware state read-out
2904  * infrastructure which reconstructs the full software state (e.g. the i915
2905  * driver).
2906  *
2907  * The simpler solution is to just reset the software state to everything off,
2908  * which is easiest to do by calling drm_mode_config_reset(). To facilitate this
2909  * the atomic helpers provide default reset implementations for all hooks.
2910  *
2911  * On the upside the precise state tracking of atomic simplifies system suspend
2912  * and resume a lot. For drivers using drm_mode_config_reset() a complete recipe
2913  * is implemented in drm_atomic_helper_suspend() and drm_atomic_helper_resume().
2914  * For other drivers the building blocks are split out, see the documentation
2915  * for these functions.
2916  */
2917 
2918 /**
2919  * drm_atomic_helper_crtc_reset - default ->reset hook for CRTCs
2920  * @crtc: drm CRTC
2921  *
2922  * Resets the atomic state for @crtc by freeing the state pointer (which might
2923  * be NULL, e.g. at driver load time) and allocating a new empty state object.
2924  */
2925 void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
2926 {
2927 	if (crtc->state)
2928 		__drm_atomic_helper_crtc_destroy_state(crtc->state);
2929 
2930 	kfree(crtc->state);
2931 	crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
2932 
2933 	if (crtc->state)
2934 		crtc->state->crtc = crtc;
2935 }
2936 EXPORT_SYMBOL(drm_atomic_helper_crtc_reset);
2937 
2938 /**
2939  * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state
2940  * @crtc: CRTC object
2941  * @state: atomic CRTC state
2942  *
2943  * Copies atomic state from a CRTC's current state and resets inferred values.
2944  * This is useful for drivers that subclass the CRTC state.
2945  */
2946 void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
2947 					      struct drm_crtc_state *state)
2948 {
2949 	memcpy(state, crtc->state, sizeof(*state));
2950 
2951 	if (state->mode_blob)
2952 		drm_property_reference_blob(state->mode_blob);
2953 	if (state->degamma_lut)
2954 		drm_property_reference_blob(state->degamma_lut);
2955 	if (state->ctm)
2956 		drm_property_reference_blob(state->ctm);
2957 	if (state->gamma_lut)
2958 		drm_property_reference_blob(state->gamma_lut);
2959 	state->mode_changed = false;
2960 	state->active_changed = false;
2961 	state->planes_changed = false;
2962 	state->connectors_changed = false;
2963 	state->color_mgmt_changed = false;
2964 	state->zpos_changed = false;
2965 	state->event = NULL;
2966 }
2967 EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state);
2968 
2969 /**
2970  * drm_atomic_helper_crtc_duplicate_state - default state duplicate hook
2971  * @crtc: drm CRTC
2972  *
2973  * Default CRTC state duplicate hook for drivers which don't have their own
2974  * subclassed CRTC state structure.
2975  */
2976 struct drm_crtc_state *
2977 drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc)
2978 {
2979 	struct drm_crtc_state *state;
2980 
2981 	if (WARN_ON(!crtc->state))
2982 		return NULL;
2983 
2984 	state = kmalloc(sizeof(*state), GFP_KERNEL);
2985 	if (state)
2986 		__drm_atomic_helper_crtc_duplicate_state(crtc, state);
2987 
2988 	return state;
2989 }
2990 EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
2991 
2992 /**
2993  * __drm_atomic_helper_crtc_destroy_state - release CRTC state
2994  * @state: CRTC state object to release
2995  *
2996  * Releases all resources stored in the CRTC state without actually freeing
2997  * the memory of the CRTC state. This is useful for drivers that subclass the
2998  * CRTC state.
2999  */
3000 void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state)
3001 {
3002 	drm_property_unreference_blob(state->mode_blob);
3003 	drm_property_unreference_blob(state->degamma_lut);
3004 	drm_property_unreference_blob(state->ctm);
3005 	drm_property_unreference_blob(state->gamma_lut);
3006 }
3007 EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
3008 
3009 /**
3010  * drm_atomic_helper_crtc_destroy_state - default state destroy hook
3011  * @crtc: drm CRTC
3012  * @state: CRTC state object to release
3013  *
3014  * Default CRTC state destroy hook for drivers which don't have their own
3015  * subclassed CRTC state structure.
3016  */
3017 void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
3018 					  struct drm_crtc_state *state)
3019 {
3020 	__drm_atomic_helper_crtc_destroy_state(state);
3021 	kfree(state);
3022 }
3023 EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
3024 
3025 /**
3026  * drm_atomic_helper_plane_reset - default ->reset hook for planes
3027  * @plane: drm plane
3028  *
3029  * Resets the atomic state for @plane by freeing the state pointer (which might
3030  * be NULL, e.g. at driver load time) and allocating a new empty state object.
3031  */
3032 void drm_atomic_helper_plane_reset(struct drm_plane *plane)
3033 {
3034 	if (plane->state)
3035 		__drm_atomic_helper_plane_destroy_state(plane->state);
3036 
3037 	kfree(plane->state);
3038 	plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);
3039 
3040 	if (plane->state) {
3041 		plane->state->plane = plane;
3042 		plane->state->rotation = BIT(DRM_ROTATE_0);
3043 	}
3044 }
3045 EXPORT_SYMBOL(drm_atomic_helper_plane_reset);
3046 
3047 /**
3048  * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state
3049  * @plane: plane object
3050  * @state: atomic plane state
3051  *
3052  * Copies atomic state from a plane's current state. This is useful for
3053  * drivers that subclass the plane state.
3054  */
3055 void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
3056 					       struct drm_plane_state *state)
3057 {
3058 	memcpy(state, plane->state, sizeof(*state));
3059 
3060 	if (state->fb)
3061 		drm_framebuffer_reference(state->fb);
3062 }
3063 EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state);
3064 
3065 /**
3066  * drm_atomic_helper_plane_duplicate_state - default state duplicate hook
3067  * @plane: drm plane
3068  *
3069  * Default plane state duplicate hook for drivers which don't have their own
3070  * subclassed plane state structure.
3071  */
3072 struct drm_plane_state *
3073 drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane)
3074 {
3075 	struct drm_plane_state *state;
3076 
3077 	if (WARN_ON(!plane->state))
3078 		return NULL;
3079 
3080 	state = kmalloc(sizeof(*state), GFP_KERNEL);
3081 	if (state)
3082 		__drm_atomic_helper_plane_duplicate_state(plane, state);
3083 
3084 	return state;
3085 }
3086 EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state);
3087 
3088 /**
3089  * __drm_atomic_helper_plane_destroy_state - release plane state
3090  * @state: plane state object to release
3091  *
3092  * Releases all resources stored in the plane state without actually freeing
3093  * the memory of the plane state. This is useful for drivers that subclass the
3094  * plane state.
3095  */
3096 void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state)
3097 {
3098 	if (state->fb)
3099 		drm_framebuffer_unreference(state->fb);
3100 }
3101 EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
3102 
3103 /**
3104  * drm_atomic_helper_plane_destroy_state - default state destroy hook
3105  * @plane: drm plane
3106  * @state: plane state object to release
3107  *
3108  * Default plane state destroy hook for drivers which don't have their own
3109  * subclassed plane state structure.
3110  */
3111 void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
3112 					   struct drm_plane_state *state)
3113 {
3114 	__drm_atomic_helper_plane_destroy_state(state);
3115 	kfree(state);
3116 }
3117 EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state);
3118 
3119 /**
3120  * __drm_atomic_helper_connector_reset - reset state on connector
3121  * @connector: drm connector
3122  * @conn_state: connector state to assign
3123  *
3124  * Initializes the newly allocated @conn_state and assigns it to
3125  * #connector ->state, usually required when initializing the drivers
3126  * or when called from the ->reset hook.
3127  *
3128  * This is useful for drivers that subclass the connector state.
3129  */
3130 void
3131 __drm_atomic_helper_connector_reset(struct drm_connector *connector,
3132 				    struct drm_connector_state *conn_state)
3133 {
3134 	if (conn_state)
3135 		conn_state->connector = connector;
3136 
3137 	connector->state = conn_state;
3138 }
3139 EXPORT_SYMBOL(__drm_atomic_helper_connector_reset);
3140 
3141 /**
3142  * drm_atomic_helper_connector_reset - default ->reset hook for connectors
3143  * @connector: drm connector
3144  *
3145  * Resets the atomic state for @connector by freeing the state pointer (which
3146  * might be NULL, e.g. at driver load time) and allocating a new empty state
3147  * object.
3148  */
3149 void drm_atomic_helper_connector_reset(struct drm_connector *connector)
3150 {
3151 	struct drm_connector_state *conn_state =
3152 		kzalloc(sizeof(*conn_state), GFP_KERNEL);
3153 
3154 	if (connector->state)
3155 		__drm_atomic_helper_connector_destroy_state(connector->state);
3156 
3157 	kfree(connector->state);
3158 	__drm_atomic_helper_connector_reset(connector, conn_state);
3159 }
3160 EXPORT_SYMBOL(drm_atomic_helper_connector_reset);
3161 
3162 /**
3163  * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state
3164  * @connector: connector object
3165  * @state: atomic connector state
3166  *
3167  * Copies atomic state from a connector's current state. This is useful for
3168  * drivers that subclass the connector state.
3169  */
3170 void
3171 __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
3172 					    struct drm_connector_state *state)
3173 {
3174 	memcpy(state, connector->state, sizeof(*state));
3175 	if (state->crtc)
3176 		drm_connector_reference(connector);
3177 }
3178 EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
3179 
3180 /**
3181  * drm_atomic_helper_connector_duplicate_state - default state duplicate hook
3182  * @connector: drm connector
3183  *
3184  * Default connector state duplicate hook for drivers which don't have their own
3185  * subclassed connector state structure.
3186  */
3187 struct drm_connector_state *
3188 drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector)
3189 {
3190 	struct drm_connector_state *state;
3191 
3192 	if (WARN_ON(!connector->state))
3193 		return NULL;
3194 
3195 	state = kmalloc(sizeof(*state), GFP_KERNEL);
3196 	if (state)
3197 		__drm_atomic_helper_connector_duplicate_state(connector, state);
3198 
3199 	return state;
3200 }
3201 EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
3202 
3203 /**
3204  * drm_atomic_helper_duplicate_state - duplicate an atomic state object
3205  * @dev: DRM device
3206  * @ctx: lock acquisition context
3207  *
3208  * Makes a copy of the current atomic state by looping over all objects and
3209  * duplicating their respective states. This is used for example by suspend/
3210  * resume support code to save the state prior to suspend such that it can
3211  * be restored upon resume.
3212  *
3213  * Note that this treats atomic state as persistent between save and restore.
3214  * Drivers must make sure that this is possible and won't result in confusion
3215  * or erroneous behaviour.
3216  *
3217  * Note that if callers haven't already acquired all modeset locks this might
3218  * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
3219  *
3220  * Returns:
3221  * A pointer to the copy of the atomic state object on success or an
3222  * ERR_PTR()-encoded error code on failure.
3223  *
3224  * See also:
3225  * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
3226  */
3227 struct drm_atomic_state *
3228 drm_atomic_helper_duplicate_state(struct drm_device *dev,
3229 				  struct drm_modeset_acquire_ctx *ctx)
3230 {
3231 	struct drm_atomic_state *state;
3232 	struct drm_connector *conn;
3233 	struct drm_plane *plane;
3234 	struct drm_crtc *crtc;
3235 	int err = 0;
3236 
3237 	state = drm_atomic_state_alloc(dev);
3238 	if (!state)
3239 		return ERR_PTR(-ENOMEM);
3240 
3241 	state->acquire_ctx = ctx;
3242 
3243 	drm_for_each_crtc(crtc, dev) {
3244 		struct drm_crtc_state *crtc_state;
3245 
3246 		crtc_state = drm_atomic_get_crtc_state(state, crtc);
3247 		if (IS_ERR(crtc_state)) {
3248 			err = PTR_ERR(crtc_state);
3249 			goto free;
3250 		}
3251 	}
3252 
3253 	drm_for_each_plane(plane, dev) {
3254 		struct drm_plane_state *plane_state;
3255 
3256 		plane_state = drm_atomic_get_plane_state(state, plane);
3257 		if (IS_ERR(plane_state)) {
3258 			err = PTR_ERR(plane_state);
3259 			goto free;
3260 		}
3261 	}
3262 
3263 	drm_for_each_connector(conn, dev) {
3264 		struct drm_connector_state *conn_state;
3265 
3266 		conn_state = drm_atomic_get_connector_state(state, conn);
3267 		if (IS_ERR(conn_state)) {
3268 			err = PTR_ERR(conn_state);
3269 			goto free;
3270 		}
3271 	}
3272 
3273 	/* clear the acquire context so that it isn't accidentally reused */
3274 	state->acquire_ctx = NULL;
3275 
3276 free:
3277 	if (err < 0) {
3278 		drm_atomic_state_free(state);
3279 		state = ERR_PTR(err);
3280 	}
3281 
3282 	return state;
3283 }
3284 EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
3285 
3286 /**
3287  * __drm_atomic_helper_connector_destroy_state - release connector state
3288  * @state: connector state object to release
3289  *
3290  * Releases all resources stored in the connector state without actually
3291  * freeing the memory of the connector state. This is useful for drivers that
3292  * subclass the connector state.
3293  */
3294 void
3295 __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
3296 {
3297 	/*
3298 	 * This is currently a placeholder so that drivers that subclass the
3299 	 * state will automatically do the right thing if code is ever added
3300 	 * to this function.
3301 	 */
3302 	if (state->crtc)
3303 		drm_connector_unreference(state->connector);
3304 }
3305 EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
3306 
3307 /**
3308  * drm_atomic_helper_connector_destroy_state - default state destroy hook
3309  * @connector: drm connector
3310  * @state: connector state object to release
3311  *
3312  * Default connector state destroy hook for drivers which don't have their own
3313  * subclassed connector state structure.
3314  */
3315 void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
3316 					  struct drm_connector_state *state)
3317 {
3318 	__drm_atomic_helper_connector_destroy_state(state);
3319 	kfree(state);
3320 }
3321 EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
3322 
3323 /**
3324  * drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table
3325  * @crtc: CRTC object
3326  * @red: red correction table
3327  * @green: green correction table
3328  * @blue: green correction table
3329  * @size: size of the tables
3330  *
3331  * Implements support for legacy gamma correction table for drivers
3332  * that support color management through the DEGAMMA_LUT/GAMMA_LUT
3333  * properties.
3334  */
3335 int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
3336 				       u16 *red, u16 *green, u16 *blue,
3337 				       uint32_t size)
3338 {
3339 	struct drm_device *dev = crtc->dev;
3340 	struct drm_mode_config *config = &dev->mode_config;
3341 	struct drm_atomic_state *state;
3342 	struct drm_crtc_state *crtc_state;
3343 	struct drm_property_blob *blob = NULL;
3344 	struct drm_color_lut *blob_data;
3345 	int i, ret = 0;
3346 
3347 	state = drm_atomic_state_alloc(crtc->dev);
3348 	if (!state)
3349 		return -ENOMEM;
3350 
3351 	blob = drm_property_create_blob(dev,
3352 					sizeof(struct drm_color_lut) * size,
3353 					NULL);
3354 	if (IS_ERR(blob)) {
3355 		ret = PTR_ERR(blob);
3356 		blob = NULL;
3357 		goto fail;
3358 	}
3359 
3360 	/* Prepare GAMMA_LUT with the legacy values. */
3361 	blob_data = (struct drm_color_lut *) blob->data;
3362 	for (i = 0; i < size; i++) {
3363 		blob_data[i].red = red[i];
3364 		blob_data[i].green = green[i];
3365 		blob_data[i].blue = blue[i];
3366 	}
3367 
3368 	state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
3369 retry:
3370 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
3371 	if (IS_ERR(crtc_state)) {
3372 		ret = PTR_ERR(crtc_state);
3373 		goto fail;
3374 	}
3375 
3376 	/* Reset DEGAMMA_LUT and CTM properties. */
3377 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
3378 			config->degamma_lut_property, 0);
3379 	if (ret)
3380 		goto fail;
3381 
3382 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
3383 			config->ctm_property, 0);
3384 	if (ret)
3385 		goto fail;
3386 
3387 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
3388 			config->gamma_lut_property, blob->base.id);
3389 	if (ret)
3390 		goto fail;
3391 
3392 	ret = drm_atomic_commit(state);
3393 	if (ret)
3394 		goto fail;
3395 
3396 	/* Driver takes ownership of state on successful commit. */
3397 
3398 	drm_property_unreference_blob(blob);
3399 
3400 	return 0;
3401 fail:
3402 	if (ret == -EDEADLK)
3403 		goto backoff;
3404 
3405 	drm_atomic_state_free(state);
3406 	drm_property_unreference_blob(blob);
3407 
3408 	return ret;
3409 backoff:
3410 	drm_atomic_state_clear(state);
3411 	drm_atomic_legacy_backoff(state);
3412 
3413 	goto retry;
3414 }
3415 EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);
3416