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