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 count = drm_add_modes_noedid(connector, 1024, 768);
520 count += drm_helper_probe_add_cmdline_mode(connector);
521 if (count == 0)
522 goto prune;
523
524 drm_connector_list_update(connector);
525
526 if (connector->interlace_allowed)
527 mode_flags |= DRM_MODE_FLAG_INTERLACE;
528 if (connector->doublescan_allowed)
529 mode_flags |= DRM_MODE_FLAG_DBLSCAN;
530 if (connector->stereo_allowed)
531 mode_flags |= DRM_MODE_FLAG_3D_MASK;
532
533 list_for_each_entry(mode, &connector->modes, head) {
534 if (mode->status != MODE_OK)
535 continue;
536
537 mode->status = drm_mode_validate_driver(dev, mode);
538 if (mode->status != MODE_OK)
539 continue;
540
541 mode->status = drm_mode_validate_size(mode, maxX, maxY);
542 if (mode->status != MODE_OK)
543 continue;
544
545 mode->status = drm_mode_validate_flag(mode, mode_flags);
546 if (mode->status != MODE_OK)
547 continue;
548
549 ret = drm_mode_validate_pipeline(mode, connector, &ctx,
550 &mode->status);
551 if (ret) {
552 drm_dbg_kms(dev,
553 "drm_mode_validate_pipeline failed: %d\n",
554 ret);
555
556 if (drm_WARN_ON_ONCE(dev, ret != -EDEADLK)) {
557 mode->status = MODE_ERROR;
558 } else {
559 drm_modeset_backoff(&ctx);
560 goto retry;
561 }
562 }
563
564 if (mode->status != MODE_OK)
565 continue;
566 mode->status = drm_mode_validate_ycbcr420(mode, connector);
567 }
568
569prune:
570 drm_mode_prune_invalid(dev, &connector->modes, verbose_prune);
571
572 drm_modeset_drop_locks(&ctx);
573 drm_modeset_acquire_fini(&ctx);
574
575 if (list_empty(&connector->modes))
576 return 0;
577
578 drm_mode_sort(&connector->modes);
579
580 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id,
581 connector->name);
582 list_for_each_entry(mode, &connector->modes, head) {
583 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
584 drm_mode_debug_printmodeline(mode);
585 }
586
587 return count;
588}
589EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607void drm_kms_helper_hotplug_event(struct drm_device *dev)
608{
609
610 drm_sysfs_hotplug_event(dev);
611 if (dev->mode_config.funcs->output_poll_changed)
612 dev->mode_config.funcs->output_poll_changed(dev);
613
614 drm_client_dev_hotplug(dev);
615}
616EXPORT_SYMBOL(drm_kms_helper_hotplug_event);
617
618static void output_poll_execute(struct work_struct *work)
619{
620 struct delayed_work *delayed_work = to_delayed_work(work);
621 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);
622 struct drm_connector *connector;
623 struct drm_connector_list_iter conn_iter;
624 enum drm_connector_status old_status;
625 bool repoll = false, changed;
626
627 if (!dev->mode_config.poll_enabled)
628 return;
629
630
631 changed = dev->mode_config.delayed_event;
632 dev->mode_config.delayed_event = false;
633
634 if (!drm_kms_helper_poll)
635 goto out;
636
637 if (!mutex_trylock(&dev->mode_config.mutex)) {
638 repoll = true;
639 goto out;
640 }
641
642 drm_connector_list_iter_begin(dev, &conn_iter);
643 drm_for_each_connector_iter(connector, &conn_iter) {
644
645 if (connector->force)
646 continue;
647
648
649
650 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD)
651 continue;
652
653 old_status = connector->status;
654
655
656 if (old_status == connector_status_connected &&
657 !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT))
658 continue;
659
660 repoll = true;
661
662 connector->status = drm_helper_probe_detect(connector, NULL, false);
663 if (old_status != connector->status) {
664 const char *old, *new;
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679 if (connector->status == connector_status_unknown) {
680 connector->status = old_status;
681 continue;
682 }
683
684 old = drm_get_connector_status_name(old_status);
685 new = drm_get_connector_status_name(connector->status);
686
687 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] "
688 "status updated from %s to %s\n",
689 connector->base.id,
690 connector->name,
691 old, new);
692
693 changed = true;
694 }
695 }
696 drm_connector_list_iter_end(&conn_iter);
697
698 mutex_unlock(&dev->mode_config.mutex);
699
700out:
701 if (changed)
702 drm_kms_helper_hotplug_event(dev);
703
704 if (repoll)
705 schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
706}
707
708
709
710
711
712
713
714
715
716
717
718
719
720bool drm_kms_helper_is_poll_worker(void)
721{
722 struct work_struct *work = current_work();
723
724 return work && work->func == output_poll_execute;
725}
726EXPORT_SYMBOL(drm_kms_helper_is_poll_worker);
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742void drm_kms_helper_poll_disable(struct drm_device *dev)
743{
744 if (!dev->mode_config.poll_enabled)
745 return;
746 cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
747}
748EXPORT_SYMBOL(drm_kms_helper_poll_disable);
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769void drm_kms_helper_poll_init(struct drm_device *dev)
770{
771 INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute);
772 dev->mode_config.poll_enabled = true;
773
774 drm_kms_helper_poll_enable(dev);
775}
776EXPORT_SYMBOL(drm_kms_helper_poll_init);
777
778
779
780
781
782void drm_kms_helper_poll_fini(struct drm_device *dev)
783{
784 if (!dev->mode_config.poll_enabled)
785 return;
786
787 dev->mode_config.poll_enabled = false;
788 cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
789}
790EXPORT_SYMBOL(drm_kms_helper_poll_fini);
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815bool drm_helper_hpd_irq_event(struct drm_device *dev)
816{
817 struct drm_connector *connector;
818 struct drm_connector_list_iter conn_iter;
819 enum drm_connector_status old_status;
820 bool changed = false;
821 u64 old_epoch_counter;
822
823 if (!dev->mode_config.poll_enabled)
824 return false;
825
826 mutex_lock(&dev->mode_config.mutex);
827 drm_connector_list_iter_begin(dev, &conn_iter);
828 drm_for_each_connector_iter(connector, &conn_iter) {
829
830 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
831 continue;
832
833 old_status = connector->status;
834
835 old_epoch_counter = connector->epoch_counter;
836
837 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id,
838 connector->name,
839 old_epoch_counter);
840
841 connector->status = drm_helper_probe_detect(connector, NULL, false);
842 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
843 connector->base.id,
844 connector->name,
845 drm_get_connector_status_name(old_status),
846 drm_get_connector_status_name(connector->status));
847
848 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n",
849 connector->base.id,
850 connector->name,
851 connector->epoch_counter);
852
853
854
855
856
857 if (old_epoch_counter != connector->epoch_counter)
858 changed = true;
859
860 }
861 drm_connector_list_iter_end(&conn_iter);
862 mutex_unlock(&dev->mode_config.mutex);
863
864 if (changed) {
865 drm_kms_helper_hotplug_event(dev);
866 DRM_DEBUG_KMS("Sent hotplug event\n");
867 }
868
869 return changed;
870}
871EXPORT_SYMBOL(drm_helper_hpd_irq_event);
872