| /** @file | |
| Private Header file for Usb Host Controller PEIM | |
| Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions | |
| of the BSD License which accompanies this distribution. The | |
| full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef _RECOVERY_UHC_H_ | |
| #define _RECOVERY_UHC_H_ | |
| #include <PiPei.h> | |
| #include <Ppi/UsbController.h> | |
| #include <Ppi/UsbHostController.h> | |
| #include <Ppi/IoMmu.h> | |
| #include <Ppi/EndOfPeiPhase.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/PeimEntryPoint.h> | |
| #include <Library/PeiServicesLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/TimerLib.h> | |
| #include <Library/IoLib.h> | |
| #include <Library/PeiServicesLib.h> | |
| #define USB_SLOW_SPEED_DEVICE 0x01 | |
| #define USB_FULL_SPEED_DEVICE 0x02 | |
| // | |
| // One memory block uses 16 page | |
| // | |
| #define NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES 16 | |
| #define USBCMD 0 /* Command Register Offset 00-01h */ | |
| #define USBCMD_RS BIT0 /* Run/Stop */ | |
| #define USBCMD_HCRESET BIT1 /* Host reset */ | |
| #define USBCMD_GRESET BIT2 /* Global reset */ | |
| #define USBCMD_EGSM BIT3 /* Global Suspend Mode */ | |
| #define USBCMD_FGR BIT4 /* Force Global Resume */ | |
| #define USBCMD_SWDBG BIT5 /* SW Debug mode */ | |
| #define USBCMD_CF BIT6 /* Config Flag (sw only) */ | |
| #define USBCMD_MAXP BIT7 /* Max Packet (0 = 32, 1 = 64) */ | |
| /* Status register */ | |
| #define USBSTS 2 /* Status Register Offset 02-03h */ | |
| #define USBSTS_USBINT BIT0 /* Interrupt due to IOC */ | |
| #define USBSTS_ERROR BIT1 /* Interrupt due to error */ | |
| #define USBSTS_RD BIT2 /* Resume Detect */ | |
| #define USBSTS_HSE BIT3 /* Host System Error - basically PCI problems */ | |
| #define USBSTS_HCPE BIT4 /* Host Controller Process Error - the scripts were buggy */ | |
| #define USBSTS_HCH BIT5 /* HC Halted */ | |
| /* Interrupt enable register */ | |
| #define USBINTR 4 /* Interrupt Enable Register 04-05h */ | |
| #define USBINTR_TIMEOUT BIT0 /* Timeout/CRC error enable */ | |
| #define USBINTR_RESUME BIT1 /* Resume interrupt enable */ | |
| #define USBINTR_IOC BIT2 /* Interrupt On Complete enable */ | |
| #define USBINTR_SP BIT3 /* Short packet interrupt enable */ | |
| /* Frame Number Register Offset 06-08h */ | |
| #define USBFRNUM 6 | |
| /* Frame List Base Address Register Offset 08-0Bh */ | |
| #define USBFLBASEADD 8 | |
| /* Start of Frame Modify Register Offset 0Ch */ | |
| #define USBSOF 0x0c | |
| /* USB port status and control registers */ | |
| #define USBPORTSC1 0x10 /*Port 1 offset 10-11h */ | |
| #define USBPORTSC2 0x12 /*Port 2 offset 12-13h */ | |
| #define USBPORTSC_CCS BIT0 /* Current Connect Status ("device present") */ | |
| #define USBPORTSC_CSC BIT1 /* Connect Status Change */ | |
| #define USBPORTSC_PED BIT2 /* Port Enable / Disable */ | |
| #define USBPORTSC_PEDC BIT3 /* Port Enable / Disable Change */ | |
| #define USBPORTSC_LSL BIT4 /* Line Status Low bit*/ | |
| #define USBPORTSC_LSH BIT5 /* Line Status High bit*/ | |
| #define USBPORTSC_RD BIT6 /* Resume Detect */ | |
| #define USBPORTSC_LSDA BIT8 /* Low Speed Device Attached */ | |
| #define USBPORTSC_PR BIT9 /* Port Reset */ | |
| #define USBPORTSC_SUSP BIT12 /* Suspend */ | |
| #define SETUP_PACKET_ID 0x2D | |
| #define INPUT_PACKET_ID 0x69 | |
| #define OUTPUT_PACKET_ID 0xE1 | |
| #define ERROR_PACKET_ID 0x55 | |
| #define STALL_1_MICRO_SECOND 1 | |
| #define STALL_1_MILLI_SECOND 1000 | |
| #pragma pack(1) | |
| typedef struct { | |
| UINT32 FrameListPtrTerminate : 1; | |
| UINT32 FrameListPtrQSelect : 1; | |
| UINT32 FrameListRsvd : 2; | |
| UINT32 FrameListPtr : 28; | |
| } FRAMELIST_ENTRY; | |
| typedef struct { | |
| UINT32 QHHorizontalTerminate : 1; | |
| UINT32 QHHorizontalQSelect : 1; | |
| UINT32 QHHorizontalRsvd : 2; | |
| UINT32 QHHorizontalPtr : 28; | |
| UINT32 QHVerticalTerminate : 1; | |
| UINT32 QHVerticalQSelect : 1; | |
| UINT32 QHVerticalRsvd : 2; | |
| UINT32 QHVerticalPtr : 28; | |
| } QUEUE_HEAD; | |
| typedef struct { | |
| QUEUE_HEAD QueueHead; | |
| UINT32 Reserved1; | |
| UINT32 Reserved2; | |
| VOID *PtrNext; | |
| VOID *PtrDown; | |
| VOID *Reserved3; | |
| UINT32 Reserved4; | |
| } QH_STRUCT; | |
| typedef struct { | |
| UINT32 TDLinkPtrTerminate : 1; | |
| UINT32 TDLinkPtrQSelect : 1; | |
| UINT32 TDLinkPtrDepthSelect : 1; | |
| UINT32 TDLinkPtrRsvd : 1; | |
| UINT32 TDLinkPtr : 28; | |
| UINT32 TDStatusActualLength : 11; | |
| UINT32 TDStatusRsvd : 5; | |
| UINT32 TDStatus : 8; | |
| UINT32 TDStatusIOC : 1; | |
| UINT32 TDStatusIOS : 1; | |
| UINT32 TDStatusLS : 1; | |
| UINT32 TDStatusErr : 2; | |
| UINT32 TDStatusSPD : 1; | |
| UINT32 TDStatusRsvd2 : 2; | |
| UINT32 TDTokenPID : 8; | |
| UINT32 TDTokenDevAddr : 7; | |
| UINT32 TDTokenEndPt : 4; | |
| UINT32 TDTokenDataToggle : 1; | |
| UINT32 TDTokenRsvd : 1; | |
| UINT32 TDTokenMaxLen : 11; | |
| UINT32 TDBufferPtr; | |
| } TD; | |
| typedef struct { | |
| TD TDData; | |
| UINT8 *PtrTDBuffer; | |
| VOID *PtrNextTD; | |
| VOID *PtrNextQH; | |
| UINT16 TDBufferLength; | |
| UINT16 Reserved; | |
| } TD_STRUCT; | |
| #pragma pack() | |
| typedef struct _MEMORY_MANAGE_HEADER MEMORY_MANAGE_HEADER; | |
| struct _MEMORY_MANAGE_HEADER { | |
| UINT8 *BitArrayPtr; | |
| UINTN BitArraySizeInBytes; | |
| UINT8 *MemoryBlockPtr; | |
| UINTN MemoryBlockSizeInBytes; | |
| MEMORY_MANAGE_HEADER *Next; | |
| }; | |
| #define USB_UHC_DEV_SIGNATURE SIGNATURE_32 ('p', 'u', 'h', 'c') | |
| typedef struct { | |
| UINTN Signature; | |
| PEI_USB_HOST_CONTROLLER_PPI UsbHostControllerPpi; | |
| EDKII_IOMMU_PPI *IoMmu; | |
| EFI_PEI_PPI_DESCRIPTOR PpiDescriptor; | |
| // | |
| // EndOfPei callback is used to stop the UHC DMA operation | |
| // after exit PEI phase. | |
| // | |
| EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList; | |
| UINT32 UsbHostControllerBaseAddress; | |
| FRAMELIST_ENTRY *FrameListEntry; | |
| QH_STRUCT *ConfigQH; | |
| QH_STRUCT *BulkQH; | |
| // | |
| // Header1 used for QH,TD memory blocks management | |
| // | |
| MEMORY_MANAGE_HEADER *Header1; | |
| } USB_UHC_DEV; | |
| #define PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS(a) CR (a, USB_UHC_DEV, UsbHostControllerPpi, USB_UHC_DEV_SIGNATURE) | |
| #define PEI_RECOVERY_USB_UHC_DEV_FROM_THIS_NOTIFY(a) CR (a, USB_UHC_DEV, EndOfPeiNotifyList, USB_UHC_DEV_SIGNATURE) | |
| /** | |
| Submits control transfer to a target USB device. | |
| @param PeiServices The pointer of EFI_PEI_SERVICES. | |
| @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
| @param DeviceAddress The target device address. | |
| @param DeviceSpeed Target device speed. | |
| @param MaximumPacketLength Maximum packet size the default control transfer | |
| endpoint is capable of sending or receiving. | |
| @param Request USB device request to send. | |
| @param TransferDirection Specifies the data direction for the data stage. | |
| @param Data Data buffer to be transmitted or received from USB device. | |
| @param DataLength The size (in bytes) of the data buffer. | |
| @param TimeOut Indicates the maximum timeout, in millisecond. | |
| @param TransferResult Return the result of this control transfer. | |
| @retval EFI_SUCCESS Transfer was completed successfully. | |
| @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resources. | |
| @retval EFI_INVALID_PARAMETER Some parameters are invalid. | |
| @retval EFI_TIMEOUT Transfer failed due to timeout. | |
| @retval EFI_DEVICE_ERROR Transfer failed due to host controller or device error. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UhcControlTransfer ( | |
| IN EFI_PEI_SERVICES **PeiServices, | |
| IN PEI_USB_HOST_CONTROLLER_PPI * This, | |
| IN UINT8 DeviceAddress, | |
| IN UINT8 DeviceSpeed, | |
| IN UINT8 MaximumPacketLength, | |
| IN EFI_USB_DEVICE_REQUEST * Request, | |
| IN EFI_USB_DATA_DIRECTION TransferDirection, | |
| IN OUT VOID *Data OPTIONAL, | |
| IN OUT UINTN *DataLength OPTIONAL, | |
| IN UINTN TimeOut, | |
| OUT UINT32 *TransferResult | |
| ); | |
| /** | |
| Submits bulk transfer to a bulk endpoint of a USB device. | |
| @param PeiServices The pointer of EFI_PEI_SERVICES. | |
| @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
| @param DeviceAddress Target device address. | |
| @param EndPointAddress Endpoint number and its direction in bit 7. | |
| @param MaximumPacketLength Maximum packet size the endpoint is capable of | |
| sending or receiving. | |
| @param Data Array of pointers to the buffers of data to transmit | |
| from or receive into. | |
| @param DataLength The lenght of the data buffer. | |
| @param DataToggle On input, the initial data toggle for the transfer; | |
| On output, it is updated to to next data toggle to use of | |
| the subsequent bulk transfer. | |
| @param TimeOut Indicates the maximum time, in millisecond, which the | |
| transfer is allowed to complete. | |
| @param TransferResult A pointer to the detailed result information of the | |
| bulk transfer. | |
| @retval EFI_SUCCESS The transfer was completed successfully. | |
| @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource. | |
| @retval EFI_INVALID_PARAMETER Parameters are invalid. | |
| @retval EFI_TIMEOUT The transfer failed due to timeout. | |
| @retval EFI_DEVICE_ERROR The transfer failed due to host controller error. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UhcBulkTransfer ( | |
| IN EFI_PEI_SERVICES **PeiServices, | |
| IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
| IN UINT8 DeviceAddress, | |
| IN UINT8 EndPointAddress, | |
| IN UINT8 MaximumPacketLength, | |
| IN OUT VOID *Data, | |
| IN OUT UINTN *DataLength, | |
| IN OUT UINT8 *DataToggle, | |
| IN UINTN TimeOut, | |
| OUT UINT32 *TransferResult | |
| ); | |
| /** | |
| Retrieves the number of root hub ports. | |
| @param[in] PeiServices The pointer to the PEI Services Table. | |
| @param[in] This The pointer to this instance of the | |
| PEI_USB_HOST_CONTROLLER_PPI. | |
| @param[out] PortNumber The pointer to the number of the root hub ports. | |
| @retval EFI_SUCCESS The port number was retrieved successfully. | |
| @retval EFI_INVALID_PARAMETER PortNumber is NULL. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UhcGetRootHubPortNumber ( | |
| IN EFI_PEI_SERVICES **PeiServices, | |
| IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
| OUT UINT8 *PortNumber | |
| ); | |
| /** | |
| Retrieves the current status of a USB root hub port. | |
| @param PeiServices The pointer of EFI_PEI_SERVICES. | |
| @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
| @param PortNumber The root hub port to retrieve the state from. | |
| @param PortStatus Variable to receive the port state. | |
| @retval EFI_SUCCESS The status of the USB root hub port specified. | |
| by PortNumber was returned in PortStatus. | |
| @retval EFI_INVALID_PARAMETER PortNumber is invalid. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UhcGetRootHubPortStatus ( | |
| IN EFI_PEI_SERVICES **PeiServices, | |
| IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
| IN UINT8 PortNumber, | |
| OUT EFI_USB_PORT_STATUS *PortStatus | |
| ); | |
| /** | |
| Sets a feature for the specified root hub port. | |
| @param PeiServices The pointer of EFI_PEI_SERVICES | |
| @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI | |
| @param PortNumber Root hub port to set. | |
| @param PortFeature Feature to set. | |
| @retval EFI_SUCCESS The feature specified by PortFeature was set. | |
| @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. | |
| @retval EFI_TIMEOUT The time out occurred. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UhcSetRootHubPortFeature ( | |
| IN EFI_PEI_SERVICES **PeiServices, | |
| IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
| IN UINT8 PortNumber, | |
| IN EFI_USB_PORT_FEATURE PortFeature | |
| ); | |
| /** | |
| Clears a feature for the specified root hub port. | |
| @param PeiServices The pointer of EFI_PEI_SERVICES. | |
| @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
| @param PortNumber Specifies the root hub port whose feature | |
| is requested to be cleared. | |
| @param PortFeature Indicates the feature selector associated with the | |
| feature clear request. | |
| @retval EFI_SUCCESS The feature specified by PortFeature was cleared | |
| for the USB root hub port specified by PortNumber. | |
| @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UhcClearRootHubPortFeature ( | |
| IN EFI_PEI_SERVICES **PeiServices, | |
| IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
| IN UINT8 PortNumber, | |
| IN EFI_USB_PORT_FEATURE PortFeature | |
| ); | |
| /** | |
| Initialize UHCI. | |
| @param UhcDev UHCI Device. | |
| @retval EFI_SUCCESS UHCI successfully initialized. | |
| @retval EFI_OUT_OF_RESOURCES Resource can not be allocated. | |
| **/ | |
| EFI_STATUS | |
| InitializeUsbHC ( | |
| IN USB_UHC_DEV *UhcDev | |
| ); | |
| /** | |
| Create Frame List Structure. | |
| @param UhcDev UHCI device. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
| @retval EFI_SUCCESS Success. | |
| **/ | |
| EFI_STATUS | |
| CreateFrameList ( | |
| USB_UHC_DEV *UhcDev | |
| ); | |
| /** | |
| Read a 16bit width data from Uhc HC IO space register. | |
| @param UhcDev The UHCI device. | |
| @param Port The IO space address of the register. | |
| @retval the register content read. | |
| **/ | |
| UINT16 | |
| USBReadPortW ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 Port | |
| ); | |
| /** | |
| Write a 16bit width data into Uhc HC IO space register. | |
| @param UhcDev The UHCI device. | |
| @param Port The IO space address of the register. | |
| @param Data The data written into the register. | |
| **/ | |
| VOID | |
| USBWritePortW ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 Port, | |
| IN UINT16 Data | |
| ); | |
| /** | |
| Write a 32bit width data into Uhc HC IO space register. | |
| @param UhcDev The UHCI device. | |
| @param Port The IO space address of the register. | |
| @param Data The data written into the register. | |
| **/ | |
| VOID | |
| USBWritePortDW ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 Port, | |
| IN UINT32 Data | |
| ); | |
| /** | |
| Clear the content of UHCI's Status Register. | |
| @param UhcDev The UHCI device. | |
| @param StatusAddr The IO space address of the register. | |
| **/ | |
| VOID | |
| ClearStatusReg ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 StatusAddr | |
| ); | |
| /** | |
| Check whether the host controller operates well. | |
| @param UhcDev The UHCI device. | |
| @param StatusRegAddr The io address of status register. | |
| @retval TRUE Host controller is working. | |
| @retval FALSE Host controller is halted or system error. | |
| **/ | |
| BOOLEAN | |
| IsStatusOK ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 StatusRegAddr | |
| ); | |
| /** | |
| Get Current Frame Number. | |
| @param UhcDev The UHCI device. | |
| @param FrameNumberAddr The address of frame list register. | |
| @retval The content of the frame list register. | |
| **/ | |
| UINT16 | |
| GetCurrentFrameNumber ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 FrameNumberAddr | |
| ); | |
| /** | |
| Set Frame List Base Address. | |
| @param UhcDev The UHCI device. | |
| @param FrameListRegAddr The address of frame list register. | |
| @param Addr The address of frame list table. | |
| **/ | |
| VOID | |
| SetFrameListBaseAddress ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 FrameListRegAddr, | |
| IN UINT32 Addr | |
| ); | |
| /** | |
| Create QH and initialize. | |
| @param UhcDev The UHCI device. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
| @retval EFI_SUCCESS Success. | |
| **/ | |
| EFI_STATUS | |
| CreateQH ( | |
| IN USB_UHC_DEV *UhcDev, | |
| OUT QH_STRUCT **PtrQH | |
| ); | |
| /** | |
| Set the horizontal link pointer in QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @param PtrNext Place to the next QH_STRUCT. | |
| **/ | |
| VOID | |
| SetQHHorizontalLinkPtr ( | |
| IN QH_STRUCT *PtrQH, | |
| IN VOID *PtrNext | |
| ); | |
| /** | |
| Get the horizontal link pointer in QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @retval The horizontal link pointer in QH. | |
| **/ | |
| VOID * | |
| GetQHHorizontalLinkPtr ( | |
| IN QH_STRUCT *PtrQH | |
| ); | |
| /** | |
| Set a QH or TD horizontally to be connected with a specific QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @param IsQH Specify QH or TD is connected. | |
| **/ | |
| VOID | |
| SetQHHorizontalQHorTDSelect ( | |
| IN QH_STRUCT *PtrQH, | |
| IN BOOLEAN IsQH | |
| ); | |
| /** | |
| Set the horizontal validor bit in QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @param IsValid Specify the horizontal linker is valid or not. | |
| **/ | |
| VOID | |
| SetQHHorizontalValidorInvalid ( | |
| IN QH_STRUCT *PtrQH, | |
| IN BOOLEAN IsValid | |
| ); | |
| /** | |
| Set the vertical link pointer in QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @param PtrNext Place to the next QH_STRUCT. | |
| **/ | |
| VOID | |
| SetQHVerticalLinkPtr ( | |
| IN QH_STRUCT *PtrQH, | |
| IN VOID *PtrNext | |
| ); | |
| /** | |
| Set a QH or TD vertically to be connected with a specific QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @param IsQH Specify QH or TD is connected. | |
| **/ | |
| VOID | |
| SetQHVerticalQHorTDSelect ( | |
| IN QH_STRUCT *PtrQH, | |
| IN BOOLEAN IsQH | |
| ); | |
| /** | |
| Set the vertical validor bit in QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @param IsValid Specify the vertical linker is valid or not. | |
| **/ | |
| VOID | |
| SetQHVerticalValidorInvalid ( | |
| IN QH_STRUCT *PtrQH, | |
| IN BOOLEAN IsValid | |
| ); | |
| /** | |
| Get the vertical validor bit in QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @retval The vertical linker is valid or not. | |
| **/ | |
| BOOLEAN | |
| GetQHHorizontalValidorInvalid ( | |
| IN QH_STRUCT *PtrQH | |
| ); | |
| /** | |
| Allocate TD or QH Struct. | |
| @param UhcDev The UHCI device. | |
| @param Size The size of allocation. | |
| @param PtrStruct Place to store TD_STRUCT pointer. | |
| @return EFI_SUCCESS Allocate successfully. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
| **/ | |
| EFI_STATUS | |
| AllocateTDorQHStruct ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT32 Size, | |
| OUT VOID **PtrStruct | |
| ); | |
| /** | |
| Create a TD Struct. | |
| @param UhcDev The UHCI device. | |
| @param PtrTD Place to store TD_STRUCT pointer. | |
| @return EFI_SUCCESS Allocate successfully. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
| **/ | |
| EFI_STATUS | |
| CreateTD ( | |
| IN USB_UHC_DEV *UhcDev, | |
| OUT TD_STRUCT **PtrTD | |
| ); | |
| /** | |
| Generate Setup Stage TD. | |
| @param UhcDev The UHCI device. | |
| @param DevAddr Device address. | |
| @param Endpoint Endpoint number. | |
| @param DeviceSpeed Device Speed. | |
| @param DevRequest CPU memory address of request structure buffer to transfer. | |
| @param RequestPhy PCI memory address of request structure buffer to transfer. | |
| @param RequestLen Request length. | |
| @param PtrTD TD_STRUCT generated. | |
| @return EFI_SUCCESS Generate setup stage TD successfully. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
| **/ | |
| EFI_STATUS | |
| GenSetupStageTD ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT8 DevAddr, | |
| IN UINT8 Endpoint, | |
| IN UINT8 DeviceSpeed, | |
| IN UINT8 *DevRequest, | |
| IN UINT8 *RequestPhy, | |
| IN UINT8 RequestLen, | |
| OUT TD_STRUCT **PtrTD | |
| ); | |
| /** | |
| Generate Data Stage TD. | |
| @param UhcDev The UHCI device. | |
| @param DevAddr Device address. | |
| @param Endpoint Endpoint number. | |
| @param PtrData CPU memory address of user data buffer to transfer. | |
| @param DataPhy PCI memory address of user data buffer to transfer. | |
| @param Len Data length. | |
| @param PktID PacketID. | |
| @param Toggle Data toggle value. | |
| @param DeviceSpeed Device Speed. | |
| @param PtrTD TD_STRUCT generated. | |
| @return EFI_SUCCESS Generate data stage TD successfully. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
| **/ | |
| EFI_STATUS | |
| GenDataTD ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT8 DevAddr, | |
| IN UINT8 Endpoint, | |
| IN UINT8 *PtrData, | |
| IN UINT8 *DataPhy, | |
| IN UINT8 Len, | |
| IN UINT8 PktID, | |
| IN UINT8 Toggle, | |
| IN UINT8 DeviceSpeed, | |
| OUT TD_STRUCT **PtrTD | |
| ); | |
| /** | |
| Generate Status Stage TD. | |
| @param UhcDev The UHCI device. | |
| @param DevAddr Device address. | |
| @param Endpoint Endpoint number. | |
| @param PktID PacketID. | |
| @param DeviceSpeed Device Speed. | |
| @param PtrTD TD_STRUCT generated. | |
| @return EFI_SUCCESS Generate status stage TD successfully. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
| **/ | |
| EFI_STATUS | |
| CreateStatusTD ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT8 DevAddr, | |
| IN UINT8 Endpoint, | |
| IN UINT8 PktID, | |
| IN UINT8 DeviceSpeed, | |
| OUT TD_STRUCT **PtrTD | |
| ); | |
| /** | |
| Set the link pointer validor bit in TD. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsValid Specify the linker pointer is valid or not. | |
| **/ | |
| VOID | |
| SetTDLinkPtrValidorInvalid ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsValid | |
| ); | |
| /** | |
| Set the Link Pointer pointing to a QH or TD. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsQH Specify QH or TD is connected. | |
| **/ | |
| VOID | |
| SetTDLinkPtrQHorTDSelect ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsQH | |
| ); | |
| /** | |
| Set the traverse is depth-first or breadth-first. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsDepth Specify the traverse is depth-first or breadth-first. | |
| **/ | |
| VOID | |
| SetTDLinkPtrDepthorBreadth ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsDepth | |
| ); | |
| /** | |
| Set TD Link Pointer in TD. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param PtrNext Place to the next TD_STRUCT. | |
| **/ | |
| VOID | |
| SetTDLinkPtr ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN VOID *PtrNext | |
| ); | |
| /** | |
| Get TD Link Pointer. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval Get TD Link Pointer in TD. | |
| **/ | |
| VOID* | |
| GetTDLinkPtr ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Get the information about whether the Link Pointer field pointing to | |
| a QH or a TD. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval whether the Link Pointer field pointing to a QH or a TD. | |
| **/ | |
| BOOLEAN | |
| IsTDLinkPtrQHOrTD ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Enable/Disable short packet detection mechanism. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsEnable Enable or disable short packet detection mechanism. | |
| **/ | |
| VOID | |
| EnableorDisableTDShortPacket ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsEnable | |
| ); | |
| /** | |
| Set the max error counter in TD. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param MaxErrors The number of allowable error. | |
| **/ | |
| VOID | |
| SetTDControlErrorCounter ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN UINT8 MaxErrors | |
| ); | |
| /** | |
| Set the TD is targeting a low-speed device or not. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsLowSpeedDevice Whether The device is low-speed. | |
| **/ | |
| VOID | |
| SetTDLoworFullSpeedDevice ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsLowSpeedDevice | |
| ); | |
| /** | |
| Set the TD is isochronous transfer type or not. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsIsochronous Whether the transaction isochronous transfer type. | |
| **/ | |
| VOID | |
| SetTDControlIsochronousorNot ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsIsochronous | |
| ); | |
| /** | |
| Set if UCHI should issue an interrupt on completion of the frame | |
| in which this TD is executed | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsSet Whether HC should issue an interrupt on completion. | |
| **/ | |
| VOID | |
| SetorClearTDControlIOC ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsSet | |
| ); | |
| /** | |
| Set if the TD is active and can be executed. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param IsActive Whether the TD is active and can be executed. | |
| **/ | |
| VOID | |
| SetTDStatusActiveorInactive ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN BOOLEAN IsActive | |
| ); | |
| /** | |
| Specifies the maximum number of data bytes allowed for the transfer. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param MaxLen The maximum number of data bytes allowed. | |
| @retval The allowed maximum number of data. | |
| **/ | |
| UINT16 | |
| SetTDTokenMaxLength ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN UINT16 MaxLen | |
| ); | |
| /** | |
| Set the data toggle bit to DATA1. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| **/ | |
| VOID | |
| SetTDTokenDataToggle1 ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Set the data toggle bit to DATA0. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| **/ | |
| VOID | |
| SetTDTokenDataToggle0 ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Set EndPoint Number the TD is targeting at. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param EndPoint The Endport number of the target. | |
| **/ | |
| VOID | |
| SetTDTokenEndPoint ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN UINTN EndPoint | |
| ); | |
| /** | |
| Set Device Address the TD is targeting at. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param DevAddr The Device Address of the target. | |
| **/ | |
| VOID | |
| SetTDTokenDeviceAddress ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN UINTN DevAddr | |
| ); | |
| /** | |
| Set Packet Identification the TD is targeting at. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @param PacketID The Packet Identification of the target. | |
| **/ | |
| VOID | |
| SetTDTokenPacketID ( | |
| IN TD_STRUCT *PtrTDStruct, | |
| IN UINT8 PacketID | |
| ); | |
| /** | |
| Set the beginning address of the data buffer that will be used | |
| during the transaction. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| **/ | |
| VOID | |
| SetTDDataBuffer ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Detect whether the TD is active. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The TD is active or not. | |
| **/ | |
| BOOLEAN | |
| IsTDStatusActive ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Detect whether the TD is stalled. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The TD is stalled or not. | |
| **/ | |
| BOOLEAN | |
| IsTDStatusStalled ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Detect whether Data Buffer Error is happened. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The Data Buffer Error is happened or not. | |
| **/ | |
| BOOLEAN | |
| IsTDStatusBufferError ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Detect whether Babble Error is happened. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The Babble Error is happened or not. | |
| **/ | |
| BOOLEAN | |
| IsTDStatusBabbleError ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Detect whether NAK is received. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The NAK is received or not. | |
| **/ | |
| BOOLEAN | |
| IsTDStatusNAKReceived ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Detect whether CRC/Time Out Error is encountered. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The CRC/Time Out Error is encountered or not. | |
| **/ | |
| BOOLEAN | |
| IsTDStatusCRCTimeOutError ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Detect whether Bitstuff Error is received. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The Bitstuff Error is received or not. | |
| **/ | |
| BOOLEAN | |
| IsTDStatusBitStuffError ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Retrieve the actual number of bytes that were tansferred. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The actual number of bytes that were tansferred. | |
| **/ | |
| UINT16 | |
| GetTDStatusActualLength ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Retrieve the information of whether the Link Pointer field is valid or not. | |
| @param PtrTDStruct Place to store TD_STRUCT pointer. | |
| @retval The linker pointer field is valid or not. | |
| **/ | |
| BOOLEAN | |
| GetTDLinkPtrValidorInvalid ( | |
| IN TD_STRUCT *PtrTDStruct | |
| ); | |
| /** | |
| Count TD Number from PtrFirstTD. | |
| @param PtrFirstTD Place to store TD_STRUCT pointer. | |
| @retval The queued TDs number. | |
| **/ | |
| UINTN | |
| CountTDsNumber ( | |
| IN TD_STRUCT *PtrFirstTD | |
| ); | |
| /** | |
| Link TD To QH. | |
| @param PtrQH Place to store QH_STRUCT pointer. | |
| @param PtrTD Place to store TD_STRUCT pointer. | |
| **/ | |
| VOID | |
| LinkTDToQH ( | |
| IN QH_STRUCT *PtrQH, | |
| IN TD_STRUCT *PtrTD | |
| ); | |
| /** | |
| Link TD To TD. | |
| @param PtrPreTD Place to store TD_STRUCT pointer. | |
| @param PtrTD Place to store TD_STRUCT pointer. | |
| **/ | |
| VOID | |
| LinkTDToTD ( | |
| IN TD_STRUCT *PtrPreTD, | |
| IN TD_STRUCT *PtrTD | |
| ); | |
| /** | |
| Execute Control Transfer. | |
| @param UhcDev The UCHI device. | |
| @param PtrTD A pointer to TD_STRUCT data. | |
| @param ActualLen Actual transfer Length. | |
| @param TimeOut TimeOut value. | |
| @param TransferResult Transfer Result. | |
| @return EFI_DEVICE_ERROR The transfer failed due to transfer error. | |
| @return EFI_TIMEOUT The transfer failed due to time out. | |
| @return EFI_SUCCESS The transfer finished OK. | |
| **/ | |
| EFI_STATUS | |
| ExecuteControlTransfer ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN TD_STRUCT *PtrTD, | |
| OUT UINTN *ActualLen, | |
| IN UINTN TimeOut, | |
| OUT UINT32 *TransferResult | |
| ); | |
| /** | |
| Execute Bulk Transfer. | |
| @param UhcDev The UCHI device. | |
| @param PtrTD A pointer to TD_STRUCT data. | |
| @param ActualLen Actual transfer Length. | |
| @param DataToggle DataToggle value. | |
| @param TimeOut TimeOut value. | |
| @param TransferResult Transfer Result. | |
| @return EFI_DEVICE_ERROR The transfer failed due to transfer error. | |
| @return EFI_TIMEOUT The transfer failed due to time out. | |
| @return EFI_SUCCESS The transfer finished OK. | |
| **/ | |
| EFI_STATUS | |
| ExecBulkTransfer ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN TD_STRUCT *PtrTD, | |
| IN OUT UINTN *ActualLen, | |
| IN UINT8 *DataToggle, | |
| IN UINTN TimeOut, | |
| OUT UINT32 *TransferResult | |
| ); | |
| /** | |
| Delete Queued TDs. | |
| @param UhcDev The UCHI device. | |
| @param PtrFirstTD Place to store TD_STRUCT pointer. | |
| **/ | |
| VOID | |
| DeleteQueuedTDs ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN TD_STRUCT *PtrFirstTD | |
| ); | |
| /** | |
| Check TDs Results. | |
| @param PtrTD A pointer to TD_STRUCT data. | |
| @param Result The result to return. | |
| @param ErrTDPos The Error TD position. | |
| @param ActualTransferSize Actual transfer size. | |
| @retval The TD is executed successfully or not. | |
| **/ | |
| BOOLEAN | |
| CheckTDsResults ( | |
| IN TD_STRUCT *PtrTD, | |
| OUT UINT32 *Result, | |
| OUT UINTN *ErrTDPos, | |
| OUT UINTN *ActualTransferSize | |
| ); | |
| /** | |
| Create Memory Block. | |
| @param UhcDev The UCHI device. | |
| @param MemoryHeader The Pointer to allocated memory block. | |
| @param MemoryBlockSizeInPages The page size of memory block to be allocated. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
| @retval EFI_SUCCESS Success. | |
| **/ | |
| EFI_STATUS | |
| CreateMemoryBlock ( | |
| IN USB_UHC_DEV *UhcDev, | |
| OUT MEMORY_MANAGE_HEADER **MemoryHeader, | |
| IN UINTN MemoryBlockSizeInPages | |
| ); | |
| /** | |
| Initialize UHCI memory management. | |
| @param UhcDev The UCHI device. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
| @retval EFI_SUCCESS Success. | |
| **/ | |
| EFI_STATUS | |
| InitializeMemoryManagement ( | |
| IN USB_UHC_DEV *UhcDev | |
| ); | |
| /** | |
| Initialize UHCI memory management. | |
| @param UhcDev The UCHI device. | |
| @param Pool Buffer pointer to store the buffer pointer. | |
| @param AllocSize The size of the pool to be allocated. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
| @retval EFI_SUCCESS Success. | |
| **/ | |
| EFI_STATUS | |
| UhcAllocatePool ( | |
| IN USB_UHC_DEV *UhcDev, | |
| OUT UINT8 **Pool, | |
| IN UINTN AllocSize | |
| ); | |
| /** | |
| Alloc Memory In MemoryBlock. | |
| @param MemoryHeader The pointer to memory manage header. | |
| @param Pool Buffer pointer to store the buffer pointer. | |
| @param NumberOfMemoryUnit The size of the pool to be allocated. | |
| @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
| @retval EFI_SUCCESS Success. | |
| **/ | |
| EFI_STATUS | |
| AllocMemInMemoryBlock ( | |
| IN MEMORY_MANAGE_HEADER *MemoryHeader, | |
| OUT VOID **Pool, | |
| IN UINTN NumberOfMemoryUnit | |
| ); | |
| /** | |
| Uhci Free Pool. | |
| @param UhcDev The UHCI device. | |
| @param Pool A pointer to store the buffer address. | |
| @param AllocSize The size of the pool to be freed. | |
| **/ | |
| VOID | |
| UhcFreePool ( | |
| IN USB_UHC_DEV *UhcDev, | |
| IN UINT8 *Pool, | |
| IN UINTN AllocSize | |
| ); | |
| /** | |
| Insert a new memory header into list. | |
| @param MemoryHeader A pointer to the memory header list. | |
| @param NewMemoryHeader A new memory header to be inserted into the list. | |
| **/ | |
| VOID | |
| InsertMemoryHeaderToList ( | |
| IN MEMORY_MANAGE_HEADER *MemoryHeader, | |
| IN MEMORY_MANAGE_HEADER *NewMemoryHeader | |
| ); | |
| /** | |
| Judge the memory block in the memory header is empty or not. | |
| @param MemoryHeaderPtr A pointer to the memory header list. | |
| @retval Whether the memory block in the memory header is empty or not. | |
| **/ | |
| BOOLEAN | |
| IsMemoryBlockEmptied ( | |
| IN MEMORY_MANAGE_HEADER *MemoryHeaderPtr | |
| ); | |
| /** | |
| remove a memory header from list. | |
| @param FirstMemoryHeader A pointer to the memory header list. | |
| @param FreeMemoryHeader A memory header to be removed into the list. | |
| **/ | |
| VOID | |
| DelinkMemoryBlock ( | |
| IN MEMORY_MANAGE_HEADER *FirstMemoryHeader, | |
| IN MEMORY_MANAGE_HEADER *FreeMemoryHeader | |
| ); | |
| /** | |
| Map address of request structure buffer. | |
| @param Uhc The UHCI device. | |
| @param Request The user request buffer. | |
| @param MappedAddr Mapped address of request. | |
| @param Map Identificaion of this mapping to return. | |
| @return EFI_SUCCESS Success. | |
| @return EFI_DEVICE_ERROR Fail to map the user request. | |
| **/ | |
| EFI_STATUS | |
| UhciMapUserRequest ( | |
| IN USB_UHC_DEV *Uhc, | |
| IN OUT VOID *Request, | |
| OUT UINT8 **MappedAddr, | |
| OUT VOID **Map | |
| ); | |
| /** | |
| Map address of user data buffer. | |
| @param Uhc The UHCI device. | |
| @param Direction Direction of the data transfer. | |
| @param Data The user data buffer. | |
| @param Len Length of the user data. | |
| @param PktId Packet identificaion. | |
| @param MappedAddr Mapped address to return. | |
| @param Map Identificaion of this mapping to return. | |
| @return EFI_SUCCESS Success. | |
| @return EFI_DEVICE_ERROR Fail to map the user data. | |
| **/ | |
| EFI_STATUS | |
| UhciMapUserData ( | |
| IN USB_UHC_DEV *Uhc, | |
| IN EFI_USB_DATA_DIRECTION Direction, | |
| IN VOID *Data, | |
| IN OUT UINTN *Len, | |
| OUT UINT8 *PktId, | |
| OUT UINT8 **MappedAddr, | |
| OUT VOID **Map | |
| ); | |
| /** | |
| Provides the controller-specific addresses required to access system memory from a | |
| DMA bus master. | |
| @param IoMmu Pointer to IOMMU PPI. | |
| @param Operation Indicates if the bus master is going to read or write to system memory. | |
| @param HostAddress The system memory address to map to the PCI controller. | |
| @param NumberOfBytes On input the number of bytes to map. On output the number of bytes | |
| that were mapped. | |
| @param DeviceAddress The resulting map address for the bus master PCI controller to use to | |
| access the hosts HostAddress. | |
| @param Mapping A resulting value to pass to Unmap(). | |
| @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. | |
| @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer. | |
| @retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
| @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. | |
| @retval EFI_DEVICE_ERROR The system hardware could not map the requested address. | |
| **/ | |
| EFI_STATUS | |
| IoMmuMap ( | |
| IN EDKII_IOMMU_PPI *IoMmu, | |
| IN EDKII_IOMMU_OPERATION Operation, | |
| IN VOID *HostAddress, | |
| IN OUT UINTN *NumberOfBytes, | |
| OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, | |
| OUT VOID **Mapping | |
| ); | |
| /** | |
| Completes the Map() operation and releases any corresponding resources. | |
| @param IoMmu Pointer to IOMMU PPI. | |
| @param Mapping The mapping value returned from Map(). | |
| **/ | |
| VOID | |
| IoMmuUnmap ( | |
| IN EDKII_IOMMU_PPI *IoMmu, | |
| IN VOID *Mapping | |
| ); | |
| /** | |
| Allocates pages that are suitable for an OperationBusMasterCommonBuffer or | |
| OperationBusMasterCommonBuffer64 mapping. | |
| @param IoMmu Pointer to IOMMU PPI. | |
| @param Pages The number of pages to allocate. | |
| @param HostAddress A pointer to store the base system memory address of the | |
| allocated range. | |
| @param DeviceAddress The resulting map address for the bus master PCI controller to use to | |
| access the hosts HostAddress. | |
| @param Mapping A resulting value to pass to Unmap(). | |
| @retval EFI_SUCCESS The requested memory pages were allocated. | |
| @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are | |
| MEMORY_WRITE_COMBINE and MEMORY_CACHED. | |
| @retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
| @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. | |
| **/ | |
| EFI_STATUS | |
| IoMmuAllocateBuffer ( | |
| IN EDKII_IOMMU_PPI *IoMmu, | |
| IN UINTN Pages, | |
| OUT VOID **HostAddress, | |
| OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, | |
| OUT VOID **Mapping | |
| ); | |
| /** | |
| Frees memory that was allocated with AllocateBuffer(). | |
| @param IoMmu Pointer to IOMMU PPI. | |
| @param Pages The number of pages to free. | |
| @param HostAddress The base system memory address of the allocated range. | |
| @param Mapping The mapping value returned from Map(). | |
| **/ | |
| VOID | |
| IoMmuFreeBuffer ( | |
| IN EDKII_IOMMU_PPI *IoMmu, | |
| IN UINTN Pages, | |
| IN VOID *HostAddress, | |
| IN VOID *Mapping | |
| ); | |
| /** | |
| Initialize IOMMU. | |
| @param IoMmu Pointer to pointer to IOMMU PPI. | |
| **/ | |
| VOID | |
| IoMmuInit ( | |
| OUT EDKII_IOMMU_PPI **IoMmu | |
| ); | |
| #endif |