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