<div dir="ltr"><pre>Hello<br><br></pre><pre>The correct timings are detected by X (cf below), so I checked the existing gma_ivybridge init and I thought it may calculate clocks wrong.<br></pre><pre>Then I found about <a href="https://review.coreboot.org/#/c/16504/" target="_blank">https://review.coreboot.org/#/<wbr>c/16504/</a> addressing just this, so I tried to port it to gma_ivybridge<br></pre><pre>Unfortunately I must I have done something really wrong, because I now get no display at all.<br></pre><pre>Before:<br>Data M1=10108272, N1=8388608<br>Link frequency 270000 kHz<br>Link M1=280785, N1=524288<br>Pixel N=7, M1=22, M2=8, P1=2 <br>Pixel clock 144489 kHz<br><br>After:<br>Data M1=10108272, N1=8388608<br>Link frequency 270000 kHz<br>Link M1=280785, N1=524288<br>Pixel N=2, M1=13, M2=4, P1=2                                                                          <br>Pixel clock 144642 kHz<br><br><br></pre><pre>My patch:<br>--- gma_ivybridge_lvds.c     2016-11-20 14:24:57.944308878 -0500<br>+++ gma_ivybridge_lvds.c.orig      2016-11-20 12:51:24.273120162 -0500<br>@@ -29,9 +29,6 @@<br> #include <pc80/vga_io.h><br> #include <device/pci_def.h><br> #include <device/pci_rom.h><br>-#include <commonlib/helpers.h><br>-<br>-#define BASE_FREQUENCY 100000<br> <br> static void link_train(u8 *mmio)<br> {<br>@@ -142,7 +139,6 @@<br>      int i;<br>        u8 edid_data[128];<br>    struct edid edid;<br>-    u32 target_frequency;<br> <br>      if (!IS_ENABLED(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT))<br>                 return 0;<br>@@ -209,19 +205,17 @@<br>      u32 hfront_porch = edid.mode.hso;<br>     u32 vfront_porch = edid.mode.vso;<br> <br>- u32 smallest_err = 0xffffffff;<br>+       u32 candp1, candn;<br>+   u32 best_delta = 0xffffffff;<br> <br>+      u32 target_frequency = (<br>+             edid.mode.lvds_dual_channel ? edid.mode.pixel_clock<br>+          : (2 * edid.mode.pixel_clock));<br>       u32 pixel_p1 = 1;<br>-    u32 pixel_p2;<br>         u32 pixel_n = 1;<br>      u32 pixel_m1 = 1;<br>     u32 pixel_m2 = 1;<br> <br>- /* p2 divisor must 7 for dual channel LVDS */<br>-        /* and 14 for single channel LVDS */<br>- pixel_p2 = edid.mode.lvds_dual_channel ? 7 : 14;<br>-     target_frequency = edid.mode.pixel_clock;<br>-<br>  vga_textmode_init();<br>  if (IS_ENABLED(CONFIG_FRAMEBUFFER_KEEP_VESA_MODE)) {<br>          vga_sr_write(1, 1);<br>@@ -249,34 +243,40 @@<br>                    write32(mmio + LGC_PALETTE(0) + 4 * i, i * 0x010101);<br>         }<br> <br>- /* Find suitable divisors, m1, m2, p1, n.  */<br>-        /* refclock * (5 * (m1 + 2) + (m1 + 2)) / (n + 2) / p1 / p2 */<br>-       /* should be closest to target frequency as possible */<br>-      u32 candn, candm1, candm2, candp1;<br>-   for (candm1 = 8; candm1 <= 18; candm1++) {<br>-                for (candm2 = 3; candm2 <= 7; candm2++) {<br>-                 for (candn = 1; candn <= 6; candn++) {<br>-                            for (candp1 = 1; candp1 <= 8; candp1++) {<br>-                                 u32 m = 5 * (candm1 + 2) + (candm2 + 2);<br>-                                     u32 p = candp1 * pixel_p2;<br>-                                   u32 vco = DIV_ROUND_CLOSEST(BASE_FREQUENCY * m, candn + 2);<br>-                                  u32 dot = DIV_ROUND_CLOSEST(vco, p);<br>-                                 u32 this_err = ABS(dot - target_frequency);<br>-                                  if ((m < 70) || (m > 120))<br>-                                             continue;<br>-                                    if (this_err < smallest_err) {<br>-                                            smallest_err = this_err;<br>-                                             pixel_n = candn;<br>-                                             pixel_m1 = candm1;<br>-                                           pixel_m2 = candm2;<br>-                                           pixel_p1 = candp1;<br>-                                   }<br>-                            }<br>+    /* Find suitable divisors.  */<br>+       for (candp1 = 1; candp1 <= 8; candp1++) {<br>+         for (candn = 5; candn <= 10; candn++) {<br>+                   u32 cur_frequency;<br>+                   u32 m; /* 77 - 131.  */<br>+                      u32 denom; /* 35 - 560.  */<br>+                  u32 current_delta;<br>+<br>+                        denom = candn * candp1 * 7;<br>+                  /* Doesnt overflow for up to<br>+                    5000000 kHz = 5 GHz.  */<br>+                  m = (target_frequency * denom + 60000) / 120000;<br>+<br>+                  if (m < 77 || m > 131)<br>+                         continue;<br>+<br>+                 cur_frequency = (120000 * m) / denom;<br>+                        if (target_frequency > cur_frequency)<br>+                             current_delta = target_frequency - cur_frequency;<br>+                    else<br>+                         current_delta = cur_frequency - target_frequency;<br>+<br>+<br>+                      if (best_delta > current_delta) {<br>+                         best_delta = current_delta;<br>+                          pixel_n = candn;<br>+                             pixel_p1 = candp1;<br>+                           pixel_m2 = ((m + 3) % 5) + 7;<br>+                                pixel_m1 = (m - pixel_m2) / 5;<br>                        }<br>             }<br>     }<br> <br>- if (smallest_err == 0xffffffff) {<br>+    if (best_delta == 0xffffffff) {<br>               printk (BIOS_ERR, "Couldn't find GFX clock divisors\n");<br>                return 0;<br>     }<br>@@ -317,8 +317,8 @@<br>        printk(BIOS_DEBUG, "Pixel N=%d, M1=%d, M2=%d, P1=%d\n",<br>            pixel_n, pixel_m1, pixel_m2, pixel_p1);<br>        printk(BIOS_DEBUG, "Pixel clock %d kHz\n",<br>-        BASE_FREQUENCY * (5 * (pixel_m1 + 2) + (pixel_m2 + 2)) /<br>-                     (pixel_n + 2) / (pixel_p1 * pixel_p2));<br>+              120000 * (5 * pixel_m1 + pixel_m2) / pixel_n<br>+         / (pixel_p1 * 7));<br> <br>  write32(mmio + PCH_LVDS,<br>              (hpolarity << 20) | (vpolarity << 21)<br>@@ -333,14 +333,15 @@<br>      write32(mmio + PCH_PP_CONTROL, PANEL_UNLOCK_REGS<br>              | (read32(mmio + PCH_PP_CONTROL) & ~PANEL_UNLOCK_MASK));<br>  write32(mmio + _PCH_FP0(0),<br>-          (pixel_n << 16)<br>-                | (pixel_m1 << 8) | pixel_m2);<br>+         ((pixel_n - 2) << 16)<br>+          | ((pixel_m1 - 2) << 8) | pixel_m2);<br>    write32(mmio + _PCH_DPLL(0),<br>          DPLL_VCO_ENABLE | DPLLB_MODE_LVDS<br>             | (edid.mode.lvds_dual_channel ? DPLLB_LVDS_P2_CLOCK_DIV_7<br>               : DPLLB_LVDS_P2_CLOCK_DIV_14)<br>+             | (0x10000 << (pixel_p1 - 1))<br>           | ((info->use_spread_spectrum_clock ? 3 : 0) << 13)<br>-         | (0x10000 << (pixel_p1 - 1)));<br>+                | (0x1 << (pixel_p1 - 1)));<br> <br>  mdelay(1);<br>    write32(mmio + 0xc7000, 0x8);<br>@@ -350,9 +351,9 @@<br>            DPLL_VCO_ENABLE | DPLLB_MODE_LVDS<br>             | (edid.mode.lvds_dual_channel ? DPLLB_LVDS_P2_CLOCK_DIV_7<br>               : DPLLB_LVDS_P2_CLOCK_DIV_14)<br>+             | (0x10000 << (pixel_p1 - 1))<br>           | ((info->use_spread_spectrum_clock ? 3 : 0) << 13)<br>-         | (0x10000 << (pixel_p1 - 1)));<br>-<br>+             | (0x1 << (pixel_p1 - 1)));<br>     /* Re-lock the registers.  */<br>         write32(mmio + PCH_PP_CONTROL,<br>                (read32(mmio + PCH_PP_CONTROL) & ~PANEL_UNLOCK_MASK));<br><br></pre><pre>Xorg:<br></pre><pre>[     6.889] (II) intel(0): EDID for output LVDS1<br>[     6.889] (II) intel(0): Manufacturer: AUO  Model: 11ed  Serial#: 0<br>[     6.889] (II) intel(0): Year: 2012  Week: 0<br>[     6.889] (II) intel(0): EDID Version: 1.4<br>[     6.889] (II) intel(0): Digital Display Input<br>[     6.889] (II) intel(0): 6 bits per channel<br>[     6.889] (II) intel(0): Digital interface is undefined<br>[     6.889] (II) intel(0): Max Image Size [cm]: horiz.: 34  vert.: 19<br>[     6.889] (II) intel(0): Gamma: 2.20<br>[     6.889] (II) intel(0): No DPMS capabilities specified<br>[     6.889] (II) intel(0): Supported color encodings: RGB 4:4:4 <br>[     6.889] (II) intel(0): First detailed timing is preferred mode<br>[     6.889] (II) intel(0): Preferred mode is native pixel format and refresh rate<br>[     6.889] (II) intel(0): redX: 0.676 redY: 0.314   greenX: 0.215 greenY: 0.665<br>[     6.889] (II) intel(0): blueX: 0.141 blueY: 0.069   whiteX: 0.313 whiteY: 0.329<br>[     6.889] (II) intel(0): Manufacturer's mask: 0<br>[     6.889] (II) intel(0): Supported detailed timing:<br>[     6.889] (II) intel(0): clock: 144.6 MHz   Image Size:  344 x 193 mm<br>[     6.889] (II) intel(0): h_active: 1920  h_sync: 1980  h_sync_end 2028 h_blank_end 2132 h_b<br>order: 0<br>[     6.889] (II) intel(0): v_active: 1080  v_sync: 1090  v_sync_end 1100 v_blanking: 1130 v_b<br>order: 0<br>[     6.889] (II) intel(0): Supported detailed timing:<br>[     6.889] (II) intel(0): clock: 144.6 MHz   Image Size:  344 x 193 mm<br>[     6.889] (II) intel(0): h_active: 1920  h_sync: 1980  h_sync_end 2028 h_blank_end 2558 h_b<br>order: 0<br>[     6.889] (II) intel(0): v_active: 1080  v_sync: 1090  v_sync_end 1100 v_blanking: 1130 v_b<br>order: 0<br>[     6.889] (II) intel(0):  AUO<br>[     6.889] (II) intel(0):  B156HTN01.1<br>[     6.889] (II) intel(0): EDID (in hex):<br>[     6.889] (II) intel(0):   00ffffffffffff0006afed11000000<wbr>00<br>[     6.889] (II) intel(0):        0016010490221378022135ad5037aa<wbr>24<br>[     6.889] (II) intel(0):        115054000000010101010101010101<wbr>01<br>[     6.889] (II) intel(0):        0101010101017c3880d4703832403c<wbr>30<br>[     6.889] (II) intel(0):        aa0058c1100000187c38807e723832<wbr>40<br>[     6.889] (II) intel(0):        3c30aa0058c110000018000000fe00<wbr>41<br>[     6.889] (II) intel(0):        554f0a202020202020202020000000<wbr>fe<br>[     6.889] (II) intel(0):        004231353648544e30312e31200a00<wbr>81<br>[     6.889] (II) intel(0): EDID vendor "AUO", prod id 4589<br>[     6.889] (II) intel(0): Printing DDC gathered Modelines:<br>[     6.889] (II) intel(0): Modeline "1920x1080"x0.0  144.60  1920 1980 2028 2132  1080 1090 1<br>100 1130 -hsync -vsync (67.8 kHz eP)<br>[     6.889] (II) intel(0): Modeline "1920x1080"x0.0  144.60  1920 1980 2028 2558  1080 1090 1<br>100 1130 -hsync -vsync (56.5 kHz e)<br>[     6.889] (II) intel(0): Printing probed modes for output LVDS1<br>[     6.889] (II) intel(0): Modeline "1920x1080"x60.0  144.60  1920 1980 2028 2132  1080 1090 <br>1100 1130 -hsync -vsync (67.8 kHz eP)<br>[     6.889] (II) intel(0): Modeline "1920x1080"x50.0  144.60  1920 1980 2028 2558  1080 1090 <br>1100 1130 -hsync -vsync (56.5 kHz e)<br>[     6.889] (II) intel(0): Modeline "1920x1080"x59.9  138.50  1920 1968 2000 2080  1080 1083 <br>1088 1111 +hsync -vsync (66.6 kHz d)<br>[     6.889] (II) intel(0): Modeline "1680x1050"x60.0  146.25  1680 1784 1960 2240  1050 1053 <br>1059 1089 -hsync +vsync (65.3 kHz d)<br>[     6.889] (II) intel(0): Modeline "1680x1050"x59.9  119.00  1680 1728 1760 1840  1050 1053 <br>1059 1080 +hsync -vsync (64.7 kHz d)<br>[     6.889] (II) intel(0): Modeline "1600x1024"x60.2  103.12  1600 1600 1656 1664  1024 1024 <br>1029 1030 +hsync +vsync (62.0 kHz d)<br>[     6.889] (II) intel(0): Modeline "1400x1050"x60.0  122.00  1400 1488 1640 1880  1050 1052 <br>1064 1082 +hsync +vsync (64.9 kHz d)<br>[     6.889] (II) intel(0): Modeline "1600x900"x60.0  119.00  1600 1696 1864 2128  900 901 904<br> 932 -hsync +vsync (55.9 kHz)<br>[     6.889] (II) intel(0): Modeline "1280x1024"x60.0  108.00  1280 1328 1440 1688  1024 1025 <br>1028 1066 +hsync +vsync (64.0 kHz d)<br>[     6.889] (II) intel(0): Modeline "1440x900"x59.9  106.50  1440 1520 1672 1904  900 903 909<br> 934 -hsync +vsync (55.9 kHz d)<br>[     6.889] (II) intel(0): Modeline "1280x960"x60.0  108.00  1280 1376 1488 1800  960 961 964<br> 1000 +hsync +vsync (60.0 kHz d)<br>[     6.889] (II) intel(0): Modeline "1368x768"x60.0   85.86  1368 1440 1584 1800  768 769 772<br> 795 -hsync +vsync (47.7 kHz)<br>[     6.889] (II) intel(0): Modeline "1360x768"x59.8   84.75  1360 1432 1568 1776  768 771 781<br> 798 -hsync +vsync (47.7 kHz d)<br>[     6.889] (II) intel(0): Modeline "1360x768"x60.0   72.00  1360 1408 1440 1520  768 771 781<br> 790 +hsync -vsync (47.4 kHz d)<br>[     6.889] (II) intel(0): Modeline "1152x864"x60.0   81.62  1152 1216 1336 1520  864 865 868<br> 895 -hsync +vsync (53.7 kHz d)<br>[     6.889] (II) intel(0): Modeline "1280x720"x60.0   74.48  1280 1336 1472 1664  720 721 724<br> 746 -hsync +vsync (44.8 kHz)<br>[     6.889] (II) intel(0): Modeline "1024x768"x60.0   65.00  1024 1048 1184 1344  768 771 777<br> 806 -hsync -vsync (48.4 kHz d)<br>[     6.889] (II) intel(0): Modeline "1024x576"x60.0   46.99  1024 1064 1168 1312  576 577 580<br> 597 -hsync +vsync (35.8 kHz)<br>[     6.889] (II) intel(0): Modeline "960x540"x60.0   40.78  960 992 1088 1216  540 541 544 55<br>9 -hsync +vsync (33.5 kHz)<br>[     6.889] (II) intel(0): Modeline "800x600"x60.3   40.00  800 840 968 1056  600 601 605 628<br> +hsync +vsync (37.9 kHz d)<br>[     6.889] (II) intel(0): Modeline "800x600"x56.2   36.00  800 824 896 1024  600 601 603 625<br> +hsync +vsync (35.2 kHz d)<br>[     6.889] (II) intel(0): Modeline "864x486"x60.0   32.90  864 888 976 1088  486 487 490 504<br> -hsync +vsync (30.2 kHz)<br>[     6.889] (II) intel(0): Modeline "640x480"x59.9   25.18  640 656 752 800  480 490 492 525 <br>-hsync -vsync (31.5 kHz d)<br>[     6.889] (II) intel(0): Modeline "720x405"x60.0   22.18  720 728 800 880  405 406 409 420 <br>-hsync +vsync (25.2 kHz)<br>[     6.889] (II) intel(0): Modeline "640x360"x60.0   17.19  640 640 704 768  360 361 364 373 <br>-hsync +vsync (22.4 kHz)<br><br>Complete information:<br><br>Initializing VGA without OPROM.<br>EDID:<br>00 ff ff ff ff ff ff 00 06 af ed 11 00 00 00 00 <br>00 16 01 04 90 22 13 78 02 21 35 ad 50 37 aa 24 <br>11 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 <br>01 01 01 01 01 01 7c 38 80 d4 70 38 32 40 3c 30 <br>aa 00 58 c1 10 00 00 18 7c 38 80 7e 72 38 32 40 <br>3c 30 aa 00 58 c1 10 00 00 18 00 00 00 fe 00 41 <br>55 4f 0a 20 20 20 20 20 20 20 20 20 00 00 00 fe <br>00 42 31 35 36 48 54 4e 30 31 2e 31 20 0a 00 81 <br>Extracted contents:<br>header:          00 ff ff ff ff ff ff 00<br>serial number:   06 af ed 11 00 00 00 00 00 16<br>version:         01 04<br>basic params:    90 22 13 78 02<br>chroma info:     21 35 ad 50 37 aa 24 11 50 54<br>established:     00 00 00<br>standard:        01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01<br>descriptor 1:    7c 38 80 d4 70 38 32 40 3c 30 aa 00 58 c1 10 00 00 18<br>descriptor 2:    7c 38 80 7e 72 38 32 40 3c 30 aa 00 58 c1 10 00 00 18<br>descriptor 3:    00 00 00 fe 00 41 55 4f 0a 20 20 20 20 20 20 20 20 20<br>descriptor 4:    00 00 00 fe 00 42 31 35 36 48 54 4e 30 31 2e 31 20 0a<br>extensions:      00<br>checksum:        81<br><br>Manufacturer: AUO Model 11ed Serial Number 0<br>Made week 0 of 2012<br>EDID version: 1.4<br>Digital display<br>6 bits per primary color channel<br>Digital interface is not defined<br>Maximum image size: 34 cm x 19 cm<br>Gamma: 220%<br>Check DPMS levels<br>Supported color formats: RGB 4:4:4<br>First detailed timing is preferred timing<br>Established timings supported:<br>Standard timings supported:<br>Detailed timings<br>Hex of detail: 7c3880d4703832403c30aa0058c110<wbr>000018<br>Detailed mode (IN HEX): Clock 144600 KHz, 158 mm x c1 mm<br>               0780 07bc 07ec 0854 hborder 0<br>               0438 0442 044c 046a vborder 0<br>               -hsync -vsync <br>Did detailed timing<br>Hex of detail: 7c38807e723832403c30aa0058c110<wbr>000018<br>Detailed mode (IN HEX): Clock 144600 KHz, 158 mm x c1 mm<br>               0780 07bc 07ec 09fe hborder 0<br>               0438 0442 044c 046a vborder 0<br>               -hsync -vsync <br>Hex of detail: 000000fe0041554f0a202020202020<wbr>202020<br>ASCII string: AUO<br>Hex of detail: 000000fe004231353648544e30312e<wbr>31200a<br>ASCII string: B156HTN01.1 <br>Checksum<br>Checksum: 0x81 (valid)<br>bringing up panel at resolution 1920 x 1080<br>Borders 0 x 0<br>Blank 212 x 50<br>Sync 48 x 10<br>Front porch 60 x 10<br>Spread spectrum clock<br>Dual channel<br>Polarities 1, 1<br>Data M1=10108272, N1=8388608<br>Link frequency 270000 kHz<br>Link M1=280785, N1=524288<br>Pixel N=2, M1=13, M2=4, P1=2<br>Pixel clock 144642 kHz<br>waiting for panel powerup<br>panel powered up</pre></div>