PeiPchPolicyUpdatePreMem.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /** @file
  2. This file is SampleCode of the library for Intel PCH PEI Policy initialization.
  3. Copyright (c) 2019 - 2020 Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "PeiPchPolicyUpdate.h"
  7. #include <Library/BaseMemoryLib.h>
  8. #include <Library/MemoryAllocationLib.h>
  9. #include <Library/HobLib.h>
  10. #include <Library/PchInfoLib.h>
  11. #include <Library/SataLib.h>
  12. #include <Library/PchPcrLib.h>
  13. #include <Library/PchPcieRpLib.h>
  14. #include <Library/DebugLib.h>
  15. #include <Library/PchPolicyLib.h>
  16. #include <Library/ConfigBlockLib.h>
  17. //
  18. // Sawtooth Peak
  19. // Single SPD EEPROM at 0xA2 serves both C0D0 and C1D0 (LPDDR is 1DPC only)
  20. //
  21. #define DIMM_SMB_SPD_P0C0D0_STP 0xA2
  22. #define DIMM_SMB_SPD_P0C0D1_STP 0xA0
  23. #define DIMM_SMB_SPD_P0C1D0_STP 0xA2
  24. #define DIMM_SMB_SPD_P0C1D1_STP 0xA0
  25. GLOBAL_REMOVE_IF_UNREFERENCED UINT8 mSmbusSTPRsvdAddresses[] = {
  26. DIMM_SMB_SPD_P0C0D0_STP,
  27. DIMM_SMB_SPD_P0C0D1_STP,
  28. DIMM_SMB_SPD_P0C1D0_STP,
  29. DIMM_SMB_SPD_P0C1D1_STP
  30. };
  31. /**
  32. This function performs PCH PEI Policy initialization.
  33. @param[in, out] SiPreMemPolicy The SI PREMEM Policy PPI instance
  34. @retval EFI_SUCCESS The PPI is installed and initialized.
  35. @retval EFI ERRORS The PPI is not successfully installed.
  36. @retval EFI_OUT_OF_RESOURCES Do not have enough resources to initialize the driver
  37. **/
  38. EFI_STATUS
  39. EFIAPI
  40. UpdatePeiPchPolicyPreMem (
  41. IN OUT SI_PREMEM_POLICY_PPI *SiPreMemPolicy
  42. )
  43. {
  44. EFI_STATUS Status;
  45. UINT8 *SmBusReservedTable;
  46. UINT8 SmBusReservedNum;
  47. PCH_GENERAL_PREMEM_CONFIG *PchGeneralPreMemConfig;
  48. PCH_TRACE_HUB_PREMEM_CONFIG *PchTraceHubPreMemConfig;
  49. PCH_SMBUS_PREMEM_CONFIG *SmbusPreMemConfig;
  50. PCH_LPC_PREMEM_CONFIG *LpcPreMemConfig;
  51. PCH_WDT_PREMEM_CONFIG *WatchDogPreMemConfig;
  52. PCH_DCI_PREMEM_CONFIG *DciPreMemConfig;
  53. PCH_PCIE_RP_PREMEM_CONFIG *PcieRpPreMemConfig;
  54. PCH_HDAUDIO_PREMEM_CONFIG *HdaPreMemConfig;
  55. PCH_ISH_PREMEM_CONFIG *IshPreMemConfig;
  56. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gPchGeneralPreMemConfigGuid, (VOID *) &PchGeneralPreMemConfig);
  57. ASSERT_EFI_ERROR (Status);
  58. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gPchTraceHubPreMemConfigGuid, (VOID *) &PchTraceHubPreMemConfig);
  59. ASSERT_EFI_ERROR (Status);
  60. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gSmbusPreMemConfigGuid, (VOID *) &SmbusPreMemConfig);
  61. ASSERT_EFI_ERROR (Status);
  62. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gLpcPreMemConfigGuid, (VOID *) &LpcPreMemConfig);
  63. ASSERT_EFI_ERROR (Status);
  64. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gWatchDogPreMemConfigGuid, (VOID *) &WatchDogPreMemConfig);
  65. ASSERT_EFI_ERROR (Status);
  66. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gDciPreMemConfigGuid, (VOID *) &DciPreMemConfig);
  67. ASSERT_EFI_ERROR (Status);
  68. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gPcieRpPreMemConfigGuid, (VOID *) &PcieRpPreMemConfig);
  69. ASSERT_EFI_ERROR (Status);
  70. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gHdAudioPreMemConfigGuid, (VOID *) &HdaPreMemConfig);
  71. ASSERT_EFI_ERROR (Status);
  72. Status = GetConfigBlock ((VOID *) SiPreMemPolicy, &gIshPreMemConfigGuid, (VOID *) &IshPreMemConfig);
  73. ASSERT_EFI_ERROR (Status);
  74. DciPreMemConfig->DciUsb3TypecUfpDbg = 2;
  75. PchTraceHubPreMemConfig->MemReg0Size = 3;
  76. PchTraceHubPreMemConfig->MemReg1Size = 3;
  77. //
  78. // SMBUS
  79. //
  80. SmbusPreMemConfig->Enable = TRUE;
  81. SmbusPreMemConfig->SmbAlertEnable = PcdGetBool (PcdSmbusAlertEnable);
  82. //
  83. // SMBUS reserved addresses
  84. //
  85. SmBusReservedTable = NULL;
  86. SmBusReservedNum = 0;
  87. SmbusPreMemConfig->SmbusIoBase = PcdGet16 (PcdSmbusBaseAddress);
  88. SmBusReservedTable = mSmbusSTPRsvdAddresses;
  89. SmBusReservedNum = sizeof (mSmbusSTPRsvdAddresses);
  90. if (SmBusReservedTable != NULL) {
  91. SmbusPreMemConfig->NumRsvdSmbusAddresses = SmBusReservedNum;
  92. CopyMem (
  93. SmbusPreMemConfig->RsvdSmbusAddressTable,
  94. SmBusReservedTable,
  95. SmBusReservedNum
  96. );
  97. }
  98. return Status;
  99. }