RiscVSmbiosDxe.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. /** @file
  2. RISC-V generic SMBIOS DXE driver to build up SMBIOS type 4, type 7 and type 44 records.
  3. Copyright (c) 2019-2022, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "RiscVSmbiosDxe.h"
  7. STATIC EFI_SMBIOS_PROTOCOL *mSmbios;
  8. /**
  9. This function builds SMBIOS type 7 record according to
  10. the given RISC_V_PROCESSOR_TYPE7_HOB_DATA.
  11. @param Type4HobData Pointer to RISC_V_PROCESSOR_TYPE4_HOB_DATA
  12. @param Type7DataHob Pointer to RISC_V_PROCESSOR_TYPE7_HOB_DATA
  13. @param SmbiosHandle Pointer to SMBIOS_HANDLE
  14. @retval EFI_STATUS
  15. **/
  16. STATIC
  17. EFI_STATUS
  18. BuildSmbiosType7 (
  19. IN RISC_V_PROCESSOR_TYPE4_HOB_DATA *Type4HobData,
  20. IN RISC_V_PROCESSOR_TYPE7_HOB_DATA *Type7DataHob,
  21. OUT SMBIOS_HANDLE *SmbiosHandle
  22. )
  23. {
  24. EFI_STATUS Status;
  25. SMBIOS_HANDLE Handle;
  26. if (!CompareGuid (&Type4HobData->ProcessorGuid, &Type7DataHob->ProcessorGuid) ||
  27. (Type4HobData->ProcessorUid != Type7DataHob->ProcessorUid))
  28. {
  29. return EFI_INVALID_PARAMETER;
  30. }
  31. Handle = SMBIOS_HANDLE_PI_RESERVED;
  32. Type7DataHob->SmbiosType7Cache.Hdr.Type = SMBIOS_TYPE_CACHE_INFORMATION;
  33. Type7DataHob->SmbiosType7Cache.Hdr.Length = sizeof (SMBIOS_TABLE_TYPE7);
  34. Type7DataHob->SmbiosType7Cache.Hdr.Handle = 0;
  35. Type7DataHob->EndingZero = 0;
  36. Status = mSmbios->Add (mSmbios, NULL, &Handle, &Type7DataHob->SmbiosType7Cache.Hdr);
  37. if (EFI_ERROR (Status)) {
  38. DEBUG ((DEBUG_ERROR, "%a: Fail to add SMBIOS Type 7\n", __FUNCTION__));
  39. return Status;
  40. }
  41. DEBUG ((DEBUG_INFO, "SMBIOS Type 7 was added. SMBIOS Handle: 0x%x\n", Handle));
  42. DEBUG ((DEBUG_VERBOSE, " Cache belone to processor GUID: %g\n", &Type7DataHob->ProcessorGuid));
  43. DEBUG ((DEBUG_VERBOSE, " Cache belone processor UID: %d\n", Type7DataHob->ProcessorUid));
  44. DEBUG ((DEBUG_VERBOSE, " ==============================\n"));
  45. DEBUG ((DEBUG_VERBOSE, " Socket Designation: %d\n", Type7DataHob->SmbiosType7Cache.SocketDesignation));
  46. DEBUG ((DEBUG_VERBOSE, " Cache Configuration: 0x%x\n", Type7DataHob->SmbiosType7Cache.CacheConfiguration));
  47. DEBUG ((DEBUG_VERBOSE, " Maximum Cache Size: 0x%x\n", Type7DataHob->SmbiosType7Cache.MaximumCacheSize));
  48. DEBUG ((DEBUG_VERBOSE, " Installed Size: 0x%x\n", Type7DataHob->SmbiosType7Cache.InstalledSize));
  49. DEBUG ((DEBUG_VERBOSE, " Supported SRAM Type: 0x%x\n", Type7DataHob->SmbiosType7Cache.SupportedSRAMType));
  50. DEBUG ((DEBUG_VERBOSE, " Current SRAMT ype: 0x%x\n", Type7DataHob->SmbiosType7Cache.CurrentSRAMType));
  51. DEBUG ((DEBUG_VERBOSE, " Cache Speed: 0x%x\n", Type7DataHob->SmbiosType7Cache.CacheSpeed));
  52. DEBUG ((DEBUG_VERBOSE, " Error Correction Type: 0x%x\n", Type7DataHob->SmbiosType7Cache.ErrorCorrectionType));
  53. DEBUG ((DEBUG_VERBOSE, " System Cache Type: 0x%x\n", Type7DataHob->SmbiosType7Cache.SystemCacheType));
  54. DEBUG ((DEBUG_VERBOSE, " Associativity: 0x%x\n", Type7DataHob->SmbiosType7Cache.Associativity));
  55. *SmbiosHandle = Handle;
  56. return EFI_SUCCESS;
  57. }
  58. /**
  59. This function builds SMBIOS type 4 record according to
  60. the given RISC_V_PROCESSOR_TYPE4_HOB_DATA.
  61. @param Type4HobData Pointer to RISC_V_PROCESSOR_TYPE4_HOB_DATA
  62. @param SmbiosHandle Pointer to SMBIOS_HANDLE
  63. @retval EFI_STATUS
  64. **/
  65. STATIC
  66. EFI_STATUS
  67. BuildSmbiosType4 (
  68. IN RISC_V_PROCESSOR_TYPE4_HOB_DATA *Type4HobData,
  69. OUT SMBIOS_HANDLE *SmbiosHandle
  70. )
  71. {
  72. EFI_HOB_GUID_TYPE *GuidHob;
  73. RISC_V_PROCESSOR_TYPE7_HOB_DATA *Type7HobData;
  74. SMBIOS_HANDLE Cache;
  75. SMBIOS_HANDLE Processor;
  76. EFI_STATUS Status;
  77. DEBUG ((DEBUG_INFO, "Building Type 4.\n"));
  78. DEBUG ((DEBUG_INFO, " Processor GUID: %g\n", &Type4HobData->ProcessorGuid));
  79. DEBUG ((DEBUG_INFO, " Processor UUID: %d\n", Type4HobData->ProcessorUid));
  80. Type4HobData->SmbiosType4Processor.L1CacheHandle = RISC_V_CACHE_INFO_NOT_PROVIDED;
  81. Type4HobData->SmbiosType4Processor.L2CacheHandle = RISC_V_CACHE_INFO_NOT_PROVIDED;
  82. Type4HobData->SmbiosType4Processor.L3CacheHandle = RISC_V_CACHE_INFO_NOT_PROVIDED;
  83. GuidHob = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob ((EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosType7GuidHobGuid));
  84. if (GuidHob == NULL) {
  85. DEBUG ((DEBUG_ERROR, "No RISC-V SMBIOS Type7 data HOB found.\n"));
  86. return EFI_NOT_FOUND;
  87. }
  88. //
  89. // Go through each RISC_V_PROCESSOR_TYPE4_HOB_DATA for multiple processors.
  90. //
  91. do {
  92. Type7HobData = (RISC_V_PROCESSOR_TYPE7_HOB_DATA *)GET_GUID_HOB_DATA (GuidHob);
  93. Status = BuildSmbiosType7 (Type4HobData, Type7HobData, &Cache);
  94. if (EFI_ERROR (Status)) {
  95. return Status;
  96. }
  97. if ((Type7HobData->SmbiosType7Cache.SystemCacheType & RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_MASK) ==
  98. RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_1)
  99. {
  100. Type4HobData->SmbiosType4Processor.L1CacheHandle = Cache;
  101. } else if ((Type7HobData->SmbiosType7Cache.SystemCacheType & RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_MASK) ==
  102. RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_2)
  103. {
  104. Type4HobData->SmbiosType4Processor.L2CacheHandle = Cache;
  105. } else if ((Type7HobData->SmbiosType7Cache.SystemCacheType & RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_MASK) ==
  106. RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_3)
  107. {
  108. Type4HobData->SmbiosType4Processor.L3CacheHandle = Cache;
  109. } else {
  110. DEBUG ((DEBUG_ERROR, "Improper cache level of SMBIOS handle %d\n", Cache));
  111. }
  112. GuidHob = GetNextGuidHob ((EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosType7GuidHobGuid), GET_NEXT_HOB (GuidHob));
  113. } while (GuidHob != NULL);
  114. //
  115. // Build SMBIOS Type 4 record
  116. //
  117. Processor = SMBIOS_HANDLE_PI_RESERVED;
  118. Type4HobData->SmbiosType4Processor.Hdr.Type = SMBIOS_TYPE_PROCESSOR_INFORMATION;
  119. Type4HobData->SmbiosType4Processor.Hdr.Length = sizeof (SMBIOS_TABLE_TYPE4);
  120. Type4HobData->SmbiosType4Processor.Hdr.Handle = 0;
  121. Type4HobData->EndingZero = 0;
  122. Status = mSmbios->Add (mSmbios, NULL, &Processor, &Type4HobData->SmbiosType4Processor.Hdr);
  123. if (EFI_ERROR (Status)) {
  124. DEBUG ((DEBUG_ERROR, "Fail to add SMBIOS Type 4\n"));
  125. return Status;
  126. }
  127. DEBUG ((DEBUG_INFO, "SMBIOS Type 4 was added. SMBIOS Handle: 0x%x\n", Processor));
  128. DEBUG ((DEBUG_VERBOSE, " Socket StringID: %d\n", Type4HobData->SmbiosType4Processor.Socket));
  129. DEBUG ((DEBUG_VERBOSE, " Processor Type: 0x%x\n", Type4HobData->SmbiosType4Processor.ProcessorType));
  130. DEBUG ((DEBUG_VERBOSE, " Processor Family: 0x%x\n", Type4HobData->SmbiosType4Processor.ProcessorFamily));
  131. DEBUG ((DEBUG_VERBOSE, " Processor Manufacture StringID: %d\n", Type4HobData->SmbiosType4Processor.ProcessorManufacturer));
  132. DEBUG ((
  133. DEBUG_VERBOSE,
  134. " Processor Id: 0x%x:0x%x\n", \
  135. Type4HobData->SmbiosType4Processor.ProcessorId.Signature,
  136. Type4HobData->SmbiosType4Processor.ProcessorId.FeatureFlags
  137. ));
  138. DEBUG ((DEBUG_VERBOSE, " Processor Version StringID: %d\n", Type4HobData->SmbiosType4Processor.ProcessorVersion));
  139. DEBUG ((DEBUG_VERBOSE, " Voltage: 0x%x\n", Type4HobData->SmbiosType4Processor.Voltage));
  140. DEBUG ((DEBUG_VERBOSE, " External Clock: 0x%x\n", Type4HobData->SmbiosType4Processor.ExternalClock));
  141. DEBUG ((DEBUG_VERBOSE, " Max Speed: 0x%x\n", Type4HobData->SmbiosType4Processor.MaxSpeed));
  142. DEBUG ((DEBUG_VERBOSE, " Current Speed: 0x%x\n", Type4HobData->SmbiosType4Processor.CurrentSpeed));
  143. DEBUG ((DEBUG_VERBOSE, " Status: 0x%x\n", Type4HobData->SmbiosType4Processor.Status));
  144. DEBUG ((DEBUG_VERBOSE, " ProcessorUpgrade: 0x%x\n", Type4HobData->SmbiosType4Processor.ProcessorUpgrade));
  145. DEBUG ((DEBUG_VERBOSE, " L1 Cache Handle: 0x%x\n", Type4HobData->SmbiosType4Processor.L1CacheHandle));
  146. DEBUG ((DEBUG_VERBOSE, " L2 Cache Handle: 0x%x\n", Type4HobData->SmbiosType4Processor.L2CacheHandle));
  147. DEBUG ((DEBUG_VERBOSE, " L3 Cache Handle: 0x%x\n", Type4HobData->SmbiosType4Processor.L3CacheHandle));
  148. DEBUG ((DEBUG_VERBOSE, " Serial Number StringID: %d\n", Type4HobData->SmbiosType4Processor.SerialNumber));
  149. DEBUG ((DEBUG_VERBOSE, " Asset Tag StringID: %d\n", Type4HobData->SmbiosType4Processor.AssetTag));
  150. DEBUG ((DEBUG_VERBOSE, " Part Number StringID: %d\n", Type4HobData->SmbiosType4Processor.PartNumber));
  151. DEBUG ((DEBUG_VERBOSE, " Core Count: %d\n", Type4HobData->SmbiosType4Processor.CoreCount));
  152. DEBUG ((DEBUG_VERBOSE, " Enabled CoreCount: %d\n", Type4HobData->SmbiosType4Processor.EnabledCoreCount));
  153. DEBUG ((DEBUG_VERBOSE, " Thread Count: %d\n", Type4HobData->SmbiosType4Processor.ThreadCount));
  154. DEBUG ((DEBUG_VERBOSE, " Processor Characteristics: 0x%x\n", Type4HobData->SmbiosType4Processor.ProcessorCharacteristics));
  155. DEBUG ((DEBUG_VERBOSE, " Processor Family2: 0x%x\n", Type4HobData->SmbiosType4Processor.ProcessorFamily2));
  156. DEBUG ((DEBUG_VERBOSE, " Core Count 2: %d\n", Type4HobData->SmbiosType4Processor.CoreCount2));
  157. DEBUG ((DEBUG_VERBOSE, " Enabled CoreCount : %d\n", Type4HobData->SmbiosType4Processor.EnabledCoreCount2));
  158. DEBUG ((DEBUG_VERBOSE, " Thread Count 2: %d\n", Type4HobData->SmbiosType4Processor.ThreadCount2));
  159. *SmbiosHandle = Processor;
  160. return EFI_SUCCESS;
  161. }
  162. /**
  163. This function builds SMBIOS type 44 record according..
  164. @param Type4HobData Pointer to RISC_V_PROCESSOR_TYPE4_HOB_DATA
  165. @param Type4Handle SMBIOS handle of type 4
  166. @retval EFI_STATUS
  167. **/
  168. EFI_STATUS
  169. BuildSmbiosType44 (
  170. IN RISC_V_PROCESSOR_TYPE4_HOB_DATA *Type4HobData,
  171. IN SMBIOS_HANDLE Type4Handle
  172. )
  173. {
  174. EFI_HOB_GUID_TYPE *GuidHob;
  175. RISC_V_PROCESSOR_SPECIFIC_HOB_DATA *ProcessorSpecificData;
  176. SMBIOS_HANDLE RiscVType44;
  177. SMBIOS_TABLE_TYPE44 *Type44Ptr;
  178. EFI_STATUS Status;
  179. DEBUG ((DEBUG_INFO, "Building Type 44 for...\n"));
  180. DEBUG ((DEBUG_VERBOSE, " Processor GUID: %g\n", &Type4HobData->ProcessorGuid));
  181. DEBUG ((DEBUG_VERBOSE, " Processor UUID: %d\n", Type4HobData->ProcessorUid));
  182. GuidHob = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob ((EFI_GUID *)PcdGetPtr (PcdProcessorSpecificDataGuidHobGuid));
  183. if (GuidHob == NULL) {
  184. DEBUG ((DEBUG_ERROR, "No RISC_V_PROCESSOR_SPECIFIC_HOB_DATA found.\n"));
  185. return EFI_NOT_FOUND;
  186. }
  187. //
  188. // Go through each RISC_V_PROCESSOR_SPECIFIC_HOB_DATA for multiple cores.
  189. //
  190. do {
  191. ProcessorSpecificData = (RISC_V_PROCESSOR_SPECIFIC_HOB_DATA *)GET_GUID_HOB_DATA (GuidHob);
  192. if (!CompareGuid (&ProcessorSpecificData->ParentProcessorGuid, &Type4HobData->ProcessorGuid) ||
  193. (ProcessorSpecificData->ParentProcessorUid != Type4HobData->ProcessorUid))
  194. {
  195. GuidHob = GetNextGuidHob ((EFI_GUID *)PcdGetPtr (PcdProcessorSpecificDataGuidHobGuid), GET_NEXT_HOB (GuidHob));
  196. if (GuidHob == NULL) {
  197. break;
  198. }
  199. continue;
  200. }
  201. DEBUG ((DEBUG_VERBOSE, "================================\n"));
  202. DEBUG ((DEBUG_VERBOSE, "Core GUID: %g\n", &ProcessorSpecificData->CoreGuid));
  203. Type44Ptr = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE44) + sizeof (SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA) + 2); // Two ending zero.
  204. if (Type44Ptr == NULL) {
  205. return EFI_NOT_FOUND;
  206. }
  207. Type44Ptr->Hdr.Type = SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION;
  208. Type44Ptr->Hdr.Handle = 0;
  209. Type44Ptr->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE44) + sizeof (SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA);
  210. Type44Ptr->RefHandle = Type4Handle;
  211. Type44Ptr->ProcessorSpecificBlock.Length = sizeof (SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA);
  212. Type44Ptr->ProcessorSpecificBlock.ProcessorArchType = Type4HobData->SmbiosType4Processor.ProcessorFamily2 -
  213. ProcessorFamilyRiscvRV32 + \
  214. ProcessorSpecificBlockArchTypeRiscVRV32;
  215. CopyMem ((VOID *)(Type44Ptr + 1), (VOID *)&ProcessorSpecificData->ProcessorSpecificData, sizeof (SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA));
  216. DEBUG ((DEBUG_VERBOSE, "Core type: %d\n", Type44Ptr->ProcessorSpecificBlock.ProcessorArchType));
  217. DEBUG ((DEBUG_VERBOSE, " HartId = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->HartId.Value64_L));
  218. DEBUG ((DEBUG_VERBOSE, " Is Boot Hart? = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->BootHartId));
  219. DEBUG ((DEBUG_VERBOSE, " PrivilegeModeSupported = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->PrivilegeModeSupported));
  220. DEBUG ((DEBUG_VERBOSE, " MModeExcepDelegation = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->MModeExcepDelegation.Value64_L));
  221. DEBUG ((DEBUG_VERBOSE, " MModeInterruptDelegation = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->MModeInterruptDelegation.Value64_L));
  222. DEBUG ((DEBUG_VERBOSE, " HartXlen = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->HartXlen));
  223. DEBUG ((DEBUG_VERBOSE, " MachineModeXlen = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->MachineModeXlen));
  224. DEBUG ((DEBUG_VERBOSE, " SupervisorModeXlen = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->SupervisorModeXlen));
  225. DEBUG ((DEBUG_VERBOSE, " UserModeXlen = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->UserModeXlen));
  226. DEBUG ((DEBUG_VERBOSE, " InstSetSupported = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->InstSetSupported));
  227. DEBUG ((DEBUG_VERBOSE, " MachineVendorId = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->MachineVendorId.Value64_L));
  228. DEBUG ((DEBUG_VERBOSE, " MachineArchId = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->MachineArchId.Value64_L));
  229. DEBUG ((DEBUG_VERBOSE, " MachineImplId = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->MachineImplId.Value64_L));
  230. //
  231. // Add to SMBIOS table.
  232. //
  233. RiscVType44 = SMBIOS_HANDLE_PI_RESERVED;
  234. Status = mSmbios->Add (mSmbios, NULL, &RiscVType44, &Type44Ptr->Hdr);
  235. if (EFI_ERROR (Status)) {
  236. DEBUG ((DEBUG_ERROR, "Fail to add SMBIOS Type 44\n"));
  237. return Status;
  238. }
  239. DEBUG ((DEBUG_INFO, "SMBIOS Type 44 was added. SMBIOS Handle: 0x%x\n", RiscVType44));
  240. GuidHob = GetNextGuidHob ((EFI_GUID *)PcdGetPtr (PcdProcessorSpecificDataGuidHobGuid), GET_NEXT_HOB (GuidHob));
  241. } while (GuidHob != NULL);
  242. return EFI_SUCCESS;
  243. }
  244. /**
  245. Entry point of RISC-V SMBIOS builder.
  246. @param ImageHandle Image handle this driver.
  247. @param SystemTable Pointer to the System Table.
  248. @retval EFI_SUCCESS Thread can be successfully created
  249. @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure
  250. @retval EFI_DEVICE_ERROR Cannot create the thread
  251. **/
  252. EFI_STATUS
  253. EFIAPI
  254. RiscVSmbiosBuilderEntry (
  255. IN EFI_HANDLE ImageHandle,
  256. IN EFI_SYSTEM_TABLE *SystemTable
  257. )
  258. {
  259. EFI_STATUS Status;
  260. EFI_HOB_GUID_TYPE *GuidHob;
  261. RISC_V_PROCESSOR_TYPE4_HOB_DATA *Type4HobData;
  262. SMBIOS_HANDLE Processor;
  263. DEBUG ((DEBUG_INFO, "%a: entry\n", __FUNCTION__));
  264. Status = gBS->LocateProtocol (
  265. &gEfiSmbiosProtocolGuid,
  266. NULL,
  267. (VOID **)&mSmbios
  268. );
  269. if (EFI_ERROR (Status)) {
  270. DEBUG ((DEBUG_ERROR, "Locate SMBIOS Protocol fail\n"));
  271. return Status;
  272. }
  273. GuidHob = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob ((EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosType4GuidHobGuid));
  274. if (GuidHob == NULL) {
  275. DEBUG ((DEBUG_ERROR, "No RISC-V SMBIOS information found.\n"));
  276. return EFI_NOT_FOUND;
  277. }
  278. Type4HobData = (RISC_V_PROCESSOR_TYPE4_HOB_DATA *)GET_GUID_HOB_DATA (GuidHob);
  279. Status = EFI_NOT_FOUND;
  280. //
  281. // Go through each RISC_V_PROCESSOR_TYPE4_HOB_DATA for multiple processors.
  282. //
  283. do {
  284. Status = BuildSmbiosType4 (Type4HobData, &Processor);
  285. if (EFI_ERROR (Status)) {
  286. DEBUG ((DEBUG_ERROR, "No RISC-V SMBIOS type 4 created.\n"));
  287. ASSERT (FALSE);
  288. }
  289. Status = BuildSmbiosType44 (Type4HobData, Processor);
  290. if (EFI_ERROR (Status)) {
  291. DEBUG ((DEBUG_ERROR, "No RISC-V SMBIOS type 44 found.\n"));
  292. ASSERT (FALSE);
  293. }
  294. GuidHob = GetNextGuidHob ((EFI_GUID *)PcdGetPtr (PcdProcessorSmbiosType4GuidHobGuid), GET_NEXT_HOB (GuidHob));
  295. } while (GuidHob != NULL);
  296. DEBUG ((DEBUG_INFO, "%a: exit\n", __FUNCTION__));
  297. return Status;
  298. }