]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/MemoryConv.c
Fix some typo.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / DataHubSmBiosRecordsOnPiSmBiosThunk / MemoryConv.c
CommitLineData
024b1029 1/** @file\r
2 Routines that support Memory SubClass data records translation.\r
3 \r
4Copyright (c) 2009, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Thunk.h"\r
16\r
17/**\r
18 Field Filling Function for Memory SubClass record type 2 -- Physical Memory\r
19 Array.\r
20 \r
21 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
22 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
23 @param RecordData RecordData buffer will be filled.\r
24 @param RecordDataSize The size of RecordData buffer.\r
25 \r
26 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
27**/\r
28EFI_STATUS\r
29SmbiosFldMemoryType2 (\r
30 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
31 IN UINT32 Offset,\r
32 IN VOID *RecordData,\r
33 IN UINT32 RecordDataSize\r
34 )\r
35{\r
36 EFI_STATUS Status;\r
37 EFI_MEMORY_ARRAY_LOCATION_DATA *PhyMemArray;\r
38 FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *FrameworkPhyMemArray;\r
39 UINT32 MemoryCapacity;\r
40 UINT16 NumberMemoryDevices;\r
41 UINT16 Test16;\r
42\r
43 Status = EFI_SUCCESS;\r
44 PhyMemArray = (EFI_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
45 FrameworkPhyMemArray = (FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
46\r
47 *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Location)) = (UINT8) (PhyMemArray->MemoryArrayLocation);\r
48 *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Use)) = (UINT8) (PhyMemArray->MemoryArrayUse);\r
49 *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorCorrection)) = (UINT8) (PhyMemArray->MemoryErrorCorrection);\r
50\r
51 if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
52 MemoryCapacity = (UINT32) (((UINTN) PhyMemArray->MaximumMemoryCapacity.Value) << PhyMemArray->MaximumMemoryCapacity.Exponent);\r
53 NumberMemoryDevices = PhyMemArray->NumberMemoryDevices;\r
54 } else {\r
55 //\r
56 // Support EDk/Framework defined Data strucutre.\r
57 //\r
58 MemoryCapacity = FrameworkPhyMemArray->MaximumMemoryCapacity;\r
59 NumberMemoryDevices = FrameworkPhyMemArray->NumberMemoryDevices;\r
60 }\r
61\r
62 CopyMem (\r
63 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE16, MaximumCapacity),\r
64 &MemoryCapacity,\r
65 4\r
66 );\r
67\r
68 Test16 = 0xfffe;\r
69 CopyMem (\r
70 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorInformationHandle),\r
71 &Test16,\r
72 2\r
73 );\r
74 \r
75 CopyMem (\r
76 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, NumberOfMemoryDevices),\r
77 &NumberMemoryDevices,\r
78 2\r
79 );\r
80\r
81 return Status;\r
82}\r
83\r
84/**\r
85 Field Filling Function for Memory SubClass record type 3 -\r
86 - Memory Device: SMBIOS Type 17\r
87 \r
88 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
89 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
90 @param RecordData RecordData buffer will be filled.\r
91 @param RecordDataSize The size of RecordData buffer.\r
92 \r
93 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
94**/\r
95EFI_STATUS\r
96SmbiosFldMemoryType3 (\r
97 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
98 IN UINT32 Offset,\r
99 IN VOID *RecordData,\r
100 IN UINT32 RecordDataSize\r
101 )\r
102{\r
103 EFI_MEMORY_ARRAY_LINK_DATA *MemDevice;\r
104 FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
105 UINT64 MemoryDeviceSize;\r
106 BOOLEAN MemoryDeviceSizeUnitMega;\r
107 UINT16 MemoryDeviceSpeed;\r
108 UINT16 MemoryDeviceExponent;\r
109 UINT16 Test16;\r
110\r
111 MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
112 FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
113 MemoryDeviceSpeed = 0;\r
114 MemoryDeviceExponent = 0;\r
115\r
116 //\r
117 // Memory Device Locator\r
118 //\r
119 SmbiosFldString (\r
120 StructureNode,\r
121 OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceLocator),\r
122 &(MemDevice->MemoryDeviceLocator),\r
123 sizeof (STRING_REF)\r
124 );\r
125\r
126 //\r
127 // Memory Bank Locator\r
128 //\r
129 SmbiosFldString (\r
130 StructureNode,\r
131 OFFSET_OF (SMBIOS_TABLE_TYPE17, BankLocator),\r
132 &(MemDevice->MemoryBankLocator),\r
133 sizeof (STRING_REF)\r
134 );\r
135\r
136 //\r
137 // Memory Manufacturer\r
138 //\r
139 SmbiosFldString (\r
140 StructureNode,\r
141 OFFSET_OF (SMBIOS_TABLE_TYPE17, Manufacturer),\r
142 &(MemDevice->MemoryManufacturer),\r
143 sizeof (STRING_REF)\r
144 );\r
145\r
146 //\r
147 // Memory Serial Number\r
148 //\r
149 SmbiosFldString (\r
150 StructureNode,\r
151 OFFSET_OF (SMBIOS_TABLE_TYPE17, SerialNumber),\r
152 &(MemDevice->MemorySerialNumber),\r
153 sizeof (STRING_REF)\r
154 );\r
155\r
156 //\r
157 // Memory Asset Tag\r
158 //\r
159 SmbiosFldString (\r
160 StructureNode,\r
161 OFFSET_OF (SMBIOS_TABLE_TYPE17, AssetTag),\r
162 &(MemDevice->MemoryAssetTag),\r
163 sizeof (STRING_REF)\r
164 );\r
165\r
166 //\r
167 // Memory Part Number\r
168 //\r
169 SmbiosFldString (\r
170 StructureNode,\r
171 OFFSET_OF (SMBIOS_TABLE_TYPE17, PartNumber),\r
172 &(MemDevice->MemoryPartNumber),\r
173 sizeof (STRING_REF)\r
174 );\r
175\r
176 //\r
177 // Memory Array Link\r
178 //\r
179 SmbiosFldInterLink (\r
180 StructureNode,\r
181 (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryArrayHandle),\r
182 16, // SMBIOS type 16\r
183 &MemDevice->MemoryArrayLink,\r
184 &gEfiMemorySubClassGuid\r
185 );\r
186\r
187 //\r
188 // Set Memory Error Information Handle to Not supported\r
189 //\r
190 Test16 = 0xfffe;\r
191 CopyMem (\r
192 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryErrorInformationHandle),\r
193 &Test16,\r
194 sizeof (EFI_SMBIOS_HANDLE)\r
195 ); \r
196 \r
197 //\r
198 // Total width\r
199 //\r
200 CopyMem (\r
201 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TotalWidth),\r
202 &MemDevice->MemoryTotalWidth,\r
203 2\r
204 );\r
205\r
206 //\r
207 // Data Width\r
208 //\r
209 CopyMem (\r
210 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DataWidth),\r
211 &MemDevice->MemoryDataWidth,\r
212 2\r
213 );\r
214\r
215 //\r
216 // Device Size\r
217 //\r
218 if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
219 //\r
220 // Form Factor\r
221 //\r
222 CopyMem (\r
223 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
224 &MemDevice->MemoryFormFactor,\r
225 1\r
226 );\r
227 \r
228 //\r
229 // Device Set\r
230 //\r
231 CopyMem (\r
232 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
233 &MemDevice->MemoryDeviceSet,\r
234 1\r
235 );\r
236 \r
237 //\r
238 // Type\r
239 //\r
240 CopyMem (\r
241 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
242 &MemDevice->MemoryType,\r
243 1\r
244 );\r
245 \r
246 //\r
247 // Type Detail\r
248 //\r
249 CopyMem (\r
250 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
251 &MemDevice->MemoryTypeDetail,\r
252 2\r
253 );\r
254 \r
255 //\r
256 // Speed\r
257 //\r
258 MemoryDeviceSpeed = MemDevice->MemorySpeed.Value;\r
259 MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
260 while (MemoryDeviceExponent-- > 0) {\r
261 MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
262 }\r
263\r
264 CopyMem (\r
265 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
266 &MemoryDeviceSpeed,\r
267 2\r
268 );\r
269\r
270 MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
271 } else {\r
272 //\r
273 // Form Factor\r
274 //\r
275 CopyMem (\r
276 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
277 &FrameworkMemDevice->MemoryFormFactor,\r
278 1\r
279 );\r
280 \r
281 //\r
282 // Device Set\r
283 //\r
284 CopyMem (\r
285 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
286 &FrameworkMemDevice->MemoryDeviceSet,\r
287 1\r
288 );\r
289 \r
290 //\r
291 // Type\r
292 //\r
293 CopyMem (\r
294 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
295 &FrameworkMemDevice->MemoryType,\r
296 1\r
297 );\r
298 \r
299 //\r
300 // Type Detail\r
301 //\r
302 CopyMem (\r
303 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
304 &FrameworkMemDevice->MemoryTypeDetail,\r
305 2\r
306 );\r
307 \r
308 //\r
309 // Speed\r
310 //\r
311 CopyMem (\r
312 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
313 &FrameworkMemDevice->MemorySpeed,\r
314 2\r
315 );\r
316\r
317 MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
318 }\r
319\r
320 MemoryDeviceSizeUnitMega = FALSE;\r
321 MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
322 //\r
323 // kilo as unit\r
324 //\r
325 if (MemoryDeviceSize > 0xffff) {\r
326 MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
327 //\r
328 // Mega as unit\r
329 //\r
330 MemoryDeviceSizeUnitMega = TRUE;\r
331 }\r
332\r
333 MemoryDeviceSize = MemoryDeviceSize & 0x7fff;\r
bd1a4d18 334 if (MemoryDeviceSize != 0 && !MemoryDeviceSizeUnitMega) {\r
024b1029 335 MemoryDeviceSize |= 0x8000;\r
336 }\r
337\r
338 CopyMem (\r
339 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Size),\r
340 &MemoryDeviceSize,\r
341 2\r
342 );\r
343\r
344 return EFI_SUCCESS;\r
345}\r
346\r
347/**\r
348 Field Filling Function for Memory SubClass record type 3 -\r
349 - Memory Device: SMBIOS Type 6\r
350 \r
351 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
352 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
353 @param RecordData RecordData buffer will be filled.\r
354 @param RecordDataSize The size of RecordData buffer.\r
355 \r
356 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
357**/\r
358EFI_STATUS\r
359SmbiosFldSMBIOSType6 (\r
360 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
361 IN UINT32 Offset,\r
362 IN VOID *RecordData,\r
363 IN UINT32 RecordDataSize\r
364 )\r
365{\r
366 EFI_MEMORY_ARRAY_LINK_DATA *MemDevice;\r
367 UINT64 MemoryDeviceSize;\r
368 UINT8 MemSize;\r
369 UINT16 MemType;\r
370 UINT8 MemSpeed;\r
371 FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
372 UINT16 MemoryDeviceSpeed;\r
373 UINT16 MemoryDeviceExponent;\r
374\r
375 MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
376 FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
377 MemoryDeviceExponent = 0;\r
378\r
379 //\r
380 // Memory Device Locator\r
381 //\r
382 SmbiosFldString (\r
383 StructureNode,\r
384 OFFSET_OF (SMBIOS_TABLE_TYPE6, SocketDesignation),\r
385 &(MemDevice->MemoryDeviceLocator),\r
386 2\r
387 );\r
388 \r
389 if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
390 MemoryDeviceSpeed = MemDevice->MemorySpeed.Value;\r
391 MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
392 while (MemoryDeviceExponent-- > 0) {\r
393 MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
394 }\r
395 MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
396 } else {\r
397 //\r
398 // Support EDk/Framework defined Data strucutre.\r
399 //\r
400 MemoryDeviceSpeed = FrameworkMemDevice->MemorySpeed;\r
401 MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
402 }\r
403 \r
404 if (MemoryDeviceSpeed == 0) {\r
405 MemSpeed = 0;\r
406 } else {\r
407 //\r
408 // Memory speed is in ns unit\r
409 //\r
410 MemSpeed = (UINT8)(1000 / MemoryDeviceSpeed);\r
411 }\r
412\r
413 CopyMem (\r
414 (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentSpeed),\r
415 &MemSpeed,\r
416 1\r
417 );\r
418\r
419\r
420 //\r
421 // Device Size\r
422 //\r
423 MemSize = 0;\r
424 if (MemoryDeviceSize == 0) {\r
425 MemSize = 0x7F;\r
426 } else {\r
427 MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 21);\r
428 while (MemoryDeviceSize != 0) {\r
429 MemSize++;\r
430 MemoryDeviceSize = RShiftU64(MemoryDeviceSize,1);\r
431 }\r
432 }\r
433\r
434 CopyMem (\r
435 (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, InstalledSize),\r
436 &MemSize,\r
437 1\r
438 );\r
439\r
440 CopyMem (\r
441 (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, EnabledSize),\r
442 &MemSize,\r
443 1\r
444 );\r
445\r
446 //\r
447 // According SMBIOS SPEC Type 6 definition\r
448 //\r
449 MemType = 0;\r
450 if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
451 if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
452 MemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
453 MemType |= 1<<8;\r
454 }\r
455 \r
456 if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
457 MemType |= 1<<7;\r
458 }\r
459 \r
460 if (MemDevice->MemoryType == EfiMemoryTypeSdram) {\r
461 MemType |= 1<<10;\r
462 }\r
463 \r
464 if (MemDevice->MemoryTypeDetail.Edo == 1) {\r
465 MemType |= 1<<4;\r
466 }\r
467 \r
468 if (MemDevice->MemoryTypeDetail.FastPaged == 1) {\r
469 MemType |= 1<<3;\r
470 }\r
471 } else {\r
472 //\r
473 // Support EDk/Framework defined Data strucutre.\r
474 //\r
475 if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
476 FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
477 MemType |= 1<<8;\r
478 }\r
479 \r
480 if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
481 MemType |= 1<<7;\r
482 }\r
483 \r
484 if (FrameworkMemDevice->MemoryType == EfiMemoryTypeSdram) {\r
485 MemType |= 1<<10;\r
486 }\r
487 \r
488 if (FrameworkMemDevice->MemoryTypeDetail.Edo == 1) {\r
489 MemType |= 1<<4;\r
490 }\r
491 \r
492 if (FrameworkMemDevice->MemoryTypeDetail.FastPaged == 1) {\r
493 MemType |= 1<<3;\r
494 }\r
495 }\r
496 //\r
497 // Form Factor\r
498 //\r
499 CopyMem (\r
500 (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentMemoryType),\r
501 &MemType,\r
502 2\r
503 );\r
504\r
505\r
506 return EFI_SUCCESS;\r
507}\r
508\r
509/**\r
510 Field Filling Function for Memory SubClass record type 4\r
511 -- Memory Array Mapped Address: SMBIOS Type 19\r
512 \r
513 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
514 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
515 @param RecordData RecordData buffer will be filled.\r
516 @param RecordDataSize The size of RecordData buffer.\r
517 \r
518 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
519**/\r
520EFI_STATUS\r
521SmbiosFldMemoryType4 (\r
522 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
523 IN UINT32 Offset,\r
524 IN VOID *RecordData,\r
525 IN UINT32 RecordDataSize\r
526 )\r
527{\r
528 EFI_MEMORY_ARRAY_START_ADDRESS_DATA *Masa;\r
529 EFI_PHYSICAL_ADDRESS TempData;\r
530\r
531 Masa = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) RecordData;\r
532\r
533 //\r
534 // Starting Address\r
535 //\r
536 TempData = RShiftU64 (Masa->MemoryArrayStartAddress, 10);\r
537 CopyMem (\r
538 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, StartingAddress),\r
539 &TempData,\r
540 4\r
541 );\r
542\r
543 //\r
544 // Ending Address\r
545 //\r
546 TempData = RShiftU64 (Masa->MemoryArrayEndAddress, 10);\r
547 CopyMem (\r
548 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, EndingAddress),\r
549 &TempData,\r
550 4\r
551 );\r
552\r
553 //\r
554 // Partition Width\r
555 //\r
556 CopyMem (\r
557 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, PartitionWidth),\r
558 &Masa->MemoryArrayPartitionWidth,\r
559 1\r
560 );\r
561\r
562 //\r
563 // Physical Memory Array Link\r
564 //\r
565 return SmbiosFldInterLink (\r
566 StructureNode,\r
567 (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE19, MemoryArrayHandle),\r
568 16, // SMBIOS type 16\r
569 &Masa->PhysicalMemoryArrayLink,\r
570 &gEfiMemorySubClassGuid\r
571 );\r
572\r
573}\r
574\r
575/**\r
576 Field Filling Function for Memory SubClass record type 5\r
577 -- Memory Device Mapped Address: SMBIOS Type 20\r
578 \r
579 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
580 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
581 @param RecordData RecordData buffer will be filled.\r
582 @param RecordDataSize The size of RecordData buffer.\r
583 \r
584 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
585**/\r
586EFI_STATUS\r
587SmbiosFldMemoryType5 (\r
588 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
589 IN UINT32 Offset,\r
590 IN VOID *RecordData,\r
591 IN UINT32 RecordDataSize\r
592 )\r
593{\r
594 EFI_MEMORY_DEVICE_START_ADDRESS_DATA *Mdsa;\r
595 EFI_PHYSICAL_ADDRESS TempData;\r
596\r
597 Mdsa = (EFI_MEMORY_DEVICE_START_ADDRESS_DATA *) RecordData;\r
598\r
599 //\r
600 // Starting Address\r
601 //\r
602 TempData = RShiftU64 (Mdsa->MemoryDeviceStartAddress, 10);\r
603 CopyMem (\r
604 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, StartingAddress),\r
605 &TempData,\r
606 4\r
607 );\r
608\r
609 //\r
610 // Ending Address\r
611 //\r
612 TempData = RShiftU64 (Mdsa->MemoryDeviceEndAddress, 10);\r
613 CopyMem (\r
614 (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, EndingAddress),\r
615 &TempData,\r
616 4\r
617 );\r
618\r
619 //\r
620 // Memory Device Link\r
621 //\r
622 SmbiosFldInterLink (\r
623 StructureNode,\r
624 (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryDeviceHandle),\r
625 17, // SMBIOS type 17\r
626 &Mdsa->PhysicalMemoryDeviceLink,\r
627 &gEfiMemorySubClassGuid\r
628 );\r
629\r
630 //\r
631 // Memory Array Mapped Address Link\r
632 //\r
633 SmbiosFldInterLink (\r
634 StructureNode,\r
635 (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryArrayMappedAddressHandle),\r
636 19, // SMBIOS type 19\r
637 &Mdsa->PhysicalMemoryArrayLink,\r
638 &gEfiMemorySubClassGuid\r
639 );\r
640\r
641 //\r
642 // Memory Device Partition Row Position\r
643 //\r
644 *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, PartitionRowPosition)) = (UINT8) Mdsa->MemoryDevicePartitionRowPosition;\r
645\r
646 //\r
647 // Memory Device Interleave Position\r
648 //\r
649 *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavePosition)) = (UINT8) Mdsa->MemoryDeviceInterleavePosition;\r
650\r
651 //\r
652 // Memory Device Interleave Data Depth\r
653 //\r
654 *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavedDataDepth)) = (UINT8) Mdsa->MemoryDeviceInterleaveDataDepth;\r
655\r
656 return EFI_SUCCESS;\r
657}\r
658\r
659/**\r
660 Field Filling Function for Memory SubClass record type 6\r
661 -- Memory Channel Type: SMBIOS Type 37\r
662 \r
663 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
664 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
665 @param RecordData RecordData buffer will be filled.\r
666 @param RecordDataSize The size of RecordData buffer.\r
667 \r
668 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
669**/\r
670EFI_STATUS\r
671SmbiosFldMemoryType6 (\r
672 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
673 IN UINT32 Offset,\r
674 IN VOID *RecordData,\r
675 IN UINT32 RecordDataSize\r
676 )\r
677{\r
678 EFI_MEMORY_CHANNEL_TYPE_DATA *McTa;\r
679 EFI_STATUS Status;\r
680\r
681 McTa = (EFI_MEMORY_CHANNEL_TYPE_DATA *) RecordData;\r
682\r
683 *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, ChannelType)) = (UINT8) (McTa->MemoryChannelType);\r
684\r
685 *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MaximumChannelLoad)) = (UINT8) (McTa->MemoryChannelMaximumLoad);\r
686\r
687 *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDeviceCount)) = (UINT8) (McTa->MemoryChannelDeviceCount);\r
688\r
689 //\r
690 // Update the length field\r
691 // Multiple device loads are filled through SmbiosFldMemoryType7\r
692 //\r
693 StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
694 sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount);\r
695 Status = SmbiosEnlargeStructureBuffer(\r
696 StructureNode, \r
697 StructureNode->Structure->Length,\r
698 StructureNode->StructureSize,\r
699 StructureNode->StructureSize + sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount\r
700 );\r
701 return Status;\r
702}\r
703\r
704/**\r
705 Field Filling Function for Memory SubClass record type 7\r
706 -- Memory Channel Device: SMBIOS Type 37\r
707 \r
708 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
709 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
710 @param RecordData RecordData buffer will be filled.\r
711 @param RecordDataSize The size of RecordData buffer.\r
712 \r
713 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
714**/\r
715EFI_STATUS\r
716SmbiosFldMemoryType7 (\r
717 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
718 IN UINT32 Offset,\r
719 IN VOID *RecordData,\r
720 IN UINT32 RecordDataSize\r
721 )\r
722{\r
723 EFI_MEMORY_CHANNEL_DEVICE_DATA *Mcdd;\r
724 UINTN DeviceLoadOffset;\r
725 UINTN DeviceLoadHandleOffset;\r
726\r
727 Mcdd = (EFI_MEMORY_CHANNEL_DEVICE_DATA *) RecordData;\r
728\r
729 if (Mcdd->DeviceId < 1) {\r
730 return EFI_INVALID_PARAMETER;\r
731 }\r
732\r
733 DeviceLoadOffset = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[0]) + 3 * (Mcdd->DeviceId - 1);\r
734 DeviceLoadHandleOffset = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[1]) + 3 * (Mcdd->DeviceId - 1);\r
735\r
736 *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + DeviceLoadOffset) = (UINT8) (Mcdd->MemoryChannelDeviceLoad);\r
737\r
738 //\r
739 // Memory Device Handle Link\r
740 //\r
741 return SmbiosFldInterLink (\r
742 StructureNode,\r
743 (UINT16) DeviceLoadHandleOffset,\r
744 17, // Smbios type 17 -- Physical Memory Device\r
745 &Mcdd->DeviceLink,\r
746 &gEfiMemorySubClassGuid\r
747 );\r
748\r
749}\r
750\r
751/**\r
752 Field Filling Function for Memory SubClass record type 8\r
753 -- Memory Controller information: SMBIOS Type 5\r
754 \r
755 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
756 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
757 @param RecordData RecordData buffer will be filled.\r
758 @param RecordDataSize The size of RecordData buffer.\r
759 \r
760 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
761**/\r
762EFI_STATUS\r
763SmbiosFldMemoryType8 (\r
764 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
765 IN UINT32 Offset,\r
766 IN VOID *RecordData,\r
767 IN UINT32 RecordDataSize\r
768 )\r
769{\r
770 EFI_MEMORY_CONTROLLER_INFORMATION_DATA *MemoryController;\r
771 UINT32 NewMinimalSize;\r
772 UINT16 Count;\r
773 EFI_INTER_LINK_DATA *Link; \r
774 EFI_STATUS Status;\r
775 \r
776 NewMinimalSize = 0;\r
777\r
778 //\r
779 // There is an update from EFI_MEMORY_CONTROLLER_INFORMATION to\r
780 // EFI_MEMORY_CONTROLLER_INFORMATION_DATA. Multiple MemoryModuleConfig\r
781 // handles are filled.\r
782 //\r
783 MemoryController = (EFI_MEMORY_CONTROLLER_INFORMATION_DATA *)RecordData;\r
784 \r
785 //\r
786 // ErrorDetectingMethod\r
787 //\r
788 CopyMem (\r
789 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrDetectMethod),\r
790 &MemoryController->ErrorDetectingMethod,\r
791 1\r
792 ); \r
793\r
794 //\r
795 // ErrorCorrectingCapability\r
796 //\r
797 CopyMem (\r
798 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrCorrectCapability),\r
799 &MemoryController->ErrorCorrectingCapability,\r
800 1\r
801 );\r
802 \r
803 //\r
804 // MemorySupportedInterleave\r
805 //\r
806 CopyMem (\r
807 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportInterleave),\r
808 &MemoryController->MemorySupportedInterleave,\r
809 1\r
810 );\r
811 \r
812 //\r
813 // MemoryCurrentInterleave\r
814 //\r
815 CopyMem (\r
816 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, CurrentInterleave),\r
817 &MemoryController->MemoryCurrentInterleave,\r
818 1\r
819 ); \r
820 \r
821 //\r
822 // MaxMemoryModuleSize\r
823 //\r
824 CopyMem (\r
825 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MaxMemoryModuleSize),\r
826 &MemoryController->MaxMemoryModuleSize,\r
827 1\r
828 );\r
829 \r
830 //\r
831 // MemorySpeedType\r
832 //\r
833 CopyMem (\r
834 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportSpeed),\r
835 &MemoryController->MemorySpeedType,\r
836 2\r
837 ); \r
838\r
839 //\r
840 // MemorySupportedType\r
841 //\r
842 CopyMem (\r
843 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportMemoryType),\r
844 &MemoryController->MemorySupportedType,\r
845 2\r
846 ); \r
847\r
848 //\r
849 // MemoryModuleVoltage\r
850 //\r
851 CopyMem (\r
852 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleVoltage),\r
853 &MemoryController->MemoryModuleVoltage,\r
854 1\r
855 ); \r
856\r
857 //\r
858 // NumberofMemorySlot\r
859 //\r
860 CopyMem (\r
861 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, AssociatedMemorySlotNum),\r
862 &MemoryController->NumberofMemorySlot,\r
863 1\r
864 ); \r
865 \r
866 if (MemoryController->NumberofMemorySlot == 0) {\r
867 //\r
868 // EnabledCorrectingCapability\r
869 //\r
870 CopyMem (\r
871 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles),\r
872 &MemoryController->EnabledCorrectingCapability,\r
873 1\r
874 ); \r
875 } else {\r
876 //\r
877 // Memory module configuration handles exist\r
878 // we should enlarge smbios entry buffer from minimal size\r
879 //\r
880 NewMinimalSize = (MemoryController->NumberofMemorySlot) * sizeof(UINT16) + StructureNode->StructureSize;\r
881 StructureNode->Structure->Length = (UINT8) (NewMinimalSize - 2);\r
882 Status = SmbiosEnlargeStructureBuffer (StructureNode, StructureNode->Structure->Length, StructureNode->StructureSize, NewMinimalSize);\r
883 ASSERT_EFI_ERROR (Status);\r
884 \r
885 //\r
886 // MemoryModuleConfigHandles\r
887 //\r
888 for (Count = 0, Link = MemoryController->MemoryModuleConfig; \r
889 Count < MemoryController->NumberofMemorySlot; \r
890 Count++, Link++) {\r
891 SmbiosFldInterLink (\r
892 StructureNode,\r
893 (UINT16) (OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + Count * sizeof(UINT16)),\r
894 6, // SMBIOS type 6\r
895 Link,\r
896 &gEfiMemorySubClassGuid\r
897 );\r
898 }\r
899 \r
900 //\r
901 // EnabledCorrectingCapability\r
902 // \r
903 CopyMem (\r
904 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + (MemoryController->NumberofMemorySlot) * sizeof(UINT16),\r
905 &MemoryController->EnabledCorrectingCapability,\r
906 1\r
907 );\r
908 }\r
909 \r
910 return EFI_SUCCESS;\r
911}\r
912\r
913/**\r
914 Field Filling Function for Memory SubClass record type \r
915 -- Memory 32 Bit Error Information: SMBIOS Type 18\r
916 \r
917 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
918 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
919 @param RecordData RecordData buffer will be filled.\r
920 @param RecordDataSize The size of RecordData buffer.\r
921 \r
922 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
923**/\r
924EFI_STATUS\r
925SmbiosFldMemoryType9 (\r
926 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
927 IN UINT32 Offset,\r
928 IN VOID *RecordData,\r
929 IN UINT32 RecordDataSize\r
930 )\r
931{\r
932 EFI_MEMORY_32BIT_ERROR_INFORMATION *MemoryInfo;\r
933 \r
934 MemoryInfo = (EFI_MEMORY_32BIT_ERROR_INFORMATION *)RecordData;\r
935 \r
936 //\r
937 // MemoryErrorType\r
938 //\r
939 CopyMem (\r
940 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorType),\r
941 &MemoryInfo->MemoryErrorType,\r
942 1\r
943 );\r
944 \r
945 //\r
946 // MemoryErrorGranularity\r
947 //\r
948 CopyMem (\r
949 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorGranularity),\r
950 &MemoryInfo->MemoryErrorGranularity,\r
951 1\r
952 ); \r
953\r
954 //\r
955 // MemoryErrorOperation\r
956 //\r
957 CopyMem (\r
958 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorOperation),\r
959 &MemoryInfo->MemoryErrorOperation,\r
960 1\r
961 ); \r
962\r
963 //\r
964 // VendorSyndrome\r
965 //\r
966 CopyMem (\r
967 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, VendorSyndrome),\r
968 &MemoryInfo->VendorSyndrome,\r
969 4\r
970 ); \r
971\r
972 //\r
973 // MemoryArrayErrorAddress\r
974 //\r
975 CopyMem (\r
976 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, MemoryArrayErrorAddress),\r
977 &MemoryInfo->MemoryArrayErrorAddress,\r
978 4\r
979 ); \r
980\r
981 //\r
982 // DeviceErrorAddress\r
983 //\r
984 CopyMem (\r
985 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, DeviceErrorAddress),\r
986 &MemoryInfo->DeviceErrorAddress,\r
987 4\r
988 ); \r
989\r
990 //\r
991 // DeviceErrorResolution\r
992 //\r
993 CopyMem (\r
994 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorResolution),\r
995 &MemoryInfo->DeviceErrorResolution,\r
996 4\r
997 ); \r
998 \r
999 return EFI_SUCCESS; \r
1000}\r
1001\r
1002/**\r
1003 Field Filling Function for Memory SubClass record type \r
1004 -- Memory 64 Bit Error Information: SMBIOS Type 33\r
1005 \r
1006 @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
1007 @param Offset Offset of SMBIOS record which RecordData will be filled.\r
1008 @param RecordData RecordData buffer will be filled.\r
1009 @param RecordDataSize The size of RecordData buffer.\r
1010 \r
1011 @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
1012**/\r
1013EFI_STATUS\r
1014SmbiosFldMemoryType10 (\r
1015 IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
1016 IN UINT32 Offset,\r
1017 IN VOID *RecordData,\r
1018 IN UINT32 RecordDataSize\r
1019 )\r
1020{\r
1021 EFI_MEMORY_64BIT_ERROR_INFORMATION *MemoryInfo;\r
1022 \r
1023 MemoryInfo = (EFI_MEMORY_64BIT_ERROR_INFORMATION *)RecordData;\r
1024 \r
1025 //\r
1026 // MemoryErrorType\r
1027 //\r
1028 CopyMem (\r
1029 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorType),\r
1030 &MemoryInfo->MemoryErrorType,\r
1031 1\r
1032 );\r
1033 \r
1034 //\r
1035 // MemoryErrorGranularity\r
1036 //\r
1037 CopyMem (\r
1038 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorGranularity),\r
1039 &MemoryInfo->MemoryErrorGranularity,\r
1040 1\r
1041 ); \r
1042\r
1043 //\r
1044 // MemoryErrorOperation\r
1045 //\r
1046 CopyMem (\r
1047 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorOperation),\r
1048 &MemoryInfo->MemoryErrorOperation,\r
1049 1\r
1050 ); \r
1051\r
1052 //\r
1053 // VendorSyndrome\r
1054 //\r
1055 CopyMem (\r
1056 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, VendorSyndrome),\r
1057 &MemoryInfo->VendorSyndrome,\r
1058 4\r
1059 ); \r
1060\r
1061 //\r
1062 // MemoryArrayErrorAddress\r
1063 //\r
1064 CopyMem (\r
1065 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, MemoryArrayErrorAddress),\r
1066 &MemoryInfo->MemoryArrayErrorAddress,\r
1067 8\r
1068 ); \r
1069\r
1070 //\r
1071 // DeviceErrorAddress\r
1072 //\r
1073 CopyMem (\r
1074 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, DeviceErrorAddress),\r
1075 &MemoryInfo->DeviceErrorAddress,\r
1076 8\r
1077 ); \r
1078\r
1079 //\r
1080 // DeviceErrorResolution\r
1081 //\r
1082 CopyMem (\r
1083 (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorResolution),\r
1084 &MemoryInfo->DeviceErrorResolution,\r
1085 4\r
1086 ); \r
1087 \r
1088 return EFI_SUCCESS; \r
1089}\r