Bug 218465

Summary: Linux warning `usb: port power management may be unreliable` on Dell XPS 13 9360
Product: Drivers Reporter: Paul Menzel (pmenzel+bugzilla.kernel.org)
Component: USBAssignee: Default virtual assignee for Drivers/USB (drivers_usb)
Status: RESOLVED DUPLICATE    
Severity: normal CC: mathias.nyman, pmenzel+bugzilla.kernel.org
Priority: P3    
Hardware: All   
OS: Linux   
Kernel Version: Subsystem:
Regression: No Bisected commit-id:
Attachments: Output of `acpidump` with system firmware 1.21.0

Description Paul Menzel 2024-02-06 09:00:55 UTC
This issue is to attach files to debug the Linux warning reported to linux-usb [1].

[1]: https://lore.kernel.org/linux-usb/e595bcb8-bfc0-aa12-a5c1-a62c5fe9e950@linux.intel.com/T/#t
Comment 1 Paul Menzel 2024-02-06 09:02:00 UTC
Created attachment 305840 [details]
Output of `acpidump` with system firmware 1.21.0
Comment 2 Mathias Nyman 2024-02-12 10:44:16 UTC
High-speed (HS) ans SuperSpeed (SS) ports are peered based on their Physical Location Description (_PLD) object in ACPI tables.

The SSDT7 ACPI table dump shows that _PLD is created by calling a GPLD
helper method with some parameters. For High-Speed ports (HS0x) this seems
to be called with increasing port numer up to HS port 5. From port 6 onwards
all parameters are 0.

Scope (\_SB.PCI0.XHC.RHUB.HS01)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (One, One))

Scope (\_SB.PCI0.XHC.RHUB.HS02)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (One, 0x02))
...
Scope (\_SB.PCI0.XHC.RHUB.HS05)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (Zero, 0x05))

Scope (\_SB.PCI0.XHC.RHUB.HS06)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (Zero, Zero))

Scope (\_SB.PCI0.XHC.RHUB.HS07)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (Zero, Zero))

For SuperSpeed ports (SS0x) the same is true. Ports 1-

Scope (\_SB.PCI0.XHC.RHUB.SS01)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (One, One))

Scope (\_SB.PCI0.XHC.RHUB.SS02)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (One, 0x02))

Scope (\_SB.PCI0.XHC.RHUB.SS03)
    Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
        Return (GPLD (Zero, Zero))

Scope (\_SB.PCI0.XHC.RHUB.SS04)
    Method (_UPC, 0, NotSerialized)  // _UPC: USB Port Capabilities
        Return (GPLD (Zero, Zero))

Basically all HS port from 6 upwards and SS ports from 3 upwards report the
same _PLD, this messes up port peering and results in the following messages during boot:  

usb usb2-port1: peered to usb1-port1
usb usb2-port2: peered to usb1-port2
usb usb2-port3: peered to usb1-port6
usb: failed to peer usb2-port4 and usb1-port6 by location (usb2-port4:none) (usb1-port6:usb2-port3)
usb usb2-port4: failed to peer to usb1-port6 (-16)
usb: port power management may be unreliable
usb: failed to peer usb2-port5 and usb1-port6 by location (usb2-port5:none) (usb1-port6:usb2-port3)
usb usb2-port5: failed to peer to usb1-port6 (-16)
usb: failed to peer usb2-port6 and usb1-port6 by location (usb2-port6:none) (usb1-port6:usb2-port3)
usb usb2-port6: failed to peer to usb1-port6 (-16)
Comment 3 Paul Menzel 2024-02-12 12:16:20 UTC
Thank you for the analysis. Excuse my ignorance, but does this mean it’s a firmware issue, or Linux’ assumptions are incorrect?
Comment 4 Artem S. Tashkinov 2024-02-13 17:47:32 UTC

*** This bug has been marked as a duplicate of bug 218490 ***
Comment 5 Mathias Nyman 2024-02-15 09:37:21 UTC
This DELL machine has ACPI entries for USB ports that are not usable.
These ports are supported by xHCI host hardware but are not internally or externally connected anywhere.  They have _UPC (USB port capability) ACPI objects stating they are not connectable, and _PLD (Physical Location of Device) that just returns 0 for their group token group position.

So all unusable USB2 and USB3 ports have similar _PLD entries, which then confuses Linux when trying to pair together USB2 and USB3 ports. 

Linux could probably ignore printing any warning messages for ports that
have _PLD entries but _UPC shows they are not connectable