* thunderbolt: second DP tunnel starved at boot while first tunnel's DPRX read is pending
@ 2026-11-07 15:11 Mykola Dimura
2026-11-09 11:00 ` Mika Westerberg
0 siblings, 1 reply; 3+ messages in thread
From: Mykola Dimura @ 2026-11-07 15:11 UTC (permalink / raw)
To: westeri; +Cc: linux-usb
[-- Attachment #1: Type: text/plain, Size: 3045 bytes --]
Hi,
With two monitors on a Thunderbolt 4 dock, one of them comes up limited
to 4K@30 after every boot (or dock re-plug). Which one gets 60 Hz is
effectively random. Plugging the monitors in one at a time, in the right
order, gives 4K@60 on both until the next boot. The cause is
the order-dependent DP tunnel bandwidth reservation in tb_tunnel_one_dp().
I was able to solve the issue with a patch to
`drivers/thunderbolt/tb.c`. Now I get 4K @ 60Hz
on both monitors every time.
Here is the repo with a fix:
https://github.com/mdimura/thunderbolt-dpcap-dkms
Setup
-----
Host: Dell Latitude 7430, Alder Lake-UP3 (Iris Xe, i915), BIOS 1.43.0
Host router 8087:463e, USB4 1.0, software CM
Dock: Dell WD22TB4 (00d4:b071), NVM 41.81
Link: 2 x 20 Gb/s (40 Gb/s), retimer 8087:15ee NVM 10.0
Sinks: 2x Samsung LU28R55 (4K@60, HDMI)
#1: dock rear TB4 port -> USB-C-to-HDMI adapter (SST)
#2: dock HDMI port, behind the dock's internal MST hub
Kernel: 7.2.14-arch1-1, default module parameters
(bw_alloc_mode=Y, dprx_timeout=12000)
Observed state (broken)
-----------------------
tbtunnels (tbtools) after boot:
Route 0 Adapter 5 <-> Route 3 Adapter 13: DisplayPort
Rate: 5400 Mb/s * 4
Route 0 Adapter 6 <-> Route 3 Adapter 14: DisplayPort
Rate: 2700 Mb/s * 4
Route 0 Adapter 9 <-> Route 3 Adapter 9: PCIe
Route 0 Adapter 13 <-> Route 3 Adapter 16: USB 3
Allocated Upstream/Downstream Bandwidth: 9003/9003 Mb/s
DPCD 0x0001/0x0002 read via /dev/drm_dp_aux* (as seen by i915):
TC1 (tunnel 0:5 -> 3:13): max 0x14 / 0xc4 (HBR2 x4) -> 4K@60
TC2 (tunnel 0:6 -> 3:14): max 0x0a / 0xc4 (HBR x4) -> 4K@30 only
i915 drops the 4K@60 modes on the MST connector because HBR x4
(8640 Mb/s) cannot carry 4K@60 at 8 bpc (~12.8 Gb/s).
Workaround
----------
Add a parameter capping the per-tunnel reservation in tb_tunnel_one_dp():
```
if (dp_max_bw > 0)
{
if (available_up > dp_max_bw)
available_up = dp_max_bw;
if (available_down > dp_max_bw)
available_down = dp_max_bw;
}
```
With thunderbolt.dp_max_bw=17280 both tunnels come up at HBR2 x4 and
both monitors run at 4K@60 on every boot. That is a user knob, though,
not a fix. Some possible proper fixes:
a) Defer creating a new DP tunnel while another DP tunnel sharing the
same links still has its DPRX read pending. Call tb_tunnel_dp()
again from tb_dp_tunnel_active() once it completes.
b) After a DPRX read completes and frees bandwidth, re-run
xchg_caps/re-establish DP tunnels that were reduced earlier.
c) When several DP OUTs are available at once, split the available
bandwidth between the pending tunnels instead of first-come
first-served.
Note that (a) alone does not cover every ordering. If the MST hub's
tunnel goes first, its DPRX is genuinely HBR3 x4 (25920 Mb/s), and the
second tunnel is still starved. So some form of (b) or (c) seems
necessary.
I'm happy to test patches.
Diagnostic output attached.
Best regards,
Mykola Dimura.
[-- Attachment #2: tb-diag.txt --]
[-- Type: text/plain, Size: 17863 bytes --]
=== tblist
Domain 0
Type: Domain
Security Level: User
Deauthorization: Yes
IOMMU DMA protection: Yes
Kernel name: domain0
Domain 0 Route 0: 8087:463e INTEL Gen12
Type: Router
UUID: 3e7c8780-8071-76b2-ffff-ffffffffffff
Generation: USB4 1.0
Kernel name: 0-0
Domain 0 Route 0 Adapter 3 Index 1: 8087:15ee
Type: Retimer
NVM version: 10.0
Kernel name: 0-0:3.1
Domain 0 Route 3: 00d4:b071 Dell WD22TB4 Thunderbolt Dock
Type: Router
Speed (Rx/Tx): 40/40 Gb/s
Authorized: Yes
UUID: 5b468780-00d8-b948-ffff-ffffffffffff
Generation: USB4 1.0
NVM version: 41.81
Kernel name: 0-3
=== tbadapters host router
1: Lane 0 CLd
2: Lane 1 CLd
3: Lane 0 CL0
4: Lane 1 CL0
5: DisplayPort IN Enabled
6: DisplayPort IN Enabled
7: Host Interface (upstream) Enabled
8: PCIe Down Disabled
9: PCIe Down L1
10: Not implemented
11: Not implemented
12: USB 3 Down Disabled
13: USB 3 Down U0
=== tbadapters dock router
1: Lane 0 (upstream) CL0
2: Lane 1 CL0
3: Lane 0 CLd
4: Lane 1 CLd
5: Lane 0 CLd
6: Lane 1 CLd
7: Not implemented
8: Not implemented
9: PCIe Up L1
10: PCIe Down Disabled
11: PCIe Down Disabled
12: Not implemented
13: DisplayPort OUT Enabled
14: DisplayPort OUT Enabled
15: Not implemented
16: USB 3 Up U0
17: USB 3 Down Disabled
18: USB 3 Down Disabled
19: USB 3 Down Disabled
=== tbtunnels
Domain 0 Route 0 Adapter 5 ⇔ Domain 0 Route 3 Adapter 13: DisplayPort
Rate: 5400 Mb/s * 4
Route 0 Adapter 5 ⇒ Route 3 Adapter 13: Video
Route 0 Adapter 5 ⇒ Route 3 Adapter 13: AUX TX
Route 3 Adapter 13 ⇒ Route 0 Adapter 5: AUX RX
Domain 0 Route 0 Adapter 6 ⇔ Domain 0 Route 3 Adapter 14: DisplayPort
Rate: 2700 Mb/s * 4
Route 0 Adapter 6 ⇒ Route 3 Adapter 14: Video
Route 0 Adapter 6 ⇒ Route 3 Adapter 14: AUX TX
Route 3 Adapter 14 ⇒ Route 0 Adapter 6: AUX RX
Domain 0 Route 0 Adapter 9 ⇔ Domain 0 Route 3 Adapter 9: PCIe
Route 0 Adapter 9 ⇒ Route 3 Adapter 9: PCIe Down
Route 3 Adapter 9 ⇒ Route 0 Adapter 9: PCIe Up
Domain 0 Route 0 Adapter 13 ⇔ Domain 0 Route 3 Adapter 16: USB 3
Allocated Upstream Bandwidth: 9003 Mb/s
Allocated Downstream Bandwidth: 9003 Mb/s
Route 0 Adapter 13 ⇒ Route 3 Adapter 16: USB 3 Down
Route 3 Adapter 16 ⇒ Route 0 Adapter 13: USB 3 Up
=== DPCD max link rate/lanes as seen by GPU (0x0001,0x0002) + trained (0x0100,0x0101)
/dev/drm_dp_aux0 [AUX A/DDI A/PHY A] max: 0a c2 trained: 0a 82
/dev/drm_dp_aux1 [AUX USBC1/DDI TC1/PHY TC1] max: 14 c4 trained: 14 84
/dev/drm_dp_aux2 [AUX USBC2/DDI TC2/PHY TC2] max: 0a c4 trained: 0a 04
/dev/drm_dp_aux3 [DPMST] max: trained:
/dev/drm_dp_aux4 [DPMST] max: trained:
/dev/drm_dp_aux5 [DPMST] max: trained:
=== i915_display_info
CRTC info
---------
[CRTC:151:pipe A]:
uapi: enable=no, active=no, mode="": 0 0 0 0 0 0 0 0 0 0 0x0 0x0
hw: enable=no, active=no
adjusted_mode="": 0 0 0 0 0 0 0 0 0 0 0x0 0x0
pipe__mode="": 0 0 0 0 0 0 0 0 0 0 0x0 0x0
pipe src=0x0+0+0, dither=no, bpp=0
port_clock=0, lane_count=0
num_scalers=2, scaler_users=0 scaler_id=-1 scaling_filter=0 sharpness_strength=0, scalers[0]: use=no, mode=0, scalers[1]: use=no, mode=0
background color (10bpc XRGB2101010): 00000000
[PLANE:35:plane 1A]: type=PRI
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=1920.000000x1080.000000+0.000000+0.000000, dst=1920x1080+0+0, rotation=0 (0x00000001)
[PLANE:65:plane 2A]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:95:plane 3A]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:125:plane 4A]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:135:plane 5A]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:145:cursor A]: type=CUR
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
underrun reporting: cpu=yes pch=yes
[CRTC:269:pipe B]:
uapi: enable=yes, active=yes, mode="3840x2160": 60 594000 3840 4016 4104 4400 2160 2168 2178 2250 0x48 0x5
hw: enable=yes, active=yes
adjusted_mode="3840x2160": 60 594000 3840 4016 4104 4400 2160 2168 2178 2250 0x48 0x5
pipe__mode="3840x2160": 60 594000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
pipe src=3840x2160+0+0, dither=no, bpp=24
port_clock=540000, lane_count=4
num_scalers=2, scaler_users=0 scaler_id=-1 scaling_filter=0 sharpness_strength=0, scalers[0]: use=no, mode=0, scalers[1]: use=no, mode=0
background color (10bpc XRGB2101010): 00000000
[ENCODER:525:DDI TC1/PHY TC1]: connectors:
[CONNECTOR:526:DP-1]
[PLANE:153:plane 1B]: type=PRI
uapi: [FB:567] AB30 little-endian (0x30334241),0x100000000000008,3840x2160, visible=visible, src=3840.000000x2160.000000+0.000000+0.000000, dst=3840x2160+0+0, rotation=0 (0x00000001)
hw: [FB:567] AB30 little-endian (0x30334241),0x100000000000008,3840x2160, visible=yes, src=3840.000000x2160.000000+0.000000+0.000000, dst=3840x2160+0+0, rotation=0 (0x00000001)
[PLANE:183:plane 2B]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:213:plane 3B]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:243:plane 4B]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:253:plane 5B]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:263:cursor B]: type=CUR
uapi: [FB:563] AR24 little-endian (0x34325241),0x0,64x64, visible=visible, src=64.000000x64.000000+0.000000+0.000000, dst=64x64+2002+1189, rotation=0 (0x00000001)
hw: [FB:563] AR24 little-endian (0x34325241),0x0,64x64, visible=yes, src=64.000000x64.000000+0.000000+0.000000, dst=64x64+2002+1189, rotation=0 (0x00000001)
underrun reporting: cpu=yes pch=yes
[CRTC:387:pipe C]:
uapi: enable=yes, active=yes, mode="3840x2160": 30 297000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
hw: enable=yes, active=yes
adjusted_mode="3840x2160": 30 297000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
pipe__mode="3840x2160": 30 297000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
pipe src=3840x2160+0+0, dither=no, bpp=24
port_clock=270000, lane_count=4
num_scalers=2, scaler_users=0 scaler_id=-1 scaling_filter=0 sharpness_strength=0, scalers[0]: use=no, mode=0, scalers[1]: use=no, mode=0
background color (10bpc XRGB2101010): 00000000
[ENCODER:539:DP-MST C]: connectors:
[CONNECTOR:560:DP-6]
[PLANE:271:plane 1C]: type=PRI
uapi: [FB:554] AB30 little-endian (0x30334241),0x100000000000008,3840x2160, visible=visible, src=3840.000000x2160.000000+0.000000+0.000000, dst=3840x2160+0+0, rotation=0 (0x00000001)
hw: [FB:554] AB30 little-endian (0x30334241),0x100000000000008,3840x2160, visible=yes, src=3840.000000x2160.000000+0.000000+0.000000, dst=3840x2160+0+0, rotation=0 (0x00000001)
[PLANE:301:plane 2C]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:331:plane 3C]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:361:plane 4C]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:371:plane 5C]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:381:cursor C]: type=CUR
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=64.000000x64.000000+0.000000+0.000000, dst=64x64-6+760, rotation=0 (0x00000001)
underrun reporting: cpu=yes pch=yes
[CRTC:505:pipe D]:
uapi: enable=no, active=no, mode="": 0 0 0 0 0 0 0 0 0 0 0x0 0x0
hw: enable=no, active=no
adjusted_mode="": 0 0 0 0 0 0 0 0 0 0 0x0 0x0
pipe__mode="": 0 0 0 0 0 0 0 0 0 0 0x0 0x0
pipe src=0x0+0+0, dither=no, bpp=0
port_clock=0, lane_count=0
num_scalers=2, scaler_users=0 scaler_id=-1 scaling_filter=0 sharpness_strength=0, scalers[0]: use=no, mode=0, scalers[1]: use=no, mode=0
background color (10bpc XRGB2101010): 00000000
[PLANE:389:plane 1D]: type=PRI
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:419:plane 2D]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:449:plane 3D]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:479:plane 4D]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:489:plane 5D]: type=OVL
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
[PLANE:499:cursor D]: type=CUR
uapi: [FB:0] n/a,0x0,0x0,, visible=hidden, src=0.000000x0.000000+0.000000+0.000000, dst=0x0+0+0, rotation=0 (0x00000001)
underrun reporting: cpu=yes pch=yes
Connector info
--------------
[CONNECTOR:508:eDP-1]: status: connected
physical dimensions: 310x170mm
subpixel order: Unknown
CEA rev: 0
DPCD rev: 14
audio support: no
DP branch device present: no
HDCP version: No Connector Support
max bpc: 8
fixed modes:
"1920x1080": 60 138700 1920 1968 2000 2080 1080 1083 1088 1111 0x48 0x9
"1920x1080": 48 110960 1920 1968 2000 2080 1080 1083 1088 1111 0x40 0x9
modes:
"1920x1080": 60 138700 1920 1968 2000 2080 1080 1083 1088 1111 0x48 0x9
"1920x1080": 48 110960 1920 1968 2000 2080 1080 1083 1088 1111 0x40 0x9
[CONNECTOR:517:HDMI-A-1]: status: disconnected
[CONNECTOR:526:DP-1]: status: connected
physical dimensions: 630x360mm
subpixel order: Unknown
CEA rev: 3
DPCD rev: 12
audio support: yes
DP branch device present: yes
Type: HDMI
ID: 176GB0
HW: 1.0
SW: 7.85
Max TMDS clock: 600000 kHz
Min TMDS clock: 25000 kHz
Max bpc: 12
TC Port D/TC#1: mode: tbt-alt, pin assignment: -, max lanes: 4
HDCP version: HDCP1.4 HDCP2.2
max bpc: 12
modes:
"3840x2160": 60 594000 3840 4016 4104 4400 2160 2168 2178 2250 0x48 0x5
"3840x2160": 60 594000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"3840x2160": 60 593407 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"3840x2160": 50 594000 3840 4896 4984 5280 2160 2168 2178 2250 0x40 0x5
"3840x2160": 30 297000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"3840x2160": 30 297000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"3840x2160": 30 296703 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"2560x1440": 60 241500 2560 2608 2640 2720 1440 1443 1448 1481 0x40 0x9
"1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x40 0x5
"1920x1080": 60 148352 1920 2008 2052 2200 1080 1084 1089 1125 0x40 0x5
"1920x1080": 50 148500 1920 2448 2492 2640 1080 1084 1089 1125 0x40 0x5
"1920x1080": 50 148500 1920 2448 2492 2640 1080 1084 1089 1125 0x40 0x5
"1680x1050": 60 119000 1680 1728 1760 1840 1050 1053 1059 1080 0x40 0x9
"1600x900": 60 108000 1600 1624 1704 1800 900 901 904 1000 0x40 0x5
"1280x1024": 75 135000 1280 1296 1440 1688 1024 1025 1028 1066 0x40 0x5
"1280x1024": 60 108000 1280 1328 1440 1688 1024 1025 1028 1066 0x40 0x5
"1440x900": 60 88750 1440 1488 1520 1600 900 903 909 926 0x40 0x9
"1280x800": 60 71000 1280 1328 1360 1440 800 803 809 823 0x40 0x9
"1152x864": 75 108000 1152 1216 1344 1600 864 865 868 900 0x40 0x5
"1280x720": 60 74250 1280 1390 1430 1650 720 725 730 750 0x40 0x5
"1280x720": 60 74250 1280 1390 1430 1650 720 725 730 750 0x40 0x5
"1280x720": 60 74176 1280 1390 1430 1650 720 725 730 750 0x40 0x5
"1280x720": 50 74250 1280 1720 1760 1980 720 725 730 750 0x40 0x5
"1024x768": 75 78750 1024 1040 1136 1312 768 769 772 800 0x40 0x5
"1024x768": 70 75000 1024 1048 1184 1328 768 771 777 806 0x40 0xa
"1024x768": 60 65000 1024 1048 1184 1344 768 771 777 806 0x40 0xa
"832x624": 75 57284 832 864 928 1152 624 625 628 667 0x40 0xa
"800x600": 75 49500 800 816 896 1056 600 601 604 625 0x40 0x5
"800x600": 72 50000 800 856 976 1040 600 637 643 666 0x40 0x5
"800x600": 60 40000 800 840 968 1056 600 601 605 628 0x40 0x5
"800x600": 56 36000 800 824 896 1024 600 601 603 625 0x40 0x5
"720x576": 50 27000 720 732 796 864 576 581 586 625 0x40 0xa
"720x480": 60 27027 720 736 798 858 480 489 495 525 0x40 0xa
"720x480": 60 27000 720 736 798 858 480 489 495 525 0x40 0xa
"640x480": 75 31500 640 656 720 840 480 481 484 500 0x40 0xa
"640x480": 73 31500 640 664 704 832 480 489 492 520 0x40 0xa
"640x480": 67 30240 640 704 768 864 480 483 486 525 0x40 0xa
"640x480": 60 25200 640 656 752 800 480 490 492 525 0x40 0xa
"640x480": 60 25175 640 656 752 800 480 490 492 525 0x40 0xa
"720x400": 70 28320 720 738 846 900 400 412 414 449 0x40 0x6
[CONNECTOR:536:DP-2]: status: disconnected
[CONNECTOR:509:DP-3]: status: disconnected
[CONNECTOR:556:DP-4]: status: disconnected
[CONNECTOR:560:DP-6]: status: connected
physical dimensions: 630x360mm
subpixel order: Unknown
CEA rev: 3
audio support: yes
TC Port E/TC#2: mode: tbt-alt, pin assignment: -, max lanes: 4
HDCP version: HDCP1.4
MST Hub HDCP version: HDCP1.4 HDCP2.2
max bpc: 10
modes:
"3840x2160": 30 297000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"3840x2160": 30 297000 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"3840x2160": 30 296703 3840 4016 4104 4400 2160 2168 2178 2250 0x40 0x5
"2560x1440": 60 241500 2560 2608 2640 2720 1440 1443 1448 1481 0x40 0x9
"1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x40 0x5
"1920x1080": 60 148352 1920 2008 2052 2200 1080 1084 1089 1125 0x40 0x5
"1920x1080": 50 148500 1920 2448 2492 2640 1080 1084 1089 1125 0x40 0x5
"1920x1080": 50 148500 1920 2448 2492 2640 1080 1084 1089 1125 0x40 0x5
"1680x1050": 60 119000 1680 1728 1760 1840 1050 1053 1059 1080 0x40 0x9
"1600x900": 60 108000 1600 1624 1704 1800 900 901 904 1000 0x40 0x5
"1280x1024": 75 135000 1280 1296 1440 1688 1024 1025 1028 1066 0x40 0x5
"1280x1024": 60 108000 1280 1328 1440 1688 1024 1025 1028 1066 0x40 0x5
"1440x900": 60 88750 1440 1488 1520 1600 900 903 909 926 0x40 0x9
"1280x800": 60 71000 1280 1328 1360 1440 800 803 809 823 0x40 0x9
"1152x864": 75 108000 1152 1216 1344 1600 864 865 868 900 0x40 0x5
"1280x720": 60 74250 1280 1390 1430 1650 720 725 730 750 0x40 0x5
"1280x720": 60 74250 1280 1390 1430 1650 720 725 730 750 0x40 0x5
"1280x720": 60 74176 1280 1390 1430 1650 720 725 730 750 0x40 0x5
"1280x720": 50 74250 1280 1720 1760 1980 720 725 730 750 0x40 0x5
"1024x768": 75 78750 1024 1040 1136 1312 768 769 772 800 0x40 0x5
"1024x768": 70 75000 1024 1048 1184 1328 768 771 777 806 0x40 0xa
"1024x768": 60 65000 1024 1048 1184 1344 768 771 777 806 0x40 0xa
"832x624": 75 57284 832 864 928 1152 624 625 628 667 0x40 0xa
"800x600": 75 49500 800 816 896 1056 600 601 604 625 0x40 0x5
"800x600": 72 50000 800 856 976 1040 600 637 643 666 0x40 0x5
"800x600": 60 40000 800 840 968 1056 600 601 605 628 0x40 0x5
"800x600": 56 36000 800 824 896 1024 600 601 603 625 0x40 0x5
"720x576": 50 27000 720 732 796 864 576 581 586 625 0x40 0xa
"720x480": 60 27027 720 736 798 858 480 489 495 525 0x40 0xa
"720x480": 60 27000 720 736 798 858 480 489 495 525 0x40 0xa
"640x480": 75 31500 640 656 720 840 480 481 484 500 0x40 0xa
"640x480": 73 31500 640 664 704 832 480 489 492 520 0x40 0xa
"640x480": 67 30240 640 704 768 864 480 483 486 525 0x40 0xa
"640x480": 60 25200 640 656 752 800 480 490 492 525 0x40 0xa
"640x480": 60 25175 640 656 752 800 480 490 492 525 0x40 0xa
"720x400": 70 28320 720 738 846 900 400 412 414 449 0x40 0x6
=== dri debugfs DP entries
DP-1
DP-2
DP-3
DP-4
DP-6
eDP-1
i915_dp_mst_info
i915_dp_test_active
i915_dp_test_data
i915_dp_test_type
i915_edp_psr_debug
i915_edp_psr_status
i915_shared_dplls_info
=== kernel log (thunderbolt / i915 DP)
Nov 07 13:03:48 mykola-lpt kernel: usb 3-2.1.5: Product: Dell Thunderbolt Dock WD22TB4
Nov 07 13:03:48 mykola-lpt kernel: hid-generic 0003:413C:B06E.0001: hiddev96,hidraw0: USB HID v1.11 Device [Dell Thunderbolt Dock WD22TB4] on usb-0000:00:14.0-2.1.5/input0
Nov 07 13:03:48 mykola-lpt kernel: ACPI: bus type thunderbolt registered
Nov 07 13:03:52 mykola-lpt kernel: thunderbolt 0-3: new device found, vendor=0xd4 device=0xb071
Nov 07 13:03:52 mykola-lpt kernel: thunderbolt 0-3: Dell WD22TB4 Thunderbolt Dock
Nov 07 13:03:52 mykola-lpt kernel: thunderbolt 0-0:3.1: new retimer found, vendor=0x8087 device=0x15ee
Nov 07 13:03:54 mykola-lpt kernel: usb 3-2.1.5: Product: Dell Thunderbolt Dock WD22TB4
Nov 07 13:03:54 mykola-lpt kernel: hid-generic 0003:413C:B06E.0010: hiddev96,hidraw2: USB HID v1.11 Device [Dell Thunderbolt Dock WD22TB4] on usb-0000:00:14.0-2.1.5/input0
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: thunderbolt: second DP tunnel starved at boot while first tunnel's DPRX read is pending
2026-11-07 15:11 thunderbolt: second DP tunnel starved at boot while first tunnel's DPRX read is pending Mykola Dimura
@ 2026-11-09 11:00 ` Mika Westerberg
2026-11-09 19:54 ` Mykola Dimura
0 siblings, 1 reply; 3+ messages in thread
From: Mika Westerberg @ 2026-11-09 11:00 UTC (permalink / raw)
To: Mykola Dimura; +Cc: westeri, linux-usb
Hi,
On Sat, Nov 07, 2026 at 04:11:22PM +0100, Mykola Dimura wrote:
> Hi,
>
> With two monitors on a Thunderbolt 4 dock, one of them comes up limited
> to 4K@30 after every boot (or dock re-plug). Which one gets 60 Hz is
> effectively random. Plugging the monitors in one at a time, in the right
> order, gives 4K@60 on both until the next boot. The cause is
> the order-dependent DP tunnel bandwidth reservation in tb_tunnel_one_dp().
Yes, this is by design. It's now called the "legacy" mode because it works
exactly like the firmware CM: first monitor gets all, second gets what is
left. So plugging them one by one is the correct workaround. The solution
to this is the bandwidth allocation mode but unfortunately it's not
supported until Meteor Lake.
We don't really want to add any new command line parameters. I have an
internal patch series that makes it possible from userspace to affect the
monitor selection via eBPF but that's not yet ready to be upstreamed. It
would help in your case though.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: thunderbolt: second DP tunnel starved at boot while first tunnel's DPRX read is pending
2026-11-09 11:00 ` Mika Westerberg
@ 2026-11-09 19:54 ` Mykola Dimura
0 siblings, 0 replies; 3+ messages in thread
From: Mykola Dimura @ 2026-11-09 19:54 UTC (permalink / raw)
To: Mika Westerberg; +Cc: westeri, linux-usb
Hi,
I see, thank you for the answer. Hopefully, the eBPF patches will be
upstreamed at some point. In the meantime I can live with the
workaround I have now.
On Mon, 9 Nov 2026 at 12:00, Mika Westerberg
<mika.westerberg@linux.intel.com> wrote:
>
> Hi,
>
> On Sat, Nov 07, 2026 at 04:11:22PM +0100, Mykola Dimura wrote:
> > Hi,
> >
> > With two monitors on a Thunderbolt 4 dock, one of them comes up limited
> > to 4K@30 after every boot (or dock re-plug). Which one gets 60 Hz is
> > effectively random. Plugging the monitors in one at a time, in the right
> > order, gives 4K@60 on both until the next boot. The cause is
> > the order-dependent DP tunnel bandwidth reservation in tb_tunnel_one_dp().
>
> Yes, this is by design. It's now called the "legacy" mode because it works
> exactly like the firmware CM: first monitor gets all, second gets what is
> left. So plugging them one by one is the correct workaround. The solution
> to this is the bandwidth allocation mode but unfortunately it's not
> supported until Meteor Lake.
>
> We don't really want to add any new command line parameters. I have an
> internal patch series that makes it possible from userspace to affect the
> monitor selection via eBPF but that's not yet ready to be upstreamed. It
> would help in your case though.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-09 19:55 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-07 15:11 thunderbolt: second DP tunnel starved at boot while first tunnel's DPRX read is pending Mykola Dimura
2026-11-09 11:00 ` Mika Westerberg
2026-11-09 19:54 ` Mykola Dimura
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox