summaryrefslogtreecommitdiffstats
path: root/SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c
diff options
context:
space:
mode:
authorStar Zeng <star.zeng@intel.com>2018-01-31 15:17:05 +0800
committerStar Zeng <star.zeng@intel.com>2018-02-08 16:43:55 +0800
commitde8373fa07f87ca735139bb86c51e2c29fb1d956 (patch)
tree70097d324b36912f584b1836a0a638ad295615d9 /SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c
parentf4043414da4b0415aa97dba83f0e59e2ce4334a9 (diff)
downloadedk2-de8373fa07f87ca735139bb86c51e2c29fb1d956.tar.gz
edk2-de8373fa07f87ca735139bb86c51e2c29fb1d956.tar.bz2
edk2-de8373fa07f87ca735139bb86c51e2c29fb1d956.zip
SourceLevelDebugPkg DebugUsb3: Support IOMMU
For PEI, allocate granted DMA buffer from IOMMU PPI. For DXE, map DMA buffer by PciIo. Cc: Jiewen Yao <jiewen.yao@intel.com> 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: Ruiyu Ni <ruiyu.ni@intel.com>
Diffstat (limited to 'SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c')
-rw-r--r--SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c222
1 files changed, 107 insertions, 115 deletions
diff --git a/SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c b/SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c
index 49bad6b586..87fb026548 100644
--- a/SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c
+++ b/SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c
@@ -14,11 +14,6 @@
#include "DebugCommunicationLibUsb3Internal.h"
-//
-// The global variable which can be used after memory is ready.
-//
-USB3_DEBUG_PORT_HANDLE mDebugCommunicationLibUsb3DebugPortHandle;
-
UINT16 mString0Desc[] = {
// String Descriptor Type + Length
( USB_DESC_TYPE_STRING << 8 ) + STRING0_DESC_LEN,
@@ -85,7 +80,7 @@ XhcClearR32Bit(
Write the data to the XHCI debug register.
@param Handle Debug port handle.
- @param Offset The offset of the runtime register.
+ @param Offset The offset of the debug register.
@param Data The data to write.
**/
@@ -129,16 +124,16 @@ XhcReadDebugReg (
}
/**
- Set one bit of the runtime register while keeping other bits.
+ Set one bit of the debug register while keeping other bits.
@param Handle Debug port handle.
- @param Offset The offset of the runtime register.
+ @param Offset The offset of the debug register.
@param Bit The bit mask of the register to set.
**/
VOID
XhcSetDebugRegBit (
- IN USB3_DEBUG_PORT_HANDLE *Handle,
+ IN USB3_DEBUG_PORT_HANDLE *Handle,
IN UINT32 Offset,
IN UINT32 Bit
)
@@ -151,6 +146,28 @@ XhcSetDebugRegBit (
}
/**
+ Clear one bit of the debug register while keeping other bits.
+
+ @param Handle Debug port handle.
+ @param Offset The offset of the debug register.
+ @param Bit The bit mask of the register to clear.
+
+**/
+VOID
+XhcClearDebugRegBit (
+ IN USB3_DEBUG_PORT_HANDLE *Handle,
+ IN UINT32 Offset,
+ IN UINT32 Bit
+ )
+{
+ UINT32 Data;
+
+ Data = XhcReadDebugReg (Handle, Offset);
+ Data &= ~Bit;
+ XhcWriteDebugReg (Handle, Offset, Data);
+}
+
+/**
Program and eanble XHCI MMIO base address.
@return XHCI MMIO base address.
@@ -199,7 +216,7 @@ UpdateXhcResource (
IN EFI_PHYSICAL_ADDRESS XhciMmioBase
)
{
- if ((Handle == NULL) || (Handle->XhciMmioBase == XhciMmioBase)) {
+ if (Handle == NULL) {
return;
}
@@ -216,7 +233,7 @@ UpdateXhcResource (
@param Handle Debug port handle.
- @retval RETURN_UNSUPPORTED The usb host controller does not supported usb debug port capability.
+ @retval RETURN_UNSUPPORTED The usb host controller does not support usb debug port capability.
@retval RETURN_SUCCESS Get bar and offset successfully.
**/
@@ -236,6 +253,14 @@ CalculateUsbDebugPortMmioBase (
EFI_PHYSICAL_ADDRESS CapabilityPointer;
UINT8 CapLength;
+ if (Handle->Initialized != USB3DBG_UNINITIALIZED) {
+ if (Handle->Initialized == USB3DBG_NO_DBG_CAB) {
+ return RETURN_UNSUPPORTED;
+ } else {
+ return RETURN_SUCCESS;
+ }
+ }
+
VendorId = PciRead16 (PcdGet32(PcdUsbXhciPciAddress) + PCI_VENDOR_ID_OFFSET);
DeviceId = PciRead16 (PcdGet32(PcdUsbXhciPciAddress) + PCI_DEVICE_ID_OFFSET);
@@ -288,6 +313,7 @@ CalculateUsbDebugPortMmioBase (
Handle->DebugCapabilityBase = CapabilityPointer;
Handle->DebugCapabilityOffset = CapabilityPointer - Handle->XhciMmioBase;
Handle->XhciOpRegister = Handle->XhciMmioBase + CapLength;
+ Handle->DebugSupport = TRUE;
Handle->Initialized = USB3DBG_DBG_CAB;
return RETURN_SUCCESS;
@@ -326,6 +352,9 @@ NeedReinitializeHardware(
Dcctrl = XhcReadDebugReg (Handle, XHC_DC_DCCTRL);
if ((Dcctrl & BIT0) == 0) {
Result = TRUE;
+ } else if (!Handle->Ready) {
+ Handle->Ready = TRUE;
+ Handle->Initialized = USB3DBG_ENABLED;
}
return Result;
@@ -678,6 +707,13 @@ InitializeUsbDebugHardware (
}
//
+ // Clear DCE bit and LSE bit in DCCTRL
+ //
+ if ((XhcReadDebugReg (Handle, XHC_DC_DCCTRL) & (BIT1|BIT31)) == (BIT1|BIT31)) {
+ XhcClearDebugRegBit (Handle, XHC_DC_DCCTRL, BIT1|BIT31);
+ }
+
+ //
// Construct the buffer for read, poll and write.
//
Handle->UrbIn.Data = (EFI_PHYSICAL_ADDRESS)(UINTN) Buffer;
@@ -746,6 +782,35 @@ Enable:
}
/**
+ Discover and initialize usb debug port.
+
+ @param Handle Debug port handle.
+
+**/
+VOID
+DiscoverInitializeUsbDebugPort (
+ IN USB3_DEBUG_PORT_HANDLE *Handle
+ )
+{
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS XhciMmioBase;
+
+ //
+ // Read 64-bit MMIO base address
+ //
+ XhciMmioBase = ProgramXhciBaseAddress ();
+ Handle->XhciMmioBase = XhciMmioBase;
+
+ Status = CalculateUsbDebugPortMmioBase (Handle);
+ if (!RETURN_ERROR (Status)) {
+ UpdateXhcResource (Handle, XhciMmioBase);
+ if (NeedReinitializeHardware (Handle)) {
+ InitializeUsbDebugHardware (Handle);
+ }
+ }
+}
+
+/**
Read data from debug device and save the data in buffer.
Reads NumberOfBytes data bytes from a debug device into the buffer
@@ -772,7 +837,6 @@ DebugPortReadBuffer (
)
{
USB3_DEBUG_PORT_HANDLE *UsbDebugPortHandle;
- RETURN_STATUS Status;
UINT8 Index;
UINT8 *Data;
@@ -780,25 +844,17 @@ DebugPortReadBuffer (
return 0;
}
- //
- // If Handle is NULL, it means memory is ready for use.
- // Use global variable to store handle value.
- //
- if (Handle == NULL) {
- UsbDebugPortHandle = &mDebugCommunicationLibUsb3DebugPortHandle;
- } else {
- UsbDebugPortHandle = (USB3_DEBUG_PORT_HANDLE *)Handle;
+ UsbDebugPortHandle = GetUsb3DebugPortInstance ();
+ if (UsbDebugPortHandle == NULL) {
+ return 0;
}
-
- if (UsbDebugPortHandle->Initialized == USB3DBG_NO_DBG_CAB) {
+
+ if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {
return 0;
}
-
- if (NeedReinitializeHardware(UsbDebugPortHandle)) {
- Status = InitializeUsbDebugHardware (UsbDebugPortHandle);
- if (RETURN_ERROR(Status)) {
- return 0;
- }
+
+ if (UsbDebugPortHandle->InNotify) {
+ return 0;
}
Data = (UINT8 *)(UINTN)UsbDebugPortHandle->Data;
@@ -848,10 +904,8 @@ DebugPortWriteBuffer (
)
{
USB3_DEBUG_PORT_HANDLE *UsbDebugPortHandle;
- RETURN_STATUS Status;
UINTN Sent;
UINTN Total;
- EFI_PHYSICAL_ADDRESS XhciMmioBase;
UINTN Index;
if (NumberOfBytes == 0 || Buffer == NULL) {
@@ -861,39 +915,24 @@ DebugPortWriteBuffer (
Sent = 0;
Total = 0;
- //
- // If Handle is NULL, it means memory is ready for use.
- // Use global variable to store handle value.
- //
- if (Handle == NULL) {
- UsbDebugPortHandle = &mDebugCommunicationLibUsb3DebugPortHandle;
- } else {
- UsbDebugPortHandle = (USB3_DEBUG_PORT_HANDLE *)Handle;
- }
-
- if (UsbDebugPortHandle->Initialized == USB3DBG_NO_DBG_CAB) {
+ UsbDebugPortHandle = GetUsb3DebugPortInstance ();
+ if (UsbDebugPortHandle == NULL) {
return 0;
}
- //
- // MMIO base address is possible to clear, set it if it is cleared. (XhciMemorySpaceClose in PchUsbCommon.c)
- //
- XhciMmioBase = ProgramXhciBaseAddress ();
-
- UpdateXhcResource (UsbDebugPortHandle, XhciMmioBase);
+ if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {
+ return 0;
+ }
- if (NeedReinitializeHardware(UsbDebugPortHandle)) {
- Status = InitializeUsbDebugHardware (UsbDebugPortHandle);
- if (RETURN_ERROR(Status)) {
- return 0;
- }
+ if (UsbDebugPortHandle->InNotify) {
+ return 0;
}
//
// When host is trying to send data, write will be blocked.
// Poll to see if there is any data sent by host at first.
//
- DebugPortPollBuffer (Handle);
+ DebugPortPollBuffer (UsbDebugPortHandle);
Index = 0;
while ((Total < NumberOfBytes)) {
@@ -902,7 +941,7 @@ DebugPortWriteBuffer (
} else {
Sent = (UINT8)(NumberOfBytes - Total);
}
- Status = XhcDataTransfer (UsbDebugPortHandle, EfiUsbDataOut, Buffer + Total, &Sent, DATA_TRANSFER_WRITE_TIMEOUT);
+ XhcDataTransfer (UsbDebugPortHandle, EfiUsbDataOut, Buffer + Total, &Sent, DATA_TRANSFER_WRITE_TIMEOUT);
Total += Sent;
}
@@ -930,33 +969,20 @@ DebugPortPollBuffer (
{
USB3_DEBUG_PORT_HANDLE *UsbDebugPortHandle;
UINTN Length;
- RETURN_STATUS Status;
- EFI_PHYSICAL_ADDRESS XhciMmioBase;
- //
- // If Handle is NULL, it means memory is ready for use.
- // Use global variable to store handle value.
- //
- if (Handle == NULL) {
- UsbDebugPortHandle = &mDebugCommunicationLibUsb3DebugPortHandle;
- } else {
- UsbDebugPortHandle = (USB3_DEBUG_PORT_HANDLE *)Handle;
+ UsbDebugPortHandle = GetUsb3DebugPortInstance ();
+ if (UsbDebugPortHandle == NULL) {
+ return FALSE;
}
- if (UsbDebugPortHandle->Initialized == USB3DBG_NO_DBG_CAB) {
- return 0;
+ if (UsbDebugPortHandle->Initialized != USB3DBG_ENABLED) {
+ return FALSE;
}
- XhciMmioBase = ProgramXhciBaseAddress ();
- UpdateXhcResource (UsbDebugPortHandle, XhciMmioBase);
-
- if (NeedReinitializeHardware(UsbDebugPortHandle)) {
- Status = InitializeUsbDebugHardware(UsbDebugPortHandle);
- if (RETURN_ERROR(Status)) {
- return FALSE;
- }
+ if (UsbDebugPortHandle->InNotify) {
+ return FALSE;
}
-
+
//
// If the data buffer is not empty, then return TRUE directly.
// Otherwise initialize a usb read transaction and read data to internal data buffer.
@@ -969,7 +995,7 @@ DebugPortPollBuffer (
// Read data as much as we can
//
Length = XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE;
- XhcDataTransfer (Handle, EfiUsbDataIn, (VOID *)(UINTN)UsbDebugPortHandle->Data, &Length, DATA_TRANSFER_POLL_TIMEOUT);
+ XhcDataTransfer (UsbDebugPortHandle, EfiUsbDataIn, (VOID *)(UINTN)UsbDebugPortHandle->Data, &Length, DATA_TRANSFER_POLL_TIMEOUT);
if (Length > XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {
return FALSE;
@@ -1017,50 +1043,16 @@ DebugPortInitialize (
IN DEBUG_PORT_CONTINUE Function
)
{
- RETURN_STATUS Status;
- USB3_DEBUG_PORT_HANDLE Handle;
USB3_DEBUG_PORT_HANDLE *UsbDebugPortHandle;
- //
- // Validate the PCD PcdDebugPortHandleBufferSize value
- //
- ASSERT (PcdGet16 (PcdDebugPortHandleBufferSize) == sizeof (USB3_DEBUG_PORT_HANDLE));
-
- if (Function == NULL && Context != NULL) {
- UsbDebugPortHandle = (USB3_DEBUG_PORT_HANDLE *)Context;
- } else {
- ZeroMem(&Handle, sizeof (USB3_DEBUG_PORT_HANDLE));
- UsbDebugPortHandle = &Handle;
+ UsbDebugPortHandle = GetUsb3DebugPortInstance ();
+ if (UsbDebugPortHandle == NULL) {
+ return NULL;
}
- if (Function == NULL && Context != NULL) {
- return (DEBUG_PORT_HANDLE *) Context;
- }
-
- //
- // Read 64-bit MMIO base address
- //
- UsbDebugPortHandle->XhciMmioBase = ProgramXhciBaseAddress ();
-
- Status = CalculateUsbDebugPortMmioBase (UsbDebugPortHandle);
- if (RETURN_ERROR (Status)) {
- goto Exit;
- }
-
- if (NeedReinitializeHardware(&Handle)) {
- Status = InitializeUsbDebugHardware (&Handle);
- if (RETURN_ERROR(Status)) {
- goto Exit;
- }
- }
-
-Exit:
-
if (Function != NULL) {
- Function (Context, &Handle);
- } else {
- CopyMem(&mDebugCommunicationLibUsb3DebugPortHandle, &Handle, sizeof (USB3_DEBUG_PORT_HANDLE));
+ Function (Context, UsbDebugPortHandle);
}
- return (DEBUG_PORT_HANDLE)(UINTN)&mDebugCommunicationLibUsb3DebugPortHandle;
+ return (DEBUG_PORT_HANDLE)(UINTN)UsbDebugPortHandle;
}