/** @file Copyright (c) 2022, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef IOMMU_INTERNAL_H_ #define IOMMU_INTERNAL_H_ #include #include #include #include #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