TianoCore EDK2 master
Loading...
Searching...
No Matches
SdBlockIoPei.h File Reference
#include <PiPei.h>
#include <Ppi/SdMmcHostController.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/PeiServicesLib.h>
#include <IndustryStandard/Sd.h>
#include "SdHci.h"
#include "SdHcMem.h"

Go to the source code of this file.

Data Structures

struct  _SD_PEIM_HC_SLOT
 
struct  _SD_PEIM_HC_PRIVATE_DATA
 
struct  _SD_TRB
 

Macros

#define SD_PEIM_SIG   SIGNATURE_32 ('S', 'D', 'C', 'P')
 
#define SD_PEIM_SLOT_SIG   SIGNATURE_32 ('S', 'D', 'C', 'S')
 
#define SD_PEIM_MAX_SLOTS   6
 
#define SD_TIMEOUT   MultU64x32((UINT64)(3), 1000000)
 
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS(a)   CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIoPpi, SD_PEIM_SIG)
 
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2(a)   CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, SD_PEIM_SIG)
 
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a)   CR (a, SD_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, SD_PEIM_SIG)
 

Typedefs

typedef struct _SD_PEIM_HC_PRIVATE_DATA SD_PEIM_HC_PRIVATE_DATA
 
typedef struct _SD_PEIM_HC_SLOT SD_PEIM_HC_SLOT
 
typedef struct _SD_TRB SD_TRB
 

Functions

EFI_STATUS EFIAPI SdBlockIoPeimGetDeviceNo (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, OUT UINTN *NumberBlockDevices)
 
EFI_STATUS EFIAPI SdBlockIoPeimGetMediaInfo (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 SdBlockIoPeimReadBlocks (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 SdBlockIoPeimGetDeviceNo2 (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, OUT UINTN *NumberBlockDevices)
 
EFI_STATUS EFIAPI SdBlockIoPeimGetMediaInfo2 (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 SdBlockIoPeimReadBlocks2 (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 SdPeimInitMemPool (IN SD_PEIM_HC_PRIVATE_DATA *Private)
 
EFI_STATUS SdPeimFreeMemPool (IN SD_PEIM_MEM_POOL *Pool)
 
VOID * SdPeimAllocateMem (IN SD_PEIM_MEM_POOL *Pool, IN UINTN Size)
 
VOID SdPeimFreeMem (IN SD_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 SdBlockIoPeimEndOfPei (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi)
 

Detailed Description

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

Definition in file SdBlockIoPei.h.

Macro Definition Documentation

◆ GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS

#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS (   a)    CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIoPpi, SD_PEIM_SIG)

Definition at line 71 of file SdBlockIoPei.h.

◆ GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2

#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (   a)    CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, SD_PEIM_SIG)

Definition at line 72 of file SdBlockIoPei.h.

◆ GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY

#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (   a)    CR (a, SD_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, SD_PEIM_SIG)

Definition at line 73 of file SdBlockIoPei.h.

◆ SD_PEIM_MAX_SLOTS

#define SD_PEIM_MAX_SLOTS   6

Definition at line 39 of file SdBlockIoPei.h.

◆ SD_PEIM_SIG

#define SD_PEIM_SIG   SIGNATURE_32 ('S', 'D', 'C', 'P')

Definition at line 36 of file SdBlockIoPei.h.

◆ SD_PEIM_SLOT_SIG

#define SD_PEIM_SLOT_SIG   SIGNATURE_32 ('S', 'D', 'C', 'S')

Definition at line 37 of file SdBlockIoPei.h.

◆ SD_TIMEOUT

#define SD_TIMEOUT   MultU64x32((UINT64)(3), 1000000)

Definition at line 70 of file SdBlockIoPei.h.

Typedef Documentation

◆ SD_PEIM_HC_PRIVATE_DATA

Definition at line 29 of file SdBlockIoPei.h.

◆ SD_PEIM_HC_SLOT

Definition at line 30 of file SdBlockIoPei.h.

◆ SD_TRB

typedef struct _SD_TRB SD_TRB

Definition at line 31 of file SdBlockIoPei.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.

◆ SdBlockIoPeimEndOfPei()

EFI_STATUS EFIAPI SdBlockIoPeimEndOfPei ( 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 483 of file SdBlockIoPei.c.

◆ SdBlockIoPeimGetDeviceNo()

EFI_STATUS EFIAPI SdBlockIoPeimGetDeviceNo ( 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 111 of file SdBlockIoPei.c.

◆ SdBlockIoPeimGetDeviceNo2()

EFI_STATUS EFIAPI SdBlockIoPeimGetDeviceNo2 ( 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 324 of file SdBlockIoPei.c.

◆ SdBlockIoPeimGetMediaInfo()

EFI_STATUS EFIAPI SdBlockIoPeimGetMediaInfo ( 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 167 of file SdBlockIoPei.c.

◆ SdBlockIoPeimGetMediaInfo2()

EFI_STATUS EFIAPI SdBlockIoPeimGetMediaInfo2 ( 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 381 of file SdBlockIoPei.c.

◆ SdBlockIoPeimReadBlocks()

EFI_STATUS EFIAPI SdBlockIoPeimReadBlocks ( 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 226 of file SdBlockIoPei.c.

◆ SdBlockIoPeimReadBlocks2()

EFI_STATUS EFIAPI SdBlockIoPeimReadBlocks2 ( 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 444 of file SdBlockIoPei.c.

◆ SdPeimAllocateMem()

VOID * SdPeimAllocateMem ( IN SD_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 294 of file SdHcMem.c.

◆ SdPeimFreeMem()

VOID SdPeimFreeMem ( IN SD_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 366 of file SdHcMem.c.

◆ SdPeimFreeMemPool()

EFI_STATUS SdPeimFreeMemPool ( IN SD_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 263 of file SdHcMem.c.

◆ SdPeimInitMemPool()

EFI_STATUS SdPeimInitMemPool ( IN SD_PEIM_HC_PRIVATE_DATA Private)

Initialize the memory management pool for the host controller.

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

Definition at line 223 of file SdHcMem.c.