/** @file This is the Common driver that initializes the Intel System Agent. Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SaInit.h" #include #include #include #include /// /// Global Variables /// GLOBAL_REMOVE_IF_UNREFERENCED SA_CONFIG_HOB *mSaConfigHob; BOOLEAN mSkipPamLock = FALSE; /* Intel(R) Core Processor Skylake BWG version 0.4.0 18.6 System Agent Configuration Locking For reliable operation and security, System BIOS must set the following bits: 1. For all modern Intel processors, Intel strongly recommends that BIOS should set the D_LCK bit. Set B0:D0:F0.R088h [4] = 1b to lock down SMRAM space. BaseAddr values for mSaSecurityRegisters that uses PciExpressBaseAddress will be initialized at Runtime inside function CpuPcieInitPolicy(). */ GLOBAL_REMOVE_IF_UNREFERENCED BOOT_SCRIPT_REGISTER_SETTING mSaSecurityRegisters[] = { {0, R_SA_SMRAMC, 0xFFFFFFFF, BIT4} }; /** SystemAgent Initialization Common Function. @retval EFI_SUCCESS - Always. **/ VOID SaInitEntryPoint ( VOID ) { HOST_BRIDGE_DATA_HOB *HostBridgeDataHob; /// /// Get Host Bridge Data HOB /// HostBridgeDataHob = NULL; HostBridgeDataHob = (HOST_BRIDGE_DATA_HOB *) GetFirstGuidHob (&gHostBridgeDataHobGuid); if (HostBridgeDataHob != NULL) { mSkipPamLock = HostBridgeDataHob->SkipPamLock; } return; } /** This function does SA security lock **/ VOID SaSecurityLock ( VOID ) { UINT8 Index; UINT64 BaseAddress; UINT32 RegOffset; UINT32 Data32And; UINT32 Data32Or; /// /// 17.2 System Agent Security Lock configuration /// DEBUG ((DEBUG_INFO, "DXE SaSecurityLock\n")); for (Index = 0; Index < (sizeof (mSaSecurityRegisters) / sizeof (BOOT_SCRIPT_REGISTER_SETTING)); Index++) { BaseAddress = mSaSecurityRegisters[Index].BaseAddr; RegOffset = mSaSecurityRegisters[Index].Offset; Data32And = mSaSecurityRegisters[Index].AndMask; Data32Or = mSaSecurityRegisters[Index].OrMask; if (RegOffset == R_SA_SMRAMC) { /// /// SMRAMC LOCK must use CF8/CFC access /// PciCf8Or8 (PCI_CF8_LIB_ADDRESS (SA_MC_BUS, SA_MC_DEV, SA_MC_FUN, R_SA_SMRAMC), (UINT8) Data32Or); BaseAddress = S3_BOOT_SCRIPT_LIB_PCI_ADDRESS (SA_MC_BUS, SA_MC_DEV, SA_MC_FUN, R_SA_SMRAMC); S3BootScriptSavePciCfgReadWrite ( S3BootScriptWidthUint8, (UINTN) BaseAddress, &Data32Or, &Data32And ); } } } /** This function performs SA Security locking in EndOfDxe callback @retval EFI_SUCCESS - Security lock has done @retval EFI_UNSUPPORTED - Security lock not done successfully **/ EFI_STATUS SaSecurityInit ( VOID ) { UINT8 Index; for (Index = 0; Index < (sizeof (mSaSecurityRegisters) / sizeof (BOOT_SCRIPT_REGISTER_SETTING)); Index++) { if (mSaSecurityRegisters[Index].BaseAddr != PcdGet64 (PcdMchBaseAddress)) { mSaSecurityRegisters[Index].BaseAddr = PcdGet64 (PcdSiPciExpressBaseAddress); } } SaSecurityLock (); return EFI_SUCCESS; }