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
31
32#include <linux/export.h>
33#include <linux/moduleparam.h>
34
35#include <drm/drm_bridge.h>
36#include <drm/drm_client.h>
37#include <drm/drm_crtc.h>
38#include <drm/drm_edid.h>
39#include <drm/drm_fb_helper.h>
40#include <drm/drm_fourcc.h>
41#include <drm/drm_modeset_helper_vtables.h>
42#include <drm/drm_print.h>
43#include <drm/drm_probe_helper.h>
44#include <drm/drm_sysfs.h>
45
46#include "drm_crtc_helper_internal.h"
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67static bool drm_kms_helper_poll = true;
68module_param_named(poll, drm_kms_helper_poll, bool, 0600);
69
70static enum drm_mode_status
71drm_mode_validate_flag(const struct drm_display_mode *mode,
72 int flags)
73{
74 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
75 !(flags & DRM_MODE_FLAG_INTERLACE))
76 return MODE_NO_INTERLACE;
77
78 if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&
79 !(flags & DRM_MODE_FLAG_DBLSCAN))
80 return MODE_NO_DBLESCAN;
81
82 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) &&
83 !(flags & DRM_MODE_FLAG_3D_MASK))
84 return MODE_NO_STEREO;
85
86 return MODE_OK;
87}
88
89static int
90drm_mode_validate_pipeline(struct drm_display_mode *mode,
91 struct drm_connector *connector,
92 struct drm_modeset_acquire_ctx *ctx,
93 enum drm_mode_status *status)
94{
95 struct drm_device *dev = connector->dev;
96 struct drm_encoder *encoder;
97 int ret;
98
99
100 ret = drm_connector_mode_valid(connector, mode, ctx, status);
101 if (ret || *status != MODE_OK)
102 return ret;
103
104
105 drm_connector_for_each_possible_encoder(connector, encoder) {
106 struct drm_bridge *bridge;
107 struct drm_crtc *crtc;
108
109 *status = drm_encoder_mode_valid(encoder, mode);
110 if (*status != MODE_OK) {
111
112
113
114
115 continue;
116 }
117
118 bridge = drm_bridge_chain_get_first_bridge(encoder);
119 *status = drm_bridge_chain_mode_valid(bridge,
120 &connector->display_info,
121 mode);
122 if (*status != MODE_OK) {
123
124
125 continue;
126 }
127
128 drm_for_each_crtc(crtc, dev) {
129 if (!drm_encoder_crtc_ok(encoder, crtc))
130 continue;
131
132 *status = drm_crtc_mode_valid(crtc, mode);
133 if (*status == MODE_OK) {
134
135
136
137 return 0;
138 }
139 }
140 }
141
142 return 0;
143}
144
145static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)
146{
147 struct drm_cmdline_mode *cmdline_mode;
148 struct drm_display_mode *mode;
149
150 cmdline_mode = &connector->cmdline_mode;
151 if (!cmdline_mode->specified)
152 return 0;
153
154
155 list_for_each_entry(mode, &connector->probed_modes, head) {
156 if (mode->hdisplay != cmdline_mode->xres ||
157 mode->vdisplay != cmdline_mode->yres)
158 continue;
159
160 if (cmdline_mode->refresh_specified) {
161
162 if (drm_mode_vrefresh(mode) != cmdline_mode->refresh)
163 continue;
164 }
165
166
167 mode->type |= DRM_MODE_TYPE_USERDEF;
168 return 0;
169 }
170
171 mode = drm_mode_create_from_cmdline_mode(connector->dev,
172 cmdline_mode);
173 if (mode == NULL)
174 return 0;
175
176 drm_mode_probed_add(connector, mode);
177 return 1;
178}
179
180enum drm_mode_status drm_crtc_mode_valid(struct drm_crtc *crtc,
181 const struct drm_display_mode *mode)
182{
183 const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
184
185 if (!crtc_funcs || !crtc_funcs->mode_valid)
186 return MODE_OK;
187
188 return crtc_funcs->mode_valid(crtc, mode);
189}
190
191enum drm_mode_status drm_encoder_mode_valid(struct drm_encoder *encoder,
192 const struct drm_display_mode *mode)
193{
194 const struct drm_encoder_helper_funcs *encoder_funcs =
195 encoder->helper_private;
196
197 if (!encoder_funcs || !encoder_funcs->mode_valid)
198 return MODE_OK;
199
200 return encoder_funcs->mode_valid(encoder, mode);
201}
202
203int
204drm_connector_mode_valid(struct drm_connector *connector,
205 struct drm_display_mode *mode,
206 struct drm_modeset_acquire_ctx *ctx,
207 enum drm_mode_status *status)
208{
209 const struct drm_connector_helper_funcs *connector_funcs =
210 connector->helper_private;
211 int ret = 0;
212
213 if (!connector_funcs)
214 *status = MODE_OK;
215 else if (connector_funcs->mode_valid_ctx)
216 ret = connector_funcs->mode_valid_ctx(connector, mode, ctx,
217 status);
218 else if (connector_funcs->mode_valid)
219 *status = connector_funcs->mode_valid(connector, mode);
220 else
221 *status = MODE_OK;
222
223 return ret;
224}
225
226#define DRM_OUTPUT_POLL_PERIOD (10*HZ)
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242void drm_kms_helper_poll_enable(struct drm_device *dev)
243{
244 bool poll = false;
245 struct drm_connector *connector;
246 struct drm_connector_list_iter conn_iter;
247 unsigned long delay = DRM_OUTPUT_POLL_PERIOD;
248
249 if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll)
250 return;
251
252 drm_connector_list_iter_begin(dev, &conn_iter);
253 drm_for_each_connector_iter(connector, &conn_iter) {
254 if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT |
255 DRM_CONNECTOR_POLL_DISCONNECT))
256 poll = true;
257 }
258 drm_connector_list_iter_end(&conn_iter);
259
260 if (dev->mode_config.delayed_event) {
261
262
263
264
265
266
267
268
269
270
271 poll = true;
272 delay = HZ;
273 }
274
275 if (poll)
276 schedule_delayed_work(&dev->mode_config.output_poll_work, delay);
277}
278EXPORT_SYMBOL(drm_kms_helper_poll_enable);
279
280static enum drm_connector_status
281drm_helper_probe_detect_ctx(struct drm_connector *connector, bool force)
282{
283 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
284 struct drm_modeset_acquire_ctx ctx;
285 int ret;
286
287 drm_modeset_acquire_init(&ctx, 0);
288
289retry:
290 ret = drm_modeset_lock(&connector->dev->mode_config.connection_mutex, &ctx);
291 if (!ret) {
292 if (funcs->detect_ctx)
293 ret = funcs->detect_ctx(connector, &ctx, force);
294 else if (connector->funcs->detect)
295 ret = connector->funcs->detect(connector, force);
296 else
297 ret = connector_status_connected;
298 }
299
300 if (ret == -EDEADLK) {
301 drm_modeset_backoff(&ctx);
302 goto retry;
303 }
304
305 if (WARN_ON(ret < 0))
306 ret = connector_status_unknown;
307
308 if (ret != connector->status)
309 connector->epoch_counter += 1;
310
311 drm_modeset_drop_locks(&ctx);
312 drm_modeset_acquire_fini(&ctx);
313
314 return ret;
315}
316
317
318
319
320
321
322
323
324
325
326
327int
328drm_helper_probe_detect(struct drm_connector *connector,
329 struct drm_modeset_acquire_ctx *ctx,
330 bool force)
331{
332 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
333 struct drm_device *dev = connector->dev;
334 int ret;
335
336 if (!ctx)
337 return drm_helper_probe_detect_ctx(connector, force);
338
339 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);
340 if (ret)
341 return ret;
342
343 if (funcs->detect_ctx)
344 ret = funcs->detect_ctx(connector, ctx, force);
345 else if (connector->funcs->detect)
346 ret = connector->funcs->detect(connector, force);
347 else
348 ret = connector_status_connected;
349
350 if (ret != connector->status)
351 connector->epoch_counter += 1;
352
353 return ret;
354}
355EXPORT_SYMBOL(drm_helper_probe_detect);
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
417 uint32_t maxX, uint32_t maxY)
418{
419 struct drm_device *dev = connector->dev;
420 struct drm_display_mode *mode;
421 const struct drm_connector_helper_funcs *connector_funcs =
422 connector->helper_private;
423 int count = 0, ret;
424 int mode_flags = 0;
425 bool verbose_prune = true;
426 enum drm_connector_status old_status;
427 struct drm_modeset_acquire_ctx ctx;
428
429 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
430
431 drm_modeset_acquire_init(&ctx, 0);
432
433 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id,
434 connector->name);
435
436retry:
437 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
438 if (ret == -EDEADLK) {
439 drm_modeset_backoff(&ctx);
440 goto retry;
441 } else
442 WARN_ON(ret < 0);
443
444
445 list_for_each_entry(mode, &connector->modes, head)
446 mode->status = MODE_STALE;
447
448 old_status = connector->status;
449
450 if (connector->force) {
451 if (connector->force == DRM_FORCE_ON ||
452 connector->force == DRM_FORCE_ON_DIGITAL)
453 connector->status = connector_status_connected;
454 else
455 connector->status = connector_status_disconnected;
456 if (connector->funcs->force)
457 connector->funcs->force(connector);
458 } else {
459 ret = drm_helper_probe_detect(connector, &ctx, true);
460
461 if (ret == -EDEADLK) {
462 drm_modeset_backoff(&ctx);
463 goto retry;
464 } else if (WARN(ret < 0, "Invalid return value %i for connector detection\n", ret))
465 ret = connector_status_unknown;
466
467 connector->status = ret;
468 }
469
470
471
472
473
474
475
476 if (old_status != connector->status) {
477 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
478 connector->base.id,
479 connector->name,
480 drm_get_connector_status_name(old_status),
481 drm_get_connector_status_name(connector->status));
482
483
484
485
486
487
488
489 dev->mode_config.delayed_event = true;
490 if (dev->mode_config.poll_enabled)
491 schedule_delayed_work(&dev->mode_config.output_poll_work,
492 0);
493 }
494
495
496 if (drm_kms_helper_poll != dev->mode_config.poll_running)
497 drm_kms_helper_poll_enable(dev);
498
499 dev->mode_config.poll_running = drm_kms_helper_poll;
500
501 if (connector->status == connector_status_disconnected) {
502 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] disconnected\n",
503 connector->base.id, connector->name);
504 drm_connector_update_edid_property(connector, NULL);
505 verbose_prune = false;
506 goto prune;
507 }
508
509 count = (*connector_funcs->get_modes)(connector);
510
511
512
513
514
515 if (count == 0 && connector->status == connector_status_connected)
516 count = drm_add_override_edid_modes(connector);
517
518 if (count == 0 && (connector->status == connector_status_connected ||
519 connector->status == connector_status_unknown))
520 count = drm_add_modes_noedid(connector, 1024, 768);
521 count += drm_helper_probe_add_cmdline_mode(connector);
522 if (count == 0)
523 goto prune;
524
525 drm_connector_list_update(connector);
526
527 if (connector->interlace_allowed)
528 mode_flags |= DRM_MODE_FLAG_INTERLACE;
529 if (connector->doublescan_allowed)
530 mode_flags |= DRM_MODE_FLAG_DBLSCAN;
531 if (connector->stereo_allowed)
532 mode_flags |= DRM_MODE_FLAG_3D_MASK;
533
534 list_for_each_entry(mode, &connector->modes, head) {
535 if (mode->status != MODE_OK)
536 continue;
537
538 mode->status = drm_mode_validate_driver(dev, mode);
539 if (mode->status != MODE_OK)
540 continue;
541
542 mode->status = drm_mode_validate_size(mode, maxX, maxY);
543 if (mode->status != MODE_OK)
544 continue;
545
546 mode->status = drm_mode_validate_flag(mode, mode_flags);
547 if (mode->status != MODE_OK)
548 continue;
549
550 ret = drm_mode_validate_pipeline(mode, connector, &ctx,
551 &mode->status);
552 if (ret) {
553 drm_dbg_kms(dev,
554 "drm_mode_validate_pipeline failed: %d\n",
555 ret);
556
557 if (drm_WARN_ON_ONCE(dev, ret != -EDEADLK)) {
558 mode->status = MODE_ERROR;
559 } else {
560 drm_modeset_backoff(&ctx);
561 goto retry;
562 }
563 }
564
565 if (mode->status != MODE_OK)
566 continue;
567 mode->status = drm_mode_validate_ycbcr420(mode, connector);
568 }
569
570prune:
571 drm_mode_prune_invalid(dev, &connector->modes, verbose_prune);
572
573 drm_modeset_drop_locks(&ctx);
574 drm_modeset_acquire_fini(&ctx);
575
576 if (list_empty(&connector->modes))
577 return 0;
578
579 drm_mode_sort(&connector->modes);
580
581 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id,
582 connector->name);
583 list_for_each_entry(mode, &connector->modes, head) {
584 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
585 drm_mode_debug_printmodeline(mode);
586 }
587
588 return count;
589}
590EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611void drm_kms_helper_hotplug_event(struct drm_device *dev)
612{
613
614 drm_sysfs_hotplug_event(dev);
615 if (dev->mode_config.funcs->output_poll_changed)
616 dev->mode_config.funcs->output_poll_changed(dev);
617
618 drm_client_dev_hotplug(dev);
619}
620EXPORT_SYMBOL(drm_kms_helper_hotplug_event);
621
622
623
624
625
626
627
628
629void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector)
630{
631 struct drm_device *dev = connector->dev;
632
633
634 drm_sysfs_connector_hotplug_event(connector);
635 if (dev->mode_config.funcs->output_poll_changed)
636 dev->mode_config.funcs->output_poll_changed(dev);
637
638 drm_client_dev_hotplug(dev);
639}
640EXPORT_SYMBOL(drm_kms_helper_connector_hotplug_event);
641
642static void output_poll_execute(struct work_struct *work)
643{
644 struct delayed_work *delayed_work = to_delayed_work(work);
645 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);
646 struct drm_connector *connector;
647 struct drm_connector_list_iter conn_iter;
648 enum drm_connector_status old_status;
649 bool repoll = false, changed;
650 u64 old_epoch_counter;
651
652 if (!dev->mode_config.poll_enabled)
653 return;
654
655
656 changed = dev->mode_config.delayed_event;
657 dev->mode_config.delayed_event = false;
658
659 if (!drm_kms_helper_poll)
660 goto out;
661
662 if (!mutex_trylock(&dev->mode_config.mutex)) {
663 repoll = true;
664 goto out;
665 }
666
667 drm_connector_list_iter_begin(dev, &conn_iter);
668 drm_for_each_connector_iter(connector, &conn_iter) {
669
670 if (connector->force)
671 continue;
672
673
674
675 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD)
676 continue;
677
678 old_status = connector->status;
679
680
681 if (old_status == connector_status_connected &&
682 !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT))
683 continue;
684
685 repoll = true;
686
687 old_epoch_counter = connector->epoch_counter;
688 connector->status = drm_helper_probe_detect(connector, NULL, false);
689 if (old_epoch_counter != connector->epoch_counter) {
690 const char *old, *new;
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705 if (connector->status == connector_status_unknown) {
706 connector->status = old_status;
707 continue;
708 }
709
710 old = drm_get_connector_status_name(old_status);
711 new = drm_get_connector_status_name(connector->status);
712
713 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] "
714 "status updated from %s to %s\n",
715 connector->base.id,
716 connector->name,
717 old, new);
718 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] epoch counter %llu -> %llu\n",
719 connector->base.id, connector->name,
720 old_epoch_counter, connector->epoch_counter);
721
722 changed = true;
723 }
724 }
725 drm_connector_list_iter_end(&conn_iter);
726
727 mutex_unlock(&dev->mode_config.mutex);
728
729out:
730 if (changed)
731 drm_kms_helper_hotplug_event(dev);
732
733 if (repoll)
734 schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
735}
736
737
738
739
740
741
742
743
744
745
746
747
748
749bool drm_kms_helper_is_poll_worker(void)
750{
751 struct work_struct *work = current_work();
752
753 return work && work->func == output_poll_execute;
754}
755EXPORT_SYMBOL(drm_kms_helper_is_poll_worker);
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771void drm_kms_helper_poll_disable(struct drm_device *dev)
772{
773 if (!dev->mode_config.poll_enabled)
774 return;
775 cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
776}
777EXPORT_SYMBOL(drm_kms_helper_poll_disable);
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798void drm_kms_helper_poll_init(struct drm_device *dev)
799{
800 INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute);
801 dev->mode_config.poll_enabled = true;
802
803 drm_kms_helper_poll_enable(dev);
804}
805EXPORT_SYMBOL(drm_kms_helper_poll_init);
806
807
808
809
810
811void drm_kms_helper_poll_fini(struct drm_device *dev)
812{
813 if (!dev->mode_config.poll_enabled)
814 return;
815
816 dev->mode_config.poll_enabled = false;
817 cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
818}
819EXPORT_SYMBOL(drm_kms_helper_poll_fini);
820
821static bool check_connector_changed(struct drm_connector *connector)
822{
823 struct drm_device *dev = connector->dev;
824 enum drm_connector_status old_status;
825 u64 old_epoch_counter;
826
827
828 drm_WARN_ON(dev, !(connector->polled & DRM_CONNECTOR_POLL_HPD));
829
830 drm_WARN_ON(dev, !mutex_is_locked(&dev->mode_config.mutex));
831
832 old_status = connector->status;
833 old_epoch_counter = connector->epoch_counter;
834 connector->status = drm_helper_probe_detect(connector, NULL, false);
835
836 if (old_epoch_counter == connector->epoch_counter) {
837 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Same epoch counter %llu\n",
838 connector->base.id,
839 connector->name,
840 connector->epoch_counter);
841
842 return false;
843 }
844
845 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s\n",
846 connector->base.id,
847 connector->name,
848 drm_get_connector_status_name(old_status),
849 drm_get_connector_status_name(connector->status));
850
851 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Changed epoch counter %llu => %llu\n",
852 connector->base.id,
853 connector->name,
854 old_epoch_counter,
855 connector->epoch_counter);
856
857 return true;
858}
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector)
882{
883 struct drm_device *dev = connector->dev;
884 bool changed;
885
886 mutex_lock(&dev->mode_config.mutex);
887 changed = check_connector_changed(connector);
888 mutex_unlock(&dev->mode_config.mutex);
889
890 if (changed) {
891 drm_kms_helper_connector_hotplug_event(connector);
892 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Sent hotplug event\n",
893 connector->base.id,
894 connector->name);
895 }
896
897 return changed;
898}
899EXPORT_SYMBOL(drm_connector_helper_hpd_irq_event);
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928bool drm_helper_hpd_irq_event(struct drm_device *dev)
929{
930 struct drm_connector *connector, *first_changed_connector = NULL;
931 struct drm_connector_list_iter conn_iter;
932 int changed = 0;
933
934 if (!dev->mode_config.poll_enabled)
935 return false;
936
937 mutex_lock(&dev->mode_config.mutex);
938 drm_connector_list_iter_begin(dev, &conn_iter);
939 drm_for_each_connector_iter(connector, &conn_iter) {
940
941 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
942 continue;
943
944 if (check_connector_changed(connector)) {
945 if (!first_changed_connector) {
946 drm_connector_get(connector);
947 first_changed_connector = connector;
948 }
949
950 changed++;
951 }
952 }
953 drm_connector_list_iter_end(&conn_iter);
954 mutex_unlock(&dev->mode_config.mutex);
955
956 if (changed == 1)
957 drm_kms_helper_connector_hotplug_event(first_changed_connector);
958 else if (changed > 0)
959 drm_kms_helper_hotplug_event(dev);
960
961 if (first_changed_connector)
962 drm_connector_put(first_changed_connector);
963
964 return changed;
965}
966EXPORT_SYMBOL(drm_helper_hpd_irq_event);
967