+\r
+/**\r
+ Allocate a bounce buffer for SEV DMA.\r
+\r
+ @param[in] NumPage Number of pages.\r
+ @param[out] Buffer Allocated DMA Buffer pointer\r
+\r
+**/\r
+VOID\r
+InternalQemuFwCfgSevDmaAllocateBuffer (\r
+ OUT VOID **Buffer,\r
+ IN UINT32 NumPages\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (mIoMmuProtocol != NULL);\r
+\r
+ Status = mIoMmuProtocol->AllocateBuffer (\r
+ mIoMmuProtocol,\r
+ 0,\r
+ EfiBootServicesData,\r
+ NumPages,\r
+ Buffer,\r
+ EDKII_IOMMU_ATTRIBUTE_MEMORY_CACHED\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR,\r
+ "%a:%a failed to allocate %u pages\n", gEfiCallerBaseName, __FUNCTION__,\r
+ NumPages));\r
+ ASSERT (FALSE);\r
+ CpuDeadLoop ();\r
+ }\r
+\r
+ DEBUG ((DEBUG_VERBOSE,\r
+ "%a:%a buffer 0x%Lx Pages %u\n", gEfiCallerBaseName, __FUNCTION__,\r
+ (UINT64)(UINTN)Buffer, NumPages));\r
+}\r
+\r
+/**\r
+ Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer\r
+\r
+ @param[in] NumPage Number of pages.\r
+ @param[in] Buffer DMA Buffer pointer\r
+\r
+**/\r
+VOID\r
+InternalQemuFwCfgSevDmaFreeBuffer (\r
+ IN VOID *Buffer,\r
+ IN UINT32 NumPages\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (mIoMmuProtocol != NULL);\r
+\r
+ Status = mIoMmuProtocol->FreeBuffer (\r
+ mIoMmuProtocol,\r
+ NumPages,\r
+ Buffer\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR,\r
+ "%a:%a failed to free buffer 0x%Lx pages %u\n", gEfiCallerBaseName,\r
+ __FUNCTION__, (UINT64)(UINTN)Buffer, NumPages));\r
+ ASSERT (FALSE);\r
+ CpuDeadLoop ();\r
+ }\r
+\r
+ DEBUG ((DEBUG_VERBOSE,\r
+ "%a:%a buffer 0x%Lx Pages %u\n", gEfiCallerBaseName,__FUNCTION__,\r
+ (UINT64)(UINTN)Buffer, NumPages));\r
+}\r