TianoCore EDK2 master
Loading...
Searching...
No Matches
CcIoMmu.c File Reference
#include <Library/PcdLib.h>
#include <ConfidentialComputingGuestAttr.h>
#include "CcIoMmu.h"
#include "IoMmuInternal.h"

Go to the source code of this file.

Functions

EFI_STATUS EFIAPI IoMmuMap (IN EDKII_IOMMU_PROTOCOL *This, IN EDKII_IOMMU_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping)
 
STATIC EFI_STATUS EFIAPI IoMmuUnmapWorker (IN EDKII_IOMMU_PROTOCOL *This, IN VOID *Mapping, IN BOOLEAN MemoryMapLocked)
 
EFI_STATUS EFIAPI IoMmuUnmap (IN EDKII_IOMMU_PROTOCOL *This, IN VOID *Mapping)
 
EFI_STATUS EFIAPI IoMmuAllocateBuffer (IN EDKII_IOMMU_PROTOCOL *This, IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, IN OUT VOID **HostAddress, IN UINT64 Attributes)
 
EFI_STATUS EFIAPI IoMmuFreeBuffer (IN EDKII_IOMMU_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress)
 
EFI_STATUS EFIAPI IoMmuSetAttribute (IN EDKII_IOMMU_PROTOCOL *This, IN EFI_HANDLE DeviceHandle, IN VOID *Mapping, IN UINT64 IoMmuAccess)
 
STATIC VOID EFIAPI IoMmuExitBoot (IN EFI_EVENT Event, IN VOID *EventToSignal)
 
STATIC VOID EFIAPI IoMmuUnmapAllMappings (IN EFI_EVENT Event, IN VOID *Context)
 
EFI_STATUS EFIAPI InstallIoMmuProtocol (VOID)
 

Variables

STATIC LIST_ENTRY mMapInfos = INITIALIZE_LIST_HEAD_VARIABLE (mMapInfos)
 
BOOLEAN mReservedSharedMemSupported = FALSE
 
STATIC CONST CHAR8 *CONST mBusMasterOperationName [EdkiiIoMmuOperationMaximum]
 
EDKII_IOMMU_PROTOCOL mIoMmu
 

Detailed Description

The protocol provides support to allocate, free, map and umap a DMA buffer for bus master (e.g PciHostBridge). When SEV or TDX is enabled, the DMA operations must be performed on unencrypted buffer hence we use a bounce buffer to map the guest buffer into an unencrypted DMA buffer.

Copyright (c) 2017 - 2024, AMD Inc. All rights reserved.
Copyright (c) 2017, Intel Corporation. All rights reserved.

SPDX-License-Identifier: BSD-2-Clause-Patent

Definition in file CcIoMmu.c.

Function Documentation

◆ InstallIoMmuProtocol()

EFI_STATUS EFIAPI InstallIoMmuProtocol ( VOID  )

Initialize Iommu Protocol.

Definition at line 929 of file CcIoMmu.c.

◆ IoMmuAllocateBuffer()

EFI_STATUS EFIAPI IoMmuAllocateBuffer ( IN EDKII_IOMMU_PROTOCOL This,
IN EFI_ALLOCATE_TYPE  Type,
IN EFI_MEMORY_TYPE  MemoryType,
IN UINTN  Pages,
IN OUT VOID **  HostAddress,
IN UINT64  Attributes 
)

Allocates pages that are suitable for an OperationBusMasterCommonBuffer or OperationBusMasterCommonBuffer64 mapping.

Parameters
ThisThe protocol instance pointer.
TypeThis parameter is not used and must be ignored.
MemoryTypeThe type of memory to allocate, EfiBootServicesData or EfiRuntimeServicesData.
PagesThe number of pages to allocate.
HostAddressA pointer to store the base system memory address of the allocated range.
AttributesThe requested bit mask of attributes for the allocated range.
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 521 of file CcIoMmu.c.

◆ IoMmuExitBoot()

STATIC VOID EFIAPI IoMmuExitBoot ( IN EFI_EVENT  Event,
IN VOID *  EventToSignal 
)

Notification function that is queued when gBS->ExitBootServices() signals the EFI_EVENT_GROUP_EXIT_BOOT_SERVICES event group. This function signals another event, received as Context, and returns.

Signaling an event in this context is safe. The UEFI spec allows gBS->SignalEvent() to return EFI_SUCCESS only; EFI_OUT_OF_RESOURCES is not listed, hence memory is not allocated. The edk2 implementation also does not release memory (and we only have to care about the edk2 implementation because EDKII_IOMMU_PROTOCOL is edk2-specific anyway).

Parameters
[in]EventEvent whose notification function is being invoked. Event is permitted to request the queueing of this function at TPL_CALLBACK or TPL_NOTIFY task priority level.
[in]EventToSignalIdentifies the EFI_EVENT to signal. EventToSignal is permitted to request the queueing of its notification function only at TPL_CALLBACK level.

Definition at line 840 of file CcIoMmu.c.

◆ IoMmuFreeBuffer()

EFI_STATUS EFIAPI IoMmuFreeBuffer ( IN EDKII_IOMMU_PROTOCOL This,
IN UINTN  Pages,
IN VOID *  HostAddress 
)

Frees memory that was allocated with AllocateBuffer().

Parameters
ThisThe protocol instance pointer.
PagesThe number of pages to free.
HostAddressThe base system memory address of the allocated range.
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 654 of file CcIoMmu.c.

◆ IoMmuMap()

EFI_STATUS EFIAPI IoMmuMap ( IN EDKII_IOMMU_PROTOCOL This,
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. On SEV/TDX guest, the DMA operations must be performed on shared buffer hence we allocate a bounce buffer to map the HostAddress to a DeviceAddress. The Encryption attribute is removed from the DeviceAddress buffer.

Parameters
ThisThe protocol instance pointer.
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 77 of file CcIoMmu.c.

◆ IoMmuSetAttribute()

EFI_STATUS EFIAPI IoMmuSetAttribute ( IN EDKII_IOMMU_PROTOCOL This,
IN EFI_HANDLE  DeviceHandle,
IN VOID *  Mapping,
IN UINT64  IoMmuAccess 
)

Set IOMMU attribute for a system memory.

If the IOMMU protocol exists, the system memory cannot be used for DMA by default.

When a device requests a DMA access for a system memory, the device driver need use SetAttribute() to update the IOMMU attribute to request DMA access (read and/or write).

The DeviceHandle is used to identify which device submits the request. The IOMMU implementation need translate the device path to an IOMMU device ID, and set IOMMU hardware register accordingly. 1) DeviceHandle can be a standard PCI device. The memory for BusMasterRead need set EDKII_IOMMU_ACCESS_READ. The memory for BusMasterWrite need set EDKII_IOMMU_ACCESS_WRITE. The memory for BusMasterCommonBuffer need set EDKII_IOMMU_ACCESS_READ|EDKII_IOMMU_ACCESS_WRITE. After the memory is used, the memory need set 0 to keep it being protected. 2) DeviceHandle can be an ACPI device (ISA, I2C, SPI, etc). The memory for DMA access need set EDKII_IOMMU_ACCESS_READ and/or EDKII_IOMMU_ACCESS_WRITE.

Parameters
[in]ThisThe protocol instance pointer.
[in]DeviceHandleThe device who initiates the DMA access request.
[in]MappingThe mapping value returned from Map().
[in]IoMmuAccessThe IOMMU access.
Return values
EFI_SUCCESSThe IoMmuAccess is set for the memory range specified by DeviceAddress and Length.
EFI_INVALID_PARAMETERDeviceHandle is an invalid handle.
EFI_INVALID_PARAMETERMapping is not a value that was returned by Map().
EFI_INVALID_PARAMETERIoMmuAccess specified an illegal combination of access.
EFI_UNSUPPORTEDDeviceHandle is unknown by the IOMMU.
EFI_UNSUPPORTEDThe bit mask of IoMmuAccess is not supported by the IOMMU.
EFI_UNSUPPORTEDThe IOMMU does not support the memory range specified by Mapping.
EFI_OUT_OF_RESOURCESThere are not enough resources available to modify the IOMMU access.
EFI_DEVICE_ERRORThe IOMMU device reported an error while attempting the operation.

Definition at line 747 of file CcIoMmu.c.

◆ IoMmuUnmap()

EFI_STATUS EFIAPI IoMmuUnmap ( IN EDKII_IOMMU_PROTOCOL This,
IN VOID *  Mapping 
)

Completes the Map() operation and releases any corresponding resources.

Parameters
ThisThe protocol instance pointer.
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 485 of file CcIoMmu.c.

◆ IoMmuUnmapAllMappings()

STATIC VOID EFIAPI IoMmuUnmapAllMappings ( IN EFI_EVENT  Event,
IN VOID *  Context 
)

Notification function that is queued after the notification functions of all events in the EFI_EVENT_GROUP_EXIT_BOOT_SERVICES event group. The same memory map restrictions apply.

This function unmaps all currently existing IOMMU mappings.

Parameters
[in]EventEvent whose notification function is being invoked. Event is permitted to request the queueing of this function only at TPL_CALLBACK task priority level.
[in]ContextIgnored.

Definition at line 892 of file CcIoMmu.c.

◆ IoMmuUnmapWorker()

STATIC EFI_STATUS EFIAPI IoMmuUnmapWorker ( IN EDKII_IOMMU_PROTOCOL This,
IN VOID *  Mapping,
IN BOOLEAN  MemoryMapLocked 
)

Completes the Map() operation and releases any corresponding resources.

This is an internal worker function that only extends the Map() API with the MemoryMapLocked parameter.

Parameters
ThisThe protocol instance pointer.
MappingThe mapping value returned from Map().
MemoryMapLockedThe function is executing on the stack of gBS->ExitBootServices(); changes to the UEFI memory map are forbidden.
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 331 of file CcIoMmu.c.

Variable Documentation

◆ mBusMasterOperationName

STATIC CONST CHAR8* CONST mBusMasterOperationName[EdkiiIoMmuOperationMaximum]
Initial value:
= {
"Read",
"Write",
"CommonBuffer",
"Read64",
"Write64",
"CommonBuffer64"
}

Definition at line 36 of file CcIoMmu.c.

◆ mIoMmu

Initial value:
= {
EDKII_IOMMU_PROTOCOL_REVISION,
}
EFI_STATUS EFIAPI IoMmuFreeBuffer(IN EDKII_IOMMU_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress)
Definition: CcIoMmu.c:654
EFI_STATUS EFIAPI IoMmuAllocateBuffer(IN EDKII_IOMMU_PROTOCOL *This, IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, IN OUT VOID **HostAddress, IN UINT64 Attributes)
Definition: CcIoMmu.c:521
EFI_STATUS EFIAPI IoMmuUnmap(IN EDKII_IOMMU_PROTOCOL *This, IN VOID *Mapping)
Definition: CcIoMmu.c:485
EFI_STATUS EFIAPI IoMmuMap(IN EDKII_IOMMU_PROTOCOL *This, IN EDKII_IOMMU_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping)
Definition: CcIoMmu.c:77
EFI_STATUS EFIAPI IoMmuSetAttribute(IN EDKII_IOMMU_PROTOCOL *This, IN EFI_HANDLE DeviceHandle, IN VOID *Mapping, IN UINT64 IoMmuAccess)
Definition: CcIoMmu.c:747

Definition at line 808 of file CcIoMmu.c.

◆ mMapInfos

Definition at line 25 of file CcIoMmu.c.

◆ mReservedSharedMemSupported

BOOLEAN mReservedSharedMemSupported = FALSE

Definition at line 30 of file CcIoMmu.c.