Subversion Repositories Kolibri OS

Rev

Rev 4539 | Rev 5060 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4539 Rev 4560
Line 461... Line 461...
461
	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608,
461
	{ DRM_MODE("2560x1600", DRM_MODE_TYPE_DRIVER, 552750, 2560, 2608,
462
		   2640, 2720, 0, 1600, 1603, 1609, 1694, 0,
462
		   2640, 2720, 0, 1600, 1603, 1609, 1694, 0,
463
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
463
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC) },
464
};
464
};
Line -... Line 465...
-
 
465
 
-
 
466
/*
-
 
467
 * These more or less come from the DMT spec.  The 720x400 modes are
-
 
468
 * inferred from historical 80x25 practice.  The 640x480@67 and 832x624@75
-
 
469
 * modes are old-school Mac modes.  The EDID spec says the 1152x864@75 mode
-
 
470
 * should be 1152x870, again for the Mac, but instead we use the x864 DMT
-
 
471
 * mode.
-
 
472
 *
-
 
473
 * The DMT modes have been fact-checked; the rest are mild guesses.
465
 
474
 */
466
static const struct drm_display_mode edid_est_modes[] = {
475
static const struct drm_display_mode edid_est_modes[] = {
467
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
476
	{ DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
468
		   968, 1056, 0, 600, 601, 605, 628, 0,
477
		   968, 1056, 0, 600, 601, 605, 628, 0,
469
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */
478
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */
Line 563... Line 572...
563
	{ 1600, 1200, 70, 0 },
572
	{ 1600, 1200, 70, 0 },
564
	/* byte 10 */
573
	/* byte 10 */
565
	{ 1600, 1200, 75, 0 },
574
	{ 1600, 1200, 75, 0 },
566
	{ 1600, 1200, 85, 0 },
575
	{ 1600, 1200, 85, 0 },
567
	{ 1792, 1344, 60, 0 },
576
	{ 1792, 1344, 60, 0 },
568
	{ 1792, 1344, 85, 0 },
577
	{ 1792, 1344, 75, 0 },
569
	{ 1856, 1392, 60, 0 },
578
	{ 1856, 1392, 60, 0 },
570
	{ 1856, 1392, 75, 0 },
579
	{ 1856, 1392, 75, 0 },
571
	{ 1920, 1200, 60, 1 },
580
	{ 1920, 1200, 60, 1 },
572
	{ 1920, 1200, 60, 0 },
581
	{ 1920, 1200, 60, 0 },
573
	/* byte 11 */
582
	/* byte 11 */
Line 594... Line 603...
594
static const struct drm_display_mode edid_cea_modes[] = {
603
static const struct drm_display_mode edid_cea_modes[] = {
595
	/* 1 - 640x480@60Hz */
604
	/* 1 - 640x480@60Hz */
596
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
605
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
597
		   752, 800, 0, 480, 490, 492, 525, 0,
606
		   752, 800, 0, 480, 490, 492, 525, 0,
598
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
607
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
599
	  .vrefresh = 60, },
608
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
600
	/* 2 - 720x480@60Hz */
609
	/* 2 - 720x480@60Hz */
601
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
610
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
602
		   798, 858, 0, 480, 489, 495, 525, 0,
611
		   798, 858, 0, 480, 489, 495, 525, 0,
603
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
612
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
604
	  .vrefresh = 60, },
613
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
605
	/* 3 - 720x480@60Hz */
614
	/* 3 - 720x480@60Hz */
606
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
615
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
607
		   798, 858, 0, 480, 489, 495, 525, 0,
616
		   798, 858, 0, 480, 489, 495, 525, 0,
608
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
617
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
609
	  .vrefresh = 60, },
618
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
610
	/* 4 - 1280x720@60Hz */
619
	/* 4 - 1280x720@60Hz */
611
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
620
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
612
		   1430, 1650, 0, 720, 725, 730, 750, 0,
621
		   1430, 1650, 0, 720, 725, 730, 750, 0,
613
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
622
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
614
	  .vrefresh = 60, },
623
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
615
	/* 5 - 1920x1080i@60Hz */
624
	/* 5 - 1920x1080i@60Hz */
616
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
625
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
617
		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
626
		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
618
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
627
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
619
			DRM_MODE_FLAG_INTERLACE),
628
			DRM_MODE_FLAG_INTERLACE),
620
	  .vrefresh = 60, },
629
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
621
	/* 6 - 1440x480i@60Hz */
630
	/* 6 - 1440x480i@60Hz */
622
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
631
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
623
		   1602, 1716, 0, 480, 488, 494, 525, 0,
632
		   1602, 1716, 0, 480, 488, 494, 525, 0,
624
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
633
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
625
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
634
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
626
	  .vrefresh = 60, },
635
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
627
	/* 7 - 1440x480i@60Hz */
636
	/* 7 - 1440x480i@60Hz */
628
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
637
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
629
		   1602, 1716, 0, 480, 488, 494, 525, 0,
638
		   1602, 1716, 0, 480, 488, 494, 525, 0,
630
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
639
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
631
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
640
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
632
	  .vrefresh = 60, },
641
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
633
	/* 8 - 1440x240@60Hz */
642
	/* 8 - 1440x240@60Hz */
634
	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
643
	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
635
		   1602, 1716, 0, 240, 244, 247, 262, 0,
644
		   1602, 1716, 0, 240, 244, 247, 262, 0,
636
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
645
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
637
			DRM_MODE_FLAG_DBLCLK),
646
			DRM_MODE_FLAG_DBLCLK),
638
	  .vrefresh = 60, },
647
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
639
	/* 9 - 1440x240@60Hz */
648
	/* 9 - 1440x240@60Hz */
640
	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
649
	{ DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
641
		   1602, 1716, 0, 240, 244, 247, 262, 0,
650
		   1602, 1716, 0, 240, 244, 247, 262, 0,
642
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
651
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
643
			DRM_MODE_FLAG_DBLCLK),
652
			DRM_MODE_FLAG_DBLCLK),
644
	  .vrefresh = 60, },
653
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
645
	/* 10 - 2880x480i@60Hz */
654
	/* 10 - 2880x480i@60Hz */
646
	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
655
	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
647
		   3204, 3432, 0, 480, 488, 494, 525, 0,
656
		   3204, 3432, 0, 480, 488, 494, 525, 0,
648
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
657
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
649
			DRM_MODE_FLAG_INTERLACE),
658
			DRM_MODE_FLAG_INTERLACE),
650
	  .vrefresh = 60, },
659
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
651
	/* 11 - 2880x480i@60Hz */
660
	/* 11 - 2880x480i@60Hz */
652
	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
661
	{ DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
653
		   3204, 3432, 0, 480, 488, 494, 525, 0,
662
		   3204, 3432, 0, 480, 488, 494, 525, 0,
654
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
663
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
655
			DRM_MODE_FLAG_INTERLACE),
664
			DRM_MODE_FLAG_INTERLACE),
656
	  .vrefresh = 60, },
665
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
657
	/* 12 - 2880x240@60Hz */
666
	/* 12 - 2880x240@60Hz */
658
	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
667
	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
659
		   3204, 3432, 0, 240, 244, 247, 262, 0,
668
		   3204, 3432, 0, 240, 244, 247, 262, 0,
660
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
669
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
661
	  .vrefresh = 60, },
670
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
662
	/* 13 - 2880x240@60Hz */
671
	/* 13 - 2880x240@60Hz */
663
	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
672
	{ DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
664
		   3204, 3432, 0, 240, 244, 247, 262, 0,
673
		   3204, 3432, 0, 240, 244, 247, 262, 0,
665
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
674
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
666
	  .vrefresh = 60, },
675
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
667
	/* 14 - 1440x480@60Hz */
676
	/* 14 - 1440x480@60Hz */
668
	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
677
	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
669
		   1596, 1716, 0, 480, 489, 495, 525, 0,
678
		   1596, 1716, 0, 480, 489, 495, 525, 0,
670
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
679
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
671
	  .vrefresh = 60, },
680
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
672
	/* 15 - 1440x480@60Hz */
681
	/* 15 - 1440x480@60Hz */
673
	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
682
	{ DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
674
		   1596, 1716, 0, 480, 489, 495, 525, 0,
683
		   1596, 1716, 0, 480, 489, 495, 525, 0,
675
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
684
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
676
	  .vrefresh = 60, },
685
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
677
	/* 16 - 1920x1080@60Hz */
686
	/* 16 - 1920x1080@60Hz */
678
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
687
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
679
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
688
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
680
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
689
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
681
	  .vrefresh = 60, },
690
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
682
	/* 17 - 720x576@50Hz */
691
	/* 17 - 720x576@50Hz */
683
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
692
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
684
		   796, 864, 0, 576, 581, 586, 625, 0,
693
		   796, 864, 0, 576, 581, 586, 625, 0,
685
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
694
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
686
	  .vrefresh = 50, },
695
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
687
	/* 18 - 720x576@50Hz */
696
	/* 18 - 720x576@50Hz */
688
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
697
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
689
		   796, 864, 0, 576, 581, 586, 625, 0,
698
		   796, 864, 0, 576, 581, 586, 625, 0,
690
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
699
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
691
	  .vrefresh = 50, },
700
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
692
	/* 19 - 1280x720@50Hz */
701
	/* 19 - 1280x720@50Hz */
693
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
702
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
694
		   1760, 1980, 0, 720, 725, 730, 750, 0,
703
		   1760, 1980, 0, 720, 725, 730, 750, 0,
695
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
704
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
696
	  .vrefresh = 50, },
705
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
697
	/* 20 - 1920x1080i@50Hz */
706
	/* 20 - 1920x1080i@50Hz */
698
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
707
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
699
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
708
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
700
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
709
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
701
			DRM_MODE_FLAG_INTERLACE),
710
			DRM_MODE_FLAG_INTERLACE),
702
	  .vrefresh = 50, },
711
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
703
	/* 21 - 1440x576i@50Hz */
712
	/* 21 - 1440x576i@50Hz */
704
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
713
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
705
		   1590, 1728, 0, 576, 580, 586, 625, 0,
714
		   1590, 1728, 0, 576, 580, 586, 625, 0,
706
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
715
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
707
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
716
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
708
	  .vrefresh = 50, },
717
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
709
	/* 22 - 1440x576i@50Hz */
718
	/* 22 - 1440x576i@50Hz */
710
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
719
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
711
		   1590, 1728, 0, 576, 580, 586, 625, 0,
720
		   1590, 1728, 0, 576, 580, 586, 625, 0,
712
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
721
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
713
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
722
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
714
	  .vrefresh = 50, },
723
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
715
	/* 23 - 1440x288@50Hz */
724
	/* 23 - 1440x288@50Hz */
716
	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
725
	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
717
		   1590, 1728, 0, 288, 290, 293, 312, 0,
726
		   1590, 1728, 0, 288, 290, 293, 312, 0,
718
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
727
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
719
			DRM_MODE_FLAG_DBLCLK),
728
			DRM_MODE_FLAG_DBLCLK),
720
	  .vrefresh = 50, },
729
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
721
	/* 24 - 1440x288@50Hz */
730
	/* 24 - 1440x288@50Hz */
722
	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
731
	{ DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
723
		   1590, 1728, 0, 288, 290, 293, 312, 0,
732
		   1590, 1728, 0, 288, 290, 293, 312, 0,
724
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
733
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
725
			DRM_MODE_FLAG_DBLCLK),
734
			DRM_MODE_FLAG_DBLCLK),
726
	  .vrefresh = 50, },
735
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
727
	/* 25 - 2880x576i@50Hz */
736
	/* 25 - 2880x576i@50Hz */
728
	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
737
	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
729
		   3180, 3456, 0, 576, 580, 586, 625, 0,
738
		   3180, 3456, 0, 576, 580, 586, 625, 0,
730
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
739
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
731
			DRM_MODE_FLAG_INTERLACE),
740
			DRM_MODE_FLAG_INTERLACE),
732
	  .vrefresh = 50, },
741
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
733
	/* 26 - 2880x576i@50Hz */
742
	/* 26 - 2880x576i@50Hz */
734
	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
743
	{ DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
735
		   3180, 3456, 0, 576, 580, 586, 625, 0,
744
		   3180, 3456, 0, 576, 580, 586, 625, 0,
736
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
745
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
737
			DRM_MODE_FLAG_INTERLACE),
746
			DRM_MODE_FLAG_INTERLACE),
738
	  .vrefresh = 50, },
747
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
739
	/* 27 - 2880x288@50Hz */
748
	/* 27 - 2880x288@50Hz */
740
	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
749
	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
741
		   3180, 3456, 0, 288, 290, 293, 312, 0,
750
		   3180, 3456, 0, 288, 290, 293, 312, 0,
742
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
751
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
743
	  .vrefresh = 50, },
752
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
744
	/* 28 - 2880x288@50Hz */
753
	/* 28 - 2880x288@50Hz */
745
	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
754
	{ DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
746
		   3180, 3456, 0, 288, 290, 293, 312, 0,
755
		   3180, 3456, 0, 288, 290, 293, 312, 0,
747
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
756
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
748
	  .vrefresh = 50, },
757
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
749
	/* 29 - 1440x576@50Hz */
758
	/* 29 - 1440x576@50Hz */
750
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
759
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
751
		   1592, 1728, 0, 576, 581, 586, 625, 0,
760
		   1592, 1728, 0, 576, 581, 586, 625, 0,
752
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
761
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
753
	  .vrefresh = 50, },
762
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
754
	/* 30 - 1440x576@50Hz */
763
	/* 30 - 1440x576@50Hz */
755
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
764
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
756
		   1592, 1728, 0, 576, 581, 586, 625, 0,
765
		   1592, 1728, 0, 576, 581, 586, 625, 0,
757
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
766
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
758
	  .vrefresh = 50, },
767
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
759
	/* 31 - 1920x1080@50Hz */
768
	/* 31 - 1920x1080@50Hz */
760
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
769
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
761
		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
770
		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
762
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
771
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
763
	  .vrefresh = 50, },
772
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
764
	/* 32 - 1920x1080@24Hz */
773
	/* 32 - 1920x1080@24Hz */
765
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
774
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
766
		   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
775
		   2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
767
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
776
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
768
	  .vrefresh = 24, },
777
	  .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
769
	/* 33 - 1920x1080@25Hz */
778
	/* 33 - 1920x1080@25Hz */
770
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
779
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
771
		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
780
		   2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
772
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
781
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
773
	  .vrefresh = 25, },
782
	  .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
774
	/* 34 - 1920x1080@30Hz */
783
	/* 34 - 1920x1080@30Hz */
775
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
784
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
776
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
785
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
777
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
786
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
778
	  .vrefresh = 30, },
787
	  .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
779
	/* 35 - 2880x480@60Hz */
788
	/* 35 - 2880x480@60Hz */
780
	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
789
	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
781
		   3192, 3432, 0, 480, 489, 495, 525, 0,
790
		   3192, 3432, 0, 480, 489, 495, 525, 0,
782
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
791
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
783
	  .vrefresh = 60, },
792
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
784
	/* 36 - 2880x480@60Hz */
793
	/* 36 - 2880x480@60Hz */
785
	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
794
	{ DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
786
		   3192, 3432, 0, 480, 489, 495, 525, 0,
795
		   3192, 3432, 0, 480, 489, 495, 525, 0,
787
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
796
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
788
	  .vrefresh = 60, },
797
	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
789
	/* 37 - 2880x576@50Hz */
798
	/* 37 - 2880x576@50Hz */
790
	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
799
	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
791
		   3184, 3456, 0, 576, 581, 586, 625, 0,
800
		   3184, 3456, 0, 576, 581, 586, 625, 0,
792
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
801
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
793
	  .vrefresh = 50, },
802
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
794
	/* 38 - 2880x576@50Hz */
803
	/* 38 - 2880x576@50Hz */
795
	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
804
	{ DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
796
		   3184, 3456, 0, 576, 581, 586, 625, 0,
805
		   3184, 3456, 0, 576, 581, 586, 625, 0,
797
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
806
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
798
	  .vrefresh = 50, },
807
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
799
	/* 39 - 1920x1080i@50Hz */
808
	/* 39 - 1920x1080i@50Hz */
800
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
809
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
801
		   2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
810
		   2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
802
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
811
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
803
			DRM_MODE_FLAG_INTERLACE),
812
			DRM_MODE_FLAG_INTERLACE),
804
	  .vrefresh = 50, },
813
	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
805
	/* 40 - 1920x1080i@100Hz */
814
	/* 40 - 1920x1080i@100Hz */
806
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
815
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
807
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
816
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
808
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
817
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
809
			DRM_MODE_FLAG_INTERLACE),
818
			DRM_MODE_FLAG_INTERLACE),
810
	  .vrefresh = 100, },
819
	  .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
811
	/* 41 - 1280x720@100Hz */
820
	/* 41 - 1280x720@100Hz */
812
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
821
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
813
		   1760, 1980, 0, 720, 725, 730, 750, 0,
822
		   1760, 1980, 0, 720, 725, 730, 750, 0,
814
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
823
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
815
	  .vrefresh = 100, },
824
	  .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
816
	/* 42 - 720x576@100Hz */
825
	/* 42 - 720x576@100Hz */
817
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
826
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
818
		   796, 864, 0, 576, 581, 586, 625, 0,
827
		   796, 864, 0, 576, 581, 586, 625, 0,
819
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
828
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
820
	  .vrefresh = 100, },
829
	  .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
821
	/* 43 - 720x576@100Hz */
830
	/* 43 - 720x576@100Hz */
822
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
831
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
823
		   796, 864, 0, 576, 581, 586, 625, 0,
832
		   796, 864, 0, 576, 581, 586, 625, 0,
824
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
833
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
825
	  .vrefresh = 100, },
834
	  .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
826
	/* 44 - 1440x576i@100Hz */
835
	/* 44 - 1440x576i@100Hz */
827
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
836
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
828
		   1590, 1728, 0, 576, 580, 586, 625, 0,
837
		   1590, 1728, 0, 576, 580, 586, 625, 0,
829
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
838
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
830
			DRM_MODE_FLAG_DBLCLK),
839
			DRM_MODE_FLAG_DBLCLK),
831
	  .vrefresh = 100, },
840
	  .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
832
	/* 45 - 1440x576i@100Hz */
841
	/* 45 - 1440x576i@100Hz */
833
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
842
	{ DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
834
		   1590, 1728, 0, 576, 580, 586, 625, 0,
843
		   1590, 1728, 0, 576, 580, 586, 625, 0,
835
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
844
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
836
			DRM_MODE_FLAG_DBLCLK),
845
			DRM_MODE_FLAG_DBLCLK),
837
	  .vrefresh = 100, },
846
	  .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
838
	/* 46 - 1920x1080i@120Hz */
847
	/* 46 - 1920x1080i@120Hz */
839
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
848
	{ DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
840
		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
849
		   2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
841
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
850
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
842
			DRM_MODE_FLAG_INTERLACE),
851
			DRM_MODE_FLAG_INTERLACE),
843
	  .vrefresh = 120, },
852
	  .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
844
	/* 47 - 1280x720@120Hz */
853
	/* 47 - 1280x720@120Hz */
845
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
854
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
846
		   1430, 1650, 0, 720, 725, 730, 750, 0,
855
		   1430, 1650, 0, 720, 725, 730, 750, 0,
847
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
856
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
848
	  .vrefresh = 120, },
857
	  .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
849
	/* 48 - 720x480@120Hz */
858
	/* 48 - 720x480@120Hz */
850
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
859
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
851
		   798, 858, 0, 480, 489, 495, 525, 0,
860
		   798, 858, 0, 480, 489, 495, 525, 0,
852
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
861
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
853
	  .vrefresh = 120, },
862
	  .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
854
	/* 49 - 720x480@120Hz */
863
	/* 49 - 720x480@120Hz */
855
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
864
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
856
		   798, 858, 0, 480, 489, 495, 525, 0,
865
		   798, 858, 0, 480, 489, 495, 525, 0,
857
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
866
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
858
	  .vrefresh = 120, },
867
	  .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
859
	/* 50 - 1440x480i@120Hz */
868
	/* 50 - 1440x480i@120Hz */
860
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
869
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
861
		   1602, 1716, 0, 480, 488, 494, 525, 0,
870
		   1602, 1716, 0, 480, 488, 494, 525, 0,
862
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
871
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
863
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
872
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
864
	  .vrefresh = 120, },
873
	  .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
865
	/* 51 - 1440x480i@120Hz */
874
	/* 51 - 1440x480i@120Hz */
866
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
875
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
867
		   1602, 1716, 0, 480, 488, 494, 525, 0,
876
		   1602, 1716, 0, 480, 488, 494, 525, 0,
868
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
877
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
869
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
878
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
870
	  .vrefresh = 120, },
879
	  .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
871
	/* 52 - 720x576@200Hz */
880
	/* 52 - 720x576@200Hz */
872
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
881
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
873
		   796, 864, 0, 576, 581, 586, 625, 0,
882
		   796, 864, 0, 576, 581, 586, 625, 0,
874
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
883
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
875
	  .vrefresh = 200, },
884
	  .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
876
	/* 53 - 720x576@200Hz */
885
	/* 53 - 720x576@200Hz */
877
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
886
	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
878
		   796, 864, 0, 576, 581, 586, 625, 0,
887
		   796, 864, 0, 576, 581, 586, 625, 0,
879
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
888
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
880
	  .vrefresh = 200, },
889
	  .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
881
	/* 54 - 1440x576i@200Hz */
890
	/* 54 - 1440x576i@200Hz */
882
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
891
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
883
		   1590, 1728, 0, 576, 580, 586, 625, 0,
892
		   1590, 1728, 0, 576, 580, 586, 625, 0,
884
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
893
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
885
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
894
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
886
	  .vrefresh = 200, },
895
	  .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
887
	/* 55 - 1440x576i@200Hz */
896
	/* 55 - 1440x576i@200Hz */
888
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
897
	{ DRM_MODE("1440x576i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
889
		   1590, 1728, 0, 576, 580, 586, 625, 0,
898
		   1590, 1728, 0, 576, 580, 586, 625, 0,
890
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
899
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
891
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
900
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
892
	  .vrefresh = 200, },
901
	  .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
893
	/* 56 - 720x480@240Hz */
902
	/* 56 - 720x480@240Hz */
894
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
903
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
895
		   798, 858, 0, 480, 489, 495, 525, 0,
904
		   798, 858, 0, 480, 489, 495, 525, 0,
896
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
905
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
897
	  .vrefresh = 240, },
906
	  .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
898
	/* 57 - 720x480@240Hz */
907
	/* 57 - 720x480@240Hz */
899
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
908
	{ DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
900
		   798, 858, 0, 480, 489, 495, 525, 0,
909
		   798, 858, 0, 480, 489, 495, 525, 0,
901
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
910
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
902
	  .vrefresh = 240, },
911
	  .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
903
	/* 58 - 1440x480i@240 */
912
	/* 58 - 1440x480i@240 */
904
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
913
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
905
		   1602, 1716, 0, 480, 488, 494, 525, 0,
914
		   1602, 1716, 0, 480, 488, 494, 525, 0,
906
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
915
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
907
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
916
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
908
	  .vrefresh = 240, },
917
	  .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
909
	/* 59 - 1440x480i@240 */
918
	/* 59 - 1440x480i@240 */
910
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
919
	{ DRM_MODE("1440x480i", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
911
		   1602, 1716, 0, 480, 488, 494, 525, 0,
920
		   1602, 1716, 0, 480, 488, 494, 525, 0,
912
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
921
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
913
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
922
			DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
914
	  .vrefresh = 240, },
923
	  .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
915
	/* 60 - 1280x720@24Hz */
924
	/* 60 - 1280x720@24Hz */
916
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
925
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
917
		   3080, 3300, 0, 720, 725, 730, 750, 0,
926
		   3080, 3300, 0, 720, 725, 730, 750, 0,
918
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
927
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
919
	  .vrefresh = 24, },
928
	  .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
920
	/* 61 - 1280x720@25Hz */
929
	/* 61 - 1280x720@25Hz */
921
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
930
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
922
		   3740, 3960, 0, 720, 725, 730, 750, 0,
931
		   3740, 3960, 0, 720, 725, 730, 750, 0,
923
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
932
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
924
	  .vrefresh = 25, },
933
	  .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
925
	/* 62 - 1280x720@30Hz */
934
	/* 62 - 1280x720@30Hz */
926
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
935
	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
927
		   3080, 3300, 0, 720, 725, 730, 750, 0,
936
		   3080, 3300, 0, 720, 725, 730, 750, 0,
928
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
937
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
929
	  .vrefresh = 30, },
938
	  .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
930
	/* 63 - 1920x1080@120Hz */
939
	/* 63 - 1920x1080@120Hz */
931
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
940
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
932
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
941
		   2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
933
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
942
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
934
	 .vrefresh = 120, },
943
	 .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
935
	/* 64 - 1920x1080@100Hz */
944
	/* 64 - 1920x1080@100Hz */
936
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
945
	{ DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
937
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
946
		   2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
938
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
947
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
939
	 .vrefresh = 100, },
948
	 .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
940
};
949
};
Line 941... Line 950...
941
 
950
 
942
/*
951
/*
943
 * HDMI 1.4 4k modes.
952
 * HDMI 1.4 4k modes.
Line 1267... Line 1276...
1267
 
1276
 
1268
	return edid;
1277
	return edid;
1269
}
1278
}
Line -... Line 1279...
-
 
1279
EXPORT_SYMBOL(drm_get_edid);
-
 
1280
 
-
 
1281
/**
-
 
1282
 * drm_edid_duplicate - duplicate an EDID and the extensions
-
 
1283
 * @edid: EDID to duplicate
-
 
1284
 *
-
 
1285
 * Return duplicate edid or NULL on allocation failure.
-
 
1286
 */
-
 
1287
struct edid *drm_edid_duplicate(const struct edid *edid)
-
 
1288
{
-
 
1289
	return kmemdup(edid, (edid->extensions + 1) * EDID_LENGTH, GFP_KERNEL);
-
 
1290
}
1270
EXPORT_SYMBOL(drm_get_edid);
1291
EXPORT_SYMBOL(drm_edid_duplicate);
Line 1271... Line 1292...
1271
 
1292
 
1272
/*** EDID parsing ***/
1293
/*** EDID parsing ***/
1273
 
1294
 
Line 1311... Line 1332...
1311
 
1332
 
1312
	return 0;
1333
	return 0;
Line 1313... Line 1334...
1313
}
1334
}
1314
 
1335
 
Line 1315... Line 1336...
1315
#define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
1336
#define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
1316
#define MODE_REFRESH_DIFF(m,r) (abs((m)->vrefresh - target_refresh))
1337
#define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
1317
 
1338
 
1318
/**
1339
/**
Line 1326... Line 1347...
1326
static void edid_fixup_preferred(struct drm_connector *connector,
1347
static void edid_fixup_preferred(struct drm_connector *connector,
1327
				 u32 quirks)
1348
				 u32 quirks)
1328
{
1349
{
1329
	struct drm_display_mode *t, *cur_mode, *preferred_mode;
1350
	struct drm_display_mode *t, *cur_mode, *preferred_mode;
1330
	int target_refresh = 0;
1351
	int target_refresh = 0;
-
 
1352
	int cur_vrefresh, preferred_vrefresh;
Line 1331... Line 1353...
1331
 
1353
 
1332
	if (list_empty(&connector->probed_modes))
1354
	if (list_empty(&connector->probed_modes))
Line 1333... Line 1355...
1333
		return;
1355
		return;
Line 1348... Line 1370...
1348
 
1370
 
1349
		/* Largest mode is preferred */
1371
		/* Largest mode is preferred */
1350
		if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
1372
		if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
Line -... Line 1373...
-
 
1373
			preferred_mode = cur_mode;
-
 
1374
 
-
 
1375
		cur_vrefresh = cur_mode->vrefresh ?
-
 
1376
			cur_mode->vrefresh : drm_mode_vrefresh(cur_mode);
1351
			preferred_mode = cur_mode;
1377
		preferred_vrefresh = preferred_mode->vrefresh ?
1352
 
1378
			preferred_mode->vrefresh : drm_mode_vrefresh(preferred_mode);
1353
		/* At a given size, try to get closest to target refresh */
1379
		/* At a given size, try to get closest to target refresh */
1354
		if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
1380
		if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
1355
		    MODE_REFRESH_DIFF(cur_mode, target_refresh) <
1381
		    MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
1356
		    MODE_REFRESH_DIFF(preferred_mode, target_refresh)) {
1382
		    MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
1357
			preferred_mode = cur_mode;
1383
			preferred_mode = cur_mode;
Line 1358... Line 1384...
1358
		}
1384
		}
Line 2071... Line 2097...
2071
	int i, j, m, modes = 0;
2097
	int i, j, m, modes = 0;
2072
	struct drm_display_mode *mode;
2098
	struct drm_display_mode *mode;
2073
	u8 *est = ((u8 *)timing) + 5;
2099
	u8 *est = ((u8 *)timing) + 5;
Line 2074... Line 2100...
2074
 
2100
 
2075
	for (i = 0; i < 6; i++) {
2101
	for (i = 0; i < 6; i++) {
2076
		for (j = 7; j > 0; j--) {
2102
		for (j = 7; j >= 0; j--) {
2077
			m = (i * 8) + (7 - j);
2103
			m = (i * 8) + (7 - j);
2078
			if (m >= ARRAY_SIZE(est3_modes))
2104
			if (m >= ARRAY_SIZE(est3_modes))
2079
				break;
2105
				break;
2080
			if (est[i] & (1 << j)) {
2106
			if (est[i] & (1 << j)) {
Line 2407... Line 2433...
2407
		clock1 = cea_mode->clock;
2433
		clock1 = cea_mode->clock;
2408
		clock2 = cea_mode_alternate_clock(cea_mode);
2434
		clock2 = cea_mode_alternate_clock(cea_mode);
Line 2409... Line 2435...
2409
 
2435
 
2410
		if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
2436
		if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
2411
		     KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
2437
		     KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
2412
		    drm_mode_equal_no_clocks(to_match, cea_mode))
2438
		    drm_mode_equal_no_clocks_no_stereo(to_match, cea_mode))
2413
			return mode + 1;
2439
			return mode + 1;
2414
	}
2440
	}
2415
	return 0;
2441
	return 0;
2416
}
2442
}
Line 2456... Line 2482...
2456
		clock1 = hdmi_mode->clock;
2482
		clock1 = hdmi_mode->clock;
2457
		clock2 = hdmi_mode_alternate_clock(hdmi_mode);
2483
		clock2 = hdmi_mode_alternate_clock(hdmi_mode);
Line 2458... Line 2484...
2458
 
2484
 
2459
		if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
2485
		if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
2460
		     KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
2486
		     KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
2461
		    drm_mode_equal_no_clocks(to_match, hdmi_mode))
2487
		    drm_mode_equal_no_clocks_no_stereo(to_match, hdmi_mode))
2462
			return mode + 1;
2488
			return mode + 1;
2463
	}
2489
	}
2464
	return 0;
2490
	return 0;
Line 2510... Line 2536...
2510
 
2536
 
2511
		newmode = drm_mode_duplicate(dev, cea_mode);
2537
		newmode = drm_mode_duplicate(dev, cea_mode);
2512
		if (!newmode)
2538
		if (!newmode)
Line -... Line 2539...
-
 
2539
			continue;
-
 
2540
 
-
 
2541
		/* Carry over the stereo flags */
2513
			continue;
2542
		newmode->flags |= mode->flags & DRM_MODE_FLAG_3D_MASK;
2514
 
2543
 
2515
		/*
2544
		/*
2516
		 * The current mode could be either variant. Make
2545
		 * The current mode could be either variant. Make
2517
		 * sure to pick the "other" clock for the new mode.
2546
		 * sure to pick the "other" clock for the new mode.
Line 2531... Line 2560...
2531
	}
2560
	}
Line 2532... Line 2561...
2532
 
2561
 
2533
	return modes;
2562
	return modes;
Line -... Line 2563...
-
 
2563
}
-
 
2564
 
-
 
2565
static struct drm_display_mode *
-
 
2566
drm_display_mode_from_vic_index(struct drm_connector *connector,
-
 
2567
				const u8 *video_db, u8 video_len,
-
 
2568
				u8 video_index)
-
 
2569
{
-
 
2570
	struct drm_device *dev = connector->dev;
-
 
2571
	struct drm_display_mode *newmode;
-
 
2572
	u8 cea_mode;
-
 
2573
 
-
 
2574
	if (video_db == NULL || video_index >= video_len)
-
 
2575
		return NULL;
-
 
2576
 
-
 
2577
	/* CEA modes are numbered 1..127 */
-
 
2578
	cea_mode = (video_db[video_index] & 127) - 1;
-
 
2579
	if (cea_mode >= ARRAY_SIZE(edid_cea_modes))
-
 
2580
		return NULL;
-
 
2581
 
-
 
2582
	newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
-
 
2583
	newmode->vrefresh = 0;
-
 
2584
 
-
 
2585
	return newmode;
2534
}
2586
}
2535
 
2587
 
2536
static int
2588
static int
-
 
2589
do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
-
 
2590
{
-
 
2591
	int i, modes = 0;
-
 
2592
 
-
 
2593
	for (i = 0; i < len; i++) {
-
 
2594
		struct drm_display_mode *mode;
-
 
2595
		mode = drm_display_mode_from_vic_index(connector, db, len, i);
-
 
2596
		if (mode) {
-
 
2597
			drm_mode_probed_add(connector, mode);
-
 
2598
			modes++;
-
 
2599
		}
-
 
2600
	}
-
 
2601
 
-
 
2602
	return modes;
-
 
2603
}
-
 
2604
 
-
 
2605
struct stereo_mandatory_mode {
-
 
2606
	int width, height, vrefresh;
-
 
2607
	unsigned int flags;
-
 
2608
};
-
 
2609
 
-
 
2610
static const struct stereo_mandatory_mode stereo_mandatory_modes[] = {
-
 
2611
	{ 1920, 1080, 24, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
-
 
2612
	{ 1920, 1080, 24, DRM_MODE_FLAG_3D_FRAME_PACKING },
-
 
2613
	{ 1920, 1080, 50,
-
 
2614
	  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
-
 
2615
	{ 1920, 1080, 60,
-
 
2616
	  DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF },
-
 
2617
	{ 1280, 720,  50, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
-
 
2618
	{ 1280, 720,  50, DRM_MODE_FLAG_3D_FRAME_PACKING },
-
 
2619
	{ 1280, 720,  60, DRM_MODE_FLAG_3D_TOP_AND_BOTTOM },
-
 
2620
	{ 1280, 720,  60, DRM_MODE_FLAG_3D_FRAME_PACKING }
-
 
2621
};
-
 
2622
 
-
 
2623
static bool
-
 
2624
stereo_match_mandatory(const struct drm_display_mode *mode,
-
 
2625
		       const struct stereo_mandatory_mode *stereo_mode)
-
 
2626
{
-
 
2627
	unsigned int interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
-
 
2628
 
-
 
2629
	return mode->hdisplay == stereo_mode->width &&
-
 
2630
	       mode->vdisplay == stereo_mode->height &&
-
 
2631
	       interlaced == (stereo_mode->flags & DRM_MODE_FLAG_INTERLACE) &&
-
 
2632
	       drm_mode_vrefresh(mode) == stereo_mode->vrefresh;
-
 
2633
}
-
 
2634
 
2537
do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
2635
static int add_hdmi_mandatory_stereo_modes(struct drm_connector *connector)
2538
{
2636
{
2539
	struct drm_device *dev = connector->dev;
2637
	struct drm_device *dev = connector->dev;
2540
	const u8 *mode;
2638
	const struct drm_display_mode *mode;
-
 
2639
	struct list_head stereo_modes;
-
 
2640
	int modes = 0, i;
-
 
2641
 
-
 
2642
	INIT_LIST_HEAD(&stereo_modes);
-
 
2643
 
-
 
2644
	list_for_each_entry(mode, &connector->probed_modes, head) {
-
 
2645
		for (i = 0; i < ARRAY_SIZE(stereo_mandatory_modes); i++) {
-
 
2646
			const struct stereo_mandatory_mode *mandatory;
-
 
2647
			struct drm_display_mode *new_mode;
-
 
2648
 
-
 
2649
			if (!stereo_match_mandatory(mode,
-
 
2650
						    &stereo_mandatory_modes[i]))
-
 
2651
				continue;
-
 
2652
 
-
 
2653
			mandatory = &stereo_mandatory_modes[i];
-
 
2654
			new_mode = drm_mode_duplicate(dev, mode);
-
 
2655
			if (!new_mode)
-
 
2656
				continue;
-
 
2657
 
-
 
2658
			new_mode->flags |= mandatory->flags;
-
 
2659
			list_add_tail(&new_mode->head, &stereo_modes);
-
 
2660
			modes++;
Line 2541... Line 2661...
2541
	u8 cea_mode;
2661
		}
-
 
2662
	}
-
 
2663
 
-
 
2664
	list_splice_tail(&stereo_modes, &connector->probed_modes);
-
 
2665
 
2542
	int modes = 0;
2666
	return modes;
-
 
2667
}
2543
 
2668
 
2544
	for (mode = db; mode < db + len; mode++) {
2669
static int add_hdmi_mode(struct drm_connector *connector, u8 vic)
-
 
2670
{
-
 
2671
	struct drm_device *dev = connector->dev;
-
 
2672
	struct drm_display_mode *newmode;
-
 
2673
 
-
 
2674
	vic--; /* VICs start at 1 */
-
 
2675
	if (vic >= ARRAY_SIZE(edid_4k_modes)) {
-
 
2676
		DRM_ERROR("Unknown HDMI VIC: %d\n", vic);
2545
		cea_mode = (*mode & 127) - 1; /* CEA modes are numbered 1..127 */
2677
		return 0;
-
 
2678
	}
-
 
2679
 
-
 
2680
	newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
-
 
2681
	if (!newmode)
-
 
2682
		return 0;
-
 
2683
 
-
 
2684
	drm_mode_probed_add(connector, newmode);
-
 
2685
 
-
 
2686
	return 1;
-
 
2687
}
-
 
2688
 
2546
		if (cea_mode < ARRAY_SIZE(edid_cea_modes)) {
2689
static int add_3d_struct_modes(struct drm_connector *connector, u16 structure,
-
 
2690
			       const u8 *video_db, u8 video_len, u8 video_index)
-
 
2691
{
-
 
2692
	struct drm_display_mode *newmode;
-
 
2693
	int modes = 0;
-
 
2694
 
-
 
2695
	if (structure & (1 << 0)) {
2547
			struct drm_display_mode *newmode;
2696
		newmode = drm_display_mode_from_vic_index(connector, video_db,
-
 
2697
							  video_len,
-
 
2698
							  video_index);
2548
			newmode = drm_mode_duplicate(dev,
2699
			if (newmode) {
-
 
2700
			newmode->flags |= DRM_MODE_FLAG_3D_FRAME_PACKING;
-
 
2701
				drm_mode_probed_add(connector, newmode);
-
 
2702
				modes++;
-
 
2703
			}
-
 
2704
		}
-
 
2705
	if (structure & (1 << 6)) {
-
 
2706
		newmode = drm_display_mode_from_vic_index(connector, video_db,
-
 
2707
							  video_len,
2549
						     &edid_cea_modes[cea_mode]);
2708
							  video_index);
2550
			if (newmode) {
2709
			if (newmode) {
2551
				newmode->vrefresh = 0;
2710
			newmode->flags |= DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
2552
				drm_mode_probed_add(connector, newmode);
2711
				drm_mode_probed_add(connector, newmode);
-
 
2712
				modes++;
-
 
2713
			}
-
 
2714
		}
-
 
2715
	if (structure & (1 << 8)) {
-
 
2716
		newmode = drm_display_mode_from_vic_index(connector, video_db,
-
 
2717
							  video_len,
-
 
2718
							  video_index);
-
 
2719
		if (newmode) {
-
 
2720
			newmode->flags |= DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
2553
				modes++;
2721
			drm_mode_probed_add(connector, newmode);
Line 2554... Line 2722...
2554
			}
2722
			modes++;
2555
		}
2723
		}
Line 2562... Line 2730...
2562
 * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
2730
 * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
2563
 * @connector: connector corresponding to the HDMI sink
2731
 * @connector: connector corresponding to the HDMI sink
2564
 * @db: start of the CEA vendor specific block
2732
 * @db: start of the CEA vendor specific block
2565
 * @len: length of the CEA block payload, ie. one can access up to db[len]
2733
 * @len: length of the CEA block payload, ie. one can access up to db[len]
2566
 *
2734
 *
2567
 * Parses the HDMI VSDB looking for modes to add to @connector.
2735
 * Parses the HDMI VSDB looking for modes to add to @connector. This function
-
 
2736
 * also adds the stereo 3d modes when applicable.
2568
 */
2737
 */
2569
static int
2738
static int
2570
do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
2739
do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len,
-
 
2740
		   const u8 *video_db, u8 video_len)
2571
{
2741
{
2572
	struct drm_device *dev = connector->dev;
2742
	int modes = 0, offset = 0, i, multi_present = 0, multi_len;
2573
	int modes = 0, offset = 0, i;
2743
	u8 vic_len, hdmi_3d_len = 0;
2574
	u8 vic_len;
2744
	u16 mask;
-
 
2745
	u16 structure_all;
Line 2575... Line 2746...
2575
 
2746
 
2576
	if (len < 8)
2747
	if (len < 8)
Line 2577... Line 2748...
2577
		goto out;
2748
		goto out;
Line 2588... Line 2759...
2588
	if (db[8] & (1 << 6))
2759
	if (db[8] & (1 << 6))
2589
		offset += 2;
2760
		offset += 2;
Line 2590... Line 2761...
2590
 
2761
 
2591
	/* the declared length is not long enough for the 2 first bytes
2762
	/* the declared length is not long enough for the 2 first bytes
2592
	 * of additional video format capabilities */
-
 
2593
	offset += 2;
2763
	 * of additional video format capabilities */
2594
	if (len < (8 + offset))
2764
	if (len < (8 + offset + 2))
Line -... Line 2765...
-
 
2765
		goto out;
-
 
2766
 
-
 
2767
	/* 3D_Present */
-
 
2768
	offset++;
-
 
2769
	if (db[8 + offset] & (1 << 7)) {
-
 
2770
		modes += add_hdmi_mandatory_stereo_modes(connector);
-
 
2771
 
-
 
2772
		/* 3D_Multi_present */
-
 
2773
		multi_present = (db[8 + offset] & 0x60) >> 5;
-
 
2774
	}
2595
		goto out;
2775
 
-
 
2776
	offset++;
Line 2596... Line 2777...
2596
 
2777
	vic_len = db[8 + offset] >> 5;
2597
	vic_len = db[8 + offset] >> 5;
-
 
2598
 
2778
	hdmi_3d_len = db[8 + offset] & 0x1f;
Line 2599... Line 2779...
2599
	for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
2779
 
-
 
2780
	for (i = 0; i < vic_len && len >= (9 + offset + i); i++) {
-
 
2781
		u8 vic;
-
 
2782
 
Line 2600... Line 2783...
2600
		struct drm_display_mode *newmode;
2783
		vic = db[9 + offset + i];
-
 
2784
		modes += add_hdmi_mode(connector, vic);
-
 
2785
	}
-
 
2786
	offset += 1 + vic_len;
-
 
2787
 
-
 
2788
	if (multi_present == 1)
-
 
2789
		multi_len = 2;
2601
		u8 vic;
2790
	else if (multi_present == 2)
-
 
2791
		multi_len = 4;
-
 
2792
	else
2602
 
2793
		multi_len = 0;
2603
		vic = db[9 + offset + i];
2794
 
-
 
2795
	if (len < (8 + offset + hdmi_3d_len - 1))
-
 
2796
		goto out;
-
 
2797
 
-
 
2798
	if (hdmi_3d_len < multi_len)
-
 
2799
		goto out;
-
 
2800
 
-
 
2801
	if (multi_present == 1 || multi_present == 2) {
-
 
2802
		/* 3D_Structure_ALL */
-
 
2803
		structure_all = (db[8 + offset] << 8) | db[9 + offset];
-
 
2804
 
-
 
2805
		/* check if 3D_MASK is present */
-
 
2806
		if (multi_present == 2)
-
 
2807
			mask = (db[10 + offset] << 8) | db[11 + offset];
-
 
2808
		else
-
 
2809
			mask = 0xffff;
-
 
2810
 
-
 
2811
		for (i = 0; i < 16; i++) {
-
 
2812
			if (mask & (1 << i))
2604
 
2813
				modes += add_3d_struct_modes(connector,
Line -... Line 2814...
-
 
2814
						structure_all,
-
 
2815
						video_db,
2605
		vic--; /* VICs start at 1 */
2816
						video_len, i);
2606
		if (vic >= ARRAY_SIZE(edid_4k_modes)) {
2817
		}
-
 
2818
	}
-
 
2819
 
-
 
2820
	offset += multi_len;
-
 
2821
 
-
 
2822
	for (i = 0; i < (hdmi_3d_len - multi_len); i++) {
-
 
2823
		int vic_index;
-
 
2824
		struct drm_display_mode *newmode = NULL;
-
 
2825
		unsigned int newflag = 0;
-
 
2826
		bool detail_present;
-
 
2827
 
-
 
2828
		detail_present = ((db[8 + offset + i] & 0x0f) > 7);
-
 
2829
 
-
 
2830
		if (detail_present && (i + 1 == hdmi_3d_len - multi_len))
-
 
2831
			break;
-
 
2832
 
-
 
2833
		/* 2D_VIC_order_X */
-
 
2834
		vic_index = db[8 + offset + i] >> 4;
-
 
2835
 
-
 
2836
		/* 3D_Structure_X */
-
 
2837
		switch (db[8 + offset + i] & 0x0f) {
-
 
2838
		case 0:
-
 
2839
			newflag = DRM_MODE_FLAG_3D_FRAME_PACKING;
-
 
2840
			break;
-
 
2841
		case 6:
2607
			DRM_ERROR("Unknown HDMI VIC: %d\n", vic);
2842
			newflag = DRM_MODE_FLAG_3D_TOP_AND_BOTTOM;
-
 
2843
			break;
Line -... Line 2844...
-
 
2844
		case 8:
-
 
2845
			/* 3D_Detail_X */
-
 
2846
			if ((db[9 + offset + i] >> 4) == 1)
-
 
2847
				newflag = DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF;
-
 
2848
			break;
-
 
2849
		}
-
 
2850
 
-
 
2851
		if (newflag != 0) {
2608
			continue;
2852
			newmode = drm_display_mode_from_vic_index(connector,
2609
		}
2853
								  video_db,
2610
 
2854
								  video_len,
-
 
2855
								  vic_index);
-
 
2856
 
-
 
2857
			if (newmode) {
-
 
2858
				newmode->flags |= newflag;
-
 
2859
		drm_mode_probed_add(connector, newmode);
Line 2611... Line 2860...
2611
		newmode = drm_mode_duplicate(dev, &edid_4k_modes[vic]);
2860
		modes++;
2612
		if (!newmode)
2861
	}
2613
			continue;
2862
		}
Line 2671... Line 2920...
2671
 
2920
 
2672
static int
2921
static int
2673
add_cea_modes(struct drm_connector *connector, struct edid *edid)
2922
add_cea_modes(struct drm_connector *connector, struct edid *edid)
2674
{
2923
{
2675
	const u8 *cea = drm_find_cea_extension(edid);
2924
	const u8 *cea = drm_find_cea_extension(edid);
2676
	const u8 *db;
2925
	const u8 *db, *hdmi = NULL, *video = NULL;
2677
	u8 dbl;
2926
	u8 dbl, hdmi_len, video_len = 0;
Line 2678... Line 2927...
2678
	int modes = 0;
2927
	int modes = 0;
2679
 
2928
 
Line 2685... Line 2934...
2685
 
2934
 
2686
		for_each_cea_db(cea, i, start, end) {
2935
		for_each_cea_db(cea, i, start, end) {
2687
			db = &cea[i];
2936
			db = &cea[i];
Line 2688... Line 2937...
2688
			dbl = cea_db_payload_len(db);
2937
			dbl = cea_db_payload_len(db);
-
 
2938
 
-
 
2939
			if (cea_db_tag(db) == VIDEO_BLOCK) {
2689
 
2940
				video = db + 1;
-
 
2941
				video_len = dbl;
2690
			if (cea_db_tag(db) == VIDEO_BLOCK)
2942
				modes += do_cea_modes(connector, video, dbl);
-
 
2943
			}
2691
				modes += do_cea_modes(connector, db + 1, dbl);
2944
			else if (cea_db_is_hdmi_vsdb(db)) {
-
 
2945
				hdmi = db;
2692
			else if (cea_db_is_hdmi_vsdb(db))
2946
				hdmi_len = dbl;
2693
				modes += do_hdmi_vsdb_modes(connector, db, dbl);
2947
		}
Line -... Line 2948...
-
 
2948
		}
-
 
2949
	}
-
 
2950
 
-
 
2951
	/*
-
 
2952
	 * We parse the HDMI VSDB after having added the cea modes as we will
-
 
2953
	 * be patching their flags when the sink supports stereo 3D.
-
 
2954
	 */
-
 
2955
	if (hdmi)
2694
		}
2956
		modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video,
2695
	}
2957
					    video_len);
Line 2696... Line 2958...
2696
 
2958
 
2697
	return modes;
2959
	return modes;
Line 3294... Line 3556...
3294
	}
3556
	}
3295
	return num_modes;
3557
	return num_modes;
3296
}
3558
}
3297
EXPORT_SYMBOL(drm_add_modes_noedid);
3559
EXPORT_SYMBOL(drm_add_modes_noedid);
Line -... Line 3560...
-
 
3560
 
-
 
3561
void drm_set_preferred_mode(struct drm_connector *connector,
-
 
3562
			   int hpref, int vpref)
-
 
3563
{
-
 
3564
	struct drm_display_mode *mode;
-
 
3565
 
-
 
3566
	list_for_each_entry(mode, &connector->probed_modes, head) {
-
 
3567
		if (drm_mode_width(mode)  == hpref &&
-
 
3568
		    drm_mode_height(mode) == vpref)
-
 
3569
			mode->type |= DRM_MODE_TYPE_PREFERRED;
-
 
3570
	}
-
 
3571
}
-
 
3572
EXPORT_SYMBOL(drm_set_preferred_mode);
3298
 
3573
 
3299
/**
3574
/**
3300
 * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
3575
 * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
3301
 *                                              data from a DRM display mode
3576
 *                                              data from a DRM display mode
3302
 * @frame: HDMI AVI infoframe
3577
 * @frame: HDMI AVI infoframe
Line 3327... Line 3602...
3327
 
3602
 
3328
	return 0;
3603
	return 0;
3329
}
3604
}
Line -... Line 3605...
-
 
3605
EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
-
 
3606
 
-
 
3607
static enum hdmi_3d_structure
-
 
3608
s3d_structure_from_display_mode(const struct drm_display_mode *mode)
-
 
3609
{
-
 
3610
	u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK;
-
 
3611
 
-
 
3612
	switch (layout) {
-
 
3613
	case DRM_MODE_FLAG_3D_FRAME_PACKING:
-
 
3614
		return HDMI_3D_STRUCTURE_FRAME_PACKING;
-
 
3615
	case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE:
-
 
3616
		return HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE;
-
 
3617
	case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE:
-
 
3618
		return HDMI_3D_STRUCTURE_LINE_ALTERNATIVE;
-
 
3619
	case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL:
-
 
3620
		return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL;
-
 
3621
	case DRM_MODE_FLAG_3D_L_DEPTH:
-
 
3622
		return HDMI_3D_STRUCTURE_L_DEPTH;
-
 
3623
	case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH:
-
 
3624
		return HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH;
-
 
3625
	case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM:
-
 
3626
		return HDMI_3D_STRUCTURE_TOP_AND_BOTTOM;
-
 
3627
	case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF:
-
 
3628
		return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF;
-
 
3629
	default:
-
 
3630
		return HDMI_3D_STRUCTURE_INVALID;
-
 
3631
	}
3330
EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
3632
}
3331
 
3633
 
3332
/**
3634
/**
3333
 * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
3635
 * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
3334
 * data from a DRM display mode
3636
 * data from a DRM display mode
Line 3344... Line 3646...
3344
int
3646
int
3345
drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
3647
drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
3346
					    const struct drm_display_mode *mode)
3648
					    const struct drm_display_mode *mode)
3347
{
3649
{
3348
	int err;
3650
	int err;
-
 
3651
	u32 s3d_flags;
3349
	u8 vic;
3652
	u8 vic;
Line 3350... Line 3653...
3350
 
3653
 
3351
	if (!frame || !mode)
3654
	if (!frame || !mode)
Line 3352... Line 3655...
3352
		return -EINVAL;
3655
		return -EINVAL;
-
 
3656
 
-
 
3657
	vic = drm_match_hdmi_mode(mode);
3353
 
3658
	s3d_flags = mode->flags & DRM_MODE_FLAG_3D_MASK;
-
 
3659
 
-
 
3660
	if (!vic && !s3d_flags)
-
 
3661
		return -EINVAL;
3354
	vic = drm_match_hdmi_mode(mode);
3662
 
Line 3355... Line 3663...
3355
	if (!vic)
3663
	if (vic && s3d_flags)
3356
		return -EINVAL;
3664
		return -EINVAL;
3357
 
3665
 
Line -... Line 3666...
-
 
3666
	err = hdmi_vendor_infoframe_init(frame);
3358
	err = hdmi_vendor_infoframe_init(frame);
3667
	if (err < 0)
-
 
3668
		return err;
-
 
3669
 
Line 3359... Line 3670...
3359
	if (err < 0)
3670
	if (vic)
3360
		return err;
3671
	frame->vic = vic;
3361
 
3672
	else