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