PeiInterposerToSvidMap.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. MapInterposerToSvid (
  26. IN CONST EFI_PEI_SERVICES **PeiServices,
  27. IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
  28. IN VOID *Ppi
  29. )
  30. {
  31. INTERPOSER_TYPE InterposerType;
  32. EFI_PLATFORM_INFO *PlatformInfo;
  33. EFI_HOB_GUID_TYPE *GuidHob;
  34. UINT8 OriginalMcId = 0;
  35. UINT8 CurrentMcId = 0;
  36. UINT8 Socket = 0;
  37. UINT8 SvidValue = 0;
  38. MEM_SVID_MAP *MemSvidMap;
  39. UINTN Size;
  40. EFI_STATUS Status;
  41. INTERPOSER_MAP *MemInterposerMap = NULL;
  42. BOOLEAN InterposerPresent = FALSE;
  43. DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL;
  44. DEBUG ((EFI_D_INFO, "MapInterposerToSvid Entry\n"));
  45. Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi);
  46. if (EFI_ERROR (Status)) {
  47. ASSERT_EFI_ERROR (Status);
  48. return Status;
  49. }
  50. GuidHob = GetFirstGuidHob (&gEfiPlatformInfoGuid);
  51. if (GuidHob == NULL) {
  52. DEBUG ((EFI_D_INFO, "No Platform Info HOB Detected Exiting...\n"));
  53. return EFI_SUCCESS;
  54. } else {
  55. MemInterposerMap = (INTERPOSER_MAP *) PcdGetPtr (PcdMemInterposerMap);
  56. if (MemInterposerMap == NULL) {
  57. return EFI_SUCCESS;
  58. }
  59. Size = sizeof (MEM_SVID_MAP);
  60. DEBUG ((EFI_D_INFO, "Allocate memory for MemSvidMap PCD\n"));
  61. Status = (*PeiServices)->AllocatePool (PeiServices, Size, &MemSvidMap);
  62. ASSERT_EFI_ERROR (Status);
  63. ZeroMem (MemSvidMap, Size);
  64. PlatformInfo = GET_GUID_HOB_DATA (GuidHob);
  65. for (Socket = 0; Socket < MAX_SOCKET; Socket++) {
  66. InterposerType = PlatformInfo->InterposerType[Socket];
  67. for (CurrentMcId =0; CurrentMcId < MAX_IMC; CurrentMcId++) {
  68. if (InterposerType != InterposerUnknown) {
  69. OriginalMcId = MemInterposerMap->Interposer[InterposerType].MappedMcId[CurrentMcId];
  70. if (OriginalMcId < MAX_IMC) {
  71. Status = DynamicSiLibraryPpi->GetSvidMap (Socket, OriginalMcId, &SvidValue);
  72. if(Status == EFI_NOT_FOUND) {
  73. DEBUG ((DEBUG_ERROR, "PcdMemSrVidMap = NULL\n"));
  74. } else {
  75. DEBUG ((DEBUG_ERROR, "SocketId = %d, McId = %d, SvidValue = %d\n", Socket, OriginalMcId, SvidValue));
  76. }
  77. MemSvidMap->Socket[Socket].Mc[CurrentMcId] = SvidValue;
  78. InterposerPresent = TRUE;
  79. }
  80. DEBUG ((EFI_D_INFO, "Current MC id = %d, Original MC id = %d, SVID = %d\n", CurrentMcId, OriginalMcId, SvidValue));
  81. }
  82. }
  83. }
  84. }
  85. if (InterposerPresent) {
  86. PcdSetPtrS (PcdMemSrvidMap, &Size, (VOID *) MemSvidMap);
  87. } else {
  88. DEBUG ((EFI_D_INFO, "No Interposer Present....\n"));
  89. }
  90. DEBUG ((EFI_D_INFO, "MapInterposerToSvid Exit\n"));
  91. return EFI_SUCCESS;
  92. }
  93. EFI_PEI_NOTIFY_DESCRIPTOR mMapInterposerToSvidNotifyList = {
  94. (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  95. &gMemoryPolicyPpiGuid,
  96. MapInterposerToSvid
  97. };
  98. /**
  99. Initialize SVID PCD with Interposer mapping
  100. @param[in] FileHandle Not used.
  101. @param[in] PeiServices General purpose services available to every PEIM.
  102. @retval EFI_SUCCESS The function completes successfully
  103. **/
  104. EFI_STATUS
  105. EFIAPI
  106. InterposerToSvidMapEntry (
  107. IN EFI_PEI_FILE_HANDLE FileHandle,
  108. IN CONST EFI_PEI_SERVICES **PeiServices
  109. )
  110. {
  111. EFI_STATUS Status = EFI_SUCCESS;
  112. DEBUG ((EFI_D_INFO, "InterposerToSvidMap Entry\n"));
  113. Status = PeiServicesNotifyPpi (&mMapInterposerToSvidNotifyList);
  114. ASSERT_EFI_ERROR (Status);
  115. DEBUG ((EFI_D_INFO, "InterposerToSvidMap Exit\n"));
  116. return EFI_SUCCESS;;
  117. }