]> git.proxmox.com Git - mirror_edk2.git/blobdiff - QuarkSocPkg/QuarkSouthCluster/Usb/Ohci/Pei/OhciReg.c
QuarkSocPkg: Add new package for Quark SoC X1000
[mirror_edk2.git] / QuarkSocPkg / QuarkSouthCluster / Usb / Ohci / Pei / OhciReg.c
diff --git a/QuarkSocPkg/QuarkSouthCluster/Usb/Ohci/Pei/OhciReg.c b/QuarkSocPkg/QuarkSouthCluster/Usb/Ohci/Pei/OhciReg.c
new file mode 100644 (file)
index 0000000..b181c3d
--- /dev/null
@@ -0,0 +1,1394 @@
+/** @file\r
+The OHCI register operation routines.\r
+\r
+Copyright (c) 2013-2015 Intel Corporation.\r
+\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "OhcPeim.h"\r
+\r
+/**\r
+\r
+  Get OHCI operational reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Offset                Offset of the operational reg\r
+\r
+  @retval                       Value of the register\r
+\r
+**/\r
+UINT32\r
+OhciGetOperationalReg (\r
+  IN USB_OHCI_HC_DEV         *Ohc,\r
+  IN UINT32                  Offset\r
+  )\r
+{\r
+\r
+  return MmioRead32 (Ohc->UsbHostControllerBaseAddress + Offset);\r
+\r
+}\r
+/**\r
+\r
+  Set OHCI operational reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Offset                 Offset of the operational reg\r
+  @param  Value                  Value to set\r
+\r
+  @retval EFI_SUCCESS            Value set to the reg\r
+\r
+**/\r
+\r
+\r
+EFI_STATUS\r
+OhciSetOperationalReg (\r
+  USB_OHCI_HC_DEV         *Ohc,\r
+  IN UINT32               Offset,\r
+  IN UINT32               *Value\r
+  )\r
+{\r
+  MmioWrite32(Ohc->UsbHostControllerBaseAddress + Offset, *Value);\r
+  return EFI_SUCCESS;\r
+}\r
+/**\r
+\r
+  Get HcRevision reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+\r
+  @retval                       Value of the register\r
+\r
+**/\r
+\r
+\r
+UINT32\r
+OhciGetHcRevision (\r
+  USB_OHCI_HC_DEV         *Ohc\r
+  )\r
+{\r
+  return OhciGetOperationalReg (Ohc, HC_REVISION);\r
+}\r
+/**\r
+\r
+  Set HcReset reg value\r
+\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to set\r
+  @param  Value                 Value to set\r
+\r
+  @retval EFI_SUCCESS           Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetHcReset (\r
+  IN USB_OHCI_HC_DEV            *Ohc,\r
+  IN UINT32                     Field,\r
+  IN UINT32                     Value\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  HcRESET                       Reset;\r
+\r
+  Status = EFI_SUCCESS;\r
+  *(UINT32 *) &Reset = OhciGetOperationalReg (Ohc, USBHOST_OFFSET_UHCHR);\r
+\r
+  if (Field & RESET_SYSTEM_BUS) {\r
+    Reset.FSBIR = Value;\r
+  }\r
+\r
+  if (Field & RESET_HOST_CONTROLLER) {\r
+    Reset.FHR = Value;\r
+  }\r
+\r
+  if (Field & RESET_CLOCK_GENERATION) {\r
+    Reset.CGR = Value;\r
+  }\r
+\r
+  if (Field & RESET_SSE_GLOBAL) {\r
+    Reset.SSE = Value;\r
+  }\r
+\r
+  if (Field & RESET_PSPL) {\r
+    Reset.PSPL = Value;\r
+  }\r
+\r
+  if (Field & RESET_PCPL) {\r
+    Reset.PCPL = Value;\r
+  }\r
+\r
+  if (Field & RESET_SSEP1) {\r
+    Reset.SSEP1 = Value;\r
+  }\r
+\r
+  if (Field & RESET_SSEP2) {\r
+    Reset.SSEP2 = Value;\r
+  }\r
+\r
+  if (Field & RESET_SSEP3) {\r
+    Reset.SSEP3 = Value;\r
+  }\r
+\r
+  OhciSetOperationalReg (Ohc, USBHOST_OFFSET_UHCHR, (UINT32*)&Reset);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+  Get specific field of HcReset reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetHcReset (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINT32               Field\r
+  )\r
+{\r
+  HcRESET                 Reset;\r
+  UINT32                  Value;\r
+\r
+\r
+  *(UINT32 *) &Reset = OhciGetOperationalReg (Ohc, USBHOST_OFFSET_UHCHR);\r
+  Value = 0;\r
+\r
+  switch (Field) {\r
+  case RESET_SYSTEM_BUS:\r
+    Value = Reset.FSBIR;\r
+    break;\r
+\r
+  case RESET_HOST_CONTROLLER:\r
+    Value = Reset.FHR;\r
+    break;\r
+\r
+  case RESET_CLOCK_GENERATION:\r
+    Value = Reset.CGR;\r
+    break;\r
+\r
+  case RESET_SSE_GLOBAL:\r
+    Value = Reset.SSE;\r
+    break;\r
+\r
+  case RESET_PSPL:\r
+    Value = Reset.PSPL;\r
+    break;\r
+\r
+  case RESET_PCPL:\r
+    Value = Reset.PCPL;\r
+    break;\r
+\r
+  case RESET_SSEP1:\r
+    Value = Reset.SSEP1;\r
+    break;\r
+\r
+  case RESET_SSEP2:\r
+    Value = Reset.SSEP2;\r
+    break;\r
+\r
+  case RESET_SSEP3:\r
+    Value = Reset.SSEP3;\r
+    break;\r
+\r
+  default:\r
+    ASSERT (FALSE);\r
+  }\r
+\r
+\r
+  return Value;\r
+}\r
+\r
+/**\r
+\r
+  Set HcControl reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to set\r
+  @param  Value                 Value to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetHcControl (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcCONTROL               Control;\r
+\r
+\r
+\r
+  *(UINT32 *) &Control = OhciGetOperationalReg (Ohc, HC_CONTROL);\r
+\r
+  if (Field & CONTROL_BULK_RATIO) {\r
+    Control.ControlBulkRatio = Value;\r
+  }\r
+\r
+  if (Field & HC_FUNCTIONAL_STATE) {\r
+    Control.FunctionalState = Value;\r
+  }\r
+\r
+  if (Field & PERIODIC_ENABLE) {\r
+    Control.PeriodicEnable = Value;\r
+  }\r
+\r
+  if (Field & CONTROL_ENABLE) {\r
+    Control.ControlEnable = Value;\r
+  }\r
+\r
+  if (Field & ISOCHRONOUS_ENABLE) {\r
+    Control.IsochronousEnable = Value;\r
+  }\r
+\r
+  if (Field & BULK_ENABLE) {\r
+    Control.BulkEnable = Value;\r
+  }\r
+\r
+  if (Field & INTERRUPT_ROUTING) {\r
+    Control.InterruptRouting = Value;\r
+  }\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_CONTROL, (UINT32*)&Control);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Get specific field of HcControl reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+\r
+UINT32\r
+OhciGetHcControl (\r
+  IN USB_OHCI_HC_DEV   *Ohc,\r
+  IN UINTN             Field\r
+  )\r
+{\r
+  HcCONTROL     Control;\r
+\r
+  *(UINT32 *) &Control = OhciGetOperationalReg (Ohc, HC_CONTROL);\r
+\r
+  switch (Field) {\r
+  case CONTROL_BULK_RATIO:\r
+    return Control.ControlBulkRatio;\r
+    break;\r
+  case PERIODIC_ENABLE:\r
+    return Control.PeriodicEnable;\r
+    break;\r
+  case CONTROL_ENABLE:\r
+    return Control.ControlEnable;\r
+    break;\r
+  case BULK_ENABLE:\r
+    return Control.BulkEnable;\r
+    break;\r
+  case ISOCHRONOUS_ENABLE:\r
+    return Control.IsochronousEnable;\r
+    break;\r
+  case HC_FUNCTIONAL_STATE:\r
+    return Control.FunctionalState;\r
+    break;\r
+  case INTERRUPT_ROUTING:\r
+    return Control.InterruptRouting;\r
+    break;\r
+  default:\r
+    ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/**\r
+\r
+  Set HcCommand reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to set\r
+  @param  Value                 Value to set\r
+\r
+  @retval EFI_SUCCESS           Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetHcCommandStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcCOMMAND_STATUS        CommandStatus;\r
+\r
+  ZeroMem (&CommandStatus, sizeof (HcCOMMAND_STATUS));\r
+\r
+  if(Field & HC_RESET){\r
+    CommandStatus.HcReset = Value;\r
+  }\r
+\r
+  if(Field & CONTROL_LIST_FILLED){\r
+    CommandStatus.ControlListFilled = Value;\r
+  }\r
+\r
+  if(Field & BULK_LIST_FILLED){\r
+    CommandStatus.BulkListFilled = Value;\r
+  }\r
+\r
+  if(Field & CHANGE_OWNER_REQUEST){\r
+    CommandStatus.ChangeOwnerRequest = Value;\r
+  }\r
+\r
+  if(Field & SCHEDULE_OVERRUN_COUNT){\r
+    CommandStatus.ScheduleOverrunCount = Value;\r
+  }\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_COMMAND_STATUS, (UINT32*)&CommandStatus);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+\r
+  Get specific field of HcCommand reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetHcCommandStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  HcCOMMAND_STATUS        CommandStatus;\r
+\r
+  *(UINT32 *) &CommandStatus = OhciGetOperationalReg (Ohc, HC_COMMAND_STATUS);\r
+\r
+  switch (Field){\r
+  case HC_RESET:\r
+    return CommandStatus.HcReset;\r
+    break;\r
+  case CONTROL_LIST_FILLED:\r
+    return CommandStatus.ControlListFilled;\r
+    break;\r
+  case BULK_LIST_FILLED:\r
+    return CommandStatus.BulkListFilled;\r
+    break;\r
+  case CHANGE_OWNER_REQUEST:\r
+    return CommandStatus.ChangeOwnerRequest;\r
+    break;\r
+  case SCHEDULE_OVERRUN_COUNT:\r
+    return CommandStatus.ScheduleOverrunCount;\r
+    break;\r
+  default:\r
+    ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/**\r
+\r
+  Clear specific fields of Interrupt Status\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to clear\r
+\r
+  @retval EFI_SUCCESS           Fields cleared\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciClearInterruptStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcINTERRUPT_STATUS      InterruptStatus;\r
+\r
+  ZeroMem (&InterruptStatus, sizeof (HcINTERRUPT_STATUS));\r
+\r
+  if(Field & SCHEDULE_OVERRUN){\r
+    InterruptStatus.SchedulingOverrun = 1;\r
+  }\r
+\r
+  if(Field & WRITEBACK_DONE_HEAD){\r
+    InterruptStatus.WriteBackDone = 1;\r
+  }\r
+  if(Field & START_OF_FRAME){\r
+    InterruptStatus.Sof = 1;\r
+  }\r
+\r
+  if(Field & RESUME_DETECT){\r
+    InterruptStatus.ResumeDetected = 1;\r
+  }\r
+\r
+  if(Field & UNRECOVERABLE_ERROR){\r
+    InterruptStatus.UnrecoverableError = 1;\r
+  }\r
+\r
+  if(Field & FRAME_NUMBER_OVERFLOW){\r
+    InterruptStatus.FrameNumOverflow = 1;\r
+  }\r
+\r
+  if(Field & ROOTHUB_STATUS_CHANGE){\r
+    InterruptStatus.RHStatusChange = 1;\r
+  }\r
+\r
+  if(Field & OWNERSHIP_CHANGE){\r
+    InterruptStatus.OwnerChange = 1;\r
+  }\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_INTERRUPT_STATUS, (UINT32*)&InterruptStatus);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+\r
+  Get fields of HcInterrupt reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetHcInterruptStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  HcINTERRUPT_STATUS      InterruptStatus;\r
+\r
+  *(UINT32 *) &InterruptStatus = OhciGetOperationalReg (Ohc, HC_INTERRUPT_STATUS);\r
+\r
+  switch (Field){\r
+  case SCHEDULE_OVERRUN:\r
+    return InterruptStatus.SchedulingOverrun;\r
+    break;\r
+\r
+  case  WRITEBACK_DONE_HEAD:\r
+    return InterruptStatus.WriteBackDone;\r
+    break;\r
+\r
+  case START_OF_FRAME:\r
+    return InterruptStatus.Sof;\r
+    break;\r
+\r
+  case RESUME_DETECT:\r
+    return InterruptStatus.ResumeDetected;\r
+    break;\r
+\r
+  case UNRECOVERABLE_ERROR:\r
+    return InterruptStatus.UnrecoverableError;\r
+    break;\r
+\r
+  case FRAME_NUMBER_OVERFLOW:\r
+    return InterruptStatus.FrameNumOverflow;\r
+    break;\r
+\r
+  case ROOTHUB_STATUS_CHANGE:\r
+    return InterruptStatus.RHStatusChange;\r
+    break;\r
+\r
+  case OWNERSHIP_CHANGE:\r
+    return InterruptStatus.OwnerChange;\r
+    break;\r
+\r
+  default:\r
+    ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/**\r
+\r
+  Set Interrupt Control reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  StatEnable            Enable or Disable\r
+  @param  Field                 Field to set\r
+  @param  Value                 Value to set\r
+\r
+  @retval EFI_SUCCESS           Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetInterruptControl (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN BOOLEAN              StatEnable,\r
+  IN UINTN                Field,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcINTERRUPT_CONTROL     InterruptState;\r
+\r
+\r
+  ZeroMem (&InterruptState, sizeof (HcINTERRUPT_CONTROL));\r
+\r
+  if(Field & SCHEDULE_OVERRUN) {\r
+    InterruptState.SchedulingOverrunInt = Value;\r
+  }\r
+\r
+  if(Field & WRITEBACK_DONE_HEAD) {\r
+    InterruptState.WriteBackDoneInt = Value;\r
+  }\r
+  if(Field & START_OF_FRAME) {\r
+    InterruptState.SofInt = Value;\r
+  }\r
+\r
+  if(Field & RESUME_DETECT) {\r
+    InterruptState.ResumeDetectedInt = Value;\r
+  }\r
+\r
+  if(Field & UNRECOVERABLE_ERROR) {\r
+    InterruptState.UnrecoverableErrorInt = Value;\r
+  }\r
+\r
+  if(Field & FRAME_NUMBER_OVERFLOW) {\r
+    InterruptState.FrameNumOverflowInt = Value;\r
+  }\r
+\r
+  if(Field & ROOTHUB_STATUS_CHANGE) {\r
+    InterruptState.RHStatusChangeInt = Value;\r
+  }\r
+\r
+  if(Field & OWNERSHIP_CHANGE) {\r
+    InterruptState.OwnerChangedInt = Value;\r
+  }\r
+\r
+  if(Field & MASTER_INTERRUPT) {\r
+    InterruptState.MasterInterruptEnable = Value;\r
+  }\r
+\r
+  if (StatEnable) {\r
+    Status = OhciSetOperationalReg (Ohc, HC_INTERRUPT_ENABLE, (UINT32*)&InterruptState);\r
+  } else {\r
+    Status = OhciSetOperationalReg (Ohc, HC_INTERRUPT_DISABLE, (UINT32*)&InterruptState);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+\r
+  Get field of HcInterruptControl reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetHcInterruptControl (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  HcINTERRUPT_CONTROL     InterruptState;\r
+\r
+  *(UINT32 *) &InterruptState = OhciGetOperationalReg (Ohc, HC_INTERRUPT_ENABLE);\r
+\r
+  switch (Field){\r
+    case SCHEDULE_OVERRUN:\r
+      return InterruptState.SchedulingOverrunInt;\r
+      break;\r
+\r
+    case WRITEBACK_DONE_HEAD:\r
+      return InterruptState.WriteBackDoneInt;\r
+      break;\r
+\r
+    case START_OF_FRAME:\r
+      return InterruptState.SofInt;\r
+      break;\r
+\r
+    case RESUME_DETECT:\r
+      return InterruptState.ResumeDetectedInt;\r
+      break;\r
+\r
+    case UNRECOVERABLE_ERROR:\r
+      return InterruptState.UnrecoverableErrorInt;\r
+      break;\r
+\r
+    case FRAME_NUMBER_OVERFLOW:\r
+      return InterruptState.FrameNumOverflowInt;\r
+      break;\r
+\r
+    case ROOTHUB_STATUS_CHANGE:\r
+      return InterruptState.RHStatusChangeInt;\r
+      break;\r
+\r
+    case OWNERSHIP_CHANGE:\r
+      return InterruptState.OwnerChangedInt;\r
+      break;\r
+\r
+    case MASTER_INTERRUPT:\r
+      return InterruptState.MasterInterruptEnable;\r
+      break;\r
+\r
+    default:\r
+      ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/**\r
+\r
+  Set memory pointer of specific type\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  PointerType           Type of the pointer to set\r
+  @param  Value                 Value to set\r
+\r
+  @retval EFI_SUCCESS           Memory pointer set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetMemoryPointer(\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                PointerType,\r
+  IN VOID                 *Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  UINT32                  Verify;\r
+\r
+  Status = OhciSetOperationalReg (Ohc, PointerType, (UINT32*)&Value);\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Verify = OhciGetOperationalReg (Ohc, PointerType);\r
+\r
+  while (Verify != (UINT32) Value) {\r
+    MicroSecondDelay (HC_1_MILLISECOND);\r
+    Verify = OhciGetOperationalReg (Ohc, PointerType);\r
+  };\r
+\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+\r
+  Get memory pointer of specific type\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  PointerType           Type of pointer\r
+\r
+  @retval                       Memory pointer of the specific type\r
+\r
+**/\r
+\r
+VOID *\r
+OhciGetMemoryPointer (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                PointerType\r
+  )\r
+{\r
+\r
+  return (VOID *) OhciGetOperationalReg (Ohc, PointerType);\r
+}\r
+\r
+\r
+/**\r
+\r
+  Set Frame Interval value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to set\r
+  @param  Value                 Value to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetFrameInterval (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcFRM_INTERVAL          FrameInterval;\r
+\r
+\r
+  *(UINT32 *) &FrameInterval = OhciGetOperationalReg(Ohc, HC_FRM_INTERVAL);\r
+\r
+  if (Field & FRAME_INTERVAL) {\r
+    FrameInterval.FrmIntervalToggle = !FrameInterval.FrmIntervalToggle;\r
+    FrameInterval.FrameInterval = Value;\r
+  }\r
+\r
+  if (Field & FS_LARGEST_DATA_PACKET) {\r
+    FrameInterval.FSMaxDataPacket = Value;\r
+  }\r
+\r
+  if (Field & FRMINT_TOGGLE) {\r
+    FrameInterval.FrmIntervalToggle = Value;\r
+  }\r
+\r
+  Status = OhciSetOperationalReg (\r
+             Ohc,\r
+             HC_FRM_INTERVAL,\r
+             (UINT32*)&FrameInterval\r
+             );\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Get field of frame interval reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetFrameInterval (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  HcFRM_INTERVAL          FrameInterval;\r
+\r
+  *(UINT32 *) &FrameInterval = OhciGetOperationalReg (Ohc, HC_FRM_INTERVAL);\r
+\r
+  switch (Field){\r
+    case FRAME_INTERVAL:\r
+      return FrameInterval.FrameInterval;\r
+      break;\r
+\r
+    case FS_LARGEST_DATA_PACKET:\r
+      return FrameInterval.FSMaxDataPacket;\r
+      break;\r
+\r
+    case FRMINT_TOGGLE:\r
+      return FrameInterval.FrmIntervalToggle;\r
+      break;\r
+\r
+    default:\r
+      ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/**\r
+\r
+  Set Frame Remaining reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Value                 Value to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetFrameRemaining (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcFRAME_REMAINING       FrameRemaining;\r
+\r
+\r
+  *(UINT32 *) &FrameRemaining = OhciGetOperationalReg (Ohc, HC_FRM_REMAINING);\r
+\r
+  FrameRemaining.FrameRemaining = Value;\r
+  FrameRemaining.FrameRemainingToggle = !FrameRemaining.FrameRemainingToggle;\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_FRM_REMAINING, (UINT32*)&FrameRemaining);\r
+\r
+  return Status;\r
+}\r
+/**\r
+\r
+  Get value of frame remaining reg\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of frame remaining reg\r
+\r
+**/\r
+UINT32\r
+OhciGetFrameRemaining (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+\r
+{\r
+  HcFRAME_REMAINING       FrameRemaining;\r
+\r
+\r
+  *(UINT32 *) &FrameRemaining = OhciGetOperationalReg (Ohc, HC_FRM_REMAINING);\r
+\r
+  switch (Field){\r
+    case FRAME_REMAINING:\r
+      return FrameRemaining.FrameRemaining;\r
+      break;\r
+\r
+    case FRAME_REMAIN_TOGGLE:\r
+      return FrameRemaining.FrameRemainingToggle;\r
+      break;\r
+\r
+    default:\r
+      ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/**\r
+\r
+  Set frame number reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Value                 Value to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetFrameNumber(\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_FRM_NUMBER, &Value);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+\r
+  Get frame number reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+\r
+  @retval                       Value of frame number reg\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetFrameNumber (\r
+  IN USB_OHCI_HC_DEV      *Ohc\r
+  )\r
+{\r
+  return OhciGetOperationalReg(Ohc, HC_FRM_NUMBER);\r
+}\r
+\r
+/**\r
+\r
+  Set period start reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Value                 Value to set\r
+\r
+  @retval EFI_SUCCESS           Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetPeriodicStart (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_PERIODIC_START, &Value);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Get periodic start reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+\r
+  @param                        Value of periodic start reg\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetPeriodicStart (\r
+  IN USB_OHCI_HC_DEV      *Ohc\r
+  )\r
+{\r
+  return OhciGetOperationalReg(Ohc, HC_PERIODIC_START);\r
+}\r
+\r
+\r
+/**\r
+\r
+  Set Ls Threshold reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Value                 Value to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetLsThreshold (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_LS_THREASHOLD, &Value);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Get Ls Threshold reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+\r
+  @retval                       Value of Ls Threshold reg\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetLsThreshold (\r
+  IN USB_OHCI_HC_DEV      *Ohc\r
+  )\r
+{\r
+  return OhciGetOperationalReg(Ohc, HC_LS_THREASHOLD);\r
+}\r
+\r
+/**\r
+\r
+  Set Root Hub Descriptor reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to set\r
+  @param  Value                 Value to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+EFI_STATUS\r
+OhciSetRootHubDescriptor (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field,\r
+  IN UINT32               Value\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcRH_DESC_A             DescriptorA;\r
+  HcRH_DESC_B             DescriptorB;\r
+\r
+\r
+  if (Field & (RH_DEV_REMOVABLE || RH_PORT_PWR_CTRL_MASK)) {\r
+    *(UINT32 *) &DescriptorB = OhciGetOperationalReg (Ohc, HC_RH_DESC_B);\r
+\r
+    if(Field & RH_DEV_REMOVABLE) {\r
+      DescriptorB.DeviceRemovable = Value;\r
+    }\r
+    if(Field & RH_PORT_PWR_CTRL_MASK) {\r
+      DescriptorB.PortPowerControlMask = Value;\r
+    }\r
+\r
+    Status = OhciSetOperationalReg (Ohc, HC_RH_DESC_B, (UINT32*)&DescriptorB);\r
+\r
+    return Status;\r
+  }\r
+\r
+  *(UINT32 *)&DescriptorA = OhciGetOperationalReg (Ohc, HC_RH_DESC_A);\r
+\r
+  if(Field & RH_NUM_DS_PORTS) {\r
+    DescriptorA.NumDownStrmPorts = Value;\r
+  }\r
+  if(Field & RH_NO_PSWITCH) {\r
+    DescriptorA.NoPowerSwitch = Value;\r
+  }\r
+  if(Field & RH_PSWITCH_MODE) {\r
+    DescriptorA.PowerSwitchMode = Value;\r
+  }\r
+  if(Field & RH_DEVICE_TYPE) {\r
+    DescriptorA.DeviceType = Value;\r
+  }\r
+  if(Field & RH_OC_PROT_MODE) {\r
+    DescriptorA.OverCurrentProtMode = Value;\r
+  }\r
+  if(Field & RH_NOC_PROT) {\r
+    DescriptorA.NoOverCurrentProtMode = Value;\r
+  }\r
+  if(Field & RH_NO_POTPGT) {\r
+    DescriptorA.PowerOnToPowerGoodTime = Value;\r
+  }\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_RH_DESC_A, (UINT32*)&DescriptorA);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Get Root Hub Descriptor reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetRootHubDescriptor (\r
+  IN USB_OHCI_HC_DEV     *Ohc,\r
+  IN UINTN               Field\r
+  )\r
+{\r
+  HcRH_DESC_A             DescriptorA;\r
+  HcRH_DESC_B             DescriptorB;\r
+\r
+\r
+  *(UINT32 *) &DescriptorA = OhciGetOperationalReg (Ohc, HC_RH_DESC_A);\r
+  *(UINT32 *) &DescriptorB = OhciGetOperationalReg (Ohc, HC_RH_DESC_B);\r
+\r
+  switch (Field){\r
+    case RH_DEV_REMOVABLE:\r
+      return DescriptorB.DeviceRemovable;\r
+      break;\r
+\r
+    case RH_PORT_PWR_CTRL_MASK:\r
+      return DescriptorB.PortPowerControlMask;\r
+      break;\r
+\r
+    case RH_NUM_DS_PORTS:\r
+      return DescriptorA.NumDownStrmPorts;\r
+      break;\r
+\r
+    case RH_NO_PSWITCH:\r
+      return DescriptorA.NoPowerSwitch;\r
+      break;\r
+\r
+    case RH_PSWITCH_MODE:\r
+      return DescriptorA.PowerSwitchMode;\r
+      break;\r
+\r
+    case RH_DEVICE_TYPE:\r
+      return DescriptorA.DeviceType;\r
+      break;\r
+\r
+    case RH_OC_PROT_MODE:\r
+      return DescriptorA.OverCurrentProtMode;\r
+      break;\r
+\r
+    case RH_NOC_PROT:\r
+      return DescriptorA.NoOverCurrentProtMode;\r
+      break;\r
+\r
+    case RH_NO_POTPGT:\r
+      return DescriptorA.PowerOnToPowerGoodTime;\r
+      break;\r
+\r
+    default:\r
+      ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Set Root Hub Status reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetRootHubStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcRH_STATUS             RootHubStatus;\r
+\r
+\r
+  ZeroMem (&RootHubStatus, sizeof(HcRH_STATUS));\r
+\r
+  if(Field & RH_LOCAL_PSTAT){\r
+    RootHubStatus.LocalPowerStat = 1;\r
+  }\r
+  if(Field & RH_OC_ID){\r
+    RootHubStatus.OverCurrentIndicator = 1;\r
+  }\r
+  if(Field & RH_REMOTE_WK_ENABLE){\r
+    RootHubStatus.DevRemoteWakeupEnable = 1;\r
+  }\r
+  if(Field & RH_LOCAL_PSTAT_CHANGE){\r
+    RootHubStatus.LocalPowerStatChange = 1;\r
+  }\r
+  if(Field & RH_OC_ID_CHANGE){\r
+    RootHubStatus.OverCurrentIndicatorChange = 1;\r
+  }\r
+  if(Field & RH_CLR_RMT_WK_ENABLE){\r
+    RootHubStatus.ClearRemoteWakeupEnable = 1;\r
+  }\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_RH_STATUS, (UINT32*)&RootHubStatus);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Get Root Hub Status reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field\r
+\r
+**/\r
+\r
+UINT32\r
+OhciGetRootHubStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  HcRH_STATUS             RootHubStatus;\r
+\r
+\r
+  *(UINT32 *) &RootHubStatus = OhciGetOperationalReg (Ohc, HC_RH_STATUS);\r
+\r
+  switch (Field) {\r
+    case RH_LOCAL_PSTAT:\r
+      return RootHubStatus.LocalPowerStat;\r
+      break;\r
+    case RH_OC_ID:\r
+      return RootHubStatus.OverCurrentIndicator;\r
+      break;\r
+    case RH_REMOTE_WK_ENABLE:\r
+      return RootHubStatus.DevRemoteWakeupEnable;\r
+      break;\r
+    case RH_LOCAL_PSTAT_CHANGE:\r
+      return RootHubStatus.LocalPowerStatChange;\r
+      break;\r
+    case RH_OC_ID_CHANGE:\r
+      return RootHubStatus.OverCurrentIndicatorChange;\r
+      break;\r
+    case RH_CLR_RMT_WK_ENABLE:\r
+      return RootHubStatus.ClearRemoteWakeupEnable;\r
+      break;\r
+    default:\r
+      ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Set Root Hub Port Status reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Index                 Index of the port\r
+  @param  Field                 Field to set\r
+\r
+  @retval  EFI_SUCCESS          Value set\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+OhciSetRootHubPortStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINT32               Index,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HcRHPORT_STATUS         PortStatus;\r
+\r
+\r
+  ZeroMem (&PortStatus, sizeof(HcRHPORT_STATUS));\r
+\r
+  if (Field & RH_CLEAR_PORT_ENABLE) {\r
+    PortStatus.CurrentConnectStat = 1;\r
+  }\r
+  if (Field & RH_SET_PORT_ENABLE) {\r
+    PortStatus.EnableStat = 1;\r
+  }\r
+  if (Field & RH_SET_PORT_SUSPEND) {\r
+    PortStatus.SuspendStat = 1;\r
+  }\r
+  if (Field & RH_CLEAR_SUSPEND_STATUS) {\r
+    PortStatus.OCIndicator = 1;\r
+  }\r
+  if (Field & RH_SET_PORT_RESET) {\r
+    PortStatus.ResetStat = 1;\r
+  }\r
+  if (Field & RH_SET_PORT_POWER) {\r
+    PortStatus.PowerStat = 1;\r
+  }\r
+  if (Field & RH_CLEAR_PORT_POWER) {\r
+    PortStatus.LsDeviceAttached = 1;\r
+  }\r
+  if (Field & RH_CONNECT_STATUS_CHANGE) {\r
+    PortStatus.ConnectStatChange = 1;\r
+  }\r
+  if (Field & RH_PORT_ENABLE_STAT_CHANGE) {\r
+    PortStatus.EnableStatChange = 1;\r
+  }\r
+  if (Field & RH_PORT_SUSPEND_STAT_CHANGE) {\r
+    PortStatus.SuspendStatChange = 1;\r
+  }\r
+  if (Field & RH_OC_INDICATOR_CHANGE) {\r
+    PortStatus.OCIndicatorChange = 1;\r
+  }\r
+  if (Field & RH_PORT_RESET_STAT_CHANGE ) {\r
+    PortStatus.ResetStatChange = 1;\r
+  }\r
+\r
+  Status = OhciSetOperationalReg (Ohc, HC_RH_PORT_STATUS + (Index * 4), (UINT32*)&PortStatus);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+\r
+  Get Root Hub Port Status reg value\r
+\r
+  @param  Ohc                   UHC private data\r
+  @param  Index                 Index of the port\r
+  @param  Field                 Field to get\r
+\r
+  @retval                       Value of the field and index\r
+\r
+**/\r
+\r
+UINT32\r
+OhciReadRootHubPortStatus (\r
+  IN USB_OHCI_HC_DEV      *Ohc,\r
+  IN UINT32               Index,\r
+  IN UINTN                Field\r
+  )\r
+{\r
+  HcRHPORT_STATUS         PortStatus;\r
+\r
+  *(UINT32 *) &PortStatus = OhciGetOperationalReg (\r
+                              Ohc,\r
+                              HC_RH_PORT_STATUS + (Index * 4)\r
+                              );\r
+\r
+  switch (Field){\r
+  case RH_CURR_CONNECT_STAT:\r
+    return PortStatus.CurrentConnectStat;\r
+    break;\r
+  case RH_PORT_ENABLE_STAT:\r
+    return PortStatus.EnableStat;\r
+    break;\r
+  case RH_PORT_SUSPEND_STAT:\r
+    return PortStatus.SuspendStat;\r
+    break;\r
+  case RH_PORT_OC_INDICATOR:\r
+    return PortStatus.OCIndicator;\r
+    break;\r
+  case RH_PORT_RESET_STAT:\r
+    return PortStatus.ResetStat;\r
+    break;\r
+  case RH_PORT_POWER_STAT:\r
+    return PortStatus.PowerStat;\r
+    break;\r
+  case RH_LSDEVICE_ATTACHED:\r
+    return PortStatus.LsDeviceAttached;\r
+    break;\r
+  case RH_CONNECT_STATUS_CHANGE:\r
+    return PortStatus.ConnectStatChange;\r
+    break;\r
+  case RH_PORT_ENABLE_STAT_CHANGE:\r
+    return PortStatus.EnableStatChange;\r
+    break;\r
+  case RH_PORT_SUSPEND_STAT_CHANGE:\r
+    return PortStatus.SuspendStatChange;\r
+    break;\r
+  case RH_OC_INDICATOR_CHANGE:\r
+    return PortStatus.OCIndicatorChange;\r
+    break;\r
+  case RH_PORT_RESET_STAT_CHANGE:\r
+    return PortStatus.ResetStatChange;\r
+    break;\r
+  default:\r
+    ASSERT (FALSE);\r
+  }\r
+\r
+  return 0;\r
+}\r