Initialize DMA protection.\r
\r
@param VTdInfo The VTd engine context information.\r
- @param DmaBufferSize the DMA buffer size\r
- @param DmaBufferBase the DMA buffer base\r
\r
@retval EFI_SUCCESS the DMA protection is initialized.\r
@retval EFI_OUT_OF_RESOURCES no enough resource to initialize DMA protection.\r
**/\r
EFI_STATUS\r
InitDmaProtection (\r
- IN VTD_INFO *VTdInfo,\r
- IN UINTN DmaBufferSize,\r
- OUT UINTN *DmaBufferBase\r
+ IN VTD_INFO *VTdInfo\r
)\r
{\r
EFI_STATUS Status;\r
UINTN LowTop;\r
UINTN HighBottom;\r
UINT64 HighTop;\r
+ DMA_BUFFER_INFO *DmaBufferInfo;\r
+ VOID *Hob;\r
+\r
+ Hob = GetFirstGuidHob (&mDmaBufferInfoGuid);\r
+ DmaBufferInfo = GET_GUID_HOB_DATA(Hob);\r
+\r
+ DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", DmaBufferInfo->DmaBufferSize));\r
\r
LowMemoryAlignment = GetLowMemoryAlignment (VTdInfo, VTdInfo->EngineMask);\r
HighMemoryAlignment = GetHighMemoryAlignment (VTdInfo, VTdInfo->EngineMask);\r
} else {\r
MemoryAlignment = LowMemoryAlignment;\r
}\r
- ASSERT (DmaBufferSize == ALIGN_VALUE(DmaBufferSize, MemoryAlignment));\r
- *DmaBufferBase = (UINTN)AllocateAlignedPages (EFI_SIZE_TO_PAGES(DmaBufferSize), MemoryAlignment);\r
- ASSERT (*DmaBufferBase != 0);\r
- if (*DmaBufferBase == 0) {\r
+ ASSERT (DmaBufferInfo->DmaBufferSize == ALIGN_VALUE(DmaBufferInfo->DmaBufferSize, MemoryAlignment));\r
+ DmaBufferInfo->DmaBufferBase = (UINTN)AllocateAlignedPages (EFI_SIZE_TO_PAGES(DmaBufferInfo->DmaBufferSize), MemoryAlignment);\r
+ ASSERT (DmaBufferInfo->DmaBufferBase != 0);\r
+ if (DmaBufferInfo->DmaBufferBase == 0) {\r
DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n"));\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
+ DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", DmaBufferInfo->DmaBufferBase));\r
+\r
+ DmaBufferInfo->DmaBufferCurrentTop = DmaBufferInfo->DmaBufferBase + DmaBufferInfo->DmaBufferSize;\r
+ DmaBufferInfo->DmaBufferCurrentBottom = DmaBufferInfo->DmaBufferBase;\r
+\r
+ //\r
+ // Install PPI.\r
+ //\r
+ Status = PeiServicesInstallPpi (&mIoMmuPpiList);\r
+ ASSERT_EFI_ERROR(Status);\r
+\r
LowBottom = 0;\r
- LowTop = *DmaBufferBase;\r
- HighBottom = *DmaBufferBase + DmaBufferSize;\r
+ LowTop = DmaBufferInfo->DmaBufferBase;\r
+ HighBottom = DmaBufferInfo->DmaBufferBase + DmaBufferInfo->DmaBufferSize;\r
HighTop = LShiftU64 (1, VTdInfo->HostAddressWidth + 1);\r
\r
Status = SetDmaProtectedRange (\r
);\r
\r
if (EFI_ERROR(Status)) {\r
- FreePages ((VOID *)*DmaBufferBase, EFI_SIZE_TO_PAGES(DmaBufferSize));\r
+ FreePages ((VOID *)DmaBufferInfo->DmaBufferBase, EFI_SIZE_TO_PAGES(DmaBufferInfo->DmaBufferSize));\r
}\r
\r
return Status;\r
EFI_STATUS Status;\r
VOID *Hob;\r
VTD_INFO *VTdInfo;\r
- DMA_BUFFER_INFO *DmaBufferInfo;\r
\r
Hob = GetFirstGuidHob (&mVTdInfoGuid);\r
VTdInfo = GET_GUID_HOB_DATA(Hob);\r
//\r
ParseDmarAcpiTableRmrr (VTdInfo);\r
\r
- Hob = GetFirstGuidHob (&mDmaBufferInfoGuid);\r
- DmaBufferInfo = GET_GUID_HOB_DATA(Hob);\r
-\r
- DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", DmaBufferInfo->DmaBufferSize));\r
- //\r
- // Find a pre-memory in resource hob as DMA buffer\r
- // Mark PEI memory to be DMA protected.\r
- //\r
- Status = InitDmaProtection (VTdInfo, DmaBufferInfo->DmaBufferSize, &DmaBufferInfo->DmaBufferBase);\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", DmaBufferInfo->DmaBufferBase));\r
-\r
- DmaBufferInfo->DmaBufferCurrentTop = DmaBufferInfo->DmaBufferBase + DmaBufferInfo->DmaBufferSize;\r
- DmaBufferInfo->DmaBufferCurrentBottom = DmaBufferInfo->DmaBufferBase;\r
-\r
//\r
- // Install PPI.\r
+ // Allocate a range in PEI memory as DMA buffer\r
+ // Mark others to be DMA protected.\r
//\r
- Status = PeiServicesInstallPpi (&mIoMmuPpiList);\r
- ASSERT_EFI_ERROR(Status);\r
+ Status = InitDmaProtection (VTdInfo);\r
\r
return Status;\r
}\r