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
608void drm_kms_helper_hotplug_event(struct drm_device *dev)
609{
610
611 drm_sysfs_hotplug_event(dev);
612 if (dev->mode_config.funcs->output_poll_changed)
613 dev->mode_config.funcs->output_poll_changed(dev);
614
615 drm_client_dev_hotplug(dev);
616}
617EXPORT_SYMBOL(drm_kms_helper_hotplug_event);
618
619static void output_poll_execute(struct work_struct *work)
620{
621 struct delayed_work *delayed_work = to_delayed_work(work);
622 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);
623 struct drm_connector *connector;
624 struct drm_connector_list_iter conn_iter;
625 enum drm_connector_status old_status;
626 bool repoll = false, changed;
627 u64 old_epoch_counter;
628
629 if (!dev->mode_config.poll_enabled)
630 return;
631
632
633 changed = dev->mode_config.delayed_event;
634 dev->mode_config.delayed_event = false;
635
636 if (!drm_kms_helper_poll)
637 goto out;
638
639 if (!mutex_trylock(&dev->mode_config.mutex)) {
640 repoll = true;
641 goto out;
642 }
643
644 drm_connector_list_iter_begin(dev, &conn_iter);
645 drm_for_each_connector_iter(connector, &conn_iter) {
646
647 if (connector->force)
648 continue;
649
650
651
652 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD)
653 continue;
654
655 old_status = connector->status;
656
657
658 if (old_status == connector_status_connected &&
659 !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT))
660 continue;
661
662 repoll = true;
663
664 old_epoch_counter = connector->epoch_counter;
665 connector->status = drm_helper_probe_detect(connector, NULL, false);
666 if (old_epoch_counter != connector->epoch_counter) {
667 const char *old, *new;
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682 if (connector->status == connector_status_unknown) {
683 connector->status = old_status;
684 continue;
685 }
686
687 old = drm_get_connector_status_name(old_status);
688 new = drm_get_connector_status_name(connector->status);
689
690 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] "
691 "status updated from %s to %s\n",
692 connector->base.id,
693 connector->name,
694 old, new);
695 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] epoch counter %llu -> %llu\n",
696 connector->base.id, connector->name,
697 old_epoch_counter, connector->epoch_counter);
698
699 changed = true;
700 }
701 }
702 drm_connector_list_iter_end(&conn_iter);
703
704 mutex_unlock(&dev->mode_config.mutex);
705
706out:
707 if (changed)
708 drm_kms_helper_hotplug_event(dev);
709
710 if (repoll)
711 schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
712}
713
714
715
716
717
718
719
720
721
722
723
724
725
726bool drm_kms_helper_is_poll_worker(void)
727{
728 struct work_struct *work = current_work();
729
730 return work && work->func == output_poll_execute;
731}
732EXPORT_SYMBOL(drm_kms_helper_is_poll_worker);
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748void drm_kms_helper_poll_disable(struct drm_device *dev)
749{
750 if (!dev->mode_config.poll_enabled)
751 return;
752 cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
753}
754EXPORT_SYMBOL(drm_kms_helper_poll_disable);
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775void drm_kms_helper_poll_init(struct drm_device *dev)
776{
777 INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute);
778 dev->mode_config.poll_enabled = true;
779
780 drm_kms_helper_poll_enable(dev);
781}
782EXPORT_SYMBOL(drm_kms_helper_poll_init);
783
784
785
786
787
788void drm_kms_helper_poll_fini(struct drm_device *dev)
789{
790 if (!dev->mode_config.poll_enabled)
791 return;
792
793 dev->mode_config.poll_enabled = false;
794 cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
795}
796EXPORT_SYMBOL(drm_kms_helper_poll_fini);
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821bool drm_helper_hpd_irq_event(struct drm_device *dev)
822{
823 struct drm_connector *connector;
824 struct drm_connector_list_iter conn_iter;
825 enum drm_connector_status old_status;
826 bool changed = false;
827 u64 old_epoch_counter;
828
829 if (!dev->mode_config.poll_enabled)
830 return false;
831
832 mutex_lock(&dev->mode_config.mutex);
833 drm_connector_list_iter_begin(dev, &conn_iter);
834 drm_for_each_connector_iter(connector, &conn_iter) {
835
836 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
837 continue;
838
839 old_status = connector->status;
840
841 old_epoch_counter = connector->epoch_counter;
842
843 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id,
844 connector->name,
845 old_epoch_counter);
846
847 connector->status = drm_helper_probe_detect(connector, NULL, false);
848 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
849 connector->base.id,
850 connector->name,
851 drm_get_connector_status_name(old_status),
852 drm_get_connector_status_name(connector->status));
853
854 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n",
855 connector->base.id,
856 connector->name,
857 connector->epoch_counter);
858
859
860
861
862
863 if (old_epoch_counter != connector->epoch_counter)
864 changed = true;
865
866 }
867 drm_connector_list_iter_end(&conn_iter);
868 mutex_unlock(&dev->mode_config.mutex);
869
870 if (changed) {
871 drm_kms_helper_hotplug_event(dev);
872 DRM_DEBUG_KMS("Sent hotplug event\n");
873 }
874
875 return changed;
876}
877EXPORT_SYMBOL(drm_helper_hpd_irq_event);
878