CoreInfoHob.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /**@file
  2. Build up platform processor information.
  3. Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. //
  7. // The package level header files this module uses
  8. //
  9. #include <PiPei.h>
  10. //
  11. // The Library classes this module consumes
  12. //
  13. #include <Library/DebugLib.h>
  14. #include <Library/HobLib.h>
  15. #include <Library/BaseMemoryLib.h>
  16. #include <SmbiosProcessorSpecificData.h>
  17. #include <ProcessorSpecificHobData.h>
  18. #include <SiFiveU5MCCoreplex.h>
  19. #include <Library/SiFiveU54.h>
  20. /**
  21. Build up processor-specific HOB for U5MC Coreplex
  22. @param UniqueId Unique ID of this U5MC Coreplex processor
  23. @return EFI_SUCCESS The PEIM initialized successfully.
  24. **/
  25. STATIC
  26. EFI_STATUS
  27. EFIAPI
  28. CreateU5MCCoreplexProcessorSpecificDataHob (
  29. IN UINTN UniqueId
  30. )
  31. {
  32. EFI_STATUS Status;
  33. UINT32 HartIdNumber;
  34. RISC_V_PROCESSOR_SPECIFIC_HOB_DATA *GuidHobData;
  35. EFI_GUID *ParentCoreGuid;
  36. BOOLEAN MCSupport;
  37. DEBUG ((DEBUG_INFO, "Building U5 Coreplex processor information HOB\n"));
  38. HartIdNumber = 0;
  39. ParentCoreGuid = PcdGetPtr(PcdSiFiveU5MCCoreplexGuid);
  40. MCSupport = PcdGetBool (PcdE5MCSupported);
  41. if (MCSupport == TRUE) {
  42. Status = CreateU54E51CoreProcessorSpecificDataHob (ParentCoreGuid, UniqueId, HartIdNumber, FALSE, TRUE, &GuidHobData);
  43. if (EFI_ERROR (Status) && Status != EFI_UNSUPPORTED) {
  44. DEBUG ((DEBUG_ERROR, "Faile to build U5MC processor informatino HOB\n"));
  45. ASSERT (FALSE);
  46. } else {
  47. if (!EFI_ERROR (Status)) {
  48. DEBUG((DEBUG_INFO, "Support E5 Monitor core on U5 platform, HOB at address 0x%x\n", GuidHobData));
  49. }
  50. }
  51. HartIdNumber ++;
  52. }
  53. for (; HartIdNumber < (FixedPcdGet32 (PcdNumberofU5Cores) + (UINT32)MCSupport); HartIdNumber ++) {
  54. Status = CreateU54E51CoreProcessorSpecificDataHob (ParentCoreGuid, UniqueId, HartIdNumber, (HartIdNumber == FixedPcdGet32 (PcdBootHartId)), FALSE, &GuidHobData);
  55. if (EFI_ERROR (Status) && Status != EFI_UNSUPPORTED) {
  56. DEBUG ((DEBUG_ERROR, "Faile to build U5MC processor informatino HOB\n"));
  57. ASSERT (FALSE);
  58. } else {
  59. if (!EFI_ERROR (Status)) {
  60. DEBUG ((DEBUG_INFO, "Support U5 application core on U5 platform, HOB Data at address 0x%x\n", GuidHobData));
  61. }
  62. }
  63. }
  64. DEBUG ((DEBUG_INFO, "Support %d U5 application cores on U5 platform\n", HartIdNumber - (UINT32)MCSupport));
  65. return EFI_SUCCESS;
  66. }
  67. /**
  68. Function to build processor related SMBIOS information. RISC-V SMBIOS DXE driver collect
  69. this information and build SMBIOS Type4 and Type7 record.
  70. @param ProcessorUid Unique ID of physical processor which owns this core.
  71. @param SmbiosHobPtr Pointer to receive RISC_V_PROCESSOR_SMBIOS_HOB_DATA. The pointers
  72. maintained in this structure is only valid before memory is discovered.
  73. Access to those pointers after memory is installed will cause unexpected issues.
  74. @return EFI_SUCCESS The SMBIOS Hobs were created successfully.
  75. **/
  76. STATIC
  77. EFI_STATUS
  78. EFIAPI
  79. CreateU5MCProcessorSmbiosDataHob (
  80. IN UINTN ProcessorUid,
  81. OUT RISC_V_PROCESSOR_SMBIOS_HOB_DATA **SmbiosHobPtr
  82. )
  83. {
  84. EFI_GUID *GuidPtr;
  85. RISC_V_PROCESSOR_TYPE7_HOB_DATA L2CacheDataHob;
  86. RISC_V_PROCESSOR_SMBIOS_HOB_DATA SmbiosDataHob;
  87. RISC_V_PROCESSOR_TYPE4_HOB_DATA *ProcessorDataHobPtr;
  88. RISC_V_PROCESSOR_TYPE7_HOB_DATA *L1CacheDataHobPtr;
  89. RISC_V_PROCESSOR_TYPE7_HOB_DATA *L2CacheDataHobPtr;
  90. RISC_V_PROCESSOR_SMBIOS_HOB_DATA *SmbiosDataHobPtr;
  91. DEBUG ((DEBUG_INFO, "%a: Entry\n", __FUNCTION__));
  92. if (SmbiosHobPtr == NULL) {
  93. return EFI_INVALID_PARAMETER;
  94. }
  95. CreateU54SmbiosType7L1DataHob (ProcessorUid, &L1CacheDataHobPtr);
  96. CreateU54SmbiosType4DataHob (ProcessorUid, &ProcessorDataHobPtr);
  97. //
  98. // Build up SMBIOS type 7 L2 cache record.
  99. //
  100. ZeroMem((VOID *)&L2CacheDataHob, sizeof (RISC_V_PROCESSOR_TYPE7_HOB_DATA));
  101. L2CacheDataHob.ProcessorGuid = *((EFI_GUID *)PcdGetPtr (PcdSiFiveU5MCCoreplexGuid));
  102. L2CacheDataHob.ProcessorUid = ProcessorUid;
  103. L2CacheDataHob.SmbiosType7Cache.SocketDesignation = TO_BE_FILLED_BY_VENDOR;
  104. L2CacheDataHob.SmbiosType7Cache.CacheConfiguration = RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_2 | \
  105. RISC_V_CACHE_CONFIGURATION_LOCATION_EXTERNAL | \
  106. RISC_V_CACHE_CONFIGURATION_ENABLED | \
  107. RISC_V_CACHE_CONFIGURATION_MODE_UNKNOWN;
  108. L2CacheDataHob.SmbiosType7Cache.MaximumCacheSize = TO_BE_FILLED_BY_VENDOR;
  109. L2CacheDataHob.SmbiosType7Cache.InstalledSize = TO_BE_FILLED_BY_VENDOR;
  110. L2CacheDataHob.SmbiosType7Cache.SupportedSRAMType.Unknown = 1;
  111. L2CacheDataHob.SmbiosType7Cache.CurrentSRAMType.Unknown = 1;
  112. L2CacheDataHob.SmbiosType7Cache.CacheSpeed = TO_BE_FILLED_BY_VENDOR;
  113. L2CacheDataHob.SmbiosType7Cache.ErrorCorrectionType = TO_BE_FILLED_BY_VENDOR;
  114. L2CacheDataHob.SmbiosType7Cache.SystemCacheType = CacheTypeUnified;
  115. L2CacheDataHob.SmbiosType7Cache.Associativity = TO_BE_FILLED_BY_VENDOR;
  116. GuidPtr = (EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosType7GuidHobGuid);
  117. L2CacheDataHobPtr = (RISC_V_PROCESSOR_TYPE7_HOB_DATA *)BuildGuidDataHob (GuidPtr, (VOID *)&L2CacheDataHob, sizeof (RISC_V_PROCESSOR_TYPE7_HOB_DATA));
  118. if (L2CacheDataHobPtr == NULL) {
  119. DEBUG ((DEBUG_ERROR, "Fail to create GUID HOB of SiFive U5 MC Coreplex L2 cache RISC_V_PROCESSOR_TYPE7_HOB_DATA.\n"));
  120. ASSERT (FALSE);
  121. }
  122. ZeroMem((VOID *)&SmbiosDataHob, sizeof (RISC_V_PROCESSOR_SMBIOS_HOB_DATA));
  123. SmbiosDataHob.Processor = ProcessorDataHobPtr;
  124. SmbiosDataHob.L1Cache = L1CacheDataHobPtr;
  125. SmbiosDataHob.L2Cache = L2CacheDataHobPtr;
  126. SmbiosDataHob.L3Cache = NULL;
  127. GuidPtr = (EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosGuidHobGuid);
  128. SmbiosDataHobPtr = (RISC_V_PROCESSOR_SMBIOS_HOB_DATA *)BuildGuidDataHob (GuidPtr, (VOID *)&SmbiosDataHob, sizeof (RISC_V_PROCESSOR_SMBIOS_HOB_DATA));
  129. if (SmbiosDataHobPtr == NULL) {
  130. DEBUG ((DEBUG_ERROR, "Fail to create GUID HOB of SiFive U5MC Coreplex RISC_V_PROCESSOR_SMBIOS_HOB_DATA.\n"));
  131. ASSERT (FALSE);
  132. }
  133. *SmbiosHobPtr = SmbiosDataHobPtr;
  134. DEBUG ((DEBUG_INFO, "%a: Exit\n", __FUNCTION__));
  135. return EFI_SUCCESS;
  136. }
  137. /**
  138. Build processor and platform information for the U5 platform
  139. @return EFI_SUCCESS Status.
  140. **/
  141. EFI_STATUS
  142. BuildRiscVSmbiosHobs (
  143. VOID
  144. )
  145. {
  146. EFI_STATUS Status;
  147. RISC_V_PROCESSOR_SMBIOS_HOB_DATA *SmbiosHobPtr;
  148. Status = CreateU5MCCoreplexProcessorSpecificDataHob (0);
  149. if (EFI_ERROR (Status)) {
  150. ASSERT(FALSE);
  151. }
  152. Status = CreateU5MCProcessorSmbiosDataHob (0, &SmbiosHobPtr);
  153. if (EFI_ERROR (Status)) {
  154. ASSERT(FALSE);
  155. }
  156. DEBUG ((DEBUG_INFO, "U5 MC Coreplex SMBIOS DATA HOB at address 0x%x\n", SmbiosHobPtr));
  157. return EFI_SUCCESS;
  158. }