From nobody Sat Apr 27 03:37:53 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+89269+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+89269+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1650894307; cv=none; d=zohomail.com; s=zohoarc; b=LSL3nUbmX+GadC+x/qd6ZQ1kGd4KIcFMW5rRHeO5hDy/9NXlGaA6tfMgOAEaI70P1XxlXyUeCvsDJXmhUQLszCcbeM5qIgbfKLK4ON9iT0P7pC7T+dlW97tQ5srkGI8gRaXHvouJ4pyNdCj2U65H1yX129SJirgtH+TdBTclw6o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1650894307; h=Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=110A2uY2pwfTd+yNtZe2Gj4CmGU4q/1jeiPfRxwB25E=; b=OO8zEuMAAi+nroaPhf16RLwxdzZGPea/v5Jn4apUBpzrtgj10HVTd3h0n24OdIqmxu7gv/ARcrI/tMqYQYpSHMkVLu4IJRLqALJvyEDaylT81stxY3mH97nvhfNH9ZiNTiSARKOKTLpBaRoWqLT0zoXHJdAAn7FhiipqpxcGWCg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+89269+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1650894307212540.7122012985843; Mon, 25 Apr 2022 06:45:07 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 4CbxYY1788612xGElA6J0wCY; Mon, 25 Apr 2022 06:45:06 -0700 X-Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web10.29504.1650894305418645611 for ; Mon, 25 Apr 2022 06:45:05 -0700 X-IronPort-AV: E=McAfee;i="6400,9594,10327"; a="264767839" X-IronPort-AV: E=Sophos;i="5.90,288,1643702400"; d="scan'208";a="264767839" X-Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2022 06:45:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,288,1643702400"; d="scan'208";a="677099862" X-Received: from jliu28x-desk3.gar.corp.intel.com ([10.5.215.163]) by orsmga004.jf.intel.com with ESMTP; 25 Apr 2022 06:45:02 -0700 From: ian.chiu@intel.com To: devel@edk2.groups.io Cc: Ian Chiu , Jenny Huang , More Shih , Hao A Wu , Ray Ni Subject: [edk2-devel] [PATCH v2] MdeModulePkg/XhciDxe: Add access xHCI Extended Capabilities Pointer Date: Mon, 25 Apr 2022 21:44:59 +0800 Message-Id: <20220425134459.2695-1-ian.chiu@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ian.chiu@intel.com X-Gm-Message-State: wSiHQaTxO88mEUHCglhlsAjQx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1650894306; bh=z9GSMHlltT1Nvxyru1XfUJVfbdgJs6Da6Jw1G7HQsOE=; h=Cc:Date:From:Reply-To:Subject:To; b=UtyApcJTTZnbXtnnvW6znB8QSfxSfdw/OaIWQYiLpaUjAV8jVqReQEPr0JDPnAhkY9l 7EfBDmdQRcrJj0BZwfmdXh1LGdxSJlPrEjS3kVF2UNaNOe8Pp0AuH3N0xHkg5kvn/KABi 3gcDYFNMaMNqSTHdfjJYm+bQj6myVI0YS1A= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1650894308021100001 Content-Type: text/plain; charset="utf-8" From: Ian Chiu Add support process Port Speed field value of PORTSC according to Supported= Protocol Capability (new design in xHCI spec 1.2 2019) REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3914 The value of Port Speed field in PORTSC bit[10:13] (xHCI spec 1.2 2019 sect= ion 5.4.8) should be change to use this value to query thru Protocol Speed ID (PSI) (xHCI spec 1.2 2019 section 7.2.1) in xHCI Supported Protocol Capability and return the value according the Protocol Speed ID (PSIV) Dword. Cc: Jenny Huang Cc: More Shih Cc: Hao A Wu Cc: Ray Ni Signed-off-by: Ian Chiu --- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c | 41 ++++-- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h | 2 + MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c | 147 ++++++++++++++++++++ MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h | 87 ++++++++++++ 4 files changed, 262 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c b/MdeModulePkg/Bus/Pci/Xhc= iDxe/Xhci.c index b79499e225..f5b99210c9 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c @@ -398,25 +398,32 @@ XhcGetRootHubPortStatus ( State =3D XhcReadOpReg (Xhc, Offset); =20 // - // According to XHCI 1.1 spec November 2017, - // bit 10~13 of the root port status register identifies the speed of th= e attached device. + // According to XHCI 1.2 spec November 2019, + // Section 7.2 xHCI Support Protocol Capability // - switch ((State & XHC_PORTSC_PS) >> 10) { - case 2: - PortStatus->PortStatus |=3D USB_PORT_STAT_LOW_SPEED; - break; + PortStatus->PortStatus =3D XhcCheckUsbPortSpeedUsedPsic (Xhc, ((State & = XHC_PORTSC_PS) >> 10)); + if (PortStatus->PortStatus =3D=3D 0) { + // + // According to XHCI 1.1 spec November 2017, + // bit 10~13 of the root port status register identifies the speed of = the attached device. + // + switch ((State & XHC_PORTSC_PS) >> 10) { + case 2: + PortStatus->PortStatus |=3D USB_PORT_STAT_LOW_SPEED; + break; =20 - case 3: - PortStatus->PortStatus |=3D USB_PORT_STAT_HIGH_SPEED; - break; + case 3: + PortStatus->PortStatus |=3D USB_PORT_STAT_HIGH_SPEED; + break; =20 - case 4: - case 5: - PortStatus->PortStatus |=3D USB_PORT_STAT_SUPER_SPEED; - break; + case 4: + case 5: + PortStatus->PortStatus |=3D USB_PORT_STAT_SUPER_SPEED; + break; =20 - default: - break; + default: + break; + } } =20 // @@ -1820,6 +1827,8 @@ XhcCreateUsbHc ( Xhc->ExtCapRegBase =3D ExtCapReg << 2; Xhc->UsbLegSupOffset =3D XhcGetCapabilityAddr (Xhc, XHC_CAP_USB_LEGACY= ); Xhc->DebugCapSupOffset =3D XhcGetCapabilityAddr (Xhc, XHC_CAP_USB_DEBUG); + Xhc->Usb2SupOffset =3D XhcGetUsbSupportedCapabilityAddr (Xhc, USB_SUPPOR= T_PROTOCOL_USB2_MAJOR_VER); + Xhc->UsbSsSupOffset =3D XhcGetUsbSupportedCapabilityAddr (Xhc, USB_SUPPO= RT_PROTOCOL_USB3_MAJOR_VER); =20 DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: Capability length 0x%x\n", Xhc->Ca= pLength)); DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: HcSParams1 0x%x\n", Xhc->HcSParams= 1)); @@ -1829,6 +1838,8 @@ XhcCreateUsbHc ( DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: RTSOff 0x%x\n", Xhc->RTSOff)); DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: UsbLegSupOffset 0x%x\n", Xhc->UsbL= egSupOffset)); DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: DebugCapSupOffset 0x%x\n", Xhc->De= bugCapSupOffset)); + DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: Usb2SupOffset 0x%x\n", Xhc->Usb2Su= pOffset)); + DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: UsbSsSupOffset 0x%x\n", Xhc->UsbSs= SupOffset)); =20 // // Create AsyncRequest Polling Timer diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h b/MdeModulePkg/Bus/Pci/Xhc= iDxe/Xhci.h index 5054d796b1..7eed7bd15e 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h @@ -227,6 +227,8 @@ struct _USB_XHCI_INSTANCE { UINT32 ExtCapRegBase; UINT32 UsbLegSupOffset; UINT32 DebugCapSupOffset; + UINT32 Usb2SupOffset; + UINT32 UsbSsSupOffset; UINT64 *DCBAA; VOID *DCBAAMap; UINT32 MaxSlotsEn; diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c b/MdeModulePkg/Bus/Pci/= XhciDxe/XhciReg.c index 80be3311d4..5bff698edb 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.c @@ -564,7 +564,57 @@ XhcGetCapabilityAddr ( if ((Data & 0xFF) =3D=3D CapId) { return ExtCapOffset; } + // + // If not, then traverse all of the ext capability registers till find= ing out it. + // + NextExtCapReg =3D (UINT8)((Data >> 8) & 0xFF); + ExtCapOffset +=3D (NextExtCapReg << 2); + } while (NextExtCapReg !=3D 0); + + return 0xFFFFFFFF; +} =20 +/** + Calculate the offset of the xHCI Supported Protocol Capability. + + @param Xhc The XHCI Instance. + @param MajorVersion The USB Major Version in xHCI Support Protocol Cap= ability Field + + @return The offset of xHCI Supported Protocol capability register. + +**/ +UINT32 +XhcGetUsbSupportedCapabilityAddr ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 MajorVersion + ) +{ + UINT32 ExtCapOffset; + UINT8 NextExtCapReg; + UINT32 Data; + UINT32 NameString; + XHC_SUPPORTED_PROTOCOL_DW0 UsbSupportDw0; + + if (Xhc =3D=3D NULL) { + return 0; + } + + ExtCapOffset =3D 0; + + do { + // + // Check if the extended capability register's capability id is USB Le= gacy Support. + // + Data =3D XhcReadExtCapReg (Xhc, ExtCapOffset); + UsbSupportDw0.Dword =3D Data; + if ((Data & 0xFF) =3D=3D XHC_CAP_USB_SUPPORTED) { + if (UsbSupportDw0.Data.RevMajor =3D=3D MajorVersion) { + NameString =3D XhcReadExtCapReg (Xhc, ExtCapOffset + USB_SUPPORTED= _NAME_STRING_OFFSET); + if (NameString =3D=3D USB_SUPPORTED_PROTOCOL_NAME_STRING) { + return ExtCapOffset; + } + } + } // // If not, then traverse all of the ext capability registers till find= ing out it. // @@ -575,6 +625,103 @@ XhcGetCapabilityAddr ( return 0xFFFFFFFF; } =20 +/** + Find SpeedField value match with Port Speed ID value. + + @param Xhc The XHCI Instance. + @param ExtCapOffset The USB Major Version in xHCI Support Protocol Cap= ability Field + @param SpeedField The Port Speed filed in USB PortSc register + + @return The Protocol Speed ID xHCI Supported Protocol capability registe= r. + +**/ +UINT32 +XhciPsivGetPsid ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT32 ExtCapOffset, + IN UINT8 SpeedField + ) +{ + XHC_SUPPORTED_PROTOCOL_DW2 PortId; + XHC_SUPPORTED_PROTOCOL_FIELD Reg; + UINT32 Count; + + if ((Xhc =3D=3D NULL) || (ExtCapOffset =3D=3D 0xFFFFFFFF)) { + return 0; + } + + // + // According to XHCI 1.2 spec November 2019, + // Section 7.2 xHCI Supported Protocol Capability + // 1. Get the PSIC(Protocol Speed ID Count) Value. + // 2. The PSID register boundary should be Base address + PSIC * 0x04 + // + PortId.Dword =3D XhcReadExtCapReg (Xhc, ExtCapOffset + USB_SUPPORTED_PO= RT_ID_OFFSET); + + for (Count =3D 0; Count < PortId.Data.Psic; Count++) { + Reg.Dword =3D XhcReadExtCapReg (Xhc, ExtCapOffset + USB_SUPPORT_SPEED_= ID_OFFSET + (Count << 2)); + if (Reg.Data.Psiv =3D=3D SpeedField) { + return Reg.Dword; + } + } + return 0; +} + +/** + Find SpeedField value match with Port Speed ID value. + + @param Xhc The XHCI Instance. + @param Speed The Port Speed filed in USB PortSc register + + @return The USB Port Speed. + +**/ +UINT16 +XhcCheckUsbPortSpeedUsedPsic ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 Speed + ) +{ + XHC_SUPPORTED_PROTOCOL_FIELD SpField; + UINT16 ReturnSpeed; + + if (Xhc =3D=3D NULL) { + return 0; + } + + SpField.Dword =3D 0; + ReturnSpeed =3D 0; + // + // Check USB3 Protocol Speed ID if ReturnSpeed didn't get match speed. + // + if ((ReturnSpeed =3D=3D 0) && (Xhc->UsbSsSupOffset !=3D 0xFFFFFFFF)) { + SpField.Dword =3D XhciPsivGetPsid (Xhc, Xhc->UsbSsSupOffset, Speed); + if (SpField.Dword !=3D 0) { + // Super Speed + ReturnSpeed =3D USB_PORT_STAT_SUPER_SPEED; + } + } + + // + // Check USB2 Protocol Speed ID if ReturnSpeed didn't get match speed. + // + if ((ReturnSpeed =3D=3D 0) && (Xhc->Usb2SupOffset !=3D 0xFFFFFFFF)) { + SpField.Dword =3D XhciPsivGetPsid (Xhc, Xhc->Usb2SupOffset, Speed); + if (SpField.Dword !=3D 0) { + if (SpField.Data.Psie =3D=3D 2) { + if (SpField.Data.Mantissa =3D=3D USB_SUPPORT_PROTOCOL_USB2_HIGH_SP= EED_PSIM) { + // High Speed + ReturnSpeed =3D USB_PORT_STAT_HIGH_SPEED; + } + } else if (SpField.Data.Psie =3D=3D 1) { + // Low speed + ReturnSpeed =3D USB_PORT_STAT_LOW_SPEED; + } + } + } + return ReturnSpeed; +} + /** Whether the XHCI host controller is halted. =20 diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h b/MdeModulePkg/Bus/Pci/= XhciDxe/XhciReg.h index 4950eed272..4f83b49027 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h @@ -27,6 +27,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent =20 #define XHC_CAP_USB_LEGACY 0x01 #define XHC_CAP_USB_DEBUG 0x0A +#define XHC_CAP_USB_SUPPORTED 0x02 =20 // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D// // XHCI register offset // @@ -74,6 +75,17 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define USBLEGSP_BIOS_SEMAPHORE BIT16 // HC BIOS Owned Semaphore #define USBLEGSP_OS_SEMAPHORE BIT24 // HC OS Owned Semaphore =20 +// +// xHCI Supported Protocol Capability +// +#define USB_SUPPORTED_PROTOCOL_NAME_STRING 0x20425355 +#define USB_SUPPORTED_NAME_STRING_OFFSET 0x04 +#define USB_SUPPORTED_PORT_ID_OFFSET 0x08 +#define USB_SUPPORT_SPEED_ID_OFFSET 0x10 +#define USB_SUPPORT_PROTOCOL_USB2_MAJOR_VER 0x02 +#define USB_SUPPORT_PROTOCOL_USB3_MAJOR_VER 0x03 +#define USB_SUPPORT_PROTOCOL_USB2_HIGH_SPEED_PSIM 480 + #pragma pack (1) typedef struct { UINT8 MaxSlots; // Number of Device Slots @@ -130,6 +142,52 @@ typedef union { HCCPARAMS Data; } XHC_HCCPARAMS; =20 +// +// xHCI Supported Protocol Cabability +// +typedef struct { + UINT8 CapId; + UINT8 NextExtCapReg; + UINT8 RevMinor; + UINT8 RevMajor; +} SUPP_PROTOCOL_DW0; + +typedef union { + UINT32 Dword; + SUPP_PROTOCOL_DW0 Data; +} XHC_SUPPORTED_PROTOCOL_DW0; + +typedef struct { + UINT32 NameString; +} XHC_SUPPORTED_PROTOCOL_DW1; + +typedef struct { + UINT8 CompPortOffset : 8; + UINT8 CompPortCount : 8; + UINT16 ProtocolDef :12; + UINT16 Psic : 4; +} SUPP_PROTOCOL_DW2; + +typedef union { + UINT32 Dword; + SUPP_PROTOCOL_DW2 Data; +} XHC_SUPPORTED_PROTOCOL_DW2; + +typedef struct { + UINT16 Psiv : 4; + UINT16 Psie : 2; + UINT16 Plt : 2; + UINT16 Pfd : 1; + UINT16 RsvdP : 5; + UINT16 Lp : 2; + UINT16 Mantissa :16; +} XHCI_PROTOCOL_FIELD; + +typedef union { + UINT32 Dword; + XHCI_PROTOCOL_FIELD Data; +} XHC_SUPPORTED_PROTOCOL_FIELD; + #pragma pack () =20 // @@ -546,4 +604,33 @@ XhcGetCapabilityAddr ( IN UINT8 CapId ); =20 +/** + Calculate the offset of the xHCI Supported Protocol Capability. + + @param Xhc The XHCI Instance. + @param MajorVersion The USB Major Version in xHCI Support Protocol Cap= ability Field + + @return The offset of xHCI Supported Protocol capability register. + +**/ +UINT32 +XhcGetUsbSupportedCapabilityAddr ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 MajorVersion + ); + +/** + Find SpeedField value match with Port Speed ID value. + + @param Xhc The XHCI Instance. + @param Speed The Port Speed filed in USB PortSc register + + @return The USB Port Speed. + +**/ +UINT16 +XhcCheckUsbPortSpeedUsedPsic ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 Speed + ); #endif --=20 2.26.2.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#89269): https://edk2.groups.io/g/devel/message/89269 Mute This Topic: https://groups.io/mt/90684916/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-