TianoCore EDK2 master
Loading...
Searching...
No Matches
EmmcBlockIoPei.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/Emmc.h>
#include "EmmcHci.h"
#include "EmmcHcMem.h"

Go to the source code of this file.

Data Structures

struct  _EMMC_PEIM_HC_SLOT
 
struct  _EMMC_PEIM_HC_PRIVATE_DATA
 
struct  _EMMC_TRB
 

Macros

#define EMMC_PEIM_SIG   SIGNATURE_32 ('E', 'M', 'C', 'P')
 
#define EMMC_PEIM_SLOT_SIG   SIGNATURE_32 ('E', 'M', 'C', 'S')
 
#define EMMC_PEIM_MAX_SLOTS   6
 
#define EMMC_PEIM_MAX_PARTITIONS   8
 
#define EMMC_TIMEOUT   MultU64x32((UINT64)(3), 1000000)
 
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS(a)   CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIoPpi, EMMC_PEIM_SIG)
 
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2(a)   CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, EMMC_PEIM_SIG)
 
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a)   CR (a, EMMC_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, EMMC_PEIM_SIG)
 

Typedefs

typedef struct _EMMC_PEIM_HC_PRIVATE_DATA EMMC_PEIM_HC_PRIVATE_DATA
 
typedef struct _EMMC_PEIM_HC_SLOT EMMC_PEIM_HC_SLOT
 
typedef struct _EMMC_TRB EMMC_TRB
 

Functions

EFI_STATUS EFIAPI EmmcBlockIoPeimGetDeviceNo (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, OUT UINTN *NumberBlockDevices)
 
EFI_STATUS EFIAPI EmmcBlockIoPeimGetMediaInfo (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 EmmcBlockIoPeimReadBlocks (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 EmmcBlockIoPeimGetDeviceNo2 (IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, OUT UINTN *NumberBlockDevices)
 
EFI_STATUS EFIAPI EmmcBlockIoPeimGetMediaInfo2 (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 EmmcBlockIoPeimReadBlocks2 (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 EmmcPeimInitMemPool (IN EMMC_PEIM_HC_PRIVATE_DATA *Private)
 
EFI_STATUS EmmcPeimFreeMemPool (IN EMMC_PEIM_MEM_POOL *Pool)
 
VOID * EmmcPeimAllocateMem (IN EMMC_PEIM_MEM_POOL *Pool, IN UINTN Size)
 
VOID EmmcPeimFreeMem (IN EMMC_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 EmmcBlockIoPeimEndOfPei (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 EmmcBlockIoPei.h.

Macro Definition Documentation

◆ EMMC_PEIM_MAX_PARTITIONS

#define EMMC_PEIM_MAX_PARTITIONS   8

Definition at line 40 of file EmmcBlockIoPei.h.

◆ EMMC_PEIM_MAX_SLOTS

#define EMMC_PEIM_MAX_SLOTS   6

Definition at line 39 of file EmmcBlockIoPei.h.

◆ EMMC_PEIM_SIG

#define EMMC_PEIM_SIG   SIGNATURE_32 ('E', 'M', 'C', 'P')

Definition at line 36 of file EmmcBlockIoPei.h.

◆ EMMC_PEIM_SLOT_SIG

#define EMMC_PEIM_SLOT_SIG   SIGNATURE_32 ('E', 'M', 'C', 'S')

Definition at line 37 of file EmmcBlockIoPei.h.

◆ EMMC_TIMEOUT

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

Definition at line 74 of file EmmcBlockIoPei.h.

◆ GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS

#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS (   a)    CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIoPpi, EMMC_PEIM_SIG)

Definition at line 75 of file EmmcBlockIoPei.h.

◆ GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2

#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (   a)    CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, EMMC_PEIM_SIG)

Definition at line 76 of file EmmcBlockIoPei.h.

◆ GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY

#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (   a)    CR (a, EMMC_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, EMMC_PEIM_SIG)

Definition at line 77 of file EmmcBlockIoPei.h.

Typedef Documentation

◆ EMMC_PEIM_HC_PRIVATE_DATA

Definition at line 29 of file EmmcBlockIoPei.h.

◆ EMMC_PEIM_HC_SLOT

Definition at line 30 of file EmmcBlockIoPei.h.

◆ EMMC_TRB

typedef struct _EMMC_TRB EMMC_TRB

Definition at line 31 of file EmmcBlockIoPei.h.

Function Documentation

◆ EmmcBlockIoPeimEndOfPei()

EFI_STATUS EFIAPI EmmcBlockIoPeimEndOfPei ( 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 640 of file EmmcBlockIoPei.c.

◆ EmmcBlockIoPeimGetDeviceNo()

EFI_STATUS EFIAPI EmmcBlockIoPeimGetDeviceNo ( 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 183 of file EmmcBlockIoPei.c.

◆ EmmcBlockIoPeimGetDeviceNo2()

EFI_STATUS EFIAPI EmmcBlockIoPeimGetDeviceNo2 ( 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 460 of file EmmcBlockIoPei.c.

◆ EmmcBlockIoPeimGetMediaInfo()

EFI_STATUS EFIAPI EmmcBlockIoPeimGetMediaInfo ( 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 239 of file EmmcBlockIoPei.c.

◆ EmmcBlockIoPeimGetMediaInfo2()

EFI_STATUS EFIAPI EmmcBlockIoPeimGetMediaInfo2 ( 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 517 of file EmmcBlockIoPei.c.

◆ EmmcBlockIoPeimReadBlocks()

EFI_STATUS EFIAPI EmmcBlockIoPeimReadBlocks ( 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 319 of file EmmcBlockIoPei.c.

◆ EmmcBlockIoPeimReadBlocks2()

EFI_STATUS EFIAPI EmmcBlockIoPeimReadBlocks2 ( 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 601 of file EmmcBlockIoPei.c.

◆ EmmcPeimAllocateMem()

VOID * EmmcPeimAllocateMem ( IN EMMC_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 EmmcHcMem.c.

◆ EmmcPeimFreeMem()

VOID EmmcPeimFreeMem ( IN EMMC_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 EmmcHcMem.c.

◆ EmmcPeimFreeMemPool()

EFI_STATUS EmmcPeimFreeMemPool ( IN EMMC_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 EmmcHcMem.c.

◆ EmmcPeimInitMemPool()

EFI_STATUS EmmcPeimInitMemPool ( IN EMMC_PEIM_HC_PRIVATE_DATA Private)

Initialize the memory management pool for the host controller.

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

Definition at line 223 of file EmmcHcMem.c.

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