Subversion Repositories Kolibri OS

Rev

Rev 6084 | Rev 6935 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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