.. | .. |
---|
27 | 27 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
---|
28 | 28 | * DEALINGS IN THE SOFTWARE. |
---|
29 | 29 | */ |
---|
30 | | -#include <linux/kernel.h> |
---|
31 | | -#include <linux/slab.h> |
---|
| 30 | + |
---|
32 | 31 | #include <linux/hdmi.h> |
---|
33 | 32 | #include <linux/i2c.h> |
---|
| 33 | +#include <linux/kernel.h> |
---|
34 | 34 | #include <linux/module.h> |
---|
| 35 | +#include <linux/slab.h> |
---|
35 | 36 | #include <linux/vga_switcheroo.h> |
---|
36 | | -#include <drm/drmP.h> |
---|
| 37 | + |
---|
| 38 | +#include <drm/drm_displayid.h> |
---|
| 39 | +#include <drm/drm_drv.h> |
---|
37 | 40 | #include <drm/drm_edid.h> |
---|
38 | 41 | #include <drm/drm_encoder.h> |
---|
39 | | -#include <drm/drm_displayid.h> |
---|
| 42 | +#include <drm/drm_print.h> |
---|
40 | 43 | #include <drm/drm_scdc_helper.h> |
---|
41 | 44 | |
---|
42 | 45 | #include "drm_crtc_internal.h" |
---|
.. | .. |
---|
68 | 71 | * maximum size and use that. |
---|
69 | 72 | */ |
---|
70 | 73 | #define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE (1 << 4) |
---|
71 | | -/* Monitor forgot to set the first detailed is preferred bit. */ |
---|
72 | | -#define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) |
---|
73 | 74 | /* use +hsync +vsync for detailed mode */ |
---|
74 | 75 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) |
---|
75 | 76 | /* Force reduced-blanking timings for detailed modes */ |
---|
.. | .. |
---|
98 | 99 | #define LEVEL_GTF2 2 |
---|
99 | 100 | #define LEVEL_CVT 3 |
---|
100 | 101 | |
---|
101 | | -/*Enum storing luminance types for HDR blocks in EDID*/ |
---|
102 | | -enum luminance_value { |
---|
103 | | - NO_LUMINANCE_DATA = 3, |
---|
104 | | - MAXIMUM_LUMINANCE = 4, |
---|
105 | | - FRAME_AVERAGE_LUMINANCE = 5, |
---|
106 | | - MINIMUM_LUMINANCE = 6 |
---|
107 | | -}; |
---|
108 | | - |
---|
109 | 102 | static const struct edid_quirk { |
---|
110 | 103 | char vendor[4]; |
---|
111 | 104 | int product_id; |
---|
.. | .. |
---|
115 | 108 | { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, |
---|
116 | 109 | /* Acer F51 */ |
---|
117 | 110 | { "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 }, |
---|
118 | | - /* Unknown Acer */ |
---|
119 | | - { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
---|
120 | 111 | |
---|
121 | 112 | /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ |
---|
122 | 113 | { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, |
---|
.. | .. |
---|
152 | 143 | /* LG Philips LCD LP154W01-A5 */ |
---|
153 | 144 | { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, |
---|
154 | 145 | { "LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, |
---|
155 | | - |
---|
156 | | - /* Philips 107p5 CRT */ |
---|
157 | | - { "PHL", 57364, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
---|
158 | | - |
---|
159 | | - /* Proview AY765C */ |
---|
160 | | - { "PTS", 765, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
---|
161 | 146 | |
---|
162 | 147 | /* Samsung SyncMaster 205BW. Note: irony */ |
---|
163 | 148 | { "SAM", 541, EDID_QUIRK_DETAILED_SYNC_PP }, |
---|
.. | .. |
---|
730 | 715 | * |
---|
731 | 716 | * Do not access directly, instead always use cea_mode_for_vic(). |
---|
732 | 717 | */ |
---|
733 | | -static const struct drm_display_mode edid_cea_modes_0[] = { |
---|
734 | | - /* 0 - dummy, VICs start at 1 */ |
---|
735 | | - { }, |
---|
| 718 | +static const struct drm_display_mode edid_cea_modes_1[] = { |
---|
736 | 719 | /* 1 - 640x480@60Hz 4:3 */ |
---|
737 | 720 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, |
---|
738 | 721 | 752, 800, 0, 480, 490, 492, 525, 0, |
---|
739 | 722 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
740 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 723 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
741 | 724 | /* 2 - 720x480@60Hz 4:3 */ |
---|
742 | 725 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736, |
---|
743 | 726 | 798, 858, 0, 480, 489, 495, 525, 0, |
---|
744 | 727 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
745 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 728 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
746 | 729 | /* 3 - 720x480@60Hz 16:9 */ |
---|
747 | 730 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736, |
---|
748 | 731 | 798, 858, 0, 480, 489, 495, 525, 0, |
---|
749 | 732 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
750 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 733 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
751 | 734 | /* 4 - 1280x720@60Hz 16:9 */ |
---|
752 | 735 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390, |
---|
753 | 736 | 1430, 1650, 0, 720, 725, 730, 750, 0, |
---|
754 | 737 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
755 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 738 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
756 | 739 | /* 5 - 1920x1080i@60Hz 16:9 */ |
---|
757 | 740 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008, |
---|
758 | 741 | 2052, 2200, 0, 1080, 1084, 1094, 1125, 0, |
---|
759 | 742 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | |
---|
760 | 743 | DRM_MODE_FLAG_INTERLACE), |
---|
761 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 744 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
762 | 745 | /* 6 - 720(1440)x480i@60Hz 4:3 */ |
---|
763 | 746 | { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739, |
---|
764 | 747 | 801, 858, 0, 480, 488, 494, 525, 0, |
---|
765 | 748 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
766 | 749 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
767 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 750 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
768 | 751 | /* 7 - 720(1440)x480i@60Hz 16:9 */ |
---|
769 | 752 | { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739, |
---|
770 | 753 | 801, 858, 0, 480, 488, 494, 525, 0, |
---|
771 | 754 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
772 | 755 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
773 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 756 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
774 | 757 | /* 8 - 720(1440)x240@60Hz 4:3 */ |
---|
775 | 758 | { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739, |
---|
776 | 759 | 801, 858, 0, 240, 244, 247, 262, 0, |
---|
777 | 760 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
778 | 761 | DRM_MODE_FLAG_DBLCLK), |
---|
779 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 762 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
780 | 763 | /* 9 - 720(1440)x240@60Hz 16:9 */ |
---|
781 | 764 | { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739, |
---|
782 | 765 | 801, 858, 0, 240, 244, 247, 262, 0, |
---|
783 | 766 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
784 | 767 | DRM_MODE_FLAG_DBLCLK), |
---|
785 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 768 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
786 | 769 | /* 10 - 2880x480i@60Hz 4:3 */ |
---|
787 | 770 | { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, |
---|
788 | 771 | 3204, 3432, 0, 480, 488, 494, 525, 0, |
---|
789 | 772 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
790 | 773 | DRM_MODE_FLAG_INTERLACE), |
---|
791 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 774 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
792 | 775 | /* 11 - 2880x480i@60Hz 16:9 */ |
---|
793 | 776 | { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, |
---|
794 | 777 | 3204, 3432, 0, 480, 488, 494, 525, 0, |
---|
795 | 778 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
796 | 779 | DRM_MODE_FLAG_INTERLACE), |
---|
797 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 780 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
798 | 781 | /* 12 - 2880x240@60Hz 4:3 */ |
---|
799 | 782 | { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, |
---|
800 | 783 | 3204, 3432, 0, 240, 244, 247, 262, 0, |
---|
801 | 784 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
802 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 785 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
803 | 786 | /* 13 - 2880x240@60Hz 16:9 */ |
---|
804 | 787 | { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956, |
---|
805 | 788 | 3204, 3432, 0, 240, 244, 247, 262, 0, |
---|
806 | 789 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
807 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 790 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
808 | 791 | /* 14 - 1440x480@60Hz 4:3 */ |
---|
809 | 792 | { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472, |
---|
810 | 793 | 1596, 1716, 0, 480, 489, 495, 525, 0, |
---|
811 | 794 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
812 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 795 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
813 | 796 | /* 15 - 1440x480@60Hz 16:9 */ |
---|
814 | 797 | { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472, |
---|
815 | 798 | 1596, 1716, 0, 480, 489, 495, 525, 0, |
---|
816 | 799 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
817 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 800 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
818 | 801 | /* 16 - 1920x1080@60Hz 16:9 */ |
---|
819 | 802 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008, |
---|
820 | 803 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, |
---|
821 | 804 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
822 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 805 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
823 | 806 | /* 17 - 720x576@50Hz 4:3 */ |
---|
824 | 807 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, |
---|
825 | 808 | 796, 864, 0, 576, 581, 586, 625, 0, |
---|
826 | 809 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
827 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 810 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
828 | 811 | /* 18 - 720x576@50Hz 16:9 */ |
---|
829 | 812 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, |
---|
830 | 813 | 796, 864, 0, 576, 581, 586, 625, 0, |
---|
831 | 814 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
832 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 815 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
833 | 816 | /* 19 - 1280x720@50Hz 16:9 */ |
---|
834 | 817 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720, |
---|
835 | 818 | 1760, 1980, 0, 720, 725, 730, 750, 0, |
---|
836 | 819 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
837 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 820 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
838 | 821 | /* 20 - 1920x1080i@50Hz 16:9 */ |
---|
839 | 822 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448, |
---|
840 | 823 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, |
---|
841 | 824 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | |
---|
842 | 825 | DRM_MODE_FLAG_INTERLACE), |
---|
843 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 826 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
844 | 827 | /* 21 - 720(1440)x576i@50Hz 4:3 */ |
---|
845 | 828 | { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732, |
---|
846 | 829 | 795, 864, 0, 576, 580, 586, 625, 0, |
---|
847 | 830 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
848 | 831 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
849 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 832 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
850 | 833 | /* 22 - 720(1440)x576i@50Hz 16:9 */ |
---|
851 | 834 | { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732, |
---|
852 | 835 | 795, 864, 0, 576, 580, 586, 625, 0, |
---|
853 | 836 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
854 | 837 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
855 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 838 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
856 | 839 | /* 23 - 720(1440)x288@50Hz 4:3 */ |
---|
857 | 840 | { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732, |
---|
858 | 841 | 795, 864, 0, 288, 290, 293, 312, 0, |
---|
859 | 842 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
860 | 843 | DRM_MODE_FLAG_DBLCLK), |
---|
861 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 844 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
862 | 845 | /* 24 - 720(1440)x288@50Hz 16:9 */ |
---|
863 | 846 | { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732, |
---|
864 | 847 | 795, 864, 0, 288, 290, 293, 312, 0, |
---|
865 | 848 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
866 | 849 | DRM_MODE_FLAG_DBLCLK), |
---|
867 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 850 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
868 | 851 | /* 25 - 2880x576i@50Hz 4:3 */ |
---|
869 | 852 | { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, |
---|
870 | 853 | 3180, 3456, 0, 576, 580, 586, 625, 0, |
---|
871 | 854 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
872 | 855 | DRM_MODE_FLAG_INTERLACE), |
---|
873 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 856 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
874 | 857 | /* 26 - 2880x576i@50Hz 16:9 */ |
---|
875 | 858 | { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, |
---|
876 | 859 | 3180, 3456, 0, 576, 580, 586, 625, 0, |
---|
877 | 860 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
878 | 861 | DRM_MODE_FLAG_INTERLACE), |
---|
879 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 862 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
880 | 863 | /* 27 - 2880x288@50Hz 4:3 */ |
---|
881 | 864 | { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, |
---|
882 | 865 | 3180, 3456, 0, 288, 290, 293, 312, 0, |
---|
883 | 866 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
884 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 867 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
885 | 868 | /* 28 - 2880x288@50Hz 16:9 */ |
---|
886 | 869 | { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928, |
---|
887 | 870 | 3180, 3456, 0, 288, 290, 293, 312, 0, |
---|
888 | 871 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
889 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 872 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
890 | 873 | /* 29 - 1440x576@50Hz 4:3 */ |
---|
891 | 874 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, |
---|
892 | 875 | 1592, 1728, 0, 576, 581, 586, 625, 0, |
---|
893 | 876 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
894 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 877 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
895 | 878 | /* 30 - 1440x576@50Hz 16:9 */ |
---|
896 | 879 | { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464, |
---|
897 | 880 | 1592, 1728, 0, 576, 581, 586, 625, 0, |
---|
898 | 881 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
899 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 882 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
900 | 883 | /* 31 - 1920x1080@50Hz 16:9 */ |
---|
901 | 884 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448, |
---|
902 | 885 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, |
---|
903 | 886 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
904 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 887 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
905 | 888 | /* 32 - 1920x1080@24Hz 16:9 */ |
---|
906 | 889 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558, |
---|
907 | 890 | 2602, 2750, 0, 1080, 1084, 1089, 1125, 0, |
---|
908 | 891 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
909 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 892 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
910 | 893 | /* 33 - 1920x1080@25Hz 16:9 */ |
---|
911 | 894 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448, |
---|
912 | 895 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, |
---|
913 | 896 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
914 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 897 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
915 | 898 | /* 34 - 1920x1080@30Hz 16:9 */ |
---|
916 | 899 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008, |
---|
917 | 900 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, |
---|
918 | 901 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
919 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 902 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
920 | 903 | /* 35 - 2880x480@60Hz 4:3 */ |
---|
921 | 904 | { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944, |
---|
922 | 905 | 3192, 3432, 0, 480, 489, 495, 525, 0, |
---|
923 | 906 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
924 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 907 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
925 | 908 | /* 36 - 2880x480@60Hz 16:9 */ |
---|
926 | 909 | { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944, |
---|
927 | 910 | 3192, 3432, 0, 480, 489, 495, 525, 0, |
---|
928 | 911 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
929 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 912 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
930 | 913 | /* 37 - 2880x576@50Hz 4:3 */ |
---|
931 | 914 | { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928, |
---|
932 | 915 | 3184, 3456, 0, 576, 581, 586, 625, 0, |
---|
933 | 916 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
934 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 917 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
935 | 918 | /* 38 - 2880x576@50Hz 16:9 */ |
---|
936 | 919 | { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928, |
---|
937 | 920 | 3184, 3456, 0, 576, 581, 586, 625, 0, |
---|
938 | 921 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
939 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 922 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
940 | 923 | /* 39 - 1920x1080i@50Hz 16:9 */ |
---|
941 | 924 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952, |
---|
942 | 925 | 2120, 2304, 0, 1080, 1126, 1136, 1250, 0, |
---|
943 | 926 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
944 | 927 | DRM_MODE_FLAG_INTERLACE), |
---|
945 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 928 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
946 | 929 | /* 40 - 1920x1080i@100Hz 16:9 */ |
---|
947 | 930 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448, |
---|
948 | 931 | 2492, 2640, 0, 1080, 1084, 1094, 1125, 0, |
---|
949 | 932 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | |
---|
950 | 933 | DRM_MODE_FLAG_INTERLACE), |
---|
951 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 934 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
952 | 935 | /* 41 - 1280x720@100Hz 16:9 */ |
---|
953 | 936 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720, |
---|
954 | 937 | 1760, 1980, 0, 720, 725, 730, 750, 0, |
---|
955 | 938 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
956 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 939 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
957 | 940 | /* 42 - 720x576@100Hz 4:3 */ |
---|
958 | 941 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, |
---|
959 | 942 | 796, 864, 0, 576, 581, 586, 625, 0, |
---|
960 | 943 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
961 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 944 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
962 | 945 | /* 43 - 720x576@100Hz 16:9 */ |
---|
963 | 946 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, |
---|
964 | 947 | 796, 864, 0, 576, 581, 586, 625, 0, |
---|
965 | 948 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
966 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 949 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
967 | 950 | /* 44 - 720(1440)x576i@100Hz 4:3 */ |
---|
968 | 951 | { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, |
---|
969 | 952 | 795, 864, 0, 576, 580, 586, 625, 0, |
---|
970 | 953 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
971 | 954 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
972 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 955 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
973 | 956 | /* 45 - 720(1440)x576i@100Hz 16:9 */ |
---|
974 | 957 | { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732, |
---|
975 | 958 | 795, 864, 0, 576, 580, 586, 625, 0, |
---|
976 | 959 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
977 | 960 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
978 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 961 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
979 | 962 | /* 46 - 1920x1080i@120Hz 16:9 */ |
---|
980 | 963 | { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008, |
---|
981 | 964 | 2052, 2200, 0, 1080, 1084, 1094, 1125, 0, |
---|
982 | 965 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | |
---|
983 | 966 | DRM_MODE_FLAG_INTERLACE), |
---|
984 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 967 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
985 | 968 | /* 47 - 1280x720@120Hz 16:9 */ |
---|
986 | 969 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390, |
---|
987 | 970 | 1430, 1650, 0, 720, 725, 730, 750, 0, |
---|
988 | 971 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
989 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 972 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
990 | 973 | /* 48 - 720x480@120Hz 4:3 */ |
---|
991 | 974 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736, |
---|
992 | 975 | 798, 858, 0, 480, 489, 495, 525, 0, |
---|
993 | 976 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
994 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 977 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
995 | 978 | /* 49 - 720x480@120Hz 16:9 */ |
---|
996 | 979 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736, |
---|
997 | 980 | 798, 858, 0, 480, 489, 495, 525, 0, |
---|
998 | 981 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
999 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 982 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1000 | 983 | /* 50 - 720(1440)x480i@120Hz 4:3 */ |
---|
1001 | 984 | { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739, |
---|
1002 | 985 | 801, 858, 0, 480, 488, 494, 525, 0, |
---|
1003 | 986 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
1004 | 987 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
1005 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 988 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
1006 | 989 | /* 51 - 720(1440)x480i@120Hz 16:9 */ |
---|
1007 | 990 | { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739, |
---|
1008 | 991 | 801, 858, 0, 480, 488, 494, 525, 0, |
---|
1009 | 992 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
1010 | 993 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
1011 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 994 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1012 | 995 | /* 52 - 720x576@200Hz 4:3 */ |
---|
1013 | 996 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732, |
---|
1014 | 997 | 796, 864, 0, 576, 581, 586, 625, 0, |
---|
1015 | 998 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
1016 | | - .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 999 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
1017 | 1000 | /* 53 - 720x576@200Hz 16:9 */ |
---|
1018 | 1001 | { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732, |
---|
1019 | 1002 | 796, 864, 0, 576, 581, 586, 625, 0, |
---|
1020 | 1003 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
1021 | | - .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1004 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1022 | 1005 | /* 54 - 720(1440)x576i@200Hz 4:3 */ |
---|
1023 | 1006 | { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, |
---|
1024 | 1007 | 795, 864, 0, 576, 580, 586, 625, 0, |
---|
1025 | 1008 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
1026 | 1009 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
1027 | | - .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 1010 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
1028 | 1011 | /* 55 - 720(1440)x576i@200Hz 16:9 */ |
---|
1029 | 1012 | { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732, |
---|
1030 | 1013 | 795, 864, 0, 576, 580, 586, 625, 0, |
---|
1031 | 1014 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
1032 | 1015 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
1033 | | - .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1016 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1034 | 1017 | /* 56 - 720x480@240Hz 4:3 */ |
---|
1035 | 1018 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736, |
---|
1036 | 1019 | 798, 858, 0, 480, 489, 495, 525, 0, |
---|
1037 | 1020 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
1038 | | - .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 1021 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
1039 | 1022 | /* 57 - 720x480@240Hz 16:9 */ |
---|
1040 | 1023 | { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736, |
---|
1041 | 1024 | 798, 858, 0, 480, 489, 495, 525, 0, |
---|
1042 | 1025 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
---|
1043 | | - .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1026 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1044 | 1027 | /* 58 - 720(1440)x480i@240Hz 4:3 */ |
---|
1045 | 1028 | { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739, |
---|
1046 | 1029 | 801, 858, 0, 480, 488, 494, 525, 0, |
---|
1047 | 1030 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
1048 | 1031 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
1049 | | - .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
| 1032 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, }, |
---|
1050 | 1033 | /* 59 - 720(1440)x480i@240Hz 16:9 */ |
---|
1051 | 1034 | { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739, |
---|
1052 | 1035 | 801, 858, 0, 480, 488, 494, 525, 0, |
---|
1053 | 1036 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC | |
---|
1054 | 1037 | DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), |
---|
1055 | | - .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1038 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1056 | 1039 | /* 60 - 1280x720@24Hz 16:9 */ |
---|
1057 | 1040 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040, |
---|
1058 | 1041 | 3080, 3300, 0, 720, 725, 730, 750, 0, |
---|
1059 | 1042 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1060 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1043 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1061 | 1044 | /* 61 - 1280x720@25Hz 16:9 */ |
---|
1062 | 1045 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700, |
---|
1063 | 1046 | 3740, 3960, 0, 720, 725, 730, 750, 0, |
---|
1064 | 1047 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1065 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1048 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1066 | 1049 | /* 62 - 1280x720@30Hz 16:9 */ |
---|
1067 | 1050 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040, |
---|
1068 | 1051 | 3080, 3300, 0, 720, 725, 730, 750, 0, |
---|
1069 | 1052 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1070 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1053 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1071 | 1054 | /* 63 - 1920x1080@120Hz 16:9 */ |
---|
1072 | 1055 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008, |
---|
1073 | 1056 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, |
---|
1074 | 1057 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1075 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1058 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1076 | 1059 | /* 64 - 1920x1080@100Hz 16:9 */ |
---|
1077 | 1060 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448, |
---|
1078 | 1061 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, |
---|
1079 | 1062 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1080 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1063 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1081 | 1064 | /* 65 - 1280x720@24Hz 64:27 */ |
---|
1082 | 1065 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040, |
---|
1083 | 1066 | 3080, 3300, 0, 720, 725, 730, 750, 0, |
---|
1084 | 1067 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1085 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1068 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1086 | 1069 | /* 66 - 1280x720@25Hz 64:27 */ |
---|
1087 | 1070 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700, |
---|
1088 | 1071 | 3740, 3960, 0, 720, 725, 730, 750, 0, |
---|
1089 | 1072 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1090 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1073 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1091 | 1074 | /* 67 - 1280x720@30Hz 64:27 */ |
---|
1092 | 1075 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040, |
---|
1093 | 1076 | 3080, 3300, 0, 720, 725, 730, 750, 0, |
---|
1094 | 1077 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1095 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1078 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1096 | 1079 | /* 68 - 1280x720@50Hz 64:27 */ |
---|
1097 | 1080 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720, |
---|
1098 | 1081 | 1760, 1980, 0, 720, 725, 730, 750, 0, |
---|
1099 | 1082 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1100 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1083 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1101 | 1084 | /* 69 - 1280x720@60Hz 64:27 */ |
---|
1102 | 1085 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390, |
---|
1103 | 1086 | 1430, 1650, 0, 720, 725, 730, 750, 0, |
---|
1104 | 1087 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1105 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1088 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1106 | 1089 | /* 70 - 1280x720@100Hz 64:27 */ |
---|
1107 | 1090 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720, |
---|
1108 | 1091 | 1760, 1980, 0, 720, 725, 730, 750, 0, |
---|
1109 | 1092 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1110 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1093 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1111 | 1094 | /* 71 - 1280x720@120Hz 64:27 */ |
---|
1112 | 1095 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390, |
---|
1113 | 1096 | 1430, 1650, 0, 720, 725, 730, 750, 0, |
---|
1114 | 1097 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1115 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1098 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1116 | 1099 | /* 72 - 1920x1080@24Hz 64:27 */ |
---|
1117 | 1100 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558, |
---|
1118 | 1101 | 2602, 2750, 0, 1080, 1084, 1089, 1125, 0, |
---|
1119 | 1102 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1120 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1103 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1121 | 1104 | /* 73 - 1920x1080@25Hz 64:27 */ |
---|
1122 | 1105 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448, |
---|
1123 | 1106 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, |
---|
1124 | 1107 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1125 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1108 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1126 | 1109 | /* 74 - 1920x1080@30Hz 64:27 */ |
---|
1127 | 1110 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008, |
---|
1128 | 1111 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, |
---|
1129 | 1112 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1130 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1113 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1131 | 1114 | /* 75 - 1920x1080@50Hz 64:27 */ |
---|
1132 | 1115 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448, |
---|
1133 | 1116 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, |
---|
1134 | 1117 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1135 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1118 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1136 | 1119 | /* 76 - 1920x1080@60Hz 64:27 */ |
---|
1137 | 1120 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008, |
---|
1138 | 1121 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, |
---|
1139 | 1122 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1140 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1123 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1141 | 1124 | /* 77 - 1920x1080@100Hz 64:27 */ |
---|
1142 | 1125 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448, |
---|
1143 | 1126 | 2492, 2640, 0, 1080, 1084, 1089, 1125, 0, |
---|
1144 | 1127 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1145 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1128 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1146 | 1129 | /* 78 - 1920x1080@120Hz 64:27 */ |
---|
1147 | 1130 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008, |
---|
1148 | 1131 | 2052, 2200, 0, 1080, 1084, 1089, 1125, 0, |
---|
1149 | 1132 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1150 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1133 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1151 | 1134 | /* 79 - 1680x720@24Hz 64:27 */ |
---|
1152 | 1135 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 3040, |
---|
1153 | 1136 | 3080, 3300, 0, 720, 725, 730, 750, 0, |
---|
1154 | 1137 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1155 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1138 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1156 | 1139 | /* 80 - 1680x720@25Hz 64:27 */ |
---|
1157 | 1140 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2908, |
---|
1158 | 1141 | 2948, 3168, 0, 720, 725, 730, 750, 0, |
---|
1159 | 1142 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1160 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1143 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1161 | 1144 | /* 81 - 1680x720@30Hz 64:27 */ |
---|
1162 | 1145 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 59400, 1680, 2380, |
---|
1163 | 1146 | 2420, 2640, 0, 720, 725, 730, 750, 0, |
---|
1164 | 1147 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1165 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1148 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1166 | 1149 | /* 82 - 1680x720@50Hz 64:27 */ |
---|
1167 | 1150 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 82500, 1680, 1940, |
---|
1168 | 1151 | 1980, 2200, 0, 720, 725, 730, 750, 0, |
---|
1169 | 1152 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1170 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1153 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1171 | 1154 | /* 83 - 1680x720@60Hz 64:27 */ |
---|
1172 | 1155 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 1940, |
---|
1173 | 1156 | 1980, 2200, 0, 720, 725, 730, 750, 0, |
---|
1174 | 1157 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1175 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1158 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1176 | 1159 | /* 84 - 1680x720@100Hz 64:27 */ |
---|
1177 | 1160 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 165000, 1680, 1740, |
---|
1178 | 1161 | 1780, 2000, 0, 720, 725, 730, 825, 0, |
---|
1179 | 1162 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1180 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1163 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1181 | 1164 | /* 85 - 1680x720@120Hz 64:27 */ |
---|
1182 | 1165 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 198000, 1680, 1740, |
---|
1183 | 1166 | 1780, 2000, 0, 720, 725, 730, 825, 0, |
---|
1184 | 1167 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1185 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1168 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1186 | 1169 | /* 86 - 2560x1080@24Hz 64:27 */ |
---|
1187 | 1170 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 99000, 2560, 3558, |
---|
1188 | 1171 | 3602, 3750, 0, 1080, 1084, 1089, 1100, 0, |
---|
1189 | 1172 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1190 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1173 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1191 | 1174 | /* 87 - 2560x1080@25Hz 64:27 */ |
---|
1192 | 1175 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 90000, 2560, 3008, |
---|
1193 | 1176 | 3052, 3200, 0, 1080, 1084, 1089, 1125, 0, |
---|
1194 | 1177 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1195 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1178 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1196 | 1179 | /* 88 - 2560x1080@30Hz 64:27 */ |
---|
1197 | 1180 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 118800, 2560, 3328, |
---|
1198 | 1181 | 3372, 3520, 0, 1080, 1084, 1089, 1125, 0, |
---|
1199 | 1182 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1200 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1183 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1201 | 1184 | /* 89 - 2560x1080@50Hz 64:27 */ |
---|
1202 | 1185 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 185625, 2560, 3108, |
---|
1203 | 1186 | 3152, 3300, 0, 1080, 1084, 1089, 1125, 0, |
---|
1204 | 1187 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1205 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1188 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1206 | 1189 | /* 90 - 2560x1080@60Hz 64:27 */ |
---|
1207 | 1190 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 2808, |
---|
1208 | 1191 | 2852, 3000, 0, 1080, 1084, 1089, 1100, 0, |
---|
1209 | 1192 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1210 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1193 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1211 | 1194 | /* 91 - 2560x1080@100Hz 64:27 */ |
---|
1212 | 1195 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 371250, 2560, 2778, |
---|
1213 | 1196 | 2822, 2970, 0, 1080, 1084, 1089, 1250, 0, |
---|
1214 | 1197 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1215 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1198 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1216 | 1199 | /* 92 - 2560x1080@120Hz 64:27 */ |
---|
1217 | 1200 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 495000, 2560, 3108, |
---|
1218 | 1201 | 3152, 3300, 0, 1080, 1084, 1089, 1250, 0, |
---|
1219 | 1202 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1220 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1203 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1221 | 1204 | /* 93 - 3840x2160@24Hz 16:9 */ |
---|
1222 | 1205 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116, |
---|
1223 | 1206 | 5204, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1224 | 1207 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1225 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1208 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1226 | 1209 | /* 94 - 3840x2160@25Hz 16:9 */ |
---|
1227 | 1210 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896, |
---|
1228 | 1211 | 4984, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1229 | 1212 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1230 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1213 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1231 | 1214 | /* 95 - 3840x2160@30Hz 16:9 */ |
---|
1232 | 1215 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016, |
---|
1233 | 1216 | 4104, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1234 | 1217 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1235 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1218 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1236 | 1219 | /* 96 - 3840x2160@50Hz 16:9 */ |
---|
1237 | 1220 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896, |
---|
1238 | 1221 | 4984, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1239 | 1222 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1240 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1223 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1241 | 1224 | /* 97 - 3840x2160@60Hz 16:9 */ |
---|
1242 | 1225 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016, |
---|
1243 | 1226 | 4104, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1244 | 1227 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1245 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1228 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1246 | 1229 | /* 98 - 4096x2160@24Hz 256:135 */ |
---|
1247 | 1230 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5116, |
---|
1248 | 1231 | 5204, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1249 | 1232 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1250 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1233 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1251 | 1234 | /* 99 - 4096x2160@25Hz 256:135 */ |
---|
1252 | 1235 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5064, |
---|
1253 | 1236 | 5152, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1254 | 1237 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1255 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1238 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1256 | 1239 | /* 100 - 4096x2160@30Hz 256:135 */ |
---|
1257 | 1240 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 4184, |
---|
1258 | 1241 | 4272, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1259 | 1242 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1260 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1243 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1261 | 1244 | /* 101 - 4096x2160@50Hz 256:135 */ |
---|
1262 | 1245 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5064, |
---|
1263 | 1246 | 5152, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1264 | 1247 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1265 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1248 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1266 | 1249 | /* 102 - 4096x2160@60Hz 256:135 */ |
---|
1267 | 1250 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 4184, |
---|
1268 | 1251 | 4272, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1269 | 1252 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1270 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1253 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1271 | 1254 | /* 103 - 3840x2160@24Hz 64:27 */ |
---|
1272 | 1255 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116, |
---|
1273 | 1256 | 5204, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1274 | 1257 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1275 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1258 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1276 | 1259 | /* 104 - 3840x2160@25Hz 64:27 */ |
---|
1277 | 1260 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896, |
---|
1278 | 1261 | 4984, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1279 | 1262 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1280 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1263 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1281 | 1264 | /* 105 - 3840x2160@30Hz 64:27 */ |
---|
1282 | 1265 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016, |
---|
1283 | 1266 | 4104, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1284 | 1267 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1285 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1268 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1286 | 1269 | /* 106 - 3840x2160@50Hz 64:27 */ |
---|
1287 | 1270 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896, |
---|
1288 | 1271 | 4984, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1289 | 1272 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1290 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1273 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1291 | 1274 | /* 107 - 3840x2160@60Hz 64:27 */ |
---|
1292 | 1275 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016, |
---|
1293 | 1276 | 4104, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1294 | 1277 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1295 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1278 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1296 | 1279 | /* 108 - 1280x720@48Hz 16:9 */ |
---|
1297 | 1280 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240, |
---|
1298 | 1281 | 2280, 2500, 0, 720, 725, 730, 750, 0, |
---|
1299 | 1282 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1300 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1283 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1301 | 1284 | /* 109 - 1280x720@48Hz 64:27 */ |
---|
1302 | 1285 | { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 90000, 1280, 2240, |
---|
1303 | 1286 | 2280, 2500, 0, 720, 725, 730, 750, 0, |
---|
1304 | 1287 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1305 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1288 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1306 | 1289 | /* 110 - 1680x720@48Hz 64:27 */ |
---|
1307 | 1290 | { DRM_MODE("1680x720", DRM_MODE_TYPE_DRIVER, 99000, 1680, 2490, |
---|
1308 | 1291 | 2530, 2750, 0, 720, 725, 730, 750, 0, |
---|
1309 | 1292 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1310 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1293 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1311 | 1294 | /* 111 - 1920x1080@48Hz 16:9 */ |
---|
1312 | 1295 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558, |
---|
1313 | 1296 | 2602, 2750, 0, 1080, 1084, 1089, 1125, 0, |
---|
1314 | 1297 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1315 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1298 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1316 | 1299 | /* 112 - 1920x1080@48Hz 64:27 */ |
---|
1317 | 1300 | { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2558, |
---|
1318 | 1301 | 2602, 2750, 0, 1080, 1084, 1089, 1125, 0, |
---|
1319 | 1302 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1320 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1303 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1321 | 1304 | /* 113 - 2560x1080@48Hz 64:27 */ |
---|
1322 | 1305 | { DRM_MODE("2560x1080", DRM_MODE_TYPE_DRIVER, 198000, 2560, 3558, |
---|
1323 | 1306 | 3602, 3750, 0, 1080, 1084, 1089, 1100, 0, |
---|
1324 | 1307 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1325 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1308 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1326 | 1309 | /* 114 - 3840x2160@48Hz 16:9 */ |
---|
1327 | 1310 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116, |
---|
1328 | 1311 | 5204, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1329 | 1312 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1330 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1313 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1331 | 1314 | /* 115 - 4096x2160@48Hz 256:135 */ |
---|
1332 | 1315 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5116, |
---|
1333 | 1316 | 5204, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1334 | 1317 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1335 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1318 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1336 | 1319 | /* 116 - 3840x2160@48Hz 64:27 */ |
---|
1337 | 1320 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 5116, |
---|
1338 | 1321 | 5204, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1339 | 1322 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1340 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1323 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1341 | 1324 | /* 117 - 3840x2160@100Hz 16:9 */ |
---|
1342 | 1325 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896, |
---|
1343 | 1326 | 4984, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1344 | 1327 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1345 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1328 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1346 | 1329 | /* 118 - 3840x2160@120Hz 16:9 */ |
---|
1347 | 1330 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016, |
---|
1348 | 1331 | 4104, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1349 | 1332 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1350 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1333 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1351 | 1334 | /* 119 - 3840x2160@100Hz 64:27 */ |
---|
1352 | 1335 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4896, |
---|
1353 | 1336 | 4984, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1354 | 1337 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1355 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1338 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1356 | 1339 | /* 120 - 3840x2160@120Hz 64:27 */ |
---|
1357 | 1340 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 1188000, 3840, 4016, |
---|
1358 | 1341 | 4104, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1359 | 1342 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1360 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1343 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1361 | 1344 | /* 121 - 5120x2160@24Hz 64:27 */ |
---|
1362 | 1345 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 7116, |
---|
1363 | 1346 | 7204, 7500, 0, 2160, 2168, 2178, 2200, 0, |
---|
1364 | 1347 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1365 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1348 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1366 | 1349 | /* 122 - 5120x2160@25Hz 64:27 */ |
---|
1367 | 1350 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 6816, |
---|
1368 | 1351 | 6904, 7200, 0, 2160, 2168, 2178, 2200, 0, |
---|
1369 | 1352 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1370 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1353 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1371 | 1354 | /* 123 - 5120x2160@30Hz 64:27 */ |
---|
1372 | 1355 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 396000, 5120, 5784, |
---|
1373 | 1356 | 5872, 6000, 0, 2160, 2168, 2178, 2200, 0, |
---|
1374 | 1357 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1375 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1358 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1376 | 1359 | /* 124 - 5120x2160@48Hz 64:27 */ |
---|
1377 | 1360 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5866, |
---|
1378 | 1361 | 5954, 6250, 0, 2160, 2168, 2178, 2475, 0, |
---|
1379 | 1362 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1380 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1363 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1381 | 1364 | /* 125 - 5120x2160@50Hz 64:27 */ |
---|
1382 | 1365 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 6216, |
---|
1383 | 1366 | 6304, 6600, 0, 2160, 2168, 2178, 2250, 0, |
---|
1384 | 1367 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1385 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1368 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1386 | 1369 | /* 126 - 5120x2160@60Hz 64:27 */ |
---|
1387 | 1370 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5284, |
---|
1388 | 1371 | 5372, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1389 | 1372 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1390 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1373 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1391 | 1374 | /* 127 - 5120x2160@100Hz 64:27 */ |
---|
1392 | 1375 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 6216, |
---|
1393 | 1376 | 6304, 6600, 0, 2160, 2168, 2178, 2250, 0, |
---|
1394 | 1377 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1395 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1378 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1396 | 1379 | }; |
---|
1397 | 1380 | |
---|
1398 | 1381 | /* |
---|
.. | .. |
---|
1405 | 1388 | { DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 5284, |
---|
1406 | 1389 | 5372, 5500, 0, 2160, 2168, 2178, 2250, 0, |
---|
1407 | 1390 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1408 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1391 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1409 | 1392 | /* 194 - 7680x4320@24Hz 16:9 */ |
---|
1410 | 1393 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232, |
---|
1411 | 1394 | 10408, 11000, 0, 4320, 4336, 4356, 4500, 0, |
---|
1412 | 1395 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1413 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1396 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1414 | 1397 | /* 195 - 7680x4320@25Hz 16:9 */ |
---|
1415 | 1398 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032, |
---|
1416 | 1399 | 10208, 10800, 0, 4320, 4336, 4356, 4400, 0, |
---|
1417 | 1400 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1418 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1401 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1419 | 1402 | /* 196 - 7680x4320@30Hz 16:9 */ |
---|
1420 | 1403 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232, |
---|
1421 | 1404 | 8408, 9000, 0, 4320, 4336, 4356, 4400, 0, |
---|
1422 | 1405 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1423 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1406 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1424 | 1407 | /* 197 - 7680x4320@48Hz 16:9 */ |
---|
1425 | 1408 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232, |
---|
1426 | 1409 | 10408, 11000, 0, 4320, 4336, 4356, 4500, 0, |
---|
1427 | 1410 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1428 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1411 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1429 | 1412 | /* 198 - 7680x4320@50Hz 16:9 */ |
---|
1430 | 1413 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032, |
---|
1431 | 1414 | 10208, 10800, 0, 4320, 4336, 4356, 4400, 0, |
---|
1432 | 1415 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1433 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1416 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1434 | 1417 | /* 199 - 7680x4320@60Hz 16:9 */ |
---|
1435 | 1418 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232, |
---|
1436 | 1419 | 8408, 9000, 0, 4320, 4336, 4356, 4400, 0, |
---|
1437 | 1420 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1438 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1421 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1439 | 1422 | /* 200 - 7680x4320@100Hz 16:9 */ |
---|
1440 | 1423 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792, |
---|
1441 | 1424 | 9968, 10560, 0, 4320, 4336, 4356, 4500, 0, |
---|
1442 | 1425 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1443 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1426 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1444 | 1427 | /* 201 - 7680x4320@120Hz 16:9 */ |
---|
1445 | 1428 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032, |
---|
1446 | 1429 | 8208, 8800, 0, 4320, 4336, 4356, 4500, 0, |
---|
1447 | 1430 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1448 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
| 1431 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1449 | 1432 | /* 202 - 7680x4320@24Hz 64:27 */ |
---|
1450 | 1433 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10232, |
---|
1451 | 1434 | 10408, 11000, 0, 4320, 4336, 4356, 4500, 0, |
---|
1452 | 1435 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1453 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1436 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1454 | 1437 | /* 203 - 7680x4320@25Hz 64:27 */ |
---|
1455 | 1438 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 10032, |
---|
1456 | 1439 | 10208, 10800, 0, 4320, 4336, 4356, 4400, 0, |
---|
1457 | 1440 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1458 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1441 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1459 | 1442 | /* 204 - 7680x4320@30Hz 64:27 */ |
---|
1460 | 1443 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 1188000, 7680, 8232, |
---|
1461 | 1444 | 8408, 9000, 0, 4320, 4336, 4356, 4400, 0, |
---|
1462 | 1445 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1463 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1446 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1464 | 1447 | /* 205 - 7680x4320@48Hz 64:27 */ |
---|
1465 | 1448 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10232, |
---|
1466 | 1449 | 10408, 11000, 0, 4320, 4336, 4356, 4500, 0, |
---|
1467 | 1450 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1468 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1451 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1469 | 1452 | /* 206 - 7680x4320@50Hz 64:27 */ |
---|
1470 | 1453 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 10032, |
---|
1471 | 1454 | 10208, 10800, 0, 4320, 4336, 4356, 4400, 0, |
---|
1472 | 1455 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1473 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1456 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1474 | 1457 | /* 207 - 7680x4320@60Hz 64:27 */ |
---|
1475 | 1458 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 2376000, 7680, 8232, |
---|
1476 | 1459 | 8408, 9000, 0, 4320, 4336, 4356, 4400, 0, |
---|
1477 | 1460 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1478 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1461 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1479 | 1462 | /* 208 - 7680x4320@100Hz 64:27 */ |
---|
1480 | 1463 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 9792, |
---|
1481 | 1464 | 9968, 10560, 0, 4320, 4336, 4356, 4500, 0, |
---|
1482 | 1465 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1483 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1466 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1484 | 1467 | /* 209 - 7680x4320@120Hz 64:27 */ |
---|
1485 | 1468 | { DRM_MODE("7680x4320", DRM_MODE_TYPE_DRIVER, 4752000, 7680, 8032, |
---|
1486 | 1469 | 8208, 8800, 0, 4320, 4336, 4356, 4500, 0, |
---|
1487 | 1470 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1488 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1471 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1489 | 1472 | /* 210 - 10240x4320@24Hz 64:27 */ |
---|
1490 | 1473 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 11732, |
---|
1491 | 1474 | 11908, 12500, 0, 4320, 4336, 4356, 4950, 0, |
---|
1492 | 1475 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1493 | | - .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1476 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1494 | 1477 | /* 211 - 10240x4320@25Hz 64:27 */ |
---|
1495 | 1478 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 12732, |
---|
1496 | 1479 | 12908, 13500, 0, 4320, 4336, 4356, 4400, 0, |
---|
1497 | 1480 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1498 | | - .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1481 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1499 | 1482 | /* 212 - 10240x4320@30Hz 64:27 */ |
---|
1500 | 1483 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 1485000, 10240, 10528, |
---|
1501 | 1484 | 10704, 11000, 0, 4320, 4336, 4356, 4500, 0, |
---|
1502 | 1485 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1503 | | - .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1486 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1504 | 1487 | /* 213 - 10240x4320@48Hz 64:27 */ |
---|
1505 | 1488 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 11732, |
---|
1506 | 1489 | 11908, 12500, 0, 4320, 4336, 4356, 4950, 0, |
---|
1507 | 1490 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1508 | | - .vrefresh = 48, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1491 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1509 | 1492 | /* 214 - 10240x4320@50Hz 64:27 */ |
---|
1510 | 1493 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 12732, |
---|
1511 | 1494 | 12908, 13500, 0, 4320, 4336, 4356, 4400, 0, |
---|
1512 | 1495 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1513 | | - .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1496 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1514 | 1497 | /* 215 - 10240x4320@60Hz 64:27 */ |
---|
1515 | 1498 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 2970000, 10240, 10528, |
---|
1516 | 1499 | 10704, 11000, 0, 4320, 4336, 4356, 4500, 0, |
---|
1517 | 1500 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1518 | | - .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1501 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1519 | 1502 | /* 216 - 10240x4320@100Hz 64:27 */ |
---|
1520 | 1503 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 12432, |
---|
1521 | 1504 | 12608, 13200, 0, 4320, 4336, 4356, 4500, 0, |
---|
1522 | 1505 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1523 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1506 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1524 | 1507 | /* 217 - 10240x4320@120Hz 64:27 */ |
---|
1525 | 1508 | { DRM_MODE("10240x4320", DRM_MODE_TYPE_DRIVER, 5940000, 10240, 10528, |
---|
1526 | 1509 | 10704, 11000, 0, 4320, 4336, 4356, 4500, 0, |
---|
1527 | 1510 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1528 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
| 1511 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, }, |
---|
1529 | 1512 | /* 218 - 4096x2160@100Hz 256:135 */ |
---|
1530 | 1513 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4896, |
---|
1531 | 1514 | 4984, 5280, 0, 2160, 2168, 2178, 2250, 0, |
---|
1532 | 1515 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1533 | | - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1516 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1534 | 1517 | /* 219 - 4096x2160@120Hz 256:135 */ |
---|
1535 | 1518 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 1188000, 4096, 4184, |
---|
1536 | 1519 | 4272, 4400, 0, 2160, 2168, 2178, 2250, 0, |
---|
1537 | 1520 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1538 | | - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
| 1521 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1539 | 1522 | }; |
---|
1540 | 1523 | |
---|
1541 | 1524 | /* |
---|
.. | .. |
---|
1549 | 1532 | 3840, 4016, 4104, 4400, 0, |
---|
1550 | 1533 | 2160, 2168, 2178, 2250, 0, |
---|
1551 | 1534 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1552 | | - .vrefresh = 30, }, |
---|
| 1535 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1553 | 1536 | /* 2 - 3840x2160@25Hz */ |
---|
1554 | 1537 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, |
---|
1555 | 1538 | 3840, 4896, 4984, 5280, 0, |
---|
1556 | 1539 | 2160, 2168, 2178, 2250, 0, |
---|
1557 | 1540 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1558 | | - .vrefresh = 25, }, |
---|
| 1541 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1559 | 1542 | /* 3 - 3840x2160@24Hz */ |
---|
1560 | 1543 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, |
---|
1561 | 1544 | 3840, 5116, 5204, 5500, 0, |
---|
1562 | 1545 | 2160, 2168, 2178, 2250, 0, |
---|
1563 | 1546 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1564 | | - .vrefresh = 24, }, |
---|
| 1547 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
---|
1565 | 1548 | /* 4 - 4096x2160@24Hz (SMPTE) */ |
---|
1566 | 1549 | { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, |
---|
1567 | 1550 | 4096, 5116, 5204, 5500, 0, |
---|
1568 | 1551 | 2160, 2168, 2178, 2250, 0, |
---|
1569 | 1552 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
---|
1570 | | - .vrefresh = 24, }, |
---|
| 1553 | + .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, }, |
---|
1571 | 1554 | }; |
---|
1572 | 1555 | |
---|
1573 | 1556 | /*** DDC fetch and block validation ***/ |
---|
.. | .. |
---|
1601 | 1584 | MODULE_PARM_DESC(edid_fixup, |
---|
1602 | 1585 | "Minimum number of valid EDID header bytes (0-8, default 6)"); |
---|
1603 | 1586 | |
---|
1604 | | -static void drm_get_displayid(struct drm_connector *connector, |
---|
1605 | | - struct edid *edid); |
---|
1606 | 1587 | static int validate_displayid(u8 *displayid, int length, int idx); |
---|
1607 | 1588 | |
---|
1608 | 1589 | static int drm_edid_block_checksum(const u8 *raw_edid) |
---|
1609 | 1590 | { |
---|
1610 | 1591 | int i; |
---|
1611 | | - u8 csum = 0; |
---|
1612 | | - for (i = 0; i < EDID_LENGTH; i++) |
---|
| 1592 | + u8 csum = 0, crc = 0; |
---|
| 1593 | + |
---|
| 1594 | + for (i = 0; i < EDID_LENGTH - 1; i++) |
---|
1613 | 1595 | csum += raw_edid[i]; |
---|
1614 | 1596 | |
---|
1615 | | - return csum; |
---|
| 1597 | + crc = 0x100 - csum; |
---|
| 1598 | + |
---|
| 1599 | + return crc; |
---|
| 1600 | +} |
---|
| 1601 | + |
---|
| 1602 | +static bool drm_edid_block_checksum_diff(const u8 *raw_edid, u8 real_checksum) |
---|
| 1603 | +{ |
---|
| 1604 | + if (raw_edid[EDID_LENGTH - 1] != real_checksum) |
---|
| 1605 | + return true; |
---|
| 1606 | + else |
---|
| 1607 | + return false; |
---|
1616 | 1608 | } |
---|
1617 | 1609 | |
---|
1618 | 1610 | static bool drm_edid_is_zero(const u8 *in_edid, int length) |
---|
.. | .. |
---|
1622 | 1614 | |
---|
1623 | 1615 | return true; |
---|
1624 | 1616 | } |
---|
| 1617 | + |
---|
| 1618 | +/** |
---|
| 1619 | + * drm_edid_are_equal - compare two edid blobs. |
---|
| 1620 | + * @edid1: pointer to first blob |
---|
| 1621 | + * @edid2: pointer to second blob |
---|
| 1622 | + * This helper can be used during probing to determine if |
---|
| 1623 | + * edid had changed. |
---|
| 1624 | + */ |
---|
| 1625 | +bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2) |
---|
| 1626 | +{ |
---|
| 1627 | + int edid1_len, edid2_len; |
---|
| 1628 | + bool edid1_present = edid1 != NULL; |
---|
| 1629 | + bool edid2_present = edid2 != NULL; |
---|
| 1630 | + |
---|
| 1631 | + if (edid1_present != edid2_present) |
---|
| 1632 | + return false; |
---|
| 1633 | + |
---|
| 1634 | + if (edid1) { |
---|
| 1635 | + edid1_len = EDID_LENGTH * (1 + edid1->extensions); |
---|
| 1636 | + edid2_len = EDID_LENGTH * (1 + edid2->extensions); |
---|
| 1637 | + |
---|
| 1638 | + if (edid1_len != edid2_len) |
---|
| 1639 | + return false; |
---|
| 1640 | + |
---|
| 1641 | + if (memcmp(edid1, edid2, edid1_len)) |
---|
| 1642 | + return false; |
---|
| 1643 | + } |
---|
| 1644 | + |
---|
| 1645 | + return true; |
---|
| 1646 | +} |
---|
| 1647 | +EXPORT_SYMBOL(drm_edid_are_equal); |
---|
1625 | 1648 | |
---|
1626 | 1649 | /** |
---|
1627 | 1650 | * drm_edid_block_valid - Sanity check the EDID block (base or extension) |
---|
.. | .. |
---|
1649 | 1672 | |
---|
1650 | 1673 | if (block == 0) { |
---|
1651 | 1674 | int score = drm_edid_header_is_valid(raw_edid); |
---|
| 1675 | + |
---|
1652 | 1676 | if (score == 8) { |
---|
1653 | 1677 | if (edid_corrupt) |
---|
1654 | 1678 | *edid_corrupt = false; |
---|
.. | .. |
---|
1670 | 1694 | } |
---|
1671 | 1695 | |
---|
1672 | 1696 | csum = drm_edid_block_checksum(raw_edid); |
---|
1673 | | - if (csum) { |
---|
| 1697 | + if (drm_edid_block_checksum_diff(raw_edid, csum)) { |
---|
1674 | 1698 | if (edid_corrupt) |
---|
1675 | 1699 | *edid_corrupt = true; |
---|
1676 | 1700 | |
---|
.. | .. |
---|
1811 | 1835 | u8 *edid, int num_blocks) |
---|
1812 | 1836 | { |
---|
1813 | 1837 | int i; |
---|
| 1838 | + u8 last_block; |
---|
1814 | 1839 | |
---|
1815 | | - if (connector->bad_edid_counter++ && !(drm_debug & DRM_UT_KMS)) |
---|
| 1840 | + /* |
---|
| 1841 | + * 0x7e in the EDID is the number of extension blocks. The EDID |
---|
| 1842 | + * is 1 (base block) + num_ext_blocks big. That means we can think |
---|
| 1843 | + * of 0x7e in the EDID of the _index_ of the last block in the |
---|
| 1844 | + * combined chunk of memory. |
---|
| 1845 | + */ |
---|
| 1846 | + last_block = edid[0x7e]; |
---|
| 1847 | + |
---|
| 1848 | + /* Calculate real checksum for the last edid extension block data */ |
---|
| 1849 | + if (last_block < num_blocks) |
---|
| 1850 | + connector->real_edid_checksum = |
---|
| 1851 | + drm_edid_block_checksum(edid + last_block * EDID_LENGTH); |
---|
| 1852 | + |
---|
| 1853 | + if (connector->bad_edid_counter++ && !drm_debug_enabled(DRM_UT_KMS)) |
---|
1816 | 1854 | return; |
---|
1817 | 1855 | |
---|
1818 | | - dev_warn(connector->dev->dev, |
---|
1819 | | - "%s: EDID is invalid:\n", |
---|
1820 | | - connector->name); |
---|
| 1856 | + drm_warn(connector->dev, "%s: EDID is invalid:\n", connector->name); |
---|
1821 | 1857 | for (i = 0; i < num_blocks; i++) { |
---|
1822 | 1858 | u8 *block = edid + i * EDID_LENGTH; |
---|
1823 | 1859 | char prefix[20]; |
---|
.. | .. |
---|
1879 | 1915 | } |
---|
1880 | 1916 | EXPORT_SYMBOL(drm_add_override_edid_modes); |
---|
1881 | 1917 | |
---|
| 1918 | +#ifdef CONFIG_NO_GKI |
---|
| 1919 | +/* |
---|
| 1920 | + * References: |
---|
| 1921 | + * - CTA-861-H section 7.3.3 CTA Extension Version 3 |
---|
| 1922 | + */ |
---|
| 1923 | +static int cea_db_collection_size(const u8 *cta) |
---|
| 1924 | +{ |
---|
| 1925 | + u8 d = cta[2]; |
---|
| 1926 | + |
---|
| 1927 | + if (d < 4 || d > 127) |
---|
| 1928 | + return 0; |
---|
| 1929 | + |
---|
| 1930 | + return d - 4; |
---|
| 1931 | +} |
---|
| 1932 | + |
---|
| 1933 | +#define CTA_EXT_DB_HF_EEODB 0x78 |
---|
| 1934 | +#define CTA_DB_EXTENDED_TAG 7 |
---|
| 1935 | + |
---|
| 1936 | +static int cea_db_tag(const u8 *db); |
---|
| 1937 | +static int cea_db_payload_len(const u8 *db); |
---|
| 1938 | +static int cea_db_extended_tag(const u8 *db); |
---|
| 1939 | + |
---|
| 1940 | +static bool cea_db_is_extended_tag(const void *db, int tag) |
---|
| 1941 | +{ |
---|
| 1942 | + return cea_db_tag(db) == CTA_DB_EXTENDED_TAG && |
---|
| 1943 | + cea_db_payload_len(db) >= 1 && |
---|
| 1944 | + cea_db_extended_tag(db) == tag; |
---|
| 1945 | +} |
---|
| 1946 | + |
---|
| 1947 | +static bool cea_db_is_hdmi_forum_eeodb(const void *db) |
---|
| 1948 | +{ |
---|
| 1949 | + return cea_db_is_extended_tag(db, CTA_EXT_DB_HF_EEODB) && |
---|
| 1950 | + cea_db_payload_len(db) >= 2; |
---|
| 1951 | +} |
---|
| 1952 | + |
---|
| 1953 | +static int edid_hfeeodb_extension_block_count(const struct edid *edid) |
---|
| 1954 | +{ |
---|
| 1955 | + const u8 *cta; |
---|
| 1956 | + |
---|
| 1957 | + /* No extensions according to base block, no HF-EEODB. */ |
---|
| 1958 | + if (!edid->extensions) |
---|
| 1959 | + return 0; |
---|
| 1960 | + |
---|
| 1961 | + /* HF-EEODB is always in the first EDID extension block only */ |
---|
| 1962 | + cta = (u8 *)edid + EDID_LENGTH * 1; |
---|
| 1963 | + if (cta[0] != CEA_EXT || cta[1] < 3) |
---|
| 1964 | + return 0; |
---|
| 1965 | + |
---|
| 1966 | + /* Need to have the data block collection, and at least 3 bytes. */ |
---|
| 1967 | + if (cea_db_collection_size(cta) < 3) |
---|
| 1968 | + return 0; |
---|
| 1969 | + |
---|
| 1970 | + /* |
---|
| 1971 | + * Sinks that include the HF-EEODB in their E-EDID shall include one and |
---|
| 1972 | + * only one instance of the HF-EEODB in the E-EDID, occupying bytes 4 |
---|
| 1973 | + * through 6 of Block 1 of the E-EDID. |
---|
| 1974 | + */ |
---|
| 1975 | + if (!cea_db_is_hdmi_forum_eeodb(&cta[4])) |
---|
| 1976 | + return 0; |
---|
| 1977 | + |
---|
| 1978 | + return cta[4 + 2]; |
---|
| 1979 | +} |
---|
| 1980 | + |
---|
| 1981 | +static int edid_hfeeodb_block_count(const struct edid *edid) |
---|
| 1982 | +{ |
---|
| 1983 | + int eeodb = edid_hfeeodb_extension_block_count(edid); |
---|
| 1984 | + |
---|
| 1985 | + return eeodb ? eeodb + 1 : 0; |
---|
| 1986 | +} |
---|
| 1987 | + |
---|
1882 | 1988 | /** |
---|
1883 | 1989 | * drm_do_get_edid - get EDID data using a custom EDID block read function |
---|
1884 | 1990 | * @connector: connector we're probing |
---|
.. | .. |
---|
1899 | 2005 | * |
---|
1900 | 2006 | * Return: Pointer to valid EDID or NULL if we couldn't find any. |
---|
1901 | 2007 | */ |
---|
| 2008 | +struct edid *drm_do_get_edid(struct drm_connector *connector, |
---|
| 2009 | + int (*get_edid_block)(void *data, u8 *buf, unsigned int block, |
---|
| 2010 | + size_t len), |
---|
| 2011 | + void *data) |
---|
| 2012 | +{ |
---|
| 2013 | + int i, j = 0, valid_extensions = 0, num_blocks, invalid_blocks = 0; |
---|
| 2014 | + u8 *edid, *new; |
---|
| 2015 | + struct edid *override; |
---|
| 2016 | + |
---|
| 2017 | + override = drm_get_override_edid(connector); |
---|
| 2018 | + if (override) |
---|
| 2019 | + return override; |
---|
| 2020 | + |
---|
| 2021 | + edid = kmalloc(EDID_LENGTH, GFP_KERNEL); |
---|
| 2022 | + if (!edid) |
---|
| 2023 | + return NULL; |
---|
| 2024 | + |
---|
| 2025 | + /* base block fetch */ |
---|
| 2026 | + for (i = 0; i < 4; i++) { |
---|
| 2027 | + if (get_edid_block(data, edid, 0, EDID_LENGTH)) |
---|
| 2028 | + goto out; |
---|
| 2029 | + if (drm_edid_block_valid(edid, 0, false, |
---|
| 2030 | + &connector->edid_corrupt)) |
---|
| 2031 | + break; |
---|
| 2032 | + if (i == 0 && drm_edid_is_zero(edid, EDID_LENGTH)) { |
---|
| 2033 | + connector->null_edid_counter++; |
---|
| 2034 | + goto out; |
---|
| 2035 | + } |
---|
| 2036 | + } |
---|
| 2037 | + if (i == 4) |
---|
| 2038 | + goto out; |
---|
| 2039 | + |
---|
| 2040 | + /* if there's no extensions, we're done */ |
---|
| 2041 | + valid_extensions = edid[0x7e]; |
---|
| 2042 | + if (valid_extensions == 0) |
---|
| 2043 | + return (struct edid *)edid; |
---|
| 2044 | + |
---|
| 2045 | + new = krealloc(edid, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL); |
---|
| 2046 | + if (!new) |
---|
| 2047 | + goto out; |
---|
| 2048 | + edid = new; |
---|
| 2049 | + |
---|
| 2050 | + num_blocks = edid[0x7e] + 1; |
---|
| 2051 | + |
---|
| 2052 | + for (j = 1; j < num_blocks; j++) { |
---|
| 2053 | + u8 *block = edid + j * EDID_LENGTH; |
---|
| 2054 | + |
---|
| 2055 | + for (i = 0; i < 4; i++) { |
---|
| 2056 | + if (get_edid_block(data, block, j, EDID_LENGTH)) |
---|
| 2057 | + goto out; |
---|
| 2058 | + if (drm_edid_block_valid(block, j, false, NULL)) |
---|
| 2059 | + break; |
---|
| 2060 | + } |
---|
| 2061 | + |
---|
| 2062 | + if (i == 4) |
---|
| 2063 | + invalid_blocks++; |
---|
| 2064 | + |
---|
| 2065 | + if (j == 1) { |
---|
| 2066 | + /* |
---|
| 2067 | + * If the first EDID extension is a CTA extension, and |
---|
| 2068 | + * the first Data Block is HF-EEODB, override the |
---|
| 2069 | + * extension block count. |
---|
| 2070 | + * |
---|
| 2071 | + * Note: HF-EEODB could specify a smaller extension |
---|
| 2072 | + * count too, but we can't risk allocating a smaller |
---|
| 2073 | + * amount. |
---|
| 2074 | + */ |
---|
| 2075 | + int eeodb = edid_hfeeodb_block_count((const struct edid *)edid); |
---|
| 2076 | + |
---|
| 2077 | + if (eeodb > num_blocks) { |
---|
| 2078 | + num_blocks = eeodb; |
---|
| 2079 | + new = krealloc(edid, num_blocks * EDID_LENGTH, GFP_KERNEL); |
---|
| 2080 | + if (!new) |
---|
| 2081 | + goto out; |
---|
| 2082 | + edid = new; |
---|
| 2083 | + } |
---|
| 2084 | + } |
---|
| 2085 | + } |
---|
| 2086 | + |
---|
| 2087 | + if (invalid_blocks) { |
---|
| 2088 | + u8 *base; |
---|
| 2089 | + |
---|
| 2090 | + connector_bad_edid(connector, edid, edid[0x7e] + 1); |
---|
| 2091 | + |
---|
| 2092 | + new = kmalloc_array(valid_extensions + 1, EDID_LENGTH, |
---|
| 2093 | + GFP_KERNEL); |
---|
| 2094 | + if (!new) |
---|
| 2095 | + goto out; |
---|
| 2096 | + |
---|
| 2097 | + base = new; |
---|
| 2098 | + for (i = 0; i <= edid[0x7e]; i++) { |
---|
| 2099 | + u8 *block = edid + i * EDID_LENGTH; |
---|
| 2100 | + |
---|
| 2101 | + if (!drm_edid_block_valid(block, i, false, NULL)) |
---|
| 2102 | + continue; |
---|
| 2103 | + |
---|
| 2104 | + memcpy(base, block, EDID_LENGTH); |
---|
| 2105 | + base += EDID_LENGTH; |
---|
| 2106 | + } |
---|
| 2107 | + |
---|
| 2108 | + new[EDID_LENGTH - 1] += new[0x7e] - valid_extensions; |
---|
| 2109 | + new[0x7e] = valid_extensions; |
---|
| 2110 | + |
---|
| 2111 | + kfree(edid); |
---|
| 2112 | + edid = new; |
---|
| 2113 | + } |
---|
| 2114 | + |
---|
| 2115 | + return (struct edid *)edid; |
---|
| 2116 | + |
---|
| 2117 | +out: |
---|
| 2118 | + kfree(edid); |
---|
| 2119 | + return NULL; |
---|
| 2120 | +} |
---|
| 2121 | +#else |
---|
1902 | 2122 | struct edid *drm_do_get_edid(struct drm_connector *connector, |
---|
1903 | 2123 | int (*get_edid_block)(void *data, u8 *buf, unsigned int block, |
---|
1904 | 2124 | size_t len), |
---|
.. | .. |
---|
1959 | 2179 | |
---|
1960 | 2180 | connector_bad_edid(connector, edid, edid[0x7e] + 1); |
---|
1961 | 2181 | |
---|
1962 | | - edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions; |
---|
1963 | | - edid[0x7e] = valid_extensions; |
---|
1964 | | - |
---|
1965 | 2182 | new = kmalloc_array(valid_extensions + 1, EDID_LENGTH, |
---|
1966 | 2183 | GFP_KERNEL); |
---|
1967 | 2184 | if (!new) |
---|
.. | .. |
---|
1978 | 2195 | base += EDID_LENGTH; |
---|
1979 | 2196 | } |
---|
1980 | 2197 | |
---|
| 2198 | + new[EDID_LENGTH - 1] += new[0x7e] - valid_extensions; |
---|
| 2199 | + new[0x7e] = valid_extensions; |
---|
| 2200 | + |
---|
1981 | 2201 | kfree(edid); |
---|
1982 | 2202 | edid = new; |
---|
1983 | 2203 | } |
---|
.. | .. |
---|
1990 | 2210 | kfree(edid); |
---|
1991 | 2211 | return NULL; |
---|
1992 | 2212 | } |
---|
| 2213 | +#endif |
---|
1993 | 2214 | EXPORT_SYMBOL_GPL(drm_do_get_edid); |
---|
1994 | 2215 | |
---|
1995 | 2216 | /** |
---|
.. | .. |
---|
2029 | 2250 | return NULL; |
---|
2030 | 2251 | |
---|
2031 | 2252 | edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); |
---|
2032 | | - if (edid) |
---|
2033 | | - drm_get_displayid(connector, edid); |
---|
| 2253 | + drm_connector_update_edid_property(connector, edid); |
---|
2034 | 2254 | return edid; |
---|
2035 | 2255 | } |
---|
2036 | 2256 | EXPORT_SYMBOL(drm_get_edid); |
---|
.. | .. |
---|
2154 | 2374 | if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode)) |
---|
2155 | 2375 | preferred_mode = cur_mode; |
---|
2156 | 2376 | |
---|
2157 | | - cur_vrefresh = cur_mode->vrefresh ? |
---|
2158 | | - cur_mode->vrefresh : drm_mode_vrefresh(cur_mode); |
---|
2159 | | - preferred_vrefresh = preferred_mode->vrefresh ? |
---|
2160 | | - preferred_mode->vrefresh : drm_mode_vrefresh(preferred_mode); |
---|
| 2377 | + cur_vrefresh = drm_mode_vrefresh(cur_mode); |
---|
| 2378 | + preferred_vrefresh = drm_mode_vrefresh(preferred_mode); |
---|
2161 | 2379 | /* At a given size, try to get closest to target refresh */ |
---|
2162 | 2380 | if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) && |
---|
2163 | 2381 | MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) < |
---|
.. | .. |
---|
2198 | 2416 | |
---|
2199 | 2417 | for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) { |
---|
2200 | 2418 | const struct drm_display_mode *ptr = &drm_dmt_modes[i]; |
---|
| 2419 | + |
---|
2201 | 2420 | if (hsize != ptr->hdisplay) |
---|
2202 | 2421 | continue; |
---|
2203 | 2422 | if (vsize != ptr->vdisplay) |
---|
.. | .. |
---|
2214 | 2433 | } |
---|
2215 | 2434 | EXPORT_SYMBOL(drm_mode_find_dmt); |
---|
2216 | 2435 | |
---|
| 2436 | +static bool is_display_descriptor(const u8 d[18], u8 tag) |
---|
| 2437 | +{ |
---|
| 2438 | + return d[0] == 0x00 && d[1] == 0x00 && |
---|
| 2439 | + d[2] == 0x00 && d[3] == tag; |
---|
| 2440 | +} |
---|
| 2441 | + |
---|
| 2442 | +static bool is_detailed_timing_descriptor(const u8 d[18]) |
---|
| 2443 | +{ |
---|
| 2444 | + return d[0] != 0x00 || d[1] != 0x00; |
---|
| 2445 | +} |
---|
| 2446 | + |
---|
2217 | 2447 | typedef void detailed_cb(struct detailed_timing *timing, void *closure); |
---|
2218 | 2448 | |
---|
2219 | 2449 | static void |
---|
2220 | 2450 | cea_for_each_detailed_block(u8 *ext, detailed_cb *cb, void *closure) |
---|
2221 | 2451 | { |
---|
2222 | | - int i, n = 0; |
---|
| 2452 | + int i, n; |
---|
2223 | 2453 | u8 d = ext[0x02]; |
---|
2224 | 2454 | u8 *det_base = ext + d; |
---|
| 2455 | + |
---|
| 2456 | + if (d < 4 || d > 127) |
---|
| 2457 | + return; |
---|
2225 | 2458 | |
---|
2226 | 2459 | n = (127 - d) / 18; |
---|
2227 | 2460 | for (i = 0; i < n; i++) |
---|
.. | .. |
---|
2255 | 2488 | |
---|
2256 | 2489 | for (i = 1; i <= raw_edid[0x7e]; i++) { |
---|
2257 | 2490 | u8 *ext = raw_edid + (i * EDID_LENGTH); |
---|
| 2491 | + |
---|
2258 | 2492 | switch (*ext) { |
---|
2259 | 2493 | case CEA_EXT: |
---|
2260 | 2494 | cea_for_each_detailed_block(ext, cb, closure); |
---|
.. | .. |
---|
2272 | 2506 | is_rb(struct detailed_timing *t, void *data) |
---|
2273 | 2507 | { |
---|
2274 | 2508 | u8 *r = (u8 *)t; |
---|
2275 | | - if (r[3] == EDID_DETAIL_MONITOR_RANGE) |
---|
2276 | | - if (r[15] & 0x10) |
---|
2277 | | - *(bool *)data = true; |
---|
| 2509 | + |
---|
| 2510 | + if (!is_display_descriptor(r, EDID_DETAIL_MONITOR_RANGE)) |
---|
| 2511 | + return; |
---|
| 2512 | + |
---|
| 2513 | + if (r[15] & 0x10) |
---|
| 2514 | + *(bool *)data = true; |
---|
2278 | 2515 | } |
---|
2279 | 2516 | |
---|
2280 | 2517 | /* EDID 1.4 defines this explicitly. For EDID 1.3, we guess, badly. */ |
---|
.. | .. |
---|
2283 | 2520 | { |
---|
2284 | 2521 | if (edid->revision >= 4) { |
---|
2285 | 2522 | bool ret = false; |
---|
| 2523 | + |
---|
2286 | 2524 | drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); |
---|
2287 | 2525 | return ret; |
---|
2288 | 2526 | } |
---|
.. | .. |
---|
2294 | 2532 | find_gtf2(struct detailed_timing *t, void *data) |
---|
2295 | 2533 | { |
---|
2296 | 2534 | u8 *r = (u8 *)t; |
---|
2297 | | - if (r[3] == EDID_DETAIL_MONITOR_RANGE && r[10] == 0x02) |
---|
| 2535 | + |
---|
| 2536 | + if (!is_display_descriptor(r, EDID_DETAIL_MONITOR_RANGE)) |
---|
| 2537 | + return; |
---|
| 2538 | + |
---|
| 2539 | + if (r[10] == 0x02) |
---|
2298 | 2540 | *(u8 **)data = r; |
---|
2299 | 2541 | } |
---|
2300 | 2542 | |
---|
.. | .. |
---|
2303 | 2545 | drm_gtf2_hbreak(struct edid *edid) |
---|
2304 | 2546 | { |
---|
2305 | 2547 | u8 *r = NULL; |
---|
| 2548 | + |
---|
2306 | 2549 | drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); |
---|
2307 | 2550 | return r ? (r[12] * 2) : 0; |
---|
2308 | 2551 | } |
---|
.. | .. |
---|
2311 | 2554 | drm_gtf2_2c(struct edid *edid) |
---|
2312 | 2555 | { |
---|
2313 | 2556 | u8 *r = NULL; |
---|
| 2557 | + |
---|
2314 | 2558 | drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); |
---|
2315 | 2559 | return r ? r[13] : 0; |
---|
2316 | 2560 | } |
---|
.. | .. |
---|
2319 | 2563 | drm_gtf2_m(struct edid *edid) |
---|
2320 | 2564 | { |
---|
2321 | 2565 | u8 *r = NULL; |
---|
| 2566 | + |
---|
2322 | 2567 | drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); |
---|
2323 | 2568 | return r ? (r[15] << 8) + r[14] : 0; |
---|
2324 | 2569 | } |
---|
.. | .. |
---|
2327 | 2572 | drm_gtf2_k(struct edid *edid) |
---|
2328 | 2573 | { |
---|
2329 | 2574 | u8 *r = NULL; |
---|
| 2575 | + |
---|
2330 | 2576 | drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); |
---|
2331 | 2577 | return r ? r[16] : 0; |
---|
2332 | 2578 | } |
---|
.. | .. |
---|
2335 | 2581 | drm_gtf2_2j(struct edid *edid) |
---|
2336 | 2582 | { |
---|
2337 | 2583 | u8 *r = NULL; |
---|
| 2584 | + |
---|
2338 | 2585 | drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); |
---|
2339 | 2586 | return r ? r[17] : 0; |
---|
2340 | 2587 | } |
---|
.. | .. |
---|
2350 | 2597 | return LEVEL_CVT; |
---|
2351 | 2598 | if (drm_gtf2_hbreak(edid)) |
---|
2352 | 2599 | return LEVEL_GTF2; |
---|
2353 | | - return LEVEL_GTF; |
---|
| 2600 | + if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) |
---|
| 2601 | + return LEVEL_GTF; |
---|
2354 | 2602 | } |
---|
2355 | 2603 | return LEVEL_DMT; |
---|
2356 | 2604 | } |
---|
.. | .. |
---|
2365 | 2613 | return (a == 0x00 && b == 0x00) || |
---|
2366 | 2614 | (a == 0x01 && b == 0x01) || |
---|
2367 | 2615 | (a == 0x20 && b == 0x20); |
---|
| 2616 | +} |
---|
| 2617 | + |
---|
| 2618 | +static int drm_mode_hsync(const struct drm_display_mode *mode) |
---|
| 2619 | +{ |
---|
| 2620 | + if (mode->htotal <= 0) |
---|
| 2621 | + return 0; |
---|
| 2622 | + |
---|
| 2623 | + return DIV_ROUND_CLOSEST(mode->clock, mode->htotal); |
---|
2368 | 2624 | } |
---|
2369 | 2625 | |
---|
2370 | 2626 | /** |
---|
.. | .. |
---|
2632 | 2888 | } |
---|
2633 | 2889 | |
---|
2634 | 2890 | mode->type = DRM_MODE_TYPE_DRIVER; |
---|
2635 | | - mode->vrefresh = drm_mode_vrefresh(mode); |
---|
2636 | 2891 | drm_mode_set_name(mode); |
---|
2637 | 2892 | |
---|
2638 | 2893 | return mode; |
---|
.. | .. |
---|
2778 | 3033 | |
---|
2779 | 3034 | for (i = 0; i < ARRAY_SIZE(extra_modes); i++) { |
---|
2780 | 3035 | const struct minimode *m = &extra_modes[i]; |
---|
| 3036 | + |
---|
2781 | 3037 | newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0); |
---|
2782 | 3038 | if (!newmode) |
---|
2783 | 3039 | return modes; |
---|
.. | .. |
---|
2807 | 3063 | |
---|
2808 | 3064 | for (i = 0; i < ARRAY_SIZE(extra_modes); i++) { |
---|
2809 | 3065 | const struct minimode *m = &extra_modes[i]; |
---|
| 3066 | + |
---|
2810 | 3067 | newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0); |
---|
2811 | 3068 | if (!newmode) |
---|
2812 | 3069 | return modes; |
---|
.. | .. |
---|
2832 | 3089 | struct detailed_non_pixel *data = &timing->data.other_data; |
---|
2833 | 3090 | struct detailed_data_monitor_range *range = &data->data.range; |
---|
2834 | 3091 | |
---|
2835 | | - if (data->type != EDID_DETAIL_MONITOR_RANGE) |
---|
| 3092 | + if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_MONITOR_RANGE)) |
---|
2836 | 3093 | return; |
---|
2837 | 3094 | |
---|
2838 | 3095 | closure->modes += drm_dmt_modes_for_range(closure->connector, |
---|
2839 | 3096 | closure->edid, |
---|
2840 | 3097 | timing); |
---|
2841 | | - |
---|
| 3098 | + |
---|
2842 | 3099 | if (!version_greater(closure->edid, 1, 1)) |
---|
2843 | 3100 | return; /* GTF not defined yet */ |
---|
2844 | 3101 | |
---|
.. | .. |
---|
2911 | 3168 | do_established_modes(struct detailed_timing *timing, void *c) |
---|
2912 | 3169 | { |
---|
2913 | 3170 | struct detailed_mode_closure *closure = c; |
---|
2914 | | - struct detailed_non_pixel *data = &timing->data.other_data; |
---|
2915 | 3171 | |
---|
2916 | | - if (data->type == EDID_DETAIL_EST_TIMINGS) |
---|
2917 | | - closure->modes += drm_est3_modes(closure->connector, timing); |
---|
| 3172 | + if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_EST_TIMINGS)) |
---|
| 3173 | + return; |
---|
| 3174 | + |
---|
| 3175 | + closure->modes += drm_est3_modes(closure->connector, timing); |
---|
2918 | 3176 | } |
---|
2919 | 3177 | |
---|
2920 | 3178 | /** |
---|
.. | .. |
---|
2941 | 3199 | for (i = 0; i <= EDID_EST_TIMINGS; i++) { |
---|
2942 | 3200 | if (est_bits & (1<<i)) { |
---|
2943 | 3201 | struct drm_display_mode *newmode; |
---|
| 3202 | + |
---|
2944 | 3203 | newmode = drm_mode_duplicate(dev, &edid_est_modes[i]); |
---|
2945 | 3204 | if (newmode) { |
---|
2946 | 3205 | drm_mode_probed_add(connector, newmode); |
---|
.. | .. |
---|
2963 | 3222 | struct detailed_non_pixel *data = &timing->data.other_data; |
---|
2964 | 3223 | struct drm_connector *connector = closure->connector; |
---|
2965 | 3224 | struct edid *edid = closure->edid; |
---|
| 3225 | + int i; |
---|
2966 | 3226 | |
---|
2967 | | - if (data->type == EDID_DETAIL_STD_MODES) { |
---|
2968 | | - int i; |
---|
2969 | | - for (i = 0; i < 6; i++) { |
---|
2970 | | - struct std_timing *std; |
---|
2971 | | - struct drm_display_mode *newmode; |
---|
| 3227 | + if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_STD_MODES)) |
---|
| 3228 | + return; |
---|
2972 | 3229 | |
---|
2973 | | - std = &data->data.timings[i]; |
---|
2974 | | - newmode = drm_mode_std(connector, edid, std); |
---|
2975 | | - if (newmode) { |
---|
2976 | | - drm_mode_probed_add(connector, newmode); |
---|
2977 | | - closure->modes++; |
---|
2978 | | - } |
---|
| 3230 | + for (i = 0; i < 6; i++) { |
---|
| 3231 | + struct std_timing *std = &data->data.timings[i]; |
---|
| 3232 | + struct drm_display_mode *newmode; |
---|
| 3233 | + |
---|
| 3234 | + newmode = drm_mode_std(connector, edid, std); |
---|
| 3235 | + if (newmode) { |
---|
| 3236 | + drm_mode_probed_add(connector, newmode); |
---|
| 3237 | + closure->modes++; |
---|
2979 | 3238 | } |
---|
2980 | 3239 | } |
---|
2981 | 3240 | } |
---|
.. | .. |
---|
3028 | 3287 | const u8 empty[3] = { 0, 0, 0 }; |
---|
3029 | 3288 | |
---|
3030 | 3289 | for (i = 0; i < 4; i++) { |
---|
3031 | | - int uninitialized_var(width), height; |
---|
| 3290 | + int width, height; |
---|
| 3291 | + |
---|
3032 | 3292 | cvt = &(timing->data.other_data.data.cvt[i]); |
---|
3033 | 3293 | |
---|
3034 | 3294 | if (!memcmp(cvt->code, empty, 3)) |
---|
.. | .. |
---|
3036 | 3296 | |
---|
3037 | 3297 | height = (cvt->code[0] + ((cvt->code[1] & 0xf0) << 4) + 1) * 2; |
---|
3038 | 3298 | switch (cvt->code[1] & 0x0c) { |
---|
| 3299 | + /* default - because compiler doesn't see that we've enumerated all cases */ |
---|
| 3300 | + default: |
---|
3039 | 3301 | case 0x00: |
---|
3040 | 3302 | width = height * 4 / 3; |
---|
3041 | 3303 | break; |
---|
.. | .. |
---|
3070 | 3332 | do_cvt_mode(struct detailed_timing *timing, void *c) |
---|
3071 | 3333 | { |
---|
3072 | 3334 | struct detailed_mode_closure *closure = c; |
---|
3073 | | - struct detailed_non_pixel *data = &timing->data.other_data; |
---|
3074 | 3335 | |
---|
3075 | | - if (data->type == EDID_DETAIL_CVT_3BYTE) |
---|
3076 | | - closure->modes += drm_cvt_modes(closure->connector, timing); |
---|
| 3336 | + if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_CVT_3BYTE)) |
---|
| 3337 | + return; |
---|
| 3338 | + |
---|
| 3339 | + closure->modes += drm_cvt_modes(closure->connector, timing); |
---|
3077 | 3340 | } |
---|
3078 | 3341 | |
---|
3079 | 3342 | static int |
---|
3080 | 3343 | add_cvt_modes(struct drm_connector *connector, struct edid *edid) |
---|
3081 | | -{ |
---|
| 3344 | +{ |
---|
3082 | 3345 | struct detailed_mode_closure closure = { |
---|
3083 | 3346 | .connector = connector, |
---|
3084 | 3347 | .edid = edid, |
---|
.. | .. |
---|
3100 | 3363 | struct detailed_mode_closure *closure = c; |
---|
3101 | 3364 | struct drm_display_mode *newmode; |
---|
3102 | 3365 | |
---|
3103 | | - if (timing->pixel_clock) { |
---|
3104 | | - newmode = drm_mode_detailed(closure->connector->dev, |
---|
3105 | | - closure->edid, timing, |
---|
3106 | | - closure->quirks); |
---|
3107 | | - if (!newmode) |
---|
3108 | | - return; |
---|
| 3366 | + if (!is_detailed_timing_descriptor((const u8 *)timing)) |
---|
| 3367 | + return; |
---|
3109 | 3368 | |
---|
3110 | | - if (closure->preferred) |
---|
3111 | | - newmode->type |= DRM_MODE_TYPE_PREFERRED; |
---|
| 3369 | + newmode = drm_mode_detailed(closure->connector->dev, |
---|
| 3370 | + closure->edid, timing, |
---|
| 3371 | + closure->quirks); |
---|
| 3372 | + if (!newmode) |
---|
| 3373 | + return; |
---|
3112 | 3374 | |
---|
3113 | | - /* |
---|
3114 | | - * Detailed modes are limited to 10kHz pixel clock resolution, |
---|
3115 | | - * so fix up anything that looks like CEA/HDMI mode, but the clock |
---|
3116 | | - * is just slightly off. |
---|
3117 | | - */ |
---|
3118 | | - fixup_detailed_cea_mode_clock(newmode); |
---|
| 3375 | + if (closure->preferred) |
---|
| 3376 | + newmode->type |= DRM_MODE_TYPE_PREFERRED; |
---|
3119 | 3377 | |
---|
3120 | | - drm_mode_probed_add(closure->connector, newmode); |
---|
3121 | | - closure->modes++; |
---|
3122 | | - closure->preferred = false; |
---|
3123 | | - } |
---|
| 3378 | + /* |
---|
| 3379 | + * Detailed modes are limited to 10kHz pixel clock resolution, |
---|
| 3380 | + * so fix up anything that looks like CEA/HDMI mode, but the clock |
---|
| 3381 | + * is just slightly off. |
---|
| 3382 | + */ |
---|
| 3383 | + fixup_detailed_cea_mode_clock(newmode); |
---|
| 3384 | + |
---|
| 3385 | + drm_mode_probed_add(closure->connector, newmode); |
---|
| 3386 | + closure->modes++; |
---|
| 3387 | + closure->preferred = false; |
---|
3124 | 3388 | } |
---|
3125 | 3389 | |
---|
3126 | 3390 | /* |
---|
.. | .. |
---|
3148 | 3412 | |
---|
3149 | 3413 | return closure.modes; |
---|
3150 | 3414 | } |
---|
3151 | | -#define VIDEO_CAPABILITY_EXTENDED_DATA_BLOCK 0x0 |
---|
| 3415 | + |
---|
3152 | 3416 | #define AUDIO_BLOCK 0x01 |
---|
3153 | 3417 | #define VIDEO_BLOCK 0x02 |
---|
3154 | 3418 | #define VENDOR_BLOCK 0x03 |
---|
3155 | 3419 | #define SPEAKER_BLOCK 0x04 |
---|
3156 | | -#define COLORIMETRY_DATA_BLOCK 0x5 |
---|
3157 | | -#define COLORIMETRY_EXTENDED_DATA_BLOCK 0x05 |
---|
3158 | 3420 | #define HDR_STATIC_METADATA_BLOCK 0x6 |
---|
3159 | 3421 | #define USE_EXTENDED_TAG 0x07 |
---|
3160 | 3422 | #define EXT_VIDEO_CAPABILITY_BLOCK 0x00 |
---|
3161 | 3423 | #define EXT_VIDEO_DATA_BLOCK_420 0x0E |
---|
3162 | 3424 | #define EXT_VIDEO_CAP_BLOCK_Y420CMDB 0x0F |
---|
3163 | | -#define VENDOR_SPECIFIC_VIDEO_DATA_BLOCK 0x01 |
---|
3164 | | -#define VSVDB_HDR10_PLUS_IEEE_CODE 0x90848b |
---|
3165 | | -#define VSVDB_HDR10_PLUS_APP_VER_MASK 0x3 |
---|
3166 | 3425 | #define EDID_BASIC_AUDIO (1 << 6) |
---|
3167 | 3426 | #define EDID_CEA_YCRCB444 (1 << 5) |
---|
3168 | 3427 | #define EDID_CEA_YCRCB422 (1 << 4) |
---|
.. | .. |
---|
3171 | 3430 | /* |
---|
3172 | 3431 | * Search EDID for CEA extension block. |
---|
3173 | 3432 | */ |
---|
3174 | | -static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id) |
---|
| 3433 | +#ifdef CONFIG_NO_GKI |
---|
| 3434 | +static u8 *drm_find_edid_extension(const struct edid *edid, |
---|
| 3435 | + int ext_id, int *ext_index) |
---|
| 3436 | +{ |
---|
| 3437 | + u8 *edid_ext = NULL; |
---|
| 3438 | + int i; |
---|
| 3439 | + int len; |
---|
| 3440 | + |
---|
| 3441 | + /* No EDID or EDID extensions */ |
---|
| 3442 | + if (edid == NULL || edid->extensions == 0) |
---|
| 3443 | + return NULL; |
---|
| 3444 | + |
---|
| 3445 | + if (edid_hfeeodb_extension_block_count(edid)) |
---|
| 3446 | + len = edid_hfeeodb_extension_block_count(edid); |
---|
| 3447 | + else |
---|
| 3448 | + len = edid->extensions; |
---|
| 3449 | + |
---|
| 3450 | + /* Find CEA extension */ |
---|
| 3451 | + for (i = *ext_index; i < len; i++) { |
---|
| 3452 | + edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1); |
---|
| 3453 | + |
---|
| 3454 | + if (edid_ext[0] == ext_id) |
---|
| 3455 | + break; |
---|
| 3456 | + } |
---|
| 3457 | + |
---|
| 3458 | + if (i >= len) |
---|
| 3459 | + return NULL; |
---|
| 3460 | + |
---|
| 3461 | + *ext_index = i + 1; |
---|
| 3462 | + |
---|
| 3463 | + return edid_ext; |
---|
| 3464 | +} |
---|
| 3465 | +#else |
---|
| 3466 | +static u8 *drm_find_edid_extension(const struct edid *edid, |
---|
| 3467 | + int ext_id, int *ext_index) |
---|
3175 | 3468 | { |
---|
3176 | 3469 | u8 *edid_ext = NULL; |
---|
3177 | 3470 | int i; |
---|
.. | .. |
---|
3181 | 3474 | return NULL; |
---|
3182 | 3475 | |
---|
3183 | 3476 | /* Find CEA extension */ |
---|
3184 | | - for (i = 0; i < edid->extensions; i++) { |
---|
| 3477 | + for (i = *ext_index; i < edid->extensions; i++) { |
---|
3185 | 3478 | edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1); |
---|
3186 | 3479 | if (edid_ext[0] == ext_id) |
---|
3187 | 3480 | break; |
---|
3188 | 3481 | } |
---|
3189 | 3482 | |
---|
3190 | | - if (i == edid->extensions) |
---|
| 3483 | + if (i >= edid->extensions) |
---|
3191 | 3484 | return NULL; |
---|
| 3485 | + |
---|
| 3486 | + *ext_index = i + 1; |
---|
3192 | 3487 | |
---|
3193 | 3488 | return edid_ext; |
---|
3194 | 3489 | } |
---|
| 3490 | +#endif |
---|
3195 | 3491 | |
---|
3196 | | - |
---|
3197 | | -static u8 *drm_find_displayid_extension(const struct edid *edid) |
---|
| 3492 | +static u8 *drm_find_displayid_extension(const struct edid *edid, |
---|
| 3493 | + int *length, int *idx, |
---|
| 3494 | + int *ext_index) |
---|
3198 | 3495 | { |
---|
3199 | | - return drm_find_edid_extension(edid, DISPLAYID_EXT); |
---|
| 3496 | + u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index); |
---|
| 3497 | + struct displayid_hdr *base; |
---|
| 3498 | + int ret; |
---|
| 3499 | + |
---|
| 3500 | + if (!displayid) |
---|
| 3501 | + return NULL; |
---|
| 3502 | + |
---|
| 3503 | + /* EDID extensions block checksum isn't for us */ |
---|
| 3504 | + *length = EDID_LENGTH - 1; |
---|
| 3505 | + *idx = 1; |
---|
| 3506 | + |
---|
| 3507 | + ret = validate_displayid(displayid, *length, *idx); |
---|
| 3508 | + if (ret) |
---|
| 3509 | + return NULL; |
---|
| 3510 | + |
---|
| 3511 | + base = (struct displayid_hdr *)&displayid[*idx]; |
---|
| 3512 | + *length = *idx + sizeof(*base) + base->bytes; |
---|
| 3513 | + |
---|
| 3514 | + return displayid; |
---|
3200 | 3515 | } |
---|
3201 | 3516 | |
---|
3202 | 3517 | static u8 *drm_find_cea_extension(const struct edid *edid) |
---|
3203 | 3518 | { |
---|
3204 | | - int ret; |
---|
3205 | | - int idx = 1; |
---|
3206 | | - int length = EDID_LENGTH; |
---|
| 3519 | + int length, idx; |
---|
3207 | 3520 | struct displayid_block *block; |
---|
3208 | 3521 | u8 *cea; |
---|
3209 | 3522 | u8 *displayid; |
---|
| 3523 | + int ext_index; |
---|
3210 | 3524 | |
---|
3211 | 3525 | /* Look for a top level CEA extension block */ |
---|
3212 | | - cea = drm_find_edid_extension(edid, CEA_EXT); |
---|
| 3526 | + /* FIXME: make callers iterate through multiple CEA ext blocks? */ |
---|
| 3527 | + ext_index = 0; |
---|
| 3528 | + cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index); |
---|
3213 | 3529 | if (cea) |
---|
3214 | 3530 | return cea; |
---|
3215 | 3531 | |
---|
3216 | 3532 | /* CEA blocks can also be found embedded in a DisplayID block */ |
---|
3217 | | - displayid = drm_find_displayid_extension(edid); |
---|
3218 | | - if (!displayid) |
---|
3219 | | - return NULL; |
---|
| 3533 | + ext_index = 0; |
---|
| 3534 | + for (;;) { |
---|
| 3535 | + displayid = drm_find_displayid_extension(edid, &length, &idx, |
---|
| 3536 | + &ext_index); |
---|
| 3537 | + if (!displayid) |
---|
| 3538 | + return NULL; |
---|
3220 | 3539 | |
---|
3221 | | - ret = validate_displayid(displayid, length, idx); |
---|
3222 | | - if (ret) |
---|
3223 | | - return NULL; |
---|
3224 | | - |
---|
3225 | | - idx += sizeof(struct displayid_hdr); |
---|
3226 | | - for_each_displayid_db(displayid, block, idx, length) { |
---|
3227 | | - if (block->tag == DATA_BLOCK_CTA) { |
---|
3228 | | - cea = (u8 *)block; |
---|
3229 | | - break; |
---|
| 3540 | + idx += sizeof(struct displayid_hdr); |
---|
| 3541 | + for_each_displayid_db(displayid, block, idx, length) { |
---|
| 3542 | + if (block->tag == DATA_BLOCK_CTA) |
---|
| 3543 | + return (u8 *)block; |
---|
3230 | 3544 | } |
---|
3231 | 3545 | } |
---|
3232 | 3546 | |
---|
3233 | | - return cea; |
---|
| 3547 | + return NULL; |
---|
3234 | 3548 | } |
---|
3235 | 3549 | |
---|
3236 | | -static const struct drm_display_mode *cea_mode_for_vic(u8 vic) |
---|
| 3550 | +static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic) |
---|
3237 | 3551 | { |
---|
3238 | | - if (!vic) |
---|
3239 | | - return NULL; |
---|
3240 | | - if (vic < ARRAY_SIZE(edid_cea_modes_0)) |
---|
3241 | | - return &edid_cea_modes_0[vic]; |
---|
| 3552 | + BUILD_BUG_ON(1 + ARRAY_SIZE(edid_cea_modes_1) - 1 != 127); |
---|
| 3553 | + BUILD_BUG_ON(193 + ARRAY_SIZE(edid_cea_modes_193) - 1 != 219); |
---|
| 3554 | + |
---|
| 3555 | + if (vic >= 1 && vic < 1 + ARRAY_SIZE(edid_cea_modes_1)) |
---|
| 3556 | + return &edid_cea_modes_1[vic - 1]; |
---|
3242 | 3557 | if (vic >= 193 && vic < 193 + ARRAY_SIZE(edid_cea_modes_193)) |
---|
3243 | 3558 | return &edid_cea_modes_193[vic - 193]; |
---|
3244 | 3559 | return NULL; |
---|
.. | .. |
---|
3251 | 3566 | |
---|
3252 | 3567 | static u8 cea_next_vic(u8 vic) |
---|
3253 | 3568 | { |
---|
3254 | | - if (++vic == ARRAY_SIZE(edid_cea_modes_0)) |
---|
| 3569 | + if (++vic == 1 + ARRAY_SIZE(edid_cea_modes_1)) |
---|
3255 | 3570 | vic = 193; |
---|
3256 | 3571 | return vic; |
---|
3257 | 3572 | } |
---|
.. | .. |
---|
3265 | 3580 | { |
---|
3266 | 3581 | unsigned int clock = cea_mode->clock; |
---|
3267 | 3582 | |
---|
3268 | | - if (cea_mode->vrefresh % 6 != 0) |
---|
| 3583 | + if (drm_mode_vrefresh(cea_mode) % 6 != 0) |
---|
3269 | 3584 | return clock; |
---|
3270 | 3585 | |
---|
3271 | 3586 | /* |
---|
.. | .. |
---|
3394 | 3709 | return cea_mode_for_vic(vic) != NULL; |
---|
3395 | 3710 | } |
---|
3396 | 3711 | |
---|
3397 | | -/** |
---|
3398 | | - * drm_get_cea_aspect_ratio - get the picture aspect ratio corresponding to |
---|
3399 | | - * the input VIC from the CEA mode list |
---|
3400 | | - * @video_code: ID given to each of the CEA modes |
---|
3401 | | - * |
---|
3402 | | - * Returns picture aspect ratio |
---|
3403 | | - */ |
---|
3404 | | -enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code) |
---|
| 3712 | +static enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code) |
---|
3405 | 3713 | { |
---|
3406 | 3714 | const struct drm_display_mode *mode = cea_mode_for_vic(video_code); |
---|
3407 | 3715 | |
---|
.. | .. |
---|
3410 | 3718 | |
---|
3411 | 3719 | return HDMI_PICTURE_ASPECT_NONE; |
---|
3412 | 3720 | } |
---|
3413 | | -EXPORT_SYMBOL(drm_get_cea_aspect_ratio); |
---|
| 3721 | + |
---|
| 3722 | +static enum hdmi_picture_aspect drm_get_hdmi_aspect_ratio(const u8 video_code) |
---|
| 3723 | +{ |
---|
| 3724 | + return edid_4k_modes[video_code].picture_aspect_ratio; |
---|
| 3725 | +} |
---|
3414 | 3726 | |
---|
3415 | 3727 | /* |
---|
3416 | 3728 | * Calculate the alternate clock for HDMI modes (those from the HDMI vendor |
---|
3417 | 3729 | * specific block). |
---|
3418 | | - * |
---|
3419 | | - * It's almost like cea_mode_alternate_clock(), we just need to add an |
---|
3420 | | - * exception for the VIC 4 mode (4096x2160@24Hz): no alternate clock for this |
---|
3421 | | - * one. |
---|
3422 | 3730 | */ |
---|
3423 | 3731 | static unsigned int |
---|
3424 | 3732 | hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode) |
---|
3425 | 3733 | { |
---|
3426 | | - if (hdmi_mode->vdisplay == 4096 && hdmi_mode->hdisplay == 2160) |
---|
3427 | | - return hdmi_mode->clock; |
---|
3428 | | - |
---|
3429 | 3734 | return cea_mode_alternate_clock(hdmi_mode); |
---|
3430 | 3735 | } |
---|
3431 | 3736 | |
---|
.. | .. |
---|
3437 | 3742 | |
---|
3438 | 3743 | if (!to_match->clock) |
---|
3439 | 3744 | return 0; |
---|
| 3745 | + |
---|
| 3746 | + if (to_match->picture_aspect_ratio) |
---|
| 3747 | + match_flags |= DRM_MODE_MATCH_ASPECT_RATIO; |
---|
3440 | 3748 | |
---|
3441 | 3749 | for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) { |
---|
3442 | 3750 | const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic]; |
---|
.. | .. |
---|
3472 | 3780 | |
---|
3473 | 3781 | if (!to_match->clock) |
---|
3474 | 3782 | return 0; |
---|
| 3783 | + |
---|
| 3784 | + if (to_match->picture_aspect_ratio) |
---|
| 3785 | + match_flags |= DRM_MODE_MATCH_ASPECT_RATIO; |
---|
3475 | 3786 | |
---|
3476 | 3787 | for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) { |
---|
3477 | 3788 | const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic]; |
---|
.. | .. |
---|
3596 | 3907 | if (!newmode) |
---|
3597 | 3908 | return NULL; |
---|
3598 | 3909 | |
---|
3599 | | - newmode->vrefresh = 0; |
---|
3600 | | - |
---|
3601 | 3910 | return newmode; |
---|
3602 | 3911 | } |
---|
3603 | 3912 | |
---|
.. | .. |
---|
3658 | 3967 | bitmap_set(hdmi->y420_cmdb_modes, vic, 1); |
---|
3659 | 3968 | } |
---|
3660 | 3969 | |
---|
| 3970 | +/** |
---|
| 3971 | + * drm_display_mode_from_cea_vic() - return a mode for CEA VIC |
---|
| 3972 | + * @dev: DRM device |
---|
| 3973 | + * @video_code: CEA VIC of the mode |
---|
| 3974 | + * |
---|
| 3975 | + * Creates a new mode matching the specified CEA VIC. |
---|
| 3976 | + * |
---|
| 3977 | + * Returns: A new drm_display_mode on success or NULL on failure |
---|
| 3978 | + */ |
---|
| 3979 | +struct drm_display_mode * |
---|
| 3980 | +drm_display_mode_from_cea_vic(struct drm_device *dev, |
---|
| 3981 | + u8 video_code) |
---|
| 3982 | +{ |
---|
| 3983 | + const struct drm_display_mode *cea_mode; |
---|
| 3984 | + struct drm_display_mode *newmode; |
---|
| 3985 | + |
---|
| 3986 | + cea_mode = cea_mode_for_vic(video_code); |
---|
| 3987 | + if (!cea_mode) |
---|
| 3988 | + return NULL; |
---|
| 3989 | + |
---|
| 3990 | + newmode = drm_mode_duplicate(dev, cea_mode); |
---|
| 3991 | + if (!newmode) |
---|
| 3992 | + return NULL; |
---|
| 3993 | + |
---|
| 3994 | + return newmode; |
---|
| 3995 | +} |
---|
| 3996 | +EXPORT_SYMBOL(drm_display_mode_from_cea_vic); |
---|
| 3997 | + |
---|
3661 | 3998 | static int |
---|
3662 | 3999 | do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len) |
---|
3663 | 4000 | { |
---|
.. | .. |
---|
3666 | 4003 | |
---|
3667 | 4004 | for (i = 0; i < len; i++) { |
---|
3668 | 4005 | struct drm_display_mode *mode; |
---|
| 4006 | + |
---|
3669 | 4007 | mode = drm_display_mode_from_vic_index(connector, db, len, i); |
---|
3670 | 4008 | if (mode) { |
---|
3671 | 4009 | /* |
---|
.. | .. |
---|
3978 | 4316 | static int |
---|
3979 | 4317 | cea_revision(const u8 *cea) |
---|
3980 | 4318 | { |
---|
| 4319 | + /* |
---|
| 4320 | + * FIXME is this correct for the DispID variant? |
---|
| 4321 | + * The DispID spec doesn't really specify whether |
---|
| 4322 | + * this is the revision of the CEA extension or |
---|
| 4323 | + * the DispID CEA data block. And the only value |
---|
| 4324 | + * given as an example is 0. |
---|
| 4325 | + */ |
---|
3981 | 4326 | return cea[1]; |
---|
3982 | 4327 | } |
---|
3983 | 4328 | |
---|
.. | .. |
---|
4002 | 4347 | * no non-DTD data. |
---|
4003 | 4348 | */ |
---|
4004 | 4349 | if (cea[0] == DATA_BLOCK_CTA) { |
---|
| 4350 | + /* |
---|
| 4351 | + * for_each_displayid_db() has already verified |
---|
| 4352 | + * that these stay within expected bounds. |
---|
| 4353 | + */ |
---|
4005 | 4354 | *start = 3; |
---|
4006 | 4355 | *end = *start + cea[2]; |
---|
4007 | 4356 | } else if (cea[0] == CEA_EXT) { |
---|
.. | .. |
---|
4013 | 4362 | if (*end < 4 || *end > 127) |
---|
4014 | 4363 | return -ERANGE; |
---|
4015 | 4364 | } else { |
---|
4016 | | - return -ENOTSUPP; |
---|
| 4365 | + return -EOPNOTSUPP; |
---|
4017 | 4366 | } |
---|
4018 | 4367 | |
---|
4019 | 4368 | return 0; |
---|
.. | .. |
---|
4047 | 4396 | oui = db[3] << 16 | db[2] << 8 | db[1]; |
---|
4048 | 4397 | |
---|
4049 | 4398 | return oui == HDMI_FORUM_IEEE_OUI; |
---|
| 4399 | +} |
---|
| 4400 | + |
---|
| 4401 | +static bool cea_db_is_vcdb(const u8 *db) |
---|
| 4402 | +{ |
---|
| 4403 | + if (cea_db_tag(db) != USE_EXTENDED_TAG) |
---|
| 4404 | + return false; |
---|
| 4405 | + |
---|
| 4406 | + if (cea_db_payload_len(db) != 2) |
---|
| 4407 | + return false; |
---|
| 4408 | + |
---|
| 4409 | + if (cea_db_extended_tag(db) != EXT_VIDEO_CAPABILITY_BLOCK) |
---|
| 4410 | + return false; |
---|
| 4411 | + |
---|
| 4412 | + return true; |
---|
4050 | 4413 | } |
---|
4051 | 4414 | |
---|
4052 | 4415 | static bool cea_db_is_y420cmdb(const u8 *db) |
---|
.. | .. |
---|
4120 | 4483 | hdmi->y420_cmdb_map = map; |
---|
4121 | 4484 | } |
---|
4122 | 4485 | |
---|
| 4486 | +#ifdef CONFIG_NO_GKI |
---|
| 4487 | + |
---|
| 4488 | +static int |
---|
| 4489 | +add_cea_modes(struct drm_connector *connector, struct edid *edid) |
---|
| 4490 | +{ |
---|
| 4491 | + const u8 *cea; |
---|
| 4492 | + const u8 *db, *hdmi = NULL, *video = NULL; |
---|
| 4493 | + u8 dbl, hdmi_len, video_len = 0; |
---|
| 4494 | + int i, count = 0, modes = 0; |
---|
| 4495 | + int ext_index = 0; |
---|
| 4496 | + |
---|
| 4497 | + if (edid_hfeeodb_extension_block_count(edid)) |
---|
| 4498 | + count = edid_hfeeodb_extension_block_count(edid); |
---|
| 4499 | + else |
---|
| 4500 | + count = edid->extensions; |
---|
| 4501 | + |
---|
| 4502 | + for (i = 0; i < count; i++) { |
---|
| 4503 | + ext_index = i; |
---|
| 4504 | + |
---|
| 4505 | + cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index); |
---|
| 4506 | + if (cea && cea_revision(cea) >= 3) { |
---|
| 4507 | + int i, start, end; |
---|
| 4508 | + |
---|
| 4509 | + if (cea_db_offsets(cea, &start, &end)) |
---|
| 4510 | + return 0; |
---|
| 4511 | + |
---|
| 4512 | + for_each_cea_db(cea, i, start, end) { |
---|
| 4513 | + db = &cea[i]; |
---|
| 4514 | + dbl = cea_db_payload_len(db); |
---|
| 4515 | + |
---|
| 4516 | + if (cea_db_tag(db) == VIDEO_BLOCK) { |
---|
| 4517 | + video = db + 1; |
---|
| 4518 | + video_len = dbl; |
---|
| 4519 | + modes += do_cea_modes(connector, video, dbl); |
---|
| 4520 | + } else if (cea_db_is_hdmi_vsdb(db)) { |
---|
| 4521 | + hdmi = db; |
---|
| 4522 | + hdmi_len = dbl; |
---|
| 4523 | + } else if (cea_db_is_y420vdb(db)) { |
---|
| 4524 | + const u8 *vdb420 = &db[2]; |
---|
| 4525 | + |
---|
| 4526 | + /* Add 4:2:0(only) modes present in EDID */ |
---|
| 4527 | + modes += do_y420vdb_modes(connector, |
---|
| 4528 | + vdb420, |
---|
| 4529 | + dbl - 1); |
---|
| 4530 | + } |
---|
| 4531 | + } |
---|
| 4532 | + } |
---|
| 4533 | + |
---|
| 4534 | + /* |
---|
| 4535 | + * We parse the HDMI VSDB after having added the cea modes as we will |
---|
| 4536 | + * be patching their flags when the sink supports stereo 3D. |
---|
| 4537 | + */ |
---|
| 4538 | + if (hdmi) |
---|
| 4539 | + modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video, |
---|
| 4540 | + video_len); |
---|
| 4541 | + } |
---|
| 4542 | + |
---|
| 4543 | + return modes; |
---|
| 4544 | +} |
---|
| 4545 | + |
---|
| 4546 | +#else |
---|
| 4547 | + |
---|
4123 | 4548 | static int |
---|
4124 | 4549 | add_cea_modes(struct drm_connector *connector, struct edid *edid) |
---|
4125 | 4550 | { |
---|
.. | .. |
---|
4166 | 4591 | |
---|
4167 | 4592 | return modes; |
---|
4168 | 4593 | } |
---|
| 4594 | +#endif |
---|
4169 | 4595 | |
---|
4170 | 4596 | static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode) |
---|
4171 | 4597 | { |
---|
.. | .. |
---|
4208 | 4634 | DRM_DEBUG("detailed mode matches %s VIC %d, adjusting clock %d -> %d\n", |
---|
4209 | 4635 | type, vic, mode->clock, clock); |
---|
4210 | 4636 | mode->clock = clock; |
---|
4211 | | -} |
---|
4212 | | - |
---|
4213 | | -static bool cea_db_is_hdmi_colorimetry_data_block(const u8 *db) |
---|
4214 | | -{ |
---|
4215 | | - if (cea_db_tag(db) != USE_EXTENDED_TAG) |
---|
4216 | | - return false; |
---|
4217 | | - |
---|
4218 | | - if (db[1] != COLORIMETRY_DATA_BLOCK) |
---|
4219 | | - return false; |
---|
4220 | | - |
---|
4221 | | - return true; |
---|
4222 | | -} |
---|
4223 | | - |
---|
4224 | | -static void |
---|
4225 | | -drm_parse_colorimetry_data_block(struct drm_connector *connector, const u8 *db) |
---|
4226 | | -{ |
---|
4227 | | - struct drm_hdmi_info *info = &connector->display_info.hdmi; |
---|
4228 | | - u16 len; |
---|
4229 | | - |
---|
4230 | | - len = cea_db_payload_len(db); |
---|
4231 | | - /* As per CEA 861-G spec */ |
---|
4232 | | - info->colorimetry = ((db[3] & (0x1 << 7)) << 1) | db[2]; |
---|
4233 | 4637 | } |
---|
4234 | 4638 | |
---|
4235 | 4639 | static bool cea_db_is_hdmi_hdr_metadata_block(const u8 *db) |
---|
.. | .. |
---|
4312 | 4716 | connector->audio_latency[1]); |
---|
4313 | 4717 | } |
---|
4314 | 4718 | |
---|
4315 | | -/* |
---|
4316 | | - * drm_extract_vcdb_info - Parse the HDMI Video Capability Data Block |
---|
4317 | | - * @connector: connector corresponding to the HDMI sink |
---|
4318 | | - * @db: start of the CEA vendor specific block |
---|
4319 | | - * |
---|
4320 | | - * Parses the HDMI VCDB to extract sink info for @connector. |
---|
4321 | | - */ |
---|
4322 | | -static void |
---|
4323 | | -drm_extract_vcdb_info(struct drm_connector *connector, const u8 *db) |
---|
4324 | | -{ |
---|
4325 | | - /* |
---|
4326 | | - * Check if the sink specifies underscan |
---|
4327 | | - * support for: |
---|
4328 | | - * BIT 5: preferred video format |
---|
4329 | | - * BIT 3: IT video format |
---|
4330 | | - * BIT 1: CE video format |
---|
4331 | | - */ |
---|
4332 | | - |
---|
4333 | | - connector->pt_scan_info = |
---|
4334 | | - (db[2] & (BIT(4) | BIT(5))) >> 4; |
---|
4335 | | - connector->it_scan_info = |
---|
4336 | | - (db[2] & (BIT(3) | BIT(2))) >> 2; |
---|
4337 | | - connector->ce_scan_info = |
---|
4338 | | - db[2] & (BIT(1) | BIT(0)); |
---|
4339 | | - |
---|
4340 | | - DRM_DEBUG_KMS("Scan Info (pt|it|ce): (%d|%d|%d)", |
---|
4341 | | - (int) connector->pt_scan_info, |
---|
4342 | | - (int) connector->it_scan_info, |
---|
4343 | | - (int) connector->ce_scan_info); |
---|
4344 | | -} |
---|
4345 | | - |
---|
4346 | | -static void |
---|
4347 | | -drm_parse_vsvdb_hdr_plus(struct drm_connector *connector, const u8 *db) |
---|
4348 | | -{ |
---|
4349 | | - connector->hdr_plus_app_ver = db[5] & VSVDB_HDR10_PLUS_APP_VER_MASK; |
---|
4350 | | -} |
---|
4351 | | - |
---|
4352 | | -static void |
---|
4353 | | -drm_extract_vsvdb_info(struct drm_connector *connector, const u8 *db) |
---|
4354 | | -{ |
---|
4355 | | - u8 db_len = cea_db_payload_len(db); |
---|
4356 | | - u32 ieee_code = 0; |
---|
4357 | | - |
---|
4358 | | - if (db_len < 5) |
---|
4359 | | - return; |
---|
4360 | | - |
---|
4361 | | - /* Bytes 2-4: IEEE 24-bit code, LSB first */ |
---|
4362 | | - ieee_code = db[2] | (db[3] << 8) | (db[4] << 16); |
---|
4363 | | - DRM_DEBUG_KMS("found VSVDB with IEEE code 0x%x\n", ieee_code); |
---|
4364 | | - if (ieee_code == VSVDB_HDR10_PLUS_IEEE_CODE) |
---|
4365 | | - drm_parse_vsvdb_hdr_plus(connector, db); |
---|
4366 | | -} |
---|
4367 | | - |
---|
4368 | | -static bool drm_edid_is_luminance_value_present( |
---|
4369 | | -u32 block_length, enum luminance_value value) |
---|
4370 | | -{ |
---|
4371 | | - return block_length > NO_LUMINANCE_DATA && value <= block_length; |
---|
4372 | | -} |
---|
4373 | | - |
---|
4374 | | -/* |
---|
4375 | | - * drm_extract_clrmetry_db - Parse the HDMI colorimetry extended block |
---|
4376 | | - * @connector: connector corresponding to the HDMI sink |
---|
4377 | | - * @db: start of the HDMI colorimetry extended block |
---|
4378 | | - * |
---|
4379 | | - * Parses the HDMI colorimetry block to extract sink info for @connector. |
---|
4380 | | - */ |
---|
4381 | | -static void |
---|
4382 | | -drm_extract_clrmetry_db(struct drm_connector *connector, const u8 *db) |
---|
4383 | | -{ |
---|
4384 | | - |
---|
4385 | | - if (!db) { |
---|
4386 | | - DRM_ERROR("invalid db\n"); |
---|
4387 | | - return; |
---|
4388 | | - } |
---|
4389 | | - |
---|
4390 | | - /* Byte 3 Bit 0: xvYCC_601 */ |
---|
4391 | | - if (db[2] & BIT(0)) |
---|
4392 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_xvYCC_601; |
---|
4393 | | - /* Byte 3 Bit 1: xvYCC_709 */ |
---|
4394 | | - if (db[2] & BIT(1)) |
---|
4395 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_xvYCC_709; |
---|
4396 | | - /* Byte 3 Bit 2: sYCC_601 */ |
---|
4397 | | - if (db[2] & BIT(2)) |
---|
4398 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_sYCC_601; |
---|
4399 | | - /* Byte 3 Bit 3: ADBYCC_601 */ |
---|
4400 | | - if (db[2] & BIT(3)) |
---|
4401 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_ADBYCC_601; |
---|
4402 | | - /* Byte 3 Bit 4: ADB_RGB */ |
---|
4403 | | - if (db[2] & BIT(4)) |
---|
4404 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_ADB_RGB; |
---|
4405 | | - /* Byte 3 Bit 5: BT2020_CYCC */ |
---|
4406 | | - if (db[2] & BIT(5)) |
---|
4407 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_BT2020_CYCC; |
---|
4408 | | - /* Byte 3 Bit 6: BT2020_YCC */ |
---|
4409 | | - if (db[2] & BIT(6)) |
---|
4410 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_BT2020_YCC; |
---|
4411 | | - /* Byte 3 Bit 7: BT2020_RGB */ |
---|
4412 | | - if (db[2] & BIT(7)) |
---|
4413 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_BT2020_RGB; |
---|
4414 | | - /* Byte 4 Bit 7: DCI-P3 */ |
---|
4415 | | - if (db[3] & BIT(7)) |
---|
4416 | | - connector->color_enc_fmt |= DRM_EDID_CLRMETRY_DCI_P3; |
---|
4417 | | - |
---|
4418 | | - DRM_DEBUG_KMS("colorimetry fmts = 0x%x\n", connector->color_enc_fmt); |
---|
4419 | | -} |
---|
4420 | | - |
---|
4421 | | -/* |
---|
4422 | | - * drm_extract_hdr_db - Parse the HDMI HDR extended block |
---|
4423 | | - * @connector: connector corresponding to the HDMI sink |
---|
4424 | | - * @db: start of the HDMI HDR extended block |
---|
4425 | | - * |
---|
4426 | | - * Parses the HDMI HDR extended block to extract sink info for @connector. |
---|
4427 | | - */ |
---|
4428 | | -static void |
---|
4429 | | -drm_extract_hdr_db(struct drm_connector *connector, const u8 *db) |
---|
4430 | | -{ |
---|
4431 | | - |
---|
4432 | | - u8 len = 0; |
---|
4433 | | - |
---|
4434 | | - if (!db) |
---|
4435 | | - return; |
---|
4436 | | - |
---|
4437 | | - len = db[0] & 0x1f; |
---|
4438 | | - /* Byte 3: Electro-Optical Transfer Functions */ |
---|
4439 | | - connector->hdr_eotf = db[2] & 0x3F; |
---|
4440 | | - |
---|
4441 | | - /* Byte 4: Static Metadata Descriptor Type 1 */ |
---|
4442 | | - connector->hdr_metadata_type_one = (db[3] & BIT(0)); |
---|
4443 | | - |
---|
4444 | | - /* Byte 5: Desired Content Maximum Luminance */ |
---|
4445 | | - if (drm_edid_is_luminance_value_present(len, MAXIMUM_LUMINANCE)) |
---|
4446 | | - connector->hdr_max_luminance = |
---|
4447 | | - db[MAXIMUM_LUMINANCE]; |
---|
4448 | | - |
---|
4449 | | - /* Byte 6: Desired Content Max Frame-average Luminance */ |
---|
4450 | | - if (drm_edid_is_luminance_value_present(len, FRAME_AVERAGE_LUMINANCE)) |
---|
4451 | | - connector->hdr_avg_luminance = |
---|
4452 | | - db[FRAME_AVERAGE_LUMINANCE]; |
---|
4453 | | - |
---|
4454 | | - /* Byte 7: Desired Content Min Luminance */ |
---|
4455 | | - if (drm_edid_is_luminance_value_present(len, MINIMUM_LUMINANCE)) |
---|
4456 | | - connector->hdr_min_luminance = |
---|
4457 | | - db[MINIMUM_LUMINANCE]; |
---|
4458 | | - |
---|
4459 | | - connector->hdr_supported = true; |
---|
4460 | | - |
---|
4461 | | - DRM_DEBUG_KMS("HDR electro-optical %d\n", connector->hdr_eotf); |
---|
4462 | | - DRM_DEBUG_KMS("metadata desc 1 %d\n", connector->hdr_metadata_type_one); |
---|
4463 | | - DRM_DEBUG_KMS("max luminance %d\n", connector->hdr_max_luminance); |
---|
4464 | | - DRM_DEBUG_KMS("avg luminance %d\n", connector->hdr_avg_luminance); |
---|
4465 | | - DRM_DEBUG_KMS("min luminance %d\n", connector->hdr_min_luminance); |
---|
4466 | | -} |
---|
4467 | | -/* |
---|
4468 | | - * drm_hdmi_extract_extended_blk_info - Parse the HDMI extended tag blocks |
---|
4469 | | - * @connector: connector corresponding to the HDMI sink |
---|
4470 | | - * @edid: handle to the EDID structure |
---|
4471 | | - * Parses the all extended tag blocks extract sink info for @connector. |
---|
4472 | | - */ |
---|
4473 | | -static void |
---|
4474 | | -drm_hdmi_extract_extended_blk_info(struct drm_connector *connector, |
---|
4475 | | - const struct edid *edid) |
---|
4476 | | -{ |
---|
4477 | | - const u8 *cea = drm_find_cea_extension(edid); |
---|
4478 | | - const u8 *db = NULL; |
---|
4479 | | - |
---|
4480 | | - if (cea && cea_revision(cea) >= 3) { |
---|
4481 | | - int i, start, end; |
---|
4482 | | - |
---|
4483 | | - if (cea_db_offsets(cea, &start, &end)) |
---|
4484 | | - return; |
---|
4485 | | - |
---|
4486 | | - for_each_cea_db(cea, i, start, end) { |
---|
4487 | | - db = &cea[i]; |
---|
4488 | | - |
---|
4489 | | - if (cea_db_tag(db) == USE_EXTENDED_TAG) { |
---|
4490 | | - DRM_DEBUG_KMS("found extended tag block = %d\n", |
---|
4491 | | - db[1]); |
---|
4492 | | - switch (db[1]) { |
---|
4493 | | - case VIDEO_CAPABILITY_EXTENDED_DATA_BLOCK: |
---|
4494 | | - drm_extract_vcdb_info(connector, db); |
---|
4495 | | - break; |
---|
4496 | | - case VENDOR_SPECIFIC_VIDEO_DATA_BLOCK: |
---|
4497 | | - drm_extract_vsvdb_info(connector, db); |
---|
4498 | | - break; |
---|
4499 | | - case HDR_STATIC_METADATA_BLOCK: |
---|
4500 | | - drm_extract_hdr_db(connector, db); |
---|
4501 | | - break; |
---|
4502 | | - case COLORIMETRY_EXTENDED_DATA_BLOCK: |
---|
4503 | | - drm_extract_clrmetry_db(connector, db); |
---|
4504 | | - break; |
---|
4505 | | - default: |
---|
4506 | | - break; |
---|
4507 | | - } |
---|
4508 | | - } |
---|
4509 | | - } |
---|
4510 | | - } |
---|
4511 | | -} |
---|
4512 | | - |
---|
4513 | | -static void |
---|
4514 | | -parse_hdmi_hf_vsdb(struct drm_connector *connector, const u8 *db) |
---|
4515 | | -{ |
---|
4516 | | - u8 len = cea_db_payload_len(db); |
---|
4517 | | - |
---|
4518 | | - if (len < 7) |
---|
4519 | | - return; |
---|
4520 | | - |
---|
4521 | | - if (db[4] != 1) |
---|
4522 | | - return; /* invalid version */ |
---|
4523 | | - |
---|
4524 | | - connector->max_tmds_char = db[5] * 5; |
---|
4525 | | - connector->scdc_present = db[6] & (1 << 7); |
---|
4526 | | - connector->rr_capable = db[6] & (1 << 6); |
---|
4527 | | - connector->flags_3d = db[6] & 0x7; |
---|
4528 | | - connector->supports_scramble = connector->scdc_present && |
---|
4529 | | - (db[6] & (1 << 3)); |
---|
4530 | | - |
---|
4531 | | - DRM_DEBUG_KMS( |
---|
4532 | | - "HDMI v2: max TMDS char %d, scdc %s, rr %s,3D flags 0x%x, scramble %s\n", |
---|
4533 | | - connector->max_tmds_char, |
---|
4534 | | - connector->scdc_present ? "available" : "not available", |
---|
4535 | | - connector->rr_capable ? "capable" : "not capable", |
---|
4536 | | - connector->flags_3d, |
---|
4537 | | - connector->supports_scramble ? "supported" : "not supported"); |
---|
4538 | | -} |
---|
4539 | | - |
---|
4540 | | -static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector, |
---|
4541 | | - const u8 *db) |
---|
4542 | | -{ |
---|
4543 | | - u8 dc_mask; |
---|
4544 | | - struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; |
---|
4545 | | - |
---|
4546 | | - dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK; |
---|
4547 | | - hdmi->y420_dc_modes = dc_mask; |
---|
4548 | | -} |
---|
4549 | | - |
---|
4550 | | -static |
---|
4551 | | -void drm_get_max_frl_rate(int max_frl_rate, u8 *max_lanes, u8 *max_rate_per_lane) |
---|
4552 | | -{ |
---|
4553 | | - switch (max_frl_rate) { |
---|
4554 | | - case 1: |
---|
4555 | | - *max_lanes = 3; |
---|
4556 | | - *max_rate_per_lane = 3; |
---|
4557 | | - break; |
---|
4558 | | - case 2: |
---|
4559 | | - *max_lanes = 3; |
---|
4560 | | - *max_rate_per_lane = 6; |
---|
4561 | | - break; |
---|
4562 | | - case 3: |
---|
4563 | | - *max_lanes = 4; |
---|
4564 | | - *max_rate_per_lane = 6; |
---|
4565 | | - break; |
---|
4566 | | - case 4: |
---|
4567 | | - *max_lanes = 4; |
---|
4568 | | - *max_rate_per_lane = 8; |
---|
4569 | | - break; |
---|
4570 | | - case 5: |
---|
4571 | | - *max_lanes = 4; |
---|
4572 | | - *max_rate_per_lane = 10; |
---|
4573 | | - break; |
---|
4574 | | - case 6: |
---|
4575 | | - *max_lanes = 4; |
---|
4576 | | - *max_rate_per_lane = 12; |
---|
4577 | | - break; |
---|
4578 | | - case 0: |
---|
4579 | | - default: |
---|
4580 | | - *max_lanes = 0; |
---|
4581 | | - *max_rate_per_lane = 0; |
---|
4582 | | - } |
---|
4583 | | -} |
---|
4584 | | - |
---|
4585 | | -static void drm_parse_hdmi_forum_vsdb(struct drm_connector *connector, |
---|
4586 | | - const u8 *hf_vsdb) |
---|
4587 | | -{ |
---|
4588 | | - struct drm_display_info *display = &connector->display_info; |
---|
4589 | | - struct drm_hdmi_info *hdmi = &display->hdmi; |
---|
4590 | | - |
---|
4591 | | - display->has_hdmi_infoframe = true; |
---|
4592 | | - |
---|
4593 | | - if (hf_vsdb[6] & 0x80) { |
---|
4594 | | - hdmi->scdc.supported = true; |
---|
4595 | | - if (hf_vsdb[6] & 0x40) |
---|
4596 | | - hdmi->scdc.read_request = true; |
---|
4597 | | - } |
---|
4598 | | - |
---|
4599 | | - /* |
---|
4600 | | - * All HDMI 2.0 monitors must support scrambling at rates > 340 MHz. |
---|
4601 | | - * And as per the spec, three factors confirm this: |
---|
4602 | | - * * Availability of a HF-VSDB block in EDID (check) |
---|
4603 | | - * * Non zero Max_TMDS_Char_Rate filed in HF-VSDB (let's check) |
---|
4604 | | - * * SCDC support available (let's check) |
---|
4605 | | - * Lets check it out. |
---|
4606 | | - */ |
---|
4607 | | - |
---|
4608 | | - if (hf_vsdb[5]) { |
---|
4609 | | - /* max clock is 5000 KHz times block value */ |
---|
4610 | | - u32 max_tmds_clock = hf_vsdb[5] * 5000; |
---|
4611 | | - struct drm_scdc *scdc = &hdmi->scdc; |
---|
4612 | | - |
---|
4613 | | - if (max_tmds_clock > 340000) { |
---|
4614 | | - display->max_tmds_clock = max_tmds_clock; |
---|
4615 | | - DRM_DEBUG_KMS("HF-VSDB: max TMDS clock %d kHz\n", |
---|
4616 | | - display->max_tmds_clock); |
---|
4617 | | - } |
---|
4618 | | - |
---|
4619 | | - if (scdc->supported) { |
---|
4620 | | - scdc->scrambling.supported = true; |
---|
4621 | | - |
---|
4622 | | - /* Few sinks support scrambling for cloks < 340M */ |
---|
4623 | | - if ((hf_vsdb[6] & 0x8)) |
---|
4624 | | - scdc->scrambling.low_rates = true; |
---|
4625 | | - } |
---|
4626 | | - } |
---|
4627 | | - |
---|
4628 | | - if (hf_vsdb[7]) { |
---|
4629 | | - u8 max_frl_rate; |
---|
4630 | | - u8 dsc_max_frl_rate; |
---|
4631 | | - u8 dsc_max_slices; |
---|
4632 | | - struct drm_hdmi_dsc_cap *hdmi_dsc = &hdmi->dsc_cap; |
---|
4633 | | - |
---|
4634 | | - DRM_DEBUG_KMS("hdmi_21 sink detected. parsing edid\n"); |
---|
4635 | | - max_frl_rate = (hf_vsdb[7] & DRM_EDID_MAX_FRL_RATE_MASK) >> 4; |
---|
4636 | | - drm_get_max_frl_rate(max_frl_rate, &hdmi->max_lanes, |
---|
4637 | | - &hdmi->max_frl_rate_per_lane); |
---|
4638 | | - hdmi_dsc->v_1p2 = hf_vsdb[11] & DRM_EDID_DSC_1P2; |
---|
4639 | | - |
---|
4640 | | - if (hdmi_dsc->v_1p2) { |
---|
4641 | | - hdmi_dsc->native_420 = hf_vsdb[11] & DRM_EDID_DSC_NATIVE_420; |
---|
4642 | | - hdmi_dsc->all_bpp = hf_vsdb[11] & DRM_EDID_DSC_ALL_BPP; |
---|
4643 | | - |
---|
4644 | | - if (hf_vsdb[11] & DRM_EDID_DSC_16BPC) |
---|
4645 | | - hdmi_dsc->bpc_supported = 16; |
---|
4646 | | - else if (hf_vsdb[11] & DRM_EDID_DSC_12BPC) |
---|
4647 | | - hdmi_dsc->bpc_supported = 12; |
---|
4648 | | - else if (hf_vsdb[11] & DRM_EDID_DSC_10BPC) |
---|
4649 | | - hdmi_dsc->bpc_supported = 10; |
---|
4650 | | - else |
---|
4651 | | - hdmi_dsc->bpc_supported = 0; |
---|
4652 | | - |
---|
4653 | | - dsc_max_frl_rate = (hf_vsdb[12] & DRM_EDID_DSC_MAX_FRL_RATE_MASK) >> 4; |
---|
4654 | | - drm_get_max_frl_rate(dsc_max_frl_rate, &hdmi_dsc->max_lanes, |
---|
4655 | | - &hdmi_dsc->max_frl_rate_per_lane); |
---|
4656 | | - hdmi_dsc->total_chunk_kbytes = hf_vsdb[13] & DRM_EDID_DSC_TOTAL_CHUNK_KBYTES; |
---|
4657 | | - |
---|
4658 | | - dsc_max_slices = hf_vsdb[12] & DRM_EDID_DSC_MAX_SLICES; |
---|
4659 | | - switch (dsc_max_slices) { |
---|
4660 | | - case 1: |
---|
4661 | | - hdmi_dsc->max_slices = 1; |
---|
4662 | | - hdmi_dsc->clk_per_slice = 340; |
---|
4663 | | - break; |
---|
4664 | | - case 2: |
---|
4665 | | - hdmi_dsc->max_slices = 2; |
---|
4666 | | - hdmi_dsc->clk_per_slice = 340; |
---|
4667 | | - break; |
---|
4668 | | - case 3: |
---|
4669 | | - hdmi_dsc->max_slices = 4; |
---|
4670 | | - hdmi_dsc->clk_per_slice = 340; |
---|
4671 | | - break; |
---|
4672 | | - case 4: |
---|
4673 | | - hdmi_dsc->max_slices = 8; |
---|
4674 | | - hdmi_dsc->clk_per_slice = 340; |
---|
4675 | | - break; |
---|
4676 | | - case 5: |
---|
4677 | | - hdmi_dsc->max_slices = 8; |
---|
4678 | | - hdmi_dsc->clk_per_slice = 400; |
---|
4679 | | - break; |
---|
4680 | | - case 6: |
---|
4681 | | - hdmi_dsc->max_slices = 12; |
---|
4682 | | - hdmi_dsc->clk_per_slice = 400; |
---|
4683 | | - break; |
---|
4684 | | - case 7: |
---|
4685 | | - hdmi_dsc->max_slices = 16; |
---|
4686 | | - hdmi_dsc->clk_per_slice = 400; |
---|
4687 | | - break; |
---|
4688 | | - case 0: |
---|
4689 | | - default: |
---|
4690 | | - hdmi_dsc->max_slices = 0; |
---|
4691 | | - hdmi_dsc->clk_per_slice = 0; |
---|
4692 | | - } |
---|
4693 | | - } |
---|
4694 | | - } |
---|
4695 | | - |
---|
4696 | | - drm_parse_ycbcr420_deep_color_info(connector, hf_vsdb); |
---|
4697 | | - parse_hdmi_hf_vsdb(connector, hf_vsdb); |
---|
4698 | | -} |
---|
4699 | | - |
---|
4700 | 4719 | static void |
---|
4701 | 4720 | monitor_name(struct detailed_timing *t, void *data) |
---|
4702 | 4721 | { |
---|
4703 | | - if (t->data.other_data.type == EDID_DETAIL_MONITOR_NAME) |
---|
4704 | | - *(u8 **)data = t->data.other_data.data.str.str; |
---|
| 4722 | + if (!is_display_descriptor((const u8 *)t, EDID_DETAIL_MONITOR_NAME)) |
---|
| 4723 | + return; |
---|
| 4724 | + |
---|
| 4725 | + *(u8 **)data = t->data.other_data.data.str.str; |
---|
4705 | 4726 | } |
---|
4706 | 4727 | |
---|
4707 | 4728 | static int get_monitor_name(struct edid *edid, char name[13]) |
---|
.. | .. |
---|
4734 | 4755 | { |
---|
4735 | 4756 | int name_length; |
---|
4736 | 4757 | char buf[13]; |
---|
4737 | | - |
---|
| 4758 | + |
---|
4738 | 4759 | if (bufsize <= 0) |
---|
4739 | 4760 | return; |
---|
4740 | 4761 | |
---|
.. | .. |
---|
4799 | 4820 | |
---|
4800 | 4821 | if (cea_revision(cea) >= 3) { |
---|
4801 | 4822 | int i, start, end; |
---|
| 4823 | + int sad_count; |
---|
4802 | 4824 | |
---|
4803 | 4825 | if (cea_db_offsets(cea, &start, &end)) { |
---|
4804 | 4826 | start = 0; |
---|
.. | .. |
---|
4810 | 4832 | dbl = cea_db_payload_len(db); |
---|
4811 | 4833 | |
---|
4812 | 4834 | switch (cea_db_tag(db)) { |
---|
4813 | | - int sad_count; |
---|
4814 | | - |
---|
4815 | 4835 | case AUDIO_BLOCK: |
---|
4816 | 4836 | /* Audio Data Block, contains SADs */ |
---|
4817 | 4837 | sad_count = min(dbl / 3, 15 - total_sad_count); |
---|
.. | .. |
---|
4829 | 4849 | /* HDMI Vendor-Specific Data Block */ |
---|
4830 | 4850 | if (cea_db_is_hdmi_vsdb(db)) |
---|
4831 | 4851 | drm_parse_hdmi_vsdb_audio(connector, db); |
---|
4832 | | - /* HDMI Forum Vendor-Specific Data Block */ |
---|
4833 | | - else if (cea_db_is_hdmi_forum_vsdb(db)) |
---|
4834 | | - drm_parse_hdmi_forum_vsdb(connector, |
---|
4835 | | - db); |
---|
4836 | 4852 | break; |
---|
4837 | 4853 | default: |
---|
4838 | 4854 | break; |
---|
.. | .. |
---|
4874 | 4890 | cea = drm_find_cea_extension(edid); |
---|
4875 | 4891 | if (!cea) { |
---|
4876 | 4892 | DRM_DEBUG_KMS("SAD: no CEA Extension found\n"); |
---|
4877 | | - return -ENOENT; |
---|
| 4893 | + return 0; |
---|
4878 | 4894 | } |
---|
4879 | 4895 | |
---|
4880 | 4896 | if (cea_revision(cea) < 3) { |
---|
4881 | 4897 | DRM_DEBUG_KMS("SAD: wrong CEA revision\n"); |
---|
4882 | | - return -ENOTSUPP; |
---|
| 4898 | + return 0; |
---|
4883 | 4899 | } |
---|
4884 | 4900 | |
---|
4885 | 4901 | if (cea_db_offsets(cea, &start, &end)) { |
---|
.. | .. |
---|
4892 | 4908 | |
---|
4893 | 4909 | if (cea_db_tag(db) == AUDIO_BLOCK) { |
---|
4894 | 4910 | int j; |
---|
| 4911 | + |
---|
4895 | 4912 | dbl = cea_db_payload_len(db); |
---|
4896 | 4913 | |
---|
4897 | 4914 | count = dbl / 3; /* SAD is 3B */ |
---|
.. | .. |
---|
4935 | 4952 | cea = drm_find_cea_extension(edid); |
---|
4936 | 4953 | if (!cea) { |
---|
4937 | 4954 | DRM_DEBUG_KMS("SAD: no CEA Extension found\n"); |
---|
4938 | | - return -ENOENT; |
---|
| 4955 | + return 0; |
---|
4939 | 4956 | } |
---|
4940 | 4957 | |
---|
4941 | 4958 | if (cea_revision(cea) < 3) { |
---|
4942 | 4959 | DRM_DEBUG_KMS("SAD: wrong CEA revision\n"); |
---|
4943 | | - return -ENOTSUPP; |
---|
| 4960 | + return 0; |
---|
4944 | 4961 | } |
---|
4945 | 4962 | |
---|
4946 | 4963 | if (cea_db_offsets(cea, &start, &end)) { |
---|
.. | .. |
---|
5016 | 5033 | * |
---|
5017 | 5034 | * Parse the CEA extension according to CEA-861-B. |
---|
5018 | 5035 | * |
---|
| 5036 | + * Drivers that have added the modes parsed from EDID to drm_display_info |
---|
| 5037 | + * should use &drm_display_info.is_hdmi instead of calling this function. |
---|
| 5038 | + * |
---|
5019 | 5039 | * Return: True if the monitor is HDMI, false if not or unknown. |
---|
5020 | 5040 | */ |
---|
5021 | 5041 | bool drm_detect_hdmi_monitor(struct edid *edid) |
---|
.. | .. |
---|
5067 | 5087 | if (!edid_ext) |
---|
5068 | 5088 | goto end; |
---|
5069 | 5089 | |
---|
5070 | | - has_audio = ((edid_ext[3] & EDID_BASIC_AUDIO) != 0); |
---|
| 5090 | + has_audio = (edid_ext[0] == CEA_EXT && |
---|
| 5091 | + (edid_ext[3] & EDID_BASIC_AUDIO) != 0); |
---|
5071 | 5092 | |
---|
5072 | 5093 | if (has_audio) { |
---|
5073 | 5094 | DRM_DEBUG_KMS("Monitor has basic audio support\n"); |
---|
.. | .. |
---|
5091 | 5112 | } |
---|
5092 | 5113 | EXPORT_SYMBOL(drm_detect_monitor_audio); |
---|
5093 | 5114 | |
---|
5094 | | -/** |
---|
5095 | | - * drm_rgb_quant_range_selectable - is RGB quantization range selectable? |
---|
5096 | | - * @edid: EDID block to scan |
---|
5097 | | - * |
---|
5098 | | - * Check whether the monitor reports the RGB quantization range selection |
---|
5099 | | - * as supported. The AVI infoframe can then be used to inform the monitor |
---|
5100 | | - * which quantization range (full or limited) is used. |
---|
5101 | | - * |
---|
5102 | | - * Return: True if the RGB quantization range is selectable, false otherwise. |
---|
5103 | | - */ |
---|
5104 | | -bool drm_rgb_quant_range_selectable(struct edid *edid) |
---|
5105 | | -{ |
---|
5106 | | - u8 *edid_ext; |
---|
5107 | | - int i, start, end; |
---|
5108 | | - |
---|
5109 | | - edid_ext = drm_find_cea_extension(edid); |
---|
5110 | | - if (!edid_ext) |
---|
5111 | | - return false; |
---|
5112 | | - |
---|
5113 | | - if (cea_db_offsets(edid_ext, &start, &end)) |
---|
5114 | | - return false; |
---|
5115 | | - |
---|
5116 | | - for_each_cea_db(edid_ext, i, start, end) { |
---|
5117 | | - if (cea_db_tag(&edid_ext[i]) == USE_EXTENDED_TAG && |
---|
5118 | | - cea_db_payload_len(&edid_ext[i]) == 2 && |
---|
5119 | | - cea_db_extended_tag(&edid_ext[i]) == |
---|
5120 | | - EXT_VIDEO_CAPABILITY_BLOCK) { |
---|
5121 | | - DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", edid_ext[i + 2]); |
---|
5122 | | - return edid_ext[i + 2] & EDID_CEA_VCDB_QS; |
---|
5123 | | - } |
---|
5124 | | - } |
---|
5125 | | - |
---|
5126 | | - return false; |
---|
5127 | | -} |
---|
5128 | | -EXPORT_SYMBOL(drm_rgb_quant_range_selectable); |
---|
5129 | 5115 | |
---|
5130 | 5116 | /** |
---|
5131 | 5117 | * drm_default_rgb_quant_range - default RGB quantization range |
---|
.. | .. |
---|
5145 | 5131 | HDMI_QUANTIZATION_RANGE_FULL; |
---|
5146 | 5132 | } |
---|
5147 | 5133 | EXPORT_SYMBOL(drm_default_rgb_quant_range); |
---|
| 5134 | + |
---|
| 5135 | +static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db) |
---|
| 5136 | +{ |
---|
| 5137 | + struct drm_display_info *info = &connector->display_info; |
---|
| 5138 | + |
---|
| 5139 | + DRM_DEBUG_KMS("CEA VCDB 0x%02x\n", db[2]); |
---|
| 5140 | + |
---|
| 5141 | + if (db[2] & EDID_CEA_VCDB_QS) |
---|
| 5142 | + info->rgb_quant_range_selectable = true; |
---|
| 5143 | +} |
---|
| 5144 | + |
---|
| 5145 | +#ifdef CONFIG_NO_GKI |
---|
| 5146 | +static |
---|
| 5147 | +void drm_get_max_frl_rate(int max_frl_rate, u8 *max_lanes, u8 *max_rate_per_lane) |
---|
| 5148 | +{ |
---|
| 5149 | + switch (max_frl_rate) { |
---|
| 5150 | + case 1: |
---|
| 5151 | + *max_lanes = 3; |
---|
| 5152 | + *max_rate_per_lane = 3; |
---|
| 5153 | + break; |
---|
| 5154 | + case 2: |
---|
| 5155 | + *max_lanes = 3; |
---|
| 5156 | + *max_rate_per_lane = 6; |
---|
| 5157 | + break; |
---|
| 5158 | + case 3: |
---|
| 5159 | + *max_lanes = 4; |
---|
| 5160 | + *max_rate_per_lane = 6; |
---|
| 5161 | + break; |
---|
| 5162 | + case 4: |
---|
| 5163 | + *max_lanes = 4; |
---|
| 5164 | + *max_rate_per_lane = 8; |
---|
| 5165 | + break; |
---|
| 5166 | + case 5: |
---|
| 5167 | + *max_lanes = 4; |
---|
| 5168 | + *max_rate_per_lane = 10; |
---|
| 5169 | + break; |
---|
| 5170 | + case 6: |
---|
| 5171 | + *max_lanes = 4; |
---|
| 5172 | + *max_rate_per_lane = 12; |
---|
| 5173 | + break; |
---|
| 5174 | + case 0: |
---|
| 5175 | + default: |
---|
| 5176 | + *max_lanes = 0; |
---|
| 5177 | + *max_rate_per_lane = 0; |
---|
| 5178 | + } |
---|
| 5179 | +} |
---|
| 5180 | +#endif |
---|
| 5181 | + |
---|
| 5182 | +static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector, |
---|
| 5183 | + const u8 *db) |
---|
| 5184 | +{ |
---|
| 5185 | + u8 dc_mask; |
---|
| 5186 | + struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; |
---|
| 5187 | + |
---|
| 5188 | + dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK; |
---|
| 5189 | + hdmi->y420_dc_modes = dc_mask; |
---|
| 5190 | +} |
---|
| 5191 | + |
---|
| 5192 | +static void drm_parse_hdmi_forum_vsdb(struct drm_connector *connector, |
---|
| 5193 | + const u8 *hf_vsdb) |
---|
| 5194 | +{ |
---|
| 5195 | + struct drm_display_info *display = &connector->display_info; |
---|
| 5196 | + struct drm_hdmi_info *hdmi = &display->hdmi; |
---|
| 5197 | + |
---|
| 5198 | + display->has_hdmi_infoframe = true; |
---|
| 5199 | + |
---|
| 5200 | + if (hf_vsdb[6] & 0x80) { |
---|
| 5201 | + hdmi->scdc.supported = true; |
---|
| 5202 | + if (hf_vsdb[6] & 0x40) |
---|
| 5203 | + hdmi->scdc.read_request = true; |
---|
| 5204 | + } |
---|
| 5205 | + |
---|
| 5206 | + /* |
---|
| 5207 | + * All HDMI 2.0 monitors must support scrambling at rates > 340 MHz. |
---|
| 5208 | + * And as per the spec, three factors confirm this: |
---|
| 5209 | + * * Availability of a HF-VSDB block in EDID (check) |
---|
| 5210 | + * * Non zero Max_TMDS_Char_Rate filed in HF-VSDB (let's check) |
---|
| 5211 | + * * SCDC support available (let's check) |
---|
| 5212 | + * Lets check it out. |
---|
| 5213 | + */ |
---|
| 5214 | + |
---|
| 5215 | + if (hf_vsdb[5]) { |
---|
| 5216 | + /* max clock is 5000 KHz times block value */ |
---|
| 5217 | + u32 max_tmds_clock = hf_vsdb[5] * 5000; |
---|
| 5218 | + struct drm_scdc *scdc = &hdmi->scdc; |
---|
| 5219 | + |
---|
| 5220 | + if (max_tmds_clock > 340000) { |
---|
| 5221 | + display->max_tmds_clock = max_tmds_clock; |
---|
| 5222 | + DRM_DEBUG_KMS("HF-VSDB: max TMDS clock %d kHz\n", |
---|
| 5223 | + display->max_tmds_clock); |
---|
| 5224 | + } |
---|
| 5225 | + |
---|
| 5226 | + if (scdc->supported) { |
---|
| 5227 | + scdc->scrambling.supported = true; |
---|
| 5228 | + |
---|
| 5229 | + /* Few sinks support scrambling for clocks < 340M */ |
---|
| 5230 | + if ((hf_vsdb[6] & 0x8)) |
---|
| 5231 | + scdc->scrambling.low_rates = true; |
---|
| 5232 | + } |
---|
| 5233 | + } |
---|
| 5234 | + |
---|
| 5235 | +#ifdef CONFIG_NO_GKI |
---|
| 5236 | + if (hf_vsdb[7]) { |
---|
| 5237 | + u8 max_frl_rate; |
---|
| 5238 | + u8 dsc_max_frl_rate; |
---|
| 5239 | + u8 dsc_max_slices; |
---|
| 5240 | + struct drm_hdmi_dsc_cap *hdmi_dsc = &hdmi->dsc_cap; |
---|
| 5241 | + |
---|
| 5242 | + DRM_DEBUG_KMS("hdmi_21 sink detected. parsing edid\n"); |
---|
| 5243 | + max_frl_rate = (hf_vsdb[7] & DRM_EDID_MAX_FRL_RATE_MASK) >> 4; |
---|
| 5244 | + drm_get_max_frl_rate(max_frl_rate, &hdmi->max_lanes, |
---|
| 5245 | + &hdmi->max_frl_rate_per_lane); |
---|
| 5246 | + hdmi_dsc->v_1p2 = hf_vsdb[11] & DRM_EDID_DSC_1P2; |
---|
| 5247 | + |
---|
| 5248 | + if (hdmi_dsc->v_1p2) { |
---|
| 5249 | + hdmi_dsc->native_420 = hf_vsdb[11] & DRM_EDID_DSC_NATIVE_420; |
---|
| 5250 | + hdmi_dsc->all_bpp = hf_vsdb[11] & DRM_EDID_DSC_ALL_BPP; |
---|
| 5251 | + |
---|
| 5252 | + if (hf_vsdb[11] & DRM_EDID_DSC_16BPC) |
---|
| 5253 | + hdmi_dsc->bpc_supported = 16; |
---|
| 5254 | + else if (hf_vsdb[11] & DRM_EDID_DSC_12BPC) |
---|
| 5255 | + hdmi_dsc->bpc_supported = 12; |
---|
| 5256 | + else if (hf_vsdb[11] & DRM_EDID_DSC_10BPC) |
---|
| 5257 | + hdmi_dsc->bpc_supported = 10; |
---|
| 5258 | + else |
---|
| 5259 | + hdmi_dsc->bpc_supported = 0; |
---|
| 5260 | + |
---|
| 5261 | + dsc_max_frl_rate = (hf_vsdb[12] & DRM_EDID_DSC_MAX_FRL_RATE_MASK) >> 4; |
---|
| 5262 | + drm_get_max_frl_rate(dsc_max_frl_rate, &hdmi_dsc->max_lanes, |
---|
| 5263 | + &hdmi_dsc->max_frl_rate_per_lane); |
---|
| 5264 | + hdmi_dsc->total_chunk_kbytes = hf_vsdb[13] & DRM_EDID_DSC_TOTAL_CHUNK_KBYTES; |
---|
| 5265 | + |
---|
| 5266 | + dsc_max_slices = hf_vsdb[12] & DRM_EDID_DSC_MAX_SLICES; |
---|
| 5267 | + switch (dsc_max_slices) { |
---|
| 5268 | + case 1: |
---|
| 5269 | + hdmi_dsc->max_slices = 1; |
---|
| 5270 | + hdmi_dsc->clk_per_slice = 340; |
---|
| 5271 | + break; |
---|
| 5272 | + case 2: |
---|
| 5273 | + hdmi_dsc->max_slices = 2; |
---|
| 5274 | + hdmi_dsc->clk_per_slice = 340; |
---|
| 5275 | + break; |
---|
| 5276 | + case 3: |
---|
| 5277 | + hdmi_dsc->max_slices = 4; |
---|
| 5278 | + hdmi_dsc->clk_per_slice = 340; |
---|
| 5279 | + break; |
---|
| 5280 | + case 4: |
---|
| 5281 | + hdmi_dsc->max_slices = 8; |
---|
| 5282 | + hdmi_dsc->clk_per_slice = 340; |
---|
| 5283 | + break; |
---|
| 5284 | + case 5: |
---|
| 5285 | + hdmi_dsc->max_slices = 8; |
---|
| 5286 | + hdmi_dsc->clk_per_slice = 400; |
---|
| 5287 | + break; |
---|
| 5288 | + case 6: |
---|
| 5289 | + hdmi_dsc->max_slices = 12; |
---|
| 5290 | + hdmi_dsc->clk_per_slice = 400; |
---|
| 5291 | + break; |
---|
| 5292 | + case 7: |
---|
| 5293 | + hdmi_dsc->max_slices = 16; |
---|
| 5294 | + hdmi_dsc->clk_per_slice = 400; |
---|
| 5295 | + break; |
---|
| 5296 | + case 0: |
---|
| 5297 | + default: |
---|
| 5298 | + hdmi_dsc->max_slices = 0; |
---|
| 5299 | + hdmi_dsc->clk_per_slice = 0; |
---|
| 5300 | + } |
---|
| 5301 | + } |
---|
| 5302 | + } |
---|
| 5303 | +#endif |
---|
| 5304 | + |
---|
| 5305 | + drm_parse_ycbcr420_deep_color_info(connector, hf_vsdb); |
---|
| 5306 | +} |
---|
5148 | 5307 | |
---|
5149 | 5308 | static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector, |
---|
5150 | 5309 | const u8 *hdmi) |
---|
.. | .. |
---|
5191 | 5350 | |
---|
5192 | 5351 | /* YCRCB444 is optional according to spec. */ |
---|
5193 | 5352 | if (hdmi[6] & DRM_EDID_HDMI_DC_Y444) { |
---|
5194 | | - info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_Y444; |
---|
5195 | 5353 | DRM_DEBUG("%s: HDMI sink does YCRCB444 in deep color.\n", |
---|
5196 | 5354 | connector->name); |
---|
5197 | 5355 | } |
---|
.. | .. |
---|
5211 | 5369 | { |
---|
5212 | 5370 | struct drm_display_info *info = &connector->display_info; |
---|
5213 | 5371 | u8 len = cea_db_payload_len(db); |
---|
| 5372 | + |
---|
| 5373 | + info->is_hdmi = true; |
---|
5214 | 5374 | |
---|
5215 | 5375 | if (len >= 6) |
---|
5216 | 5376 | info->dvi_dual = db[6] & 1; |
---|
.. | .. |
---|
5257 | 5417 | drm_parse_hdmi_forum_vsdb(connector, db); |
---|
5258 | 5418 | if (cea_db_is_y420cmdb(db)) |
---|
5259 | 5419 | drm_parse_y420cmdb_bitmap(connector, db); |
---|
| 5420 | + if (cea_db_is_vcdb(db)) |
---|
| 5421 | + drm_parse_vcdb(connector, db); |
---|
5260 | 5422 | if (cea_db_is_hdmi_hdr_metadata_block(db)) |
---|
5261 | 5423 | drm_parse_hdr_metadata_block(connector, db); |
---|
5262 | | - if (cea_db_is_hdmi_colorimetry_data_block(db)) |
---|
5263 | | - drm_parse_colorimetry_data_block(connector, db); |
---|
5264 | 5424 | } |
---|
| 5425 | +} |
---|
| 5426 | + |
---|
| 5427 | +static |
---|
| 5428 | +void get_monitor_range(struct detailed_timing *timing, |
---|
| 5429 | + void *info_monitor_range) |
---|
| 5430 | +{ |
---|
| 5431 | + struct drm_monitor_range_info *monitor_range = info_monitor_range; |
---|
| 5432 | + const struct detailed_non_pixel *data = &timing->data.other_data; |
---|
| 5433 | + const struct detailed_data_monitor_range *range = &data->data.range; |
---|
| 5434 | + |
---|
| 5435 | + if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_MONITOR_RANGE)) |
---|
| 5436 | + return; |
---|
| 5437 | + |
---|
| 5438 | + /* |
---|
| 5439 | + * Check for flag range limits only. If flag == 1 then |
---|
| 5440 | + * no additional timing information provided. |
---|
| 5441 | + * Default GTF, GTF Secondary curve and CVT are not |
---|
| 5442 | + * supported |
---|
| 5443 | + */ |
---|
| 5444 | + if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG) |
---|
| 5445 | + return; |
---|
| 5446 | + |
---|
| 5447 | + monitor_range->min_vfreq = range->min_vfreq; |
---|
| 5448 | + monitor_range->max_vfreq = range->max_vfreq; |
---|
| 5449 | +} |
---|
| 5450 | + |
---|
| 5451 | +static |
---|
| 5452 | +void drm_get_monitor_range(struct drm_connector *connector, |
---|
| 5453 | + const struct edid *edid) |
---|
| 5454 | +{ |
---|
| 5455 | + struct drm_display_info *info = &connector->display_info; |
---|
| 5456 | + |
---|
| 5457 | + if (!version_greater(edid, 1, 1)) |
---|
| 5458 | + return; |
---|
| 5459 | + |
---|
| 5460 | + drm_for_each_detailed_block((u8 *)edid, get_monitor_range, |
---|
| 5461 | + &info->monitor_range); |
---|
| 5462 | + |
---|
| 5463 | + DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n", |
---|
| 5464 | + info->monitor_range.min_vfreq, |
---|
| 5465 | + info->monitor_range.max_vfreq); |
---|
5265 | 5466 | } |
---|
5266 | 5467 | |
---|
5267 | 5468 | /* A connector has no EDID information, so we've got no EDID to compute quirks from. Reset |
---|
.. | .. |
---|
5280 | 5481 | info->cea_rev = 0; |
---|
5281 | 5482 | info->max_tmds_clock = 0; |
---|
5282 | 5483 | info->dvi_dual = false; |
---|
5283 | | - info->edid_hdmi_dc_modes = 0; |
---|
| 5484 | + info->is_hdmi = false; |
---|
5284 | 5485 | info->has_hdmi_infoframe = false; |
---|
| 5486 | + info->rgb_quant_range_selectable = false; |
---|
5285 | 5487 | memset(&info->hdmi, 0, sizeof(info->hdmi)); |
---|
5286 | 5488 | |
---|
5287 | 5489 | info->non_desktop = 0; |
---|
| 5490 | + memset(&info->monitor_range, 0, sizeof(info->monitor_range)); |
---|
5288 | 5491 | } |
---|
5289 | | - |
---|
5290 | | -static void |
---|
5291 | | -drm_hdmi_extract_vsdbs_info(struct drm_connector *connector, |
---|
5292 | | - const struct edid *edid) |
---|
5293 | | -{ |
---|
5294 | | - const u8 *cea = drm_find_cea_extension(edid); |
---|
5295 | | - const u8 *db = NULL; |
---|
5296 | | - |
---|
5297 | | - if (cea && cea_revision(cea) >= 3) { |
---|
5298 | | - int i, start, end; |
---|
5299 | | - |
---|
5300 | | - if (cea_db_offsets(cea, &start, &end)) |
---|
5301 | | - return; |
---|
5302 | | - |
---|
5303 | | - for_each_cea_db(cea, i, start, end) { |
---|
5304 | | - db = &cea[i]; |
---|
5305 | | - |
---|
5306 | | - if (cea_db_tag(db) == VENDOR_BLOCK) { |
---|
5307 | | - /* HDMI Vendor-Specific Data Block */ |
---|
5308 | | - if (cea_db_is_hdmi_vsdb(db)) { |
---|
5309 | | - drm_parse_hdmi_vsdb_video( |
---|
5310 | | - connector, db); |
---|
5311 | | - drm_parse_hdmi_vsdb_audio( |
---|
5312 | | - connector, db); |
---|
5313 | | - } |
---|
5314 | | - /* HDMI Forum Vendor-Specific Data Block */ |
---|
5315 | | - else if (cea_db_is_hdmi_forum_vsdb(db)) |
---|
5316 | | - drm_parse_hdmi_forum_vsdb(connector, |
---|
5317 | | - db); |
---|
5318 | | - } |
---|
5319 | | - } |
---|
5320 | | - } |
---|
5321 | | -} |
---|
5322 | | - |
---|
5323 | 5492 | |
---|
5324 | 5493 | u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid) |
---|
5325 | 5494 | { |
---|
.. | .. |
---|
5334 | 5503 | |
---|
5335 | 5504 | info->non_desktop = !!(quirks & EDID_QUIRK_NON_DESKTOP); |
---|
5336 | 5505 | |
---|
5337 | | - DRM_DEBUG_KMS("non_desktop set to %d\n", info->non_desktop); |
---|
| 5506 | + drm_get_monitor_range(connector, edid); |
---|
5338 | 5507 | |
---|
5339 | | - memset(&info->hdmi, 0, sizeof(info->hdmi)); |
---|
| 5508 | + DRM_DEBUG_KMS("non_desktop set to %d\n", info->non_desktop); |
---|
5340 | 5509 | |
---|
5341 | 5510 | if (edid->revision < 3) |
---|
5342 | 5511 | return quirks; |
---|
.. | .. |
---|
5354 | 5523 | * tells us to assume 8 bpc color depth if the EDID doesn't have |
---|
5355 | 5524 | * extensions which tell otherwise. |
---|
5356 | 5525 | */ |
---|
5357 | | - if ((info->bpc == 0) && (edid->revision < 4) && |
---|
5358 | | - (edid->input & DRM_EDID_DIGITAL_TYPE_DVI)) { |
---|
| 5526 | + if (info->bpc == 0 && edid->revision == 3 && |
---|
| 5527 | + edid->input & DRM_EDID_DIGITAL_DFP_1_X) { |
---|
5359 | 5528 | info->bpc = 8; |
---|
5360 | 5529 | DRM_DEBUG("%s: Assigning DFP sink color depth as %d bpc.\n", |
---|
5361 | 5530 | connector->name, info->bpc); |
---|
5362 | 5531 | } |
---|
5363 | | - |
---|
5364 | | - /* Extract audio and video latency fields for the sink */ |
---|
5365 | | - drm_hdmi_extract_vsdbs_info(connector, edid); |
---|
5366 | | - /* Extract info from extended tag blocks */ |
---|
5367 | | - drm_hdmi_extract_extended_blk_info(connector, edid); |
---|
5368 | 5532 | |
---|
5369 | 5533 | /* Only defined for 1.4 with digital displays */ |
---|
5370 | 5534 | if (edid->revision < 4) |
---|
.. | .. |
---|
5407 | 5571 | |
---|
5408 | 5572 | static int validate_displayid(u8 *displayid, int length, int idx) |
---|
5409 | 5573 | { |
---|
5410 | | - int i; |
---|
| 5574 | + int i, dispid_length; |
---|
5411 | 5575 | u8 csum = 0; |
---|
5412 | 5576 | struct displayid_hdr *base; |
---|
5413 | 5577 | |
---|
.. | .. |
---|
5416 | 5580 | DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n", |
---|
5417 | 5581 | base->rev, base->bytes, base->prod_id, base->ext_count); |
---|
5418 | 5582 | |
---|
5419 | | - if (base->bytes + 5 > length - idx) |
---|
| 5583 | + /* +1 for DispID checksum */ |
---|
| 5584 | + dispid_length = sizeof(*base) + base->bytes + 1; |
---|
| 5585 | + if (dispid_length > length - idx) |
---|
5420 | 5586 | return -EINVAL; |
---|
5421 | | - for (i = idx; i <= base->bytes + 5; i++) { |
---|
5422 | | - csum += displayid[i]; |
---|
5423 | | - } |
---|
| 5587 | + |
---|
| 5588 | + for (i = 0; i < dispid_length; i++) |
---|
| 5589 | + csum += displayid[idx + i]; |
---|
5424 | 5590 | if (csum) { |
---|
5425 | 5591 | DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum); |
---|
5426 | 5592 | return -EINVAL; |
---|
5427 | 5593 | } |
---|
| 5594 | + |
---|
5428 | 5595 | return 0; |
---|
5429 | 5596 | } |
---|
5430 | 5597 | |
---|
.. | .. |
---|
5445 | 5612 | unsigned vsync_width = (timings->vsw[0] | timings->vsw[1] << 8) + 1; |
---|
5446 | 5613 | bool hsync_positive = (timings->hsync[1] >> 7) & 0x1; |
---|
5447 | 5614 | bool vsync_positive = (timings->vsync[1] >> 7) & 0x1; |
---|
| 5615 | + |
---|
5448 | 5616 | mode = drm_mode_create(dev); |
---|
5449 | 5617 | if (!mode) |
---|
5450 | 5618 | return NULL; |
---|
.. | .. |
---|
5467 | 5635 | |
---|
5468 | 5636 | if (timings->flags & 0x80) |
---|
5469 | 5637 | mode->type |= DRM_MODE_TYPE_PREFERRED; |
---|
5470 | | - mode->vrefresh = drm_mode_vrefresh(mode); |
---|
5471 | 5638 | drm_mode_set_name(mode); |
---|
5472 | 5639 | |
---|
5473 | 5640 | return mode; |
---|
.. | .. |
---|
5503 | 5670 | struct edid *edid) |
---|
5504 | 5671 | { |
---|
5505 | 5672 | u8 *displayid; |
---|
5506 | | - int ret; |
---|
5507 | | - int idx = 1; |
---|
5508 | | - int length = EDID_LENGTH; |
---|
| 5673 | + int length, idx; |
---|
5509 | 5674 | struct displayid_block *block; |
---|
5510 | 5675 | int num_modes = 0; |
---|
| 5676 | + int ext_index = 0; |
---|
5511 | 5677 | |
---|
5512 | | - displayid = drm_find_displayid_extension(edid); |
---|
5513 | | - if (!displayid) |
---|
5514 | | - return 0; |
---|
5515 | | - |
---|
5516 | | - ret = validate_displayid(displayid, length, idx); |
---|
5517 | | - if (ret) |
---|
5518 | | - return 0; |
---|
5519 | | - |
---|
5520 | | - idx += sizeof(struct displayid_hdr); |
---|
5521 | | - while (block = (struct displayid_block *)&displayid[idx], |
---|
5522 | | - idx + sizeof(struct displayid_block) <= length && |
---|
5523 | | - idx + sizeof(struct displayid_block) + block->num_bytes <= length && |
---|
5524 | | - block->num_bytes > 0) { |
---|
5525 | | - idx += block->num_bytes + sizeof(struct displayid_block); |
---|
5526 | | - switch (block->tag) { |
---|
5527 | | - case DATA_BLOCK_TYPE_1_DETAILED_TIMING: |
---|
5528 | | - num_modes += add_displayid_detailed_1_modes(connector, block); |
---|
| 5678 | + for (;;) { |
---|
| 5679 | + displayid = drm_find_displayid_extension(edid, &length, &idx, |
---|
| 5680 | + &ext_index); |
---|
| 5681 | + if (!displayid) |
---|
5529 | 5682 | break; |
---|
| 5683 | + |
---|
| 5684 | + idx += sizeof(struct displayid_hdr); |
---|
| 5685 | + for_each_displayid_db(displayid, block, idx, length) { |
---|
| 5686 | + switch (block->tag) { |
---|
| 5687 | + case DATA_BLOCK_TYPE_1_DETAILED_TIMING: |
---|
| 5688 | + num_modes += add_displayid_detailed_1_modes(connector, block); |
---|
| 5689 | + break; |
---|
| 5690 | + } |
---|
5530 | 5691 | } |
---|
5531 | 5692 | } |
---|
| 5693 | + |
---|
5532 | 5694 | return num_modes; |
---|
5533 | 5695 | } |
---|
5534 | 5696 | |
---|
.. | .. |
---|
5554 | 5716 | } |
---|
5555 | 5717 | if (!drm_edid_is_valid(edid)) { |
---|
5556 | 5718 | clear_eld(connector); |
---|
5557 | | - dev_warn(connector->dev->dev, "%s: EDID invalid.\n", |
---|
| 5719 | + drm_warn(connector->dev, "%s: EDID invalid.\n", |
---|
5558 | 5720 | connector->name); |
---|
5559 | 5721 | return 0; |
---|
5560 | 5722 | } |
---|
.. | .. |
---|
5637 | 5799 | |
---|
5638 | 5800 | for (i = 0; i < count; i++) { |
---|
5639 | 5801 | const struct drm_display_mode *ptr = &drm_dmt_modes[i]; |
---|
| 5802 | + |
---|
5640 | 5803 | if (hdisplay && vdisplay) { |
---|
5641 | 5804 | /* |
---|
5642 | 5805 | * Only when two are valid, they will be used to check |
---|
.. | .. |
---|
5681 | 5844 | } |
---|
5682 | 5845 | EXPORT_SYMBOL(drm_set_preferred_mode); |
---|
5683 | 5846 | |
---|
| 5847 | +static bool is_hdmi2_sink(const struct drm_connector *connector) |
---|
| 5848 | +{ |
---|
| 5849 | + /* |
---|
| 5850 | + * FIXME: sil-sii8620 doesn't have a connector around when |
---|
| 5851 | + * we need one, so we have to be prepared for a NULL connector. |
---|
| 5852 | + */ |
---|
| 5853 | + if (!connector) |
---|
| 5854 | + return true; |
---|
| 5855 | + |
---|
| 5856 | + return connector->display_info.hdmi.scdc.supported || |
---|
| 5857 | + connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420; |
---|
| 5858 | +} |
---|
| 5859 | + |
---|
5684 | 5860 | static inline bool is_eotf_supported(u8 output_eotf, u8 sink_eotf) |
---|
5685 | 5861 | { |
---|
5686 | 5862 | return sink_eotf & BIT(output_eotf); |
---|
.. | .. |
---|
5690 | 5866 | * drm_hdmi_infoframe_set_hdr_metadata() - fill an HDMI DRM infoframe with |
---|
5691 | 5867 | * HDR metadata from userspace |
---|
5692 | 5868 | * @frame: HDMI DRM infoframe |
---|
5693 | | - * @hdr_metadata: hdr_source_metadata info from userspace |
---|
| 5869 | + * @conn_state: Connector state containing HDR metadata |
---|
5694 | 5870 | * |
---|
5695 | 5871 | * Return: 0 on success or a negative error code on failure. |
---|
5696 | 5872 | */ |
---|
.. | .. |
---|
5753 | 5929 | } |
---|
5754 | 5930 | EXPORT_SYMBOL(drm_hdmi_infoframe_set_hdr_metadata); |
---|
5755 | 5931 | |
---|
5756 | | -/** |
---|
5757 | | - * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with |
---|
5758 | | - * data from a DRM display mode |
---|
5759 | | - * @frame: HDMI AVI infoframe |
---|
5760 | | - * @mode: DRM display mode |
---|
5761 | | - * @is_hdmi2_sink: Sink is HDMI 2.0 compliant |
---|
5762 | | - * |
---|
5763 | | - * Return: 0 on success or a negative error code on failure. |
---|
5764 | | - */ |
---|
5765 | | -int |
---|
5766 | | -drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, |
---|
5767 | | - const struct drm_display_mode *mode, |
---|
5768 | | - bool is_hdmi2_sink) |
---|
| 5932 | +static u8 drm_mode_hdmi_vic(const struct drm_connector *connector, |
---|
| 5933 | + const struct drm_display_mode *mode) |
---|
5769 | 5934 | { |
---|
5770 | | - enum hdmi_picture_aspect picture_aspect; |
---|
5771 | | - int err; |
---|
| 5935 | + bool has_hdmi_infoframe = connector ? |
---|
| 5936 | + connector->display_info.has_hdmi_infoframe : false; |
---|
5772 | 5937 | |
---|
5773 | | - if (!frame || !mode) |
---|
5774 | | - return -EINVAL; |
---|
| 5938 | + if (!has_hdmi_infoframe) |
---|
| 5939 | + return 0; |
---|
5775 | 5940 | |
---|
5776 | | - err = hdmi_avi_infoframe_init(frame); |
---|
5777 | | - if (err < 0) |
---|
5778 | | - return err; |
---|
| 5941 | + /* No HDMI VIC when signalling 3D video format */ |
---|
| 5942 | + if (mode->flags & DRM_MODE_FLAG_3D_MASK) |
---|
| 5943 | + return 0; |
---|
5779 | 5944 | |
---|
5780 | | - if (mode->flags & DRM_MODE_FLAG_DBLCLK) |
---|
5781 | | - frame->pixel_repeat = 1; |
---|
| 5945 | + return drm_match_hdmi_mode(mode); |
---|
| 5946 | +} |
---|
5782 | 5947 | |
---|
5783 | | - frame->video_code = drm_match_cea_mode(mode); |
---|
5784 | | - |
---|
5785 | | - /* |
---|
5786 | | - * HDMI 1.4 VIC range: 1 <= VIC <= 64 (CEA-861-D) but |
---|
5787 | | - * HDMI 2.0 VIC range: 1 <= VIC <= 107 (CEA-861-F). So we |
---|
5788 | | - * have to make sure we dont break HDMI 1.4 sinks. |
---|
5789 | | - */ |
---|
5790 | | - if (!is_hdmi2_sink && frame->video_code > 64) |
---|
5791 | | - frame->video_code = 0; |
---|
5792 | | - |
---|
| 5948 | +static u8 drm_mode_cea_vic(const struct drm_connector *connector, |
---|
| 5949 | + const struct drm_display_mode *mode) |
---|
| 5950 | +{ |
---|
5793 | 5951 | /* |
---|
5794 | 5952 | * HDMI spec says if a mode is found in HDMI 1.4b 4K modes |
---|
5795 | 5953 | * we should send its VIC in vendor infoframes, else send the |
---|
5796 | 5954 | * VIC in AVI infoframes. Lets check if this mode is present in |
---|
5797 | 5955 | * HDMI 1.4b 4K modes |
---|
5798 | 5956 | */ |
---|
5799 | | - if (frame->video_code) { |
---|
5800 | | - u8 vendor_if_vic = drm_match_hdmi_mode(mode); |
---|
5801 | | - bool is_s3d = mode->flags & DRM_MODE_FLAG_3D_MASK; |
---|
| 5957 | + if (drm_mode_hdmi_vic(connector, mode)) |
---|
| 5958 | + return 0; |
---|
5802 | 5959 | |
---|
5803 | | - if (drm_valid_hdmi_vic(vendor_if_vic) && !is_s3d) |
---|
5804 | | - frame->video_code = 0; |
---|
5805 | | - } |
---|
| 5960 | + return drm_match_cea_mode(mode); |
---|
| 5961 | +} |
---|
| 5962 | + |
---|
| 5963 | +/* |
---|
| 5964 | + * Avoid sending VICs defined in HDMI 2.0 in AVI infoframes to sinks that |
---|
| 5965 | + * conform to HDMI 1.4. |
---|
| 5966 | + * |
---|
| 5967 | + * HDMI 1.4 (CTA-861-D) VIC range: [1..64] |
---|
| 5968 | + * HDMI 2.0 (CTA-861-F) VIC range: [1..107] |
---|
| 5969 | + */ |
---|
| 5970 | +static u8 vic_for_avi_infoframe(const struct drm_connector *connector, u8 vic) |
---|
| 5971 | +{ |
---|
| 5972 | + if (!is_hdmi2_sink(connector) && vic > 64) |
---|
| 5973 | + return 0; |
---|
| 5974 | + |
---|
| 5975 | + return vic; |
---|
| 5976 | +} |
---|
| 5977 | + |
---|
| 5978 | +/** |
---|
| 5979 | + * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with |
---|
| 5980 | + * data from a DRM display mode |
---|
| 5981 | + * @frame: HDMI AVI infoframe |
---|
| 5982 | + * @connector: the connector |
---|
| 5983 | + * @mode: DRM display mode |
---|
| 5984 | + * |
---|
| 5985 | + * Return: 0 on success or a negative error code on failure. |
---|
| 5986 | + */ |
---|
| 5987 | +int |
---|
| 5988 | +drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, |
---|
| 5989 | + const struct drm_connector *connector, |
---|
| 5990 | + const struct drm_display_mode *mode) |
---|
| 5991 | +{ |
---|
| 5992 | + enum hdmi_picture_aspect picture_aspect; |
---|
| 5993 | + u8 vic, hdmi_vic; |
---|
| 5994 | + |
---|
| 5995 | + if (!frame || !mode) |
---|
| 5996 | + return -EINVAL; |
---|
| 5997 | + |
---|
| 5998 | + hdmi_avi_infoframe_init(frame); |
---|
| 5999 | + |
---|
| 6000 | + if (mode->flags & DRM_MODE_FLAG_DBLCLK) |
---|
| 6001 | + frame->pixel_repeat = 1; |
---|
| 6002 | + |
---|
| 6003 | + vic = drm_mode_cea_vic(connector, mode); |
---|
| 6004 | + hdmi_vic = drm_mode_hdmi_vic(connector, mode); |
---|
5806 | 6005 | |
---|
5807 | 6006 | frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE; |
---|
5808 | 6007 | |
---|
.. | .. |
---|
5816 | 6015 | |
---|
5817 | 6016 | /* |
---|
5818 | 6017 | * Populate picture aspect ratio from either |
---|
5819 | | - * user input (if specified) or from the CEA mode list. |
---|
| 6018 | + * user input (if specified) or from the CEA/HDMI mode lists. |
---|
5820 | 6019 | */ |
---|
5821 | 6020 | picture_aspect = mode->picture_aspect_ratio; |
---|
5822 | | - if (picture_aspect == HDMI_PICTURE_ASPECT_NONE) |
---|
5823 | | - picture_aspect = drm_get_cea_aspect_ratio(frame->video_code); |
---|
| 6021 | + if (picture_aspect == HDMI_PICTURE_ASPECT_NONE) { |
---|
| 6022 | + if (vic) |
---|
| 6023 | + picture_aspect = drm_get_cea_aspect_ratio(vic); |
---|
| 6024 | + else if (hdmi_vic) |
---|
| 6025 | + picture_aspect = drm_get_hdmi_aspect_ratio(hdmi_vic); |
---|
| 6026 | + } |
---|
5824 | 6027 | |
---|
5825 | 6028 | /* |
---|
5826 | 6029 | * The infoframe can't convey anything but none, 4:3 |
---|
.. | .. |
---|
5828 | 6031 | * we can only satisfy it by specifying the right VIC. |
---|
5829 | 6032 | */ |
---|
5830 | 6033 | if (picture_aspect > HDMI_PICTURE_ASPECT_16_9) { |
---|
5831 | | - if (picture_aspect != |
---|
5832 | | - drm_get_cea_aspect_ratio(frame->video_code)) |
---|
| 6034 | + if (vic) { |
---|
| 6035 | + if (picture_aspect != drm_get_cea_aspect_ratio(vic)) |
---|
| 6036 | + return -EINVAL; |
---|
| 6037 | + } else if (hdmi_vic) { |
---|
| 6038 | + if (picture_aspect != drm_get_hdmi_aspect_ratio(hdmi_vic)) |
---|
| 6039 | + return -EINVAL; |
---|
| 6040 | + } else { |
---|
5833 | 6041 | return -EINVAL; |
---|
| 6042 | + } |
---|
| 6043 | + |
---|
5834 | 6044 | picture_aspect = HDMI_PICTURE_ASPECT_NONE; |
---|
5835 | 6045 | } |
---|
5836 | 6046 | |
---|
| 6047 | + frame->video_code = vic_for_avi_infoframe(connector, vic); |
---|
5837 | 6048 | frame->picture_aspect = picture_aspect; |
---|
5838 | 6049 | frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE; |
---|
5839 | 6050 | frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN; |
---|
.. | .. |
---|
5842 | 6053 | } |
---|
5843 | 6054 | EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); |
---|
5844 | 6055 | |
---|
| 6056 | +/* HDMI Colorspace Spec Definitions */ |
---|
| 6057 | +#define FULL_COLORIMETRY_MASK 0x1FF |
---|
| 6058 | +#define NORMAL_COLORIMETRY_MASK 0x3 |
---|
| 6059 | +#define EXTENDED_COLORIMETRY_MASK 0x7 |
---|
| 6060 | +#define EXTENDED_ACE_COLORIMETRY_MASK 0xF |
---|
| 6061 | + |
---|
| 6062 | +#define C(x) ((x) << 0) |
---|
| 6063 | +#define EC(x) ((x) << 2) |
---|
| 6064 | +#define ACE(x) ((x) << 5) |
---|
| 6065 | + |
---|
| 6066 | +#define HDMI_COLORIMETRY_NO_DATA 0x0 |
---|
| 6067 | +#define HDMI_COLORIMETRY_SMPTE_170M_YCC (C(1) | EC(0) | ACE(0)) |
---|
| 6068 | +#define HDMI_COLORIMETRY_BT709_YCC (C(2) | EC(0) | ACE(0)) |
---|
| 6069 | +#define HDMI_COLORIMETRY_XVYCC_601 (C(3) | EC(0) | ACE(0)) |
---|
| 6070 | +#define HDMI_COLORIMETRY_XVYCC_709 (C(3) | EC(1) | ACE(0)) |
---|
| 6071 | +#define HDMI_COLORIMETRY_SYCC_601 (C(3) | EC(2) | ACE(0)) |
---|
| 6072 | +#define HDMI_COLORIMETRY_OPYCC_601 (C(3) | EC(3) | ACE(0)) |
---|
| 6073 | +#define HDMI_COLORIMETRY_OPRGB (C(3) | EC(4) | ACE(0)) |
---|
| 6074 | +#define HDMI_COLORIMETRY_BT2020_CYCC (C(3) | EC(5) | ACE(0)) |
---|
| 6075 | +#define HDMI_COLORIMETRY_BT2020_RGB (C(3) | EC(6) | ACE(0)) |
---|
| 6076 | +#define HDMI_COLORIMETRY_BT2020_YCC (C(3) | EC(6) | ACE(0)) |
---|
| 6077 | +#define HDMI_COLORIMETRY_DCI_P3_RGB_D65 (C(3) | EC(7) | ACE(0)) |
---|
| 6078 | +#define HDMI_COLORIMETRY_DCI_P3_RGB_THEATER (C(3) | EC(7) | ACE(1)) |
---|
| 6079 | + |
---|
| 6080 | +static const u32 hdmi_colorimetry_val[] = { |
---|
| 6081 | + [DRM_MODE_COLORIMETRY_NO_DATA] = HDMI_COLORIMETRY_NO_DATA, |
---|
| 6082 | + [DRM_MODE_COLORIMETRY_SMPTE_170M_YCC] = HDMI_COLORIMETRY_SMPTE_170M_YCC, |
---|
| 6083 | + [DRM_MODE_COLORIMETRY_BT709_YCC] = HDMI_COLORIMETRY_BT709_YCC, |
---|
| 6084 | + [DRM_MODE_COLORIMETRY_XVYCC_601] = HDMI_COLORIMETRY_XVYCC_601, |
---|
| 6085 | + [DRM_MODE_COLORIMETRY_XVYCC_709] = HDMI_COLORIMETRY_XVYCC_709, |
---|
| 6086 | + [DRM_MODE_COLORIMETRY_SYCC_601] = HDMI_COLORIMETRY_SYCC_601, |
---|
| 6087 | + [DRM_MODE_COLORIMETRY_OPYCC_601] = HDMI_COLORIMETRY_OPYCC_601, |
---|
| 6088 | + [DRM_MODE_COLORIMETRY_OPRGB] = HDMI_COLORIMETRY_OPRGB, |
---|
| 6089 | + [DRM_MODE_COLORIMETRY_BT2020_CYCC] = HDMI_COLORIMETRY_BT2020_CYCC, |
---|
| 6090 | + [DRM_MODE_COLORIMETRY_BT2020_RGB] = HDMI_COLORIMETRY_BT2020_RGB, |
---|
| 6091 | + [DRM_MODE_COLORIMETRY_BT2020_YCC] = HDMI_COLORIMETRY_BT2020_YCC, |
---|
| 6092 | +}; |
---|
| 6093 | + |
---|
| 6094 | +#undef C |
---|
| 6095 | +#undef EC |
---|
| 6096 | +#undef ACE |
---|
| 6097 | + |
---|
| 6098 | +/** |
---|
| 6099 | + * drm_hdmi_avi_infoframe_colorspace() - fill the HDMI AVI infoframe |
---|
| 6100 | + * colorspace information |
---|
| 6101 | + * @frame: HDMI AVI infoframe |
---|
| 6102 | + * @conn_state: connector state |
---|
| 6103 | + */ |
---|
| 6104 | +void |
---|
| 6105 | +drm_hdmi_avi_infoframe_colorspace(struct hdmi_avi_infoframe *frame, |
---|
| 6106 | + const struct drm_connector_state *conn_state) |
---|
| 6107 | +{ |
---|
| 6108 | + u32 colorimetry_val; |
---|
| 6109 | + u32 colorimetry_index = conn_state->colorspace & FULL_COLORIMETRY_MASK; |
---|
| 6110 | + |
---|
| 6111 | + if (colorimetry_index >= ARRAY_SIZE(hdmi_colorimetry_val)) |
---|
| 6112 | + colorimetry_val = HDMI_COLORIMETRY_NO_DATA; |
---|
| 6113 | + else |
---|
| 6114 | + colorimetry_val = hdmi_colorimetry_val[colorimetry_index]; |
---|
| 6115 | + |
---|
| 6116 | + frame->colorimetry = colorimetry_val & NORMAL_COLORIMETRY_MASK; |
---|
| 6117 | + /* |
---|
| 6118 | + * ToDo: Extend it for ACE formats as well. Modify the infoframe |
---|
| 6119 | + * structure and extend it in drivers/video/hdmi |
---|
| 6120 | + */ |
---|
| 6121 | + frame->extended_colorimetry = (colorimetry_val >> 2) & |
---|
| 6122 | + EXTENDED_COLORIMETRY_MASK; |
---|
| 6123 | +} |
---|
| 6124 | +EXPORT_SYMBOL(drm_hdmi_avi_infoframe_colorspace); |
---|
| 6125 | + |
---|
5845 | 6126 | /** |
---|
5846 | 6127 | * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe |
---|
5847 | 6128 | * quantization range information |
---|
5848 | 6129 | * @frame: HDMI AVI infoframe |
---|
| 6130 | + * @connector: the connector |
---|
5849 | 6131 | * @mode: DRM display mode |
---|
5850 | 6132 | * @rgb_quant_range: RGB quantization range (Q) |
---|
5851 | | - * @rgb_quant_range_selectable: Sink support selectable RGB quantization range (QS) |
---|
5852 | | - * @is_hdmi2_sink: HDMI 2.0 sink, which has different default recommendations |
---|
5853 | | - * |
---|
5854 | | - * Note that @is_hdmi2_sink can be derived by looking at the |
---|
5855 | | - * &drm_scdc.supported flag stored in &drm_hdmi_info.scdc, |
---|
5856 | | - * &drm_display_info.hdmi, which can be found in &drm_connector.display_info. |
---|
5857 | 6133 | */ |
---|
5858 | 6134 | void |
---|
5859 | 6135 | drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, |
---|
| 6136 | + const struct drm_connector *connector, |
---|
5860 | 6137 | const struct drm_display_mode *mode, |
---|
5861 | | - enum hdmi_quantization_range rgb_quant_range, |
---|
5862 | | - bool rgb_quant_range_selectable, |
---|
5863 | | - bool is_hdmi2_sink) |
---|
| 6138 | + enum hdmi_quantization_range rgb_quant_range) |
---|
5864 | 6139 | { |
---|
| 6140 | + const struct drm_display_info *info = &connector->display_info; |
---|
| 6141 | + |
---|
5865 | 6142 | /* |
---|
5866 | 6143 | * CEA-861: |
---|
5867 | 6144 | * "A Source shall not send a non-zero Q value that does not correspond |
---|
.. | .. |
---|
5872 | 6149 | * HDMI 2.0 recommends sending non-zero Q when it does match the |
---|
5873 | 6150 | * default RGB quantization range for the mode, even when QS=0. |
---|
5874 | 6151 | */ |
---|
5875 | | - if (rgb_quant_range_selectable || |
---|
| 6152 | + if (info->rgb_quant_range_selectable || |
---|
5876 | 6153 | rgb_quant_range == drm_default_rgb_quant_range(mode)) |
---|
5877 | 6154 | frame->quantization_range = rgb_quant_range; |
---|
5878 | 6155 | else |
---|
.. | .. |
---|
5891 | 6168 | * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based |
---|
5892 | 6169 | * on on CEA-861-F. |
---|
5893 | 6170 | */ |
---|
5894 | | - if (!is_hdmi2_sink || |
---|
| 6171 | + if (!is_hdmi2_sink(connector) || |
---|
5895 | 6172 | rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) |
---|
5896 | 6173 | frame->ycc_quantization_range = |
---|
5897 | 6174 | HDMI_YCC_QUANTIZATION_RANGE_LIMITED; |
---|
.. | .. |
---|
5900 | 6177 | HDMI_YCC_QUANTIZATION_RANGE_FULL; |
---|
5901 | 6178 | } |
---|
5902 | 6179 | EXPORT_SYMBOL(drm_hdmi_avi_infoframe_quant_range); |
---|
| 6180 | + |
---|
| 6181 | +/** |
---|
| 6182 | + * drm_hdmi_avi_infoframe_bars() - fill the HDMI AVI infoframe |
---|
| 6183 | + * bar information |
---|
| 6184 | + * @frame: HDMI AVI infoframe |
---|
| 6185 | + * @conn_state: connector state |
---|
| 6186 | + */ |
---|
| 6187 | +void |
---|
| 6188 | +drm_hdmi_avi_infoframe_bars(struct hdmi_avi_infoframe *frame, |
---|
| 6189 | + const struct drm_connector_state *conn_state) |
---|
| 6190 | +{ |
---|
| 6191 | + frame->right_bar = conn_state->tv.margins.right; |
---|
| 6192 | + frame->left_bar = conn_state->tv.margins.left; |
---|
| 6193 | + frame->top_bar = conn_state->tv.margins.top; |
---|
| 6194 | + frame->bottom_bar = conn_state->tv.margins.bottom; |
---|
| 6195 | +} |
---|
| 6196 | +EXPORT_SYMBOL(drm_hdmi_avi_infoframe_bars); |
---|
5903 | 6197 | |
---|
5904 | 6198 | static enum hdmi_3d_structure |
---|
5905 | 6199 | s3d_structure_from_display_mode(const struct drm_display_mode *mode) |
---|
.. | .. |
---|
5943 | 6237 | */ |
---|
5944 | 6238 | int |
---|
5945 | 6239 | drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, |
---|
5946 | | - struct drm_connector *connector, |
---|
| 6240 | + const struct drm_connector *connector, |
---|
5947 | 6241 | const struct drm_display_mode *mode) |
---|
5948 | 6242 | { |
---|
5949 | 6243 | /* |
---|
.. | .. |
---|
5953 | 6247 | bool has_hdmi_infoframe = connector ? |
---|
5954 | 6248 | connector->display_info.has_hdmi_infoframe : false; |
---|
5955 | 6249 | int err; |
---|
5956 | | - u32 s3d_flags; |
---|
5957 | | - u8 vic; |
---|
5958 | 6250 | |
---|
5959 | 6251 | if (!frame || !mode) |
---|
5960 | 6252 | return -EINVAL; |
---|
.. | .. |
---|
5962 | 6254 | if (!has_hdmi_infoframe) |
---|
5963 | 6255 | return -EINVAL; |
---|
5964 | 6256 | |
---|
5965 | | - vic = drm_match_hdmi_mode(mode); |
---|
5966 | | - s3d_flags = mode->flags & DRM_MODE_FLAG_3D_MASK; |
---|
| 6257 | + err = hdmi_vendor_infoframe_init(frame); |
---|
| 6258 | + if (err < 0) |
---|
| 6259 | + return err; |
---|
5967 | 6260 | |
---|
5968 | 6261 | /* |
---|
5969 | 6262 | * Even if it's not absolutely necessary to send the infoframe |
---|
.. | .. |
---|
5974 | 6267 | * mode if the source simply stops sending the infoframe when |
---|
5975 | 6268 | * it wants to switch from 3D to 2D. |
---|
5976 | 6269 | */ |
---|
5977 | | - |
---|
5978 | | - if (vic && s3d_flags) |
---|
5979 | | - return -EINVAL; |
---|
5980 | | - |
---|
5981 | | - err = hdmi_vendor_infoframe_init(frame); |
---|
5982 | | - if (err < 0) |
---|
5983 | | - return err; |
---|
5984 | | - |
---|
5985 | | - frame->vic = vic; |
---|
| 6270 | + frame->vic = drm_mode_hdmi_vic(connector, mode); |
---|
5986 | 6271 | frame->s3d_struct = s3d_structure_from_display_mode(mode); |
---|
5987 | 6272 | |
---|
5988 | 6273 | return 0; |
---|
5989 | 6274 | } |
---|
5990 | 6275 | EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode); |
---|
5991 | 6276 | |
---|
5992 | | -static int drm_parse_tiled_block(struct drm_connector *connector, |
---|
5993 | | - struct displayid_block *block) |
---|
| 6277 | +static void drm_parse_tiled_block(struct drm_connector *connector, |
---|
| 6278 | + const struct displayid_block *block) |
---|
5994 | 6279 | { |
---|
5995 | | - struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block; |
---|
| 6280 | + const struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block; |
---|
5996 | 6281 | u16 w, h; |
---|
5997 | 6282 | u8 tile_v_loc, tile_h_loc; |
---|
5998 | 6283 | u8 num_v_tile, num_h_tile; |
---|
.. | .. |
---|
6024 | 6309 | DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]); |
---|
6025 | 6310 | |
---|
6026 | 6311 | tg = drm_mode_get_tile_group(connector->dev, tile->topology_id); |
---|
6027 | | - if (!tg) { |
---|
6028 | | - tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); |
---|
6029 | | - } |
---|
6030 | 6312 | if (!tg) |
---|
6031 | | - return -ENOMEM; |
---|
| 6313 | + tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); |
---|
| 6314 | + if (!tg) |
---|
| 6315 | + return; |
---|
6032 | 6316 | |
---|
6033 | 6317 | if (connector->tile_group != tg) { |
---|
6034 | 6318 | /* if we haven't got a pointer, |
---|
6035 | 6319 | take the reference, drop ref to old tile group */ |
---|
6036 | | - if (connector->tile_group) { |
---|
| 6320 | + if (connector->tile_group) |
---|
6037 | 6321 | drm_mode_put_tile_group(connector->dev, connector->tile_group); |
---|
6038 | | - } |
---|
6039 | 6322 | connector->tile_group = tg; |
---|
6040 | | - } else |
---|
| 6323 | + } else { |
---|
6041 | 6324 | /* if same tile group, then release the ref we just took. */ |
---|
6042 | 6325 | drm_mode_put_tile_group(connector->dev, tg); |
---|
6043 | | - return 0; |
---|
| 6326 | + } |
---|
6044 | 6327 | } |
---|
6045 | 6328 | |
---|
6046 | | -static int drm_parse_display_id(struct drm_connector *connector, |
---|
6047 | | - u8 *displayid, int length, |
---|
6048 | | - bool is_edid_extension) |
---|
| 6329 | +static void drm_displayid_parse_tiled(struct drm_connector *connector, |
---|
| 6330 | + const u8 *displayid, int length, int idx) |
---|
6049 | 6331 | { |
---|
6050 | | - /* if this is an EDID extension the first byte will be 0x70 */ |
---|
6051 | | - int idx = 0; |
---|
6052 | | - struct displayid_block *block; |
---|
6053 | | - int ret; |
---|
6054 | | - |
---|
6055 | | - if (is_edid_extension) |
---|
6056 | | - idx = 1; |
---|
6057 | | - |
---|
6058 | | - ret = validate_displayid(displayid, length, idx); |
---|
6059 | | - if (ret) |
---|
6060 | | - return ret; |
---|
| 6332 | + const struct displayid_block *block; |
---|
6061 | 6333 | |
---|
6062 | 6334 | idx += sizeof(struct displayid_hdr); |
---|
6063 | | - while (block = (struct displayid_block *)&displayid[idx], |
---|
6064 | | - idx + sizeof(struct displayid_block) <= length && |
---|
6065 | | - idx + sizeof(struct displayid_block) + block->num_bytes <= length && |
---|
6066 | | - block->num_bytes > 0) { |
---|
6067 | | - idx += block->num_bytes + sizeof(struct displayid_block); |
---|
| 6335 | + for_each_displayid_db(displayid, block, idx, length) { |
---|
6068 | 6336 | DRM_DEBUG_KMS("block id 0x%x, rev %d, len %d\n", |
---|
6069 | 6337 | block->tag, block->rev, block->num_bytes); |
---|
6070 | 6338 | |
---|
6071 | 6339 | switch (block->tag) { |
---|
6072 | 6340 | case DATA_BLOCK_TILED_DISPLAY: |
---|
6073 | | - ret = drm_parse_tiled_block(connector, block); |
---|
6074 | | - if (ret) |
---|
6075 | | - return ret; |
---|
6076 | | - break; |
---|
6077 | | - case DATA_BLOCK_TYPE_1_DETAILED_TIMING: |
---|
6078 | | - /* handled in mode gathering code. */ |
---|
6079 | | - break; |
---|
6080 | | - case DATA_BLOCK_CTA: |
---|
6081 | | - /* handled in the cea parser code. */ |
---|
| 6341 | + drm_parse_tiled_block(connector, block); |
---|
6082 | 6342 | break; |
---|
6083 | 6343 | default: |
---|
6084 | 6344 | DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag); |
---|
6085 | 6345 | break; |
---|
6086 | 6346 | } |
---|
6087 | 6347 | } |
---|
6088 | | - return 0; |
---|
6089 | 6348 | } |
---|
6090 | 6349 | |
---|
6091 | | -static void drm_get_displayid(struct drm_connector *connector, |
---|
6092 | | - struct edid *edid) |
---|
| 6350 | +void drm_update_tile_info(struct drm_connector *connector, |
---|
| 6351 | + const struct edid *edid) |
---|
6093 | 6352 | { |
---|
6094 | | - void *displayid = NULL; |
---|
6095 | | - int ret; |
---|
| 6353 | + const void *displayid = NULL; |
---|
| 6354 | + int ext_index = 0; |
---|
| 6355 | + int length, idx; |
---|
| 6356 | + |
---|
6096 | 6357 | connector->has_tile = false; |
---|
6097 | | - displayid = drm_find_displayid_extension(edid); |
---|
6098 | | - if (!displayid) { |
---|
6099 | | - /* drop reference to any tile group we had */ |
---|
6100 | | - goto out_drop_ref; |
---|
| 6358 | + for (;;) { |
---|
| 6359 | + displayid = drm_find_displayid_extension(edid, &length, &idx, |
---|
| 6360 | + &ext_index); |
---|
| 6361 | + if (!displayid) |
---|
| 6362 | + break; |
---|
| 6363 | + |
---|
| 6364 | + drm_displayid_parse_tiled(connector, displayid, length, idx); |
---|
6101 | 6365 | } |
---|
6102 | 6366 | |
---|
6103 | | - ret = drm_parse_display_id(connector, displayid, EDID_LENGTH, true); |
---|
6104 | | - if (ret < 0) |
---|
6105 | | - goto out_drop_ref; |
---|
6106 | | - if (!connector->has_tile) |
---|
6107 | | - goto out_drop_ref; |
---|
6108 | | - return; |
---|
6109 | | -out_drop_ref: |
---|
6110 | | - if (connector->tile_group) { |
---|
| 6367 | + if (!connector->has_tile && connector->tile_group) { |
---|
6111 | 6368 | drm_mode_put_tile_group(connector->dev, connector->tile_group); |
---|
6112 | 6369 | connector->tile_group = NULL; |
---|
6113 | 6370 | } |
---|
6114 | | - return; |
---|
6115 | 6371 | } |
---|