PeiInterposerToSvidMap.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /** @file
  2. File to update SVID values from Interposer mapping.
  3. @copyright
  4. Copyright 2018 - 2021 Intel Corporation.
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include <Uefi.h>
  8. #include <Library/BaseMemoryLib.h>
  9. #include <Library/BaseLib.h>
  10. #include <Library/PcdLib.h>
  11. #include <Library/DebugLib.h>
  12. #include <Library/PeiServicesLib.h>
  13. #include <Guid/PlatformInfo.h>
  14. #include <Library/HobLib.h>
  15. #include <Library/MemVrSvidMapLib.h>
  16. #include <Ppi/DynamicSiLibraryPpi.h>
  17. /**
  18. After Memory policy installation need to map SVID in case of an Interposer is present.
  19. @param[in] PeiServices General purpose services available to every PEIM.
  20. @param[in] NotifyDescriptor Notify that this module published.
  21. @param[in] Ppi PPI that was installed.
  22. @retval EFI_SUCCESS The function completed successfully.
  23. **/
  24. EFI_STATUS
  25. EFIAPI
  26. MapInterposerToSvid (
  27. IN EFI_PEI_SERVICES **PeiServices,
  28. IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
  29. IN VOID *Ppi
  30. )
  31. {
  32. INTERPOSER_TYPE InterposerType;
  33. EFI_PLATFORM_INFO *PlatformInfo;
  34. EFI_HOB_GUID_TYPE *GuidHob;
  35. UINT8 OriginalMcId = 0;
  36. UINT8 CurrentMcId = 0;
  37. UINT8 Socket = 0;
  38. UINT8 SvidValue = 0;
  39. MEM_SVID_MAP *MemSvidMap;
  40. UINTN Size;
  41. EFI_STATUS Status;
  42. INTERPOSER_MAP *MemInterposerMap = NULL;
  43. BOOLEAN InterposerPresent = FALSE;
  44. DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
  45. DEBUG ((EFI_D_INFO, "MapInterposerToSvid Entry\n"));
  46. Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, (VOID **) &DynamicSiLibraryPpi);
  47. if (EFI_ERROR (Status)) {
  48. ASSERT_EFI_ERROR (Status);
  49. return Status;
  50. }
  51. GuidHob = GetFirstGuidHob (&gEfiPlatformInfoGuid);
  52. if (GuidHob == NULL) {
  53. DEBUG ((EFI_D_INFO, "No Platform Info HOB Detected Exiting...\n"));
  54. return EFI_SUCCESS;
  55. } else {
  56. MemInterposerMap = (INTERPOSER_MAP *) PcdGetPtr (PcdMemInterposerMap);
  57. if (MemInterposerMap == NULL) {
  58. return EFI_SUCCESS;
  59. }
  60. Size = sizeof (MEM_SVID_MAP);
  61. DEBUG ((EFI_D_INFO, "Allocate memory for MemSvidMap PCD\n"));
  62. Status = PeiServicesAllocatePool (Size, (VOID **) &MemSvidMap);
  63. ASSERT_EFI_ERROR (Status);
  64. ZeroMem (MemSvidMap, Size);
  65. PlatformInfo = GET_GUID_HOB_DATA (GuidHob);
  66. for (Socket = 0; Socket < MAX_SOCKET; Socket++) {
  67. InterposerType = PlatformInfo->InterposerType[Socket];
  68. for (CurrentMcId =0; CurrentMcId < MAX_IMC; CurrentMcId++) {
  69. if (InterposerType != InterposerUnknown) {
  70. OriginalMcId = MemInterposerMap->Interposer[InterposerType].MappedMcId[CurrentMcId];
  71. if (OriginalMcId < MAX_IMC) {
  72. Status = DynamicSiLibraryPpi->GetSvidMap (Socket, OriginalMcId, &SvidValue);
  73. if(Status == EFI_NOT_FOUND) {
  74. DEBUG ((DEBUG_ERROR, "PcdMemSrVidMap = NULL\n"));
  75. } else {
  76. DEBUG ((DEBUG_ERROR, "SocketId = %d, McId = %d, SvidValue = %d\n", Socket, OriginalMcId, SvidValue));
  77. }
  78. MemSvidMap->Socket[Socket].Mc[CurrentMcId] = SvidValue;
  79. InterposerPresent = TRUE;
  80. }
  81. DEBUG ((EFI_D_INFO, "Current MC id = %d, Original MC id = %d, SVID = %d\n", CurrentMcId, OriginalMcId, SvidValue));
  82. }
  83. }
  84. }
  85. }
  86. if (InterposerPresent) {
  87. PcdSetPtrS (PcdMemSrvidMap, &Size, (VOID *) MemSvidMap);
  88. } else {
  89. DEBUG ((EFI_D_INFO, "No Interposer Present....\n"));
  90. }
  91. DEBUG ((EFI_D_INFO, "MapInterposerToSvid Exit\n"));
  92. return EFI_SUCCESS;
  93. }
  94. EFI_PEI_NOTIFY_DESCRIPTOR mMapInterposerToSvidNotifyList = {
  95. (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  96. &gMemoryPolicyPpiGuid,
  97. MapInterposerToSvid
  98. };
  99. /**
  100. Initialize SVID PCD with Interposer mapping
  101. @param[in] FileHandle Not used.
  102. @param[in] PeiServices General purpose services available to every PEIM.
  103. @retval EFI_SUCCESS The function completes successfully
  104. **/
  105. EFI_STATUS
  106. EFIAPI
  107. InterposerToSvidMapEntry (
  108. IN EFI_PEI_FILE_HANDLE FileHandle,
  109. IN CONST EFI_PEI_SERVICES **PeiServices
  110. )
  111. {
  112. EFI_STATUS Status = EFI_SUCCESS;
  113. DEBUG ((EFI_D_INFO, "InterposerToSvidMap Entry\n"));
  114. Status = PeiServicesNotifyPpi (&mMapInterposerToSvidNotifyList);
  115. ASSERT_EFI_ERROR (Status);
  116. DEBUG ((EFI_D_INFO, "InterposerToSvidMap Exit\n"));
  117. return EFI_SUCCESS;;
  118. }