+++ /dev/null
-/** @file\r
-The OHCI register operation routines.\r
-\r
-Copyright (c) 2013-2015 Intel Corporation.\r
-\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\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
- HcRESET Reset;\r
-\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