xref: /linux/drivers/gpu/drm/drm_atomic_helper.c (revision 042652ed95996a9ef6dcddddc53b5d8bc7fa887e)
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 
34 static void
35 drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
36 				struct drm_plane_state *plane_state,
37 				struct drm_plane *plane)
38 {
39 	struct drm_crtc_state *crtc_state;
40 
41 	if (plane->state->crtc) {
42 		crtc_state = state->crtc_states[drm_crtc_index(plane->crtc)];
43 
44 		if (WARN_ON(!crtc_state))
45 			return;
46 
47 		crtc_state->planes_changed = true;
48 	}
49 
50 	if (plane_state->crtc) {
51 		crtc_state =
52 			state->crtc_states[drm_crtc_index(plane_state->crtc)];
53 
54 		if (WARN_ON(!crtc_state))
55 			return;
56 
57 		crtc_state->planes_changed = true;
58 	}
59 }
60 
61 static struct drm_crtc *
62 get_current_crtc_for_encoder(struct drm_device *dev,
63 			     struct drm_encoder *encoder)
64 {
65 	struct drm_mode_config *config = &dev->mode_config;
66 	struct drm_connector *connector;
67 
68 	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
69 
70 	list_for_each_entry(connector, &config->connector_list, head) {
71 		if (connector->state->best_encoder != encoder)
72 			continue;
73 
74 		return connector->state->crtc;
75 	}
76 
77 	return NULL;
78 }
79 
80 static int
81 steal_encoder(struct drm_atomic_state *state,
82 	      struct drm_encoder *encoder,
83 	      struct drm_crtc *encoder_crtc)
84 {
85 	struct drm_mode_config *config = &state->dev->mode_config;
86 	struct drm_crtc_state *crtc_state;
87 	struct drm_connector *connector;
88 	struct drm_connector_state *connector_state;
89 	int ret;
90 
91 	/*
92 	 * We can only steal an encoder coming from a connector, which means we
93 	 * must already hold the connection_mutex.
94 	 */
95 	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
96 
97 	DRM_DEBUG_KMS("[ENCODER:%d:%s] in use on [CRTC:%d], stealing it\n",
98 		      encoder->base.id, encoder->name,
99 		      encoder_crtc->base.id);
100 
101 	crtc_state = drm_atomic_get_crtc_state(state, encoder_crtc);
102 	if (IS_ERR(crtc_state))
103 		return PTR_ERR(crtc_state);
104 
105 	crtc_state->mode_changed = true;
106 
107 	list_for_each_entry(connector, &config->connector_list, head) {
108 		if (connector->state->best_encoder != encoder)
109 			continue;
110 
111 		DRM_DEBUG_KMS("Stealing encoder from [CONNECTOR:%d:%s]\n",
112 			      connector->base.id,
113 			      connector->name);
114 
115 		connector_state = drm_atomic_get_connector_state(state,
116 								 connector);
117 		if (IS_ERR(connector_state))
118 			return PTR_ERR(connector_state);
119 
120 		ret = drm_atomic_set_crtc_for_connector(connector_state, NULL);
121 		if (ret)
122 			return ret;
123 		connector_state->best_encoder = NULL;
124 	}
125 
126 	return 0;
127 }
128 
129 static int
130 update_connector_routing(struct drm_atomic_state *state, int conn_idx)
131 {
132 	struct drm_connector_helper_funcs *funcs;
133 	struct drm_encoder *new_encoder;
134 	struct drm_crtc *encoder_crtc;
135 	struct drm_connector *connector;
136 	struct drm_connector_state *connector_state;
137 	struct drm_crtc_state *crtc_state;
138 	int idx, ret;
139 
140 	connector = state->connectors[conn_idx];
141 	connector_state = state->connector_states[conn_idx];
142 
143 	if (!connector)
144 		return 0;
145 
146 	DRM_DEBUG_KMS("Updating routing for [CONNECTOR:%d:%s]\n",
147 			connector->base.id,
148 			connector->name);
149 
150 	if (connector->state->crtc != connector_state->crtc) {
151 		if (connector->state->crtc) {
152 			idx = drm_crtc_index(connector->state->crtc);
153 
154 			crtc_state = state->crtc_states[idx];
155 			crtc_state->mode_changed = true;
156 		}
157 
158 		if (connector_state->crtc) {
159 			idx = drm_crtc_index(connector_state->crtc);
160 
161 			crtc_state = state->crtc_states[idx];
162 			crtc_state->mode_changed = true;
163 		}
164 	}
165 
166 	if (!connector_state->crtc) {
167 		DRM_DEBUG_KMS("Disabling [CONNECTOR:%d:%s]\n",
168 				connector->base.id,
169 				connector->name);
170 
171 		connector_state->best_encoder = NULL;
172 
173 		return 0;
174 	}
175 
176 	funcs = connector->helper_private;
177 	new_encoder = funcs->best_encoder(connector);
178 
179 	if (!new_encoder) {
180 		DRM_DEBUG_KMS("No suitable encoder found for [CONNECTOR:%d:%s]\n",
181 			      connector->base.id,
182 			      connector->name);
183 		return -EINVAL;
184 	}
185 
186 	if (new_encoder == connector_state->best_encoder) {
187 		DRM_DEBUG_KMS("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d]\n",
188 			      connector->base.id,
189 			      connector->name,
190 			      new_encoder->base.id,
191 			      new_encoder->name,
192 			      connector_state->crtc->base.id);
193 
194 		return 0;
195 	}
196 
197 	encoder_crtc = get_current_crtc_for_encoder(state->dev,
198 						    new_encoder);
199 
200 	if (encoder_crtc) {
201 		ret = steal_encoder(state, new_encoder, encoder_crtc);
202 		if (ret) {
203 			DRM_DEBUG_KMS("Encoder stealing failed for [CONNECTOR:%d:%s]\n",
204 				      connector->base.id,
205 				      connector->name);
206 			return ret;
207 		}
208 	}
209 
210 	connector_state->best_encoder = new_encoder;
211 	idx = drm_crtc_index(connector_state->crtc);
212 
213 	crtc_state = state->crtc_states[idx];
214 	crtc_state->mode_changed = true;
215 
216 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d]\n",
217 		      connector->base.id,
218 		      connector->name,
219 		      new_encoder->base.id,
220 		      new_encoder->name,
221 		      connector_state->crtc->base.id);
222 
223 	return 0;
224 }
225 
226 static int
227 mode_fixup(struct drm_atomic_state *state)
228 {
229 	int ncrtcs = state->dev->mode_config.num_crtc;
230 	int nconnectors = state->dev->mode_config.num_connector;
231 	struct drm_crtc_state *crtc_state;
232 	struct drm_connector_state *conn_state;
233 	int i;
234 	bool ret;
235 
236 	for (i = 0; i < ncrtcs; i++) {
237 		crtc_state = state->crtc_states[i];
238 
239 		if (!crtc_state || !crtc_state->mode_changed)
240 			continue;
241 
242 		drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode);
243 	}
244 
245 	for (i = 0; i < nconnectors; i++) {
246 		struct drm_encoder_helper_funcs *funcs;
247 		struct drm_encoder *encoder;
248 
249 		conn_state = state->connector_states[i];
250 
251 		if (!conn_state)
252 			continue;
253 
254 		WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc);
255 
256 		if (!conn_state->crtc || !conn_state->best_encoder)
257 			continue;
258 
259 		crtc_state =
260 			state->crtc_states[drm_crtc_index(conn_state->crtc)];
261 
262 		/*
263 		 * Each encoder has at most one connector (since we always steal
264 		 * it away), so we won't call ->mode_fixup twice.
265 		 */
266 		encoder = conn_state->best_encoder;
267 		funcs = encoder->helper_private;
268 
269 		if (encoder->bridge && encoder->bridge->funcs->mode_fixup) {
270 			ret = encoder->bridge->funcs->mode_fixup(
271 					encoder->bridge, &crtc_state->mode,
272 					&crtc_state->adjusted_mode);
273 			if (!ret) {
274 				DRM_DEBUG_KMS("Bridge fixup failed\n");
275 				return -EINVAL;
276 			}
277 		}
278 
279 
280 		ret = funcs->mode_fixup(encoder, &crtc_state->mode,
281 					&crtc_state->adjusted_mode);
282 		if (!ret) {
283 			DRM_DEBUG_KMS("[ENCODER:%d:%s] fixup failed\n",
284 				      encoder->base.id, encoder->name);
285 			return -EINVAL;
286 		}
287 	}
288 
289 	for (i = 0; i < ncrtcs; i++) {
290 		struct drm_crtc_helper_funcs *funcs;
291 		struct drm_crtc *crtc;
292 
293 		crtc_state = state->crtc_states[i];
294 		crtc = state->crtcs[i];
295 
296 		if (!crtc_state || !crtc_state->mode_changed)
297 			continue;
298 
299 		funcs = crtc->helper_private;
300 		ret = funcs->mode_fixup(crtc, &crtc_state->mode,
301 					&crtc_state->adjusted_mode);
302 		if (!ret) {
303 			DRM_DEBUG_KMS("[CRTC:%d] fixup failed\n",
304 				      crtc->base.id);
305 			return -EINVAL;
306 		}
307 	}
308 
309 	return 0;
310 }
311 
312 static int
313 drm_atomic_helper_check_prepare(struct drm_device *dev,
314 				struct drm_atomic_state *state)
315 {
316 	int ncrtcs = dev->mode_config.num_crtc;
317 	int nconnectors = dev->mode_config.num_connector;
318 	struct drm_crtc *crtc;
319 	struct drm_crtc_state *crtc_state;
320 	int i, ret;
321 
322 	for (i = 0; i < ncrtcs; i++) {
323 		crtc = state->crtcs[i];
324 		crtc_state = state->crtc_states[i];
325 
326 		if (!crtc)
327 			continue;
328 
329 		if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) {
330 			DRM_DEBUG_KMS("[CRTC:%d] mode changed\n",
331 				      crtc->base.id);
332 			crtc_state->mode_changed = true;
333 		}
334 
335 		if (crtc->state->enable != crtc_state->enable) {
336 			DRM_DEBUG_KMS("[CRTC:%d] enable changed\n",
337 				      crtc->base.id);
338 			crtc_state->mode_changed = true;
339 		}
340 	}
341 
342 	for (i = 0; i < nconnectors; i++) {
343 		/*
344 		 * This only sets crtc->mode_changed for routing changes,
345 		 * drivers must set crtc->mode_changed themselves when connector
346 		 * properties need to be updated.
347 		 */
348 		ret = update_connector_routing(state, i);
349 		if (ret)
350 			return ret;
351 	}
352 
353 	/*
354 	 * After all the routing has been prepared we need to add in any
355 	 * connector which is itself unchanged, but who's crtc changes it's
356 	 * configuration. This must be done before calling mode_fixup in case a
357 	 * crtc only changed its mode but has the same set of connectors.
358 	 */
359 	for (i = 0; i < ncrtcs; i++) {
360 		int num_connectors;
361 
362 		crtc = state->crtcs[i];
363 		crtc_state = state->crtc_states[i];
364 
365 		if (!crtc || !crtc_state->mode_changed)
366 			continue;
367 
368 		DRM_DEBUG_KMS("[CRTC:%d] needs full modeset, enable: %c\n",
369 			      crtc->base.id,
370 			      crtc_state->enable ? 'y' : 'n');
371 
372 		ret = drm_atomic_add_affected_connectors(state, crtc);
373 		if (ret != 0)
374 			return ret;
375 
376 		num_connectors = drm_atomic_connectors_for_crtc(state,
377 								crtc);
378 
379 		if (crtc_state->enable != !!num_connectors) {
380 			DRM_DEBUG_KMS("[CRTC:%d] enabled/connectors mismatch\n",
381 				      crtc->base.id);
382 
383 			return -EINVAL;
384 		}
385 	}
386 
387 	return mode_fixup(state);
388 }
389 
390 /**
391  * drm_atomic_helper_check - validate state object
392  * @dev: DRM device
393  * @state: the driver state object
394  *
395  * Check the state object to see if the requested state is physically possible.
396  * Only crtcs and planes have check callbacks, so for any additional (global)
397  * checking that a driver needs it can simply wrap that around this function.
398  * Drivers without such needs can directly use this as their ->atomic_check()
399  * callback.
400  *
401  * RETURNS
402  * Zero for success or -errno
403  */
404 int drm_atomic_helper_check(struct drm_device *dev,
405 			    struct drm_atomic_state *state)
406 {
407 	int nplanes = dev->mode_config.num_total_plane;
408 	int ncrtcs = dev->mode_config.num_crtc;
409 	int i, ret = 0;
410 
411 	ret = drm_atomic_helper_check_prepare(dev, state);
412 	if (ret)
413 		return ret;
414 
415 	for (i = 0; i < nplanes; i++) {
416 		struct drm_plane_helper_funcs *funcs;
417 		struct drm_plane *plane = state->planes[i];
418 		struct drm_plane_state *plane_state = state->plane_states[i];
419 
420 		if (!plane)
421 			continue;
422 
423 		funcs = plane->helper_private;
424 
425 		drm_atomic_helper_plane_changed(state, plane_state, plane);
426 
427 		if (!funcs || !funcs->atomic_check)
428 			continue;
429 
430 		ret = funcs->atomic_check(plane, plane_state);
431 		if (ret) {
432 			DRM_DEBUG_KMS("[PLANE:%d] atomic check failed\n",
433 				      plane->base.id);
434 			return ret;
435 		}
436 	}
437 
438 	for (i = 0; i < ncrtcs; i++) {
439 		struct drm_crtc_helper_funcs *funcs;
440 		struct drm_crtc *crtc = state->crtcs[i];
441 
442 		if (!crtc)
443 			continue;
444 
445 		funcs = crtc->helper_private;
446 
447 		if (!funcs || !funcs->atomic_check)
448 			continue;
449 
450 		ret = funcs->atomic_check(crtc, state->crtc_states[i]);
451 		if (ret) {
452 			DRM_DEBUG_KMS("[CRTC:%d] atomic check failed\n",
453 				      crtc->base.id);
454 			return ret;
455 		}
456 	}
457 
458 	return ret;
459 }
460 EXPORT_SYMBOL(drm_atomic_helper_check);
461 
462 static void
463 disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
464 {
465 	int ncrtcs = old_state->dev->mode_config.num_crtc;
466 	int nconnectors = old_state->dev->mode_config.num_connector;
467 	int i;
468 
469 	for (i = 0; i < nconnectors; i++) {
470 		struct drm_connector_state *old_conn_state;
471 		struct drm_connector *connector;
472 		struct drm_encoder_helper_funcs *funcs;
473 		struct drm_encoder *encoder;
474 
475 		old_conn_state = old_state->connector_states[i];
476 		connector = old_state->connectors[i];
477 
478 		/* Shut down everything that's in the changeset and currently
479 		 * still on. So need to check the old, saved state. */
480 		if (!old_conn_state || !old_conn_state->crtc)
481 			continue;
482 
483 		encoder = connector->state->best_encoder;
484 
485 		if (!encoder)
486 			continue;
487 
488 		funcs = encoder->helper_private;
489 
490 		/*
491 		 * Each encoder has at most one connector (since we always steal
492 		 * it away), so we won't call call disable hooks twice.
493 		 */
494 		if (encoder->bridge)
495 			encoder->bridge->funcs->disable(encoder->bridge);
496 
497 		/* Right function depends upon target state. */
498 		if (connector->state->crtc)
499 			funcs->prepare(encoder);
500 		else if (funcs->disable)
501 			funcs->disable(encoder);
502 		else
503 			funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
504 
505 		if (encoder->bridge)
506 			encoder->bridge->funcs->post_disable(encoder->bridge);
507 	}
508 
509 	for (i = 0; i < ncrtcs; i++) {
510 		struct drm_crtc_helper_funcs *funcs;
511 		struct drm_crtc *crtc;
512 
513 		crtc = old_state->crtcs[i];
514 
515 		/* Shut down everything that needs a full modeset. */
516 		if (!crtc || !crtc->state->mode_changed)
517 			continue;
518 
519 		funcs = crtc->helper_private;
520 
521 		/* Right function depends upon target state. */
522 		if (crtc->state->enable)
523 			funcs->prepare(crtc);
524 		else if (funcs->disable)
525 			funcs->disable(crtc);
526 		else
527 			funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
528 	}
529 }
530 
531 static void
532 set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
533 {
534 	int nconnectors = dev->mode_config.num_connector;
535 	int ncrtcs = old_state->dev->mode_config.num_crtc;
536 	int i;
537 
538 	/* clear out existing links */
539 	for (i = 0; i < nconnectors; i++) {
540 		struct drm_connector *connector;
541 
542 		connector = old_state->connectors[i];
543 
544 		if (!connector || !connector->encoder)
545 			continue;
546 
547 		WARN_ON(!connector->encoder->crtc);
548 
549 		connector->encoder->crtc = NULL;
550 		connector->encoder = NULL;
551 	}
552 
553 	/* set new links */
554 	for (i = 0; i < nconnectors; i++) {
555 		struct drm_connector *connector;
556 
557 		connector = old_state->connectors[i];
558 
559 		if (!connector || !connector->state->crtc)
560 			continue;
561 
562 		if (WARN_ON(!connector->state->best_encoder))
563 			continue;
564 
565 		connector->encoder = connector->state->best_encoder;
566 		connector->encoder->crtc = connector->state->crtc;
567 	}
568 
569 	/* set legacy state in the crtc structure */
570 	for (i = 0; i < ncrtcs; i++) {
571 		struct drm_crtc *crtc;
572 
573 		crtc = old_state->crtcs[i];
574 
575 		if (!crtc)
576 			continue;
577 
578 		crtc->mode = crtc->state->mode;
579 		crtc->enabled = crtc->state->enable;
580 		crtc->x = crtc->primary->state->src_x >> 16;
581 		crtc->y = crtc->primary->state->src_y >> 16;
582 	}
583 }
584 
585 static void
586 crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
587 {
588 	int ncrtcs = old_state->dev->mode_config.num_crtc;
589 	int nconnectors = old_state->dev->mode_config.num_connector;
590 	int i;
591 
592 	for (i = 0; i < ncrtcs; i++) {
593 		struct drm_crtc_helper_funcs *funcs;
594 		struct drm_crtc *crtc;
595 
596 		crtc = old_state->crtcs[i];
597 
598 		if (!crtc || !crtc->state->mode_changed)
599 			continue;
600 
601 		funcs = crtc->helper_private;
602 
603 		if (crtc->state->enable)
604 			funcs->mode_set_nofb(crtc);
605 	}
606 
607 	for (i = 0; i < nconnectors; i++) {
608 		struct drm_connector *connector;
609 		struct drm_crtc_state *new_crtc_state;
610 		struct drm_encoder_helper_funcs *funcs;
611 		struct drm_encoder *encoder;
612 		struct drm_display_mode *mode, *adjusted_mode;
613 
614 		connector = old_state->connectors[i];
615 
616 		if (!connector || !connector->state->best_encoder)
617 			continue;
618 
619 		encoder = connector->state->best_encoder;
620 		funcs = encoder->helper_private;
621 		new_crtc_state = connector->state->crtc->state;
622 		mode = &new_crtc_state->mode;
623 		adjusted_mode = &new_crtc_state->adjusted_mode;
624 
625 		/*
626 		 * Each encoder has at most one connector (since we always steal
627 		 * it away), so we won't call call mode_set hooks twice.
628 		 */
629 		funcs->mode_set(encoder, mode, adjusted_mode);
630 
631 		if (encoder->bridge && encoder->bridge->funcs->mode_set)
632 			encoder->bridge->funcs->mode_set(encoder->bridge,
633 							 mode, adjusted_mode);
634 	}
635 }
636 
637 /**
638  * drm_atomic_helper_commit_pre_planes - modeset commit before plane updates
639  * @dev: DRM device
640  * @state: atomic state
641  *
642  * This function commits the modeset changes that need to be committed before
643  * updating planes. It shuts down all the outputs that need to be shut down and
644  * prepares them (if required) with the new mode.
645  */
646 void drm_atomic_helper_commit_pre_planes(struct drm_device *dev,
647 					 struct drm_atomic_state *state)
648 {
649 	disable_outputs(dev, state);
650 	set_routing_links(dev, state);
651 	crtc_set_mode(dev, state);
652 }
653 EXPORT_SYMBOL(drm_atomic_helper_commit_pre_planes);
654 
655 /**
656  * drm_atomic_helper_commit_post_planes - modeset commit after plane updates
657  * @dev: DRM device
658  * @old_state: atomic state object with old state structures
659  *
660  * This function commits the modeset changes that need to be committed after
661  * updating planes: It enables all the outputs with the new configuration which
662  * had to be turned off for the update.
663  */
664 void drm_atomic_helper_commit_post_planes(struct drm_device *dev,
665 					  struct drm_atomic_state *old_state)
666 {
667 	int ncrtcs = old_state->dev->mode_config.num_crtc;
668 	int nconnectors = old_state->dev->mode_config.num_connector;
669 	int i;
670 
671 	for (i = 0; i < ncrtcs; i++) {
672 		struct drm_crtc_helper_funcs *funcs;
673 		struct drm_crtc *crtc;
674 
675 		crtc = old_state->crtcs[i];
676 
677 		/* Need to filter out CRTCs where only planes change. */
678 		if (!crtc || !crtc->state->mode_changed)
679 			continue;
680 
681 		funcs = crtc->helper_private;
682 
683 		if (crtc->state->enable)
684 			funcs->commit(crtc);
685 	}
686 
687 	for (i = 0; i < nconnectors; i++) {
688 		struct drm_connector *connector;
689 		struct drm_encoder_helper_funcs *funcs;
690 		struct drm_encoder *encoder;
691 
692 		connector = old_state->connectors[i];
693 
694 		if (!connector || !connector->state->best_encoder)
695 			continue;
696 
697 		encoder = connector->state->best_encoder;
698 		funcs = encoder->helper_private;
699 
700 		/*
701 		 * Each encoder has at most one connector (since we always steal
702 		 * it away), so we won't call call enable hooks twice.
703 		 */
704 		if (encoder->bridge)
705 			encoder->bridge->funcs->pre_enable(encoder->bridge);
706 
707 		funcs->commit(encoder);
708 
709 		if (encoder->bridge)
710 			encoder->bridge->funcs->enable(encoder->bridge);
711 	}
712 }
713 EXPORT_SYMBOL(drm_atomic_helper_commit_post_planes);
714 
715 static void
716 wait_for_vblanks(struct drm_device *dev, struct drm_atomic_state *old_state)
717 {
718 	struct drm_crtc *crtc;
719 	struct drm_crtc_state *old_crtc_state;
720 	int ncrtcs = old_state->dev->mode_config.num_crtc;
721 	int i, ret;
722 
723 	for (i = 0; i < ncrtcs; i++) {
724 		crtc = old_state->crtcs[i];
725 		old_crtc_state = old_state->crtc_states[i];
726 
727 		if (!crtc)
728 			continue;
729 
730 		/* No one cares about the old state, so abuse it for tracking
731 		 * and store whether we hold a vblank reference (and should do a
732 		 * vblank wait) in the ->enable boolean. */
733 		old_crtc_state->enable = false;
734 
735 		if (!crtc->state->enable)
736 			continue;
737 
738 		ret = drm_crtc_vblank_get(crtc);
739 		if (ret != 0)
740 			continue;
741 
742 		old_crtc_state->enable = true;
743 		old_crtc_state->last_vblank_count = drm_vblank_count(dev, i);
744 	}
745 
746 	for (i = 0; i < ncrtcs; i++) {
747 		crtc = old_state->crtcs[i];
748 		old_crtc_state = old_state->crtc_states[i];
749 
750 		if (!crtc || !old_crtc_state->enable)
751 			continue;
752 
753 		ret = wait_event_timeout(dev->vblank[i].queue,
754 				old_crtc_state->last_vblank_count !=
755 					drm_vblank_count(dev, i),
756 				msecs_to_jiffies(50));
757 
758 		drm_crtc_vblank_put(crtc);
759 	}
760 }
761 
762 /**
763  * drm_atomic_helper_commit - commit validated state object
764  * @dev: DRM device
765  * @state: the driver state object
766  * @async: asynchronous commit
767  *
768  * This function commits a with drm_atomic_helper_check() pre-validated state
769  * object. This can still fail when e.g. the framebuffer reservation fails. For
770  * now this doesn't implement asynchronous commits.
771  *
772  * RETURNS
773  * Zero for success or -errno.
774  */
775 int drm_atomic_helper_commit(struct drm_device *dev,
776 			     struct drm_atomic_state *state,
777 			     bool async)
778 {
779 	int ret;
780 
781 	if (async)
782 		return -EBUSY;
783 
784 	ret = drm_atomic_helper_prepare_planes(dev, state);
785 	if (ret)
786 		return ret;
787 
788 	/*
789 	 * This is the point of no return - everything below never fails except
790 	 * when the hw goes bonghits. Which means we can commit the new state on
791 	 * the software side now.
792 	 */
793 
794 	drm_atomic_helper_swap_state(dev, state);
795 
796 	/*
797 	 * Everything below can be run asynchronously without the need to grab
798 	 * any modeset locks at all under one conditions: It must be guaranteed
799 	 * that the asynchronous work has either been cancelled (if the driver
800 	 * supports it, which at least requires that the framebuffers get
801 	 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
802 	 * before the new state gets committed on the software side with
803 	 * drm_atomic_helper_swap_state().
804 	 *
805 	 * This scheme allows new atomic state updates to be prepared and
806 	 * checked in parallel to the asynchronous completion of the previous
807 	 * update. Which is important since compositors need to figure out the
808 	 * composition of the next frame right after having submitted the
809 	 * current layout.
810 	 */
811 
812 	drm_atomic_helper_commit_pre_planes(dev, state);
813 
814 	drm_atomic_helper_commit_planes(dev, state);
815 
816 	drm_atomic_helper_commit_post_planes(dev, state);
817 
818 	wait_for_vblanks(dev, state);
819 
820 	drm_atomic_helper_cleanup_planes(dev, state);
821 
822 	drm_atomic_state_free(state);
823 
824 	return 0;
825 }
826 EXPORT_SYMBOL(drm_atomic_helper_commit);
827 
828 /**
829  * drm_atomic_helper_prepare_planes - prepare plane resources after commit
830  * @dev: DRM device
831  * @state: atomic state object with old state structures
832  *
833  * This function prepares plane state, specifically framebuffers, for the new
834  * configuration. If any failure is encountered this function will call
835  * ->cleanup_fb on any already successfully prepared framebuffer.
836  *
837  * Returns:
838  * 0 on success, negative error code on failure.
839  */
840 int drm_atomic_helper_prepare_planes(struct drm_device *dev,
841 				     struct drm_atomic_state *state)
842 {
843 	int nplanes = dev->mode_config.num_total_plane;
844 	int ret, i;
845 
846 	for (i = 0; i < nplanes; i++) {
847 		struct drm_plane_helper_funcs *funcs;
848 		struct drm_plane *plane = state->planes[i];
849 		struct drm_framebuffer *fb;
850 
851 		if (!plane)
852 			continue;
853 
854 		funcs = plane->helper_private;
855 
856 		fb = state->plane_states[i]->fb;
857 
858 		if (fb && funcs->prepare_fb) {
859 			ret = funcs->prepare_fb(plane, fb);
860 			if (ret)
861 				goto fail;
862 		}
863 	}
864 
865 	return 0;
866 
867 fail:
868 	for (i--; i >= 0; i--) {
869 		struct drm_plane_helper_funcs *funcs;
870 		struct drm_plane *plane = state->planes[i];
871 		struct drm_framebuffer *fb;
872 
873 		if (!plane)
874 			continue;
875 
876 		funcs = plane->helper_private;
877 
878 		fb = state->plane_states[i]->fb;
879 
880 		if (fb && funcs->cleanup_fb)
881 			funcs->cleanup_fb(plane, fb);
882 
883 	}
884 
885 	return ret;
886 }
887 EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
888 
889 /**
890  * drm_atomic_helper_commit_planes - commit plane state
891  * @dev: DRM device
892  * @state: atomic state
893  *
894  * This function commits the new plane state using the plane and atomic helper
895  * functions for planes and crtcs. It assumes that the atomic state has already
896  * been pushed into the relevant object state pointers, since this step can no
897  * longer fail.
898  *
899  * It still requires the global state object @state to know which planes and
900  * crtcs need to be updated though.
901  */
902 void drm_atomic_helper_commit_planes(struct drm_device *dev,
903 				     struct drm_atomic_state *state)
904 {
905 	int nplanes = dev->mode_config.num_total_plane;
906 	int ncrtcs = dev->mode_config.num_crtc;
907 	int i;
908 
909 	for (i = 0; i < ncrtcs; i++) {
910 		struct drm_crtc_helper_funcs *funcs;
911 		struct drm_crtc *crtc = state->crtcs[i];
912 
913 		if (!crtc)
914 			continue;
915 
916 		funcs = crtc->helper_private;
917 
918 		if (!funcs || !funcs->atomic_begin)
919 			continue;
920 
921 		funcs->atomic_begin(crtc);
922 	}
923 
924 	for (i = 0; i < nplanes; i++) {
925 		struct drm_plane_helper_funcs *funcs;
926 		struct drm_plane *plane = state->planes[i];
927 
928 		if (!plane)
929 			continue;
930 
931 		funcs = plane->helper_private;
932 
933 		if (!funcs || !funcs->atomic_update)
934 			continue;
935 
936 		funcs->atomic_update(plane);
937 	}
938 
939 	for (i = 0; i < ncrtcs; i++) {
940 		struct drm_crtc_helper_funcs *funcs;
941 		struct drm_crtc *crtc = state->crtcs[i];
942 
943 		if (!crtc)
944 			continue;
945 
946 		funcs = crtc->helper_private;
947 
948 		if (!funcs || !funcs->atomic_flush)
949 			continue;
950 
951 		funcs->atomic_flush(crtc);
952 	}
953 }
954 EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
955 
956 /**
957  * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
958  * @dev: DRM device
959  * @old_state: atomic state object with old state structures
960  *
961  * This function cleans up plane state, specifically framebuffers, from the old
962  * configuration. Hence the old configuration must be perserved in @old_state to
963  * be able to call this function.
964  *
965  * This function must also be called on the new state when the atomic update
966  * fails at any point after calling drm_atomic_helper_prepare_planes().
967  */
968 void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
969 				      struct drm_atomic_state *old_state)
970 {
971 	int nplanes = dev->mode_config.num_total_plane;
972 	int i;
973 
974 	for (i = 0; i < nplanes; i++) {
975 		struct drm_plane_helper_funcs *funcs;
976 		struct drm_plane *plane = old_state->planes[i];
977 		struct drm_framebuffer *old_fb;
978 
979 		if (!plane)
980 			continue;
981 
982 		funcs = plane->helper_private;
983 
984 		old_fb = old_state->plane_states[i]->fb;
985 
986 		if (old_fb && funcs->cleanup_fb)
987 			funcs->cleanup_fb(plane, old_fb);
988 	}
989 }
990 EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
991 
992 /**
993  * drm_atomic_helper_swap_state - store atomic state into current sw state
994  * @dev: DRM device
995  * @state: atomic state
996  *
997  * This function stores the atomic state into the current state pointers in all
998  * driver objects. It should be called after all failing steps have been done
999  * and succeeded, but before the actual hardware state is committed.
1000  *
1001  * For cleanup and error recovery the current state for all changed objects will
1002  * be swaped into @state.
1003  *
1004  * With that sequence it fits perfectly into the plane prepare/cleanup sequence:
1005  *
1006  * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state.
1007  *
1008  * 2. Do any other steps that might fail.
1009  *
1010  * 3. Put the staged state into the current state pointers with this function.
1011  *
1012  * 4. Actually commit the hardware state.
1013  *
1014  * 5. Call drm_atomic_helper_cleanup_planes with @state, which since step 3
1015  * contains the old state. Also do any other cleanup required with that state.
1016  */
1017 void drm_atomic_helper_swap_state(struct drm_device *dev,
1018 				  struct drm_atomic_state *state)
1019 {
1020 	int i;
1021 
1022 	for (i = 0; i < dev->mode_config.num_connector; i++) {
1023 		struct drm_connector *connector = state->connectors[i];
1024 
1025 		if (!connector)
1026 			continue;
1027 
1028 		connector->state->state = state;
1029 		swap(state->connector_states[i], connector->state);
1030 		connector->state->state = NULL;
1031 	}
1032 
1033 	for (i = 0; i < dev->mode_config.num_crtc; i++) {
1034 		struct drm_crtc *crtc = state->crtcs[i];
1035 
1036 		if (!crtc)
1037 			continue;
1038 
1039 		crtc->state->state = state;
1040 		swap(state->crtc_states[i], crtc->state);
1041 		crtc->state->state = NULL;
1042 	}
1043 
1044 	for (i = 0; i < dev->mode_config.num_total_plane; i++) {
1045 		struct drm_plane *plane = state->planes[i];
1046 
1047 		if (!plane)
1048 			continue;
1049 
1050 		plane->state->state = state;
1051 		swap(state->plane_states[i], plane->state);
1052 		plane->state->state = NULL;
1053 	}
1054 }
1055 EXPORT_SYMBOL(drm_atomic_helper_swap_state);
1056 
1057 /**
1058  * drm_atomic_helper_update_plane - Helper for primary plane update using atomic
1059  * @plane: plane object to update
1060  * @crtc: owning CRTC of owning plane
1061  * @fb: framebuffer to flip onto plane
1062  * @crtc_x: x offset of primary plane on crtc
1063  * @crtc_y: y offset of primary plane on crtc
1064  * @crtc_w: width of primary plane rectangle on crtc
1065  * @crtc_h: height of primary plane rectangle on crtc
1066  * @src_x: x offset of @fb for panning
1067  * @src_y: y offset of @fb for panning
1068  * @src_w: width of source rectangle in @fb
1069  * @src_h: height of source rectangle in @fb
1070  *
1071  * Provides a default plane update handler using the atomic driver interface.
1072  *
1073  * RETURNS:
1074  * Zero on success, error code on failure
1075  */
1076 int drm_atomic_helper_update_plane(struct drm_plane *plane,
1077 				   struct drm_crtc *crtc,
1078 				   struct drm_framebuffer *fb,
1079 				   int crtc_x, int crtc_y,
1080 				   unsigned int crtc_w, unsigned int crtc_h,
1081 				   uint32_t src_x, uint32_t src_y,
1082 				   uint32_t src_w, uint32_t src_h)
1083 {
1084 	struct drm_atomic_state *state;
1085 	struct drm_plane_state *plane_state;
1086 	int ret = 0;
1087 
1088 	state = drm_atomic_state_alloc(plane->dev);
1089 	if (!state)
1090 		return -ENOMEM;
1091 
1092 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
1093 retry:
1094 	plane_state = drm_atomic_get_plane_state(state, plane);
1095 	if (IS_ERR(plane_state)) {
1096 		ret = PTR_ERR(plane_state);
1097 		goto fail;
1098 	}
1099 
1100 	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
1101 	if (ret != 0)
1102 		goto fail;
1103 	plane_state->fb = fb;
1104 	plane_state->crtc_x = crtc_x;
1105 	plane_state->crtc_y = crtc_y;
1106 	plane_state->crtc_h = crtc_h;
1107 	plane_state->crtc_w = crtc_w;
1108 	plane_state->src_x = src_x;
1109 	plane_state->src_y = src_y;
1110 	plane_state->src_h = src_h;
1111 	plane_state->src_w = src_w;
1112 
1113 	ret = drm_atomic_commit(state);
1114 	if (ret != 0)
1115 		goto fail;
1116 
1117 	/* Driver takes ownership of state on successful commit. */
1118 	return 0;
1119 fail:
1120 	if (ret == -EDEADLK)
1121 		goto backoff;
1122 
1123 	drm_atomic_state_free(state);
1124 
1125 	return ret;
1126 backoff:
1127 	drm_atomic_legacy_backoff(state);
1128 	drm_atomic_state_clear(state);
1129 
1130 	/*
1131 	 * Someone might have exchanged the framebuffer while we dropped locks
1132 	 * in the backoff code. We need to fix up the fb refcount tracking the
1133 	 * core does for us.
1134 	 */
1135 	plane->old_fb = plane->fb;
1136 
1137 	goto retry;
1138 }
1139 EXPORT_SYMBOL(drm_atomic_helper_update_plane);
1140 
1141 /**
1142  * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic
1143  * @plane: plane to disable
1144  *
1145  * Provides a default plane disable handler using the atomic driver interface.
1146  *
1147  * RETURNS:
1148  * Zero on success, error code on failure
1149  */
1150 int drm_atomic_helper_disable_plane(struct drm_plane *plane)
1151 {
1152 	struct drm_atomic_state *state;
1153 	struct drm_plane_state *plane_state;
1154 	int ret = 0;
1155 
1156 	state = drm_atomic_state_alloc(plane->dev);
1157 	if (!state)
1158 		return -ENOMEM;
1159 
1160 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(plane->crtc);
1161 retry:
1162 	plane_state = drm_atomic_get_plane_state(state, plane);
1163 	if (IS_ERR(plane_state)) {
1164 		ret = PTR_ERR(plane_state);
1165 		goto fail;
1166 	}
1167 
1168 	ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
1169 	if (ret != 0)
1170 		goto fail;
1171 	plane_state->fb = NULL;
1172 	plane_state->crtc_x = 0;
1173 	plane_state->crtc_y = 0;
1174 	plane_state->crtc_h = 0;
1175 	plane_state->crtc_w = 0;
1176 	plane_state->src_x = 0;
1177 	plane_state->src_y = 0;
1178 	plane_state->src_h = 0;
1179 	plane_state->src_w = 0;
1180 
1181 	ret = drm_atomic_commit(state);
1182 	if (ret != 0)
1183 		goto fail;
1184 
1185 	/* Driver takes ownership of state on successful commit. */
1186 	return 0;
1187 fail:
1188 	if (ret == -EDEADLK)
1189 		goto backoff;
1190 
1191 	drm_atomic_state_free(state);
1192 
1193 	return ret;
1194 backoff:
1195 	drm_atomic_legacy_backoff(state);
1196 	drm_atomic_state_clear(state);
1197 
1198 	/*
1199 	 * Someone might have exchanged the framebuffer while we dropped locks
1200 	 * in the backoff code. We need to fix up the fb refcount tracking the
1201 	 * core does for us.
1202 	 */
1203 	plane->old_fb = plane->fb;
1204 
1205 	goto retry;
1206 }
1207 EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
1208 
1209 static int update_output_state(struct drm_atomic_state *state,
1210 			       struct drm_mode_set *set)
1211 {
1212 	struct drm_device *dev = set->crtc->dev;
1213 	struct drm_connector_state *conn_state;
1214 	int nconnectors = state->dev->mode_config.num_connector;
1215 	int ncrtcs = state->dev->mode_config.num_crtc;
1216 	int ret, i, j;
1217 
1218 	ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
1219 			       state->acquire_ctx);
1220 	if (ret)
1221 		return ret;
1222 
1223 	/* First grab all affected connector/crtc states. */
1224 	for (i = 0; i < set->num_connectors; i++) {
1225 		conn_state = drm_atomic_get_connector_state(state,
1226 							    set->connectors[i]);
1227 		if (IS_ERR(conn_state))
1228 			return PTR_ERR(conn_state);
1229 	}
1230 
1231 	for (i = 0; i < ncrtcs; i++) {
1232 		struct drm_crtc *crtc = state->crtcs[i];
1233 
1234 		if (!crtc)
1235 			continue;
1236 
1237 		ret = drm_atomic_add_affected_connectors(state, crtc);
1238 		if (ret)
1239 			return ret;
1240 	}
1241 
1242 	/* Then recompute connector->crtc links and crtc enabling state. */
1243 	for (i = 0; i < nconnectors; i++) {
1244 		struct drm_connector *connector;
1245 
1246 		connector = state->connectors[i];
1247 		conn_state = state->connector_states[i];
1248 
1249 		if (!connector)
1250 			continue;
1251 
1252 		if (conn_state->crtc == set->crtc) {
1253 			ret = drm_atomic_set_crtc_for_connector(conn_state,
1254 								NULL);
1255 			if (ret)
1256 				return ret;
1257 		}
1258 
1259 		for (j = 0; j < set->num_connectors; j++) {
1260 			if (set->connectors[j] == connector) {
1261 				ret = drm_atomic_set_crtc_for_connector(conn_state,
1262 									set->crtc);
1263 				if (ret)
1264 					return ret;
1265 				break;
1266 			}
1267 		}
1268 	}
1269 
1270 	for (i = 0; i < ncrtcs; i++) {
1271 		struct drm_crtc *crtc = state->crtcs[i];
1272 		struct drm_crtc_state *crtc_state = state->crtc_states[i];
1273 
1274 		if (!crtc)
1275 			continue;
1276 
1277 		/* Don't update ->enable for the CRTC in the set_config request,
1278 		 * since a mismatch would indicate a bug in the upper layers.
1279 		 * The actual modeset code later on will catch any
1280 		 * inconsistencies here. */
1281 		if (crtc == set->crtc)
1282 			continue;
1283 
1284 		crtc_state->enable =
1285 			drm_atomic_connectors_for_crtc(state, crtc);
1286 	}
1287 
1288 	return 0;
1289 }
1290 
1291 /**
1292  * drm_atomic_helper_set_config - set a new config from userspace
1293  * @set: mode set configuration
1294  *
1295  * Provides a default crtc set_config handler using the atomic driver interface.
1296  *
1297  * Returns:
1298  * Returns 0 on success, negative errno numbers on failure.
1299  */
1300 int drm_atomic_helper_set_config(struct drm_mode_set *set)
1301 {
1302 	struct drm_atomic_state *state;
1303 	struct drm_crtc *crtc = set->crtc;
1304 	struct drm_crtc_state *crtc_state;
1305 	struct drm_plane_state *primary_state;
1306 	int ret = 0;
1307 
1308 	state = drm_atomic_state_alloc(crtc->dev);
1309 	if (!state)
1310 		return -ENOMEM;
1311 
1312 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
1313 retry:
1314 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
1315 	if (IS_ERR(crtc_state)) {
1316 		ret = PTR_ERR(crtc_state);
1317 		goto fail;
1318 	}
1319 
1320 	if (!set->mode) {
1321 		WARN_ON(set->fb);
1322 		WARN_ON(set->num_connectors);
1323 
1324 		crtc_state->enable = false;
1325 		goto commit;
1326 	}
1327 
1328 	WARN_ON(!set->fb);
1329 	WARN_ON(!set->num_connectors);
1330 
1331 	crtc_state->enable = true;
1332 	drm_mode_copy(&crtc_state->mode, set->mode);
1333 
1334 	primary_state = drm_atomic_get_plane_state(state, crtc->primary);
1335 	if (IS_ERR(primary_state)) {
1336 		ret = PTR_ERR(primary_state);
1337 		goto fail;
1338 	}
1339 
1340 	ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
1341 	if (ret != 0)
1342 		goto fail;
1343 	primary_state->fb = set->fb;
1344 	primary_state->crtc_x = 0;
1345 	primary_state->crtc_y = 0;
1346 	primary_state->crtc_h = set->mode->vdisplay;
1347 	primary_state->crtc_w = set->mode->hdisplay;
1348 	primary_state->src_x = set->x << 16;
1349 	primary_state->src_y = set->y << 16;
1350 	primary_state->src_h = set->mode->vdisplay << 16;
1351 	primary_state->src_w = set->mode->hdisplay << 16;
1352 
1353 commit:
1354 	ret = update_output_state(state, set);
1355 	if (ret)
1356 		goto fail;
1357 
1358 	ret = drm_atomic_commit(state);
1359 	if (ret != 0)
1360 		goto fail;
1361 
1362 	/* Driver takes ownership of state on successful commit. */
1363 	return 0;
1364 fail:
1365 	if (ret == -EDEADLK)
1366 		goto backoff;
1367 
1368 	drm_atomic_state_free(state);
1369 
1370 	return ret;
1371 backoff:
1372 	drm_atomic_legacy_backoff(state);
1373 	drm_atomic_state_clear(state);
1374 
1375 	/*
1376 	 * Someone might have exchanged the framebuffer while we dropped locks
1377 	 * in the backoff code. We need to fix up the fb refcount tracking the
1378 	 * core does for us.
1379 	 */
1380 	crtc->primary->old_fb = crtc->primary->fb;
1381 
1382 	goto retry;
1383 }
1384 EXPORT_SYMBOL(drm_atomic_helper_set_config);
1385 
1386 /**
1387  * drm_atomic_helper_crtc_set_property - helper for crtc prorties
1388  * @crtc: DRM crtc
1389  * @property: DRM property
1390  * @val: value of property
1391  *
1392  * Provides a default plane disablle handler using the atomic driver interface.
1393  *
1394  * RETURNS:
1395  * Zero on success, error code on failure
1396  */
1397 int
1398 drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc,
1399 				    struct drm_property *property,
1400 				    uint64_t val)
1401 {
1402 	struct drm_atomic_state *state;
1403 	struct drm_crtc_state *crtc_state;
1404 	int ret = 0;
1405 
1406 	state = drm_atomic_state_alloc(crtc->dev);
1407 	if (!state)
1408 		return -ENOMEM;
1409 
1410 	/* ->set_property is always called with all locks held. */
1411 	state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
1412 retry:
1413 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
1414 	if (IS_ERR(crtc_state)) {
1415 		ret = PTR_ERR(crtc_state);
1416 		goto fail;
1417 	}
1418 
1419 	ret = crtc->funcs->atomic_set_property(crtc, crtc_state,
1420 					       property, val);
1421 	if (ret)
1422 		goto fail;
1423 
1424 	ret = drm_atomic_commit(state);
1425 	if (ret != 0)
1426 		goto fail;
1427 
1428 	/* Driver takes ownership of state on successful commit. */
1429 	return 0;
1430 fail:
1431 	if (ret == -EDEADLK)
1432 		goto backoff;
1433 
1434 	drm_atomic_state_free(state);
1435 
1436 	return ret;
1437 backoff:
1438 	drm_atomic_legacy_backoff(state);
1439 	drm_atomic_state_clear(state);
1440 
1441 	goto retry;
1442 }
1443 EXPORT_SYMBOL(drm_atomic_helper_crtc_set_property);
1444 
1445 /**
1446  * drm_atomic_helper_plane_set_property - helper for plane prorties
1447  * @plane: DRM plane
1448  * @property: DRM property
1449  * @val: value of property
1450  *
1451  * Provides a default plane disable handler using the atomic driver interface.
1452  *
1453  * RETURNS:
1454  * Zero on success, error code on failure
1455  */
1456 int
1457 drm_atomic_helper_plane_set_property(struct drm_plane *plane,
1458 				    struct drm_property *property,
1459 				    uint64_t val)
1460 {
1461 	struct drm_atomic_state *state;
1462 	struct drm_plane_state *plane_state;
1463 	int ret = 0;
1464 
1465 	state = drm_atomic_state_alloc(plane->dev);
1466 	if (!state)
1467 		return -ENOMEM;
1468 
1469 	/* ->set_property is always called with all locks held. */
1470 	state->acquire_ctx = plane->dev->mode_config.acquire_ctx;
1471 retry:
1472 	plane_state = drm_atomic_get_plane_state(state, plane);
1473 	if (IS_ERR(plane_state)) {
1474 		ret = PTR_ERR(plane_state);
1475 		goto fail;
1476 	}
1477 
1478 	ret = plane->funcs->atomic_set_property(plane, plane_state,
1479 					       property, val);
1480 	if (ret)
1481 		goto fail;
1482 
1483 	ret = drm_atomic_commit(state);
1484 	if (ret != 0)
1485 		goto fail;
1486 
1487 	/* Driver takes ownership of state on successful commit. */
1488 	return 0;
1489 fail:
1490 	if (ret == -EDEADLK)
1491 		goto backoff;
1492 
1493 	drm_atomic_state_free(state);
1494 
1495 	return ret;
1496 backoff:
1497 	drm_atomic_legacy_backoff(state);
1498 	drm_atomic_state_clear(state);
1499 
1500 	goto retry;
1501 }
1502 EXPORT_SYMBOL(drm_atomic_helper_plane_set_property);
1503 
1504 /**
1505  * drm_atomic_helper_connector_set_property - helper for connector prorties
1506  * @connector: DRM connector
1507  * @property: DRM property
1508  * @val: value of property
1509  *
1510  * Provides a default plane disablle handler using the atomic driver interface.
1511  *
1512  * RETURNS:
1513  * Zero on success, error code on failure
1514  */
1515 int
1516 drm_atomic_helper_connector_set_property(struct drm_connector *connector,
1517 				    struct drm_property *property,
1518 				    uint64_t val)
1519 {
1520 	struct drm_atomic_state *state;
1521 	struct drm_connector_state *connector_state;
1522 	int ret = 0;
1523 
1524 	state = drm_atomic_state_alloc(connector->dev);
1525 	if (!state)
1526 		return -ENOMEM;
1527 
1528 	/* ->set_property is always called with all locks held. */
1529 	state->acquire_ctx = connector->dev->mode_config.acquire_ctx;
1530 retry:
1531 	connector_state = drm_atomic_get_connector_state(state, connector);
1532 	if (IS_ERR(connector_state)) {
1533 		ret = PTR_ERR(connector_state);
1534 		goto fail;
1535 	}
1536 
1537 	ret = connector->funcs->atomic_set_property(connector, connector_state,
1538 					       property, val);
1539 	if (ret)
1540 		goto fail;
1541 
1542 	ret = drm_atomic_commit(state);
1543 	if (ret != 0)
1544 		goto fail;
1545 
1546 	/* Driver takes ownership of state on successful commit. */
1547 	return 0;
1548 fail:
1549 	if (ret == -EDEADLK)
1550 		goto backoff;
1551 
1552 	drm_atomic_state_free(state);
1553 
1554 	return ret;
1555 backoff:
1556 	drm_atomic_legacy_backoff(state);
1557 	drm_atomic_state_clear(state);
1558 
1559 	goto retry;
1560 }
1561 EXPORT_SYMBOL(drm_atomic_helper_connector_set_property);
1562