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
UINT32\r
XhcReadDebugReg (\r
IN USB3_DEBUG_PORT_HANDLE *Handle,\r
- IN UINT32 Offset\r
+ IN UINT32 Offset\r
)\r
{\r
UINT32 Data;\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
+ 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
}\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
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
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
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
//\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
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
{\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