]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SourceLevelDebugPkg/Library/DebugCommunicationLibUsb3/DebugCommunicationLibUsb3Common.c
SourceLevelDebugPkg: Use CPU Local APIC timer to handle timeout.
[mirror_edk2.git] / SourceLevelDebugPkg / Library / DebugCommunicationLibUsb3 / DebugCommunicationLibUsb3Common.c
index 320998b32a12f68ec385f61f7363da854870acdc..7c62bdadfbf255dca50f313f6da623de8355ca4d 100644 (file)
@@ -186,58 +186,6 @@ ProgramXhciBaseAddress (
   return XhciMmioBase;\r
 }\r
 \r
-/**\r
-  Check if the timer is timeout.\r
-  \r
-  @param[in] UsbDebugPortHandle  Pointer to USB Debug port handle\r
-  @param[in] Timer               The start timer from the begin.\r
-  @param[in] TimeoutTicker       Ticker number need time out.\r
-\r
-  @return TRUE  Timer time out occurs.\r
-  @retval FALSE Timer does not time out.\r
-\r
-**/\r
-BOOLEAN\r
-IsTimerTimeout (\r
-  IN USB3_DEBUG_PORT_HANDLE  *UsbDebugPortHandle,\r
-  IN UINT64                  Timer,\r
-  IN UINT64                  TimeoutTicker\r
-  )\r
-{\r
-  UINT64  CurrentTimer;\r
-  UINT64  Delta;\r
-\r
-  CurrentTimer = GetPerformanceCounter ();\r
-\r
-  if (UsbDebugPortHandle->TimerCountDown) {\r
-    //\r
-    // The timer counter counts down.  Check for roll over condition.\r
-    //\r
-    if (CurrentTimer < Timer) {\r
-      Delta = Timer - CurrentTimer;\r
-    } else {\r
-      //\r
-      // Handle one roll-over. \r
-      //\r
-      Delta = UsbDebugPortHandle->TimerCycle - (CurrentTimer - Timer);\r
-    }\r
-  } else {\r
-    //\r
-    // The timer counter counts up.  Check for roll over condition.\r
-    //\r
-    if (CurrentTimer > Timer) {\r
-      Delta = CurrentTimer - Timer;\r
-    } else {\r
-      //\r
-      // Handle one roll-over. \r
-      //\r
-      Delta = UsbDebugPortHandle->TimerCycle - (Timer - CurrentTimer);\r
-    }\r
-  }\r
\r
-  return (BOOLEAN) (Delta >= TimeoutTicker);\r
-}\r
-\r
 /**\r
   Update XHC MMIO base address when MMIO base address is changed.\r
 \r
@@ -825,25 +773,13 @@ DebugPortReadBuffer (
 {\r
   USB3_DEBUG_PORT_HANDLE    *UsbDebugPortHandle;\r
   RETURN_STATUS             Status;\r
-  UINTN                     Received;\r
-  UINTN                     Total;\r
-  UINTN                     Remaining;\r
   UINT8                     Index;\r
-  UINTN                     Length;\r
-  UINT64                    Begin;\r
-  UINT64                    TimeoutTicker;\r
-  UINT64                    TimerRound;\r
-  EFI_PHYSICAL_ADDRESS      XhciMmioBase;\r
   UINT8                     *Data;\r
 \r
-  if (NumberOfBytes == 0 || Buffer == NULL) {\r
+  if (NumberOfBytes != 1 || Buffer == NULL || Timeout != 0) {\r
     return 0;\r
   }\r
 \r
-  Received  = 0;\r
-  Total     = 0;\r
-  Remaining = 0;\r
-\r
   //\r
   // If Handle is NULL, it means memory is ready for use.\r
   // Use global variable to store handle value.\r
@@ -858,9 +794,6 @@ DebugPortReadBuffer (
     return 0;\r
   }\r
   \r
-  XhciMmioBase = ProgramXhciBaseAddress ();\r
-  UpdateXhcResource (UsbDebugPortHandle, XhciMmioBase);\r
-  \r
   if (NeedReinitializeHardware(UsbDebugPortHandle)) {\r
     Status = InitializeUsbDebugHardware (UsbDebugPortHandle);\r
     if (RETURN_ERROR(Status)) {\r
@@ -871,114 +804,22 @@ DebugPortReadBuffer (
   Data = (UINT8 *)(UINTN)UsbDebugPortHandle->Data;\r
 \r
   //\r
-  // First read data from buffer, then read debug port hw to get received data.\r
+  // Read data from buffer\r
   //\r
-  if (UsbDebugPortHandle->DataCount > 0) {\r
-    if (NumberOfBytes <= UsbDebugPortHandle->DataCount) {\r
-      Total = NumberOfBytes;\r
-    } else {\r
-      Total = UsbDebugPortHandle->DataCount;\r
-    }\r
-\r
-    for (Index = 0; Index < Total; Index++) {\r
-      Buffer[Index] = Data[Index];\r
-    }\r
+  if (UsbDebugPortHandle->DataCount < 1) {\r
+    return 0;\r
+  } else {\r
+    *Buffer = Data[0];\r
 \r
-    for (Index = 0; Index < UsbDebugPortHandle->DataCount - Total; Index++) {\r
-      if (Total + Index >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
+    for (Index = 0; Index < UsbDebugPortHandle->DataCount - 1; Index++) {\r
+      if ((Index + 1) >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
         return 0;\r
       }\r
-      Data[Index] = Data[Total + Index];\r
+      Data[Index] = Data[Index + 1];\r
     }\r
-    UsbDebugPortHandle->DataCount = (UINT8)(UsbDebugPortHandle->DataCount - (UINT8)Total);\r
+    UsbDebugPortHandle->DataCount = (UINT8)(UsbDebugPortHandle->DataCount - 1);\r
+    return 1;\r
   }\r
-\r
-  //\r
-  // If Timeout is equal to 0, then it means it should always wait until all data required are received.\r
-  //\r
-  Begin         = 0;\r
-  TimeoutTicker = 0;  \r
-  TimerRound    = 0;\r
-  if (Timeout != 0) {\r
-    Begin = GetPerformanceCounter ();\r
-    TimeoutTicker = DivU64x32 (\r
-                      MultU64x64 (\r
-                        UsbDebugPortHandle->TimerFrequency,\r
-                        Timeout\r
-                        ),\r
-                      1000000u\r
-                      );\r
-    TimerRound = DivU64x64Remainder (\r
-                   TimeoutTicker,\r
-                   DivU64x32 (UsbDebugPortHandle->TimerCycle, 2),\r
-                   &TimeoutTicker\r
-                   );\r
-  }\r
-\r
-  //\r
-  // Read remaining data by executing one or more usb debug transfer transactions at usb debug port hw.\r
-  //\r
-  while (Total < NumberOfBytes) {\r
-    if (Timeout != 0) {\r
-      if (TimerRound == 0) {\r
-        if (IsTimerTimeout (UsbDebugPortHandle, Begin, TimeoutTicker)) {\r
-          //\r
-          // If time out occurs.\r
-          //\r
-          return 0;\r
-        }\r
-      } else {\r
-        if (IsTimerTimeout (UsbDebugPortHandle, Begin, DivU64x32 (UsbDebugPortHandle->TimerCycle, 2))) {\r
-          TimerRound --;\r
-        }\r
-      }\r
-    }\r
-    Remaining = NumberOfBytes - Total;\r
-    if (Remaining >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
-      Received = XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE;\r
-      Status = XhcDataTransfer (UsbDebugPortHandle, EfiUsbDataIn, Buffer + Total, &Received, DATA_TRANSFER_READ_TIMEOUT);\r
-    } else {\r
-      Received = XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE;\r
-      Status = XhcDataTransfer (UsbDebugPortHandle, EfiUsbDataIn, (VOID *)Data, &Received, DATA_TRANSFER_READ_TIMEOUT);\r
-      UsbDebugPortHandle->DataCount = (UINT8) Received;\r
-\r
-      if (Remaining <= Received) {\r
-        //\r
-        // The data received are more than required\r
-        //\r
-        Length = (UINT8)Remaining;\r
-      } else {\r
-        //\r
-        // The data received are less than the remaining bytes\r
-        //\r
-        Length = (UINT8)Received;\r
-      }\r
-\r
-      //\r
-      // Copy required data from the data buffer to user buffer.\r
-      //\r
-      for (Index = 0; Index < Length; Index++) {\r
-        (Buffer + Total)[Index] = Data[Index];\r
-        UsbDebugPortHandle->DataCount--;\r
-      }\r
-\r
-      //\r
-      // reorder the data buffer to make available data arranged from the beginning of the data buffer.\r
-      //\r
-      for (Index = 0; Index < Received - Length; Index++) {\r
-        if (Length + Index >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
-          return 0;\r
-        }\r
-        Data[Index] = Data[Length + Index];\r
-      }\r
-      //\r
-      // fixup the real required length of data.\r
-      //\r
-      Received = Length;\r
-    }\r
-    Total += Received;\r
-  }\r
-  return Total;\r
 }\r
 \r
 /**\r
@@ -1179,8 +1020,6 @@ DebugPortInitialize (
   RETURN_STATUS             Status;\r
   USB3_DEBUG_PORT_HANDLE    Handle;\r
   USB3_DEBUG_PORT_HANDLE    *UsbDebugPortHandle;\r
-  UINT64                    TimerStartValue;\r
-  UINT64                    TimerEndValue;\r
 \r
   //\r
   // Validate the PCD PcdDebugPortHandleBufferSize value \r
@@ -1194,19 +1033,6 @@ DebugPortInitialize (
     UsbDebugPortHandle = &Handle;\r
   }\r
 \r
-  UsbDebugPortHandle->TimerFrequency = GetPerformanceCounterProperties (\r
-                                         &TimerStartValue,\r
-                                         &TimerEndValue\r
-                                         );\r
-\r
-  if (TimerEndValue < TimerStartValue) {\r
-    UsbDebugPortHandle->TimerCountDown = TRUE;\r
-    UsbDebugPortHandle->TimerCycle     = TimerStartValue - TimerEndValue;\r
-  } else {\r
-    UsbDebugPortHandle->TimerCountDown = FALSE;\r
-    UsbDebugPortHandle->TimerCycle     = TimerEndValue - TimerStartValue;\r
-  }   \r
-\r
   if (Function == NULL && Context != NULL) {\r
     return (DEBUG_PORT_HANDLE *) Context;\r
   }\r