Linux USB
 help / color / mirror / Atom feed
* 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