mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-26 23:24:03 +02:00
IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3
In S3 resume, before system transfer to waking vector, the VTdPmr need turn off VTd protection based upon VTdPolicy. Cc: Star Zeng <star.zeng@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
parent
8be3ff8fb8
commit
fc8be1ad9a
@ -24,16 +24,18 @@
|
|||||||
#include <IndustryStandard/Vtd.h>
|
#include <IndustryStandard/Vtd.h>
|
||||||
#include <Ppi/IoMmu.h>
|
#include <Ppi/IoMmu.h>
|
||||||
#include <Ppi/VtdInfo.h>
|
#include <Ppi/VtdInfo.h>
|
||||||
|
#include <Ppi/EndOfPeiPhase.h>
|
||||||
|
|
||||||
#include "IntelVTdPmrPei.h"
|
#include "IntelVTdPmrPei.h"
|
||||||
|
|
||||||
#define TOTAL_DMA_BUFFER_SIZE SIZE_4MB
|
#define TOTAL_DMA_BUFFER_SIZE SIZE_4MB
|
||||||
|
#define TOTAL_DMA_BUFFER_SIZE_S3 SIZE_1MB
|
||||||
|
|
||||||
EFI_ACPI_DMAR_HEADER *mAcpiDmarTable;
|
EFI_ACPI_DMAR_HEADER *mAcpiDmarTable;
|
||||||
VTD_INFO *mVTdInfo;
|
VTD_INFO *mVTdInfo;
|
||||||
UINT64 mEngineMask;
|
UINT64 mEngineMask;
|
||||||
UINTN mDmaBufferBase;
|
UINTN mDmaBufferBase;
|
||||||
UINTN mDmaBufferSize = TOTAL_DMA_BUFFER_SIZE;
|
UINTN mDmaBufferSize;
|
||||||
UINTN mDmaBufferCurrentTop;
|
UINTN mDmaBufferCurrentTop;
|
||||||
UINTN mDmaBufferCurrentBottom;
|
UINTN mDmaBufferCurrentBottom;
|
||||||
|
|
||||||
@ -544,6 +546,7 @@ InitDmaProtection (
|
|||||||
}
|
}
|
||||||
ASSERT (DmaBufferSize == ALIGN_VALUE(DmaBufferSize, MemoryAlignment));
|
ASSERT (DmaBufferSize == ALIGN_VALUE(DmaBufferSize, MemoryAlignment));
|
||||||
*DmaBufferBase = (UINTN)AllocateAlignedPages (EFI_SIZE_TO_PAGES(DmaBufferSize), MemoryAlignment);
|
*DmaBufferBase = (UINTN)AllocateAlignedPages (EFI_SIZE_TO_PAGES(DmaBufferSize), MemoryAlignment);
|
||||||
|
ASSERT (*DmaBufferBase != 0);
|
||||||
if (*DmaBufferBase == 0) {
|
if (*DmaBufferBase == 0) {
|
||||||
DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n"));
|
DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n"));
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
@ -1104,6 +1107,41 @@ ParseDmarAcpiTableRmrr (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function handles S3 resume task at the end of PEI
|
||||||
|
|
||||||
|
@param[in] PeiServices Pointer to PEI Services Table.
|
||||||
|
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that
|
||||||
|
caused this function to execute.
|
||||||
|
@param[in] Ppi Pointer to the PPI data associated with this function.
|
||||||
|
|
||||||
|
@retval EFI_STATUS Always return EFI_SUCCESS
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
S3EndOfPeiNotify(
|
||||||
|
IN EFI_PEI_SERVICES **PeiServices,
|
||||||
|
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
|
||||||
|
IN VOID *Ppi
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT64 EngineMask;
|
||||||
|
|
||||||
|
DEBUG((DEBUG_INFO, "VTdPmr S3EndOfPeiNotify\n"));
|
||||||
|
|
||||||
|
if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT1) == 0) {
|
||||||
|
EngineMask = LShiftU64 (1, mVTdInfo->VTdEngineCount) - 1;
|
||||||
|
DisableDmaProtection (EngineMask);
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc = {
|
||||||
|
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||||
|
&gEfiEndOfPeiSignalPpiGuid,
|
||||||
|
S3EndOfPeiNotify
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes the Intel VTd PMR PEIM.
|
Initializes the Intel VTd PMR PEIM.
|
||||||
|
|
||||||
@ -1122,11 +1160,14 @@ IntelVTdPmrInitialize (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_BOOT_MODE BootMode;
|
||||||
|
|
||||||
if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT0) == 0) {
|
if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT0) == 0) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PeiServicesGetBootMode (&BootMode);
|
||||||
|
|
||||||
Status = PeiServicesLocatePpi (
|
Status = PeiServicesLocatePpi (
|
||||||
&gEdkiiVTdInfoPpiGuid,
|
&gEdkiiVTdInfoPpiGuid,
|
||||||
0,
|
0,
|
||||||
@ -1150,6 +1191,13 @@ IntelVTdPmrInitialize (
|
|||||||
//
|
//
|
||||||
ParseDmarAcpiTableRmrr ();
|
ParseDmarAcpiTableRmrr ();
|
||||||
|
|
||||||
|
if (BootMode == BOOT_ON_S3_RESUME) {
|
||||||
|
mDmaBufferSize = TOTAL_DMA_BUFFER_SIZE_S3;
|
||||||
|
} else {
|
||||||
|
mDmaBufferSize = TOTAL_DMA_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", mDmaBufferSize));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find a pre-memory in resource hob as DMA buffer
|
// Find a pre-memory in resource hob as DMA buffer
|
||||||
// Mark PEI memory to be DMA protected.
|
// Mark PEI memory to be DMA protected.
|
||||||
@ -1160,7 +1208,6 @@ IntelVTdPmrInitialize (
|
|||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", mDmaBufferBase));
|
DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", mDmaBufferBase));
|
||||||
DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", mDmaBufferSize));
|
|
||||||
|
|
||||||
mDmaBufferCurrentTop = mDmaBufferBase + mDmaBufferSize;
|
mDmaBufferCurrentTop = mDmaBufferBase + mDmaBufferSize;
|
||||||
mDmaBufferCurrentBottom = mDmaBufferBase;
|
mDmaBufferCurrentBottom = mDmaBufferBase;
|
||||||
@ -1171,6 +1218,14 @@ IntelVTdPmrInitialize (
|
|||||||
Status = PeiServicesInstallPpi (&mIoMmuPpiList);
|
Status = PeiServicesInstallPpi (&mIoMmuPpiList);
|
||||||
ASSERT_EFI_ERROR(Status);
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register EndOfPei Notify for S3 to run FSP NotifyPhase
|
||||||
|
//
|
||||||
|
if (BootMode == BOOT_ON_S3_RESUME) {
|
||||||
|
Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,12 +46,14 @@
|
|||||||
[Ppis]
|
[Ppis]
|
||||||
gEdkiiIoMmuPpiGuid ## PRODUCES
|
gEdkiiIoMmuPpiGuid ## PRODUCES
|
||||||
gEdkiiVTdInfoPpiGuid ## CONSUMES
|
gEdkiiVTdInfoPpiGuid ## CONSUMES
|
||||||
|
gEfiEndOfPeiSignalPpiGuid ## CONSUMES
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask ## CONSUMES
|
gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask ## CONSUMES
|
||||||
|
|
||||||
[Depex]
|
[Depex]
|
||||||
gEfiPeiMemoryDiscoveredPpiGuid AND
|
gEfiPeiMemoryDiscoveredPpiGuid AND
|
||||||
|
gEfiPeiMasterBootModePpiGuid AND
|
||||||
gEdkiiVTdInfoPpiGuid
|
gEdkiiVTdInfoPpiGuid
|
||||||
|
|
||||||
[UserExtensions.TianoCore."ExtraFiles"]
|
[UserExtensions.TianoCore."ExtraFiles"]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user