mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 09:12:31 +00:00 
			
		
		
		
	Update the SdBlockIoPei driver to consume IOMMU_PPI to allocate DMA buffer. If no IOMMU_PPI exists, this driver still calls PEI service to allocate DMA buffer, with assumption that DRAM==DMA. This is a compatible change. Cc: Jiewen Yao <jiewen.yao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
		
			
				
	
	
		
			517 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			517 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
  Copyright (c) 2015 - 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 _SD_BLOCK_IO_PEI_H_
 | 
						|
#define _SD_BLOCK_IO_PEI_H_
 | 
						|
 | 
						|
#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>
 | 
						|
 | 
						|
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;
 | 
						|
 | 
						|
#include "SdHci.h"
 | 
						|
#include "SdHcMem.h"
 | 
						|
 | 
						|
#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
 | 
						|
 | 
						|
struct _SD_PEIM_HC_SLOT {
 | 
						|
  UINT32                            Signature;
 | 
						|
  EFI_PEI_BLOCK_IO2_MEDIA           Media;
 | 
						|
 | 
						|
  UINTN                             SdHcBase;
 | 
						|
  SD_HC_SLOT_CAP                    Capability;
 | 
						|
  SD_CSD                            Csd;
 | 
						|
  BOOLEAN                           SectorAddressing;
 | 
						|
  SD_PEIM_HC_PRIVATE_DATA           *Private;
 | 
						|
};
 | 
						|
 | 
						|
struct _SD_PEIM_HC_PRIVATE_DATA {
 | 
						|
  UINT32                            Signature;
 | 
						|
  SD_PEIM_MEM_POOL                  *Pool;
 | 
						|
  EFI_PEI_RECOVERY_BLOCK_IO_PPI     BlkIoPpi;
 | 
						|
  EFI_PEI_RECOVERY_BLOCK_IO2_PPI    BlkIo2Ppi;
 | 
						|
  EFI_PEI_PPI_DESCRIPTOR            BlkIoPpiList;
 | 
						|
  EFI_PEI_PPI_DESCRIPTOR            BlkIo2PpiList;
 | 
						|
 | 
						|
  //
 | 
						|
  // EndOfPei callback is used to do the cleanups before exit of PEI phase.
 | 
						|
  //
 | 
						|
  EFI_PEI_NOTIFY_DESCRIPTOR         EndOfPeiNotifyList;
 | 
						|
 | 
						|
  SD_PEIM_HC_SLOT                   Slot[SD_PEIM_MAX_SLOTS];
 | 
						|
  UINT8                             SlotNum;
 | 
						|
  UINT8                             TotalBlkIoDevices;
 | 
						|
};
 | 
						|
 | 
						|
#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)
 | 
						|
 | 
						|
struct _SD_TRB {
 | 
						|
  SD_PEIM_HC_SLOT                   *Slot;
 | 
						|
  UINT16                            BlockSize;
 | 
						|
 | 
						|
  SD_COMMAND_PACKET                 *Packet;
 | 
						|
  VOID                              *Data;
 | 
						|
  UINT32                            DataLen;
 | 
						|
  BOOLEAN                           Read;
 | 
						|
  EFI_PHYSICAL_ADDRESS              DataPhy;
 | 
						|
  VOID                              *DataMap;
 | 
						|
  SD_HC_TRANSFER_MODE               Mode;
 | 
						|
 | 
						|
  UINT64                            Timeout;
 | 
						|
 | 
						|
  SD_HC_ADMA_DESC_LINE              *AdmaDesc;
 | 
						|
  UINTN                             AdmaDescSize;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  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.
 | 
						|
 | 
						|
  @param[in]  PeiServices          General-purpose services that are available
 | 
						|
                                   to every PEIM.
 | 
						|
  @param[in]  This                 Indicates the EFI_PEI_RECOVERY_BLOCK_IO_PPI
 | 
						|
                                   instance.
 | 
						|
  @param[out] NumberBlockDevices   The number of block I/O devices discovered.
 | 
						|
 | 
						|
  @retval     EFI_SUCCESS          The operation performed successfully.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SdBlockIoPeimGetDeviceNo (
 | 
						|
  IN  EFI_PEI_SERVICES               **PeiServices,
 | 
						|
  IN  EFI_PEI_RECOVERY_BLOCK_IO_PPI  *This,
 | 
						|
  OUT UINTN                          *NumberBlockDevices
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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.
 | 
						|
 | 
						|
  @param[in]  PeiServices   General-purpose services that are available to every
 | 
						|
                            PEIM
 | 
						|
  @param[in]  This          Indicates the EFI_PEI_RECOVERY_BLOCK_IO_PPI instance.
 | 
						|
  @param[in]  DeviceIndex   Specifies 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.
 | 
						|
  @param[out] MediaInfo     The media information of the specified block media.
 | 
						|
                            The caller is responsible for the ownership of this
 | 
						|
                            data structure.
 | 
						|
 | 
						|
  @par 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.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS        Media information about the specified block device
 | 
						|
                             was obtained successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR   Cannot get the media information due to a hardware
 | 
						|
                             error.
 | 
						|
 | 
						|
**/
 | 
						|
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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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.
 | 
						|
 | 
						|
  @param[in]  PeiServices   General-purpose services that are available to
 | 
						|
                            every PEIM.
 | 
						|
  @param[in]  This          Indicates the EFI_PEI_RECOVERY_BLOCK_IO_PPI instance.
 | 
						|
  @param[in]  DeviceIndex   Specifies 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.
 | 
						|
  @param[in]  StartLBA      The starting logical block address (LBA) to read from
 | 
						|
                            on the device
 | 
						|
  @param[in]  BufferSize    The size of the Buffer in bytes. This number must be
 | 
						|
                            a multiple of the intrinsic block size of the device.
 | 
						|
  @param[out] Buffer        A pointer to the destination buffer for the data.
 | 
						|
                            The caller is responsible for the ownership of the
 | 
						|
                            buffer.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The data was read correctly from the device.
 | 
						|
  @retval EFI_DEVICE_ERROR        The device reported an error while attempting
 | 
						|
                                  to perform the read operation.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The read request contains LBAs that are not
 | 
						|
                                  valid, or the buffer is not properly aligned.
 | 
						|
  @retval EFI_NO_MEDIA            There is no media in the device.
 | 
						|
  @retval EFI_BAD_BUFFER_SIZE     The BufferSize parameter is not a multiple of
 | 
						|
                                  the intrinsic block size of the device.
 | 
						|
 | 
						|
**/
 | 
						|
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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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.
 | 
						|
 | 
						|
  @param[in]  PeiServices          General-purpose services that are available
 | 
						|
                                   to every PEIM.
 | 
						|
  @param[in]  This                 Indicates the EFI_PEI_RECOVERY_BLOCK_IO2_PPI
 | 
						|
                                   instance.
 | 
						|
  @param[out] NumberBlockDevices   The number of block I/O devices discovered.
 | 
						|
 | 
						|
  @retval     EFI_SUCCESS          The operation performed successfully.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SdBlockIoPeimGetDeviceNo2 (
 | 
						|
  IN  EFI_PEI_SERVICES               **PeiServices,
 | 
						|
  IN  EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
 | 
						|
  OUT UINTN                          *NumberBlockDevices
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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.
 | 
						|
 | 
						|
  @param[in]  PeiServices   General-purpose services that are available to every
 | 
						|
                            PEIM
 | 
						|
  @param[in]  This          Indicates the EFI_PEI_RECOVERY_BLOCK_IO2_PPI instance.
 | 
						|
  @param[in]  DeviceIndex   Specifies 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.
 | 
						|
  @param[out] MediaInfo     The media information of the specified block media.
 | 
						|
                            The caller is responsible for the ownership of this
 | 
						|
                            data structure.
 | 
						|
 | 
						|
  @par 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.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS        Media information about the specified block device
 | 
						|
                             was obtained successfully.
 | 
						|
  @retval EFI_DEVICE_ERROR   Cannot get the media information due to a hardware
 | 
						|
                             error.
 | 
						|
 | 
						|
**/
 | 
						|
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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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.
 | 
						|
 | 
						|
  @param[in]  PeiServices   General-purpose services that are available to
 | 
						|
                            every PEIM.
 | 
						|
  @param[in]  This          Indicates the EFI_PEI_RECOVERY_BLOCK_IO2_PPI instance.
 | 
						|
  @param[in]  DeviceIndex   Specifies 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.
 | 
						|
  @param[in]  StartLBA      The starting logical block address (LBA) to read from
 | 
						|
                            on the device
 | 
						|
  @param[in]  BufferSize    The size of the Buffer in bytes. This number must be
 | 
						|
                            a multiple of the intrinsic block size of the device.
 | 
						|
  @param[out] Buffer        A pointer to the destination buffer for the data.
 | 
						|
                            The caller is responsible for the ownership of the
 | 
						|
                            buffer.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The data was read correctly from the device.
 | 
						|
  @retval EFI_DEVICE_ERROR        The device reported an error while attempting
 | 
						|
                                  to perform the read operation.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The read request contains LBAs that are not
 | 
						|
                                  valid, or the buffer is not properly aligned.
 | 
						|
  @retval EFI_NO_MEDIA            There is no media in the device.
 | 
						|
  @retval EFI_BAD_BUFFER_SIZE     The BufferSize parameter is not a multiple of
 | 
						|
                                  the intrinsic block size of the device.
 | 
						|
 | 
						|
**/
 | 
						|
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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Initialize the memory management pool for the host controller.
 | 
						|
 | 
						|
  @param  Private               The Sd Peim driver private data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The memory pool is initialized.
 | 
						|
  @retval Others                Fail to init the memory pool.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
SdPeimInitMemPool (
 | 
						|
  IN  SD_PEIM_HC_PRIVATE_DATA      *Private
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Release the memory management pool.
 | 
						|
 | 
						|
  @param  Pool                  The memory pool to free.
 | 
						|
 | 
						|
  @retval EFI_DEVICE_ERROR      Fail to free the memory pool.
 | 
						|
  @retval EFI_SUCCESS           The memory pool is freed.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
SdPeimFreeMemPool (
 | 
						|
  IN SD_PEIM_MEM_POOL       *Pool
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Allocate some memory from the host controller's memory pool
 | 
						|
  which can be used to communicate with host controller.
 | 
						|
 | 
						|
  @param  Pool      The host controller's memory pool.
 | 
						|
  @param  Size      Size of the memory to allocate.
 | 
						|
 | 
						|
  @return The allocated memory or NULL.
 | 
						|
 | 
						|
**/
 | 
						|
VOID *
 | 
						|
SdPeimAllocateMem (
 | 
						|
  IN  SD_PEIM_MEM_POOL        *Pool,
 | 
						|
  IN  UINTN                    Size
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Free the allocated memory back to the memory pool.
 | 
						|
 | 
						|
  @param  Pool           The memory pool of the host controller.
 | 
						|
  @param  Mem            The memory to free.
 | 
						|
  @param  Size           The size of the memory to free.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SdPeimFreeMem (
 | 
						|
  IN SD_PEIM_MEM_POOL    *Pool,
 | 
						|
  IN VOID                 *Mem,
 | 
						|
  IN UINTN                Size
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Initialize IOMMU.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
IoMmuInit (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Provides the controller-specific addresses required to access system memory from a
 | 
						|
  DMA bus master.
 | 
						|
 | 
						|
  @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_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  Mapping               The mapping value returned from Map().
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The range was unmapped.
 | 
						|
  @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned by Map().
 | 
						|
  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
IoMmuUnmap (
 | 
						|
  IN VOID                  *Mapping
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Allocates pages that are suitable for an OperationBusMasterCommonBuffer or
 | 
						|
  OperationBusMasterCommonBuffer64 mapping.
 | 
						|
 | 
						|
  @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 UINTN                  Pages,
 | 
						|
  OUT VOID                  **HostAddress,
 | 
						|
  OUT EFI_PHYSICAL_ADDRESS  *DeviceAddress,
 | 
						|
  OUT VOID                  **Mapping
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Frees memory that was allocated with AllocateBuffer().
 | 
						|
 | 
						|
  @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().
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The requested memory pages were freed.
 | 
						|
  @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress and Pages
 | 
						|
                                was not allocated with AllocateBuffer().
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
IoMmuFreeBuffer (
 | 
						|
  IN UINTN                  Pages,
 | 
						|
  IN VOID                   *HostAddress,
 | 
						|
  IN VOID                   *Mapping
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  One notified function to cleanup the allocated DMA buffers at the end of PEI.
 | 
						|
 | 
						|
  @param[in]  PeiServices        Pointer to PEI Services Table.
 | 
						|
  @param[in]  NotifyDescriptor   Pointer to the descriptor for the Notification
 | 
						|
                                 event that caused this function to execute.
 | 
						|
  @param[in]  Ppi                Pointer to the PPI data associated with this function.
 | 
						|
 | 
						|
  @retval     EFI_SUCCESS  The function completes successfully
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SdBlockIoPeimEndOfPei (
 | 
						|
  IN EFI_PEI_SERVICES           **PeiServices,
 | 
						|
  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
 | 
						|
  IN VOID                       *Ppi
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |