From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smarthost01b.ixn.mail.zen.net.uk (smarthost01b.ixn.mail.zen.net.uk [212.23.1.21]) by mx.groups.io with SMTP id smtpd.web11.56134.1669926279746818075 for ; Thu, 01 Dec 2022 12:24:40 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=permerror, err=parse error for token &{10 18 sdn.klaviyomail.com}: permanent DNS error (domain: starlabs.systems, ip: 212.23.1.21, mailfrom: sean@starlabs.systems) Received: from [217.155.46.38] (helo=starbook..) by smarthost01b.ixn.mail.zen.net.uk with esmtp (Exim 4.90_1) (envelope-from ) id 1p0q6m-0005lx-6j; Thu, 01 Dec 2022 20:24:36 +0000 From: "Sean Rhodes" To: devel@edk2.groups.io Cc: Matt DeVillier , Hao A Wu , Ray Ni , Sean Rhodes Subject: [PATCH 1/4] MdeModulePkg/XhciDxe/XhciReg: Handle incorrect PSIV indices Date: Thu, 1 Dec 2022 20:24:30 +0000 Message-Id: <0bd92ce8c58e964edacdb85a5d7c4f600aecbaa4.1669926273.git.sean@starlabs.systems> X-Mailer: git-send-email 2.37.2 MIME-Version: 1.0 X-Originating-smarthost01b-IP: [217.155.46.38] Feedback-ID: 217.155.46.38 Content-Transfer-Encoding: quoted-printable From: Matt DeVillier On some platforms, including Sky Lake and Kaby Lake, the PSIV (Protocol Speed ID Value) indicesare shared between Protocol Speed ID DWORD' in the extended capabilities registers for both USB2 (Full Speed) and USB3 (Super Speed). An example can be found below: XhcCheckUsbPortSpeedUsedPsic: checking for USB2 ext caps XhciPsivGetPsid: found 3 PSID entries XhciPsivGetPsid: looking for port speed 1 XhciPsivGetPsid: PSIV 1 PSIE 2 PLT 0 PSIM 12 XhciPsivGetPsid: PSIV 2 PSIE 1 PLT 0 PSIM 1500 XhciPsivGetPsid: PSIV 3 PSIE 2 PLT 0 PSIM 480 XhcCheckUsbPortSpeedUsedPsic: checking for USB3 ext caps XhciPsivGetPsid: found 3 PSID entries XhciPsivGetPsid: looking for port speed 1 XhciPsivGetPsid: PSIV 1 PSIE 3 PLT 0 PSIM 5 XhciPsivGetPsid: PSIV 2 PSIE 3 PLT 0 PSIM 10 XhciPsivGetPsid: PSIV 34 PSIE 2 PLT 0 PSIM 1248 The result is edk2 detecting USB2 devices as USB3 devices, which consequently causes enumeration to fail. To avoid incorrect detection, check the extended capability registers for USB2 before USB3. If edk2 finds a match for a USB 2 device, don't check for USB 3. Cc: Hao A Wu Cc: Ray Ni Reviewed-by: Sean Rhodes Signed-off-by: Matt DeVillier Change-Id: I5bcf32105ce85fda95b4ba98a5e420e8f522374c --- MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c | 36 +++++++++++++++----------- MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h | 1 + 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c b/MdeModulePkg/Bus/Pci/= XhciDxe/XhciReg.c index 2b4a4b2444..c992323443 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c @@ -698,25 +698,11 @@ XhcCheckUsbPortSpeedUsedPsic ( SpField.Dword =3D 0;=0D UsbSpeedIdMap =3D 0;=0D =0D - //=0D - // Check xHCI Supported Protocol Capability, find the PSIV field to matc= h=0D - // PortSpeed definition when the Major Revision is 03h.=0D - //=0D - if (Xhc->Usb3SupOffset !=3D 0xFFFFFFFF) {=0D - SpField.Dword =3D XhciPsivGetPsid (Xhc, Xhc->Usb3SupOffset, PortSpeed)= ;=0D - if (SpField.Dword !=3D 0) {=0D - //=0D - // Found the corresponding PORTSC value in PSIV field of USB3 offset= .=0D - //=0D - UsbSpeedIdMap =3D USB_PORT_STAT_SUPER_SPEED;=0D - }=0D - }=0D -=0D //=0D // Check xHCI Supported Protocol Capability, find the PSIV field to matc= h=0D // PortSpeed definition when the Major Revision is 02h.=0D //=0D - if ((UsbSpeedIdMap =3D=3D 0) && (Xhc->Usb2SupOffset !=3D 0xFFFFFFFF)) {= =0D + if (Xhc->Usb2SupOffset !=3D 0xFFFFFFFF) {=0D SpField.Dword =3D XhciPsivGetPsid (Xhc, Xhc->Usb2SupOffset, PortSpeed)= ;=0D if (SpField.Dword !=3D 0) {=0D //=0D @@ -733,6 +719,12 @@ XhcCheckUsbPortSpeedUsedPsic ( // PSIM shows as default High-speed protocol, apply to High-spee= d mapping=0D //=0D UsbSpeedIdMap =3D USB_PORT_STAT_HIGH_SPEED;=0D + } else if (SpField.Data.Psim =3D=3D XHC_SUPPORTED_PROTOCOL_USB2_FU= LL_SPEED_PSIM) {=0D + //=0D + // PSIM shows as default Full-speed protocol, return 0=0D + // to ensure no port status set=0D + //=0D + return 0;=0D }=0D } else if (SpField.Data.Psie =3D=3D 1) {=0D //=0D @@ -750,6 +742,20 @@ XhcCheckUsbPortSpeedUsedPsic ( }=0D }=0D =0D + //=0D + // Check xHCI Supported Protocol Capability, find the PSIV field to matc= h=0D + // PortSpeed definition when the Major Revision is 03h.=0D + //=0D + if ((UsbSpeedIdMap =3D=3D 0) && (Xhc->Usb3SupOffset !=3D 0xFFFFFFFF)) {= =0D + SpField.Dword =3D XhciPsivGetPsid (Xhc, Xhc->Usb3SupOffset, PortSpeed)= ;=0D + if (SpField.Dword !=3D 0) {=0D + //=0D + // Found the corresponding PORTSC value in PSIV field of USB3 offset= .=0D + //=0D + UsbSpeedIdMap =3D USB_PORT_STAT_SUPER_SPEED;=0D + }=0D + }=0D +=0D return UsbSpeedIdMap;=0D }=0D =0D diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h b/MdeModulePkg/Bus/Pci/= XhciDxe/XhciReg.h index 5fe2ba4f0e..74ac6297ba 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h @@ -85,6 +85,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define XHC_SUPPORTED_PROTOCOL_DW2_OFFSET 0x08=0D #define XHC_SUPPORTED_PROTOCOL_PSI_OFFSET 0x10=0D #define XHC_SUPPORTED_PROTOCOL_USB2_HIGH_SPEED_PSIM 480=0D +#define XHC_SUPPORTED_PROTOCOL_USB2_FULL_SPEED_PSIM 12=0D #define XHC_SUPPORTED_PROTOCOL_USB2_LOW_SPEED_PSIM 1500=0D =0D #pragma pack (1)=0D --=20 2.37.2