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/drmP.h>
36#include <drm/drm_crtc.h>
37#include <drm/drm_fourcc.h>
38#include <drm/drm_crtc_helper.h>
39#include <drm/drm_fb_helper.h>
40#include <drm/drm_edid.h>
41#include <drm/drm_modeset_helper_vtables.h>
42
43#include "drm_crtc_helper_internal.h"
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64static bool drm_kms_helper_poll = true;
65module_param_named(poll, drm_kms_helper_poll, bool, 0600);
66
67static enum drm_mode_status
68drm_mode_validate_flag(const struct drm_display_mode *mode,
69 int flags)
70{
71 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
72 !(flags & DRM_MODE_FLAG_INTERLACE))
73 return MODE_NO_INTERLACE;
74
75 if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&
76 !(flags & DRM_MODE_FLAG_DBLSCAN))
77 return MODE_NO_DBLESCAN;
78
79 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) &&
80 !(flags & DRM_MODE_FLAG_3D_MASK))
81 return MODE_NO_STEREO;
82
83 return MODE_OK;
84}
85
86static enum drm_mode_status
87drm_mode_validate_pipeline(struct drm_display_mode *mode,
88 struct drm_connector *connector)
89{
90 struct drm_device *dev = connector->dev;
91 uint32_t *ids = connector->encoder_ids;
92 enum drm_mode_status ret = MODE_OK;
93 unsigned int i;
94
95
96 ret = drm_connector_mode_valid(connector, mode);
97 if (ret != MODE_OK)
98 return ret;
99
100
101 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
102 struct drm_encoder *encoder = drm_encoder_find(dev, ids[i]);
103 struct drm_crtc *crtc;
104
105 if (!encoder)
106 continue;
107
108 ret = drm_encoder_mode_valid(encoder, mode);
109 if (ret != MODE_OK) {
110
111
112
113
114 continue;
115 }
116
117 ret = drm_bridge_mode_valid(encoder->bridge, mode);
118 if (ret != MODE_OK) {
119
120
121 continue;
122 }
123
124 drm_for_each_crtc(crtc, dev) {
125 if (!drm_encoder_crtc_ok(encoder, crtc))
126 continue;
127
128 ret = drm_crtc_mode_valid(crtc, mode);
129 if (ret == MODE_OK) {
130
131
132
133 return ret;
134 }
135 }
136 }
137
138 return ret;
139}
140
141static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)
142{
143 struct drm_cmdline_mode *cmdline_mode;
144 struct drm_display_mode *mode;
145
146 cmdline_mode = &connector->cmdline_mode;
147 if (!cmdline_mode->specified)
148 return 0;
149
150
151 list_for_each_entry(mode, &connector->probed_modes, head) {
152 if (mode->hdisplay != cmdline_mode->xres ||
153 mode->vdisplay != cmdline_mode->yres)
154 continue;
155
156 if (cmdline_mode->refresh_specified) {
157
158 if (drm_mode_vrefresh(mode) != cmdline_mode->refresh)
159 continue;
160 }
161
162 return 0;
163 }
164
165 mode = drm_mode_create_from_cmdline_mode(connector->dev,
166 cmdline_mode);
167 if (mode == NULL)
168 return 0;
169
170 drm_mode_probed_add(connector, mode);
171 return 1;
172}
173
174enum drm_mode_status drm_crtc_mode_valid(struct drm_crtc *crtc,
175 const struct drm_display_mode *mode)
176{
177 const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
178
179 if (!crtc_funcs || !crtc_funcs->mode_valid)
180 return MODE_OK;
181
182 return crtc_funcs->mode_valid(crtc, mode);
183}
184
185enum drm_mode_status drm_encoder_mode_valid(struct drm_encoder *encoder,
186 const struct drm_display_mode *mode)
187{
188 const struct drm_encoder_helper_funcs *encoder_funcs =
189 encoder->helper_private;
190
191 if (!encoder_funcs || !encoder_funcs->mode_valid)
192 return MODE_OK;
193
194 return encoder_funcs->mode_valid(encoder, mode);
195}
196
197enum drm_mode_status drm_connector_mode_valid(struct drm_connector *connector,
198 struct drm_display_mode *mode)
199{
200 const struct drm_connector_helper_funcs *connector_funcs =
201 connector->helper_private;
202
203 if (!connector_funcs || !connector_funcs->mode_valid)
204 return MODE_OK;
205
206 return connector_funcs->mode_valid(connector, mode);
207}
208
209#define DRM_OUTPUT_POLL_PERIOD (10*HZ)
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226void drm_kms_helper_poll_enable(struct drm_device *dev)
227{
228 bool poll = false;
229 struct drm_connector *connector;
230 struct drm_connector_list_iter conn_iter;
231 unsigned long delay = DRM_OUTPUT_POLL_PERIOD;
232
233 if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll)
234 return;
235
236 drm_connector_list_iter_begin(dev, &conn_iter);
237 drm_for_each_connector_iter(connector, &conn_iter) {
238 if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT |
239 DRM_CONNECTOR_POLL_DISCONNECT))
240 poll = true;
241 }
242 drm_connector_list_iter_end(&conn_iter);
243
244 if (dev->mode_config.delayed_event) {
245
246
247
248
249
250
251
252
253
254
255 poll = true;
256 delay = HZ;
257 }
258
259 if (poll)
260 schedule_delayed_work(&dev->mode_config.output_poll_work, delay);
261}
262EXPORT_SYMBOL(drm_kms_helper_poll_enable);
263
264static enum drm_connector_status
265drm_helper_probe_detect_ctx(struct drm_connector *connector, bool force)
266{
267 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
268 struct drm_modeset_acquire_ctx ctx;
269 int ret;
270
271 drm_modeset_acquire_init(&ctx, 0);
272
273retry:
274 ret = drm_modeset_lock(&connector->dev->mode_config.connection_mutex, &ctx);
275 if (!ret) {
276 if (funcs->detect_ctx)
277 ret = funcs->detect_ctx(connector, &ctx, force);
278 else if (connector->funcs->detect)
279 ret = connector->funcs->detect(connector, force);
280 else
281 ret = connector_status_connected;
282 }
283
284 if (ret == -EDEADLK) {
285 drm_modeset_backoff(&ctx);
286 goto retry;
287 }
288
289 if (WARN_ON(ret < 0))
290 ret = connector_status_unknown;
291
292 drm_modeset_drop_locks(&ctx);
293 drm_modeset_acquire_fini(&ctx);
294
295 return ret;
296}
297
298
299
300
301
302
303
304
305
306
307
308int
309drm_helper_probe_detect(struct drm_connector *connector,
310 struct drm_modeset_acquire_ctx *ctx,
311 bool force)
312{
313 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
314 struct drm_device *dev = connector->dev;
315 int ret;
316
317 if (!ctx)
318 return drm_helper_probe_detect_ctx(connector, force);
319
320 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);
321 if (ret)
322 return ret;
323
324 if (funcs->detect_ctx)
325 return funcs->detect_ctx(connector, ctx, force);
326 else if (connector->funcs->detect)
327 return connector->funcs->detect(connector, force);
328 else
329 return connector_status_connected;
330}
331EXPORT_SYMBOL(drm_helper_probe_detect);
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
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
393int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
394 uint32_t maxX, uint32_t maxY)
395{
396 struct drm_device *dev = connector->dev;
397 struct drm_display_mode *mode;
398 const struct drm_connector_helper_funcs *connector_funcs =
399 connector->helper_private;
400 int count = 0, ret;
401 int mode_flags = 0;
402 bool verbose_prune = true;
403 enum drm_connector_status old_status;
404 struct drm_modeset_acquire_ctx ctx;
405
406 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
407
408 drm_modeset_acquire_init(&ctx, 0);
409
410 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id,
411 connector->name);
412
413retry:
414 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
415 if (ret == -EDEADLK) {
416 drm_modeset_backoff(&ctx);
417 goto retry;
418 } else
419 WARN_ON(ret < 0);
420
421
422 list_for_each_entry(mode, &connector->modes, head)
423 mode->status = MODE_STALE;
424
425 old_status = connector->status;
426
427 if (connector->force) {
428 if (connector->force == DRM_FORCE_ON ||
429 connector->force == DRM_FORCE_ON_DIGITAL)
430 connector->status = connector_status_connected;
431 else
432 connector->status = connector_status_disconnected;
433 if (connector->funcs->force)
434 connector->funcs->force(connector);
435 } else {
436 ret = drm_helper_probe_detect(connector, &ctx, true);
437
438 if (ret == -EDEADLK) {
439 drm_modeset_backoff(&ctx);
440 goto retry;
441 } else if (WARN(ret < 0, "Invalid return value %i for connector detection\n", ret))
442 ret = connector_status_unknown;
443
444 connector->status = ret;
445 }
446
447
448
449
450
451
452
453 if (old_status != connector->status) {
454 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
455 connector->base.id,
456 connector->name,
457 drm_get_connector_status_name(old_status),
458 drm_get_connector_status_name(connector->status));
459
460
461
462
463
464
465
466 dev->mode_config.delayed_event = true;
467 if (dev->mode_config.poll_enabled)
468 schedule_delayed_work(&dev->mode_config.output_poll_work,
469 0);
470 }
471
472
473 if (drm_kms_helper_poll != dev->mode_config.poll_running)
474 drm_kms_helper_poll_enable(dev);
475
476 dev->mode_config.poll_running = drm_kms_helper_poll;
477
478 if (connector->status == connector_status_disconnected) {
479 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] disconnected\n",
480 connector->base.id, connector->name);
481 drm_mode_connector_update_edid_property(connector, NULL);
482 verbose_prune = false;
483 goto prune;
484 }
485
486 if (connector->override_edid) {
487 struct edid *edid = (struct edid *) connector->edid_blob_ptr->data;
488
489 count = drm_add_edid_modes(connector, edid);
490 drm_edid_to_eld(connector, edid);
491 } else {
492 struct edid *edid = drm_load_edid_firmware(connector);
493 if (!IS_ERR_OR_NULL(edid)) {
494 drm_mode_connector_update_edid_property(connector, edid);
495 count = drm_add_edid_modes(connector, edid);
496 drm_edid_to_eld(connector, edid);
497 kfree(edid);
498 }
499 if (count == 0)
500 count = (*connector_funcs->get_modes)(connector);
501 }
502
503 if (count == 0 && connector->status == connector_status_connected)
504 count = drm_add_modes_noedid(connector, 1024, 768);
505 count += drm_helper_probe_add_cmdline_mode(connector);
506 if (count == 0)
507 goto prune;
508
509 drm_mode_connector_list_update(connector);
510
511 if (connector->interlace_allowed)
512 mode_flags |= DRM_MODE_FLAG_INTERLACE;
513 if (connector->doublescan_allowed)
514 mode_flags |= DRM_MODE_FLAG_DBLSCAN;
515 if (connector->stereo_allowed)
516 mode_flags |= DRM_MODE_FLAG_3D_MASK;
517
518 list_for_each_entry(mode, &connector->modes, head) {
519 if (mode->status == MODE_OK)
520 mode->status = drm_mode_validate_basic(mode);
521
522 if (mode->status == MODE_OK)
523 mode->status = drm_mode_validate_size(mode, maxX, maxY);
524
525 if (mode->status == MODE_OK)
526 mode->status = drm_mode_validate_flag(mode, mode_flags);
527
528 if (mode->status == MODE_OK)
529 mode->status = drm_mode_validate_pipeline(mode,
530 connector);
531
532 if (mode->status == MODE_OK)
533 mode->status = drm_mode_validate_ycbcr420(mode,
534 connector);
535 }
536
537prune:
538 drm_mode_prune_invalid(dev, &connector->modes, verbose_prune);
539
540 drm_modeset_drop_locks(&ctx);
541 drm_modeset_acquire_fini(&ctx);
542
543 if (list_empty(&connector->modes))
544 return 0;
545
546 list_for_each_entry(mode, &connector->modes, head)
547 mode->vrefresh = drm_mode_vrefresh(mode);
548
549 drm_mode_sort(&connector->modes);
550
551 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id,
552 connector->name);
553 list_for_each_entry(mode, &connector->modes, head) {
554 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
555 drm_mode_debug_printmodeline(mode);
556 }
557
558 return count;
559}
560EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578void drm_kms_helper_hotplug_event(struct drm_device *dev)
579{
580
581 drm_sysfs_hotplug_event(dev);
582 if (dev->mode_config.funcs->output_poll_changed)
583 dev->mode_config.funcs->output_poll_changed(dev);
584}
585EXPORT_SYMBOL(drm_kms_helper_hotplug_event);
586
587static void output_poll_execute(struct work_struct *work)
588{
589 struct delayed_work *delayed_work = to_delayed_work(work);
590 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);
591 struct drm_connector *connector;
592 struct drm_connector_list_iter conn_iter;
593 enum drm_connector_status old_status;
594 bool repoll = false, changed;
595
596
597 changed = dev->mode_config.delayed_event;
598 dev->mode_config.delayed_event = false;
599
600 if (!drm_kms_helper_poll)
601 goto out;
602
603 if (!mutex_trylock(&dev->mode_config.mutex)) {
604 repoll = true;
605 goto out;
606 }
607
608 drm_connector_list_iter_begin(dev, &conn_iter);
609 drm_for_each_connector_iter(connector, &conn_iter) {
610
611 if (connector->force)
612 continue;
613
614
615
616 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD)
617 continue;
618
619 old_status = connector->status;
620
621
622 if (old_status == connector_status_connected &&
623 !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT))
624 continue;
625
626 repoll = true;
627
628 connector->status = drm_helper_probe_detect(connector, NULL, false);
629 if (old_status != connector->status) {
630 const char *old, *new;
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645 if (connector->status == connector_status_unknown) {
646 connector->status = old_status;
647 continue;
648 }
649
650 old = drm_get_connector_status_name(old_status);
651 new = drm_get_connector_status_name(connector->status);
652
653 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] "
654 "status updated from %s to %s\n",
655 connector->base.id,
656 connector->name,
657 old, new);
658
659 changed = true;
660 }
661 }
662 drm_connector_list_iter_end(&conn_iter);
663
664 mutex_unlock(&dev->mode_config.mutex);
665
666out:
667 if (changed)
668 drm_kms_helper_hotplug_event(dev);
669
670 if (repoll)
671 schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
672}
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688void drm_kms_helper_poll_disable(struct drm_device *dev)
689{
690 if (!dev->mode_config.poll_enabled)
691 return;
692 cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
693}
694EXPORT_SYMBOL(drm_kms_helper_poll_disable);
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715void drm_kms_helper_poll_init(struct drm_device *dev)
716{
717 INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute);
718 dev->mode_config.poll_enabled = true;
719
720 drm_kms_helper_poll_enable(dev);
721}
722EXPORT_SYMBOL(drm_kms_helper_poll_init);
723
724
725
726
727
728void drm_kms_helper_poll_fini(struct drm_device *dev)
729{
730 drm_kms_helper_poll_disable(dev);
731}
732EXPORT_SYMBOL(drm_kms_helper_poll_fini);
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757bool drm_helper_hpd_irq_event(struct drm_device *dev)
758{
759 struct drm_connector *connector;
760 struct drm_connector_list_iter conn_iter;
761 enum drm_connector_status old_status;
762 bool changed = false;
763
764 if (!dev->mode_config.poll_enabled)
765 return false;
766
767 mutex_lock(&dev->mode_config.mutex);
768 drm_connector_list_iter_begin(dev, &conn_iter);
769 drm_for_each_connector_iter(connector, &conn_iter) {
770
771 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
772 continue;
773
774 old_status = connector->status;
775
776 connector->status = drm_helper_probe_detect(connector, NULL, false);
777 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
778 connector->base.id,
779 connector->name,
780 drm_get_connector_status_name(old_status),
781 drm_get_connector_status_name(connector->status));
782 if (old_status != connector->status)
783 changed = true;
784 }
785 drm_connector_list_iter_end(&conn_iter);
786 mutex_unlock(&dev->mode_config.mutex);
787
788 if (changed)
789 drm_kms_helper_hotplug_event(dev);
790
791 return changed;
792}
793EXPORT_SYMBOL(drm_helper_hpd_irq_event);
794