TianoCore EDK2 master
Loading...
Searching...
No Matches
UfsBlockIoPei.c File Reference
#include "UfsBlockIoPei.h"

Go to the source code of this file.

Functions

EFI_STATUS UfsPeimTestUnitReady (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINTN Lun, OUT VOID *SenseData OPTIONAL, OUT UINT8 *SenseDataLength)
 
EFI_STATUS UfsPeimReadCapacity (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINTN Lun, OUT VOID *DataBuffer, OUT UINT32 *DataLength, OUT VOID *SenseData OPTIONAL, OUT UINT8 *SenseDataLength)
 
EFI_STATUS UfsPeimReadCapacity16 (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINTN Lun, OUT VOID *DataBuffer, OUT UINT32 *DataLength, OUT VOID *SenseData OPTIONAL, OUT UINT8 *SenseDataLength)
 
EFI_STATUS UfsPeimRead10 (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINTN Lun, IN UINTN StartLba, IN UINT32 SectorNum, OUT VOID *DataBuffer, OUT UINT32 *DataLength, OUT VOID *SenseData OPTIONAL, OUT UINT8 *SenseDataLength)
 
EFI_STATUS UfsPeimRead16 (IN UFS_PEIM_HC_PRIVATE_DATA *Private, IN UINTN Lun, IN UINTN StartLba, IN UINT32 SectorNum, OUT VOID *DataBuffer, OUT UINT32 *DataLength, OUT VOID *SenseData OPTIONAL, OUT UINT8 *SenseDataLength)
 
EFI_STATUS UfsPeimParsingSenseKeys (IN EFI_PEI_BLOCK_IO2_MEDIA *Media, IN EFI_SCSI_SENSE_DATA *SenseData, OUT BOOLEAN *NeedRetry)
 
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 EFIAPI UfsEndOfPei (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi)
 
EFI_STATUS UfsFinishDeviceInitialization (IN UFS_PEIM_HC_PRIVATE_DATA *Private)
 
EFI_STATUS EFIAPI InitializeUfsBlockIoPeim (IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices)
 

Variables

UFS_PEIM_HC_PRIVATE_DATA gUfsHcPeimTemplate
 

Detailed Description

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

Definition in file UfsBlockIoPei.c.

Function Documentation

◆ InitializeUfsBlockIoPeim()

EFI_STATUS EFIAPI InitializeUfsBlockIoPeim ( IN EFI_PEI_FILE_HANDLE  FileHandle,
IN CONST EFI_PEI_SERVICES **  PeiServices 
)

The user code starts with this function.

Parameters
FileHandleHandle of the file being invoked.
PeiServicesDescribes the list of possible PEI Services.
Return values
EFI_SUCCESSThe driver is successfully initialized.
OthersCan't initialize the driver.

Definition at line 1080 of file UfsBlockIoPei.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.

◆ 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.

◆ UfsFinishDeviceInitialization()

EFI_STATUS UfsFinishDeviceInitialization ( IN UFS_PEIM_HC_PRIVATE_DATA Private)

Finishes device initialization by setting fDeviceInit flag and waiting until device responds by clearing it.

Parameters
[in]PrivatePointer to the UFS_PEIM_HC_PRIVATE_DATA.
Return values
EFI_SUCCESSThe operation succeeds.
OthersThe operation fails.

Definition at line 1030 of file UfsBlockIoPei.c.

◆ UfsPeimParsingSenseKeys()

EFI_STATUS UfsPeimParsingSenseKeys ( IN EFI_PEI_BLOCK_IO2_MEDIA Media,
IN EFI_SCSI_SENSE_DATA SenseData,
OUT BOOLEAN *  NeedRetry 
)

Parsing Sense Keys from sense data.

Parameters
MediaThe pointer of EFI_PEI_BLOCK_IO_MEDIA
SenseDataThe pointer of EFI_SCSI_SENSE_DATA
NeedRetryThe pointer of action which indicates what is need to retry
Return values
EFI_DEVICE_ERRORIndicates that error occurs
EFI_SUCCESSSuccessfully to complete the parsing

Definition at line 430 of file UfsBlockIoPei.c.

◆ UfsPeimRead10()

EFI_STATUS UfsPeimRead10 ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINTN  Lun,
IN UINTN  StartLba,
IN UINT32  SectorNum,
OUT VOID *  DataBuffer,
OUT UINT32 *  DataLength,
OUT VOID *SenseData  OPTIONAL,
OUT UINT8 *  SenseDataLength 
)

Execute READ (10) SCSI command on a specific UFS device.

Parameters
[in]PrivateA pointer to UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]LunThe lun on which the SCSI cmd executed.
[in]StartLbaThe start LBA.
[in]SectorNumThe sector number to be read.
[out]DataBufferA pointer to data buffer.
[out]DataLengthThe length of output data.
[out]SenseDataA pointer to output sense data.
[out]SenseDataLengthThe length of output sense data.
Return values
EFI_SUCCESSThe command executed successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to send SCSI Request Packet.
EFI_TIMEOUTA timeout occurred while waiting for the SCSI Request Packet to execute.

Definition at line 312 of file UfsBlockIoPei.c.

◆ UfsPeimRead16()

EFI_STATUS UfsPeimRead16 ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINTN  Lun,
IN UINTN  StartLba,
IN UINT32  SectorNum,
OUT VOID *  DataBuffer,
OUT UINT32 *  DataLength,
OUT VOID *SenseData  OPTIONAL,
OUT UINT8 *  SenseDataLength 
)

Execute READ (16) SCSI command on a specific UFS device.

Parameters
[in]PrivateA pointer to UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]LunThe lun on which the SCSI cmd executed.
[in]StartLbaThe start LBA.
[in]SectorNumThe sector number to be read.
[out]DataBufferA pointer to data buffer.
[out]DataLengthThe length of output data.
[out]SenseDataA pointer to output sense data.
[out]SenseDataLengthThe length of output sense data.
Return values
EFI_SUCCESSThe command executed successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to send SCSI Request Packet.
EFI_TIMEOUTA timeout occurred while waiting for the SCSI Request Packet to execute.

Definition at line 374 of file UfsBlockIoPei.c.

◆ UfsPeimReadCapacity()

EFI_STATUS UfsPeimReadCapacity ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINTN  Lun,
OUT VOID *  DataBuffer,
OUT UINT32 *  DataLength,
OUT VOID *SenseData  OPTIONAL,
OUT UINT8 *  SenseDataLength 
)

Execute READ CAPACITY(10) SCSI command on a specific UFS device.

Parameters
[in]PrivateA pointer to UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]LunThe lun on which the SCSI cmd executed.
[out]DataBufferA pointer to READ_CAPACITY data buffer.
[out]DataLengthThe length of output READ_CAPACITY data.
[out]SenseDataA pointer to output sense data.
[out]SenseDataLengthThe length of output sense data.
Return values
EFI_SUCCESSThe command executed successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to send SCSI Request Packet.
EFI_TIMEOUTA timeout occurred while waiting for the SCSI Request Packet to execute.

Definition at line 196 of file UfsBlockIoPei.c.

◆ UfsPeimReadCapacity16()

EFI_STATUS UfsPeimReadCapacity16 ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINTN  Lun,
OUT VOID *  DataBuffer,
OUT UINT32 *  DataLength,
OUT VOID *SenseData  OPTIONAL,
OUT UINT8 *  SenseDataLength 
)

Execute READ CAPACITY(16) SCSI command on a specific UFS device.

Parameters
[in]PrivateA pointer to UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]LunThe lun on which the SCSI cmd executed.
[out]DataBufferA pointer to READ_CAPACITY data buffer.
[out]DataLengthThe length of output READ_CAPACITY data.
[out]SenseDataA pointer to output sense data.
[out]SenseDataLengthThe length of output sense data.
Return values
EFI_SUCCESSThe command executed successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to send SCSI Request Packet.
EFI_TIMEOUTA timeout occurred while waiting for the SCSI Request Packet to execute.

Definition at line 252 of file UfsBlockIoPei.c.

◆ UfsPeimTestUnitReady()

EFI_STATUS UfsPeimTestUnitReady ( IN UFS_PEIM_HC_PRIVATE_DATA Private,
IN UINTN  Lun,
OUT VOID *SenseData  OPTIONAL,
OUT UINT8 *  SenseDataLength 
)

Execute TEST UNITY READY SCSI command on a specific UFS device.

Parameters
[in]PrivateA pointer to UFS_PEIM_HC_PRIVATE_DATA data structure.
[in]LunThe lun on which the SCSI cmd executed.
[out]SenseDataA pointer to output sense data.
[out]SenseDataLengthThe length of output sense data.
Return values
EFI_SUCCESSThe command executed successfully.
EFI_DEVICE_ERRORA device error occurred while attempting to send SCSI Request Packet.
EFI_TIMEOUTA timeout occurred while waiting for the SCSI Request Packet to execute.

Definition at line 148 of file UfsBlockIoPei.c.

Variable Documentation

◆ gUfsHcPeimTemplate

UFS_PEIM_HC_PRIVATE_DATA gUfsHcPeimTemplate

Definition at line 13 of file UfsBlockIoPei.c.