/** @file | |
Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef IOMMU_INTERNAL_H_ | |
#define IOMMU_INTERNAL_H_ | |
#include <Base.h> | |
#include <Protocol/IoMmu.h> | |
#include <Uefi/UefiBaseType.h> | |
#include <Uefi/UefiSpec.h> | |
#define MAP_INFO_SIG SIGNATURE_64 ('M', 'A', 'P', '_', 'I', 'N', 'F', 'O') | |
typedef struct { | |
UINT64 Signature; | |
LIST_ENTRY Link; | |
EDKII_IOMMU_OPERATION Operation; | |
UINTN NumberOfBytes; | |
UINTN NumberOfPages; | |
EFI_PHYSICAL_ADDRESS CryptedAddress; | |
EFI_PHYSICAL_ADDRESS PlainTextAddress; | |
UINT32 ReservedMemBitmap; | |
} MAP_INFO; | |
#define COMMON_BUFFER_SIG SIGNATURE_64 ('C', 'M', 'N', 'B', 'U', 'F', 'F', 'R') | |
#pragma pack (1) | |
// | |
// The following structure enables Map() and Unmap() to perform in-place | |
// decryption and encryption, respectively, for BusMasterCommonBuffer[64] | |
// operations, without dynamic memory allocation or release. | |
// | |
// Both COMMON_BUFFER_HEADER and COMMON_BUFFER_HEADER.StashBuffer are allocated | |
// by AllocateBuffer() and released by FreeBuffer(). | |
// | |
typedef struct { | |
UINT64 Signature; | |
// | |
// Always allocated from EfiBootServicesData type memory, and always | |
// encrypted. | |
// | |
VOID *StashBuffer; | |
// | |
// Bitmap of reserved memory | |
// | |
UINT32 ReservedMemBitmap; | |
// | |
// Followed by the actual common buffer, starting at the next page. | |
// | |
} COMMON_BUFFER_HEADER; | |
// | |
// This data structure defines a memory range in the reserved memory region. | |
// Please refer to IoMmuInitReservedSharedMem() for detailed information. | |
// | |
// The memory region looks like: | |
// |------------|----------------------------| | |
// | Header | Data | | |
// | 4k, private| 4k/32k/128k/etc, shared | | |
// |-----------------------------------------| | |
// | |
typedef struct { | |
UINT32 BitmapMask; | |
UINT32 Shift; | |
UINT32 Slots; | |
UINT32 DataSize; | |
UINT32 HeaderSize; | |
EFI_PHYSICAL_ADDRESS StartAddressOfMemRange; | |
} IOMMU_RESERVED_MEM_RANGE; | |
#pragma pack() | |
/** | |
* Allocate a memory region and convert it to be shared. This memory region will be | |
* used in the DMA operation. | |
* | |
* The pre-alloc memory contains pieces of memory regions with different size. The | |
* allocation of the shared memory regions are indicated by a 32-bit bitmap (mReservedMemBitmap). | |
* | |
* The memory regions are consumed by IoMmuAllocateBuffer (in which CommonBuffer is allocated) and | |
* IoMmuMap (in which bounce buffer is allocated). | |
* | |
* The CommonBuffer contains 2 parts, one page for CommonBufferHeader which is private memory, | |
* the other part is shared memory. So the layout of a piece of memory region after initialization | |
* looks like: | |
* | |
* |------------|----------------------------| | |
* | Header | Data | <-- a piece of pre-alloc memory region | |
* | 4k, private| 4k/32k/128k/etc, shared | | |
* |-----------------------------------------| | |
* | |
* @retval EFI_SUCCESS Successfully initialize the reserved memory. | |
* @retval EFI_UNSUPPORTED This feature is not supported. | |
*/ | |
EFI_STATUS | |
IoMmuInitReservedSharedMem ( | |
VOID | |
); | |
/** | |
* Release the pre-alloc shared memory. | |
* | |
* @retval EFI_SUCCESS Successfully release the shared memory | |
*/ | |
EFI_STATUS | |
IoMmuReleaseReservedSharedMem ( | |
BOOLEAN MemoryMapLocked | |
); | |
/** | |
* Allocate reserved shared memory for bounce buffer. | |
* | |
* @param Type Allocate type | |
* @param MemoryType The memory type to be allocated | |
* @param MapInfo Pointer to the MAP_INFO | |
* | |
* @retval EFI_SUCCESS Successfully allocate the bounce buffer | |
* @retval Other As the error code indicates | |
*/ | |
EFI_STATUS | |
IoMmuAllocateBounceBuffer ( | |
IN EFI_ALLOCATE_TYPE Type, | |
IN EFI_MEMORY_TYPE MemoryType, | |
IN OUT MAP_INFO *MapInfo | |
); | |
/** | |
* Free the bounce buffer allocated in IoMmuAllocateBounceBuffer. | |
* | |
* @param MapInfo Pointer to the MAP_INFO | |
* @return EFI_SUCCESS Successfully free the bounce buffer. | |
*/ | |
EFI_STATUS | |
IoMmuFreeBounceBuffer ( | |
IN OUT MAP_INFO *MapInfo | |
); | |
/** | |
* Allocate CommonBuffer from pre-allocated shared memory. | |
* | |
* @param MemoryType Memory type | |
* @param CommonBufferPages Pages of CommonBuffer | |
* @param PhysicalAddress Allocated physical address | |
* @param ReservedMemBitmap Bitmap which indicates the allocation of reserved memory | |
* | |
* @retval EFI_SUCCESS Successfully allocate the common buffer | |
* @retval Other As the error code indicates | |
*/ | |
EFI_STATUS | |
IoMmuAllocateCommonBuffer ( | |
IN EFI_MEMORY_TYPE MemoryType, | |
IN UINTN CommonBufferPages, | |
OUT EFI_PHYSICAL_ADDRESS *PhysicalAddress, | |
OUT UINT32 *ReservedMemBitmap | |
); | |
/** | |
* Free CommonBuffer which is allocated by IoMmuAllocateCommonBuffer(). | |
* | |
* @param CommonBufferHeader Pointer to the CommonBufferHeader | |
* @param CommonBufferPages Pages of CommonBuffer | |
* | |
* @retval EFI_SUCCESS Successfully free the common buffer | |
* @retval Other As the error code indicates | |
*/ | |
EFI_STATUS | |
IoMmuFreeCommonBuffer ( | |
IN COMMON_BUFFER_HEADER *CommonBufferHeader, | |
IN UINTN CommonBufferPages | |
); | |
#endif |