[edk2] [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3

Jiewen Yao posted 3 patches 7 years, 3 months ago
[edk2] [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3
Posted by Jiewen Yao 7 years, 3 months ago
In S3 resume, before system transfer to waking vector,
the VTdPrm 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>
---
 IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c   | 59 +++++++++++++++++++-
 IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf |  1 +
 2 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
index e768274..3fe6d65 100644
--- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
+++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
@@ -24,16 +24,18 @@
 #include <IndustryStandard/Vtd.h>
 #include <Ppi/IoMmu.h>
 #include <Ppi/VtdInfo.h>
+#include <Ppi/EndOfPeiPhase.h>
 
 #include "IntelVTdPmrPei.h"
 
 #define  TOTAL_DMA_BUFFER_SIZE    SIZE_4MB
+#define  TOTAL_DMA_BUFFER_SIZE_S3 SIZE_1MB
 
 EFI_ACPI_DMAR_HEADER              *mAcpiDmarTable;
 VTD_INFO                          *mVTdInfo;
 UINT64                            mEngineMask;
 UINTN                             mDmaBufferBase;
-UINTN                             mDmaBufferSize = TOTAL_DMA_BUFFER_SIZE;
+UINTN                             mDmaBufferSize;
 UINTN                             mDmaBufferCurrentTop;
 UINTN                             mDmaBufferCurrentBottom;
 
@@ -544,6 +546,7 @@ InitDmaProtection (
   }
   ASSERT (DmaBufferSize == ALIGN_VALUE(DmaBufferSize, MemoryAlignment));
   *DmaBufferBase = (UINTN)AllocateAlignedPages (EFI_SIZE_TO_PAGES(DmaBufferSize), MemoryAlignment);
+  ASSERT (*DmaBufferBase != 0);
   if (*DmaBufferBase == 0) {
     DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n"));
     return EFI_OUT_OF_RESOURCES;
@@ -1105,6 +1108,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.
 
   @param  FileHandle  Handle of the file being invoked.
@@ -1122,11 +1160,14 @@ IntelVTdPmrInitialize (
   )
 {
   EFI_STATUS                  Status;
+  EFI_BOOT_MODE               BootMode;
 
   if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT0) == 0) {
     return EFI_UNSUPPORTED;
   }
 
+  PeiServicesGetBootMode (&BootMode);
+
   Status = PeiServicesLocatePpi (
              &gEdkiiVTdInfoPpiGuid,
              0,
@@ -1150,6 +1191,13 @@ IntelVTdPmrInitialize (
   //
   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
   // Mark PEI memory to be DMA protected.
@@ -1160,7 +1208,6 @@ IntelVTdPmrInitialize (
   }
 
   DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", mDmaBufferBase));
-  DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", mDmaBufferSize));
 
   mDmaBufferCurrentTop = mDmaBufferBase + mDmaBufferSize;
   mDmaBufferCurrentBottom = mDmaBufferBase;
@@ -1171,6 +1218,14 @@ IntelVTdPmrInitialize (
   Status = PeiServicesInstallPpi (&mIoMmuPpiList);
   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;
 }
 
diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
index 86cd7d1..e1aa980 100644
--- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
+++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
@@ -46,6 +46,7 @@
 [Ppis]
   gEdkiiIoMmuPpiGuid            ## PRODUCES
   gEdkiiVTdInfoPpiGuid          ## CONSUMES
+  gEfiEndOfPeiSignalPpiGuid     ## CONSUMES
 
 [Pcd]
   gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask   ## CONSUMES
-- 
2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3
Posted by Zeng, Star 7 years, 3 months ago
Is the code comment correct?

+  //
+  // Register EndOfPei Notify for S3 to run FSP NotifyPhase
+  //

Should the "VTdPrm" be "VTdPmr"?

If checking the bootmode in entrypoint, should add gEfiPeiMasterBootModePpiGuid in the depex or not?


Thanks,
Star
-----Original Message-----
From: Yao, Jiewen 
Sent: Friday, September 22, 2017 11:45 AM
To: edk2-devel@lists.01.org
Cc: Zeng, Star <star.zeng@intel.com>
Subject: [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3

In S3 resume, before system transfer to waking vector,
the VTdPrm 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>
---
 IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c   | 59 +++++++++++++++++++-
 IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf |  1 +
 2 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
index e768274..3fe6d65 100644
--- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
+++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
@@ -24,16 +24,18 @@
 #include <IndustryStandard/Vtd.h>
 #include <Ppi/IoMmu.h>
 #include <Ppi/VtdInfo.h>
+#include <Ppi/EndOfPeiPhase.h>
 
 #include "IntelVTdPmrPei.h"
 
 #define  TOTAL_DMA_BUFFER_SIZE    SIZE_4MB
+#define  TOTAL_DMA_BUFFER_SIZE_S3 SIZE_1MB
 
 EFI_ACPI_DMAR_HEADER              *mAcpiDmarTable;
 VTD_INFO                          *mVTdInfo;
 UINT64                            mEngineMask;
 UINTN                             mDmaBufferBase;
-UINTN                             mDmaBufferSize = TOTAL_DMA_BUFFER_SIZE;
+UINTN                             mDmaBufferSize;
 UINTN                             mDmaBufferCurrentTop;
 UINTN                             mDmaBufferCurrentBottom;
 
@@ -544,6 +546,7 @@ InitDmaProtection (
   }
   ASSERT (DmaBufferSize == ALIGN_VALUE(DmaBufferSize, MemoryAlignment));
   *DmaBufferBase = (UINTN)AllocateAlignedPages (EFI_SIZE_TO_PAGES(DmaBufferSize), MemoryAlignment);
+  ASSERT (*DmaBufferBase != 0);
   if (*DmaBufferBase == 0) {
     DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n"));
     return EFI_OUT_OF_RESOURCES;
@@ -1105,6 +1108,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.
 
   @param  FileHandle  Handle of the file being invoked.
@@ -1122,11 +1160,14 @@ IntelVTdPmrInitialize (
   )
 {
   EFI_STATUS                  Status;
+  EFI_BOOT_MODE               BootMode;
 
   if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT0) == 0) {
     return EFI_UNSUPPORTED;
   }
 
+  PeiServicesGetBootMode (&BootMode);
+
   Status = PeiServicesLocatePpi (
              &gEdkiiVTdInfoPpiGuid,
              0,
@@ -1150,6 +1191,13 @@ IntelVTdPmrInitialize (
   //
   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
   // Mark PEI memory to be DMA protected.
@@ -1160,7 +1208,6 @@ IntelVTdPmrInitialize (
   }
 
   DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", mDmaBufferBase));
-  DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", mDmaBufferSize));
 
   mDmaBufferCurrentTop = mDmaBufferBase + mDmaBufferSize;
   mDmaBufferCurrentBottom = mDmaBufferBase;
@@ -1171,6 +1218,14 @@ IntelVTdPmrInitialize (
   Status = PeiServicesInstallPpi (&mIoMmuPpiList);
   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;
 }
 
diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
index 86cd7d1..e1aa980 100644
--- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
+++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
@@ -46,6 +46,7 @@
 [Ppis]
   gEdkiiIoMmuPpiGuid            ## PRODUCES
   gEdkiiVTdInfoPpiGuid          ## CONSUMES
+  gEfiEndOfPeiSignalPpiGuid     ## CONSUMES
 
 [Pcd]
   gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask   ## CONSUMES
-- 
2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3
Posted by Yao, Jiewen 7 years, 3 months ago
Good catch. Typo. It should be VTdPmr.

Yes, we need add gEfiPeiMasterBootModePpiGuid - that is very good suggestion.

Thank you
Yao Jiewen

> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, September 22, 2017 12:22 PM
> To: Yao, Jiewen <jiewen.yao@intel.com>; edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>
> Subject: RE: [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3
> 
> Is the code comment correct?
> 
> +  //
> +  // Register EndOfPei Notify for S3 to run FSP NotifyPhase
> +  //
> 
> Should the "VTdPrm" be "VTdPmr"?
> 
> If checking the bootmode in entrypoint, should add
> gEfiPeiMasterBootModePpiGuid in the depex or not?
> 
> 
> Thanks,
> Star
> -----Original Message-----
> From: Yao, Jiewen
> Sent: Friday, September 22, 2017 11:45 AM
> To: edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>
> Subject: [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3
> 
> In S3 resume, before system transfer to waking vector,
> the VTdPrm 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>
> ---
>  IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c   | 59
> +++++++++++++++++++-
>  IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf |  1 +
>  2 files changed, 58 insertions(+), 2 deletions(-)
> 
> diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> index e768274..3fe6d65 100644
> --- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> @@ -24,16 +24,18 @@
>  #include <IndustryStandard/Vtd.h>
>  #include <Ppi/IoMmu.h>
>  #include <Ppi/VtdInfo.h>
> +#include <Ppi/EndOfPeiPhase.h>
> 
>  #include "IntelVTdPmrPei.h"
> 
>  #define  TOTAL_DMA_BUFFER_SIZE    SIZE_4MB
> +#define  TOTAL_DMA_BUFFER_SIZE_S3 SIZE_1MB
> 
>  EFI_ACPI_DMAR_HEADER              *mAcpiDmarTable;
>  VTD_INFO                          *mVTdInfo;
>  UINT64                            mEngineMask;
>  UINTN                             mDmaBufferBase;
> -UINTN                             mDmaBufferSize =
> TOTAL_DMA_BUFFER_SIZE;
> +UINTN                             mDmaBufferSize;
>  UINTN                             mDmaBufferCurrentTop;
>  UINTN                             mDmaBufferCurrentBottom;
> 
> @@ -544,6 +546,7 @@ InitDmaProtection (
>    }
>    ASSERT (DmaBufferSize == ALIGN_VALUE(DmaBufferSize,
> MemoryAlignment));
>    *DmaBufferBase = (UINTN)AllocateAlignedPages
> (EFI_SIZE_TO_PAGES(DmaBufferSize), MemoryAlignment);
> +  ASSERT (*DmaBufferBase != 0);
>    if (*DmaBufferBase == 0) {
>      DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n"));
>      return EFI_OUT_OF_RESOURCES;
> @@ -1105,6 +1108,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.
> 
>    @param  FileHandle  Handle of the file being invoked.
> @@ -1122,11 +1160,14 @@ IntelVTdPmrInitialize (
>    )
>  {
>    EFI_STATUS                  Status;
> +  EFI_BOOT_MODE               BootMode;
> 
>    if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT0) == 0) {
>      return EFI_UNSUPPORTED;
>    }
> 
> +  PeiServicesGetBootMode (&BootMode);
> +
>    Status = PeiServicesLocatePpi (
>               &gEdkiiVTdInfoPpiGuid,
>               0,
> @@ -1150,6 +1191,13 @@ IntelVTdPmrInitialize (
>    //
>    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
>    // Mark PEI memory to be DMA protected.
> @@ -1160,7 +1208,6 @@ IntelVTdPmrInitialize (
>    }
> 
>    DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", mDmaBufferBase));
> -  DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", mDmaBufferSize));
> 
>    mDmaBufferCurrentTop = mDmaBufferBase + mDmaBufferSize;
>    mDmaBufferCurrentBottom = mDmaBufferBase;
> @@ -1171,6 +1218,14 @@ IntelVTdPmrInitialize (
>    Status = PeiServicesInstallPpi (&mIoMmuPpiList);
>    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;
>  }
> 
> diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> index 86cd7d1..e1aa980 100644
> --- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> @@ -46,6 +46,7 @@
>  [Ppis]
>    gEdkiiIoMmuPpiGuid            ## PRODUCES
>    gEdkiiVTdInfoPpiGuid          ## CONSUMES
> +  gEfiEndOfPeiSignalPpiGuid     ## CONSUMES
> 
>  [Pcd]
>    gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask   ##
> CONSUMES
> --
> 2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3
Posted by Zeng, Star 7 years, 3 months ago
With that updated, Reviewed-by: Star Zeng <star.zeng@intel.com> to this patch series.

Thanks,
Star
-----Original Message-----
From: Yao, Jiewen 
Sent: Friday, September 22, 2017 12:42 PM
To: Zeng, Star <star.zeng@intel.com>; edk2-devel@lists.01.org
Subject: RE: [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback for S3

Good catch. Typo. It should be VTdPmr.

Yes, we need add gEfiPeiMasterBootModePpiGuid - that is very good suggestion.

Thank you
Yao Jiewen

> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, September 22, 2017 12:22 PM
> To: Yao, Jiewen <jiewen.yao@intel.com>; edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>
> Subject: RE: [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei 
> callback for S3
> 
> Is the code comment correct?
> 
> +  //
> +  // Register EndOfPei Notify for S3 to run FSP NotifyPhase  //
> 
> Should the "VTdPrm" be "VTdPmr"?
> 
> If checking the bootmode in entrypoint, should add 
> gEfiPeiMasterBootModePpiGuid in the depex or not?
> 
> 
> Thanks,
> Star
> -----Original Message-----
> From: Yao, Jiewen
> Sent: Friday, September 22, 2017 11:45 AM
> To: edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>
> Subject: [PATCH 3/3] IntelSiliconPkg/VTdPmrPei: Add EndOfPei callback 
> for S3
> 
> In S3 resume, before system transfer to waking vector, the VTdPrm 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>
> ---
>  IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c   | 59
> +++++++++++++++++++-
>  IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf |  1 +
>  2 files changed, 58 insertions(+), 2 deletions(-)
> 
> diff --git 
> a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> index e768274..3fe6d65 100644
> --- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.c
> @@ -24,16 +24,18 @@
>  #include <IndustryStandard/Vtd.h>
>  #include <Ppi/IoMmu.h>
>  #include <Ppi/VtdInfo.h>
> +#include <Ppi/EndOfPeiPhase.h>
> 
>  #include "IntelVTdPmrPei.h"
> 
>  #define  TOTAL_DMA_BUFFER_SIZE    SIZE_4MB
> +#define  TOTAL_DMA_BUFFER_SIZE_S3 SIZE_1MB
> 
>  EFI_ACPI_DMAR_HEADER              *mAcpiDmarTable;
>  VTD_INFO                          *mVTdInfo;
>  UINT64                            mEngineMask;
>  UINTN                             mDmaBufferBase;
> -UINTN                             mDmaBufferSize =
> TOTAL_DMA_BUFFER_SIZE;
> +UINTN                             mDmaBufferSize;
>  UINTN                             mDmaBufferCurrentTop;
>  UINTN                             mDmaBufferCurrentBottom;
> 
> @@ -544,6 +546,7 @@ InitDmaProtection (
>    }
>    ASSERT (DmaBufferSize == ALIGN_VALUE(DmaBufferSize, 
> MemoryAlignment));
>    *DmaBufferBase = (UINTN)AllocateAlignedPages 
> (EFI_SIZE_TO_PAGES(DmaBufferSize), MemoryAlignment);
> +  ASSERT (*DmaBufferBase != 0);
>    if (*DmaBufferBase == 0) {
>      DEBUG ((DEBUG_INFO, " InitDmaProtection : OutOfResource\n"));
>      return EFI_OUT_OF_RESOURCES;
> @@ -1105,6 +1108,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.
> 
>    @param  FileHandle  Handle of the file being invoked.
> @@ -1122,11 +1160,14 @@ IntelVTdPmrInitialize (
>    )
>  {
>    EFI_STATUS                  Status;
> +  EFI_BOOT_MODE               BootMode;
> 
>    if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT0) == 0) {
>      return EFI_UNSUPPORTED;
>    }
> 
> +  PeiServicesGetBootMode (&BootMode);
> +
>    Status = PeiServicesLocatePpi (
>               &gEdkiiVTdInfoPpiGuid,
>               0,
> @@ -1150,6 +1191,13 @@ IntelVTdPmrInitialize (
>    //
>    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
>    // Mark PEI memory to be DMA protected.
> @@ -1160,7 +1208,6 @@ IntelVTdPmrInitialize (
>    }
> 
>    DEBUG ((DEBUG_INFO, " DmaBufferBase : 0x%x\n", mDmaBufferBase));
> -  DEBUG ((DEBUG_INFO, " DmaBufferSize : 0x%x\n", mDmaBufferSize));
> 
>    mDmaBufferCurrentTop = mDmaBufferBase + mDmaBufferSize;
>    mDmaBufferCurrentBottom = mDmaBufferBase; @@ -1171,6 +1218,14 @@ 
> IntelVTdPmrInitialize (
>    Status = PeiServicesInstallPpi (&mIoMmuPpiList);
>    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;
>  }
> 
> diff --git 
> a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> index 86cd7d1..e1aa980 100644
> --- a/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
> @@ -46,6 +46,7 @@
>  [Ppis]
>    gEdkiiIoMmuPpiGuid            ## PRODUCES
>    gEdkiiVTdInfoPpiGuid          ## CONSUMES
> +  gEfiEndOfPeiSignalPpiGuid     ## CONSUMES
> 
>  [Pcd]
>    gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask   ##
> CONSUMES
> --
> 2.7.4.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel