1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include <linux/sync_file.h>
31
32#include <drm/drm_atomic.h>
33#include <drm/drm_atomic_uapi.h>
34#include <drm/drm_bridge.h>
35#include <drm/drm_debugfs.h>
36#include <drm/drm_device.h>
37#include <drm/drm_drv.h>
38#include <drm/drm_file.h>
39#include <drm/drm_fourcc.h>
40#include <drm/drm_mode.h>
41#include <drm/drm_print.h>
42#include <drm/drm_writeback.h>
43
44#include "drm_crtc_internal.h"
45#include "drm_internal.h"
46
47void __drm_crtc_commit_free(struct kref *kref)
48{
49 struct drm_crtc_commit *commit =
50 container_of(kref, struct drm_crtc_commit, ref);
51
52 kfree(commit);
53}
54EXPORT_SYMBOL(__drm_crtc_commit_free);
55
56
57
58
59
60
61
62
63
64
65
66
67int drm_crtc_commit_wait(struct drm_crtc_commit *commit)
68{
69 unsigned long timeout = 10 * HZ;
70 int ret;
71
72 if (!commit)
73 return 0;
74
75 ret = wait_for_completion_timeout(&commit->hw_done, timeout);
76 if (!ret) {
77 DRM_ERROR("hw_done timed out\n");
78 return -ETIMEDOUT;
79 }
80
81
82
83
84
85 ret = wait_for_completion_timeout(&commit->flip_done, timeout);
86 if (!ret) {
87 DRM_ERROR("flip_done timed out\n");
88 return -ETIMEDOUT;
89 }
90
91 return 0;
92}
93EXPORT_SYMBOL(drm_crtc_commit_wait);
94
95
96
97
98
99
100
101
102
103
104void drm_atomic_state_default_release(struct drm_atomic_state *state)
105{
106 kfree(state->connectors);
107 kfree(state->crtcs);
108 kfree(state->planes);
109 kfree(state->private_objs);
110}
111EXPORT_SYMBOL(drm_atomic_state_default_release);
112
113
114
115
116
117
118
119
120
121
122int
123drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state)
124{
125 kref_init(&state->ref);
126
127
128
129
130 state->allow_modeset = true;
131
132 state->crtcs = kcalloc(dev->mode_config.num_crtc,
133 sizeof(*state->crtcs), GFP_KERNEL);
134 if (!state->crtcs)
135 goto fail;
136 state->planes = kcalloc(dev->mode_config.num_total_plane,
137 sizeof(*state->planes), GFP_KERNEL);
138 if (!state->planes)
139 goto fail;
140
141 state->dev = dev;
142
143 DRM_DEBUG_ATOMIC("Allocated atomic state %p\n", state);
144
145 return 0;
146fail:
147 drm_atomic_state_default_release(state);
148 return -ENOMEM;
149}
150EXPORT_SYMBOL(drm_atomic_state_init);
151
152
153
154
155
156
157
158struct drm_atomic_state *
159drm_atomic_state_alloc(struct drm_device *dev)
160{
161 struct drm_mode_config *config = &dev->mode_config;
162
163 if (!config->funcs->atomic_state_alloc) {
164 struct drm_atomic_state *state;
165
166 state = kzalloc(sizeof(*state), GFP_KERNEL);
167 if (!state)
168 return NULL;
169 if (drm_atomic_state_init(dev, state) < 0) {
170 kfree(state);
171 return NULL;
172 }
173 return state;
174 }
175
176 return config->funcs->atomic_state_alloc(dev);
177}
178EXPORT_SYMBOL(drm_atomic_state_alloc);
179
180
181
182
183
184
185
186
187
188void drm_atomic_state_default_clear(struct drm_atomic_state *state)
189{
190 struct drm_device *dev = state->dev;
191 struct drm_mode_config *config = &dev->mode_config;
192 int i;
193
194 DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state);
195
196 for (i = 0; i < state->num_connector; i++) {
197 struct drm_connector *connector = state->connectors[i].ptr;
198
199 if (!connector)
200 continue;
201
202 connector->funcs->atomic_destroy_state(connector,
203 state->connectors[i].state);
204 state->connectors[i].ptr = NULL;
205 state->connectors[i].state = NULL;
206 state->connectors[i].old_state = NULL;
207 state->connectors[i].new_state = NULL;
208 drm_connector_put(connector);
209 }
210
211 for (i = 0; i < config->num_crtc; i++) {
212 struct drm_crtc *crtc = state->crtcs[i].ptr;
213
214 if (!crtc)
215 continue;
216
217 crtc->funcs->atomic_destroy_state(crtc,
218 state->crtcs[i].state);
219
220 state->crtcs[i].ptr = NULL;
221 state->crtcs[i].state = NULL;
222 state->crtcs[i].old_state = NULL;
223 state->crtcs[i].new_state = NULL;
224
225 if (state->crtcs[i].commit) {
226 drm_crtc_commit_put(state->crtcs[i].commit);
227 state->crtcs[i].commit = NULL;
228 }
229 }
230
231 for (i = 0; i < config->num_total_plane; i++) {
232 struct drm_plane *plane = state->planes[i].ptr;
233
234 if (!plane)
235 continue;
236
237 plane->funcs->atomic_destroy_state(plane,
238 state->planes[i].state);
239 state->planes[i].ptr = NULL;
240 state->planes[i].state = NULL;
241 state->planes[i].old_state = NULL;
242 state->planes[i].new_state = NULL;
243 }
244
245 for (i = 0; i < state->num_private_objs; i++) {
246 struct drm_private_obj *obj = state->private_objs[i].ptr;
247
248 obj->funcs->atomic_destroy_state(obj,
249 state->private_objs[i].state);
250 state->private_objs[i].ptr = NULL;
251 state->private_objs[i].state = NULL;
252 state->private_objs[i].old_state = NULL;
253 state->private_objs[i].new_state = NULL;
254 }
255 state->num_private_objs = 0;
256
257 if (state->fake_commit) {
258 drm_crtc_commit_put(state->fake_commit);
259 state->fake_commit = NULL;
260 }
261}
262EXPORT_SYMBOL(drm_atomic_state_default_clear);
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278void drm_atomic_state_clear(struct drm_atomic_state *state)
279{
280 struct drm_device *dev = state->dev;
281 struct drm_mode_config *config = &dev->mode_config;
282
283 if (config->funcs->atomic_state_clear)
284 config->funcs->atomic_state_clear(state);
285 else
286 drm_atomic_state_default_clear(state);
287}
288EXPORT_SYMBOL(drm_atomic_state_clear);
289
290
291
292
293
294
295
296
297void __drm_atomic_state_free(struct kref *ref)
298{
299 struct drm_atomic_state *state = container_of(ref, typeof(*state), ref);
300 struct drm_mode_config *config = &state->dev->mode_config;
301
302 drm_atomic_state_clear(state);
303
304 DRM_DEBUG_ATOMIC("Freeing atomic state %p\n", state);
305
306 if (config->funcs->atomic_state_free) {
307 config->funcs->atomic_state_free(state);
308 } else {
309 drm_atomic_state_default_release(state);
310 kfree(state);
311 }
312}
313EXPORT_SYMBOL(__drm_atomic_state_free);
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334struct drm_crtc_state *
335drm_atomic_get_crtc_state(struct drm_atomic_state *state,
336 struct drm_crtc *crtc)
337{
338 int ret, index = drm_crtc_index(crtc);
339 struct drm_crtc_state *crtc_state;
340
341 WARN_ON(!state->acquire_ctx);
342
343 crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
344 if (crtc_state)
345 return crtc_state;
346
347 ret = drm_modeset_lock(&crtc->mutex, state->acquire_ctx);
348 if (ret)
349 return ERR_PTR(ret);
350
351 crtc_state = crtc->funcs->atomic_duplicate_state(crtc);
352 if (!crtc_state)
353 return ERR_PTR(-ENOMEM);
354
355 state->crtcs[index].state = crtc_state;
356 state->crtcs[index].old_state = crtc->state;
357 state->crtcs[index].new_state = crtc_state;
358 state->crtcs[index].ptr = crtc;
359 crtc_state->state = state;
360
361 DRM_DEBUG_ATOMIC("Added [CRTC:%d:%s] %p state to %p\n",
362 crtc->base.id, crtc->name, crtc_state, state);
363
364 return crtc_state;
365}
366EXPORT_SYMBOL(drm_atomic_get_crtc_state);
367
368static int drm_atomic_crtc_check(const struct drm_crtc_state *old_crtc_state,
369 const struct drm_crtc_state *new_crtc_state)
370{
371 struct drm_crtc *crtc = new_crtc_state->crtc;
372
373
374
375
376
377
378
379
380
381 if (new_crtc_state->active && !new_crtc_state->enable) {
382 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active without enabled\n",
383 crtc->base.id, crtc->name);
384 return -EINVAL;
385 }
386
387
388
389
390
391 if (drm_core_check_feature(crtc->dev, DRIVER_ATOMIC) &&
392 WARN_ON(new_crtc_state->enable && !new_crtc_state->mode_blob)) {
393 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled without mode blob\n",
394 crtc->base.id, crtc->name);
395 return -EINVAL;
396 }
397
398 if (drm_core_check_feature(crtc->dev, DRIVER_ATOMIC) &&
399 WARN_ON(!new_crtc_state->enable && new_crtc_state->mode_blob)) {
400 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] disabled with mode blob\n",
401 crtc->base.id, crtc->name);
402 return -EINVAL;
403 }
404
405
406
407
408
409
410
411
412
413
414
415 if (new_crtc_state->event &&
416 !new_crtc_state->active && !old_crtc_state->active) {
417 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] requesting event but off\n",
418 crtc->base.id, crtc->name);
419 return -EINVAL;
420 }
421
422 return 0;
423}
424
425static void drm_atomic_crtc_print_state(struct drm_printer *p,
426 const struct drm_crtc_state *state)
427{
428 struct drm_crtc *crtc = state->crtc;
429
430 drm_printf(p, "crtc[%u]: %s\n", crtc->base.id, crtc->name);
431 drm_printf(p, "\tenable=%d\n", state->enable);
432 drm_printf(p, "\tactive=%d\n", state->active);
433 drm_printf(p, "\tself_refresh_active=%d\n", state->self_refresh_active);
434 drm_printf(p, "\tplanes_changed=%d\n", state->planes_changed);
435 drm_printf(p, "\tmode_changed=%d\n", state->mode_changed);
436 drm_printf(p, "\tactive_changed=%d\n", state->active_changed);
437 drm_printf(p, "\tconnectors_changed=%d\n", state->connectors_changed);
438 drm_printf(p, "\tcolor_mgmt_changed=%d\n", state->color_mgmt_changed);
439 drm_printf(p, "\tplane_mask=%x\n", state->plane_mask);
440 drm_printf(p, "\tconnector_mask=%x\n", state->connector_mask);
441 drm_printf(p, "\tencoder_mask=%x\n", state->encoder_mask);
442 drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode));
443
444 if (crtc->funcs->atomic_print_state)
445 crtc->funcs->atomic_print_state(p, state);
446}
447
448static int drm_atomic_connector_check(struct drm_connector *connector,
449 struct drm_connector_state *state)
450{
451 struct drm_crtc_state *crtc_state;
452 struct drm_writeback_job *writeback_job = state->writeback_job;
453 const struct drm_display_info *info = &connector->display_info;
454
455 state->max_bpc = info->bpc ? info->bpc : 8;
456 if (connector->max_bpc_property)
457 state->max_bpc = min(state->max_bpc, state->max_requested_bpc);
458
459 if ((connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK) || !writeback_job)
460 return 0;
461
462 if (writeback_job->fb && !state->crtc) {
463 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] framebuffer without CRTC\n",
464 connector->base.id, connector->name);
465 return -EINVAL;
466 }
467
468 if (state->crtc)
469 crtc_state = drm_atomic_get_existing_crtc_state(state->state,
470 state->crtc);
471
472 if (writeback_job->fb && !crtc_state->active) {
473 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] has framebuffer, but [CRTC:%d] is off\n",
474 connector->base.id, connector->name,
475 state->crtc->base.id);
476 return -EINVAL;
477 }
478
479 if (!writeback_job->fb) {
480 if (writeback_job->out_fence) {
481 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] requesting out-fence without framebuffer\n",
482 connector->base.id, connector->name);
483 return -EINVAL;
484 }
485
486 drm_writeback_cleanup_job(writeback_job);
487 state->writeback_job = NULL;
488 }
489
490 return 0;
491}
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508struct drm_plane_state *
509drm_atomic_get_plane_state(struct drm_atomic_state *state,
510 struct drm_plane *plane)
511{
512 int ret, index = drm_plane_index(plane);
513 struct drm_plane_state *plane_state;
514
515 WARN_ON(!state->acquire_ctx);
516
517
518 WARN_ON(plane->fb);
519 WARN_ON(plane->old_fb);
520 WARN_ON(plane->crtc);
521
522 plane_state = drm_atomic_get_existing_plane_state(state, plane);
523 if (plane_state)
524 return plane_state;
525
526 ret = drm_modeset_lock(&plane->mutex, state->acquire_ctx);
527 if (ret)
528 return ERR_PTR(ret);
529
530 plane_state = plane->funcs->atomic_duplicate_state(plane);
531 if (!plane_state)
532 return ERR_PTR(-ENOMEM);
533
534 state->planes[index].state = plane_state;
535 state->planes[index].ptr = plane;
536 state->planes[index].old_state = plane->state;
537 state->planes[index].new_state = plane_state;
538 plane_state->state = state;
539
540 DRM_DEBUG_ATOMIC("Added [PLANE:%d:%s] %p state to %p\n",
541 plane->base.id, plane->name, plane_state, state);
542
543 if (plane_state->crtc) {
544 struct drm_crtc_state *crtc_state;
545
546 crtc_state = drm_atomic_get_crtc_state(state,
547 plane_state->crtc);
548 if (IS_ERR(crtc_state))
549 return ERR_CAST(crtc_state);
550 }
551
552 return plane_state;
553}
554EXPORT_SYMBOL(drm_atomic_get_plane_state);
555
556static bool
557plane_switching_crtc(const struct drm_plane_state *old_plane_state,
558 const struct drm_plane_state *new_plane_state)
559{
560 if (!old_plane_state->crtc || !new_plane_state->crtc)
561 return false;
562
563 if (old_plane_state->crtc == new_plane_state->crtc)
564 return false;
565
566
567
568
569
570
571 return true;
572}
573
574
575
576
577
578
579
580
581
582
583
584static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
585 const struct drm_plane_state *new_plane_state)
586{
587 struct drm_plane *plane = new_plane_state->plane;
588 struct drm_crtc *crtc = new_plane_state->crtc;
589 const struct drm_framebuffer *fb = new_plane_state->fb;
590 unsigned int fb_width, fb_height;
591 struct drm_mode_rect *clips;
592 uint32_t num_clips;
593 int ret;
594
595
596 if (crtc && !fb) {
597 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] CRTC set but no FB\n",
598 plane->base.id, plane->name);
599 return -EINVAL;
600 } else if (fb && !crtc) {
601 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] FB set but no CRTC\n",
602 plane->base.id, plane->name);
603 return -EINVAL;
604 }
605
606
607 if (!crtc)
608 return 0;
609
610
611 if (!(plane->possible_crtcs & drm_crtc_mask(crtc))) {
612 DRM_DEBUG_ATOMIC("Invalid [CRTC:%d:%s] for [PLANE:%d:%s]\n",
613 crtc->base.id, crtc->name,
614 plane->base.id, plane->name);
615 return -EINVAL;
616 }
617
618
619 ret = drm_plane_check_pixel_format(plane, fb->format->format,
620 fb->modifier);
621 if (ret) {
622 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid pixel format %p4cc, modifier 0x%llx\n",
623 plane->base.id, plane->name,
624 &fb->format->format, fb->modifier);
625 return ret;
626 }
627
628
629 if (new_plane_state->crtc_w > INT_MAX ||
630 new_plane_state->crtc_x > INT_MAX - (int32_t) new_plane_state->crtc_w ||
631 new_plane_state->crtc_h > INT_MAX ||
632 new_plane_state->crtc_y > INT_MAX - (int32_t) new_plane_state->crtc_h) {
633 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid CRTC coordinates %ux%u+%d+%d\n",
634 plane->base.id, plane->name,
635 new_plane_state->crtc_w, new_plane_state->crtc_h,
636 new_plane_state->crtc_x, new_plane_state->crtc_y);
637 return -ERANGE;
638 }
639
640 fb_width = fb->width << 16;
641 fb_height = fb->height << 16;
642
643
644 if (new_plane_state->src_w > fb_width ||
645 new_plane_state->src_x > fb_width - new_plane_state->src_w ||
646 new_plane_state->src_h > fb_height ||
647 new_plane_state->src_y > fb_height - new_plane_state->src_h) {
648 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid source coordinates "
649 "%u.%06ux%u.%06u+%u.%06u+%u.%06u (fb %ux%u)\n",
650 plane->base.id, plane->name,
651 new_plane_state->src_w >> 16,
652 ((new_plane_state->src_w & 0xffff) * 15625) >> 10,
653 new_plane_state->src_h >> 16,
654 ((new_plane_state->src_h & 0xffff) * 15625) >> 10,
655 new_plane_state->src_x >> 16,
656 ((new_plane_state->src_x & 0xffff) * 15625) >> 10,
657 new_plane_state->src_y >> 16,
658 ((new_plane_state->src_y & 0xffff) * 15625) >> 10,
659 fb->width, fb->height);
660 return -ENOSPC;
661 }
662
663 clips = drm_plane_get_damage_clips(new_plane_state);
664 num_clips = drm_plane_get_damage_clips_count(new_plane_state);
665
666
667 while (num_clips > 0) {
668 if (clips->x1 >= clips->x2 ||
669 clips->y1 >= clips->y2 ||
670 clips->x1 < 0 ||
671 clips->y1 < 0 ||
672 clips->x2 > fb_width ||
673 clips->y2 > fb_height) {
674 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid damage clip %d %d %d %d\n",
675 plane->base.id, plane->name, clips->x1,
676 clips->y1, clips->x2, clips->y2);
677 return -EINVAL;
678 }
679 clips++;
680 num_clips--;
681 }
682
683 if (plane_switching_crtc(old_plane_state, new_plane_state)) {
684 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] switching CRTC directly\n",
685 plane->base.id, plane->name);
686 return -EINVAL;
687 }
688
689 return 0;
690}
691
692static void drm_atomic_plane_print_state(struct drm_printer *p,
693 const struct drm_plane_state *state)
694{
695 struct drm_plane *plane = state->plane;
696 struct drm_rect src = drm_plane_state_src(state);
697 struct drm_rect dest = drm_plane_state_dest(state);
698
699 drm_printf(p, "plane[%u]: %s\n", plane->base.id, plane->name);
700 drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)");
701 drm_printf(p, "\tfb=%u\n", state->fb ? state->fb->base.id : 0);
702 if (state->fb)
703 drm_framebuffer_print_info(p, 2, state->fb);
704 drm_printf(p, "\tcrtc-pos=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&dest));
705 drm_printf(p, "\tsrc-pos=" DRM_RECT_FP_FMT "\n", DRM_RECT_FP_ARG(&src));
706 drm_printf(p, "\trotation=%x\n", state->rotation);
707 drm_printf(p, "\tnormalized-zpos=%x\n", state->normalized_zpos);
708 drm_printf(p, "\tcolor-encoding=%s\n",
709 drm_get_color_encoding_name(state->color_encoding));
710 drm_printf(p, "\tcolor-range=%s\n",
711 drm_get_color_range_name(state->color_range));
712
713 if (plane->funcs->atomic_print_state)
714 plane->funcs->atomic_print_state(p, state);
715}
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766void
767drm_atomic_private_obj_init(struct drm_device *dev,
768 struct drm_private_obj *obj,
769 struct drm_private_state *state,
770 const struct drm_private_state_funcs *funcs)
771{
772 memset(obj, 0, sizeof(*obj));
773
774 drm_modeset_lock_init(&obj->lock);
775
776 obj->state = state;
777 obj->funcs = funcs;
778 list_add_tail(&obj->head, &dev->mode_config.privobj_list);
779}
780EXPORT_SYMBOL(drm_atomic_private_obj_init);
781
782
783
784
785
786
787
788void
789drm_atomic_private_obj_fini(struct drm_private_obj *obj)
790{
791 list_del(&obj->head);
792 obj->funcs->atomic_destroy_state(obj, obj->state);
793 drm_modeset_lock_fini(&obj->lock);
794}
795EXPORT_SYMBOL(drm_atomic_private_obj_fini);
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810struct drm_private_state *
811drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
812 struct drm_private_obj *obj)
813{
814 int index, num_objs, i, ret;
815 size_t size;
816 struct __drm_private_objs_state *arr;
817 struct drm_private_state *obj_state;
818
819 for (i = 0; i < state->num_private_objs; i++)
820 if (obj == state->private_objs[i].ptr)
821 return state->private_objs[i].state;
822
823 ret = drm_modeset_lock(&obj->lock, state->acquire_ctx);
824 if (ret)
825 return ERR_PTR(ret);
826
827 num_objs = state->num_private_objs + 1;
828 size = sizeof(*state->private_objs) * num_objs;
829 arr = krealloc(state->private_objs, size, GFP_KERNEL);
830 if (!arr)
831 return ERR_PTR(-ENOMEM);
832
833 state->private_objs = arr;
834 index = state->num_private_objs;
835 memset(&state->private_objs[index], 0, sizeof(*state->private_objs));
836
837 obj_state = obj->funcs->atomic_duplicate_state(obj);
838 if (!obj_state)
839 return ERR_PTR(-ENOMEM);
840
841 state->private_objs[index].state = obj_state;
842 state->private_objs[index].old_state = obj->state;
843 state->private_objs[index].new_state = obj_state;
844 state->private_objs[index].ptr = obj;
845 obj_state->state = state;
846
847 state->num_private_objs = num_objs;
848
849 DRM_DEBUG_ATOMIC("Added new private object %p state %p to %p\n",
850 obj, obj_state, state);
851
852 return obj_state;
853}
854EXPORT_SYMBOL(drm_atomic_get_private_obj_state);
855
856
857
858
859
860
861
862
863
864struct drm_private_state *
865drm_atomic_get_old_private_obj_state(struct drm_atomic_state *state,
866 struct drm_private_obj *obj)
867{
868 int i;
869
870 for (i = 0; i < state->num_private_objs; i++)
871 if (obj == state->private_objs[i].ptr)
872 return state->private_objs[i].old_state;
873
874 return NULL;
875}
876EXPORT_SYMBOL(drm_atomic_get_old_private_obj_state);
877
878
879
880
881
882
883
884
885
886struct drm_private_state *
887drm_atomic_get_new_private_obj_state(struct drm_atomic_state *state,
888 struct drm_private_obj *obj)
889{
890 int i;
891
892 for (i = 0; i < state->num_private_objs; i++)
893 if (obj == state->private_objs[i].ptr)
894 return state->private_objs[i].new_state;
895
896 return NULL;
897}
898EXPORT_SYMBOL(drm_atomic_get_new_private_obj_state);
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918struct drm_connector *
919drm_atomic_get_old_connector_for_encoder(struct drm_atomic_state *state,
920 struct drm_encoder *encoder)
921{
922 struct drm_connector_state *conn_state;
923 struct drm_connector *connector;
924 unsigned int i;
925
926 for_each_old_connector_in_state(state, connector, conn_state, i) {
927 if (conn_state->best_encoder == encoder)
928 return connector;
929 }
930
931 return NULL;
932}
933EXPORT_SYMBOL(drm_atomic_get_old_connector_for_encoder);
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952struct drm_connector *
953drm_atomic_get_new_connector_for_encoder(struct drm_atomic_state *state,
954 struct drm_encoder *encoder)
955{
956 struct drm_connector_state *conn_state;
957 struct drm_connector *connector;
958 unsigned int i;
959
960 for_each_new_connector_in_state(state, connector, conn_state, i) {
961 if (conn_state->best_encoder == encoder)
962 return connector;
963 }
964
965 return NULL;
966}
967EXPORT_SYMBOL(drm_atomic_get_new_connector_for_encoder);
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984struct drm_connector_state *
985drm_atomic_get_connector_state(struct drm_atomic_state *state,
986 struct drm_connector *connector)
987{
988 int ret, index;
989 struct drm_mode_config *config = &connector->dev->mode_config;
990 struct drm_connector_state *connector_state;
991
992 WARN_ON(!state->acquire_ctx);
993
994 ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx);
995 if (ret)
996 return ERR_PTR(ret);
997
998 index = drm_connector_index(connector);
999
1000 if (index >= state->num_connector) {
1001 struct __drm_connnectors_state *c;
1002 int alloc = max(index + 1, config->num_connector);
1003
1004 c = krealloc_array(state->connectors, alloc,
1005 sizeof(*state->connectors), GFP_KERNEL);
1006 if (!c)
1007 return ERR_PTR(-ENOMEM);
1008
1009 state->connectors = c;
1010 memset(&state->connectors[state->num_connector], 0,
1011 sizeof(*state->connectors) * (alloc - state->num_connector));
1012
1013 state->num_connector = alloc;
1014 }
1015
1016 if (state->connectors[index].state)
1017 return state->connectors[index].state;
1018
1019 connector_state = connector->funcs->atomic_duplicate_state(connector);
1020 if (!connector_state)
1021 return ERR_PTR(-ENOMEM);
1022
1023 drm_connector_get(connector);
1024 state->connectors[index].state = connector_state;
1025 state->connectors[index].old_state = connector->state;
1026 state->connectors[index].new_state = connector_state;
1027 state->connectors[index].ptr = connector;
1028 connector_state->state = state;
1029
1030 DRM_DEBUG_ATOMIC("Added [CONNECTOR:%d:%s] %p state to %p\n",
1031 connector->base.id, connector->name,
1032 connector_state, state);
1033
1034 if (connector_state->crtc) {
1035 struct drm_crtc_state *crtc_state;
1036
1037 crtc_state = drm_atomic_get_crtc_state(state,
1038 connector_state->crtc);
1039 if (IS_ERR(crtc_state))
1040 return ERR_CAST(crtc_state);
1041 }
1042
1043 return connector_state;
1044}
1045EXPORT_SYMBOL(drm_atomic_get_connector_state);
1046
1047static void drm_atomic_connector_print_state(struct drm_printer *p,
1048 const struct drm_connector_state *state)
1049{
1050 struct drm_connector *connector = state->connector;
1051
1052 drm_printf(p, "connector[%u]: %s\n", connector->base.id, connector->name);
1053 drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)");
1054 drm_printf(p, "\tself_refresh_aware=%d\n", state->self_refresh_aware);
1055
1056 if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
1057 if (state->writeback_job && state->writeback_job->fb)
1058 drm_printf(p, "\tfb=%d\n", state->writeback_job->fb->base.id);
1059
1060 if (connector->funcs->atomic_print_state)
1061 connector->funcs->atomic_print_state(p, state);
1062}
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079struct drm_bridge_state *
1080drm_atomic_get_bridge_state(struct drm_atomic_state *state,
1081 struct drm_bridge *bridge)
1082{
1083 struct drm_private_state *obj_state;
1084
1085 obj_state = drm_atomic_get_private_obj_state(state, &bridge->base);
1086 if (IS_ERR(obj_state))
1087 return ERR_CAST(obj_state);
1088
1089 return drm_priv_to_bridge_state(obj_state);
1090}
1091EXPORT_SYMBOL(drm_atomic_get_bridge_state);
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101struct drm_bridge_state *
1102drm_atomic_get_old_bridge_state(struct drm_atomic_state *state,
1103 struct drm_bridge *bridge)
1104{
1105 struct drm_private_state *obj_state;
1106
1107 obj_state = drm_atomic_get_old_private_obj_state(state, &bridge->base);
1108 if (!obj_state)
1109 return NULL;
1110
1111 return drm_priv_to_bridge_state(obj_state);
1112}
1113EXPORT_SYMBOL(drm_atomic_get_old_bridge_state);
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123struct drm_bridge_state *
1124drm_atomic_get_new_bridge_state(struct drm_atomic_state *state,
1125 struct drm_bridge *bridge)
1126{
1127 struct drm_private_state *obj_state;
1128
1129 obj_state = drm_atomic_get_new_private_obj_state(state, &bridge->base);
1130 if (!obj_state)
1131 return NULL;
1132
1133 return drm_priv_to_bridge_state(obj_state);
1134}
1135EXPORT_SYMBOL(drm_atomic_get_new_bridge_state);
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153int
1154drm_atomic_add_encoder_bridges(struct drm_atomic_state *state,
1155 struct drm_encoder *encoder)
1156{
1157 struct drm_bridge_state *bridge_state;
1158 struct drm_bridge *bridge;
1159
1160 if (!encoder)
1161 return 0;
1162
1163 DRM_DEBUG_ATOMIC("Adding all bridges for [encoder:%d:%s] to %p\n",
1164 encoder->base.id, encoder->name, state);
1165
1166 drm_for_each_bridge_in_chain(encoder, bridge) {
1167
1168 if (!bridge->funcs->atomic_duplicate_state)
1169 continue;
1170
1171 bridge_state = drm_atomic_get_bridge_state(state, bridge);
1172 if (IS_ERR(bridge_state))
1173 return PTR_ERR(bridge_state);
1174 }
1175
1176 return 0;
1177}
1178EXPORT_SYMBOL(drm_atomic_add_encoder_bridges);
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197int
1198drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
1199 struct drm_crtc *crtc)
1200{
1201 struct drm_mode_config *config = &state->dev->mode_config;
1202 struct drm_connector *connector;
1203 struct drm_connector_state *conn_state;
1204 struct drm_connector_list_iter conn_iter;
1205 struct drm_crtc_state *crtc_state;
1206 int ret;
1207
1208 crtc_state = drm_atomic_get_crtc_state(state, crtc);
1209 if (IS_ERR(crtc_state))
1210 return PTR_ERR(crtc_state);
1211
1212 ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx);
1213 if (ret)
1214 return ret;
1215
1216 DRM_DEBUG_ATOMIC("Adding all current connectors for [CRTC:%d:%s] to %p\n",
1217 crtc->base.id, crtc->name, state);
1218
1219
1220
1221
1222
1223 drm_connector_list_iter_begin(state->dev, &conn_iter);
1224 drm_for_each_connector_iter(connector, &conn_iter) {
1225 if (!(crtc_state->connector_mask & drm_connector_mask(connector)))
1226 continue;
1227
1228 conn_state = drm_atomic_get_connector_state(state, connector);
1229 if (IS_ERR(conn_state)) {
1230 drm_connector_list_iter_end(&conn_iter);
1231 return PTR_ERR(conn_state);
1232 }
1233 }
1234 drm_connector_list_iter_end(&conn_iter);
1235
1236 return 0;
1237}
1238EXPORT_SYMBOL(drm_atomic_add_affected_connectors);
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260int
1261drm_atomic_add_affected_planes(struct drm_atomic_state *state,
1262 struct drm_crtc *crtc)
1263{
1264 const struct drm_crtc_state *old_crtc_state =
1265 drm_atomic_get_old_crtc_state(state, crtc);
1266 struct drm_plane *plane;
1267
1268 WARN_ON(!drm_atomic_get_new_crtc_state(state, crtc));
1269
1270 DRM_DEBUG_ATOMIC("Adding all current planes for [CRTC:%d:%s] to %p\n",
1271 crtc->base.id, crtc->name, state);
1272
1273 drm_for_each_plane_mask(plane, state->dev, old_crtc_state->plane_mask) {
1274 struct drm_plane_state *plane_state =
1275 drm_atomic_get_plane_state(state, plane);
1276
1277 if (IS_ERR(plane_state))
1278 return PTR_ERR(plane_state);
1279 }
1280 return 0;
1281}
1282EXPORT_SYMBOL(drm_atomic_add_affected_planes);
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295int drm_atomic_check_only(struct drm_atomic_state *state)
1296{
1297 struct drm_device *dev = state->dev;
1298 struct drm_mode_config *config = &dev->mode_config;
1299 struct drm_plane *plane;
1300 struct drm_plane_state *old_plane_state;
1301 struct drm_plane_state *new_plane_state;
1302 struct drm_crtc *crtc;
1303 struct drm_crtc_state *old_crtc_state;
1304 struct drm_crtc_state *new_crtc_state;
1305 struct drm_connector *conn;
1306 struct drm_connector_state *conn_state;
1307 unsigned int requested_crtc = 0;
1308 unsigned int affected_crtc = 0;
1309 int i, ret = 0;
1310
1311 DRM_DEBUG_ATOMIC("checking %p\n", state);
1312
1313 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
1314 requested_crtc |= drm_crtc_mask(crtc);
1315
1316 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
1317 ret = drm_atomic_plane_check(old_plane_state, new_plane_state);
1318 if (ret) {
1319 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic core check failed\n",
1320 plane->base.id, plane->name);
1321 return ret;
1322 }
1323 }
1324
1325 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
1326 ret = drm_atomic_crtc_check(old_crtc_state, new_crtc_state);
1327 if (ret) {
1328 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic core check failed\n",
1329 crtc->base.id, crtc->name);
1330 return ret;
1331 }
1332 }
1333
1334 for_each_new_connector_in_state(state, conn, conn_state, i) {
1335 ret = drm_atomic_connector_check(conn, conn_state);
1336 if (ret) {
1337 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] atomic core check failed\n",
1338 conn->base.id, conn->name);
1339 return ret;
1340 }
1341 }
1342
1343 if (config->funcs->atomic_check) {
1344 ret = config->funcs->atomic_check(state->dev, state);
1345
1346 if (ret) {
1347 DRM_DEBUG_ATOMIC("atomic driver check for %p failed: %d\n",
1348 state, ret);
1349 return ret;
1350 }
1351 }
1352
1353 if (!state->allow_modeset) {
1354 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
1355 if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
1356 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] requires full modeset\n",
1357 crtc->base.id, crtc->name);
1358 return -EINVAL;
1359 }
1360 }
1361 }
1362
1363 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
1364 affected_crtc |= drm_crtc_mask(crtc);
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376 if (affected_crtc != requested_crtc) {
1377 DRM_DEBUG_ATOMIC("driver added CRTC to commit: requested 0x%x, affected 0x%0x\n",
1378 requested_crtc, affected_crtc);
1379 WARN(!state->allow_modeset, "adding CRTC not allowed without modesets: requested 0x%x, affected 0x%0x\n",
1380 requested_crtc, affected_crtc);
1381 }
1382
1383 return 0;
1384}
1385EXPORT_SYMBOL(drm_atomic_check_only);
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401int drm_atomic_commit(struct drm_atomic_state *state)
1402{
1403 struct drm_mode_config *config = &state->dev->mode_config;
1404 int ret;
1405
1406 ret = drm_atomic_check_only(state);
1407 if (ret)
1408 return ret;
1409
1410 DRM_DEBUG_ATOMIC("committing %p\n", state);
1411
1412 return config->funcs->atomic_commit(state->dev, state, false);
1413}
1414EXPORT_SYMBOL(drm_atomic_commit);
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430int drm_atomic_nonblocking_commit(struct drm_atomic_state *state)
1431{
1432 struct drm_mode_config *config = &state->dev->mode_config;
1433 int ret;
1434
1435 ret = drm_atomic_check_only(state);
1436 if (ret)
1437 return ret;
1438
1439 DRM_DEBUG_ATOMIC("committing %p nonblocking\n", state);
1440
1441 return config->funcs->atomic_commit(state->dev, state, true);
1442}
1443EXPORT_SYMBOL(drm_atomic_nonblocking_commit);
1444
1445
1446int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
1447 struct drm_plane_state *plane_state)
1448{
1449 int ret;
1450
1451 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
1452 if (ret != 0)
1453 return ret;
1454
1455 drm_atomic_set_fb_for_plane(plane_state, NULL);
1456 plane_state->crtc_x = 0;
1457 plane_state->crtc_y = 0;
1458 plane_state->crtc_w = 0;
1459 plane_state->crtc_h = 0;
1460 plane_state->src_x = 0;
1461 plane_state->src_y = 0;
1462 plane_state->src_w = 0;
1463 plane_state->src_h = 0;
1464
1465 return 0;
1466}
1467EXPORT_SYMBOL(__drm_atomic_helper_disable_plane);
1468
1469static int update_output_state(struct drm_atomic_state *state,
1470 struct drm_mode_set *set)
1471{
1472 struct drm_device *dev = set->crtc->dev;
1473 struct drm_crtc *crtc;
1474 struct drm_crtc_state *new_crtc_state;
1475 struct drm_connector *connector;
1476 struct drm_connector_state *new_conn_state;
1477 int ret, i;
1478
1479 ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
1480 state->acquire_ctx);
1481 if (ret)
1482 return ret;
1483
1484
1485 ret = drm_atomic_add_affected_connectors(state, set->crtc);
1486 if (ret)
1487 return ret;
1488
1489 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
1490 if (new_conn_state->crtc == set->crtc) {
1491 ret = drm_atomic_set_crtc_for_connector(new_conn_state,
1492 NULL);
1493 if (ret)
1494 return ret;
1495
1496
1497 new_conn_state->link_status = DRM_LINK_STATUS_GOOD;
1498 }
1499 }
1500
1501
1502 for (i = 0; i < set->num_connectors; i++) {
1503 new_conn_state = drm_atomic_get_connector_state(state,
1504 set->connectors[i]);
1505 if (IS_ERR(new_conn_state))
1506 return PTR_ERR(new_conn_state);
1507
1508 ret = drm_atomic_set_crtc_for_connector(new_conn_state,
1509 set->crtc);
1510 if (ret)
1511 return ret;
1512 }
1513
1514 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
1515
1516
1517
1518
1519
1520
1521 if (crtc == set->crtc)
1522 continue;
1523
1524 if (!new_crtc_state->connector_mask) {
1525 ret = drm_atomic_set_mode_prop_for_crtc(new_crtc_state,
1526 NULL);
1527 if (ret < 0)
1528 return ret;
1529
1530 new_crtc_state->active = false;
1531 }
1532 }
1533
1534 return 0;
1535}
1536
1537
1538int __drm_atomic_helper_set_config(struct drm_mode_set *set,
1539 struct drm_atomic_state *state)
1540{
1541 struct drm_crtc_state *crtc_state;
1542 struct drm_plane_state *primary_state;
1543 struct drm_crtc *crtc = set->crtc;
1544 int hdisplay, vdisplay;
1545 int ret;
1546
1547 crtc_state = drm_atomic_get_crtc_state(state, crtc);
1548 if (IS_ERR(crtc_state))
1549 return PTR_ERR(crtc_state);
1550
1551 primary_state = drm_atomic_get_plane_state(state, crtc->primary);
1552 if (IS_ERR(primary_state))
1553 return PTR_ERR(primary_state);
1554
1555 if (!set->mode) {
1556 WARN_ON(set->fb);
1557 WARN_ON(set->num_connectors);
1558
1559 ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
1560 if (ret != 0)
1561 return ret;
1562
1563 crtc_state->active = false;
1564
1565 ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
1566 if (ret != 0)
1567 return ret;
1568
1569 drm_atomic_set_fb_for_plane(primary_state, NULL);
1570
1571 goto commit;
1572 }
1573
1574 WARN_ON(!set->fb);
1575 WARN_ON(!set->num_connectors);
1576
1577 ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
1578 if (ret != 0)
1579 return ret;
1580
1581 crtc_state->active = true;
1582
1583 ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
1584 if (ret != 0)
1585 return ret;
1586
1587 drm_mode_get_hv_timing(set->mode, &hdisplay, &vdisplay);
1588
1589 drm_atomic_set_fb_for_plane(primary_state, set->fb);
1590 primary_state->crtc_x = 0;
1591 primary_state->crtc_y = 0;
1592 primary_state->crtc_w = hdisplay;
1593 primary_state->crtc_h = vdisplay;
1594 primary_state->src_x = set->x << 16;
1595 primary_state->src_y = set->y << 16;
1596 if (drm_rotation_90_or_270(primary_state->rotation)) {
1597 primary_state->src_w = vdisplay << 16;
1598 primary_state->src_h = hdisplay << 16;
1599 } else {
1600 primary_state->src_w = hdisplay << 16;
1601 primary_state->src_h = vdisplay << 16;
1602 }
1603
1604commit:
1605 ret = update_output_state(state, set);
1606 if (ret)
1607 return ret;
1608
1609 return 0;
1610}
1611EXPORT_SYMBOL(__drm_atomic_helper_set_config);
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624void drm_atomic_print_new_state(const struct drm_atomic_state *state,
1625 struct drm_printer *p)
1626{
1627 struct drm_plane *plane;
1628 struct drm_plane_state *plane_state;
1629 struct drm_crtc *crtc;
1630 struct drm_crtc_state *crtc_state;
1631 struct drm_connector *connector;
1632 struct drm_connector_state *connector_state;
1633 int i;
1634
1635 if (!p) {
1636 DRM_ERROR("invalid drm printer\n");
1637 return;
1638 }
1639
1640 DRM_DEBUG_ATOMIC("checking %p\n", state);
1641
1642 for_each_new_plane_in_state(state, plane, plane_state, i)
1643 drm_atomic_plane_print_state(p, plane_state);
1644
1645 for_each_new_crtc_in_state(state, crtc, crtc_state, i)
1646 drm_atomic_crtc_print_state(p, crtc_state);
1647
1648 for_each_new_connector_in_state(state, connector, connector_state, i)
1649 drm_atomic_connector_print_state(p, connector_state);
1650}
1651EXPORT_SYMBOL(drm_atomic_print_new_state);
1652
1653static void __drm_state_dump(struct drm_device *dev, struct drm_printer *p,
1654 bool take_locks)
1655{
1656 struct drm_mode_config *config = &dev->mode_config;
1657 struct drm_plane *plane;
1658 struct drm_crtc *crtc;
1659 struct drm_connector *connector;
1660 struct drm_connector_list_iter conn_iter;
1661
1662 if (!drm_drv_uses_atomic_modeset(dev))
1663 return;
1664
1665 list_for_each_entry(plane, &config->plane_list, head) {
1666 if (take_locks)
1667 drm_modeset_lock(&plane->mutex, NULL);
1668 drm_atomic_plane_print_state(p, plane->state);
1669 if (take_locks)
1670 drm_modeset_unlock(&plane->mutex);
1671 }
1672
1673 list_for_each_entry(crtc, &config->crtc_list, head) {
1674 if (take_locks)
1675 drm_modeset_lock(&crtc->mutex, NULL);
1676 drm_atomic_crtc_print_state(p, crtc->state);
1677 if (take_locks)
1678 drm_modeset_unlock(&crtc->mutex);
1679 }
1680
1681 drm_connector_list_iter_begin(dev, &conn_iter);
1682 if (take_locks)
1683 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
1684 drm_for_each_connector_iter(connector, &conn_iter)
1685 drm_atomic_connector_print_state(p, connector->state);
1686 if (take_locks)
1687 drm_modeset_unlock(&dev->mode_config.connection_mutex);
1688 drm_connector_list_iter_end(&conn_iter);
1689}
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706void drm_state_dump(struct drm_device *dev, struct drm_printer *p)
1707{
1708 __drm_state_dump(dev, p, false);
1709}
1710EXPORT_SYMBOL(drm_state_dump);
1711
1712#ifdef CONFIG_DEBUG_FS
1713static int drm_state_info(struct seq_file *m, void *data)
1714{
1715 struct drm_info_node *node = (struct drm_info_node *) m->private;
1716 struct drm_device *dev = node->minor->dev;
1717 struct drm_printer p = drm_seq_file_printer(m);
1718
1719 __drm_state_dump(dev, &p, true);
1720
1721 return 0;
1722}
1723
1724
1725static const struct drm_info_list drm_atomic_debugfs_list[] = {
1726 {"state", drm_state_info, 0},
1727};
1728
1729void drm_atomic_debugfs_init(struct drm_minor *minor)
1730{
1731 drm_debugfs_create_files(drm_atomic_debugfs_list,
1732 ARRAY_SIZE(drm_atomic_debugfs_list),
1733 minor->debugfs_root, minor);
1734}
1735#endif
1736