]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c
SourceLevelDebugPkg DebugCommUsb3: Return error when debug cap is reset
[mirror_edk2.git] / SourceLevelDebugPkg / Library / DebugCommunicationLibUsb3 / DebugCommunicationLibUsb3Common.c
index 87fb0265489b99d2a11400365052037260469fa2..86ecc2f9dbc7862daadd4702235d0757c30ae09a 100644 (file)
@@ -87,8 +87,8 @@ XhcClearR32Bit(
 VOID\r
 XhcWriteDebugReg (\r
   IN USB3_DEBUG_PORT_HANDLE  *Handle,\r
-  IN UINT32                   Offset,\r
-  IN UINT32                   Data\r
+  IN UINT32                  Offset,\r
+  IN UINT32                  Data\r
   )\r
 {\r
   EFI_PHYSICAL_ADDRESS  DebugCapabilityBase;\r
@@ -111,7 +111,7 @@ XhcWriteDebugReg (
 UINT32\r
 XhcReadDebugReg (\r
   IN  USB3_DEBUG_PORT_HANDLE *Handle,\r
-  IN  UINT32                   Offset\r
+  IN  UINT32                 Offset\r
   )\r
 {\r
   UINT32                  Data;\r
@@ -673,11 +673,19 @@ InitializeUsbDebugHardware (
   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
+    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
@@ -810,6 +818,44 @@ DiscoverInitializeUsbDebugPort (
   }\r
 }\r
 \r
+/**\r
+  Set USB3 debug instance address.\r
+\r
+  @param[in] Instance           Debug port instance.\r
+\r
+**/  \r
+VOID\r
+SetUsb3DebugPortInstance (\r
+  IN USB3_DEBUG_PORT_HANDLE     *Instance\r
+  )\r
+{\r
+  EFI_PHYSICAL_ADDRESS          *AddrPtr;\r
+\r
+  AddrPtr = GetUsb3DebugPortInstanceAddrPtr ();\r
+  ASSERT (AddrPtr != NULL);\r
+  *AddrPtr = (EFI_PHYSICAL_ADDRESS) (UINTN) Instance;\r
+}\r
+\r
+/**\r
+  Return USB3 debug instance address.\r
+\r
+**/  \r
+USB3_DEBUG_PORT_HANDLE *\r
+GetUsb3DebugPortInstance (\r
+  VOID\r
+  )\r
+{\r
+  EFI_PHYSICAL_ADDRESS          *AddrPtr;\r
+  USB3_DEBUG_PORT_HANDLE        *Instance;\r
+\r
+  AddrPtr = GetUsb3DebugPortInstanceAddrPtr ();\r
+  ASSERT (AddrPtr != NULL);\r
+\r
+  Instance = (USB3_DEBUG_PORT_HANDLE *) (UINTN) *AddrPtr;\r
+\r
+  return Instance;\r
+}\r
+\r
 /**\r
   Read data from debug device and save the data in buffer.\r
 \r
@@ -844,16 +890,27 @@ DebugPortReadBuffer (
     return 0;\r
   }\r
 \r
-  UsbDebugPortHandle = GetUsb3DebugPortInstance ();\r
+  //\r
+  // If Handle is NULL, get own instance.\r
+  // If Handle is not NULL, use it and set the instance.\r
+  //\r
+  if (Handle != NULL) {\r
+    UsbDebugPortHandle = (USB3_DEBUG_PORT_HANDLE *) Handle;\r
+    SetUsb3DebugPortInstance (UsbDebugPortHandle);\r
+  } else {\r
+    UsbDebugPortHandle = GetUsb3DebugPortInstance ();\r
+  }\r
   if (UsbDebugPortHandle == NULL) {\r
     return 0;\r
   }\r
 \r
-  if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {\r
+  if (UsbDebugPortHandle->InNotify) {\r
     return 0;\r
   }\r
 \r
-  if (UsbDebugPortHandle->InNotify) {\r
+  DiscoverInitializeUsbDebugPort (UsbDebugPortHandle);\r
+\r
+  if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {\r
     return 0;\r
   }\r
 \r
@@ -906,7 +963,6 @@ DebugPortWriteBuffer (
   USB3_DEBUG_PORT_HANDLE    *UsbDebugPortHandle;\r
   UINTN                     Sent;\r
   UINTN                     Total;\r
-  UINTN                     Index;\r
 \r
   if (NumberOfBytes == 0 || Buffer == NULL) {\r
     return 0;\r
@@ -915,16 +971,27 @@ DebugPortWriteBuffer (
   Sent  = 0;\r
   Total = 0;\r
 \r
-  UsbDebugPortHandle = GetUsb3DebugPortInstance ();\r
+  //\r
+  // If Handle is NULL, get own instance.\r
+  // If Handle is not NULL, use it and set the instance.\r
+  //\r
+  if (Handle != NULL) {\r
+    UsbDebugPortHandle = (USB3_DEBUG_PORT_HANDLE *) Handle;\r
+    SetUsb3DebugPortInstance (UsbDebugPortHandle);\r
+  } else {\r
+    UsbDebugPortHandle = GetUsb3DebugPortInstance ();\r
+  }\r
   if (UsbDebugPortHandle == NULL) {\r
     return 0;\r
   }\r
 \r
-  if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {\r
+  if (UsbDebugPortHandle->InNotify) {\r
     return 0;\r
   }\r
 \r
-  if (UsbDebugPortHandle->InNotify) {\r
+  DiscoverInitializeUsbDebugPort (UsbDebugPortHandle);\r
+\r
+  if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {\r
     return 0;\r
   }\r
 \r
@@ -934,7 +1001,6 @@ DebugPortWriteBuffer (
   //\r
   DebugPortPollBuffer (UsbDebugPortHandle);\r
 \r
-  Index = 0;\r
   while ((Total < NumberOfBytes)) {\r
     if (NumberOfBytes - Total > USB3_DEBUG_PORT_WRITE_MAX_PACKET_SIZE) {\r
       Sent = USB3_DEBUG_PORT_WRITE_MAX_PACKET_SIZE;\r
@@ -970,16 +1036,27 @@ DebugPortPollBuffer (
   USB3_DEBUG_PORT_HANDLE     *UsbDebugPortHandle;\r
   UINTN                     Length;\r
 \r
-  UsbDebugPortHandle = GetUsb3DebugPortInstance ();\r
+  //\r
+  // If Handle is NULL, get own instance.\r
+  // If Handle is not NULL, use it and set the instance.\r
+  //\r
+  if (Handle != NULL) {\r
+    UsbDebugPortHandle = (USB3_DEBUG_PORT_HANDLE *) Handle;\r
+    SetUsb3DebugPortInstance (UsbDebugPortHandle);\r
+  } else {\r
+    UsbDebugPortHandle = GetUsb3DebugPortInstance ();\r
+  }\r
   if (UsbDebugPortHandle == NULL) {\r
     return FALSE;\r
   }\r
 \r
-  if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {\r
+  if (UsbDebugPortHandle->InNotify) {\r
     return FALSE;\r
   }\r
 \r
-  if (UsbDebugPortHandle->InNotify) {\r
+  DiscoverInitializeUsbDebugPort (UsbDebugPortHandle);\r
+\r
+  if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {\r
     return FALSE;\r
   }\r
 \r
@@ -1045,14 +1122,25 @@ DebugPortInitialize (
 {\r
   USB3_DEBUG_PORT_HANDLE    *UsbDebugPortHandle;\r
 \r
+  //\r
+  // Validate the PCD PcdDebugPortHandleBufferSize value \r
+  //\r
+  ASSERT (PcdGet16 (PcdDebugPortHandleBufferSize) == sizeof (USB3_DEBUG_PORT_HANDLE));\r
+\r
+  if (Function == NULL && Context != NULL) {\r
+    SetUsb3DebugPortInstance ((USB3_DEBUG_PORT_HANDLE *) Context);\r
+    return (DEBUG_PORT_HANDLE) Context;\r
+  }\r
   UsbDebugPortHandle = GetUsb3DebugPortInstance ();\r
   if (UsbDebugPortHandle == NULL) {\r
     return NULL;\r
   }\r
 \r
+  DiscoverInitializeUsbDebugPort (UsbDebugPortHandle);\r
+\r
   if (Function != NULL) {\r
-    Function (Context, UsbDebugPortHandle);\r
+    Function (Context, (DEBUG_PORT_HANDLE) UsbDebugPortHandle);\r
   }\r
 \r
-  return (DEBUG_PORT_HANDLE)(UINTN)UsbDebugPortHandle;\r
+  return (DEBUG_PORT_HANDLE) UsbDebugPortHandle;\r
 }\r