/** @file This library implements constructor function to register notify call back when policy PPI installed. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include /** Callback function to update policy when policy PPI installed. @param[in] PeiServices General purpose services available to every PEIM. @param[in] NotifyDescriptor The notification structure this PEIM registered on install. @param[in] Ppi The memory discovered PPI. Not used. @retval EFI_SUCCESS Succeeds. @retval Others Error code returned by sub-functions. **/ EFI_STATUS EFIAPI SiPreMemPolicyPpiNotify ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi ) { EFI_STATUS Status; SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi; SA_MISC_PEI_PREMEM_CONFIG *MiscPeiPreMemConfig; DEBUG ((DEBUG_INFO, "SiPreMemPolicyPpiNotify() Start\n")); Status = PeiServicesLocatePpi ( &gSiPreMemPolicyPpiGuid, 0, NULL, (VOID **)&SiPreMemPolicyPpi ); ASSERT_EFI_ERROR (Status); if (SiPreMemPolicyPpi != NULL) { // // Get requisite IP Config Blocks which needs to be used here // Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gSaMiscPeiPreMemConfigGuid, (VOID *) &MiscPeiPreMemConfig); ASSERT_EFI_ERROR (Status); // // Update SpdAddressTable policy when it is installed. // if (MiscPeiPreMemConfig != NULL) { MiscPeiPreMemConfig->SpdAddressTable[0] = PcdGet8 (PcdMrcSpdAddressTable0); DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[0] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[0])); MiscPeiPreMemConfig->SpdAddressTable[1] = PcdGet8 (PcdMrcSpdAddressTable1); DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[1] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[1])); MiscPeiPreMemConfig->SpdAddressTable[2] = PcdGet8 (PcdMrcSpdAddressTable2); DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[2] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[2])); MiscPeiPreMemConfig->SpdAddressTable[3] = PcdGet8 (PcdMrcSpdAddressTable3); DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[3] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[3])); } } return Status; } static EFI_PEI_NOTIFY_DESCRIPTOR mSiPreMemPolicyPpiNotifyList[] = { { EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, &gSiPreMemPolicyPpiGuid, SiPreMemPolicyPpiNotify } }; /** The library constructuor. The function register a policy install notify callback. @param[in] ImageHandle The firmware allocated handle for the UEFI image. @param[in] SystemTable A pointer to the EFI system table. @retval EFI_SUCCESS The function always return EFI_SUCCESS for now. It will ASSERT on error for debug version. **/ EFI_STATUS EFIAPI PeiPreMemSiliconPolicyNotifyLibConstructor ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { EFI_STATUS Status; // // Register call back after PPI produced // Status = PeiServicesNotifyPpi (mSiPreMemPolicyPpiNotifyList); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; }