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/**
36 * DOC: overview
37 *
38 * This helper library provides implementations of check and commit functions on
39 * top of the CRTC modeset helper callbacks and the plane helper callbacks. It
40 * also provides convenience implementations for the atomic state handling
41 * callbacks for drivers which don't need to subclass the drm core structures to
42 * add their own additional internal state.
43 *
44 * This library also provides default implementations for the check callback in
45 * drm_atomic_helper_check and for the commit callback with
46 * drm_atomic_helper_commit. But the individual stages and callbacks are expose
47 * to allow drivers to mix and match and e.g. use the plane helpers only
48 * together with a driver private modeset implementation.
49 *
50 * This library also provides implementations for all the legacy driver
51 * interfaces on top of the atomic interface. See drm_atomic_helper_set_config,
52 * drm_atomic_helper_disable_plane, drm_atomic_helper_disable_plane and the
53 * various functions to implement set_property callbacks. New drivers must not
54 * implement these functions themselves but must use the provided helpers.
55 */
56static void
57drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
58				struct drm_plane_state *plane_state,
59				struct drm_plane *plane)
60{
61	struct drm_crtc_state *crtc_state;
62
63	if (plane->state->crtc) {
64		crtc_state = state->crtc_states[drm_crtc_index(plane->state->crtc)];
65
66		if (WARN_ON(!crtc_state))
67			return;
68
69		crtc_state->planes_changed = true;
70	}
71
72	if (plane_state->crtc) {
73		crtc_state =
74			state->crtc_states[drm_crtc_index(plane_state->crtc)];
75
76		if (WARN_ON(!crtc_state))
77			return;
78
79		crtc_state->planes_changed = true;
80	}
81}
82
83static struct drm_crtc *
84get_current_crtc_for_encoder(struct drm_device *dev,
85			     struct drm_encoder *encoder)
86{
87	struct drm_mode_config *config = &dev->mode_config;
88	struct drm_connector *connector;
89
90	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
91
92	list_for_each_entry(connector, &config->connector_list, head) {
93		if (connector->state->best_encoder != encoder)
94			continue;
95
96		return connector->state->crtc;
97	}
98
99	return NULL;
100}
101
102static int
103steal_encoder(struct drm_atomic_state *state,
104	      struct drm_encoder *encoder,
105	      struct drm_crtc *encoder_crtc)
106{
107	struct drm_mode_config *config = &state->dev->mode_config;
108	struct drm_crtc_state *crtc_state;
109	struct drm_connector *connector;
110	struct drm_connector_state *connector_state;
111	int ret;
112
113	/*
114	 * We can only steal an encoder coming from a connector, which means we
115	 * must already hold the connection_mutex.
116	 */
117	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
118
119	DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d], stealing it\n",
120			 encoder->base.id, encoder->name,
121			 encoder_crtc->base.id);
122
123	crtc_state = drm_atomic_get_crtc_state(state, encoder_crtc);
124	if (IS_ERR(crtc_state))
125		return PTR_ERR(crtc_state);
126
127	crtc_state->mode_changed = true;
128
129	list_for_each_entry(connector, &config->connector_list, head) {
130		if (connector->state->best_encoder != encoder)
131			continue;
132
133		DRM_DEBUG_ATOMIC("Stealing encoder from [CONNECTOR:%d:%s]\n",
134				 connector->base.id,
135				 connector->name);
136
137		connector_state = drm_atomic_get_connector_state(state,
138								 connector);
139		if (IS_ERR(connector_state))
140			return PTR_ERR(connector_state);
141
142		ret = drm_atomic_set_crtc_for_connector(connector_state, NULL);
143		if (ret)
144			return ret;
145		connector_state->best_encoder = NULL;
146	}
147
148	return 0;
149}
150
151static int
152update_connector_routing(struct drm_atomic_state *state, int conn_idx)
153{
154	const struct drm_connector_helper_funcs *funcs;
155	struct drm_encoder *new_encoder;
156	struct drm_crtc *encoder_crtc;
157	struct drm_connector *connector;
158	struct drm_connector_state *connector_state;
159	struct drm_crtc_state *crtc_state;
160	int idx, ret;
161
162	connector = state->connectors[conn_idx];
163	connector_state = state->connector_states[conn_idx];
164
165	if (!connector)
166		return 0;
167
168	DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n",
169			 connector->base.id,
170			 connector->name);
171
172	if (connector->state->crtc != connector_state->crtc) {
173		if (connector->state->crtc) {
174			idx = drm_crtc_index(connector->state->crtc);
175
176			crtc_state = state->crtc_states[idx];
177			crtc_state->mode_changed = true;
178		}
179
180		if (connector_state->crtc) {
181			idx = drm_crtc_index(connector_state->crtc);
182
183			crtc_state = state->crtc_states[idx];
184			crtc_state->mode_changed = true;
185		}
186	}
187
188	if (!connector_state->crtc) {
189		DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n",
190				connector->base.id,
191				connector->name);
192
193		connector_state->best_encoder = NULL;
194
195		return 0;
196	}
197
198	funcs = connector->helper_private;
199	new_encoder = funcs->best_encoder(connector);
200
201	if (!new_encoder) {
202		DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
203				 connector->base.id,
204				 connector->name);
205		return -EINVAL;
206	}
207
208	if (new_encoder == connector_state->best_encoder) {
209		DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d]\n",
210				 connector->base.id,
211				 connector->name,
212				 new_encoder->base.id,
213				 new_encoder->name,
214				 connector_state->crtc->base.id);
215
216		return 0;
217	}
218
219	encoder_crtc = get_current_crtc_for_encoder(state->dev,
220						    new_encoder);
221
222	if (encoder_crtc) {
223		ret = steal_encoder(state, new_encoder, encoder_crtc);
224		if (ret) {
225			DRM_DEBUG_ATOMIC("Encoder stealing failed for [CONNECTOR:%d:%s]\n",
226					 connector->base.id,
227					 connector->name);
228			return ret;
229		}
230	}
231
232	connector_state->best_encoder = new_encoder;
233	idx = drm_crtc_index(connector_state->crtc);
234
235	crtc_state = state->crtc_states[idx];
236	crtc_state->mode_changed = true;
237
238	DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d]\n",
239			 connector->base.id,
240			 connector->name,
241			 new_encoder->base.id,
242			 new_encoder->name,
243			 connector_state->crtc->base.id);
244
245	return 0;
246}
247
248static int
249mode_fixup(struct drm_atomic_state *state)
250{
251	struct drm_crtc *crtc;
252	struct drm_crtc_state *crtc_state;
253	struct drm_connector *connector;
254	struct drm_connector_state *conn_state;
255	int i;
256	bool ret;
257
258	for_each_crtc_in_state(state, crtc, crtc_state, i) {
259		if (!crtc_state->mode_changed)
260			continue;
261
262		drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode);
263	}
264
265	for_each_connector_in_state(state, connector, conn_state, i) {
266		const struct drm_encoder_helper_funcs *funcs;
267		struct drm_encoder *encoder;
268
269		WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc);
270
271		if (!conn_state->crtc || !conn_state->best_encoder)
272			continue;
273
274		crtc_state =
275			state->crtc_states[drm_crtc_index(conn_state->crtc)];
276
277		/*
278		 * Each encoder has at most one connector (since we always steal
279		 * it away), so we won't call ->mode_fixup twice.
280		 */
281		encoder = conn_state->best_encoder;
282		funcs = encoder->helper_private;
283
284		if (encoder->bridge && encoder->bridge->funcs->mode_fixup) {
285			ret = encoder->bridge->funcs->mode_fixup(
286					encoder->bridge, &crtc_state->mode,
287					&crtc_state->adjusted_mode);
288			if (!ret) {
289				DRM_DEBUG_ATOMIC("Bridge fixup failed\n");
290				return -EINVAL;
291			}
292		}
293
294		if (funcs->atomic_check) {
295			ret = funcs->atomic_check(encoder, crtc_state,
296						  conn_state);
297			if (ret) {
298				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n",
299						 encoder->base.id, encoder->name);
300				return ret;
301			}
302		} else {
303			ret = funcs->mode_fixup(encoder, &crtc_state->mode,
304						&crtc_state->adjusted_mode);
305			if (!ret) {
306				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n",
307						 encoder->base.id, encoder->name);
308				return -EINVAL;
309			}
310		}
311	}
312
313	for_each_crtc_in_state(state, crtc, crtc_state, i) {
314		const struct drm_crtc_helper_funcs *funcs;
315
316		if (!crtc_state->mode_changed)
317			continue;
318
319		funcs = crtc->helper_private;
320		ret = funcs->mode_fixup(crtc, &crtc_state->mode,
321					&crtc_state->adjusted_mode);
322		if (!ret) {
323			DRM_DEBUG_ATOMIC("[CRTC:%d] fixup failed\n",
324					 crtc->base.id);
325			return -EINVAL;
326		}
327	}
328
329	return 0;
330}
331
332static bool
333needs_modeset(struct drm_crtc_state *state)
334{
335	return state->mode_changed || state->active_changed;
336}
337
338/**
339 * drm_atomic_helper_check_modeset - validate state object for modeset changes
340 * @dev: DRM device
341 * @state: the driver state object
342 *
343 * Check the state object to see if the requested state is physically possible.
344 * This does all the crtc and connector related computations for an atomic
345 * update. It computes and updates crtc_state->mode_changed, adds any additional
346 * connectors needed for full modesets and calls down into ->mode_fixup
347 * functions of the driver backend.
348 *
349 * IMPORTANT:
350 *
351 * Drivers which update ->mode_changed (e.g. in their ->atomic_check hooks if a
352 * plane update can't be done without a full modeset) _must_ call this function
353 * afterwards after that change. It is permitted to call this function multiple
354 * times for the same update, e.g. when the ->atomic_check functions depend upon
355 * the adjusted dotclock for fifo space allocation and watermark computation.
356 *
357 * RETURNS
358 * Zero for success or -errno
359 */
360int
361drm_atomic_helper_check_modeset(struct drm_device *dev,
362				struct drm_atomic_state *state)
363{
364	struct drm_crtc *crtc;
365	struct drm_crtc_state *crtc_state;
366	struct drm_connector *connector;
367	struct drm_connector_state *connector_state;
368	int i, ret;
369
370	for_each_crtc_in_state(state, crtc, crtc_state, i) {
371		if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) {
372			DRM_DEBUG_ATOMIC("[CRTC:%d] mode changed\n",
373					 crtc->base.id);
374			crtc_state->mode_changed = true;
375		}
376
377		if (crtc->state->enable != crtc_state->enable) {
378			DRM_DEBUG_ATOMIC("[CRTC:%d] enable changed\n",
379					 crtc->base.id);
380			crtc_state->mode_changed = true;
381		}
382	}
383
384	for_each_connector_in_state(state, connector, connector_state, i) {
385		/*
386		 * This only sets crtc->mode_changed for routing changes,
387		 * drivers must set crtc->mode_changed themselves when connector
388		 * properties need to be updated.
389		 */
390		ret = update_connector_routing(state, i);
391		if (ret)
392			return ret;
393	}
394
395	/*
396	 * After all the routing has been prepared we need to add in any
397	 * connector which is itself unchanged, but who's crtc changes it's
398	 * configuration. This must be done before calling mode_fixup in case a
399	 * crtc only changed its mode but has the same set of connectors.
400	 */
401	for_each_crtc_in_state(state, crtc, crtc_state, i) {
402		int num_connectors;
403
404		/*
405		 * We must set ->active_changed after walking connectors for
406		 * otherwise an update that only changes active would result in
407		 * a full modeset because update_connector_routing force that.
408		 */
409		if (crtc->state->active != crtc_state->active) {
410			DRM_DEBUG_ATOMIC("[CRTC:%d] active changed\n",
411					 crtc->base.id);
412			crtc_state->active_changed = true;
413		}
414
415		if (!needs_modeset(crtc_state))
416			continue;
417
418		DRM_DEBUG_ATOMIC("[CRTC:%d] needs all connectors, enable: %c, active: %c\n",
419				 crtc->base.id,
420				 crtc_state->enable ? 'y' : 'n',
421			      crtc_state->active ? 'y' : 'n');
422
423		ret = drm_atomic_add_affected_connectors(state, crtc);
424		if (ret != 0)
425			return ret;
426
427		num_connectors = drm_atomic_connectors_for_crtc(state,
428								crtc);
429
430		if (crtc_state->enable != !!num_connectors) {
431			DRM_DEBUG_ATOMIC("[CRTC:%d] enabled/connectors mismatch\n",
432					 crtc->base.id);
433
434			return -EINVAL;
435		}
436	}
437
438	return mode_fixup(state);
439}
440EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
441
442/**
443 * drm_atomic_helper_check_planes - validate state object for planes changes
444 * @dev: DRM device
445 * @state: the driver state object
446 *
447 * Check the state object to see if the requested state is physically possible.
448 * This does all the plane update related checks using by calling into the
449 * ->atomic_check hooks provided by the driver.
450 *
451 * RETURNS
452 * Zero for success or -errno
453 */
454int
455drm_atomic_helper_check_planes(struct drm_device *dev,
456			       struct drm_atomic_state *state)
457{
458	struct drm_crtc *crtc;
459	struct drm_crtc_state *crtc_state;
460	struct drm_plane *plane;
461	struct drm_plane_state *plane_state;
462	int i, ret = 0;
463
464	for_each_plane_in_state(state, plane, plane_state, i) {
465		const struct drm_plane_helper_funcs *funcs;
466
467		funcs = plane->helper_private;
468
469		drm_atomic_helper_plane_changed(state, plane_state, plane);
470
471		if (!funcs || !funcs->atomic_check)
472			continue;
473
474		ret = funcs->atomic_check(plane, plane_state);
475		if (ret) {
476			DRM_DEBUG_ATOMIC("[PLANE:%d] atomic driver check failed\n",
477					 plane->base.id);
478			return ret;
479		}
480	}
481
482	for_each_crtc_in_state(state, crtc, crtc_state, i) {
483		const struct drm_crtc_helper_funcs *funcs;
484
485		funcs = crtc->helper_private;
486
487		if (!funcs || !funcs->atomic_check)
488			continue;
489
490		ret = funcs->atomic_check(crtc, state->crtc_states[i]);
491		if (ret) {
492			DRM_DEBUG_ATOMIC("[CRTC:%d] atomic driver check failed\n",
493					 crtc->base.id);
494			return ret;
495		}
496	}
497
498	return ret;
499}
500EXPORT_SYMBOL(drm_atomic_helper_check_planes);
501
502/**
503 * drm_atomic_helper_check - validate state object
504 * @dev: DRM device
505 * @state: the driver state object
506 *
507 * Check the state object to see if the requested state is physically possible.
508 * Only crtcs and planes have check callbacks, so for any additional (global)
509 * checking that a driver needs it can simply wrap that around this function.
510 * Drivers without such needs can directly use this as their ->atomic_check()
511 * callback.
512 *
513 * This just wraps the two parts of the state checking for planes and modeset
514 * state in the default order: First it calls drm_atomic_helper_check_modeset()
515 * and then drm_atomic_helper_check_planes(). The assumption is that the
516 * ->atomic_check functions depend upon an updated adjusted_mode.clock to
517 * e.g. properly compute watermarks.
518 *
519 * RETURNS
520 * Zero for success or -errno
521 */
522int drm_atomic_helper_check(struct drm_device *dev,
523			    struct drm_atomic_state *state)
524{
525	int ret;
526
527	ret = drm_atomic_helper_check_modeset(dev, state);
528	if (ret)
529		return ret;
530
531	ret = drm_atomic_helper_check_planes(dev, state);
532	if (ret)
533		return ret;
534
535	return ret;
536}
537EXPORT_SYMBOL(drm_atomic_helper_check);
538
539static void
540disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
541{
542	struct drm_connector *connector;
543	struct drm_connector_state *old_conn_state;
544	struct drm_crtc *crtc;
545	struct drm_crtc_state *old_crtc_state;
546	int i;
547
548	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
549		const struct drm_encoder_helper_funcs *funcs;
550		struct drm_encoder *encoder;
551		struct drm_crtc_state *old_crtc_state;
552
553		/* Shut down everything that's in the changeset and currently
554		 * still on. So need to check the old, saved state. */
555		if (!old_conn_state->crtc)
556			continue;
557
558		old_crtc_state = old_state->crtc_states[drm_crtc_index(old_conn_state->crtc)];
559
560		if (!old_crtc_state->active ||
561		    !needs_modeset(old_conn_state->crtc->state))
562			continue;
563
564		encoder = old_conn_state->best_encoder;
565
566		/* We shouldn't get this far if we didn't previously have
567		 * an encoder.. but WARN_ON() rather than explode.
568		 */
569		if (WARN_ON(!encoder))
570			continue;
571
572		funcs = encoder->helper_private;
573
574		DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
575				 encoder->base.id, encoder->name);
576
577		/*
578		 * Each encoder has at most one connector (since we always steal
579		 * it away), so we won't call disable hooks twice.
580		 */
581		if (encoder->bridge)
582			encoder->bridge->funcs->disable(encoder->bridge);
583
584		/* Right function depends upon target state. */
585		if (connector->state->crtc && funcs->prepare)
586			funcs->prepare(encoder);
587		else if (funcs->disable)
588			funcs->disable(encoder);
589		else
590			funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
591
592		if (encoder->bridge)
593			encoder->bridge->funcs->post_disable(encoder->bridge);
594	}
595
596	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
597		const struct drm_crtc_helper_funcs *funcs;
598
599		/* Shut down everything that needs a full modeset. */
600		if (!needs_modeset(crtc->state))
601			continue;
602
603		if (!old_crtc_state->active)
604			continue;
605
606		funcs = crtc->helper_private;
607
608		DRM_DEBUG_ATOMIC("disabling [CRTC:%d]\n",
609				 crtc->base.id);
610
611
612		/* Right function depends upon target state. */
613		if (crtc->state->enable && funcs->prepare)
614			funcs->prepare(crtc);
615		else if (funcs->disable)
616			funcs->disable(crtc);
617		else
618			funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
619	}
620}
621
622static void
623set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
624{
625	struct drm_connector *connector;
626	struct drm_connector_state *old_conn_state;
627	struct drm_crtc *crtc;
628	struct drm_crtc_state *old_crtc_state;
629	int i;
630
631	/* clear out existing links */
632	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
633		if (!connector->encoder)
634			continue;
635
636		WARN_ON(!connector->encoder->crtc);
637
638		connector->encoder->crtc = NULL;
639		connector->encoder = NULL;
640	}
641
642	/* set new links */
643	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
644		if (!connector->state->crtc)
645			continue;
646
647		if (WARN_ON(!connector->state->best_encoder))
648			continue;
649
650		connector->encoder = connector->state->best_encoder;
651		connector->encoder->crtc = connector->state->crtc;
652	}
653
654	/* set legacy state in the crtc structure */
655	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
656		crtc->mode = crtc->state->mode;
657		crtc->enabled = crtc->state->enable;
658		crtc->x = crtc->primary->state->src_x >> 16;
659		crtc->y = crtc->primary->state->src_y >> 16;
660	}
661}
662
663static void
664crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
665{
666	struct drm_crtc *crtc;
667	struct drm_crtc_state *old_crtc_state;
668	struct drm_connector *connector;
669	struct drm_connector_state *old_conn_state;
670	int i;
671
672	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
673		const struct drm_crtc_helper_funcs *funcs;
674
675		if (!crtc->state->mode_changed)
676			continue;
677
678		funcs = crtc->helper_private;
679
680		if (crtc->state->enable && funcs->mode_set_nofb) {
681			DRM_DEBUG_ATOMIC("modeset on [CRTC:%d]\n",
682					 crtc->base.id);
683
684			funcs->mode_set_nofb(crtc);
685		}
686	}
687
688	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
689		const struct drm_encoder_helper_funcs *funcs;
690		struct drm_crtc_state *new_crtc_state;
691		struct drm_encoder *encoder;
692		struct drm_display_mode *mode, *adjusted_mode;
693
694		if (!connector->state->best_encoder)
695			continue;
696
697		encoder = connector->state->best_encoder;
698		funcs = encoder->helper_private;
699		new_crtc_state = connector->state->crtc->state;
700		mode = &new_crtc_state->mode;
701		adjusted_mode = &new_crtc_state->adjusted_mode;
702
703		if (!new_crtc_state->mode_changed)
704			continue;
705
706		DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
707				 encoder->base.id, encoder->name);
708
709		/*
710		 * Each encoder has at most one connector (since we always steal
711		 * it away), so we won't call mode_set hooks twice.
712		 */
713		if (funcs->mode_set)
714			funcs->mode_set(encoder, mode, adjusted_mode);
715
716		if (encoder->bridge && encoder->bridge->funcs->mode_set)
717			encoder->bridge->funcs->mode_set(encoder->bridge,
718							 mode, adjusted_mode);
719	}
720}
721
722/**
723 * drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs
724 * @dev: DRM device
725 * @old_state: atomic state object with old state structures
726 *
727 * This function shuts down all the outputs that need to be shut down and
728 * prepares them (if required) with the new mode.
729 *
730 * For compatability with legacy crtc helpers this should be called before
731 * drm_atomic_helper_commit_planes(), which is what the default commit function
732 * does. But drivers with different needs can group the modeset commits together
733 * and do the plane commits at the end. This is useful for drivers doing runtime
734 * PM since planes updates then only happen when the CRTC is actually enabled.
735 */
736void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
737					       struct drm_atomic_state *old_state)
738{
739	disable_outputs(dev, old_state);
740	set_routing_links(dev, old_state);
741	crtc_set_mode(dev, old_state);
742}
743EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
744
745/**
746 * drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs
747 * @dev: DRM device
748 * @old_state: atomic state object with old state structures
749 *
750 * This function enables all the outputs with the new configuration which had to
751 * be turned off for the update.
752 *
753 * For compatability with legacy crtc helpers this should be called after
754 * drm_atomic_helper_commit_planes(), which is what the default commit function
755 * does. But drivers with different needs can group the modeset commits together
756 * and do the plane commits at the end. This is useful for drivers doing runtime
757 * PM since planes updates then only happen when the CRTC is actually enabled.
758 */
759void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
760					      struct drm_atomic_state *old_state)
761{
762	struct drm_crtc *crtc;
763	struct drm_crtc_state *old_crtc_state;
764	struct drm_connector *connector;
765	struct drm_connector_state *old_conn_state;
766	int i;
767
768	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
769		const struct drm_crtc_helper_funcs *funcs;
770
771		/* Need to filter out CRTCs where only planes change. */
772		if (!needs_modeset(crtc->state))
773			continue;
774
775		if (!crtc->state->active)
776			continue;
777
778		funcs = crtc->helper_private;
779
780		if (crtc->state->enable) {
781			DRM_DEBUG_ATOMIC("enabling [CRTC:%d]\n",
782					 crtc->base.id);
783
784			if (funcs->enable)
785				funcs->enable(crtc);
786			else
787				funcs->commit(crtc);
788		}
789	}
790
791	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
792		const struct drm_encoder_helper_funcs *funcs;
793		struct drm_encoder *encoder;
794
795		if (!connector->state->best_encoder)
796			continue;
797
798		if (!connector->state->crtc->state->active ||
799		    !needs_modeset(connector->state->crtc->state))
800			continue;
801
802		encoder = connector->state->best_encoder;
803		funcs = encoder->helper_private;
804
805		DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
806				 encoder->base.id, encoder->name);
807
808		/*
809		 * Each encoder has at most one connector (since we always steal
810		 * it away), so we won't call enable hooks twice.
811		 */
812		if (encoder->bridge)
813			encoder->bridge->funcs->pre_enable(encoder->bridge);
814
815		if (funcs->enable)
816			funcs->enable(encoder);
817		else
818			funcs->commit(encoder);
819
820		if (encoder->bridge)
821			encoder->bridge->funcs->enable(encoder->bridge);
822	}
823}
824EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
825
826static void wait_for_fences(struct drm_device *dev,
827			    struct drm_atomic_state *state)
828{
829	struct drm_plane *plane;
830	struct drm_plane_state *plane_state;
831	int i;
832
833	for_each_plane_in_state(state, plane, plane_state, i) {
834		if (!plane->state->fence)
835			continue;
836
837		WARN_ON(!plane->state->fb);
838
839		fence_wait(plane->state->fence, false);
840		fence_put(plane->state->fence);
841		plane->state->fence = NULL;
842	}
843}
844
845static bool framebuffer_changed(struct drm_device *dev,
846				struct drm_atomic_state *old_state,
847				struct drm_crtc *crtc)
848{
849	struct drm_plane *plane;
850	struct drm_plane_state *old_plane_state;
851	int i;
852
853	for_each_plane_in_state(old_state, plane, old_plane_state, i) {
854		if (plane->state->crtc != crtc &&
855		    old_plane_state->crtc != crtc)
856			continue;
857
858		if (plane->state->fb != old_plane_state->fb)
859			return true;
860	}
861
862	return false;
863}
864
865/**
866 * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
867 * @dev: DRM device
868 * @old_state: atomic state object with old state structures
869 *
870 * Helper to, after atomic commit, wait for vblanks on all effected
871 * crtcs (ie. before cleaning up old framebuffers using
872 * drm_atomic_helper_cleanup_planes()). It will only wait on crtcs where the
873 * framebuffers have actually changed to optimize for the legacy cursor and
874 * plane update use-case.
875 */
876void
877drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
878		struct drm_atomic_state *old_state)
879{
880	struct drm_crtc *crtc;
881	struct drm_crtc_state *old_crtc_state;
882	int i, ret;
883
884	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
885		/* No one cares about the old state, so abuse it for tracking
886		 * and store whether we hold a vblank reference (and should do a
887		 * vblank wait) in the ->enable boolean. */
888		old_crtc_state->enable = false;
889
890		if (!crtc->state->enable)
891			continue;
892
893		/* Legacy cursor ioctls are completely unsynced, and userspace
894		 * relies on that (by doing tons of cursor updates). */
895		if (old_state->legacy_cursor_update)
896			continue;
897
898		if (!framebuffer_changed(dev, old_state, crtc))
899			continue;
900
901		ret = drm_crtc_vblank_get(crtc);
902		if (ret != 0)
903			continue;
904
905		old_crtc_state->enable = true;
906		old_crtc_state->last_vblank_count = drm_vblank_count(dev, i);
907	}
908
909	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
910		if (!old_crtc_state->enable)
911			continue;
912
913		ret = wait_event_timeout(dev->vblank[i].queue,
914				old_crtc_state->last_vblank_count !=
915					drm_vblank_count(dev, i),
916				msecs_to_jiffies(50));
917
918		drm_crtc_vblank_put(crtc);
919	}
920}
921EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
922
923/**
924 * drm_atomic_helper_commit - commit validated state object
925 * @dev: DRM device
926 * @state: the driver state object
927 * @async: asynchronous commit
928 *
929 * This function commits a with drm_atomic_helper_check() pre-validated state
930 * object. This can still fail when e.g. the framebuffer reservation fails. For
931 * now this doesn't implement asynchronous commits.
932 *
933 * RETURNS
934 * Zero for success or -errno.
935 */
936int drm_atomic_helper_commit(struct drm_device *dev,
937			     struct drm_atomic_state *state,
938			     bool async)
939{
940	int ret;
941
942	if (async)
943		return -EBUSY;
944
945	ret = drm_atomic_helper_prepare_planes(dev, state);
946	if (ret)
947		return ret;
948
949	/*
950	 * This is the point of no return - everything below never fails except
951	 * when the hw goes bonghits. Which means we can commit the new state on
952	 * the software side now.
953	 */
954
955	drm_atomic_helper_swap_state(dev, state);
956
957	/*
958	 * Everything below can be run asynchronously without the need to grab
959	 * any modeset locks at all under one condition: It must be guaranteed
960	 * that the asynchronous work has either been cancelled (if the driver
961	 * supports it, which at least requires that the framebuffers get
962	 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
963	 * before the new state gets committed on the software side with
964	 * drm_atomic_helper_swap_state().
965	 *
966	 * This scheme allows new atomic state updates to be prepared and
967	 * checked in parallel to the asynchronous completion of the previous
968	 * update. Which is important since compositors need to figure out the
969	 * composition of the next frame right after having submitted the
970	 * current layout.
971	 */
972
973	wait_for_fences(dev, state);
974
975	drm_atomic_helper_commit_modeset_disables(dev, state);
976
977	drm_atomic_helper_commit_planes(dev, state);
978
979	drm_atomic_helper_commit_modeset_enables(dev, state);
980
981	drm_atomic_helper_wait_for_vblanks(dev, state);
982
983	drm_atomic_helper_cleanup_planes(dev, state);
984
985	drm_atomic_state_free(state);
986
987	return 0;
988}
989EXPORT_SYMBOL(drm_atomic_helper_commit);
990
991/**
992 * DOC: implementing async commit
993 *
994 * For now the atomic helpers don't support async commit directly. If there is
995 * real need it could be added though, using the dma-buf fence infrastructure
996 * for generic synchronization with outstanding rendering.
997 *
998 * For now drivers have to implement async commit themselves, with the following
999 * sequence being the recommended one:
1000 *
1001 * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function
1002 * which commit needs to call which can fail, so we want to run it first and
1003 * synchronously.
1004 *
1005 * 2. Synchronize with any outstanding asynchronous commit worker threads which
1006 * might be affected the new state update. This can be done by either cancelling
1007 * or flushing the work items, depending upon whether the driver can deal with
1008 * cancelled updates. Note that it is important to ensure that the framebuffer
1009 * cleanup is still done when cancelling.
1010 *
1011 * For sufficient parallelism it is recommended to have a work item per crtc
1012 * (for updates which don't touch global state) and a global one. Then we only
1013 * need to synchronize with the crtc work items for changed crtcs and the global
1014 * work item, which allows nice concurrent updates on disjoint sets of crtcs.
1015 *
1016 * 3. The software state is updated synchronously with
1017 * drm_atomic_helper_swap_state. Doing this under the protection of all modeset
1018 * locks means concurrent callers never see inconsistent state. And doing this
1019 * while it's guaranteed that no relevant async worker runs means that async
1020 * workers do not need grab any locks. Actually they must not grab locks, for
1021 * otherwise the work flushing will deadlock.
1022 *
1023 * 4. Schedule a work item to do all subsequent steps, using the split-out
1024 * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and
1025 * then cleaning up the framebuffers after the old framebuffer is no longer
1026 * being displayed.
1027 */
1028
1029/**
1030 * drm_atomic_helper_prepare_planes - prepare plane resources before commit
1031 * @dev: DRM device
1032 * @state: atomic state object with new state structures
1033 *
1034 * This function prepares plane state, specifically framebuffers, for the new
1035 * configuration. If any failure is encountered this function will call
1036 * ->cleanup_fb on any already successfully prepared framebuffer.
1037 *
1038 * Returns:
1039 * 0 on success, negative error code on failure.
1040 */
1041int drm_atomic_helper_prepare_planes(struct drm_device *dev,
1042				     struct drm_atomic_state *state)
1043{
1044	int nplanes = dev->mode_config.num_total_plane;
1045	int ret, i;
1046
1047	for (i = 0; i < nplanes; i++) {
1048		const struct drm_plane_helper_funcs *funcs;
1049		struct drm_plane *plane = state->planes[i];
1050		struct drm_plane_state *plane_state = state->plane_states[i];
1051		struct drm_framebuffer *fb;
1052
1053		if (!plane)
1054			continue;
1055
1056		funcs = plane->helper_private;
1057
1058		fb = plane_state->fb;
1059
1060		if (fb && funcs->prepare_fb) {
1061			ret = funcs->prepare_fb(plane, fb, plane_state);
1062			if (ret)
1063				goto fail;
1064		}
1065	}
1066
1067	return 0;
1068
1069fail:
1070	for (i--; i >= 0; i--) {
1071		const struct drm_plane_helper_funcs *funcs;
1072		struct drm_plane *plane = state->planes[i];
1073		struct drm_plane_state *plane_state = state->plane_states[i];
1074		struct drm_framebuffer *fb;
1075
1076		if (!plane)
1077			continue;
1078
1079		funcs = plane->helper_private;
1080
1081		fb = state->plane_states[i]->fb;
1082
1083		if (fb && funcs->cleanup_fb)
1084			funcs->cleanup_fb(plane, fb, plane_state);
1085
1086	}
1087
1088	return ret;
1089}
1090EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
1091
1092/**
1093 * drm_atomic_helper_commit_planes - commit plane state
1094 * @dev: DRM device
1095 * @old_state: atomic state object with old state structures
1096 *
1097 * This function commits the new plane state using the plane and atomic helper
1098 * functions for planes and crtcs. It assumes that the atomic state has already
1099 * been pushed into the relevant object state pointers, since this step can no
1100 * longer fail.
1101 *
1102 * It still requires the global state object @old_state to know which planes and
1103 * crtcs need to be updated though.
1104 */
1105void drm_atomic_helper_commit_planes(struct drm_device *dev,
1106				     struct drm_atomic_state *old_state)
1107{
1108	struct drm_crtc *crtc;
1109	struct drm_crtc_state *old_crtc_state;
1110	struct drm_plane *plane;
1111	struct drm_plane_state *old_plane_state;
1112	int i;
1113
1114	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1115		const struct drm_crtc_helper_funcs *funcs;
1116
1117		funcs = crtc->helper_private;
1118
1119		if (!funcs || !funcs->atomic_begin)
1120			continue;
1121
1122		funcs->atomic_begin(crtc);
1123	}
1124
1125	for_each_plane_in_state(old_state, plane, old_plane_state, i) {
1126		const struct drm_plane_helper_funcs *funcs;
1127
1128		funcs = plane->helper_private;
1129
1130		if (!funcs)
1131			continue;
1132
1133		old_plane_state = old_state->plane_states[i];
1134
1135		/*
1136		 * Special-case disabling the plane if drivers support it.
1137		 */
1138		if (drm_atomic_plane_disabling(plane, old_plane_state) &&
1139		    funcs->atomic_disable)
1140			funcs->atomic_disable(plane, old_plane_state);
1141		else
1142			funcs->atomic_update(plane, old_plane_state);
1143	}
1144
1145	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1146		const struct drm_crtc_helper_funcs *funcs;
1147
1148		funcs = crtc->helper_private;
1149
1150		if (!funcs || !funcs->atomic_flush)
1151			continue;
1152
1153		funcs->atomic_flush(crtc);
1154	}
1155}
1156EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
1157
1158/**
1159 * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
1160 * @dev: DRM device
1161 * @old_state: atomic state object with old state structures
1162 *
1163 * This function cleans up plane state, specifically framebuffers, from the old
1164 * configuration. Hence the old configuration must be perserved in @old_state to
1165 * be able to call this function.
1166 *
1167 * This function must also be called on the new state when the atomic update
1168 * fails at any point after calling drm_atomic_helper_prepare_planes().
1169 */
1170void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
1171				      struct drm_atomic_state *old_state)
1172{
1173	struct drm_plane *plane;
1174	struct drm_plane_state *plane_state;
1175	int i;
1176
1177	for_each_plane_in_state(old_state, plane, plane_state, i) {
1178		const struct drm_plane_helper_funcs *funcs;
1179		struct drm_framebuffer *old_fb;
1180
1181		funcs = plane->helper_private;
1182
1183		old_fb = plane_state->fb;
1184
1185		if (old_fb && funcs->cleanup_fb)
1186			funcs->cleanup_fb(plane, old_fb, plane_state);
1187	}
1188}
1189EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
1190
1191/**
1192 * drm_atomic_helper_swap_state - store atomic state into current sw state
1193 * @dev: DRM device
1194 * @state: atomic state
1195 *
1196 * This function stores the atomic state into the current state pointers in all
1197 * driver objects. It should be called after all failing steps have been done
1198 * and succeeded, but before the actual hardware state is committed.
1199 *
1200 * For cleanup and error recovery the current state for all changed objects will
1201 * be swaped into @state.
1202 *
1203 * With that sequence it fits perfectly into the plane prepare/cleanup sequence:
1204 *
1205 * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state.
1206 *
1207 * 2. Do any other steps that might fail.
1208 *
1209 * 3. Put the staged state into the current state pointers with this function.
1210 *
1211 * 4. Actually commit the hardware state.
1212 *
1213 * 5. Call drm_atomic_helper_cleanup_planes with @state, which since step 3
1214 * contains the old state. Also do any other cleanup required with that state.
1215 */
1216void drm_atomic_helper_swap_state(struct drm_device *dev,
1217				  struct drm_atomic_state *state)
1218{
1219	int i;
1220
1221	for (i = 0; i < dev->mode_config.num_connector; i++) {
1222		struct drm_connector *connector = state->connectors[i];
1223
1224		if (!connector)
1225			continue;
1226
1227		connector->state->state = state;
1228		swap(state->connector_states[i], connector->state);
1229		connector->state->state = NULL;
1230	}
1231
1232	for (i = 0; i < dev->mode_config.num_crtc; i++) {
1233		struct drm_crtc *crtc = state->crtcs[i];
1234
1235		if (!crtc)
1236			continue;
1237
1238		crtc->state->state = state;
1239		swap(state->crtc_states[i], crtc->state);
1240		crtc->state->state = NULL;
1241	}
1242
1243	for (i = 0; i < dev->mode_config.num_total_plane; i++) {
1244		struct drm_plane *plane = state->planes[i];
1245
1246		if (!plane)
1247			continue;
1248
1249		plane->state->state = state;
1250		swap(state->plane_states[i], plane->state);
1251		plane->state->state = NULL;
1252	}
1253}
1254EXPORT_SYMBOL(drm_atomic_helper_swap_state);
1255
1256/**
1257 * drm_atomic_helper_update_plane - Helper for primary plane update using atomic
1258 * @plane: plane object to update
1259 * @crtc: owning CRTC of owning plane
1260 * @fb: framebuffer to flip onto plane
1261 * @crtc_x: x offset of primary plane on crtc
1262 * @crtc_y: y offset of primary plane on crtc
1263 * @crtc_w: width of primary plane rectangle on crtc
1264 * @crtc_h: height of primary plane rectangle on crtc
1265 * @src_x: x offset of @fb for panning
1266 * @src_y: y offset of @fb for panning
1267 * @src_w: width of source rectangle in @fb
1268 * @src_h: height of source rectangle in @fb
1269 *
1270 * Provides a default plane update handler using the atomic driver interface.
1271 *
1272 * RETURNS:
1273 * Zero on success, error code on failure
1274 */
1275int drm_atomic_helper_update_plane(struct drm_plane *plane,
1276				   struct drm_crtc *crtc,
1277				   struct drm_framebuffer *fb,
1278				   int crtc_x, int crtc_y,
1279				   unsigned int crtc_w, unsigned int crtc_h,
1280				   uint32_t src_x, uint32_t src_y,
1281				   uint32_t src_w, uint32_t src_h)
1282{
1283	struct drm_atomic_state *state;
1284	struct drm_plane_state *plane_state;
1285	int ret = 0;
1286
1287	state = drm_atomic_state_alloc(plane->dev);
1288	if (!state)
1289		return -ENOMEM;
1290
1291	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
1292retry:
1293	plane_state = drm_atomic_get_plane_state(state, plane);
1294	if (IS_ERR(plane_state)) {
1295		ret = PTR_ERR(plane_state);
1296		goto fail;
1297	}
1298
1299	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
1300	if (ret != 0)
1301		goto fail;
1302	drm_atomic_set_fb_for_plane(plane_state, fb);
1303	plane_state->crtc_x = crtc_x;
1304	plane_state->crtc_y = crtc_y;
1305	plane_state->crtc_h = crtc_h;
1306	plane_state->crtc_w = crtc_w;
1307	plane_state->src_x = src_x;
1308	plane_state->src_y = src_y;
1309	plane_state->src_h = src_h;
1310	plane_state->src_w = src_w;
1311
1312	ret = drm_atomic_commit(state);
1313	if (ret != 0)
1314		goto fail;
1315
1316	if (plane == crtc->cursor)
1317		state->legacy_cursor_update = true;
1318
1319	/* Driver takes ownership of state on successful commit. */
1320	return 0;
1321fail:
1322	if (ret == -EDEADLK)
1323		goto backoff;
1324
1325	drm_atomic_state_free(state);
1326
1327	return ret;
1328backoff:
1329	drm_atomic_state_clear(state);
1330	drm_atomic_legacy_backoff(state);
1331
1332	/*
1333	 * Someone might have exchanged the framebuffer while we dropped locks
1334	 * in the backoff code. We need to fix up the fb refcount tracking the
1335	 * core does for us.
1336	 */
1337	plane->old_fb = plane->fb;
1338
1339	goto retry;
1340}
1341EXPORT_SYMBOL(drm_atomic_helper_update_plane);
1342
1343/**
1344 * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic
1345 * @plane: plane to disable
1346 *
1347 * Provides a default plane disable handler using the atomic driver interface.
1348 *
1349 * RETURNS:
1350 * Zero on success, error code on failure
1351 */
1352int drm_atomic_helper_disable_plane(struct drm_plane *plane)
1353{
1354	struct drm_atomic_state *state;
1355	struct drm_plane_state *plane_state;
1356	int ret = 0;
1357
1358	/*
1359	 * FIXME: Without plane->crtc set we can't get at the implicit legacy
1360	 * acquire context. The real fix will be to wire the acquire ctx through
1361	 * everywhere we need it, but meanwhile prevent chaos by just skipping
1362	 * this noop. The critical case is the cursor ioctls which a) only grab
1363	 * crtc/cursor-plane locks (so we need the crtc to get at the right
1364	 * acquire context) and b) can try to disable the plane multiple times.
1365	 */
1366	if (!plane->crtc)
1367		return 0;
1368
1369	state = drm_atomic_state_alloc(plane->dev);
1370	if (!state)
1371		return -ENOMEM;
1372
1373	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(plane->crtc);
1374retry:
1375	plane_state = drm_atomic_get_plane_state(state, plane);
1376	if (IS_ERR(plane_state)) {
1377		ret = PTR_ERR(plane_state);
1378		goto fail;
1379	}
1380
1381	ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
1382	if (ret != 0)
1383		goto fail;
1384	drm_atomic_set_fb_for_plane(plane_state, NULL);
1385	plane_state->crtc_x = 0;
1386	plane_state->crtc_y = 0;
1387	plane_state->crtc_h = 0;
1388	plane_state->crtc_w = 0;
1389	plane_state->src_x = 0;
1390	plane_state->src_y = 0;
1391	plane_state->src_h = 0;
1392	plane_state->src_w = 0;
1393
1394	if (plane == plane->crtc->cursor)
1395		state->legacy_cursor_update = true;
1396
1397	ret = drm_atomic_commit(state);
1398	if (ret != 0)
1399		goto fail;
1400
1401	/* Driver takes ownership of state on successful commit. */
1402	return 0;
1403fail:
1404	if (ret == -EDEADLK)
1405		goto backoff;
1406
1407	drm_atomic_state_free(state);
1408
1409	return ret;
1410backoff:
1411	drm_atomic_state_clear(state);
1412	drm_atomic_legacy_backoff(state);
1413
1414	/*
1415	 * Someone might have exchanged the framebuffer while we dropped locks
1416	 * in the backoff code. We need to fix up the fb refcount tracking the
1417	 * core does for us.
1418	 */
1419	plane->old_fb = plane->fb;
1420
1421	goto retry;
1422}
1423EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
1424
1425static int update_output_state(struct drm_atomic_state *state,
1426			       struct drm_mode_set *set)
1427{
1428	struct drm_device *dev = set->crtc->dev;
1429	struct drm_crtc *crtc;
1430	struct drm_crtc_state *crtc_state;
1431	struct drm_connector *connector;
1432	struct drm_connector_state *conn_state;
1433	int ret, i, j;
1434
1435	ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
1436			       state->acquire_ctx);
1437	if (ret)
1438		return ret;
1439
1440	/* First grab all affected connector/crtc states. */
1441	for (i = 0; i < set->num_connectors; i++) {
1442		conn_state = drm_atomic_get_connector_state(state,
1443							    set->connectors[i]);
1444		if (IS_ERR(conn_state))
1445			return PTR_ERR(conn_state);
1446	}
1447
1448	for_each_crtc_in_state(state, crtc, crtc_state, i) {
1449		ret = drm_atomic_add_affected_connectors(state, crtc);
1450		if (ret)
1451			return ret;
1452	}
1453
1454	/* Then recompute connector->crtc links and crtc enabling state. */
1455	for_each_connector_in_state(state, connector, conn_state, i) {
1456		if (conn_state->crtc == set->crtc) {
1457			ret = drm_atomic_set_crtc_for_connector(conn_state,
1458								NULL);
1459			if (ret)
1460				return ret;
1461		}
1462
1463		for (j = 0; j < set->num_connectors; j++) {
1464			if (set->connectors[j] == connector) {
1465				ret = drm_atomic_set_crtc_for_connector(conn_state,
1466									set->crtc);
1467				if (ret)
1468					return ret;
1469				break;
1470			}
1471		}
1472	}
1473
1474	for_each_crtc_in_state(state, crtc, crtc_state, i) {
1475		/* Don't update ->enable for the CRTC in the set_config request,
1476		 * since a mismatch would indicate a bug in the upper layers.
1477		 * The actual modeset code later on will catch any
1478		 * inconsistencies here. */
1479		if (crtc == set->crtc)
1480			continue;
1481
1482		crtc_state->enable =
1483			drm_atomic_connectors_for_crtc(state, crtc);
1484	}
1485
1486	return 0;
1487}
1488
1489/**
1490 * drm_atomic_helper_set_config - set a new config from userspace
1491 * @set: mode set configuration
1492 *
1493 * Provides a default crtc set_config handler using the atomic driver interface.
1494 *
1495 * Returns:
1496 * Returns 0 on success, negative errno numbers on failure.
1497 */
1498int drm_atomic_helper_set_config(struct drm_mode_set *set)
1499{
1500	struct drm_atomic_state *state;
1501	struct drm_crtc *crtc = set->crtc;
1502	struct drm_crtc_state *crtc_state;
1503	struct drm_plane_state *primary_state;
1504	int ret = 0;
1505
1506	state = drm_atomic_state_alloc(crtc->dev);
1507	if (!state)
1508		return -ENOMEM;
1509
1510	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
1511retry:
1512	crtc_state = drm_atomic_get_crtc_state(state, crtc);
1513	if (IS_ERR(crtc_state)) {
1514		ret = PTR_ERR(crtc_state);
1515		goto fail;
1516	}
1517
1518	primary_state = drm_atomic_get_plane_state(state, crtc->primary);
1519	if (IS_ERR(primary_state)) {
1520		ret = PTR_ERR(primary_state);
1521		goto fail;
1522	}
1523
1524	if (!set->mode) {
1525		WARN_ON(set->fb);
1526		WARN_ON(set->num_connectors);
1527
1528		crtc_state->enable = false;
1529		crtc_state->active = false;
1530
1531		ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
1532		if (ret != 0)
1533			goto fail;
1534
1535		drm_atomic_set_fb_for_plane(primary_state, NULL);
1536
1537		goto commit;
1538	}
1539
1540	WARN_ON(!set->fb);
1541	WARN_ON(!set->num_connectors);
1542
1543	crtc_state->enable = true;
1544	crtc_state->active = true;
1545	drm_mode_copy(&crtc_state->mode, set->mode);
1546
1547	ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
1548	if (ret != 0)
1549		goto fail;
1550	drm_atomic_set_fb_for_plane(primary_state, set->fb);
1551	primary_state->crtc_x = 0;
1552	primary_state->crtc_y = 0;
1553	primary_state->crtc_h = set->mode->vdisplay;
1554	primary_state->crtc_w = set->mode->hdisplay;
1555	primary_state->src_x = set->x << 16;
1556	primary_state->src_y = set->y << 16;
1557	primary_state->src_h = set->mode->vdisplay << 16;
1558	primary_state->src_w = set->mode->hdisplay << 16;
1559
1560commit:
1561	ret = update_output_state(state, set);
1562	if (ret)
1563		goto fail;
1564
1565	ret = drm_atomic_commit(state);
1566	if (ret != 0)
1567		goto fail;
1568
1569	/* Driver takes ownership of state on successful commit. */
1570	return 0;
1571fail:
1572	if (ret == -EDEADLK)
1573		goto backoff;
1574
1575	drm_atomic_state_free(state);
1576
1577	return ret;
1578backoff:
1579	drm_atomic_state_clear(state);
1580	drm_atomic_legacy_backoff(state);
1581
1582	/*
1583	 * Someone might have exchanged the framebuffer while we dropped locks
1584	 * in the backoff code. We need to fix up the fb refcount tracking the
1585	 * core does for us.
1586	 */
1587	crtc->primary->old_fb = crtc->primary->fb;
1588
1589	goto retry;
1590}
1591EXPORT_SYMBOL(drm_atomic_helper_set_config);
1592
1593/**
1594 * drm_atomic_helper_crtc_set_property - helper for crtc properties
1595 * @crtc: DRM crtc
1596 * @property: DRM property
1597 * @val: value of property
1598 *
1599 * Provides a default crtc set_property handler using the atomic driver
1600 * interface.
1601 *
1602 * RETURNS:
1603 * Zero on success, error code on failure
1604 */
1605int
1606drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc,
1607				    struct drm_property *property,
1608				    uint64_t val)
1609{
1610	struct drm_atomic_state *state;
1611	struct drm_crtc_state *crtc_state;
1612	int ret = 0;
1613
1614	state = drm_atomic_state_alloc(crtc->dev);
1615	if (!state)
1616		return -ENOMEM;
1617
1618	/* ->set_property is always called with all locks held. */
1619	state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
1620retry:
1621	crtc_state = drm_atomic_get_crtc_state(state, crtc);
1622	if (IS_ERR(crtc_state)) {
1623		ret = PTR_ERR(crtc_state);
1624		goto fail;
1625	}
1626
1627	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
1628			property, val);
1629	if (ret)
1630		goto fail;
1631
1632	ret = drm_atomic_commit(state);
1633	if (ret != 0)
1634		goto fail;
1635
1636	/* Driver takes ownership of state on successful commit. */
1637	return 0;
1638fail:
1639	if (ret == -EDEADLK)
1640		goto backoff;
1641
1642	drm_atomic_state_free(state);
1643
1644	return ret;
1645backoff:
1646	drm_atomic_state_clear(state);
1647	drm_atomic_legacy_backoff(state);
1648
1649	goto retry;
1650}
1651EXPORT_SYMBOL(drm_atomic_helper_crtc_set_property);
1652
1653/**
1654 * drm_atomic_helper_plane_set_property - helper for plane properties
1655 * @plane: DRM plane
1656 * @property: DRM property
1657 * @val: value of property
1658 *
1659 * Provides a default plane set_property handler using the atomic driver
1660 * interface.
1661 *
1662 * RETURNS:
1663 * Zero on success, error code on failure
1664 */
1665int
1666drm_atomic_helper_plane_set_property(struct drm_plane *plane,
1667				    struct drm_property *property,
1668				    uint64_t val)
1669{
1670	struct drm_atomic_state *state;
1671	struct drm_plane_state *plane_state;
1672	int ret = 0;
1673
1674	state = drm_atomic_state_alloc(plane->dev);
1675	if (!state)
1676		return -ENOMEM;
1677
1678	/* ->set_property is always called with all locks held. */
1679	state->acquire_ctx = plane->dev->mode_config.acquire_ctx;
1680retry:
1681	plane_state = drm_atomic_get_plane_state(state, plane);
1682	if (IS_ERR(plane_state)) {
1683		ret = PTR_ERR(plane_state);
1684		goto fail;
1685	}
1686
1687	ret = drm_atomic_plane_set_property(plane, plane_state,
1688			property, val);
1689	if (ret)
1690		goto fail;
1691
1692	ret = drm_atomic_commit(state);
1693	if (ret != 0)
1694		goto fail;
1695
1696	/* Driver takes ownership of state on successful commit. */
1697	return 0;
1698fail:
1699	if (ret == -EDEADLK)
1700		goto backoff;
1701
1702	drm_atomic_state_free(state);
1703
1704	return ret;
1705backoff:
1706	drm_atomic_state_clear(state);
1707	drm_atomic_legacy_backoff(state);
1708
1709	goto retry;
1710}
1711EXPORT_SYMBOL(drm_atomic_helper_plane_set_property);
1712
1713/**
1714 * drm_atomic_helper_connector_set_property - helper for connector properties
1715 * @connector: DRM connector
1716 * @property: DRM property
1717 * @val: value of property
1718 *
1719 * Provides a default connector set_property handler using the atomic driver
1720 * interface.
1721 *
1722 * RETURNS:
1723 * Zero on success, error code on failure
1724 */
1725int
1726drm_atomic_helper_connector_set_property(struct drm_connector *connector,
1727				    struct drm_property *property,
1728				    uint64_t val)
1729{
1730	struct drm_atomic_state *state;
1731	struct drm_connector_state *connector_state;
1732	int ret = 0;
1733
1734	state = drm_atomic_state_alloc(connector->dev);
1735	if (!state)
1736		return -ENOMEM;
1737
1738	/* ->set_property is always called with all locks held. */
1739	state->acquire_ctx = connector->dev->mode_config.acquire_ctx;
1740retry:
1741	connector_state = drm_atomic_get_connector_state(state, connector);
1742	if (IS_ERR(connector_state)) {
1743		ret = PTR_ERR(connector_state);
1744		goto fail;
1745	}
1746
1747	ret = drm_atomic_connector_set_property(connector, connector_state,
1748			property, val);
1749	if (ret)
1750		goto fail;
1751
1752	ret = drm_atomic_commit(state);
1753	if (ret != 0)
1754		goto fail;
1755
1756	/* Driver takes ownership of state on successful commit. */
1757	return 0;
1758fail:
1759	if (ret == -EDEADLK)
1760		goto backoff;
1761
1762	drm_atomic_state_free(state);
1763
1764	return ret;
1765backoff:
1766	drm_atomic_state_clear(state);
1767	drm_atomic_legacy_backoff(state);
1768
1769	goto retry;
1770}
1771EXPORT_SYMBOL(drm_atomic_helper_connector_set_property);
1772
1773/**
1774 * drm_atomic_helper_page_flip - execute a legacy page flip
1775 * @crtc: DRM crtc
1776 * @fb: DRM framebuffer
1777 * @event: optional DRM event to signal upon completion
1778 * @flags: flip flags for non-vblank sync'ed updates
1779 *
1780 * Provides a default page flip implementation using the atomic driver interface.
1781 *
1782 * Note that for now so called async page flips (i.e. updates which are not
1783 * synchronized to vblank) are not supported, since the atomic interfaces have
1784 * no provisions for this yet.
1785 *
1786 * Returns:
1787 * Returns 0 on success, negative errno numbers on failure.
1788 */
1789int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
1790				struct drm_framebuffer *fb,
1791				struct drm_pending_vblank_event *event,
1792				uint32_t flags)
1793{
1794	struct drm_plane *plane = crtc->primary;
1795	struct drm_atomic_state *state;
1796	struct drm_plane_state *plane_state;
1797	struct drm_crtc_state *crtc_state;
1798	int ret = 0;
1799
1800	if (flags & DRM_MODE_PAGE_FLIP_ASYNC)
1801		return -EINVAL;
1802
1803	state = drm_atomic_state_alloc(plane->dev);
1804	if (!state)
1805		return -ENOMEM;
1806
1807	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
1808retry:
1809	crtc_state = drm_atomic_get_crtc_state(state, crtc);
1810	if (IS_ERR(crtc_state)) {
1811		ret = PTR_ERR(crtc_state);
1812		goto fail;
1813	}
1814	crtc_state->event = event;
1815
1816	plane_state = drm_atomic_get_plane_state(state, plane);
1817	if (IS_ERR(plane_state)) {
1818		ret = PTR_ERR(plane_state);
1819		goto fail;
1820	}
1821
1822	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
1823	if (ret != 0)
1824		goto fail;
1825	drm_atomic_set_fb_for_plane(plane_state, fb);
1826
1827	ret = drm_atomic_async_commit(state);
1828	if (ret != 0)
1829		goto fail;
1830
1831	/* TODO: ->page_flip is the only driver callback where the core
1832	 * doesn't update plane->fb. For now patch it up here. */
1833	plane->fb = plane->state->fb;
1834
1835	/* Driver takes ownership of state on successful async commit. */
1836	return 0;
1837fail:
1838	if (ret == -EDEADLK)
1839		goto backoff;
1840
1841	drm_atomic_state_free(state);
1842
1843	return ret;
1844backoff:
1845	drm_atomic_state_clear(state);
1846	drm_atomic_legacy_backoff(state);
1847
1848	/*
1849	 * Someone might have exchanged the framebuffer while we dropped locks
1850	 * in the backoff code. We need to fix up the fb refcount tracking the
1851	 * core does for us.
1852	 */
1853	plane->old_fb = plane->fb;
1854
1855	goto retry;
1856}
1857EXPORT_SYMBOL(drm_atomic_helper_page_flip);
1858
1859/**
1860 * drm_atomic_helper_connector_dpms() - connector dpms helper implementation
1861 * @connector: affected connector
1862 * @mode: DPMS mode
1863 *
1864 * This is the main helper function provided by the atomic helper framework for
1865 * implementing the legacy DPMS connector interface. It computes the new desired
1866 * ->active state for the corresponding CRTC (if the connector is enabled) and
1867 *  updates it.
1868 */
1869void drm_atomic_helper_connector_dpms(struct drm_connector *connector,
1870				      int mode)
1871{
1872	struct drm_mode_config *config = &connector->dev->mode_config;
1873	struct drm_atomic_state *state;
1874	struct drm_crtc_state *crtc_state;
1875	struct drm_crtc *crtc;
1876	struct drm_connector *tmp_connector;
1877	int ret;
1878	bool active = false;
1879
1880	if (mode != DRM_MODE_DPMS_ON)
1881		mode = DRM_MODE_DPMS_OFF;
1882
1883	connector->dpms = mode;
1884	crtc = connector->state->crtc;
1885
1886	if (!crtc)
1887		return;
1888
1889	/* FIXME: ->dpms has no return value so can't forward the -ENOMEM. */
1890	state = drm_atomic_state_alloc(connector->dev);
1891	if (!state)
1892		return;
1893
1894	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
1895retry:
1896	crtc_state = drm_atomic_get_crtc_state(state, crtc);
1897	if (IS_ERR(crtc_state))
1898		return;
1899
1900	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
1901
1902	list_for_each_entry(tmp_connector, &config->connector_list, head) {
1903		if (tmp_connector->state->crtc != crtc)
1904			continue;
1905
1906		if (tmp_connector->dpms == DRM_MODE_DPMS_ON) {
1907			active = true;
1908			break;
1909		}
1910	}
1911	crtc_state->active = active;
1912
1913	ret = drm_atomic_commit(state);
1914	if (ret != 0)
1915		goto fail;
1916
1917	/* Driver takes ownership of state on successful async commit. */
1918	return;
1919fail:
1920	if (ret == -EDEADLK)
1921		goto backoff;
1922
1923	drm_atomic_state_free(state);
1924
1925	WARN(1, "Driver bug: Changing ->active failed with ret=%i\n", ret);
1926
1927	return;
1928backoff:
1929	drm_atomic_state_clear(state);
1930	drm_atomic_legacy_backoff(state);
1931
1932	goto retry;
1933}
1934EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
1935
1936/**
1937 * DOC: atomic state reset and initialization
1938 *
1939 * Both the drm core and the atomic helpers assume that there is always the full
1940 * and correct atomic software state for all connectors, CRTCs and planes
1941 * available. Which is a bit a problem on driver load and also after system
1942 * suspend. One way to solve this is to have a hardware state read-out
1943 * infrastructure which reconstructs the full software state (e.g. the i915
1944 * driver).
1945 *
1946 * The simpler solution is to just reset the software state to everything off,
1947 * which is easiest to do by calling drm_mode_config_reset(). To facilitate this
1948 * the atomic helpers provide default reset implementations for all hooks.
1949 */
1950
1951/**
1952 * drm_atomic_helper_crtc_reset - default ->reset hook for CRTCs
1953 * @crtc: drm CRTC
1954 *
1955 * Resets the atomic state for @crtc by freeing the state pointer (which might
1956 * be NULL, e.g. at driver load time) and allocating a new empty state object.
1957 */
1958void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
1959{
1960	kfree(crtc->state);
1961	crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
1962
1963	if (crtc->state)
1964		crtc->state->crtc = crtc;
1965}
1966EXPORT_SYMBOL(drm_atomic_helper_crtc_reset);
1967
1968/**
1969 * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state
1970 * @crtc: CRTC object
1971 * @state: atomic CRTC state
1972 *
1973 * Copies atomic state from a CRTC's current state and resets inferred values.
1974 * This is useful for drivers that subclass the CRTC state.
1975 */
1976void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
1977					      struct drm_crtc_state *state)
1978{
1979	memcpy(state, crtc->state, sizeof(*state));
1980
1981	state->mode_changed = false;
1982	state->active_changed = false;
1983	state->planes_changed = false;
1984	state->event = NULL;
1985}
1986EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state);
1987
1988/**
1989 * drm_atomic_helper_crtc_duplicate_state - default state duplicate hook
1990 * @crtc: drm CRTC
1991 *
1992 * Default CRTC state duplicate hook for drivers which don't have their own
1993 * subclassed CRTC state structure.
1994 */
1995struct drm_crtc_state *
1996drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc)
1997{
1998	struct drm_crtc_state *state;
1999
2000	if (WARN_ON(!crtc->state))
2001		return NULL;
2002
2003	state = kmalloc(sizeof(*state), GFP_KERNEL);
2004	if (state)
2005		__drm_atomic_helper_crtc_duplicate_state(crtc, state);
2006
2007	return state;
2008}
2009EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
2010
2011/**
2012 * __drm_atomic_helper_crtc_destroy_state - release CRTC state
2013 * @crtc: CRTC object
2014 * @state: CRTC state object to release
2015 *
2016 * Releases all resources stored in the CRTC state without actually freeing
2017 * the memory of the CRTC state. This is useful for drivers that subclass the
2018 * CRTC state.
2019 */
2020void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
2021					    struct drm_crtc_state *state)
2022{
2023	/*
2024	 * This is currently a placeholder so that drivers that subclass the
2025	 * state will automatically do the right thing if code is ever added
2026	 * to this function.
2027	 */
2028}
2029EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
2030
2031/**
2032 * drm_atomic_helper_crtc_destroy_state - default state destroy hook
2033 * @crtc: drm CRTC
2034 * @state: CRTC state object to release
2035 *
2036 * Default CRTC state destroy hook for drivers which don't have their own
2037 * subclassed CRTC state structure.
2038 */
2039void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
2040					  struct drm_crtc_state *state)
2041{
2042	__drm_atomic_helper_crtc_destroy_state(crtc, state);
2043	kfree(state);
2044}
2045EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
2046
2047/**
2048 * drm_atomic_helper_plane_reset - default ->reset hook for planes
2049 * @plane: drm plane
2050 *
2051 * Resets the atomic state for @plane by freeing the state pointer (which might
2052 * be NULL, e.g. at driver load time) and allocating a new empty state object.
2053 */
2054void drm_atomic_helper_plane_reset(struct drm_plane *plane)
2055{
2056	if (plane->state && plane->state->fb)
2057		drm_framebuffer_unreference(plane->state->fb);
2058
2059	kfree(plane->state);
2060	plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);
2061
2062	if (plane->state)
2063		plane->state->plane = plane;
2064}
2065EXPORT_SYMBOL(drm_atomic_helper_plane_reset);
2066
2067/**
2068 * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state
2069 * @plane: plane object
2070 * @state: atomic plane state
2071 *
2072 * Copies atomic state from a plane's current state. This is useful for
2073 * drivers that subclass the plane state.
2074 */
2075void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
2076					       struct drm_plane_state *state)
2077{
2078	memcpy(state, plane->state, sizeof(*state));
2079
2080	if (state->fb)
2081		drm_framebuffer_reference(state->fb);
2082}
2083EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state);
2084
2085/**
2086 * drm_atomic_helper_plane_duplicate_state - default state duplicate hook
2087 * @plane: drm plane
2088 *
2089 * Default plane state duplicate hook for drivers which don't have their own
2090 * subclassed plane state structure.
2091 */
2092struct drm_plane_state *
2093drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane)
2094{
2095	struct drm_plane_state *state;
2096
2097	if (WARN_ON(!plane->state))
2098		return NULL;
2099
2100	state = kmalloc(sizeof(*state), GFP_KERNEL);
2101	if (state)
2102		__drm_atomic_helper_plane_duplicate_state(plane, state);
2103
2104	return state;
2105}
2106EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state);
2107
2108/**
2109 * __drm_atomic_helper_plane_destroy_state - release plane state
2110 * @plane: plane object
2111 * @state: plane state object to release
2112 *
2113 * Releases all resources stored in the plane state without actually freeing
2114 * the memory of the plane state. This is useful for drivers that subclass the
2115 * plane state.
2116 */
2117void __drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
2118					     struct drm_plane_state *state)
2119{
2120	if (state->fb)
2121		drm_framebuffer_unreference(state->fb);
2122}
2123EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
2124
2125/**
2126 * drm_atomic_helper_plane_destroy_state - default state destroy hook
2127 * @plane: drm plane
2128 * @state: plane state object to release
2129 *
2130 * Default plane state destroy hook for drivers which don't have their own
2131 * subclassed plane state structure.
2132 */
2133void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
2134					   struct drm_plane_state *state)
2135{
2136	__drm_atomic_helper_plane_destroy_state(plane, state);
2137	kfree(state);
2138}
2139EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state);
2140
2141/**
2142 * drm_atomic_helper_connector_reset - default ->reset hook for connectors
2143 * @connector: drm connector
2144 *
2145 * Resets the atomic state for @connector by freeing the state pointer (which
2146 * might be NULL, e.g. at driver load time) and allocating a new empty state
2147 * object.
2148 */
2149void drm_atomic_helper_connector_reset(struct drm_connector *connector)
2150{
2151	kfree(connector->state);
2152	connector->state = kzalloc(sizeof(*connector->state), GFP_KERNEL);
2153
2154	if (connector->state)
2155		connector->state->connector = connector;
2156}
2157EXPORT_SYMBOL(drm_atomic_helper_connector_reset);
2158
2159/**
2160 * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state
2161 * @connector: connector object
2162 * @state: atomic connector state
2163 *
2164 * Copies atomic state from a connector's current state. This is useful for
2165 * drivers that subclass the connector state.
2166 */
2167void
2168__drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
2169					    struct drm_connector_state *state)
2170{
2171	memcpy(state, connector->state, sizeof(*state));
2172}
2173EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
2174
2175/**
2176 * drm_atomic_helper_connector_duplicate_state - default state duplicate hook
2177 * @connector: drm connector
2178 *
2179 * Default connector state duplicate hook for drivers which don't have their own
2180 * subclassed connector state structure.
2181 */
2182struct drm_connector_state *
2183drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector)
2184{
2185	struct drm_connector_state *state;
2186
2187	if (WARN_ON(!connector->state))
2188		return NULL;
2189
2190	state = kmalloc(sizeof(*state), GFP_KERNEL);
2191	if (state)
2192		__drm_atomic_helper_connector_duplicate_state(connector, state);
2193
2194	return state;
2195}
2196EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
2197
2198/**
2199 * __drm_atomic_helper_connector_destroy_state - release connector state
2200 * @connector: connector object
2201 * @state: connector state object to release
2202 *
2203 * Releases all resources stored in the connector state without actually
2204 * freeing the memory of the connector state. This is useful for drivers that
2205 * subclass the connector state.
2206 */
2207void
2208__drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
2209					    struct drm_connector_state *state)
2210{
2211	/*
2212	 * This is currently a placeholder so that drivers that subclass the
2213	 * state will automatically do the right thing if code is ever added
2214	 * to this function.
2215	 */
2216}
2217EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
2218
2219/**
2220 * drm_atomic_helper_connector_destroy_state - default state destroy hook
2221 * @connector: drm connector
2222 * @state: connector state object to release
2223 *
2224 * Default connector state destroy hook for drivers which don't have their own
2225 * subclassed connector state structure.
2226 */
2227void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
2228					  struct drm_connector_state *state)
2229{
2230	__drm_atomic_helper_connector_destroy_state(connector, state);
2231	kfree(state);
2232}
2233EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
2234