TianoCore EDK2 master
Loading...
Searching...
No Matches
UfsBlockIoPei.h File Reference
#include <PiPei.h>
#include <Ppi/UfsHostController.h>
#include <Ppi/UfsHostControllerPlatformPpi.h>
#include <Ppi/BlockIo.h>
#include <Ppi/BlockIo2.h>
#include <Ppi/IoMmu.h>
#include <Ppi/EndOfPeiPhase.h>
#include <Library/DebugLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/IoLib.h>
#include <Library/TimerLib.h>
#include <Library/PcdLib.h>
#include <Library/PeiServicesLib.h>
#include <IndustryStandard/Scsi.h>
#include "UfsHci.h"
#include "UfsHcMem.h"

Go to the source code of this file.

Data Structures

struct  UFS_PEIM_EXPOSED_LUNS
 
struct  UFS_SCSI_REQUEST_PACKET
 
struct  _UFS_PEIM_HC_PRIVATE_DATA
 
struct  _UFS_DEVICE_MANAGEMENT_REQUEST_PACKET
 

Macros

#define UFS_PEIM_HC_SIG   SIGNATURE_32 ('U', 'F', 'S', 'H')
 
#define UFS_PEIM_MAX_LUNS   8
 
#define UFS_TIMEOUT   MultU64x32((UINT64)(3), 10000000)
 
#define ROUNDUP8(x)   (((x) % 8 == 0) ? (x) : ((x) / 8 + 1) * 8)
 
#define GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS(a)   CR (a, UFS_PEIM_HC_PRIVATE_DATA, BlkIoPpi, UFS_PEIM_HC_SIG)
 
#define GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS2(a)   CR (a, UFS_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, UFS_PEIM_HC_SIG)
 
#define GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a)   CR (a, UFS_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, UFS_PEIM_HC_SIG)
 
#define UFS_SCSI_OP_LENGTH_SIX   0x6
 
#define UFS_SCSI_OP_LENGTH_TEN   0xa
 
#define UFS_SCSI_OP_LENGTH_SIXTEEN   0x10
 

Typedefs

typedef struct _UFS_PEIM_HC_PRIVATE_DATA UFS_PEIM_HC_PRIVATE_DATA
 
typedef struct _UFS_DEVICE_MANAGEMENT_REQUEST_PACKET UFS_DEVICE_MANAGEMENT_REQUEST_PACKET
 

Functions

EFI_STATUS UfsRwAttributes (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN BOOLEAN Read, IN UINT8 AttrId, IN UINT8 Index, IN UINT8 Selector, IN OUT UINT32 *Attributes)
 
EFI_STATUS UfsExecScsiCmds (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINT8 Lun, IN OUT UFS_SCSI_REQUEST_PACKET *Packet)
 
EFI_STATUS UfsControllerInit (IN EDKII_UFS_HC_PLATFORM_PPI *UfsHcPlatformPpi, IN UFS_PEIM_HC_PRIVATE_DATA *Private)
 
EFI_STATUS UfsControllerStop (IN UFS_PEIM_HC_PRIVATE_DATA *Private)
 
EFI_STATUS UfsSetFlag (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINT8 FlagId)
 
EFI_STATUS UfsReadFlag (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINT8 FlagId, OUT UINT8 *Value)
 
EFI_STATUS UfsRwDeviceDesc (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN BOOLEAN Read, IN UINT8 DescId, IN UINT8 Index, IN UINT8 Selector, IN OUT VOID *Descriptor, IN UINT32 DescSize)
 
EFI_STATUS UfsExecNopCmds (IN UFS_PEIM_HC_PRIVATE_DATA *Private)
 
EFI_STATUS EFIAPI UfsBlockIoPeimGetDeviceNo (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, OUT UINTN *NumberBlockDevices)
 
EFI_STATUS EFIAPI UfsBlockIoPeimGetMediaInfo (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, IN UINTN DeviceIndex, OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo)
 
EFI_STATUS EFIAPI UfsBlockIoPeimReadBlocks (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, IN UINTN DeviceIndex, IN EFI_PEI_LBA StartLBA, IN UINTN BufferSize, OUT VOID *Buffer)
 
EFI_STATUS EFIAPI UfsBlockIoPeimGetDeviceNo2 (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, OUT UINTN *NumberBlockDevices)
 
EFI_STATUS EFIAPI UfsBlockIoPeimGetMediaInfo2 (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, IN UINTN DeviceIndex, OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo)
 
EFI_STATUS EFIAPI UfsBlockIoPeimReadBlocks2 (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, IN UINTN DeviceIndex, IN EFI_PEI_LBA StartLBA, IN UINTN BufferSize, OUT VOID *Buffer)
 
EFI_STATUS UfsPeimInitMemPool (IN UFS_PEIM_HC_PRIVATE_DATA *Private)
 
EFI_STATUS UfsPeimFreeMemPool (IN UFS_PEIM_MEM_POOL *Pool)
 
VOID * UfsPeimAllocateMem (IN UFS_PEIM_MEM_POOL *Pool, IN UINTN Size)
 
VOID UfsPeimFreeMem (IN UFS_PEIM_MEM_POOL *Pool, IN VOID *Mem, IN UINTN Size)
 
VOID IoMmuInit (VOID)
 
EFI_STATUS IoMmuMap (IN EDKII_IOMMU_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping)
 
EFI_STATUS IoMmuUnmap (IN VOID *Mapping)
 
EFI_STATUS IoMmuAllocateBuffer (IN UINTN Pages, OUT VOID **HostAddress, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping)
 
EFI_STATUS IoMmuFreeBuffer (IN UINTN Pages, IN VOID *HostAddress, IN VOID *Mapping)
 
EFI_STATUS EFIAPI UfsEndOfPei (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi)
 

Detailed Description

Copyright (c) 2014 - 2024, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent

Definition in file UfsBlockIoPei.h.

Macro Definition Documentation

◆ GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS

#define GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS (   a)    CR (a, UFS_PEIM_HC_PRIVATE_DATA, BlkIoPpi, UFS_PEIM_HC_SIG)

Definition at line 138 of file UfsBlockIoPei.h.

◆ GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS2

#define GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (   a)    CR (a, UFS_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, UFS_PEIM_HC_SIG)

Definition at line 139 of file UfsBlockIoPei.h.

◆ GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY

#define GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (   a)    CR (a, UFS_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, UFS_PEIM_HC_SIG)

Definition at line 140 of file UfsBlockIoPei.h.

◆ ROUNDUP8

#define ROUNDUP8 (   x)    (((x) % 8 == 0) ? (x) : ((x) / 8 + 1) * 8)

Definition at line 136 of file UfsBlockIoPei.h.

◆ UFS_PEIM_HC_SIG

#define UFS_PEIM_HC_SIG   SIGNATURE_32 ('U', 'F', 'S', 'H')

Definition at line 34 of file UfsBlockIoPei.h.

◆ UFS_PEIM_MAX_LUNS

#define UFS_PEIM_MAX_LUNS   8

Definition at line 36 of file UfsBlockIoPei.h.

◆ UFS_SCSI_OP_LENGTH_SIX

#define UFS_SCSI_OP_LENGTH_SIX   0x6

Definition at line 142 of file UfsBlockIoPei.h.

◆ UFS_SCSI_OP_LENGTH_SIXTEEN

#define UFS_SCSI_OP_LENGTH_SIXTEEN   0x10

Definition at line 144 of file UfsBlockIoPei.h.

◆ UFS_SCSI_OP_LENGTH_TEN

#define UFS_SCSI_OP_LENGTH_TEN   0xa

Definition at line 143 of file UfsBlockIoPei.h.

◆ UFS_TIMEOUT

#define UFS_TIMEOUT   MultU64x32((UINT64)(3), 10000000)

Definition at line 134 of file UfsBlockIoPei.h.

Function Documentation

◆ IoMmuAllocateBuffer()

EFI_STATUS IoMmuAllocateBuffer ( IN UINTN  Pages,
OUT VOID **  HostAddress,
OUT EFI_PHYSICAL_ADDRESS DeviceAddress,
OUT VOID **  Mapping 
)

Allocates pages that are suitable for an OperationBusMasterCommonBuffer or OperationBusMasterCommonBuffer64 mapping.

Parameters
PagesThe number of pages to allocate.
HostAddressA pointer to store the base system memory address of the allocated range.
DeviceAddressThe resulting map address for the bus master PCI controller to use to access the hosts HostAddress.
MappingA resulting value to pass to Unmap().
Return values
EFI_SUCCESSThe requested memory pages were allocated.
EFI_UNSUPPORTEDAttributes is unsupported. The only legal attribute bits are MEMORY_WRITE_COMBINE and MEMORY_CACHED.
EFI_INVALID_PARAMETEROne or more parameters are invalid.
EFI_OUT_OF_RESOURCESThe memory pages could not be allocated.

Definition at line 170 of file DmaMem.c.

◆ IoMmuFreeBuffer()

EFI_STATUS IoMmuFreeBuffer ( IN UINTN  Pages,
IN VOID *  HostAddress,
IN VOID *  Mapping 
)

Frees memory that was allocated with AllocateBuffer().

Parameters
PagesThe number of pages to free.
HostAddressThe base system memory address of the allocated range.
MappingThe mapping value returned from Map().
Return values
EFI_SUCCESSThe requested memory pages were freed.
EFI_INVALID_PARAMETERThe memory range specified by HostAddress and Pages was not allocated with AllocateBuffer().

Definition at line 251 of file DmaMem.c.

◆ IoMmuInit()

VOID IoMmuInit ( VOID  )

Initialize IOMMU.

Definition at line 375 of file DmaMem.c.

◆ IoMmuMap()

EFI_STATUS IoMmuMap ( IN EDKII_IOMMU_OPERATION  Operation,
IN VOID *  HostAddress,
IN OUT UINTN NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS DeviceAddress,
OUT VOID **  Mapping 
)

Provides the controller-specific addresses required to access system memory from a DMA bus master.

Parameters
OperationIndicates if the bus master is going to read or write to system memory.
HostAddressThe system memory address to map to the PCI controller.
NumberOfBytesOn input the number of bytes to map. On output the number of bytes that were mapped.
DeviceAddressThe resulting map address for the bus master PCI controller to use to access the hosts HostAddress.
MappingA resulting value to pass to Unmap().
Return values
EFI_SUCCESSThe range was mapped for the returned NumberOfBytes.
EFI_UNSUPPORTEDThe HostAddress cannot be mapped as a common buffer.
EFI_INVALID_PARAMETEROne or more parameters are invalid.
EFI_OUT_OF_RESOURCESThe request could not be completed due to a lack of resources.
EFI_DEVICE_ERRORThe system hardware could not map the requested address.

Definition at line 60 of file DmaMem.c.

◆ IoMmuUnmap()

EFI_STATUS IoMmuUnmap ( IN VOID *  Mapping)

Completes the Map() operation and releases any corresponding resources.

Parameters
MappingThe mapping value returned from Map().
Return values
EFI_SUCCESSThe range was unmapped.
EFI_INVALID_PARAMETERMapping is not a value that was returned by Map().
EFI_DEVICE_ERRORThe data was not committed to the target system memory.

Definition at line 132 of file DmaMem.c.

◆ UfsBlockIoPeimGetDeviceNo()

EFI_STATUS EFIAPI UfsBlockIoPeimGetDeviceNo ( IN EFI_PEI_SERVICES **  PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI This,
OUT UINTN NumberBlockDevices 
)

Gets the count of block I/O devices that one specific block driver detects.

This function is used for getting the count of block I/O devices that one specific block driver detects. To the PEI ATAPI driver, it returns the number of all the detected ATAPI devices it detects during the enumeration process. To the PEI legacy floppy driver, it returns the number of all the legacy devices it finds during its enumeration process. If no device is detected, then the function will return zero.

Parameters
[in]PeiServicesGeneral-purpose services that are available to every PEIM.
[in]ThisIndicates the EFI_PEI_RECOVERY_BLOCK_IO_PPI instance.
[out]NumberBlockDevicesThe number of block I/O devices discovered.
Return values
EFI_SUCCESSThe operation performed successfully.

Definition at line 511 of file UfsBlockIoPei.c.

◆ UfsBlockIoPeimGetDeviceNo2()

EFI_STATUS EFIAPI UfsBlockIoPeimGetDeviceNo2 ( IN EFI_PEI_SERVICES **  PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI This,
OUT UINTN NumberBlockDevices 
)

Gets the count of block I/O devices that one specific block driver detects.

This function is used for getting the count of block I/O devices that one specific block driver detects. To the PEI ATAPI driver, it returns the number of all the detected ATAPI devices it detects during the enumeration process. To the PEI legacy floppy driver, it returns the number of all the legacy devices it finds during its enumeration process. If no device is detected, then the function will return zero.

Parameters
[in]PeiServicesGeneral-purpose services that are available to every PEIM.
[in]ThisIndicates the EFI_PEI_RECOVERY_BLOCK_IO2_PPI instance.
[out]NumberBlockDevicesThe number of block I/O devices discovered.
Return values
EFI_SUCCESSThe operation performed successfully.

Definition at line 822 of file UfsBlockIoPei.c.

◆ UfsBlockIoPeimGetMediaInfo()

EFI_STATUS EFIAPI UfsBlockIoPeimGetMediaInfo ( IN EFI_PEI_SERVICES **  PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI This,
IN UINTN  DeviceIndex,
OUT EFI_PEI_BLOCK_IO_MEDIA MediaInfo 
)

Gets a block device's media information.

This function will provide the caller with the specified block device's media information. If the media changes, calling this function will update the media information accordingly.

Parameters
[in]PeiServicesGeneral-purpose services that are available to every PEIM
[in]ThisIndicates the EFI_PEI_RECOVERY_BLOCK_IO_PPI instance.
[in]DeviceIndexSpecifies the block device to which the function wants to talk. Because the driver that implements Block I/O PPIs will manage multiple block devices, the PPIs that want to talk to a single device must specify the device index that was assigned during the enumeration process. This index is a number from one to NumberBlockDevices.
[out]MediaInfoThe media information of the specified block media. The caller is responsible for the ownership of this data structure.
Note:
The MediaInfo structure describes an enumeration of possible block device types. This enumeration exists because no device paths are actually passed across interfaces that describe the type or class of hardware that is publishing the block I/O interface. This enumeration will allow for policy decisions in the Recovery PEIM, such as "Try to recover from legacy floppy first, LS-120 second, CD-ROM third." If there are multiple partitions abstracted by a given device type, they should be reported in ascending order; this order also applies to nested partitions, such as legacy MBR, where the outermost partitions would have precedence in the reporting order. The same logic applies to systems such as IDE that have precedence relationships like "Master/Slave" or "Primary/Secondary". The master device should be reported first, the slave second.
Return values
EFI_SUCCESSMedia information about the specified block device was obtained successfully.
EFI_DEVICE_ERRORCannot get the media information due to a hardware error.

Definition at line 569 of file UfsBlockIoPei.c.

◆ UfsBlockIoPeimGetMediaInfo2()

EFI_STATUS EFIAPI UfsBlockIoPeimGetMediaInfo2 ( IN EFI_PEI_SERVICES **  PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI This,
IN UINTN  DeviceIndex,
OUT EFI_PEI_BLOCK_IO2_MEDIA MediaInfo 
)

Gets a block device's media information.

This function will provide the caller with the specified block device's media information. If the media changes, calling this function will update the media information accordingly.

Parameters
[in]PeiServicesGeneral-purpose services that are available to every PEIM
[in]ThisIndicates the EFI_PEI_RECOVERY_BLOCK_IO2_PPI instance.
[in]DeviceIndexSpecifies the block device to which the function wants to talk. Because the driver that implements Block I/O PPIs will manage multiple block devices, the PPIs that want to talk to a single device must specify the device index that was assigned during the enumeration process. This index is a number from one to NumberBlockDevices.
[out]MediaInfoThe media information of the specified block media. The caller is responsible for the ownership of this data structure.
Note:
The MediaInfo structure describes an enumeration of possible block device types. This enumeration exists because no device paths are actually passed across interfaces that describe the type or class of hardware that is publishing the block I/O interface. This enumeration will allow for policy decisions in the Recovery PEIM, such as "Try to recover from legacy floppy first, LS-120 second, CD-ROM third." If there are multiple partitions abstracted by a given device type, they should be reported in ascending order; this order also applies to nested partitions, such as legacy MBR, where the outermost partitions would have precedence in the reporting order. The same logic applies to systems such as IDE that have precedence relationships like "Master/Slave" or "Primary/Secondary". The master device should be reported first, the slave second.
Return values
EFI_SUCCESSMedia information about the specified block device was obtained successfully.
EFI_DEVICE_ERRORCannot get the media information due to a hardware error.

Definition at line 880 of file UfsBlockIoPei.c.

◆ UfsBlockIoPeimReadBlocks()

EFI_STATUS EFIAPI UfsBlockIoPeimReadBlocks ( IN EFI_PEI_SERVICES **  PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI This,
IN UINTN  DeviceIndex,
IN EFI_PEI_LBA  StartLBA,
IN UINTN  BufferSize,
OUT VOID *  Buffer 
)

Reads the requested number of blocks from the specified block device.

The function reads the requested number of blocks from the device. All the blocks are read, or an error is returned. If there is no media in the device, the function returns EFI_NO_MEDIA.

Parameters
[in]PeiServicesGeneral-purpose services that are available to every PEIM.
[in]ThisIndicates the EFI_PEI_RECOVERY_BLOCK_IO_PPI instance.
[in]DeviceIndexSpecifies the block device to which the function wants to talk. Because the driver that implements Block I/O PPIs will manage multiple block devices, PPIs that want to talk to a single device must specify the device index that was assigned during the enumeration process. This index is a number from one to NumberBlockDevices.
[in]StartLBAThe starting logical block address (LBA) to read from on the device
[in]BufferSizeThe size of the Buffer in bytes. This number must be a multiple of the intrinsic block size of the device.
[out]BufferA pointer to the destination buffer for the data. The caller is responsible for the ownership of the buffer.
Return values
EFI_SUCCESSThe data was read correctly from the device.
EFI_DEVICE_ERRORThe device reported an error while attempting to perform the read operation.
EFI_INVALID_PARAMETERThe read request contains LBAs that are not valid, or the buffer is not properly aligned.
EFI_NO_MEDIAThere is no media in the device.
EFI_BAD_BUFFER_SIZEThe BufferSize parameter is not a multiple of the intrinsic block size of the device.

Definition at line 695 of file UfsBlockIoPei.c.

◆ UfsBlockIoPeimReadBlocks2()

EFI_STATUS EFIAPI UfsBlockIoPeimReadBlocks2 ( IN EFI_PEI_SERVICES **  PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI This,
IN UINTN  DeviceIndex,
IN EFI_PEI_LBA  StartLBA,
IN UINTN  BufferSize,
OUT VOID *  Buffer 
)

Reads the requested number of blocks from the specified block device.

The function reads the requested number of blocks from the device. All the blocks are read, or an error is returned. If there is no media in the device, the function returns EFI_NO_MEDIA.

Parameters
[in]PeiServicesGeneral-purpose services that are available to every PEIM.
[in]ThisIndicates the EFI_PEI_RECOVERY_BLOCK_IO2_PPI instance.
[in]DeviceIndexSpecifies the block device to which the function wants to talk. Because the driver that implements Block I/O PPIs will manage multiple block devices, PPIs that want to talk to a single device must specify the device index that was assigned during the enumeration process. This index is a number from one to NumberBlockDevices.
[in]StartLBAThe starting logical block address (LBA) to read from on the device
[in]BufferSizeThe size of the Buffer in bytes. This number must be a multiple of the intrinsic block size of the device.
[out]BufferA pointer to the destination buffer for the data. The caller is responsible for the ownership of the buffer.
Return values
EFI_SUCCESSThe data was read correctly from the device.
EFI_DEVICE_ERRORThe device reported an error while attempting to perform the read operation.
EFI_INVALID_PARAMETERThe read request contains LBAs that are not valid, or the buffer is not properly aligned.
EFI_NO_MEDIAThere is no media in the device.
EFI_BAD_BUFFER_SIZEThe BufferSize parameter is not a multiple of the intrinsic block size of the device.

Definition at line 945 of file UfsBlockIoPei.c.

◆ UfsControllerInit()

EFI_STATUS UfsControllerInit ( IN EDKII_UFS_HC_PLATFORM_PPI UfsHcPlatformPpi,
IN UFS_PEIM_HC_PRIVATE_DATA Private 
)

Initialize the UFS host controller.

Parameters
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
Return values
EFI_SUCCESSThe Ufs Host Controller is initialized successfully.
OthersA device error occurred while initializing the controller.

Initialize the UFS host controller.

Parameters
[in]UfsHcPlatformPpiThe pointer to the EDKII_UFS_HC_PLATFORM_PPI data structure. // APTIOV_OVERRIDE
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
Return values
EFI_SUCCESSThe Ufs Host Controller is initialized successfully.
OthersA device error occurred while initializing the controller.

Definition at line 1726 of file UfsHci.c.

◆ UfsControllerStop()

EFI_STATUS UfsControllerStop ( IN UFS_PEIM_HC_PRIVATE_DATA Private)

Stop the UFS host controller.

Parameters
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
Return values
EFI_SUCCESSThe Ufs Host Controller is stopped successfully.
OthersA device error occurred while stopping the controller.

Definition at line 1781 of file UfsHci.c.

◆ UfsEndOfPei()

EFI_STATUS EFIAPI UfsEndOfPei ( IN EFI_PEI_SERVICES **  PeiServices,
IN EFI_PEI_NOTIFY_DESCRIPTOR NotifyDescriptor,
IN VOID *  Ppi 
)

One notified function to cleanup the allocated DMA buffers at the end of PEI.

Parameters
[in]PeiServicesPointer to PEI Services Table.
[in]NotifyDescriptorPointer to the descriptor for the Notification event that caused this function to execute.
[in]PpiPointer to the PPI data associated with this function.
Return values
EFI_SUCCESSThe function completes successfully

Definition at line 984 of file UfsBlockIoPei.c.

◆ UfsExecNopCmds()

EFI_STATUS UfsExecNopCmds ( IN UFS_PEIM_HC_PRIVATE_DATA Private)

Sends NOP IN cmd to a UFS device for initialization process request. For more details, please refer to UFS 2.0 spec Figure 13.3.

Parameters
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
Return values
EFI_SUCCESSThe NOP IN command was sent by the host. The NOP OUT response was received successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to execute NOP IN command.
EFI_OUT_OF_RESOURCESThe resource for transfer is not available.
EFI_TIMEOUTA timeout occurred while waiting for the NOP IN command to execute.

Definition at line 1171 of file UfsHci.c.

◆ UfsExecScsiCmds()

EFI_STATUS UfsExecScsiCmds ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINT8  Lun,
IN OUT UFS_SCSI_REQUEST_PACKET Packet 
)

Sends a UFS-supported SCSI Request Packet to a UFS device that is attached to the UFS host controller.

Parameters
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]LunThe LUN of the UFS device to send the SCSI Request Packet.
[in,out]PacketA pointer to the SCSI Request Packet to send to a specified Lun of the UFS device.
Return values
EFI_SUCCESSThe SCSI Request Packet was sent by the host. For bi-directional commands, InTransferLength bytes were transferred from InDataBuffer. For write and bi-directional commands, OutTransferLength bytes were transferred by OutDataBuffer.
EFI_DEVICE_ERRORA device error occurred while attempting to send the SCSI Request Packet.
EFI_OUT_OF_RESOURCESThe resource for transfer is not available.
EFI_TIMEOUTA timeout occurred while waiting for the SCSI Request Packet to execute.

Definition at line 1251 of file UfsHci.c.

◆ UfsPeimAllocateMem()

VOID * UfsPeimAllocateMem ( IN UFS_PEIM_MEM_POOL Pool,
IN UINTN  Size 
)

Allocate some memory from the host controller's memory pool which can be used to communicate with host controller.

Parameters
PoolThe host controller's memory pool.
SizeSize of the memory to allocate.
Returns
The allocated memory or NULL.

Definition at line 295 of file UfsHcMem.c.

◆ UfsPeimFreeMem()

VOID UfsPeimFreeMem ( IN UFS_PEIM_MEM_POOL Pool,
IN VOID *  Mem,
IN UINTN  Size 
)

Free the allocated memory back to the memory pool.

Parameters
PoolThe memory pool of the host controller.
MemThe memory to free.
SizeThe size of the memory to free.

Definition at line 367 of file UfsHcMem.c.

◆ UfsPeimFreeMemPool()

EFI_STATUS UfsPeimFreeMemPool ( IN UFS_PEIM_MEM_POOL Pool)

Release the memory management pool.

Parameters
PoolThe memory pool to free.
Return values
EFI_DEVICE_ERRORFail to free the memory pool.
EFI_SUCCESSThe memory pool is freed.

Definition at line 264 of file UfsHcMem.c.

◆ UfsPeimInitMemPool()

EFI_STATUS UfsPeimInitMemPool ( IN UFS_PEIM_HC_PRIVATE_DATA Private)

Initialize the memory management pool for the host controller.

Parameters
PrivateThe Ufs Peim driver private data.
Return values
EFI_SUCCESSThe memory pool is initialized.
OthersFail to init the memory pool.

Definition at line 224 of file UfsHcMem.c.

◆ UfsReadFlag()

EFI_STATUS UfsReadFlag ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINT8  FlagId,
OUT UINT8 *  Value 
)

Read specified flag from a UFS device.

Parameters
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]FlagIdThe ID of flag to be read.
[out]ValueThe flag's value.
Return values
EFI_SUCCESSThe flag was read successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to read the flag.
EFI_TIMEOUTA timeout occurred while waiting for the completion of reading the flag.

Definition at line 1144 of file UfsHci.c.

◆ UfsRwAttributes()

EFI_STATUS UfsRwAttributes ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN BOOLEAN  Read,
IN UINT8  AttrId,
IN UINT8  Index,
IN UINT8  Selector,
IN OUT UINT32 *  Attributes 
)

Read or write specified attribute of a UFS device.

Parameters
[in]PrivateThe pointer to the UFS_PASS_THRU_PRIVATE_DATA data structure.
[in]ReadThe boolean variable to show r/w direction.
[in]AttrIdThe ID of Attribute.
[in]IndexThe Index of Attribute.
[in]SelectorThe Selector of Attribute.
[in,out]AttributesThe value of Attribute to be read or written.
Return values
EFI_SUCCESSThe Attribute was read/written successfully.
EFI_INVALID_PARAMETERAttrId, Index and Selector are invalid combination to point to a type of UFS device descriptor.
EFI_DEVICE_ERRORA device error occurred while attempting to r/w the Attribute.
EFI_TIMEOUTA timeout occurred while waiting for the completion of r/w the Attribute.

Definition at line 1014 of file UfsHci.c.

◆ UfsRwDeviceDesc()

EFI_STATUS UfsRwDeviceDesc ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN BOOLEAN  Read,
IN UINT8  DescId,
IN UINT8  Index,
IN UINT8  Selector,
IN OUT VOID *  Descriptor,
IN UINT32  DescSize 
)

Read or write specified device descriptor of a UFS device.

Parameters
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]ReadThe boolean variable to show r/w direction.
[in]DescIdThe ID of device descriptor.
[in]IndexThe Index of device descriptor.
[in]SelectorThe Selector of device descriptor.
[in,out]DescriptorThe buffer of device descriptor to be read or written.
[in]DescSizeThe size of device descriptor buffer.
Return values
EFI_SUCCESSThe device descriptor was read/written successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to r/w the device descriptor.
EFI_TIMEOUTA timeout occurred while waiting for the completion of r/w the device descriptor.

Definition at line 960 of file UfsHci.c.

◆ UfsSetFlag()

EFI_STATUS UfsSetFlag ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINT8  FlagId 
)

Set specified flag to 1 on a UFS device.

Parameters
[in]PrivateThe pointer to the UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]FlagIdThe ID of flag to be set.
Return values
EFI_SUCCESSThe flag was set successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to set the flag.
EFI_TIMEOUTA timeout occurred while waiting for the completion of setting the flag.

Definition at line 1117 of file UfsHci.c.