/** @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