Rev 6935 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6935 | Rev 6937 | ||
---|---|---|---|
Line 71... | Line 71... | ||
71 | #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) |
71 | #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) |
72 | /* Force 8bpc */ |
72 | /* Force 8bpc */ |
73 | #define EDID_QUIRK_FORCE_8BPC (1 << 8) |
73 | #define EDID_QUIRK_FORCE_8BPC (1 << 8) |
74 | /* Force 12bpc */ |
74 | /* Force 12bpc */ |
75 | #define EDID_QUIRK_FORCE_12BPC (1 << 9) |
75 | #define EDID_QUIRK_FORCE_12BPC (1 << 9) |
76 | /* Force 6bpc */ |
- | |
77 | #define EDID_QUIRK_FORCE_6BPC (1 << 10) |
- | |
78 | /* Force 10bpc */ |
- | |
79 | #define EDID_QUIRK_FORCE_10BPC (1 << 11) |
- | |
Line 80... | Line 76... | ||
80 | 76 | ||
81 | struct detailed_mode_closure { |
77 | struct detailed_mode_closure { |
82 | struct drm_connector *connector; |
78 | struct drm_connector *connector; |
83 | struct edid *edid; |
79 | struct edid *edid; |
Line 101... | Line 97... | ||
101 | /* Acer F51 */ |
97 | /* Acer F51 */ |
102 | { "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 }, |
98 | { "API", 0x7602, EDID_QUIRK_PREFER_LARGE_60 }, |
103 | /* Unknown Acer */ |
99 | /* Unknown Acer */ |
104 | { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
100 | { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, |
Line 105... | Line -... | ||
105 | - | ||
106 | /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ |
- | |
107 | { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, |
- | |
108 | 101 | ||
109 | /* Belinea 10 15 55 */ |
102 | /* Belinea 10 15 55 */ |
110 | { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 }, |
103 | { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 }, |
Line 111... | Line 104... | ||
111 | { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 }, |
104 | { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 }, |
Line 117... | Line 110... | ||
117 | 110 | ||
118 | /* Funai Electronics PM36B */ |
111 | /* Funai Electronics PM36B */ |
119 | { "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 | |
112 | { "FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 | |
Line 120... | Line -... | ||
120 | EDID_QUIRK_DETAILED_IN_CM }, |
- | |
121 | - | ||
122 | /* LGD panel of HP zBook 17 G2, eDP 10 bpc, but reports unknown bpc */ |
- | |
123 | { "LGD", 764, EDID_QUIRK_FORCE_10BPC }, |
113 | EDID_QUIRK_DETAILED_IN_CM }, |
124 | 114 | ||
125 | /* LG Philips LCD LP154W01-A5 */ |
115 | /* LG Philips LCD LP154W01-A5 */ |
Line 126... | Line 116... | ||
126 | { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, |
116 | { "LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE }, |
Line 147... | Line 137... | ||
147 | /* Medion MD 30217 PG */ |
137 | /* Medion MD 30217 PG */ |
148 | { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, |
138 | { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, |
Line 149... | Line 139... | ||
149 | 139 | ||
150 | /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */ |
140 | /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */ |
151 | { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC }, |
- | |
152 | - | ||
153 | /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/ |
- | |
154 | { "ETR", 13896, EDID_QUIRK_FORCE_8BPC }, |
141 | { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC }, |
Line 155... | Line 142... | ||
155 | }; |
142 | }; |
156 | 143 | ||
157 | /* |
144 | /* |
Line 648... | Line 635... | ||
648 | }; |
635 | }; |
Line 649... | Line 636... | ||
649 | 636 | ||
650 | /* |
637 | /* |
651 | * Probably taken from CEA-861 spec. |
638 | * Probably taken from CEA-861 spec. |
- | 639 | * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c. |
|
- | 640 | * |
|
652 | * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c. |
641 | * Index using the VIC. |
653 | */ |
642 | */ |
- | 643 | static const struct drm_display_mode edid_cea_modes[] = { |
|
- | 644 | /* 0 - dummy, VICs start at 1 */ |
|
654 | static const struct drm_display_mode edid_cea_modes[] = { |
645 | { }, |
655 | /* 1 - 640x480@60Hz */ |
646 | /* 1 - 640x480@60Hz */ |
656 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, |
647 | { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, |
657 | 752, 800, 0, 480, 490, 492, 525, 0, |
648 | 752, 800, 0, 480, 490, 492, 525, 0, |
658 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
649 | DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), |
Line 998... | Line 989... | ||
998 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
989 | DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC), |
999 | .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
990 | .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, }, |
1000 | }; |
991 | }; |
Line 1001... | Line 992... | ||
1001 | 992 | ||
1002 | /* |
993 | /* |
1003 | * HDMI 1.4 4k modes. |
994 | * HDMI 1.4 4k modes. Index using the VIC. |
1004 | */ |
995 | */ |
- | 996 | static const struct drm_display_mode edid_4k_modes[] = { |
|
- | 997 | /* 0 - dummy, VICs start at 1 */ |
|
1005 | static const struct drm_display_mode edid_4k_modes[] = { |
998 | { }, |
1006 | /* 1 - 3840x2160@30Hz */ |
999 | /* 1 - 3840x2160@30Hz */ |
1007 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, |
1000 | { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, |
1008 | 3840, 4016, 4104, 4400, 0, |
1001 | 3840, 4016, 4104, 4400, 0, |
1009 | 2160, 2168, 2178, 2250, 0, |
1002 | 2160, 2168, 2178, 2250, 0, |
Line 2556... | Line 2549... | ||
2556 | clock = DIV_ROUND_CLOSEST(clock * 1000, 1001); |
2549 | clock = DIV_ROUND_CLOSEST(clock * 1000, 1001); |
Line 2557... | Line 2550... | ||
2557 | 2550 | ||
2558 | return clock; |
2551 | return clock; |
Line -... | Line 2552... | ||
- | 2552 | } |
|
- | 2553 | ||
- | 2554 | static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_match, |
|
- | 2555 | unsigned int clock_tolerance) |
|
- | 2556 | { |
|
- | 2557 | u8 vic; |
|
- | 2558 | ||
- | 2559 | if (!to_match->clock) |
|
- | 2560 | return 0; |
|
- | 2561 | ||
- | 2562 | for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) { |
|
- | 2563 | const struct drm_display_mode *cea_mode = &edid_cea_modes[vic]; |
|
- | 2564 | unsigned int clock1, clock2; |
|
- | 2565 | ||
- | 2566 | /* Check both 60Hz and 59.94Hz */ |
|
- | 2567 | clock1 = cea_mode->clock; |
|
- | 2568 | clock2 = cea_mode_alternate_clock(cea_mode); |
|
- | 2569 | ||
- | 2570 | if (abs(to_match->clock - clock1) > clock_tolerance && |
|
- | 2571 | abs(to_match->clock - clock2) > clock_tolerance) |
|
- | 2572 | continue; |
|
- | 2573 | ||
- | 2574 | if (drm_mode_equal_no_clocks(to_match, cea_mode)) |
|
- | 2575 | return vic; |
|
- | 2576 | } |
|
- | 2577 | ||
- | 2578 | return 0; |
|
2559 | } |
2579 | } |
2560 | 2580 | ||
2561 | /** |
2581 | /** |
2562 | * drm_match_cea_mode - look for a CEA mode matching given mode |
2582 | * drm_match_cea_mode - look for a CEA mode matching given mode |
2563 | * @to_match: display mode |
2583 | * @to_match: display mode |
2564 | * |
2584 | * |
2565 | * Return: The CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861 |
2585 | * Return: The CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861 |
2566 | * mode. |
2586 | * mode. |
2567 | */ |
2587 | */ |
2568 | u8 drm_match_cea_mode(const struct drm_display_mode *to_match) |
2588 | u8 drm_match_cea_mode(const struct drm_display_mode *to_match) |
Line 2569... | Line 2589... | ||
2569 | { |
2589 | { |
2570 | u8 mode; |
2590 | u8 vic; |
Line 2571... | Line 2591... | ||
2571 | 2591 | ||
2572 | if (!to_match->clock) |
2592 | if (!to_match->clock) |
2573 | return 0; |
2593 | return 0; |
Line 2574... | Line 2594... | ||
2574 | 2594 | ||
2575 | for (mode = 0; mode < ARRAY_SIZE(edid_cea_modes); mode++) { |
2595 | for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) { |
2576 | const struct drm_display_mode *cea_mode = &edid_cea_modes[mode]; |
2596 | const struct drm_display_mode *cea_mode = &edid_cea_modes[vic]; |
Line 2577... | Line 2597... | ||
2577 | unsigned int clock1, clock2; |
2597 | unsigned int clock1, clock2; |
2578 | 2598 | ||
2579 | /* Check both 60Hz and 59.94Hz */ |
2599 | /* Check both 60Hz and 59.94Hz */ |
2580 | clock1 = cea_mode->clock; |
2600 | clock1 = cea_mode->clock; |
2581 | clock2 = cea_mode_alternate_clock(cea_mode); |
2601 | clock2 = cea_mode_alternate_clock(cea_mode); |
2582 | 2602 | ||
2583 | if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) || |
2603 | if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) || |
2584 | KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) && |
2604 | KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) && |
Line -... | Line 2605... | ||
- | 2605 | drm_mode_equal_no_clocks_no_stereo(to_match, cea_mode)) |
|
- | 2606 | return vic; |
|
- | 2607 | } |
|
- | 2608 | return 0; |
|
- | 2609 | } |
|
2585 | drm_mode_equal_no_clocks_no_stereo(to_match, cea_mode)) |
2610 | EXPORT_SYMBOL(drm_match_cea_mode); |
2586 | return mode + 1; |
2611 | |
2587 | } |
2612 | static bool drm_valid_cea_vic(u8 vic) |
2588 | return 0; |
2613 | { |
2589 | } |
2614 | return vic > 0 && vic < ARRAY_SIZE(edid_cea_modes); |
2590 | EXPORT_SYMBOL(drm_match_cea_mode); |
2615 | } |
2591 | 2616 | ||
2592 | /** |
2617 | /** |
2593 | * drm_get_cea_aspect_ratio - get the picture aspect ratio corresponding to |
2618 | * drm_get_cea_aspect_ratio - get the picture aspect ratio corresponding to |
2594 | * the input VIC from the CEA mode list |
- | |
2595 | * @video_code: ID given to each of the CEA modes |
- | |
2596 | * |
- | |
2597 | * Returns picture aspect ratio |
2619 | * the input VIC from the CEA mode list |
2598 | */ |
2620 | * @video_code: ID given to each of the CEA modes |
2599 | enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code) |
2621 | * |
Line 2600... | Line 2622... | ||
2600 | { |
2622 | * Returns picture aspect ratio |
2601 | /* return picture aspect ratio for video_code - 1 to access the |
2623 | */ |
Line 2620... | Line 2642... | ||
2620 | return hdmi_mode->clock; |
2642 | return hdmi_mode->clock; |
Line 2621... | Line 2643... | ||
2621 | 2643 | ||
2622 | return cea_mode_alternate_clock(hdmi_mode); |
2644 | return cea_mode_alternate_clock(hdmi_mode); |
Line -... | Line 2645... | ||
- | 2645 | } |
|
- | 2646 | ||
- | 2647 | static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_match, |
|
- | 2648 | unsigned int clock_tolerance) |
|
- | 2649 | { |
|
- | 2650 | u8 vic; |
|
- | 2651 | ||
- | 2652 | if (!to_match->clock) |
|
- | 2653 | return 0; |
|
- | 2654 | ||
- | 2655 | for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) { |
|
- | 2656 | const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic]; |
|
- | 2657 | unsigned int clock1, clock2; |
|
- | 2658 | ||
- | 2659 | /* Make sure to also match alternate clocks */ |
|
- | 2660 | clock1 = hdmi_mode->clock; |
|
- | 2661 | clock2 = hdmi_mode_alternate_clock(hdmi_mode); |
|
- | 2662 | ||
- | 2663 | if (abs(to_match->clock - clock1) > clock_tolerance && |
|
- | 2664 | abs(to_match->clock - clock2) > clock_tolerance) |
|
- | 2665 | continue; |
|
- | 2666 | ||
- | 2667 | if (drm_mode_equal_no_clocks(to_match, hdmi_mode)) |
|
- | 2668 | return vic; |
|
- | 2669 | } |
|
- | 2670 | ||
- | 2671 | return 0; |
|
2623 | } |
2672 | } |
2624 | 2673 | ||
2625 | /* |
2674 | /* |
2626 | * drm_match_hdmi_mode - look for a HDMI mode matching given mode |
2675 | * drm_match_hdmi_mode - look for a HDMI mode matching given mode |
2627 | * @to_match: display mode |
2676 | * @to_match: display mode |
2628 | * |
2677 | * |
2629 | * An HDMI mode is one defined in the HDMI vendor specific block. |
2678 | * An HDMI mode is one defined in the HDMI vendor specific block. |
2630 | * |
2679 | * |
2631 | * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one. |
2680 | * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one. |
2632 | */ |
2681 | */ |
2633 | static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match) |
2682 | static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match) |
Line 2634... | Line 2683... | ||
2634 | { |
2683 | { |
2635 | u8 mode; |
2684 | u8 vic; |
Line 2636... | Line 2685... | ||
2636 | 2685 | ||
2637 | if (!to_match->clock) |
2686 | if (!to_match->clock) |
2638 | return 0; |
2687 | return 0; |
Line 2639... | Line 2688... | ||
2639 | 2688 | ||
2640 | for (mode = 0; mode < ARRAY_SIZE(edid_4k_modes); mode++) { |
2689 | for (vic = 1; vic < ARRAY_SIZE(edid_4k_modes); vic++) { |
2641 | const struct drm_display_mode *hdmi_mode = &edid_4k_modes[mode]; |
2690 | const struct drm_display_mode *hdmi_mode = &edid_4k_modes[vic]; |
Line 2642... | Line 2691... | ||
2642 | unsigned int clock1, clock2; |
2691 | unsigned int clock1, clock2; |
2643 | 2692 | ||
2644 | /* Make sure to also match alternate clocks */ |
2693 | /* Make sure to also match alternate clocks */ |
2645 | clock1 = hdmi_mode->clock; |
2694 | clock1 = hdmi_mode->clock; |
2646 | clock2 = hdmi_mode_alternate_clock(hdmi_mode); |
2695 | clock2 = hdmi_mode_alternate_clock(hdmi_mode); |
2647 | 2696 | ||
2648 | if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) || |
2697 | if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) || |
Line -... | Line 2698... | ||
- | 2698 | KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) && |
|
- | 2699 | drm_mode_equal_no_clocks_no_stereo(to_match, hdmi_mode)) |
|
- | 2700 | return vic; |
|
- | 2701 | } |
|
- | 2702 | return 0; |
|
2649 | KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) && |
2703 | } |
2650 | drm_mode_equal_no_clocks_no_stereo(to_match, hdmi_mode)) |
2704 | |
2651 | return mode + 1; |
2705 | static bool drm_valid_hdmi_vic(u8 vic) |
2652 | } |
2706 | { |
2653 | return 0; |
2707 | return vic > 0 && vic < ARRAY_SIZE(edid_4k_modes); |
Line 2670... | Line 2724... | ||
2670 | * with the alternate clock for certain CEA modes. |
2724 | * with the alternate clock for certain CEA modes. |
2671 | */ |
2725 | */ |
2672 | list_for_each_entry(mode, &connector->probed_modes, head) { |
2726 | list_for_each_entry(mode, &connector->probed_modes, head) { |
2673 | const struct drm_display_mode *cea_mode = NULL; |
2727 | const struct drm_display_mode *cea_mode = NULL; |
2674 | struct drm_display_mode *newmode; |
2728 | struct drm_display_mode *newmode; |
2675 | u8 mode_idx = drm_match_cea_mode(mode) - 1; |
2729 | u8 vic = drm_match_cea_mode(mode); |
2676 | unsigned int clock1, clock2; |
2730 | unsigned int clock1, clock2; |
Line 2677... | Line 2731... | ||
2677 | 2731 | ||
2678 | if (mode_idx < ARRAY_SIZE(edid_cea_modes)) { |
2732 | if (drm_valid_cea_vic(vic)) { |
2679 | cea_mode = &edid_cea_modes[mode_idx]; |
2733 | cea_mode = &edid_cea_modes[vic]; |
2680 | clock2 = cea_mode_alternate_clock(cea_mode); |
2734 | clock2 = cea_mode_alternate_clock(cea_mode); |
2681 | } else { |
2735 | } else { |
2682 | mode_idx = drm_match_hdmi_mode(mode) - 1; |
2736 | vic = drm_match_hdmi_mode(mode); |
2683 | if (mode_idx < ARRAY_SIZE(edid_4k_modes)) { |
2737 | if (drm_valid_hdmi_vic(vic)) { |
2684 | cea_mode = &edid_4k_modes[mode_idx]; |
2738 | cea_mode = &edid_4k_modes[vic]; |
2685 | clock2 = hdmi_mode_alternate_clock(cea_mode); |
2739 | clock2 = hdmi_mode_alternate_clock(cea_mode); |
2686 | } |
2740 | } |
Line 2687... | Line 2741... | ||
2687 | } |
2741 | } |
Line 2730... | Line 2784... | ||
2730 | const u8 *video_db, u8 video_len, |
2784 | const u8 *video_db, u8 video_len, |
2731 | u8 video_index) |
2785 | u8 video_index) |
2732 | { |
2786 | { |
2733 | struct drm_device *dev = connector->dev; |
2787 | struct drm_device *dev = connector->dev; |
2734 | struct drm_display_mode *newmode; |
2788 | struct drm_display_mode *newmode; |
2735 | u8 cea_mode; |
2789 | u8 vic; |
Line 2736... | Line 2790... | ||
2736 | 2790 | ||
2737 | if (video_db == NULL || video_index >= video_len) |
2791 | if (video_db == NULL || video_index >= video_len) |
Line 2738... | Line 2792... | ||
2738 | return NULL; |
2792 | return NULL; |
2739 | 2793 | ||
2740 | /* CEA modes are numbered 1..127 */ |
2794 | /* CEA modes are numbered 1..127 */ |
2741 | cea_mode = (video_db[video_index] & 127) - 1; |
2795 | vic = (video_db[video_index] & 127); |
Line 2742... | Line 2796... | ||
2742 | if (cea_mode >= ARRAY_SIZE(edid_cea_modes)) |
2796 | if (!drm_valid_cea_vic(vic)) |
2743 | return NULL; |
2797 | return NULL; |
2744 | 2798 | ||
Line 2745... | Line 2799... | ||
2745 | newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]); |
2799 | newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]); |
Line 2835... | Line 2889... | ||
2835 | static int add_hdmi_mode(struct drm_connector *connector, u8 vic) |
2889 | static int add_hdmi_mode(struct drm_connector *connector, u8 vic) |
2836 | { |
2890 | { |
2837 | struct drm_device *dev = connector->dev; |
2891 | struct drm_device *dev = connector->dev; |
2838 | struct drm_display_mode *newmode; |
2892 | struct drm_display_mode *newmode; |
Line 2839... | Line -... | ||
2839 | - | ||
2840 | vic--; /* VICs start at 1 */ |
2893 | |
2841 | if (vic >= ARRAY_SIZE(edid_4k_modes)) { |
2894 | if (!drm_valid_hdmi_vic(vic)) { |
2842 | DRM_ERROR("Unknown HDMI VIC: %d\n", vic); |
2895 | DRM_ERROR("Unknown HDMI VIC: %d\n", vic); |
2843 | return 0; |
2896 | return 0; |
Line 2844... | Line 2897... | ||
2844 | } |
2897 | } |
Line 3127... | Line 3180... | ||
3127 | 3180 | ||
3128 | static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode) |
3181 | static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode) |
3129 | { |
3182 | { |
3130 | const struct drm_display_mode *cea_mode; |
3183 | const struct drm_display_mode *cea_mode; |
3131 | int clock1, clock2, clock; |
3184 | int clock1, clock2, clock; |
3132 | u8 mode_idx; |
3185 | u8 vic; |
Line -... | Line 3186... | ||
- | 3186 | const char *type; |
|
- | 3187 | ||
- | 3188 | /* |
|
- | 3189 | * allow 5kHz clock difference either way to account for |
|
3133 | const char *type; |
3190 | * the 10kHz clock resolution limit of detailed timings. |
3134 | 3191 | */ |
|
3135 | mode_idx = drm_match_cea_mode(mode) - 1; |
3192 | vic = drm_match_cea_mode_clock_tolerance(mode, 5); |
3136 | if (mode_idx < ARRAY_SIZE(edid_cea_modes)) { |
3193 | if (drm_valid_cea_vic(vic)) { |
3137 | type = "CEA"; |
3194 | type = "CEA"; |
3138 | cea_mode = &edid_cea_modes[mode_idx]; |
3195 | cea_mode = &edid_cea_modes[vic]; |
3139 | clock1 = cea_mode->clock; |
3196 | clock1 = cea_mode->clock; |
3140 | clock2 = cea_mode_alternate_clock(cea_mode); |
3197 | clock2 = cea_mode_alternate_clock(cea_mode); |
3141 | } else { |
3198 | } else { |
3142 | mode_idx = drm_match_hdmi_mode(mode) - 1; |
3199 | vic = drm_match_hdmi_mode_clock_tolerance(mode, 5); |
3143 | if (mode_idx < ARRAY_SIZE(edid_4k_modes)) { |
3200 | if (drm_valid_hdmi_vic(vic)) { |
3144 | type = "HDMI"; |
3201 | type = "HDMI"; |
3145 | cea_mode = &edid_4k_modes[mode_idx]; |
3202 | cea_mode = &edid_4k_modes[vic]; |
3146 | clock1 = cea_mode->clock; |
3203 | clock1 = cea_mode->clock; |
3147 | clock2 = hdmi_mode_alternate_clock(cea_mode); |
3204 | clock2 = hdmi_mode_alternate_clock(cea_mode); |
3148 | } else { |
3205 | } else { |
Line 3158... | Line 3215... | ||
3158 | 3215 | ||
3159 | if (mode->clock == clock) |
3216 | if (mode->clock == clock) |
Line 3160... | Line 3217... | ||
3160 | return; |
3217 | return; |
3161 | 3218 | ||
3162 | DRM_DEBUG("detailed mode matches %s VIC %d, adjusting clock %d -> %d\n", |
3219 | DRM_DEBUG("detailed mode matches %s VIC %d, adjusting clock %d -> %d\n", |
3163 | type, mode_idx + 1, mode->clock, clock); |
3220 | type, vic, mode->clock, clock); |
Line 3164... | Line 3221... | ||
3164 | mode->clock = clock; |
3221 | mode->clock = clock; |
3165 | } |
3222 | } |
Line 3831... | Line 3888... | ||
3831 | if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) |
3888 | if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) |
3832 | edid_fixup_preferred(connector, quirks); |
3889 | edid_fixup_preferred(connector, quirks); |
Line 3833... | Line 3890... | ||
3833 | 3890 | ||
Line 3834... | Line -... | ||
3834 | drm_add_display_info(edid, &connector->display_info, connector); |
- | |
3835 | - | ||
3836 | if (quirks & EDID_QUIRK_FORCE_6BPC) |
- | |
3837 | connector->display_info.bpc = 6; |
3891 | drm_add_display_info(edid, &connector->display_info, connector); |
3838 | 3892 | ||
Line 3839... | Line -... | ||
3839 | if (quirks & EDID_QUIRK_FORCE_8BPC) |
- | |
3840 | connector->display_info.bpc = 8; |
- | |
3841 | - | ||
3842 | if (quirks & EDID_QUIRK_FORCE_10BPC) |
3893 | if (quirks & EDID_QUIRK_FORCE_8BPC) |
3843 | connector->display_info.bpc = 10; |
3894 | connector->display_info.bpc = 8; |
Line 3844... | Line 3895... | ||
3844 | 3895 | ||
3845 | if (quirks & EDID_QUIRK_FORCE_12BPC) |
3896 | if (quirks & EDID_QUIRK_FORCE_12BPC) |