Due to an influx of spam, we have had to impose restrictions on new accounts. Please see this wiki page for instructions on how to get full permissions. Sorry for the inconvenience.
Admin message
Equinix is shutting down its operations with us on April 30, 2025. They have graciously supported us for almost 5 years, but all good things come to an end. We are expecting to transition to new infrastructure between late March and mid-April. We do not yet have a firm timeline for this, but it will involve (probably multiple) periods of downtime as we move our services whilst also changing them to be faster and more responsive. Any updates will be posted in freedesktop/freedesktop#2011 as it becomes clear, and any downtime will be announced with further broadcast messages.
Project 'drm/intel' was moved to 'drm/i915/kernel'. Please update any links and bookmarks that may still have the old path.
Resuming from DPMS results in screen flashing on Dell Latitude 7200 2-in-1
Resuming the display after powersave results in flashes of the screen once per second with the display black most of the time. The display seems fine if it doesn't go into powersave. If you have an external display connected, they both blink together while trying to power on. If you close the keyboard on the tablet, the external display resumes properly.
i915 0000:00:02.0: [drm:intel_dp_start_link_train [i915]] Channel equalization failed 5 timesi915 0000:00:02.0: [drm:intel_dp_start_link_train [i915]] [CONNECTOR:95:eDP-1] Link Training failed at link rate = 270000, lane count = 2
This seems similar to, but slightly different from, #170 (closed)
I hardcoded intel_dp_link_training_channel_equalization return true (even for failure) and it brings the display back without the flashing. This was just from lockscreen blanking - not sleep.
Hi, any thoughts on this bug? The tablet is unusable once it starts the screen flashing. How bad is it to false return success from intel_dp_link_training_channel_equalization()? Below is the diff I tested with. Any other ideas to investigate? Thanks.
drm-tip doesn't have the flashing issue. I guess "drm/i915: Switch to
LTTPR non-transparent mode link training" or some of the other link
training change lets the hardware succeed?
Oh, this is interesting:
kernel: i915 0000:00:02.0: [drm:hsw_set_signal_levels [i915]] Using signal levels 02000000kernel: [drm:intel_dp_link_train_phy [i915]] ln0_1:0x71 ln2_3:0x0 align:0x0 sink:0x0 adj_req0_1:0x84 adj_req2_3:0x0kernel: i915 0000:00:02.0: [drm:intel_dp_link_train_phy [i915]] Channel equalization failed 5 timeskernel: i915 0000:00:02.0: [drm:intel_dp_link_train_phy [i915]] [CONNECTOR:95:eDP-1] Link Training failed at link rate = 270000, lane count = 2, at DPRXkernel: i915 0000:00:02.0: [drm:intel_enable_pipe [i915]] enabling pipe A
Note DPRX above, so not using LTTPR.
Looks like the link training logic is wrong. :
intel_dp_link_training_channel_equalization fails, so
intel_dp_link_train_phy fails, but:
intel_dp_link_train_all_phys(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state, int lttpr_count){ bool ret = true; int i; intel_dp_prepare_link_train(intel_dp, crtc_state); for (i = lttpr_count - 1; i >= 0; i--) { enum drm_dp_phy dp_phy = DP_PHY_LTTPR(i); ret = intel_dp_link_train_phy(intel_dp, crtc_state, dp_phy); intel_dp_disable_dpcd_training_pattern(intel_dp, dp_phy); if (!ret) break; } if (ret) intel_dp_link_train_phy(intel_dp, crtc_state, DP_PHY_DPRX);
Here we don't update ret, so linking training "succeeds" for DPRX.
This does let the 7200 display "work", but it's probably not what you
want in general.
I thought maybe f6adb5f06195 ("drm/i915: Reverse preemph vs. voltage swing preference") or 3625a1f5bf6b ("drm/i915: Fix DP_TRAIN_MAX_{PRE_EMPHASIS,SWING}_REACHED handling") would have fixed this. But I guess not.
Could you provide the output of the following right after booting and after DPMS-off/on and link training failure? You need the intel-gpu-tools package and CONFIG_DRM_DP_AUX_CHARDEV=y in your .config:
Below are a bunch with Fedora 5.6.6. Further down is drm-tip. I used 5.6.6 because I had it available, but also because it doesn't run link training during boot, so you get some output from how it booted. For drm-tip below, the commands are run after booting and the failed link training.
I ran some of the commands multiple times in the same state because dd if=/dev/drm_dp_aux0 output changed. Sometimes there was a delay with the dd command, so it may have to wait for a lock?
Fedora 5.6.6:
Boot:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx16+0 records in6+0 records out0000000 00 00 80 01 88 0000000066 bytes copied, 0.00314686 s, 1.9 kB/s[root@localhost ~]# intel_reg read --count=18 0x64e00Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0[root@localhost ~]# intel_reg read 0x6c00c 0x64000Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000083 (enabled not reversed x2 detected)
DPMS display off:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx10000000 00 00 00 00 00 006+0 records in6+0 records out00000066 bytes copied, 0.209733 s, 0.0 kB/s[root@localhost ~]# intel_reg read --count=18 0x64e00Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0[root@localhost ~]# intel_reg read 0x6c00c 0x64000Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x02000083 (disabled not reversed x2 detected)
Resume from dpms (screen flashing):
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 6+0 records in6+0 records out0000000 00 00 80 00 00 0000000066 bytes copied, 0.836563 s, 0.0 kB/s[root@localhost ~]# intel_reg read --count=18 0x64e00 Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0[root@localhost ~]# intel_reg read 0x6c00c 0x6400Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 (0x00006400): 0x00800000
Here's another one during the flashing:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 ; intel_reg read --count=18 0x64e00 ; intel_reg read 0x6c00c 0x640000000000 77 00 81 01 84 006+0 records in6+0 records out00000066 bytes copied, 0.00243746 s, 2.5 kB/sWarning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000003 (enabled not reversed x2 detected)
Back in DPMS display off after flashing timed out:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 ; intel_reg read --count=18 0x64e00 ; intel_reg read 0x6c00c 0x640000000000 11 00 80 00 88 006+0 records in6+0 records out00000066 bytes copied, 0.00364496 s, 1.6 kB/sWarning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000003 (enabled not reversed x2 detected)
Still DPMS display off:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 ; intel_reg read --count=18 0x64e00 ; intel_reg read 0x6c00c 0x640000000000 77 00 81 01 84 006+0 records in6+0 records out00000066 bytes copied, 0.00258747 s, 2.3 kB/sWarning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000003 (enabled not reversed x2 detected)
And again still in DPMS display off:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 ; intel_reg read --count=18 0x64e00 ; intel_reg read 0x6c00c 0x640000000000 00 00 80 00 00 006+0 records in6+0 records out00000066 bytes copied, 0.867339 s, 0.0 kB/sWarning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000003 (enabled not reversed x2 detected)
Another one still DPMS display off:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 ; intel_reg read --count=18 0x64e00 ; intel_reg read 0x6c00c 0x640006+0 records in6+0 records out0000000 00 00 80 01 84 0000000066 bytes copied, 0.00251313 s, 2.4 kB/sWarning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000003 (enabled not reversed x2 detected)
Hit keyboard and back to flashing:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 ; intel_reg read --count=18 0x64e00 ; intel_reg read 0x6c00c 0x640000000000 00 00 80 00 00 006+0 records in6+0 records out00000066 bytes copied, 0.0701186 s, 0.1 kB/sWarning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000003 (enabled not reversed x2 detected)
Again while flashing:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx1 ; intel_reg read --count=18 0x64e00 ; intel_reg read 0x6c00c 0x640000000000 77 00 81 01 84 006+0 records in6+0 records out00000066 bytes copied, 0.00274044 s, 2.2 kB/sWarning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000003 (enabled not reversed x2 detected)
drm-tip
Below are with drm-tip as of a few days ago. That ran and failed link training during boot, so the initial values may not be useful.
Boot:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx16+0 records in6+0 records out0000000 00 00 80 01 84 0000000066 bytes copied, 0.00400817 s, 1.5 kB/s[root@localhost ~]# intel_reg read --count=18 0x64e00Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0[root@localhost ~]# intel_reg read 0x6c00c 0x64000Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000083 (enabled not reversed x2 detected)
In DPMS (display off)
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx16+0 records in6+0 records out0000000 00 00 00 00 00 0000000066 bytes copied, 0.212114 s, 0.0 kB/s[root@localhost ~]# intel_reg read --count=18 0x64e00Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0[root@localhost ~]# intel_reg read 0x6c00c 0x64000Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x02000083 (disabled not reversed x2 detected)
Coming out of DPMS:
[root@localhost ~]# dd if=/dev/drm_dp_aux0 bs=1 count=6 skip=$(( 0x202 )) | od -tx16+0 records in6+0 records out0000000 00 00 80 01 84 0000000066 bytes copied, 0.00426736 s, 1.4 kB/s[root@localhost ~]# intel_reg read --count=18 0x64e00Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x00064e00): 0x0000201b (0x00064e04): 0x000000a1 (0x00064e08): 0x00005012 (0x00064e0c): 0x00000088 (0x00064e10): 0x80007011 (0x00064e14): 0x000000cd (0x00064e18): 0x80009010 (0x00064e1c): 0x000000c0 (0x00064e20): 0x0000201b (0x00064e24): 0x0000009d (0x00064e28): 0x80005012 (0x00064e2c): 0x000000c0 (0x00064e30): 0x80007011 (0x00064e34): 0x000000c0 (0x00064e38): 0x00002016 (0x00064e3c): 0x0000004f (0x00064e40): 0x80005012 (0x00064e44): 0x000000c0[root@localhost ~]# intel_reg read 0x6c00c 0x64000Warning: register spec not found in '/usr/share/igt-gpu-tools/registers'. Using builtin register spec. (0x0006c00c): 0x00000300 DDI_BUF_CTL_A (0x00064000): 0x82000083 (enabled not reversed x2 detected)
@jandryuk , thanks for the debug logs and sorry for the delay.
The DPCD AUX reads can be laggy due to the panel power sequencing delays.
The only notable thing in your logs is that BIOS didn't link train the panel either, (first link status read):
0000000 00 00 80 01 88 00
The other is that your panel supports the fast link training mode (no AUX exchange is needed), but that doesn't mean the link status shouldn't be set by the panel to the good state.
Could you please still clarify/try the following things:
Do you have an idea if this could be a HW issue (anyone else you know having such a device and different results, or booting Windows gives a different result)?
You're booting in UEFI mode, is there an easy way for you to try booting in legacy mode?
Could you boot drm-tip with i915.edp_vswing=1 ?
Could you boot making sure i915 is not probed (modprobe.blacklist=i915,snd_hda_intel 3, or nomodeset) and run intel_reg read --count=18 0x64e00 that way?
If we can't root cause the problem I think the solution would be prevent-edp-lt-fallback-from-minimum-config.patch , since it doesn't make sense to keep retrying LT with the same config, after the retry attempts in the LT EQ loop.
The low vswing version of the drive setting table is different, it's also visible from the regdump when you booted with i915.edp_vswing=1. This low vswing setting is part of the BIOS (VBT).
Based on your previous logs I presume that BIOS didn't manage to link train the panel either and it also uses the non-low-vswing version of the drive settings. Could you check if there happens to be any BIOS upgrade available and if not contact Dell explaining to them this problem?
@jandryuk, ok. I don't have the contact to the proper team. Maybe they would be responsive via their regular support channel if we can provide accurate info about the problem? Feel free to CC me in such a discussion.
Could you also attach your /sys/kernel/debug/dri/0/i915_vbt file?
About a quirk: we don't really know if it'd make things worse for someone else. If we give up finding the root cause then imo the disable-edp-fallback change would be still good enough for your case.
For Dell, their BIOS doesn't seem to check the link training result, right? Do you think having Dell set the equivalent of edp_vswing=1 is the correct solution for their firmware? Would linux i915 see edp_vswing=1 and adjust its settings accordingly?
BIOS leaves the DP link training status in a bad state, as indicated by the DPCD 0x202 register = 0 value right after booting.
Your VBT contains a regular vswing/pre-emph setting (400 mV, no pre-emph), and booting with edp_vswing=1 corresponds to a low level vswing/pre-emph setting (200 mV, no pre-emph). Yes, by having the low level setting in your VBT i915 would work the same way as when you boot with edp_vswing=1 and would apparently fix your panel. It's only the vendor who knows though if this is in fact the expected setting.
There are other odd panel values in the VBT, it specifies a 1024x768 mode using 1.62 Gbps x 2 lanes, which is different from your actual panel.
You can see these values by decoding the vbt blob with the igt/intel_decode_vbt tool.