PeiPreMemSiliconPolicyNotifyLib.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /** @file
  2. This library implements constructor function to register notify call back
  3. when policy PPI installed.
  4. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.<BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include <PiPei.h>
  8. #include <Library/DebugLib.h>
  9. #include <Library/MemoryAllocationLib.h>
  10. #include <Library/PeiServicesLib.h>
  11. #include <Library/SiPolicyLib.h>
  12. #include <Library/ConfigBlockLib.h>
  13. /**
  14. Callback function to update policy when policy PPI installed.
  15. @param[in] PeiServices General purpose services available to every PEIM.
  16. @param[in] NotifyDescriptor The notification structure this PEIM registered on install.
  17. @param[in] Ppi The memory discovered PPI. Not used.
  18. @retval EFI_SUCCESS Succeeds.
  19. @retval Others Error code returned by sub-functions.
  20. **/
  21. EFI_STATUS
  22. EFIAPI
  23. SiPreMemPolicyPpiNotify (
  24. IN EFI_PEI_SERVICES **PeiServices,
  25. IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
  26. IN VOID *Ppi
  27. )
  28. {
  29. EFI_STATUS Status;
  30. SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi;
  31. SA_MISC_PEI_PREMEM_CONFIG *MiscPeiPreMemConfig;
  32. DEBUG ((DEBUG_INFO, "SiPreMemPolicyPpiNotify() Start\n"));
  33. Status = PeiServicesLocatePpi (
  34. &gSiPreMemPolicyPpiGuid,
  35. 0,
  36. NULL,
  37. (VOID **)&SiPreMemPolicyPpi
  38. );
  39. ASSERT_EFI_ERROR (Status);
  40. if (SiPreMemPolicyPpi != NULL) {
  41. //
  42. // Get requisite IP Config Blocks which needs to be used here
  43. //
  44. Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gSaMiscPeiPreMemConfigGuid, (VOID *) &MiscPeiPreMemConfig);
  45. ASSERT_EFI_ERROR (Status);
  46. //
  47. // Update SpdAddressTable policy when it is installed.
  48. //
  49. if (MiscPeiPreMemConfig != NULL) {
  50. MiscPeiPreMemConfig->SpdAddressTable[0] = PcdGet8 (PcdMrcSpdAddressTable0);
  51. DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[0] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[0]));
  52. MiscPeiPreMemConfig->SpdAddressTable[1] = PcdGet8 (PcdMrcSpdAddressTable1);
  53. DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[1] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[1]));
  54. MiscPeiPreMemConfig->SpdAddressTable[2] = PcdGet8 (PcdMrcSpdAddressTable2);
  55. DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[2] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[2]));
  56. MiscPeiPreMemConfig->SpdAddressTable[3] = PcdGet8 (PcdMrcSpdAddressTable3);
  57. DEBUG ((DEBUG_INFO, "MiscPeiPreMemConfig->SpdAddressTable[3] 0x%x\n", MiscPeiPreMemConfig->SpdAddressTable[3]));
  58. }
  59. }
  60. return Status;
  61. }
  62. static EFI_PEI_NOTIFY_DESCRIPTOR mSiPreMemPolicyPpiNotifyList[] = {
  63. {
  64. EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
  65. &gSiPreMemPolicyPpiGuid,
  66. SiPreMemPolicyPpiNotify
  67. }
  68. };
  69. /**
  70. The library constructuor.
  71. The function register a policy install notify callback.
  72. @param[in] ImageHandle The firmware allocated handle for the UEFI image.
  73. @param[in] SystemTable A pointer to the EFI system table.
  74. @retval EFI_SUCCESS The function always return EFI_SUCCESS for now.
  75. It will ASSERT on error for debug version.
  76. **/
  77. EFI_STATUS
  78. EFIAPI
  79. PeiPreMemSiliconPolicyNotifyLibConstructor (
  80. IN EFI_PEI_FILE_HANDLE FileHandle,
  81. IN CONST EFI_PEI_SERVICES **PeiServices
  82. )
  83. {
  84. EFI_STATUS Status;
  85. //
  86. // Register call back after PPI produced
  87. //
  88. Status = PeiServicesNotifyPpi (mSiPreMemPolicyPpiNotifyList);
  89. ASSERT_EFI_ERROR (Status);
  90. return EFI_SUCCESS;
  91. }