Reviewed by Qian, Yi <yi.q...@intel.com>

Thanks
Qian Yi

> -----Original Message-----
> From: Sun, Zailiang
> Sent: Monday, March 18, 2019 9:42 PM
> To: edk2-devel@lists.01.org
> Cc: Wei, David <david....@intel.com>; Qian, Yi <yi.q...@intel.com>; Kinney,
> Michael D <michael.d.kin...@intel.com>
> Subject: [PATCH] Vlv2TbltDevicePkg: SPI lock
> 
> https://vthsd.intel.com/hsd/tiano/tracker/default.aspx?tracker_id=221549
> 
> Set protection bit such as BCR, PR0, PR1 and HSFS bits in SPI registers.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Zailiang Sun <zailiang....@intel.com>
> Cc: David Wei <david....@intel.com>
> Cc: Yi Qian <yi.q...@intel.com>
> Cc: Michael Kinney <michael.d.kin...@intel.com>
> ---
>  Vlv2TbltDevicePkg/PlatformDxe/Platform.c      | 74 +++++++++++++++++--
>  Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf |  8 ++
>  2 files changed, 75 insertions(+), 7 deletions(-)
> 
> diff --git a/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
> b/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
> index ad18da5c61..02538fd6f0 100644
> --- a/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
> +++ b/Vlv2TbltDevicePkg/PlatformDxe/Platform.c
> @@ -51,7 +51,8 @@ Abstract:
>  #include <Library/PcdLib.h>
>  #include <Protocol/VariableLock.h>
>  #include <Library/PchPlatformLib.h>
> -
> +#include <Protocol/SmmBase2.h>
> +#include <Library/DebugLib.h>
> 
>  //
>  // VLV2 GPIO GROUP OFFSET
> @@ -441,6 +442,21 @@ SpiBiosProtectionFunction(
>    UINTN                             BiosFlaLower1;
>    UINTN                             BiosFlaLimit1;
> 
> +  EFI_SMM_BASE2_PROTOCOL            *SmmBase2;
> +  EFI_STATUS                        Status;
> +  UINT32                            Data32;
> +  UINT16                            Data16;
> +
> +  //
> +  // This feature requires smm stack. check whether smm stack is ready.
> + if not, just return  //  Status = gBS->LocateProtocol
> + (&gEfiSmmBase2ProtocolGuid, NULL, (VOID**) &SmmBase2);  if
> (EFI_ERROR
> + (Status)) {
> +    DEBUG((EFI_D_INFO, "smm stack is not ready\n"));
> +    return;
> +  } else {
> +    DEBUG((EFI_D_INFO, "smm stack is ready\n"));  }
> 
>    BiosFlaLower0 = PcdGet32(PcdFlashMicroCodeAddress)-
> PcdGet32(PcdBiosImageBase);
>    BiosFlaLimit0 = PcdGet32(PcdFlashMicroCodeSize)-1;
> @@ -461,6 +477,7 @@ SpiBiosProtectionFunction(
>                         );
>    SpiBase          = MmioRead32(mPciD31F0RegBase + R_PCH_LPC_SPI_BASE) &
> B_PCH_LPC_SPI_BASE_BAR;
> 
> +  DEBUG((EFI_D_INFO, "SpiBase = 0x%x\n", (UINTN)SpiBase));
>    //
>    //Set SMM_BWP, WPD and LE bit
>    //
> @@ -468,6 +485,16 @@ SpiBiosProtectionFunction(
>    MmioAnd32 ((UINTN) (SpiBase + R_PCH_SPI_BCR),
> (UINT8)(~B_PCH_SPI_BCR_BIOSWE));
>    MmioOr32 ((UINTN) (SpiBase + R_PCH_SPI_BCR), (UINT8)
> B_PCH_SPI_BCR_BLE);
> 
> +  Data32 = MmioRead32 (SpiBase + R_PCH_SPI_BCR);
> + S3BootScriptSaveMemWrite (
> +      S3BootScriptWidthUint32,
> +      (UINTN)(SpiBase + R_PCH_SPI_BCR),
> +      1,
> +      &Data32
> +  );
> +  DEBUG((EFI_D_INFO, "R_PCH_SPI_BCR \n"));  DEBUG((EFI_D_INFO,
> + "MmioRead32 (0x%x, 0x%x) = 0x%x \n", (UINTN) SpiBase, (UINT8)
> + R_PCH_SPI_BCR, (UINT32) Data32));
> +
>    //
>    //First check if FLOCKDN or PR0FLOCKDN is set. No action if either of them
> set already.
>    //
> @@ -487,6 +514,16 @@ SpiBiosProtectionFunction(
>      B_PCH_SPI_PR0_RPE|B_PCH_SPI_PR0_WPE|\
> 
> (B_PCH_SPI_PR0_PRB_MASK&(BiosFlaLower0>>12))|(B_PCH_SPI_PR0_PRL
> _MASK&(BiosFlaLimit0>>12)<<16));
> 
> +  Data32 = MmioRead32 (SpiBase + R_PCH_SPI_PR0);
> +  S3BootScriptSaveMemWrite (
> +    S3BootScriptWidthUint32,
> +    (UINTN)(SpiBase + R_PCH_SPI_PR0),
> +    1,
> +    &Data32
> +  );
> +  DEBUG((EFI_D_INFO, "R_PCH_SPI_PR0 \n"));  DEBUG((EFI_D_INFO,
> + "MmioRead32 (0x%x, 0x%x) = 0x%x \n", (UINTN) SpiBase, (UINT8)
> + R_PCH_SPI_PR0, (UINT32) Data32));
> +
>    //
>    //Set PR1
>    //
> @@ -494,12 +531,31 @@ SpiBiosProtectionFunction(
>    MmioOr32((UINTN)(SpiBase + R_PCH_SPI_PR1),
>      B_PCH_SPI_PR1_RPE|B_PCH_SPI_PR1_WPE|\
> 
> (B_PCH_SPI_PR1_PRB_MASK&(BiosFlaLower1>>12))|(B_PCH_SPI_PR1_PRL
> _MASK&(BiosFlaLimit1>>12)<<16));
> +  Data32 = MmioRead32 (SpiBase + R_PCH_SPI_PR1);
> +  S3BootScriptSaveMemWrite (
> +    S3BootScriptWidthUint32,
> +    (UINTN)(SpiBase + R_PCH_SPI_PR1),
> +    1,
> +    &Data32
> +  );
> +  DEBUG((EFI_D_INFO, "R_PCH_SPI_PR1 \n"));  DEBUG((EFI_D_INFO,
> + "MmioRead32 (0x%x, 0x%x) = 0x%x \n", (UINTN) SpiBase, (UINT8)
> + R_PCH_SPI_PR1, (UINT32) Data32));
> 
>    //
>    //Lock down PRx
>    //
>    MmioOr16 ((UINTN) (SpiBase + R_PCH_SPI_HSFS), (UINT16)
> (B_PCH_SPI_HSFS_FLOCKDN));
> 
> +  Data16 = MmioRead16 (SpiBase + R_PCH_SPI_HSFS);
> + S3BootScriptSaveMemWrite (
> +    S3BootScriptWidthUint16,
> +    (UINTN)(SpiBase + R_PCH_SPI_HSFS),
> +    1,
> +    &Data16
> +  );
> +  DEBUG((EFI_D_INFO, "R_PCH_SPI_HSFS \n"));  DEBUG((EFI_D_INFO,
> + "MmioRead16 (0x%x, 0x%x) = 0x%x \n", (UINTN) SpiBase, (UINT8)
> + R_PCH_SPI_HSFS, (UINT16) Data16));
> +
>    //
>    // Verify if it's really locked.
>    //
> @@ -783,6 +839,7 @@ InitializePlatform (
>    EFI_HANDLE                          Handle = NULL;
>    EFI_EVENT                           mEfiExitBootServicesEvent;
>    EFI_EVENT                           RtcEvent;
> +  EFI_EVENT                           mEndOfExeEvent;
>    VOID                                *RtcCallbackReg = NULL;
> 
>    mImageHandle = ImageHandle;
> @@ -879,12 +936,15 @@ InitializePlatform (
>    // Create a ReadyToBoot Event to run enable PR0/PR1 and lock
> down,unlock variable region
>    //
>    if(mSystemConfiguration.SpiRwProtect==1) {
> -    Status = EfiCreateEventReadyToBootEx (
> -               TPL_CALLBACK,
> -               SpiBiosProtectionFunction,
> -               NULL,
> -               &mReadyToBootEvent
> -               );
> +    Status = gBS->CreateEventEx (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_CALLBACK,
> +                  SpiBiosProtectionFunction,
> +                  NULL,
> +                  &gEfiEndOfDxeEventGroupGuid,
> +                  &mEndOfExeEvent
> +                  );
> +    DEBUG ((EFI_D_INFO, "Create a EndofExeEvent to run enable PRx and
> + lock down \n"));
>    }
>    //
>    // Create a ReadyToBoot Event to run the thermalzone init process diff 
> --git
> a/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
> b/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
> index f1e1d9e5f1..2d9a088bd9 100644
> --- a/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
> +++ b/Vlv2TbltDevicePkg/PlatformDxe/PlatformDxe.inf
> @@ -96,6 +96,7 @@
>    gEfiNormalSetupGuid
>    gEfiGlobalVariableGuid
>    gEfiEventExitBootServicesGuid
> +  gEfiEndOfDxeEventGroupGuid                                            ##
> SOMETIMES_CONSUMES ## Event
>    gEfiVlv2VariableGuid
>    gEfiSecureBootEnableDisableGuid
>    gSystemRtcTimeVariableGuid
> @@ -131,6 +132,7 @@
>    gIgdOpRegionProtocolGuid
>    gExitPmAuthProtocolGuid
>    gEdkiiVariableLockProtocolGuid
> +  gEfiSmmBase2ProtocolGuid                                              ##
> SOMETIMES_CONSUMES
> 
>  [Pcd.common]
>    gPlatformModuleTokenSpaceGuid.PcdPBTNDisableInterval
> @@ -144,6 +146,12 @@
>    gPlatformModuleTokenSpaceGuid.PcdFlashFvRecoverySize
>    gFspWrapperTokenSpaceGuid.PcdFlashFvFspBase
>    gPlatformModuleTokenSpaceGuid.PcdRtcPowerFailure
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase
> ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
> ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase
> ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
> ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase
> ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
> ## CONSUMES
> 
> 
>  [Depex]
> --
> 2.19.1.windows.1

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

Reply via email to