SourceLevelDebugPkg DebugCommUsb3: Return error when debug cap is reset
authorStar Zeng <star.zeng@intel.com>
Mon, 19 Mar 2018 12:01:58 +0000 (20:01 +0800)
committerStar Zeng <star.zeng@intel.com>
Tue, 20 Mar 2018 12:23:53 +0000 (20:23 +0800)
When source level debug is enabled, but debug cable is not connected,
XhcResetHC() in XhciReg.c will reset the host controller, the debug
capability registers will be also reset. After the code in
InitializeUsbDebugHardware() sets DCE bit and LSE bit to "1" in DCCTRL,
there will be DMA on 0 (the value of some debug capability registers
for data transfer is 0) address buffer, fault info like below will
appear when IOMMU based on VTd is enabled.

  VER_REG     - 0x00000010
  CAP_REG     - 0x00D2008C40660462
  ECAP_REG    - 0x0000000000F050DA
  GSTS_REG    - 0xC0000000
  RTADDR_REG  - 0x0000000086512000
  CCMD_REG    - 0x2800000000000000
  FSTS_REG    - 0x00000002
  FECTL_REG   - 0xC0000000
  FEDATA_REG  - 0x00000000
  FEADDR_REG  - 0x00000000
  FEUADDR_REG - 0x00000000
  FRCD_REG[0] - 0xC0000006000000A0 0000000000000000
    Fault Info - 0x0000000000000000
    Source - B00 D14 F00
    Type - 1 (read)
    Reason - 6
  IVA_REG     - 0x0000000000000000
  IOTLB_REG   - 0x1200000000000000

This patch is to return error for the case.

Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Hao Wu <hao.a.wu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Hao Wu <hao.a.wu@intel.com>
SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c

index fb9ca84..86ecc2f 100644 (file)
@@ -673,11 +673,19 @@ InitializeUsbDebugHardware (
   UINTN                           Index;\r
   UINT8                           TotalUsb3Port;\r
   EFI_PHYSICAL_ADDRESS            XhciOpRegister;\r
   UINTN                           Index;\r
   UINT8                           TotalUsb3Port;\r
   EFI_PHYSICAL_ADDRESS            XhciOpRegister;\r
+  UINT32                          Dcddi1;\r
 \r
   XhciOpRegister = Handle->XhciOpRegister;\r
   TotalUsb3Port = MmioRead32 (((UINTN) Handle->XhciMmioBase + XHC_HCSPARAMS1_OFFSET)) >> 24;\r
 \r
   if (Handle->Initialized == USB3DBG_NOT_ENABLED) {\r
 \r
   XhciOpRegister = Handle->XhciOpRegister;\r
   TotalUsb3Port = MmioRead32 (((UINTN) Handle->XhciMmioBase + XHC_HCSPARAMS1_OFFSET)) >> 24;\r
 \r
   if (Handle->Initialized == USB3DBG_NOT_ENABLED) {\r
+    Dcddi1 = XhcReadDebugReg (Handle,XHC_DC_DCDDI1);\r
+    if (Dcddi1 != (UINT32)((XHCI_DEBUG_DEVICE_VENDOR_ID << 16) | XHCI_DEBUG_DEVICE_PROTOCOL)) {\r
+      //\r
+      // The debug capability has been reset by other code, return device error.\r
+      //\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
     //\r
     // If XHCI supports debug capability, hardware resource has been allocated, \r
     // but it has not been enabled, try to enable again.\r
     //\r
     // If XHCI supports debug capability, hardware resource has been allocated, \r
     // but it has not been enabled, try to enable again.\r