--- /dev/null
+/**@file\r
+ Common filling functions used in translating Datahub's record\r
+ to PI SMBIOS's record.\r
+ \r
+Copyright (c) 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+ Field Filling Function for Cache SubClass record type 5&6 -- Cache SRAM type.\r
+ Offset is mandatory\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldCacheType5 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_CACHE_SRAM_TYPE_DATA SramData;\r
+ UINT32 Temp;\r
+\r
+ SramData = *(EFI_CACHE_SRAM_TYPE_DATA*)RecordData;\r
+\r
+ //\r
+ // Swap two fields because of inconsistency between smbios and datahub specs\r
+ //\r
+ Temp = SramData.Asynchronous;\r
+ SramData.Asynchronous = SramData.Synchronous;\r
+ SramData.Synchronous = Temp;\r
+ \r
+ //\r
+ // Truncate the data to word\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset,\r
+ (EFI_CACHE_SRAM_TYPE_DATA *) &SramData,\r
+ 2\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Cache SubClass record type 10 -- Cache Config.\r
+ Offset is mandatory\r
+\r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldCacheType10 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+\r
+ UINT16 CacheConfig;\r
+\r
+ CopyMem (&CacheConfig, RecordData, 2);\r
+\r
+ if ((CacheConfig & 0x07) == 0) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ //\r
+ // Truncate the data to 2 bytes and make cache level zero-based.\r
+ //\r
+ CacheConfig--;\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset,\r
+ &CacheConfig,\r
+ 2\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Enlarge the structure buffer of a structure node in SMBIOS database.\r
+ The function maybe lead the structure pointer for SMBIOS record changed.\r
+ \r
+ @param StructureNode The structure node whose structure buffer is to be enlarged.\r
+ @param NewLength The new length of SMBIOS record which does not include unformat area.\r
+ @param OldBufferSize The old size of SMBIOS record buffer.\r
+ @param NewSize The new size is targeted for enlarged.\r
+ \r
+ @retval EFI_OUT_OF_RESOURCES No more memory to allocate new record\r
+ @retval EFI_SUCCESS Success to enlarge the record buffer size.\r
+**/\r
+EFI_STATUS\r
+SmbiosEnlargeStructureBuffer (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ UINT8 NewLength,\r
+ UINTN OldBufferSize,\r
+ UINTN NewBufferSize\r
+ )\r
+{\r
+ EFI_SMBIOS_TABLE_HEADER *NewRecord;\r
+ EFI_SMBIOS_PROTOCOL *Smbios;\r
+ EFI_STATUS Status;\r
+ UINT8 CountOfString;\r
+ \r
+ NewRecord = NULL;\r
+ Smbios = GetSmbiosProtocol();\r
+ ASSERT (Smbios != NULL);\r
+ \r
+ NewRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (NewBufferSize);\r
+ if (NewRecord == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem (NewRecord, StructureNode->Structure, OldBufferSize);\r
+ \r
+ \r
+ Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ //\r
+ // try to use original handle to enlarge the buffer.\r
+ //\r
+ NewRecord->Length = NewLength;\r
+ Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, NewRecord);\r
+ ASSERT_EFI_ERROR (Status);\r
+ FreePool (NewRecord);\r
+ \r
+ StructureNode->Structure = GetSmbiosBufferFromHandle (\r
+ StructureNode->SmbiosHandle, \r
+ StructureNode->SmbiosType, \r
+ NULL\r
+ );\r
+ GetSmbiosStructureSize (\r
+ StructureNode->Structure,\r
+ &StructureNode->StructureSize,\r
+ &CountOfString\r
+ );\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Fill a standard Smbios string field. \r
+ \r
+ This function will convert the unicode string to single byte chars, and only\r
+ English language is supported.\r
+ This function changes the Structure pointer value of the structure node, \r
+ which should be noted by Caller.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is too larger\r
+ @retval EFI_OUT_OF_RESOURCES No memory to allocate new buffer for string\r
+ @retval EFI_SUCCESS Sucess append string for a SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldString (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT16 *Data;\r
+ CHAR8 AsciiData[SMBIOS_STRING_MAX_LENGTH];\r
+ UINT8 CountOfStrings;\r
+ UINTN OrigStringNumber;\r
+ EFI_SMBIOS_PROTOCOL *Smbios;\r
+ EFI_SMBIOS_HANDLE SmbiosHandle;\r
+ UINT32 OrigStructureSize;\r
+ UINTN NewStructureSize;\r
+ EFI_SMBIOS_TABLE_HEADER *NewRecord;\r
+ UINT32 StringLength;\r
+ \r
+ Status = EFI_SUCCESS;\r
+ OrigStringNumber = 0;\r
+ OrigStructureSize = 0;\r
+\r
+ //\r
+ // if we have a NULL token,\r
+ //\r
+ if (0 == *((STRING_REF *) RecordData)) {\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;\r
+ return EFI_SUCCESS;\r
+ }\r
+ \r
+ //\r
+ // Get the String from the Hii Database\r
+ //\r
+ Data = HiiGetPackageString (\r
+ &(StructureNode->ProducerName),\r
+ *((EFI_STRING_ID *) RecordData),\r
+ NULL\r
+ );\r
+ if (Data == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ StringLength = (UINT32)StrLen (Data);\r
+ //\r
+ // Count the string size including the terminating 0.\r
+ //\r
+ if (StringLength == 0) {\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = 0;\r
+ FreePool (Data);\r
+ return EFI_SUCCESS;\r
+ }\r
+ \r
+ if (StringLength > SMBIOS_STRING_MAX_LENGTH) {\r
+ //\r
+ // Too long a string\r
+ //\r
+ FreePool (Data);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ Smbios = GetSmbiosProtocol();\r
+ ASSERT (Smbios != NULL);\r
+ \r
+ //\r
+ // Convert Unicode string to Ascii string which only supported by SMBIOS.\r
+ //\r
+ ZeroMem (AsciiData, SMBIOS_STRING_MAX_LENGTH);\r
+ UnicodeStrToAsciiStr (Data, AsciiData);\r
+ \r
+ //\r
+ // if the field at offset is already filled with some value,\r
+ // find out the string it points to\r
+ //\r
+ OrigStringNumber = *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset);\r
+ if (OrigStringNumber != 0) {\r
+ DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Update %dth string for type[%d],offset[0x%x],handle[0x%x] to [%s]\n", \r
+ OrigStringNumber, StructureNode->SmbiosType, Offset, StructureNode->SmbiosHandle, AsciiData)); \r
+ \r
+ //\r
+ // If original string number is not zero, just update string\r
+ //\r
+ Status = Smbios->UpdateString (Smbios, &StructureNode->SmbiosHandle, &OrigStringNumber, AsciiData);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Fail to update %dth string in offset 0x%x for handle:0x%x type:0x%x\n", \r
+ OrigStringNumber, Offset, StructureNode->SmbiosHandle, StructureNode->SmbiosType));\r
+ ASSERT_EFI_ERROR (Status);\r
+ return Status;\r
+ }\r
+ } else {\r
+ //\r
+ // If the string has not been filled in SMBIOS database, remove it and add again\r
+ // with string appended.\r
+ //\r
+ Status = GetSmbiosStructureSize (StructureNode->Structure, &OrigStructureSize, &CountOfStrings);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ if (CountOfStrings == 0) {\r
+ NewStructureSize = OrigStructureSize + StringLength;\r
+ } else {\r
+ NewStructureSize = OrigStructureSize + StringLength + 1;\r
+ }\r
+ \r
+ NewRecord = AllocateZeroPool (NewStructureSize);\r
+ if (NewRecord == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem (NewRecord, StructureNode->Structure, OrigStructureSize);\r
+ \r
+ //\r
+ // Copy new string into tail of original SMBIOS record buffer.\r
+ //\r
+ if (CountOfStrings == 0) {\r
+ AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 2, AsciiData);\r
+ } else {\r
+ AsciiStrCpy ((CHAR8 *)NewRecord + OrigStructureSize - 1, AsciiData);\r
+ }\r
+ DEBUG ((EFI_D_ERROR, "[SMBIOSThunk] Type(%d) offset(0x%x) StringNumber:%d\n", \r
+ StructureNode->SmbiosType, Offset, CountOfStrings + 1));\r
+ //\r
+ // Update string reference number\r
+ //\r
+ *(UINT8 *) ((UINT8 *) NewRecord + Offset) = (UINT8) (CountOfStrings + 1);\r
+ SmbiosHandle = StructureNode->SmbiosHandle;\r
+ \r
+ //\r
+ // Remove original SMBIOS record and add new one\r
+ //\r
+ Status = Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ //\r
+ // Add new SMBIOS record\r
+ //\r
+ Status = Smbios->Add (Smbios, NULL, &SmbiosHandle, NewRecord);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ StructureNode->SmbiosHandle = SmbiosHandle;\r
+ \r
+ FreePool (NewRecord);\r
+ }\r
+ \r
+ //\r
+ // The SMBIOS record buffer maybe re-allocated in SMBIOS database,\r
+ // so update cached buffer pointer in DataHub structure list.\r
+ //\r
+ StructureNode->Structure = GetSmbiosBufferFromHandle (\r
+ StructureNode->SmbiosHandle, \r
+ StructureNode->SmbiosType,\r
+ NULL\r
+ );\r
+ ASSERT (StructureNode->Structure != NULL);\r
+ \r
+ //\r
+ // The string update action maybe lead the record is re-allocated in SMBIOS database\r
+ // so update cached record pointer\r
+ //\r
+ Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureNode->StructureSize, &CountOfStrings);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Find a handle that matches the Link Data and the target Smbios type.\r
+ \r
+ @param TargetType the Smbios type\r
+ @param SubClass the SubClass\r
+ @param LinkData Specifies Instance, SubInstance and ProducerName\r
+ @param Handle the HandleNum found \r
+ \r
+ @retval EFI_NOT_FOUND Can not find the record according to handle\r
+ @retval EFI_SUCCESS Success to find the handle\r
+**/\r
+EFI_STATUS\r
+SmbiosFindHandle (\r
+ IN UINT8 TargetType,\r
+ IN EFI_GUID *SubClass,\r
+ IN EFI_INTER_LINK_DATA *LinkData,\r
+ IN OUT UINT16 *HandleNum\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ SMBIOS_STRUCTURE_NODE *StructureNode;\r
+\r
+ StructureNode = NULL;\r
+\r
+ //\r
+ // Find out the matching handle\r
+ //\r
+ for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
+ StructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);\r
+ if (StructureNode->Structure->Type == TargetType &&\r
+ CompareGuid (&(StructureNode->SubClass), SubClass) &&\r
+ StructureNode->Instance == LinkData->Instance &&\r
+ StructureNode->SubInstance == LinkData->SubInstance\r
+ ) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (Link == &mStructureList) {\r
+ return EFI_NOT_FOUND;\r
+ } else {\r
+ *HandleNum = StructureNode->Structure->Handle;\r
+ return EFI_SUCCESS;\r
+ }\r
+}\r
+\r
+/**\r
+ Fill the inter link field for a SMBIOS recorder.\r
+ \r
+ Some SMBIOS recorder need to reference the handle of another SMBIOS record. But\r
+ maybe another SMBIOS record has not been added, so put the InterLink request into\r
+ a linked list and the interlink will be fixedup when a new SMBIOS record is added.\r
+ \r
+ @param StructureNode Point to SMBIOS_STRUCTURE_NODE which reference another record's handle\r
+ @param LinkSmbiosNodeOffset The offset in this record for holding the handle of another SMBIOS record\r
+ @param LinkSmbiosType The type of SMBIOS record want to be linked.\r
+ @param InterLink Point to EFI_INTER_LINK_DATA will be put linked list.\r
+ @param SubClassGuid The guid of subclass for linked SMBIOS record.\r
+ \r
+ @retval EFI_SUCESS The linked record is found and no need fixup in future.\r
+ @retval !EFI_SUCESS The linked record can not be found and InterLink is put a fixing-p linked list.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldInterLink (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT16 LinkSmbiosNodeOffset,\r
+ IN UINT8 LinkSmbiosType,\r
+ IN EFI_INTER_LINK_DATA *InterLink,\r
+ IN EFI_GUID *SubClassGuid\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;\r
+ UINT16 StructureHandle;\r
+\r
+ Status = EFI_SUCCESS;\r
+ LinkDataFixupNode = NULL;\r
+\r
+ Status = SmbiosFindHandle (\r
+ LinkSmbiosType, // Smbios type\r
+ SubClassGuid,\r
+ InterLink,\r
+ &StructureHandle\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Set the handle\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + LinkSmbiosNodeOffset,\r
+ &StructureHandle,\r
+ sizeof (EFI_SMBIOS_HANDLE)\r
+ );\r
+ } else {\r
+ //\r
+ // Hang this in the link data fixup node\r
+ //\r
+ LinkDataFixupNode = AllocateZeroPool (sizeof (SMBIOS_LINK_DATA_FIXUP_NODE));\r
+ if (!LinkDataFixupNode) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ LinkDataFixupNode->Signature = SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE;\r
+ LinkDataFixupNode->Offset = LinkSmbiosNodeOffset;\r
+ LinkDataFixupNode->TargetType = LinkSmbiosType;\r
+ CopyMem (\r
+ &LinkDataFixupNode->SubClass,\r
+ SubClassGuid,\r
+ sizeof (EFI_GUID)\r
+ );\r
+ CopyMem (\r
+ &LinkDataFixupNode->LinkData,\r
+ InterLink,\r
+ sizeof (EFI_INTER_LINK_DATA)\r
+ );\r
+ InsertTailList (\r
+ &StructureNode->LinkDataFixup,\r
+ &(LinkDataFixupNode->Link)\r
+ );\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function. Transform an EFI_EXP_BASE10_DATA to a word, with 'Mega'\r
+ as the unit.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is invalid. \r
+ @retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase10ToWordWithMega (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_EXP_BASE10_DATA *Base10Data;\r
+ INT16 Value;\r
+ INT16 Exponent;\r
+\r
+ if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Base10Data = RecordData;\r
+ Value = Base10Data->Value;\r
+ Exponent = Base10Data->Exponent;\r
+\r
+ Exponent -= 6;\r
+ while (Exponent != 0) {\r
+ if (Exponent > 0) {\r
+ Value = (INT16) (Value * 10);\r
+ Exponent--;\r
+ } else {\r
+ Value = (INT16) (Value / 10);\r
+ Exponent++;\r
+ }\r
+ }\r
+\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset,\r
+ &Value,\r
+ 2\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 'Kilo'\r
+ as the unit. Granularity implemented for Cache Size.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is invalid. \r
+ @retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase2ToWordWithKilo (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_EXP_BASE2_DATA *Base2Data;\r
+ UINT32 Value;\r
+ UINT16 Exponent;\r
+\r
+ if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Base2Data = RecordData;\r
+ Value = Base2Data->Value;\r
+ Exponent = Base2Data->Exponent;\r
+\r
+ Exponent -= 10;\r
+ Value <<= Exponent;\r
+ \r
+ //\r
+ // Implement cache size granularity\r
+ //\r
+ if(Value >= 0x8000) {\r
+ Value >>= 6;\r
+ Value |= 0x8000;\r
+ }\r
+ \r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset,\r
+ &Value,\r
+ 2\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'\r
+ as the unit.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is invalid. \r
+ @retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase2ToByteWith64K (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_EXP_BASE2_DATA *Base2Data;\r
+ UINT16 Value;\r
+ UINT16 Exponent;\r
+\r
+ if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Base2Data = RecordData;\r
+ Value = Base2Data->Value;\r
+ Exponent = Base2Data->Exponent;\r
+ Exponent -= 16;\r
+ Value <<= Exponent;\r
+\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset,\r
+ &Value,\r
+ 1\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a word, with 10exp-9\r
+ as the unit.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is invalid. \r
+ @retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldBase10ToByteWithNano (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_EXP_BASE10_DATA *Base10Data;\r
+ INT16 Value;\r
+ INT16 Exponent;\r
+\r
+ if (RecordDataSize != sizeof (EFI_EXP_BASE2_DATA)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Base10Data = RecordData;\r
+ Value = Base10Data->Value;\r
+ Exponent = Base10Data->Exponent;\r
+\r
+ Exponent += 9;\r
+ while (Exponent != 0) {\r
+ if (Exponent > 0) {\r
+ Value = (INT16) (Value * 10);\r
+ Exponent--;\r
+ } else {\r
+ Value = (INT16) (Value / 10);\r
+ Exponent++;\r
+ }\r
+ }\r
+\r
+ * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) Value;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function: truncate record data to byte and fill in the\r
+ field as indicated by Offset.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is invalid. \r
+ @retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldTruncateToByte (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // Truncate the data to 8 bits\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (*(UINT8 *) RecordData);\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function: truncate record data to byte and fill in the\r
+ field as indicated by Offset.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is invalid. \r
+ @retval EFI_SUCCESS RecordData is successed to be filled into given SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldTruncateToWord (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // Truncate the data to 8 bits\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset,\r
+ RecordData,\r
+ 2\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Check if OEM structure has included 2 trailing 0s in data record.\r
+ \r
+ @param RecordData Point to record data will be checked.\r
+ @param RecordDataSize The size of record data.\r
+ \r
+ @retval 0 2 trailing 0s exist in unformatted section\r
+ @retval 1 1 trailing 0 exists at the end of unformatted section\r
+ @retval -1 There is no 0 at the end of unformatted section\r
+**/\r
+INT8\r
+SmbiosCheckTrailingZero (\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ SMBIOS_STRUCTURE *Smbios;\r
+ CHAR8 *Start;\r
+ CHAR8 *End;\r
+ \r
+ Smbios = (SMBIOS_STRUCTURE *) RecordData;\r
+ \r
+ //\r
+ // Skip over formatted section\r
+ //\r
+ Start = (CHAR8 *) ((UINT8 *) Smbios + Smbios->Length);\r
+ End = (CHAR8 *) RecordData + RecordDataSize;\r
+ \r
+ //\r
+ // Unformatted section exists\r
+ //\r
+ while (Start < End - 1) {\r
+ //\r
+ // Avoid unaligned issue on IPF\r
+ //\r
+ if ((*Start == 0) && (*(Start + 1) == 0)) {\r
+ //\r
+ // 2 trailing 0s exist in unformatted section\r
+ //\r
+ return 0;\r
+ }\r
+ Start++;\r
+ }\r
+ \r
+ if (Start == End - 1) {\r
+ //\r
+ // Check if there has been already 1 trailing 0\r
+ //\r
+ if (*Start == 0) {\r
+ return 1;\r
+ } \r
+ }\r
+ \r
+ //\r
+ // There is no 0 at the end of unformatted section\r
+ //\r
+ return -1;\r
+}\r
--- /dev/null
+/** @file\r
+ The conversion table that guides the generation of the Smbios struture list.\r
+ \r
+Copyright (c) 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+///\r
+/// The minimal length includes last two zero bytes.\r
+///\r
+SMBIOS_TYPE_INFO_TABLE_ENTRY mTypeInfoTable[] = {\r
+ //\r
+ // Type 0: Bios Information\r
+ //\r
+ {\r
+ 0,\r
+ 0x1a,\r
+ TRUE,\r
+ FALSE\r
+ }, // size includes wo extension bytes\r
+ //\r
+ // Type 1: System Information\r
+ //\r
+ {\r
+ 1,\r
+ 0x1d,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 2: Base Board Information\r
+ //\r
+ {\r
+ 2,\r
+ 0x12,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 3: System Enclosure or Chassis\r
+ //\r
+ {\r
+ 3,\r
+ 0x17, // 0x13 covers till OEM-defined, not right\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 4: Processor\r
+ //\r
+ {\r
+ 4,\r
+ 0x25,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 5: Memory Controller\r
+ //\r
+ {\r
+ 5,\r
+ 0x12,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 6: Memory\r
+ //\r
+ {\r
+ 6,\r
+ 0x0E,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 7: Cache\r
+ //\r
+ {\r
+ 7,\r
+ 0x15,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 8: Port Connector Information\r
+ //\r
+ {\r
+ 8,\r
+ 0x0B,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 9: System Slots\r
+ //\r
+ {\r
+ 9,\r
+ 0x0f,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 10: On Board Device Information\r
+ //\r
+ {\r
+ 10,\r
+ 0x8,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 11: OEM Strings\r
+ //\r
+ {\r
+ 11, \r
+ 0x7, \r
+ FALSE, \r
+ FALSE\r
+ },\r
+ //\r
+ // Type 12: System Configuration Options\r
+ //\r
+ {\r
+ 12,\r
+ 0x7,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 13: BIOS Language Information\r
+ //\r
+ {\r
+ 13,\r
+ 0x18,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 15: System Event Log\r
+ //\r
+ {\r
+ 15,\r
+ 0x19,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 16: Physical Memory Array\r
+ //\r
+ {\r
+ 16,\r
+ 0x11,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 17: Memory Device\r
+ //\r
+ {\r
+ 17,\r
+ 0x1d,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 18: 32 bit Memory Error Information\r
+ //\r
+ {\r
+ 18,\r
+ 0x19,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 19: Memory Array Mapped Address\r
+ //\r
+ {\r
+ 19,\r
+ 0x11,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 20: Memory Device Mapped Address\r
+ //\r
+ {\r
+ 20,\r
+ 0x15,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 21: Pointing Device\r
+ //\r
+ {\r
+ 21,\r
+ 0x9,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 22: Portable Battery\r
+ //\r
+ {\r
+ 22,\r
+ 0x1c,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 23: System Reset\r
+ //\r
+ {\r
+ 23,\r
+ 0x0f,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 24: Hardware Security\r
+ //\r
+ {\r
+ 24,\r
+ 0x07,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 25: System Power Controls\r
+ //\r
+ {\r
+ 25,\r
+ 0x0b,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 26: Voltage Probe\r
+ //\r
+ {\r
+ 26,\r
+ 0x18,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 27: Cooling Device\r
+ //\r
+ {\r
+ 27,\r
+ 0x10,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 28: Temperature Probe\r
+ //\r
+ {\r
+ 28,\r
+ 0x18,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 29: Electrical Current Probe\r
+ //\r
+ {\r
+ 29,\r
+ 0x18,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 30: Out-of-Band Remote Access\r
+ //\r
+ {\r
+ 30,\r
+ 0x08,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 31: BIS Entry Point\r
+ //\r
+ {\r
+ 31,\r
+ 0x1c,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 32: System Boot Information\r
+ //\r
+ {\r
+ 32,\r
+ 0x16,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 33: 64 bit Memory Error Information\r
+ //\r
+ {\r
+ 33,\r
+ 0x21,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 34: Management Device\r
+ //\r
+ {\r
+ 34,\r
+ 0x0d,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 36: Management Device Threshold\r
+ //\r
+ {\r
+ 36,\r
+ 0x12,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 37: Memory Channel\r
+ //\r
+ {\r
+ 37,\r
+ 0x0c,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 38: IPMI device info\r
+ //\r
+ {\r
+ 38,\r
+ 0x12,\r
+ TRUE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 39: Power supply\r
+ //\r
+ {\r
+ 39,\r
+ 0x18,\r
+ FALSE,\r
+ FALSE\r
+ }, \r
+ //\r
+ // Type 0x80-0xFF: OEM type\r
+ //\r
+ {\r
+ 0x80,\r
+ 0x6,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Type 127: End of Table\r
+ //\r
+ {\r
+ 127,\r
+ 0x6,\r
+ FALSE,\r
+ FALSE\r
+ },\r
+ //\r
+ // Terminator\r
+ //\r
+ {\r
+ 0,\r
+ 0\r
+ }\r
+};\r
+\r
+SMBIOS_CONVERSION_TABLE_ENTRY mConversionTable[] = {\r
+\r
+ {\r
+ //\r
+ // Processor Sub Class -- Record Type 1: Frequency\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorCoreFrequencyRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x16,\r
+ SmbiosFldBase10ToWordWithMega\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 2: Bus Frequency\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorFsbFrequencyRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x12,\r
+ SmbiosFldBase10ToWordWithMega\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 3: Version\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorVersionRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x10,\r
+ SmbiosFldString\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 4: Manufacturor\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorManufacturerRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x7,\r
+ SmbiosFldString\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 5: Serial Number\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorSerialNumberRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x20,\r
+ SmbiosFldString\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 6: ID\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorIdRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x08,\r
+ SmbiosFldProcessorType6\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 7: Type\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorTypeRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x05,\r
+ SmbiosFldTruncateToByte\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 8: Family\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorFamilyRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x06,\r
+ SmbiosFldTruncateToByte\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 9: Voltage\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorVoltageRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x11,\r
+ SmbiosFldProcessorType9\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 14: Status\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorStatusRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x18,\r
+ SmbiosFldTruncateToByte\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 15: Socket Type\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorSocketTypeRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x19,\r
+ SmbiosFldTruncateToByte\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 16: Socket Name\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorSocketNameRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x04,\r
+ SmbiosFldString\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 17: Cache Associtation\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ CacheAssociationRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_WHOLE_DATA_RECORD,\r
+ 0,\r
+ SmbiosFldProcessorType17\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor Sub Class -- Record Type 18: MaxFrequency\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorMaxCoreFrequencyRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x14,\r
+ SmbiosFldBase10ToWordWithMega\r
+ },\r
+\r
+ {\r
+ //\r
+ // Processor SubClass -- Record Type 19: Asset Tag\r
+ //\r
+ EFI_PROCESSOR_SUBCLASS_GUID,\r
+ ProcessorAssetTagRecordType,\r
+ 4,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x21,\r
+ SmbiosFldString\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 1: Size\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheSizeRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x09,\r
+ SmbiosFldBase2ToWordWithKilo\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 2: Max Size\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ MaximumSizeCacheRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x07,\r
+ SmbiosFldBase2ToWordWithKilo\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 3: Speed\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheSpeedRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x0f,\r
+ SmbiosFldBase10ToByteWithNano\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 4: Socket\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheSocketRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x04,\r
+ SmbiosFldString\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 5: Supported SRAM type\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheSramTypeRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x0b,\r
+ SmbiosFldCacheType5 // Asynchronous and Synchronous are reversed\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 6: Installed SRAM type\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheInstalledSramTypeRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x0d,\r
+ SmbiosFldCacheType5\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 7: error correction type\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheErrorTypeRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x10,\r
+ SmbiosFldTruncateToByte\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 8: cache type\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheTypeRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x11,\r
+ SmbiosFldTruncateToByte\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 9: Associativity\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheAssociativityRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x12,\r
+ SmbiosFldTruncateToByte\r
+ },\r
+\r
+ {\r
+ //\r
+ // Cache SubClass -- Record Type 10: Cache configuration\r
+ //\r
+ EFI_CACHE_SUBCLASS_GUID,\r
+ CacheConfigRecordType,\r
+ 7,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ 0x05,\r
+ SmbiosFldCacheType10\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 2: Physical Memory Array\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_ARRAY_LOCATION_RECORD_NUMBER,\r
+ 16,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType2\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 3: Memory Device to SMBIOS type 6\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER,\r
+ 6,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldSMBIOSType6\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 3: Memory Device to SMBIOS type 17\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER,\r
+ 17,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType3\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 4: Memory Array Mapped Address\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER,\r
+ 19,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType4\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 5: Memory Device Mapped Address\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_DEVICE_START_ADDRESS_RECORD_NUMBER,\r
+ 20,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType5\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 6: Memory Channel Type\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_CHANNEL_TYPE_RECORD_NUMBER,\r
+ 37,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType6\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 7: Memory Channel Device\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_CHANNEL_DEVICE_RECORD_NUMBER,\r
+ 37,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType7\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 8: Memory Controller information\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER,\r
+ 5,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType8\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 9: Memory 32 Bit Error Information\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER,\r
+ 18,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType9\r
+ },\r
+\r
+ {\r
+ //\r
+ // Memory SubClass -- Record Type 10: Memory 64 Bit Error Information\r
+ //\r
+ EFI_MEMORY_SUBCLASS_GUID,\r
+ EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER,\r
+ 33,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMemoryType10\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 2: Bios Information (SMBIOS Type 0)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_BIOS_VENDOR_RECORD_NUMBER, // 0,\r
+ 0, // smbios Type 0\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType0\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 3: System Information (SMBIOS Type 1)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER, // 1,\r
+ 1,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType1\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 4: Base Board Manufacturer (SMBIOS Type 2)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_BASE_BOARD_MANUFACTURER_RECORD_NUMBER, // 2,\r
+ 2, // SMBIOS Type 2\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType2\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 5: System Enclosure or Chassis (SMBIOS Type 3)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_CHASSIS_MANUFACTURER_RECORD_NUMBER, // 3,\r
+ 3,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType3\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 6: Port Connector (SMBIOS Type 8)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER, // 8,\r
+ 8,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType8\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 7: System Slots (SMBIOS Type 9)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SYSTEM_SLOT_DESIGNATION_RECORD_NUMBER, // 9,\r
+ 9,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType9\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 8: Onboard Device (SMBIOS Type 10)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_ONBOARD_DEVICE_RECORD_NUMBER, // 10,\r
+ 10,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType10\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc Subclass -- Record Type 9: OEM strings (SMBIOS Type 11)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_OEM_STRING_RECORD_NUMBER, // 11,\r
+ 11,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType11\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0A: System Options (SMBIOS Type 12)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SYSTEM_OPTION_STRING_RECORD_NUMBER, // 12,\r
+ 12,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType12\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0B: Number of Installable Languages (SMBIOS Type 13)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_RECORD_NUMBER, // 13,\r
+ 13,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType13\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0C: Installable Languages (SMBIOS Type 13)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SYSTEM_LANGUAGE_STRING_RECORD_NUMBER, // 13,\r
+ 13,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType14\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 20: System Event Log (SMBIOS Type 15)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER, // 15,\r
+ 15,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType15\r
+ }, \r
+ \r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0F: Pointing Device (SMBIOS Type 21)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_POINTING_DEVICE_TYPE_RECORD_NUMBER, // 21,\r
+ 21,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType21\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 10: Portable Battery (SMBIOS Type 22)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER, // 22,\r
+ 22,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType22\r
+ }, \r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x11: Reset Capabilities (SMBIOS Type 23)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_RESET_CAPABILITIES_RECORD_NUMBER, // 23,\r
+ 23,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType23\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x12: Hardware Security (SMBIOS Type 24)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA_RECORD_NUMBER, // 24,\r
+ 24,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType24\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x13: System Power Controls (SMBIOS Type 25)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SCHEDULED_POWER_ON_MONTH_RECORD_NUMBER, // 25,\r
+ 25,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType25\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x14: System Power Controls (SMBIOS Type 26)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_RECORD_NUMBER, // 26,\r
+ 26,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType26\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x15: Cooling Device (SMBIOS Type 27)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_COOLING_DEVICE_TEMP_LINK_RECORD_NUMBER, // 27,\r
+ 27,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType27\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x16: Temperature Probe (SMBIOS Type 28)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_RECORD_NUMBER, // 28,\r
+ 28,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType28\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x17: Electrical Current Probe (SMBIOS Type 29)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_RECORD_NUMBER, // 29,\r
+ 29,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType29\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x18: Temperature Probe (SMBIOS Type 30)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_RECORD_NUMBER, // 30,\r
+ 30,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType30\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x1A: Boot Information (SMBIOS Type 32)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_BOOT_INFORMATION_STATUS_RECORD_NUMBER, // 32,\r
+ 32,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType32\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x1B: Management Device (SMBIOS Type 34)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_RECORD_NUMBER, // 34,\r
+ 34,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType34\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x21: Management Device Threshold (SMBIOS Type 36)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER, // 36,\r
+ 36,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType36\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x1D: Boot Information (SMBIOS Type 38)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER, // 38,\r
+ 38,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType38\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x1E: Power supply (SMBIOS Type 39)\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SYSTEM_POWER_SUPPLY_RECORD_NUMBER, // 39,\r
+ 39,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType39\r
+ },\r
+\r
+ {\r
+ //\r
+ // Misc SubClass -- Record Type 0x80-0xFF: OEM type\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ EFI_MISC_SMBIOS_STRUCT_ENCAP_RECORD_NUMBER, // 0x80,\r
+ 0x80,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscTypeOEM\r
+ },\r
+\r
+ {\r
+ //\r
+ // End-of-Table -- Record Type 127\r
+ //\r
+ EFI_MISC_SUBCLASS_GUID,\r
+ 127,\r
+ 127,\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_FUNCTION,\r
+ 0,\r
+ SmbiosFldMiscType127\r
+ },\r
+ //\r
+ // Table Terminator\r
+ //\r
+ {\r
+ {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}},\r
+ 0,\r
+ 0,\r
+ (SMBIOS_STRUCTURE_LOCATING_METHOD) 0,\r
+ (SMBIOS_FIELD_FILLING_METHOD) 0,\r
+ 0,\r
+ 0\r
+ }\r
+};\r
--- /dev/null
+#/** @file\r
+# This thunk driver register a filter for DataHub protocol, once a data hub record\r
+# is added via EFI_DATA_HUB_PROTOCOL->LogData(), this filter will be invoked to \r
+# translate the datahub's record to SMBIOS record.\r
+#\r
+# Copyright (c) 2009, Intel Corporation\r
+#\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#\r
+#**/\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = Datahub2SmbiosThunk\r
+ FILE_GUID = 9F8B12CF-E796-408f-9D59-3ACDDC0AFBE3\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ EDK_RELEASE_VERSION = 0x00020000\r
+ EFI_SPECIFICATION_VERSION = 0x00020000\r
+\r
+ ENTRY_POINT = ThunkEntry\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
+#\r
+\r
+[Sources.common]\r
+ Thunk.c\r
+ Thunk.h\r
+ Translate.c\r
+ ConvLib.c\r
+ ConvTable.c\r
+ ProcessorConv.c\r
+ MemoryConv.c\r
+ MiscConv.c\r
+ \r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+ IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+ EdkCompatibilityPkg/EdkCompatibilityPkg.dec\r
+ \r
+ \r
+[LibraryClasses]\r
+ UefiBootServicesTableLib\r
+ MemoryAllocationLib\r
+ UefiDriverEntryPoint\r
+ BaseMemoryLib\r
+ HiiLib\r
+ DebugLib\r
+ BaseLib\r
+ PcdLib\r
+\r
+[Protocols]\r
+ gEfiDataHubProtocolGuid ## CONSUMES\r
+ gEfiSmbiosProtocolGuid ## CONSUMES\r
+\r
+[Guids] \r
+ gEfiMemorySubClassGuid ## CONSUMES\r
+ gEfiMiscSubClassGuid ## CONSUMES\r
+ gEfiCacheSubClassGuid ## CONSUMES\r
+ \r
+[FeaturePcd]\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport\r
+ \r
+[Depex]\r
+ gEfiDataHubProtocolGuid AND gEfiSmbiosProtocolGuid
\ No newline at end of file
--- /dev/null
+/** @file\r
+ Routines that support Memory SubClass data records translation.\r
+ \r
+Copyright (c) 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 2 -- Physical Memory\r
+ Array.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType2 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MEMORY_ARRAY_LOCATION_DATA *PhyMemArray;\r
+ FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *FrameworkPhyMemArray;\r
+ UINT32 MemoryCapacity;\r
+ UINT16 NumberMemoryDevices;\r
+ UINT16 Test16;\r
+\r
+ Status = EFI_SUCCESS;\r
+ PhyMemArray = (EFI_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
+ FrameworkPhyMemArray = (FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
+\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Location)) = (UINT8) (PhyMemArray->MemoryArrayLocation);\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Use)) = (UINT8) (PhyMemArray->MemoryArrayUse);\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorCorrection)) = (UINT8) (PhyMemArray->MemoryErrorCorrection);\r
+\r
+ if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+ MemoryCapacity = (UINT32) (((UINTN) PhyMemArray->MaximumMemoryCapacity.Value) << PhyMemArray->MaximumMemoryCapacity.Exponent);\r
+ NumberMemoryDevices = PhyMemArray->NumberMemoryDevices;\r
+ } else {\r
+ //\r
+ // Support EDk/Framework defined Data strucutre.\r
+ //\r
+ MemoryCapacity = FrameworkPhyMemArray->MaximumMemoryCapacity;\r
+ NumberMemoryDevices = FrameworkPhyMemArray->NumberMemoryDevices;\r
+ }\r
+\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE16, MaximumCapacity),\r
+ &MemoryCapacity,\r
+ 4\r
+ );\r
+\r
+ Test16 = 0xfffe;\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorInformationHandle),\r
+ &Test16,\r
+ 2\r
+ );\r
+ \r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, NumberOfMemoryDevices),\r
+ &NumberMemoryDevices,\r
+ 2\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 3 -\r
+ - Memory Device: SMBIOS Type 17\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType3 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_ARRAY_LINK_DATA *MemDevice;\r
+ FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
+ UINT64 MemoryDeviceSize;\r
+ BOOLEAN MemoryDeviceSizeUnitMega;\r
+ UINT16 MemoryDeviceSpeed;\r
+ UINT16 MemoryDeviceExponent;\r
+ UINT16 Test16;\r
+\r
+ MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+ FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+ MemoryDeviceSpeed = 0;\r
+ MemoryDeviceExponent = 0;\r
+\r
+ //\r
+ // Memory Device Locator\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceLocator),\r
+ &(MemDevice->MemoryDeviceLocator),\r
+ sizeof (STRING_REF)\r
+ );\r
+\r
+ //\r
+ // Memory Bank Locator\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE17, BankLocator),\r
+ &(MemDevice->MemoryBankLocator),\r
+ sizeof (STRING_REF)\r
+ );\r
+\r
+ //\r
+ // Memory Manufacturer\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE17, Manufacturer),\r
+ &(MemDevice->MemoryManufacturer),\r
+ sizeof (STRING_REF)\r
+ );\r
+\r
+ //\r
+ // Memory Serial Number\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE17, SerialNumber),\r
+ &(MemDevice->MemorySerialNumber),\r
+ sizeof (STRING_REF)\r
+ );\r
+\r
+ //\r
+ // Memory Asset Tag\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE17, AssetTag),\r
+ &(MemDevice->MemoryAssetTag),\r
+ sizeof (STRING_REF)\r
+ );\r
+\r
+ //\r
+ // Memory Part Number\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE17, PartNumber),\r
+ &(MemDevice->MemoryPartNumber),\r
+ sizeof (STRING_REF)\r
+ );\r
+\r
+ //\r
+ // Memory Array Link\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryArrayHandle),\r
+ 16, // SMBIOS type 16\r
+ &MemDevice->MemoryArrayLink,\r
+ &gEfiMemorySubClassGuid\r
+ );\r
+\r
+ //\r
+ // Set Memory Error Information Handle to Not supported\r
+ //\r
+ Test16 = 0xfffe;\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryErrorInformationHandle),\r
+ &Test16,\r
+ sizeof (EFI_SMBIOS_HANDLE)\r
+ ); \r
+ \r
+ //\r
+ // Total width\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TotalWidth),\r
+ &MemDevice->MemoryTotalWidth,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Data Width\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DataWidth),\r
+ &MemDevice->MemoryDataWidth,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Device Size\r
+ //\r
+ if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+ //\r
+ // Form Factor\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
+ &MemDevice->MemoryFormFactor,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // Device Set\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
+ &MemDevice->MemoryDeviceSet,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // Type\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
+ &MemDevice->MemoryType,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // Type Detail\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
+ &MemDevice->MemoryTypeDetail,\r
+ 2\r
+ );\r
+ \r
+ //\r
+ // Speed\r
+ //\r
+ MemoryDeviceSpeed = MemDevice->MemorySpeed.Value;\r
+ MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
+ while (MemoryDeviceExponent-- > 0) {\r
+ MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
+ }\r
+\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
+ &MemoryDeviceSpeed,\r
+ 2\r
+ );\r
+\r
+ MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
+ } else {\r
+ //\r
+ // Form Factor\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
+ &FrameworkMemDevice->MemoryFormFactor,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // Device Set\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
+ &FrameworkMemDevice->MemoryDeviceSet,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // Type\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
+ &FrameworkMemDevice->MemoryType,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // Type Detail\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
+ &FrameworkMemDevice->MemoryTypeDetail,\r
+ 2\r
+ );\r
+ \r
+ //\r
+ // Speed\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
+ &FrameworkMemDevice->MemorySpeed,\r
+ 2\r
+ );\r
+\r
+ MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
+ }\r
+\r
+ MemoryDeviceSizeUnitMega = FALSE;\r
+ MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
+ //\r
+ // kilo as unit\r
+ //\r
+ if (MemoryDeviceSize > 0xffff) {\r
+ MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
+ //\r
+ // Mega as unit\r
+ //\r
+ MemoryDeviceSizeUnitMega = TRUE;\r
+ }\r
+\r
+ MemoryDeviceSize = MemoryDeviceSize & 0x7fff;\r
+ if (MemoryDeviceSize != 0 && MemoryDeviceSizeUnitMega == FALSE) {\r
+ MemoryDeviceSize |= 0x8000;\r
+ }\r
+\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Size),\r
+ &MemoryDeviceSize,\r
+ 2\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 3 -\r
+ - Memory Device: SMBIOS Type 6\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldSMBIOSType6 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_ARRAY_LINK_DATA *MemDevice;\r
+ UINT64 MemoryDeviceSize;\r
+ UINT8 MemSize;\r
+ UINT16 MemType;\r
+ UINT8 MemSpeed;\r
+ FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
+ UINT16 MemoryDeviceSpeed;\r
+ UINT16 MemoryDeviceExponent;\r
+\r
+ MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+ FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
+ MemoryDeviceExponent = 0;\r
+\r
+ //\r
+ // Memory Device Locator\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE6, SocketDesignation),\r
+ &(MemDevice->MemoryDeviceLocator),\r
+ 2\r
+ );\r
+ \r
+ if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+ MemoryDeviceSpeed = MemDevice->MemorySpeed.Value;\r
+ MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
+ while (MemoryDeviceExponent-- > 0) {\r
+ MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
+ }\r
+ MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
+ } else {\r
+ //\r
+ // Support EDk/Framework defined Data strucutre.\r
+ //\r
+ MemoryDeviceSpeed = FrameworkMemDevice->MemorySpeed;\r
+ MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
+ }\r
+ \r
+ if (MemoryDeviceSpeed == 0) {\r
+ MemSpeed = 0;\r
+ } else {\r
+ //\r
+ // Memory speed is in ns unit\r
+ //\r
+ MemSpeed = (UINT8)(1000 / MemoryDeviceSpeed);\r
+ }\r
+\r
+ CopyMem (\r
+ (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentSpeed),\r
+ &MemSpeed,\r
+ 1\r
+ );\r
+\r
+\r
+ //\r
+ // Device Size\r
+ //\r
+ MemSize = 0;\r
+ if (MemoryDeviceSize == 0) {\r
+ MemSize = 0x7F;\r
+ } else {\r
+ MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 21);\r
+ while (MemoryDeviceSize != 0) {\r
+ MemSize++;\r
+ MemoryDeviceSize = RShiftU64(MemoryDeviceSize,1);\r
+ }\r
+ }\r
+\r
+ CopyMem (\r
+ (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, InstalledSize),\r
+ &MemSize,\r
+ 1\r
+ );\r
+\r
+ CopyMem (\r
+ (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, EnabledSize),\r
+ &MemSize,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // According SMBIOS SPEC Type 6 definition\r
+ //\r
+ MemType = 0;\r
+ if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
+ if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
+ MemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
+ MemType |= 1<<8;\r
+ }\r
+ \r
+ if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
+ MemType |= 1<<7;\r
+ }\r
+ \r
+ if (MemDevice->MemoryType == EfiMemoryTypeSdram) {\r
+ MemType |= 1<<10;\r
+ }\r
+ \r
+ if (MemDevice->MemoryTypeDetail.Edo == 1) {\r
+ MemType |= 1<<4;\r
+ }\r
+ \r
+ if (MemDevice->MemoryTypeDetail.FastPaged == 1) {\r
+ MemType |= 1<<3;\r
+ }\r
+ } else {\r
+ //\r
+ // Support EDk/Framework defined Data strucutre.\r
+ //\r
+ if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
+ FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
+ MemType |= 1<<8;\r
+ }\r
+ \r
+ if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
+ MemType |= 1<<7;\r
+ }\r
+ \r
+ if (FrameworkMemDevice->MemoryType == EfiMemoryTypeSdram) {\r
+ MemType |= 1<<10;\r
+ }\r
+ \r
+ if (FrameworkMemDevice->MemoryTypeDetail.Edo == 1) {\r
+ MemType |= 1<<4;\r
+ }\r
+ \r
+ if (FrameworkMemDevice->MemoryTypeDetail.FastPaged == 1) {\r
+ MemType |= 1<<3;\r
+ }\r
+ }\r
+ //\r
+ // Form Factor\r
+ //\r
+ CopyMem (\r
+ (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentMemoryType),\r
+ &MemType,\r
+ 2\r
+ );\r
+\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 4\r
+ -- Memory Array Mapped Address: SMBIOS Type 19\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType4 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_ARRAY_START_ADDRESS_DATA *Masa;\r
+ EFI_PHYSICAL_ADDRESS TempData;\r
+\r
+ Masa = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) RecordData;\r
+\r
+ //\r
+ // Starting Address\r
+ //\r
+ TempData = RShiftU64 (Masa->MemoryArrayStartAddress, 10);\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, StartingAddress),\r
+ &TempData,\r
+ 4\r
+ );\r
+\r
+ //\r
+ // Ending Address\r
+ //\r
+ TempData = RShiftU64 (Masa->MemoryArrayEndAddress, 10);\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, EndingAddress),\r
+ &TempData,\r
+ 4\r
+ );\r
+\r
+ //\r
+ // Partition Width\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, PartitionWidth),\r
+ &Masa->MemoryArrayPartitionWidth,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Physical Memory Array Link\r
+ //\r
+ return SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE19, MemoryArrayHandle),\r
+ 16, // SMBIOS type 16\r
+ &Masa->PhysicalMemoryArrayLink,\r
+ &gEfiMemorySubClassGuid\r
+ );\r
+\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 5\r
+ -- Memory Device Mapped Address: SMBIOS Type 20\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType5 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_DEVICE_START_ADDRESS_DATA *Mdsa;\r
+ EFI_PHYSICAL_ADDRESS TempData;\r
+\r
+ Mdsa = (EFI_MEMORY_DEVICE_START_ADDRESS_DATA *) RecordData;\r
+\r
+ //\r
+ // Starting Address\r
+ //\r
+ TempData = RShiftU64 (Mdsa->MemoryDeviceStartAddress, 10);\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, StartingAddress),\r
+ &TempData,\r
+ 4\r
+ );\r
+\r
+ //\r
+ // Ending Address\r
+ //\r
+ TempData = RShiftU64 (Mdsa->MemoryDeviceEndAddress, 10);\r
+ CopyMem (\r
+ (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, EndingAddress),\r
+ &TempData,\r
+ 4\r
+ );\r
+\r
+ //\r
+ // Memory Device Link\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryDeviceHandle),\r
+ 17, // SMBIOS type 17\r
+ &Mdsa->PhysicalMemoryDeviceLink,\r
+ &gEfiMemorySubClassGuid\r
+ );\r
+\r
+ //\r
+ // Memory Array Mapped Address Link\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryArrayMappedAddressHandle),\r
+ 19, // SMBIOS type 19\r
+ &Mdsa->PhysicalMemoryArrayLink,\r
+ &gEfiMemorySubClassGuid\r
+ );\r
+\r
+ //\r
+ // Memory Device Partition Row Position\r
+ //\r
+ *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, PartitionRowPosition)) = (UINT8) Mdsa->MemoryDevicePartitionRowPosition;\r
+\r
+ //\r
+ // Memory Device Interleave Position\r
+ //\r
+ *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavePosition)) = (UINT8) Mdsa->MemoryDeviceInterleavePosition;\r
+\r
+ //\r
+ // Memory Device Interleave Data Depth\r
+ //\r
+ *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavedDataDepth)) = (UINT8) Mdsa->MemoryDeviceInterleaveDataDepth;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 6\r
+ -- Memory Channel Type: SMBIOS Type 37\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType6 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_CHANNEL_TYPE_DATA *McTa;\r
+ EFI_STATUS Status;\r
+\r
+ McTa = (EFI_MEMORY_CHANNEL_TYPE_DATA *) RecordData;\r
+\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, ChannelType)) = (UINT8) (McTa->MemoryChannelType);\r
+\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MaximumChannelLoad)) = (UINT8) (McTa->MemoryChannelMaximumLoad);\r
+\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDeviceCount)) = (UINT8) (McTa->MemoryChannelDeviceCount);\r
+\r
+ //\r
+ // Update the length field\r
+ // Multiple device loads are filled through SmbiosFldMemoryType7\r
+ //\r
+ StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
+ sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount);\r
+ Status = SmbiosEnlargeStructureBuffer(\r
+ StructureNode, \r
+ StructureNode->Structure->Length,\r
+ StructureNode->StructureSize,\r
+ StructureNode->StructureSize + sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount\r
+ );\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 7\r
+ -- Memory Channel Device: SMBIOS Type 37\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType7 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_CHANNEL_DEVICE_DATA *Mcdd;\r
+ UINTN DeviceLoadOffset;\r
+ UINTN DeviceLoadHandleOffset;\r
+\r
+ Mcdd = (EFI_MEMORY_CHANNEL_DEVICE_DATA *) RecordData;\r
+\r
+ if (Mcdd->DeviceId < 1) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ DeviceLoadOffset = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[0]) + 3 * (Mcdd->DeviceId - 1);\r
+ DeviceLoadHandleOffset = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[1]) + 3 * (Mcdd->DeviceId - 1);\r
+\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + DeviceLoadOffset) = (UINT8) (Mcdd->MemoryChannelDeviceLoad);\r
+\r
+ //\r
+ // Memory Device Handle Link\r
+ //\r
+ return SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) DeviceLoadHandleOffset,\r
+ 17, // Smbios type 17 -- Physical Memory Device\r
+ &Mcdd->DeviceLink,\r
+ &gEfiMemorySubClassGuid\r
+ );\r
+\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type 8\r
+ -- Memory Controller information: SMBIOS Type 5\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType8 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_CONTROLLER_INFORMATION_DATA *MemoryController;\r
+ UINT32 NewMinimalSize;\r
+ UINT16 Count;\r
+ EFI_INTER_LINK_DATA *Link; \r
+ EFI_STATUS Status;\r
+ \r
+ NewMinimalSize = 0;\r
+\r
+ //\r
+ // There is an update from EFI_MEMORY_CONTROLLER_INFORMATION to\r
+ // EFI_MEMORY_CONTROLLER_INFORMATION_DATA. Multiple MemoryModuleConfig\r
+ // handles are filled.\r
+ //\r
+ MemoryController = (EFI_MEMORY_CONTROLLER_INFORMATION_DATA *)RecordData;\r
+ \r
+ //\r
+ // ErrorDetectingMethod\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrDetectMethod),\r
+ &MemoryController->ErrorDetectingMethod,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // ErrorCorrectingCapability\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrCorrectCapability),\r
+ &MemoryController->ErrorCorrectingCapability,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // MemorySupportedInterleave\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportInterleave),\r
+ &MemoryController->MemorySupportedInterleave,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // MemoryCurrentInterleave\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, CurrentInterleave),\r
+ &MemoryController->MemoryCurrentInterleave,\r
+ 1\r
+ ); \r
+ \r
+ //\r
+ // MaxMemoryModuleSize\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MaxMemoryModuleSize),\r
+ &MemoryController->MaxMemoryModuleSize,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // MemorySpeedType\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportSpeed),\r
+ &MemoryController->MemorySpeedType,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // MemorySupportedType\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportMemoryType),\r
+ &MemoryController->MemorySupportedType,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // MemoryModuleVoltage\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleVoltage),\r
+ &MemoryController->MemoryModuleVoltage,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // NumberofMemorySlot\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, AssociatedMemorySlotNum),\r
+ &MemoryController->NumberofMemorySlot,\r
+ 1\r
+ ); \r
+ \r
+ if (MemoryController->NumberofMemorySlot == 0) {\r
+ //\r
+ // EnabledCorrectingCapability\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles),\r
+ &MemoryController->EnabledCorrectingCapability,\r
+ 1\r
+ ); \r
+ } else {\r
+ //\r
+ // Memory module configuration handles exist\r
+ // we should enlarge smbios entry buffer from minimal size\r
+ //\r
+ NewMinimalSize = (MemoryController->NumberofMemorySlot) * sizeof(UINT16) + StructureNode->StructureSize;\r
+ StructureNode->Structure->Length = (UINT8) (NewMinimalSize - 2);\r
+ Status = SmbiosEnlargeStructureBuffer (StructureNode, StructureNode->Structure->Length, StructureNode->StructureSize, NewMinimalSize);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ //\r
+ // MemoryModuleConfigHandles\r
+ //\r
+ for (Count = 0, Link = MemoryController->MemoryModuleConfig; \r
+ Count < MemoryController->NumberofMemorySlot; \r
+ Count++, Link++) {\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) (OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + Count * sizeof(UINT16)),\r
+ 6, // SMBIOS type 6\r
+ Link,\r
+ &gEfiMemorySubClassGuid\r
+ );\r
+ }\r
+ \r
+ //\r
+ // EnabledCorrectingCapability\r
+ // \r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + (MemoryController->NumberofMemorySlot) * sizeof(UINT16),\r
+ &MemoryController->EnabledCorrectingCapability,\r
+ 1\r
+ );\r
+ }\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type \r
+ -- Memory 32 Bit Error Information: SMBIOS Type 18\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType9 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_32BIT_ERROR_INFORMATION *MemoryInfo;\r
+ \r
+ MemoryInfo = (EFI_MEMORY_32BIT_ERROR_INFORMATION *)RecordData;\r
+ \r
+ //\r
+ // MemoryErrorType\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorType),\r
+ &MemoryInfo->MemoryErrorType,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // MemoryErrorGranularity\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorGranularity),\r
+ &MemoryInfo->MemoryErrorGranularity,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // MemoryErrorOperation\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorOperation),\r
+ &MemoryInfo->MemoryErrorOperation,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // VendorSyndrome\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, VendorSyndrome),\r
+ &MemoryInfo->VendorSyndrome,\r
+ 4\r
+ ); \r
+\r
+ //\r
+ // MemoryArrayErrorAddress\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, MemoryArrayErrorAddress),\r
+ &MemoryInfo->MemoryArrayErrorAddress,\r
+ 4\r
+ ); \r
+\r
+ //\r
+ // DeviceErrorAddress\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, DeviceErrorAddress),\r
+ &MemoryInfo->DeviceErrorAddress,\r
+ 4\r
+ ); \r
+\r
+ //\r
+ // DeviceErrorResolution\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorResolution),\r
+ &MemoryInfo->DeviceErrorResolution,\r
+ 4\r
+ ); \r
+ \r
+ return EFI_SUCCESS; \r
+}\r
+\r
+/**\r
+ Field Filling Function for Memory SubClass record type \r
+ -- Memory 64 Bit Error Information: SMBIOS Type 33\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMemoryType10 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MEMORY_64BIT_ERROR_INFORMATION *MemoryInfo;\r
+ \r
+ MemoryInfo = (EFI_MEMORY_64BIT_ERROR_INFORMATION *)RecordData;\r
+ \r
+ //\r
+ // MemoryErrorType\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorType),\r
+ &MemoryInfo->MemoryErrorType,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // MemoryErrorGranularity\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorGranularity),\r
+ &MemoryInfo->MemoryErrorGranularity,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // MemoryErrorOperation\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorOperation),\r
+ &MemoryInfo->MemoryErrorOperation,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // VendorSyndrome\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, VendorSyndrome),\r
+ &MemoryInfo->VendorSyndrome,\r
+ 4\r
+ ); \r
+\r
+ //\r
+ // MemoryArrayErrorAddress\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, MemoryArrayErrorAddress),\r
+ &MemoryInfo->MemoryArrayErrorAddress,\r
+ 8\r
+ ); \r
+\r
+ //\r
+ // DeviceErrorAddress\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, DeviceErrorAddress),\r
+ &MemoryInfo->DeviceErrorAddress,\r
+ 8\r
+ ); \r
+\r
+ //\r
+ // DeviceErrorResolution\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorResolution),\r
+ &MemoryInfo->DeviceErrorResolution,\r
+ 4\r
+ ); \r
+ \r
+ return EFI_SUCCESS; \r
+}\r
--- /dev/null
+/** @file\r
+ Routines that support Misc SubClass data records translation.\r
+ \r
+Copyright (c) 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 0 -- Bios Information.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType0 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_BIOS_VENDOR_DATA *BiosInfo;\r
+\r
+ Status = EFI_SUCCESS;\r
+ BiosInfo = NULL;\r
+\r
+ BiosInfo = (EFI_MISC_BIOS_VENDOR_DATA *) RecordData;\r
+\r
+ //\r
+ // Bios Vendor\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE0, Vendor),\r
+ &(BiosInfo->BiosVendor),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Bios Version\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosVersion),\r
+ &(BiosInfo->BiosVersion),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Bios Release Date\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosReleaseDate),\r
+ &(BiosInfo->BiosReleaseDate),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Bios Starting Address Segment\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSegment),\r
+ &BiosInfo->BiosStartingAddress,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Bios Physical device size\r
+ //\r
+ SmbiosFldBase2ToByteWith64K (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize),\r
+ &BiosInfo->BiosPhysicalDeviceSize,\r
+ sizeof (EFI_EXP_BASE2_DATA)\r
+ );\r
+ (*(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosSize)))--;\r
+\r
+ //\r
+ // Bios Characteristics\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics),\r
+ &BiosInfo->BiosCharacteristics1,\r
+ 4\r
+ );\r
+ \r
+ //\r
+ // Bios Characteristics higher four bytes\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BiosCharacteristics) + 4,\r
+ &BiosInfo->BiosCharacteristics2,\r
+ 4\r
+ ); \r
+\r
+ //\r
+ // Bios Characteristics Extension1/2\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, BIOSCharacteristicsExtensionBytes),\r
+ (UINT8 *) &BiosInfo->BiosCharacteristics1 + 4,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // System BIOS Major Release\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMajorRelease),\r
+ (UINT8 *) &BiosInfo->BiosMajorRelease,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // System BIOS Minor Release\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, SystemBiosMinorRelease),\r
+ (UINT8 *) &BiosInfo->BiosMinorRelease,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Embedded Controller Firmware Major Release\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMajorRelease),\r
+ (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMajorRelease,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Embedded Controller Firmware Minor Release\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE0, EmbeddedControllerFirmwareMinorRelease),\r
+ (UINT8 *) &BiosInfo->BiosEmbeddedFirmwareMinorRelease,\r
+ 1\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 1 -- System Information.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType1 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_SYSTEM_MANUFACTURER_DATA *SystemInfo;\r
+\r
+ Status = EFI_SUCCESS;\r
+ SystemInfo = NULL;\r
+\r
+ SystemInfo = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) RecordData;\r
+\r
+ //\r
+ // System Manufacturer\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE1, Manufacturer),\r
+ &(SystemInfo->SystemManufacturer),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // System Product Name\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE1, ProductName),\r
+ &(SystemInfo->SystemProductName),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // System Version\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE1, Version),\r
+ &(SystemInfo->SystemVersion),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // System Serial Number\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE1, SerialNumber),\r
+ &(SystemInfo->SystemSerialNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Uuid\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, Uuid),\r
+ &SystemInfo->SystemUuid,\r
+ 16\r
+ );\r
+\r
+ //\r
+ // Wakeup Type\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE1, WakeUpType),\r
+ &SystemInfo->SystemWakeupType,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // System SKU Number\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE1, SKUNumber),\r
+ &(SystemInfo->SystemSKUNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // System Family\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE1, Family),\r
+ &(SystemInfo->SystemFamily),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for record type 2 -- Base Board Manufacture.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType2 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_BASE_BOARD_MANUFACTURER_DATA *Bbm;\r
+ Status = EFI_SUCCESS;\r
+ Bbm = (EFI_MISC_BASE_BOARD_MANUFACTURER_DATA *) RecordData;\r
+\r
+ //\r
+ // Manufacturer\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE2, Manufacturer),\r
+ &(Bbm->BaseBoardManufacturer),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Product\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE2, ProductName),\r
+ &(Bbm->BaseBoardProductName),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Version\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE2, Version),\r
+ &(Bbm->BaseBoardVersion),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Serial Number\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE2, SerialNumber),\r
+ &(Bbm->BaseBoardSerialNumber),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Asset Tag\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE2, AssetTag),\r
+ &(Bbm->BaseBoardAssetTag),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Location in Chassis\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE2, LocationInChassis),\r
+ &(Bbm->BaseBoardChassisLocation),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Feature Flags\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, FeatureFlag),\r
+ &Bbm->BaseBoardFeatureFlags,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Board Type\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, BoardType)) = (UINT8) Bbm->BaseBoardType;\r
+\r
+ //\r
+ // Chassis Handle\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE2, ChassisHandle),\r
+ 3, // SMBIOS type 3 - System Enclosure or Chassis\r
+ &Bbm->BaseBoardChassisLink,\r
+ &gEfiMiscSubClassGuid\r
+ );\r
+\r
+ //\r
+ // Number of Contained Object Handles\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE2, NumberOfContainedObjectHandles)) = (UINT8) Bbm->BaseBoardNumberLinks;\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 3 -\r
+ - System Enclosure or Chassis.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType3 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_CHASSIS_MANUFACTURER_DATA *Ec;\r
+ EFI_MISC_ELEMENTS *Element;\r
+ UINT16 Index;\r
+ UINT8 ContainedElementType;\r
+ Status = EFI_SUCCESS;\r
+ Ec = (EFI_MISC_CHASSIS_MANUFACTURER_DATA *) RecordData;\r
+\r
+ //\r
+ // Chassis Type\r
+ //\r
+ *(UINT8*)((UINT8 *) (StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, Type)) \r
+ = (UINT8) (Ec->ChassisType.ChassisType | Ec->ChassisType.ChassisLockPresent << 7);\r
+\r
+\r
+ //\r
+ // Chassis Bootup State\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, BootupState),\r
+ &Ec->ChassisBootupState,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Chassis Power Supply State\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, PowerSupplyState),\r
+ &Ec->ChassisPowerSupplyState,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Chassis Thermal State\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, ThermalState),\r
+ &Ec->ChassisThermalState,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Chassis Security State\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, SecurityStatus),\r
+ &Ec->ChassisSecurityState,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Chassis Oem Defined\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE3, OemDefined),\r
+ &Ec->ChassisOemDefined,\r
+ 4\r
+ );\r
+\r
+ //\r
+ // Chassis Height\r
+ //\r
+ *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, Height)) \r
+ = (UINT8)Ec->ChassisHeight;\r
+\r
+ //\r
+ // Chassis Number Power Cords\r
+ //\r
+ *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, NumberofPowerCords)) \r
+ = (UINT8)Ec->ChassisNumberPowerCords;\r
+ \r
+ //\r
+ // Chassis Element Count\r
+ //\r
+ *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementCount)) \r
+ = (UINT8)Ec->ChassisElementCount;\r
+\r
+ if( Ec->ChassisElementCount ) {\r
+ //\r
+ // Element Record Length\r
+ // Current solution covers first 3 bytes; user can extend to meet its requirements.\r
+ //\r
+ *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElementRecordLength)) \r
+ = (UINT8)sizeof(CONTAINED_ELEMENT);\r
+\r
+ //\r
+ // Update the structure's length and StructureSize\r
+ //\r
+ StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
+ Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT));\r
+ Status = SmbiosEnlargeStructureBuffer (\r
+ StructureNode,\r
+ StructureNode->Structure->Length,\r
+ StructureNode->StructureSize,\r
+ StructureNode->StructureSize + Ec->ChassisElementCount * sizeof(CONTAINED_ELEMENT)\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ \r
+ //\r
+ // Contained Elements\r
+ //\r
+ for (Index=0, Element = &Ec->ChassisElements; \r
+ Index < Ec->ChassisElementCount; \r
+ Index += 1, Element ++) {\r
+\r
+ //\r
+ // ContainedElementType\r
+ //\r
+ ContainedElementType = (UINT8)((Element->ChassisElementType.RecordType == 1)\r
+ ? (UINT8)(Element->ChassisElementType.RecordType << 7 | Element->ChassisElementType.Type)\r
+ : (UINT8)(Element->ChassisBaseBoard));\r
+ *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
+ Index * sizeof(CONTAINED_ELEMENT) + \r
+ OFFSET_OF(CONTAINED_ELEMENT,ContainedElementType)) \r
+ = ContainedElementType;\r
+\r
+ //\r
+ // ContainedElementMinimum\r
+ //\r
+ *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
+ Index * sizeof(CONTAINED_ELEMENT) + \r
+ OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMinimum))\r
+ = (UINT8)Element->ChassisElementMinimum;\r
+\r
+ //\r
+ // ContainedElementMaximum\r
+ //\r
+ *(UINT8*)((UINT8*)(StructureNode->Structure) + \r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) + \r
+ Index * sizeof(CONTAINED_ELEMENT) + \r
+ OFFSET_OF(CONTAINED_ELEMENT,ContainedElementMaximum)) \r
+ = (UINT8)Element->ChassisElementMaximum;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Move the filling of following four String fields after Contained Elements \r
+ // because they would break SMBIOS table.\r
+ // Chassis Manufacturer\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, Manufacturer),\r
+ &(Ec->ChassisManufacturer),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Chassis Version\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, Version),\r
+ &(Ec->ChassisVersion),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Chassis Serial Number\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, SerialNumber),\r
+ &(Ec->ChassisSerialNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Chassis Asset Tag\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE3, AssetTag),\r
+ &(Ec->ChassisAssetTag),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+ \r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 8 -- Port Connector.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType8 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *Picd;\r
+\r
+ Status = EFI_SUCCESS;\r
+ Picd = (EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA *) RecordData;\r
+\r
+ //\r
+ // Internal Connector Designator\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalReferenceDesignator),\r
+ &(Picd->PortInternalConnectorDesignator),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Internal Connector Type\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, InternalConnectorType)) = (UINT8) Picd->PortInternalConnectorType;\r
+\r
+ //\r
+ // External Connector Designator\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalReferenceDesignator),\r
+ &(Picd->PortExternalConnectorDesignator),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Internal Connector Type\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, ExternalConnectorType)) = (UINT8) Picd->PortExternalConnectorType;\r
+\r
+ //\r
+ // Internal Connector Type\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE8, PortType)) = (UINT8) Picd->PortType;\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 9 -- System slot.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType9 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA *Slot;\r
+\r
+ Status = EFI_SUCCESS;\r
+ Slot = (EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA *) RecordData;\r
+\r
+ //\r
+ // Slot Designation\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDesignation),\r
+ &(Slot->SlotDesignation),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Slot Type\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotType),\r
+ &Slot->SlotType,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Slot Data Bus Width\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotDataBusWidth),\r
+ &Slot->SlotDataBusWidth,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Slot Usage\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, CurrentUsage),\r
+ &Slot->SlotUsage,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Slot Length\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotLength),\r
+ &Slot->SlotLength,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Slot Id\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotID),\r
+ &Slot->SlotId,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Slot Characteristics\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE9, SlotCharacteristics1),\r
+ &Slot->SlotCharacteristics,\r
+ 2\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 10 - Onboard Device.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType10 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_ONBOARD_DEVICE_DATA *OnboardDevice;\r
+ UINTN NumberOfDevices;\r
+ UINTN Index;\r
+ UINT8 StatusAndType;\r
+\r
+ Status = EFI_SUCCESS;\r
+ OnboardDevice = (EFI_MISC_ONBOARD_DEVICE_DATA *) RecordData;\r
+\r
+ NumberOfDevices = (StructureNode->Structure->Length - 4) / 2;\r
+ for (Index = 0; Index < NumberOfDevices; Index += 1) {\r
+ //\r
+ // OnBoard Device Description\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + 1 + (2 * Index)),\r
+ &(OnboardDevice->OnBoardDeviceDescription),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Status & Type: Bit 7 Devicen Status, Bits 6:0 Type of Device\r
+ //\r
+ StatusAndType = (UINT8) OnboardDevice->OnBoardDeviceStatus.DeviceType;\r
+ if (OnboardDevice->OnBoardDeviceStatus.DeviceEnabled != 0) {\r
+ StatusAndType |= 0x80;\r
+ } else {\r
+ StatusAndType &= 0x7F;\r
+ }\r
+\r
+ * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + (OFFSET_OF (SMBIOS_TABLE_TYPE10, Device) + (2 * Index))) = StatusAndType;\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 11 - OEM Strings.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType11 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_OEM_STRING_DATA *OemString;\r
+\r
+ OemString = (EFI_MISC_OEM_STRING_DATA *)RecordData;\r
+ //\r
+ // OEM String data\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE11, StringCount),\r
+ &(OemString->OemStringRef[0]),\r
+ 2\r
+ );\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 12 - System Options.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType12 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_SYSTEM_OPTION_STRING_DATA *Sos;\r
+ UINTN NumberOfInstallableLanguages;\r
+ UINTN Index;\r
+\r
+ Status = EFI_SUCCESS;\r
+ Sos = (EFI_MISC_SYSTEM_OPTION_STRING_DATA *) RecordData;\r
+\r
+ //\r
+ // As MiscDataHub spec defines,\r
+ // NumberOfInstallableLanguages should retrieve from Type 13.\r
+ //\r
+ NumberOfInstallableLanguages = (StructureNode->Structure->Length - 4);\r
+ for (Index = 0; Index < NumberOfInstallableLanguages; Index += 1) {\r
+ //\r
+ // OnBoard Device Description\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ (UINT32) (OFFSET_OF (SMBIOS_TABLE_TYPE12, StringCount) + (Index)),\r
+ &(Sos->SystemOptionStringRef[Index]),\r
+ 2\r
+ );\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 13 - BIOS Language.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType13 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA *InstallableLanguage;\r
+\r
+ InstallableLanguage = (EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA *) RecordData;\r
+\r
+ //\r
+ // Number Of Installable Languages\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, InstallableLanguages)) = (UINT8) (InstallableLanguage->NumberOfInstallableLanguages);\r
+\r
+ //\r
+ // Language Flags\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, Flags),\r
+ &InstallableLanguage->LanguageFlags,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Current Language Number\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+ &(InstallableLanguage->CurrentLanguageNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 14 - System Language String\r
+ Current solution assumes that EFI_MISC_SYSTEM_LANGUAGE_STRINGs are logged with\r
+ their LanguageId having ascending orders.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType14 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ UINT16 CurrentLanguageNumber;\r
+ EFI_MISC_SYSTEM_LANGUAGE_STRING *LanguageString;\r
+ \r
+ LanguageString = (EFI_MISC_SYSTEM_LANGUAGE_STRING *) RecordData;\r
+\r
+ //\r
+ // Backup CurrentLanguage\r
+ //\r
+ CopyMem (\r
+ &CurrentLanguageNumber,\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Clear the field so that SmbiosFldString can be reused\r
+ //\r
+ *(UINT8 *)((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages)) = 0;\r
+ \r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+ &(LanguageString->SystemLanguageString),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // Restore CurrentLanguage\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE13, CurrentLanguages),\r
+ &CurrentLanguageNumber,\r
+ 1\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 15 -- System Event Log.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType15 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_SYSTEM_EVENT_LOG_DATA *SystemEventLog;\r
+\r
+ Status = EFI_SUCCESS;\r
+ SystemEventLog = NULL;\r
+\r
+ SystemEventLog = (EFI_MISC_SYSTEM_EVENT_LOG_DATA *) RecordData;\r
+\r
+ //\r
+ // Log Area Length\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogAreaLength),\r
+ &(SystemEventLog->LogAreaLength),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Log Header Start Offset\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderStartOffset),\r
+ &(SystemEventLog->LogHeaderStartOffset),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Log Data Start Offset\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogDataStartOffset),\r
+ &(SystemEventLog->LogDataStartOffset),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Access Method\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethod),\r
+ &(SystemEventLog->AccessMethod),\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Log Status\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogStatus),\r
+ &(SystemEventLog->LogStatus),\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Log Change Token\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogChangeToken),\r
+ &(SystemEventLog->LogChangeToken),\r
+ 4\r
+ );\r
+\r
+ //\r
+ // Access Method Address\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, AccessMethodAddress),\r
+ &(SystemEventLog->AccessMethodAddress),\r
+ 4\r
+ );\r
+\r
+ //\r
+ // Log Header Format\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LogHeaderFormat),\r
+ &(SystemEventLog->LogHeaderFormat),\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Number of Supported Log Type Descriptors\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, NumberOfSupportedLogTypeDescriptors),\r
+ &(SystemEventLog->NumberOfSupportedLogType),\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Length of each Log Type Descriptor\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE15, LengthOfLogTypeDescriptor),\r
+ &(SystemEventLog->LengthOfLogDescriptor),\r
+ 1\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 21 - Pointing Device.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType21 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_POINTING_DEVICE_TYPE_DATA *PointingDeviceData;\r
+\r
+ PointingDeviceData = (EFI_MISC_POINTING_DEVICE_TYPE_DATA *) RecordData;\r
+\r
+ //\r
+ // Pointing Device Type\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Type)) = (UINT8) (PointingDeviceData->PointingDeviceType);\r
+\r
+ //\r
+ // Pointing Device Interface\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, Interface)) = (UINT8) (PointingDeviceData->PointingDeviceInterface);\r
+\r
+ //\r
+ // Number Pointing Device Buttons\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE21, NumberOfButtons)) = (UINT8) (PointingDeviceData->NumberPointingDeviceButtons);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 22 - Portable Battery.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType22 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_PORTABLE_BATTERY *PortableBattery;\r
+ STRING_REF Chemistry;\r
+ PortableBattery = (EFI_MISC_PORTABLE_BATTERY *)RecordData;\r
+ \r
+ //\r
+ // Location\r
+ // \r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE22, Location),\r
+ &(PortableBattery->Location),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+ \r
+ //\r
+ // Manufacturer\r
+ // \r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE22, Manufacturer),\r
+ &(PortableBattery->Manufacturer),\r
+ 2 \r
+ ); \r
+\r
+ //\r
+ // ManufactureDate\r
+ // \r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE22, ManufactureDate),\r
+ &(PortableBattery->ManufactureDate),\r
+ 2 \r
+ ); \r
+\r
+ //\r
+ // SerialNumber\r
+ // \r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE22, SerialNumber),\r
+ &(PortableBattery->SerialNumber),\r
+ 2 \r
+ );\r
+\r
+ //\r
+ // DeviceName\r
+ // \r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceName),\r
+ &(PortableBattery->DeviceName),\r
+ 2 \r
+ ); \r
+ \r
+ //\r
+ // DeviceChemistry\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceChemistry),\r
+ &PortableBattery->DeviceChemistry,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // DesignCapacity\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DeviceCapacity),\r
+ &PortableBattery->DesignCapacity,\r
+ 2\r
+ );\r
+ \r
+ //\r
+ // DesignVoltage\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignVoltage),\r
+ &PortableBattery->DesignVoltage,\r
+ 2\r
+ ); \r
+ \r
+ //\r
+ // SBDSVersionNumber\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSVersionNumber),\r
+ &(PortableBattery->SBDSVersionNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+\r
+ //\r
+ // MaximumError\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, MaximumErrorInBatteryData),\r
+ &PortableBattery->MaximumError,\r
+ 1\r
+ ); \r
+ \r
+ //\r
+ // SBDSSerialNumber\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSSerialNumber),\r
+ &PortableBattery->SBDSSerialNumber,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // SBDSManufactureDate\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSManufactureDate),\r
+ &PortableBattery->SBDSManufactureDate,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Avoid alignment issue on IPF\r
+ //\r
+ CopyMem (\r
+ &Chemistry, \r
+ &PortableBattery->SBDSDeviceChemistry,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // SBDSDeviceChemistry\r
+ // \r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE22, SBDSDeviceChemistry),\r
+ &Chemistry,\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+ \r
+ //\r
+ // DesignCapacityMultiplier\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, DesignCapacityMultiplier),\r
+ &PortableBattery->DesignCapacityMultiplier,\r
+ 1\r
+ ); \r
+ \r
+ //\r
+ // OEMSpecific\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE22, OEMSpecific),\r
+ &PortableBattery->OEMSpecific,\r
+ 4\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 23 - System Reset.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType23 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_RESET_CAPABILITIES_DATA *SystemResetData;\r
+\r
+ SystemResetData = (EFI_MISC_RESET_CAPABILITIES_DATA *) RecordData;\r
+\r
+ //\r
+ // Reset Capabilities\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Capabilities),\r
+ &(SystemResetData->ResetCapabilities),\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Reset Count\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetCount),\r
+ &(SystemResetData->ResetCount),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Reset Limit\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, ResetLimit),\r
+ &(SystemResetData->ResetLimit),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Reset Timer Interval\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, TimerInterval),\r
+ &(SystemResetData->ResetTimerInterval),\r
+ 2\r
+ );\r
+\r
+ //\r
+ // Reset Timeout\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE23, Timeout),\r
+ &(SystemResetData->ResetTimeout),\r
+ 2\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 24 - Hardware Security.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType24 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *HardwareSecurity;\r
+ \r
+ HardwareSecurity = (EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA *)RecordData;\r
+ \r
+ //\r
+ // Hardware Security Settings\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE24, HardwareSecuritySettings),\r
+ &HardwareSecurity->HardwareSecuritySettings,\r
+ 1\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 25 - System Power Controls.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType25 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_SCHEDULED_POWER_ON_MONTH *PowerOnMonth;\r
+ \r
+ PowerOnMonth = (EFI_MISC_SCHEDULED_POWER_ON_MONTH *)RecordData;\r
+ \r
+ //\r
+ // ScheduledPoweronMonth\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMonth),\r
+ &PowerOnMonth->ScheduledPoweronMonth,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // ScheduledPoweronDayOfMonth\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnDayOfMonth),\r
+ &PowerOnMonth->ScheduledPoweronDayOfMonth,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // ScheduledPoweronHour\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnHour),\r
+ &PowerOnMonth->ScheduledPoweronHour,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // ScheduledPoweronMinute\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnMinute),\r
+ &PowerOnMonth->ScheduledPoweronMinute,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // ScheduledPoweronSecond\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE25, NextScheduledPowerOnSecond),\r
+ &PowerOnMonth->ScheduledPoweronSecond,\r
+ 1\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 26 - Voltage Probe.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType26 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *VoltageProbe;\r
+ \r
+ VoltageProbe = (EFI_MISC_VOLTAGE_PROBE_DESCRIPTION *)RecordData;\r
+ \r
+ //\r
+ // VoltageProbe Description\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE26, Description),\r
+ &(VoltageProbe->VoltageProbeDescription),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+ \r
+ //\r
+ // VoltageProbeLocation\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, LocationAndStatus),\r
+ &VoltageProbe->VoltageProbeLocation,\r
+ 1\r
+ ); \r
+ \r
+ //\r
+ // VoltageProbeMaximumValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MaximumValue),\r
+ &VoltageProbe->VoltageProbeMaximumValue,\r
+ 2\r
+ ); \r
+ \r
+ //\r
+ // VoltageProbeMinimumValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, MinimumValue),\r
+ &VoltageProbe->VoltageProbeMinimumValue,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // VoltageProbeResolution\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Resolution),\r
+ &VoltageProbe->VoltageProbeResolution,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // VoltageProbeTolerance\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Tolerance),\r
+ &VoltageProbe->VoltageProbeTolerance,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // VoltageProbeAccuracy\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, Accuracy),\r
+ &VoltageProbe->VoltageProbeAccuracy,\r
+ 2\r
+ ); \r
+ \r
+ //\r
+ // VoltageProbeNominalValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, NominalValue),\r
+ &VoltageProbe->VoltageProbeNominalValue,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // VoltageProbeOemDefined\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE26, OEMDefined),\r
+ &VoltageProbe->VoltageProbeOemDefined,\r
+ 4\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 27 - Cooling Device.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType27 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_COOLING_DEVICE_TEMP_LINK *CoolingDevice;\r
+ \r
+ CoolingDevice = (EFI_MISC_COOLING_DEVICE_TEMP_LINK *)RecordData;\r
+ \r
+ //\r
+ // Device Type\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, DeviceTypeAndStatus),\r
+ &CoolingDevice->CoolingDeviceType,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // Temperature Probe\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE27, TemperatureProbeHandle),\r
+ 28, // SMBIOS type 28 - Temperature Probe\r
+ &CoolingDevice->CoolingDeviceTemperatureLink,\r
+ &gEfiMiscSubClassGuid\r
+ );\r
+ \r
+ //\r
+ // CoolingDeviceUnitGroup\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, CoolingUnitGroup),\r
+ &CoolingDevice->CoolingDeviceUnitGroup,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // CoolingDeviceUnitGroup\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, OEMDefined),\r
+ &CoolingDevice->CoolingDeviceOemDefined,\r
+ 4\r
+ );\r
+\r
+ //\r
+ // CoolingDeviceNominalSpeed\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE27, NominalSpeed),\r
+ &CoolingDevice->CoolingDeviceNominalSpeed,\r
+ 2\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 28 -- Temperature Probe.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType28 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *TemperatureProbe;\r
+ \r
+ TemperatureProbe = (EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION *)RecordData;\r
+ \r
+ //\r
+ // TemperatureProbeDescription\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE28, Description),\r
+ &(TemperatureProbe->TemperatureProbeDescription),\r
+ 2\r
+ );\r
+ \r
+ //\r
+ // TemperatureProbeLocation\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, LocationAndStatus),\r
+ &TemperatureProbe->TemperatureProbeLocation,\r
+ 1\r
+ ); \r
+ \r
+ //\r
+ // TemperatureProbeMaximumValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MaximumValue),\r
+ &TemperatureProbe->TemperatureProbeMaximumValue,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // TemperatureProbeMinimumValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, MinimumValue),\r
+ &TemperatureProbe->TemperatureProbeMinimumValue,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // TemperatureProbeResolution\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Resolution),\r
+ &TemperatureProbe->TemperatureProbeResolution,\r
+ 2\r
+ ); \r
+ \r
+\r
+ //\r
+ // TemperatureProbeTolerance\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Tolerance),\r
+ &TemperatureProbe->TemperatureProbeTolerance,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // TemperatureProbeAccuracy\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, Accuracy),\r
+ &TemperatureProbe->TemperatureProbeAccuracy,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // TemperatureProbeNominalValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, NominalValue),\r
+ &TemperatureProbe->TemperatureProbeNominalValue,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // TemperatureProbeOemDefined\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE28, OEMDefined),\r
+ &TemperatureProbe->TemperatureProbeOemDefined,\r
+ 4\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+} \r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 29 -- Electrical Current Probe.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType29 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *ElectricalProbe;\r
+ \r
+ ElectricalProbe = (EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION *)RecordData;\r
+ \r
+ //\r
+ // ElectricalCurrentProbeDescription\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE29, Description),\r
+ &(ElectricalProbe->ElectricalCurrentProbeDescription),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ );\r
+ \r
+ //\r
+ // ElectricalCurrentProbeLocation\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, LocationAndStatus),\r
+ &ElectricalProbe->ElectricalCurrentProbeLocation,\r
+ 1\r
+ );\r
+ \r
+ //\r
+ // ElectricalCurrentProbeMaximumValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MaximumValue),\r
+ &ElectricalProbe->ElectricalCurrentProbeMaximumValue,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // ElectricalCurrentProbeMinimumValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, MinimumValue),\r
+ &ElectricalProbe->ElectricalCurrentProbeMinimumValue,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // ElectricalCurrentProbeResolution\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Resolution),\r
+ &ElectricalProbe->ElectricalCurrentProbeResolution,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // ElectricalCurrentProbeTolerance\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Tolerance),\r
+ &ElectricalProbe->ElectricalCurrentProbeTolerance,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // ElectricalCurrentProbeAccuracy\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, Accuracy),\r
+ &ElectricalProbe->ElectricalCurrentProbeAccuracy,\r
+ 2\r
+ ); \r
+ //\r
+ // ElectricalCurrentProbeNominalValue\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, NominalValue),\r
+ &ElectricalProbe->ElectricalCurrentProbeNominalValue,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // ElectricalCurrentProbeOemDefined\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE29, OEMDefined),\r
+ &ElectricalProbe->ElectricalCurrentProbeOemDefined,\r
+ 4\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 30 -- Out-of-Band Remote Access.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType30 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *RemoteData;\r
+ \r
+ RemoteData = (EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION *)RecordData;\r
+ \r
+ //\r
+ // ManufacturerNameDescription\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE30, ManufacturerName),\r
+ &(RemoteData->RemoteAccessManufacturerNameDescription),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+ \r
+ //\r
+ // RemoteAccessConnections\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE30, Connections),\r
+ &RemoteData->RemoteAccessConnections,\r
+ 1\r
+ );\r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 32 -- System Boot Information.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType32 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_MISC_BOOT_INFORMATION_STATUS_DATA *BootInfo;\r
+\r
+ Status = EFI_SUCCESS;\r
+ BootInfo = (EFI_MISC_BOOT_INFORMATION_STATUS_DATA *) RecordData;\r
+\r
+ //\r
+ // Set reserved bytes\r
+ //\r
+ ZeroMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, Reserved), 6);\r
+\r
+ //\r
+ // Set BootInformation Status\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus),\r
+ &BootInfo->BootInformationStatus,\r
+ 1\r
+ );\r
+\r
+ //\r
+ // Set Additional Data\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE32, BootStatus) + 1,\r
+ &BootInfo->BootInformationData,\r
+ 9\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 34 -- Management Device.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType34 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *ManagementDevice;\r
+ \r
+ ManagementDevice = (EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION *)RecordData;\r
+ \r
+ //\r
+ // ManagementDeviceDescription\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE34, Description),\r
+ &(ManagementDevice->ManagementDeviceDescription),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+ \r
+ //\r
+ // ManagementDeviceType\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Type),\r
+ &ManagementDevice->ManagementDeviceType,\r
+ 1\r
+ ); \r
+\r
+ //\r
+ // ManagementDeviceAddress\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, Address),\r
+ &ManagementDevice->ManagementDeviceAddress,\r
+ 4\r
+ ); \r
+\r
+ //\r
+ // ManagementDeviceAddressType\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE34, AddressType),\r
+ &ManagementDevice->ManagementDeviceAddressType,\r
+ 1\r
+ ); \r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 36 -- Management Device Threshold.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType36 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *DeviceThreshold;\r
+ \r
+ DeviceThreshold = (EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD *)RecordData;\r
+\r
+ //\r
+ // LowerThresNonCritical\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonCritical),\r
+ &DeviceThreshold->LowerThresNonCritical,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // UpperThresNonCritical\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonCritical),\r
+ &DeviceThreshold->UpperThresNonCritical,\r
+ 2\r
+ );\r
+ \r
+ //\r
+ // LowerThresCritical\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdCritical),\r
+ &DeviceThreshold->LowerThresCritical,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // UpperThresCritical\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdCritical),\r
+ &DeviceThreshold->UpperThresCritical,\r
+ 2\r
+ ); \r
+\r
+ //\r
+ // LowerThresNonRecover\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, LowerThresholdNonRecoverable),\r
+ &DeviceThreshold->LowerThresNonRecover,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // UpperThresNonRecover\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE36, UpperThresholdNonRecoverable),\r
+ &DeviceThreshold->UpperThresNonRecover,\r
+ 2\r
+ ); \r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 38 -- IPMI device info.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType38 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_IPMI_INTERFACE_TYPE_DATA *IpmiInfo;\r
+\r
+ IpmiInfo = (EFI_MISC_IPMI_INTERFACE_TYPE_DATA *) RecordData;\r
+\r
+ //\r
+ // Interface Type\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, InterfaceType)) = (UINT8) (IpmiInfo->IpmiInterfaceType);\r
+\r
+ //\r
+ // IPMI specification revision\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, IPMISpecificationRevision)) = \r
+ (UINT8) ((IpmiInfo->IpmiSpecificationRevision.IpmiSpecLeastSignificantDigit) + \\r
+ (IpmiInfo->IpmiSpecificationRevision.IpmiSpecMostSignificantDigit << 4));\r
+\r
+ //\r
+ // I2C slave address\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, I2CSlaveAddress)) = (UINT8) (IpmiInfo->IpmiI2CSlaveAddress);\r
+\r
+ //\r
+ // NV storage device address\r
+ //\r
+ *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, NVStorageDeviceAddress)) = (UINT8) (IpmiInfo->IpmiNvDeviceAddress);\r
+\r
+ //\r
+ // Base address\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE38, BaseAddress),\r
+ &IpmiInfo->IpmiBaseAddress,\r
+ 8\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 39 -- Power supply.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType39 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_MISC_SYSTEM_POWER_SUPPLY *PowerSupply;\r
+ \r
+ PowerSupply = (EFI_MISC_SYSTEM_POWER_SUPPLY *)RecordData;\r
+ \r
+ //\r
+ // PowerUnitGroup\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerUnitGroup),\r
+ &PowerSupply->PowerUnitGroup,\r
+ 1\r
+ ); \r
+ \r
+ //\r
+ // PowerSupplyLocation\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE39, Location),\r
+ &(PowerSupply->PowerSupplyLocation),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+\r
+ //\r
+ // PowerSupplyDeviceName\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE39, DeviceName),\r
+ &(PowerSupply->PowerSupplyDeviceName),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+\r
+ //\r
+ // PowerSupplyManufacturer\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE39, Manufacturer),\r
+ &(PowerSupply->PowerSupplyManufacturer),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+\r
+ //\r
+ // PowerSupplySerialNumber\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE39, SerialNumber),\r
+ &(PowerSupply->PowerSupplySerialNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+ \r
+ //\r
+ // PowerSupplyAssetTagNumber\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE39, AssetTagNumber),\r
+ &(PowerSupply->PowerSupplyAssetTagNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+\r
+ //\r
+ // PowerSupplyModelPartNumber\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE39, ModelPartNumber),\r
+ &(PowerSupply->PowerSupplyModelPartNumber),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+ \r
+ //\r
+ // PowerSupplyRevisionLevel\r
+ //\r
+ SmbiosFldString (\r
+ StructureNode,\r
+ OFFSET_OF (SMBIOS_TABLE_TYPE39, RevisionLevel),\r
+ &(PowerSupply->PowerSupplyRevisionLevel),\r
+ 2 // 64 * sizeof(CHAR16)\r
+ ); \r
+\r
+ //\r
+ // PowerSupplyMaxPowerCapacity\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, MaxPowerCapacity),\r
+ &PowerSupply->PowerSupplyMaxPowerCapacity,\r
+ 2\r
+ );\r
+\r
+ //\r
+ // PowerSupplyCharacteristics\r
+ //\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE39, PowerSupplyCharacteristics),\r
+ &PowerSupply->PowerSupplyCharacteristics,\r
+ 2\r
+ );\r
+ \r
+ //\r
+ // PowerSupplyInputVoltageProbeLink\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputVoltageProbeHandle),\r
+ 26, // SMBIOS type 26 - Voltage Probe\r
+ &PowerSupply->PowerSupplyInputVoltageProbeLink,\r
+ &gEfiMiscSubClassGuid\r
+ ); \r
+\r
+ //\r
+ // PowerSupplyCoolingDeviceLink\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, CoolingDeviceHandle),\r
+ 27, // SMBIOS type 27 - Cooling Device\r
+ &PowerSupply->PowerSupplyCoolingDeviceLink,\r
+ &gEfiMiscSubClassGuid\r
+ ); \r
+\r
+ //\r
+ // PowerSupplyInputCurrentProbeLink\r
+ //\r
+ SmbiosFldInterLink (\r
+ StructureNode,\r
+ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE39, InputCurrentProbeHandle),\r
+ 29, // SMBIOS type 29 - Electrical Current Probe\r
+ &PowerSupply->PowerSupplyInputCurrentProbeLink,\r
+ &gEfiMiscSubClassGuid\r
+ ); \r
+ \r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 0x80-0xFF -- OEM.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscTypeOEM (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT8 *NewRecordData;\r
+ UINT32 IncrementDataSize;\r
+ UINT16 Handle;\r
+ INT8 Result;\r
+ UINT32 StructureSize;\r
+ UINT8 CountOfString;\r
+ \r
+ Status = EFI_SUCCESS;\r
+ NewRecordData = NULL;\r
+\r
+ //\r
+ // Check if OEM structure has included 2 trailing 0s in data record, if not, \r
+ // we append them at the end to ensure OEM structure is always correct with 2 trailing 0s.\r
+ //\r
+ Result = SmbiosCheckTrailingZero (RecordData, RecordDataSize);\r
+ \r
+ if (Result != 0) {\r
+ DEBUG ((EFI_D_ERROR, "OEM SMBIOS type %x is not valid!!\n", ((SMBIOS_STRUCTURE *) RecordData) -> Type));\r
+ if (Result == -1) {\r
+ //\r
+ // No 2 trailing 0s exist\r
+ //\r
+ DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has NO 2 trailing 0s!!\n"));\r
+ IncrementDataSize = 2;\r
+ } else {\r
+ //\r
+ // Only 1 trailing 0 exist at the end\r
+ //\r
+ DEBUG ((EFI_D_ERROR, "OEM SMBIOS type has only 1 trailing 0!!\n"));\r
+ IncrementDataSize = 1;\r
+ }\r
+ NewRecordData = AllocateZeroPool (RecordDataSize + IncrementDataSize);\r
+ ASSERT (NewRecordData != NULL);\r
+ CopyMem (NewRecordData, RecordData, RecordDataSize);\r
+ RecordData = NewRecordData;\r
+ RecordDataSize += IncrementDataSize;\r
+ }\r
+ \r
+ Status = GetSmbiosStructureSize (StructureNode->Structure, &StructureSize, &CountOfString);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ if (StructureSize < RecordDataSize) {\r
+ Status = SmbiosEnlargeStructureBuffer (\r
+ StructureNode,\r
+ ((EFI_SMBIOS_TABLE_HEADER *)RecordData)->Length,\r
+ StructureSize,\r
+ RecordDataSize\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+ \r
+ //\r
+ // Copy the entire data (including the Smbios structure header),\r
+ // but preserve the handle that is already allocated.\r
+ //\r
+ Handle = StructureNode->Structure->Handle;\r
+ CopyMem (\r
+ StructureNode->Structure,\r
+ RecordData,\r
+ RecordDataSize\r
+ );\r
+ StructureNode->Structure->Handle = Handle;\r
+ StructureNode->StructureSize = RecordDataSize;\r
+ \r
+ if (NewRecordData != NULL) {\r
+ FreePool (NewRecordData);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Misc SubClass record type 127 - End-of-Table.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldMiscType127 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+/** @file\r
+ Routines that support Processor SubClass data records translation.\r
+ \r
+Copyright (c) 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+/**\r
+ Field Filling Function for Processor SubClass record type 17 -- Cache association.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldProcessorType17 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
+ EFI_INTER_LINK_DATA *LinkData;\r
+ UINT16 FieldOffset;\r
+ UINT8 *Pointer;\r
+\r
+ DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) RecordData;\r
+ LinkData = (EFI_INTER_LINK_DATA *) (DataHeader + 1);\r
+ if (RecordDataSize != sizeof (EFI_INTER_LINK_DATA) + sizeof (EFI_SUBCLASS_TYPE1_HEADER)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ //\r
+ // Determine the cache level\r
+ //\r
+ Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);\r
+ if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
+ SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle), 2, 0xFF);\r
+ }\r
+\r
+ Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);\r
+ if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
+ SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle), 2, 0xFF);\r
+ }\r
+\r
+ Pointer = (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);\r
+ if ((*Pointer == 0) && (*(Pointer + 1) == 0)) {\r
+ SetMem ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle), 2, 0xFF);\r
+ }\r
+\r
+ if (LinkData->SubInstance == 1) {\r
+ FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L1CacheHandle);\r
+ } else if (LinkData->SubInstance == 2) {\r
+ FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L2CacheHandle);\r
+ } else if (LinkData->SubInstance == 3) {\r
+ FieldOffset = (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE4, L3CacheHandle);\r
+ } else {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ return SmbiosFldInterLink (\r
+ StructureNode,\r
+ FieldOffset,\r
+ 7, // Smbios type 7 -- Cache Information\r
+ LinkData,\r
+ &gEfiCacheSubClassGuid // gProcessorSubClassName\r
+ );\r
+}\r
+\r
+/**\r
+ Field Filling Function for Processor SubClass record type 6 -- ProcessorID.\r
+ Offset is mandatory.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldProcessorType6 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_PROCESSOR_ID_DATA *ProcessorIdData;\r
+\r
+ ProcessorIdData = RecordData;\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset,\r
+ &(ProcessorIdData->Signature),\r
+ 4\r
+ );\r
+\r
+ CopyMem (\r
+ (UINT8 *) (StructureNode->Structure) + Offset + 4,\r
+ &(ProcessorIdData->FeatureFlags),\r
+ 4\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Field Filling Function for Processor SubClass record type 9 -- Voltage.\r
+ Offset is mandatory.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldProcessorType9 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+{\r
+ EFI_EXP_BASE10_DATA *Base10Data;\r
+ INT16 Value;\r
+ INT16 Exponent;\r
+\r
+ if (RecordDataSize != sizeof (EFI_EXP_BASE10_DATA)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Base10Data = RecordData;\r
+ Value = Base10Data->Value;\r
+ Exponent = Base10Data->Exponent;\r
+\r
+ Exponent += 1;\r
+ while (Exponent != 0) {\r
+ if (Exponent > 0) {\r
+ Value = (INT16) (Value * 10);\r
+ Exponent--;\r
+ } else {\r
+ Value = (INT16) (Value / 10);\r
+ Exponent++;\r
+ }\r
+ }\r
+\r
+ * (UINT8 *) ((UINT8 *) (StructureNode->Structure) + Offset) = (UINT8) (Value | BIT7);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+/** @file\r
+ Thunk driver's entry that install filter for DataRecord.\r
+ \r
+Copyright (c) 2009 Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+//\r
+// Global variables\r
+//\r
+LIST_ENTRY mStructureList;\r
+\r
+/**\r
+ Entry Point of thunk driver.\r
+\r
+ @param[in] ImageHandle Image handle of this driver.\r
+ @param[in] SystemTable Pointer to EFI system table.\r
+\r
+ @retval EFI_SUCCESS The event handlers were registered.\r
+ @retval EFI_DEVICE_ERROR Failed to register the event handlers\r
+**/ \r
+EFI_STATUS\r
+EFIAPI\r
+ThunkEntry (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_DATA_HUB_PROTOCOL *DataHub;\r
+ EFI_EVENT FilterEvent;\r
+ \r
+ Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (VOID**) &DataHub);\r
+ ASSERT_EFI_ERROR (Status);\r
+ ASSERT (DataHub != NULL);\r
+\r
+ InitializeListHead (&mStructureList);\r
+\r
+ //\r
+ // Register SmBios Data Filter Function.\r
+ // This function is notified at TPL_CALLBACK.\r
+ //\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_CALLBACK,\r
+ SmbiosDataFilter,\r
+ NULL,\r
+ &FilterEvent\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = DataHub->RegisterFilterDriver (\r
+ DataHub,\r
+ FilterEvent,\r
+ TPL_APPLICATION,\r
+ EFI_DATA_RECORD_CLASS_DATA,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ gBS->CloseEvent (FilterEvent);\r
+ return Status;\r
+ }\r
+\r
+ return Status;\r
+\r
+} \r
+\r
+/**\r
+ Smbios data filter function. This function is invoked when there is data records\r
+ available in the Data Hub. \r
+\r
+ @param Event The event that is signaled.\r
+ @param Context not used here.\r
+**/\r
+VOID\r
+EFIAPI\r
+SmbiosDataFilter (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_DATA_HUB_PROTOCOL *DataHub;\r
+ EFI_HANDLE DataHubHandle;\r
+ UINTN HandleSize;\r
+ UINT64 MonotonicCount;\r
+ EFI_DATA_RECORD_HEADER *Record;\r
+\r
+ Status = EFI_SUCCESS;\r
+ DataHub = NULL;\r
+\r
+ //\r
+ // Get the Data Hub Protocol. Assume only one instance\r
+ // of Data Hub Protocol is availabe in the system.\r
+ //\r
+ HandleSize = sizeof (EFI_HANDLE);\r
+\r
+ Status = gBS->LocateHandle (\r
+ ByProtocol,\r
+ &gEfiDataHubProtocolGuid,\r
+ NULL,\r
+ &HandleSize,\r
+ &DataHubHandle\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ Status = gBS->HandleProtocol (\r
+ DataHubHandle,\r
+ &gEfiDataHubProtocolGuid,\r
+ (VOID **) &DataHub\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ //\r
+ // Get all available data records from data hub\r
+ //\r
+ MonotonicCount = 0;\r
+ Record = NULL;\r
+\r
+ do {\r
+\r
+ Status = DataHub->GetNextRecord (\r
+ DataHub,\r
+ &MonotonicCount,\r
+ &Event,\r
+ &Record\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
+ \r
+ //\r
+ // It's of expected Data Type. Process it.\r
+ //\r
+ SmbiosProcessDataRecord (Record);\r
+ }\r
+ }\r
+ } while (!EFI_ERROR (Status) && (MonotonicCount != 0));\r
+\r
+Done:\r
+\r
+ return ;\r
+\r
+}\r
--- /dev/null
+/** @file\r
+ The common header file for the thunk driver.\r
+ \r
+Copyright (c) 2009 Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _DATAHUB_TO_SMBIOS_THUNK_\r
+#define _DATAHUB_TO_SMBIOS_THUNK_\r
+\r
+#include <FrameworkDxe.h>\r
+#include <IndustryStandard/SmBios.h>\r
+\r
+#include <Guid/EventGroup.h>\r
+#include <Guid/SmBios.h>\r
+#include <Protocol/DataHub.h>\r
+#include <Guid/DataHubRecords.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/Smbios.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+//\r
+// Conversion Table that describes the translation method for\r
+// Data Hub Data Records of certain SubClass and RecordNumber\r
+//\r
+typedef enum {\r
+ BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER,\r
+ BY_SUBCLASS_INSTANCE_PRODUCER,\r
+ MAX_LOCATING_METHOD\r
+} SMBIOS_STRUCTURE_LOCATING_METHOD;\r
+\r
+typedef enum {\r
+ RECORD_DATA_UNCHANGED_OFFSET_SPECIFIED,\r
+ BY_FUNCTION_WITH_OFFSET_SPECIFIED,\r
+ BY_FUNCTION,\r
+ BY_FUNCTION_WITH_WHOLE_DATA_RECORD,\r
+ MAX_FIELD_FILLING_METHOD\r
+} SMBIOS_FIELD_FILLING_METHOD;\r
+\r
+typedef struct _SMBIOS_STRUCTURE_NODE SMBIOS_STRUCTURE_NODE;\r
+\r
+typedef struct {\r
+ UINT8 Type;\r
+ UINT8 Length;\r
+ UINT16 Handle;\r
+ UINT8 Tailing[2];\r
+} EFI_SMBIOS_TABLE_TYPE127;\r
+\r
+typedef\r
+EFI_STATUS\r
+(*SMBIOS_FIELD_FILLING_FUNCTION) (\r
+ IN OUT SMBIOS_STRUCTURE_NODE * StructureNode,\r
+ IN UINT32 Offset OPTIONAL,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ );\r
+\r
+typedef struct {\r
+ //\r
+ // Data Hub Data Record's SubClass and RecordNumber\r
+ //\r
+ EFI_GUID SubClass;\r
+ UINT32 RecordType;\r
+\r
+ //\r
+ // Translation method applied\r
+ //\r
+ UINT8 SmbiosType;\r
+ SMBIOS_STRUCTURE_LOCATING_METHOD StructureLocatingMethod;\r
+ SMBIOS_FIELD_FILLING_METHOD FieldFillingMethod;\r
+ UINT32 FieldOffset;\r
+ SMBIOS_FIELD_FILLING_FUNCTION FieldFillingFunction;\r
+\r
+} SMBIOS_CONVERSION_TABLE_ENTRY;\r
+\r
+//\r
+// SMBIOS_LINK_DATA_FIXUP nodes indicate the Link fields that\r
+// need to be fixed up when creating the resulting Smbios image.\r
+//\r
+#define SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE SIGNATURE_32 ('S', 'm', 'l', 'n')\r
+\r
+typedef struct {\r
+\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+\r
+ UINT32 Offset;\r
+ UINT8 TargetType;\r
+ EFI_GUID SubClass;\r
+ EFI_INTER_LINK_DATA LinkData;\r
+\r
+} SMBIOS_LINK_DATA_FIXUP_NODE;\r
+\r
+//\r
+// The global Structure List node.\r
+// The Structure List is populated as more and more\r
+// Structures (of various types) are discovered and inserted.\r
+// The nodes in the Structure List will be concatenated\r
+// to form the ultimate SMBIOS table.\r
+//\r
+#define SMBIOS_STRUCTURE_NODE_SIGNATURE SIGNATURE_32 ('S', 'm', 'b', 's')\r
+\r
+struct _SMBIOS_STRUCTURE_NODE {\r
+\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+\r
+ //\r
+ // Tags\r
+ //\r
+ EFI_GUID SubClass;\r
+ UINT16 Instance;\r
+ UINT16 SubInstance;\r
+ EFI_GUID ProducerName;\r
+\r
+ //\r
+ // the Smbios structure\r
+ //\r
+ UINT32 StructureSize; // Actual structure size including strings\r
+\r
+ EFI_SMBIOS_TABLE_HEADER *Structure;\r
+ \r
+ \r
+ EFI_SMBIOS_HANDLE SmbiosHandle; // Smbios Handle in SMBIOS database.\r
+ \r
+ EFI_SMBIOS_TYPE SmbiosType;\r
+ \r
+ LIST_ENTRY LinkDataFixup;\r
+ \r
+};\r
+\r
+//\r
+// Smbios type info table. Indicates minimum length\r
+// for each Smbios type as the indicator of the initial size of buffer\r
+// allocated for the structure instance of a specific type.\r
+//\r
+typedef struct {\r
+\r
+ UINT8 Type;\r
+ UINT8 MinLength; // Minimal structure size including\r
+ // TWO trailing bytes of 0x00\r
+ //\r
+ BOOLEAN IsRequired; // Required structure type defined by Smbios Spec\r
+ BOOLEAN IsCreated; // Created in this run\r
+} SMBIOS_TYPE_INFO_TABLE_ENTRY;\r
+\r
+//\r
+// EDK framwork Memory Data hub definition to support EDK/Framework driver.\r
+//\r
+typedef struct {\r
+ STRING_REF MemoryDeviceLocator;\r
+ STRING_REF MemoryBankLocator;\r
+ STRING_REF MemoryManufacturer;\r
+ STRING_REF MemorySerialNumber;\r
+ STRING_REF MemoryAssetTag;\r
+ STRING_REF MemoryPartNumber;\r
+ EFI_INTER_LINK_DATA MemoryArrayLink;\r
+ EFI_INTER_LINK_DATA MemorySubArrayLink;\r
+ UINT16 MemoryTotalWidth;\r
+ UINT16 MemoryDataWidth;\r
+ UINT64 MemoryDeviceSize;\r
+ EFI_MEMORY_FORM_FACTOR MemoryFormFactor;\r
+ UINT8 MemoryDeviceSet;\r
+ EFI_MEMORY_ARRAY_TYPE MemoryType;\r
+ EFI_MEMORY_TYPE_DETAIL MemoryTypeDetail;\r
+ UINT16 MemorySpeed;\r
+ EFI_MEMORY_STATE MemoryState;\r
+ UINT8 MemoryAttributes;\r
+} FRAMEWORK_MEMORY_ARRAY_LINK_DATA;\r
+\r
+typedef struct {\r
+ EFI_MEMORY_ARRAY_LOCATION MemoryArrayLocation;\r
+ EFI_MEMORY_ARRAY_USE MemoryArrayUse;\r
+ EFI_MEMORY_ERROR_CORRECTION MemoryErrorCorrection;\r
+ UINT32 MaximumMemoryCapacity;\r
+ UINT16 NumberMemoryDevices;\r
+} FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA;\r
+\r
+//\r
+// Global variables\r
+//\r
+extern SMBIOS_CONVERSION_TABLE_ENTRY mConversionTable[];\r
+extern SMBIOS_TYPE_INFO_TABLE_ENTRY mTypeInfoTable[];\r
+extern LIST_ENTRY mStructureList;\r
+\r
+//\r
+// Function Prototypes\r
+//\r
+/**\r
+ Smbios data filter function. This function is invoked when there is data records\r
+ available in the Data Hub. \r
+\r
+ @param Event The event that is signaled.\r
+ @param Context not used here.\r
+**/\r
+VOID\r
+EFIAPI\r
+SmbiosDataFilter (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ );\r
+\r
+//\r
+// Function prototypes\r
+//\r
+/**\r
+ Process a datahub's record and find corresponding translation way to translate\r
+ to SMBIOS record.\r
+ \r
+ @param Record Point to datahub record.\r
+**/\r
+VOID\r
+SmbiosProcessDataRecord (\r
+ IN EFI_DATA_RECORD_HEADER *Record\r
+ )\r
+;\r
+\r
+/**\r
+ Calculate the minimal length for a SMBIOS type. This length maybe not equal\r
+ to sizeof (SMBIOS_RECORD_STRUCTURE), but defined in conformance chapter in SMBIOS specification.\r
+ \r
+ @param Type SMBIOS's type.\r
+ \r
+ @return the minimal length of a smbios record.\r
+**/\r
+UINT32\r
+SmbiosGetTypeMinimalLength (\r
+ IN UINT8 Type\r
+ )\r
+;\r
+\r
+/**\r
+ Enlarge the structure buffer of a structure node in SMBIOS database.\r
+ The function maybe lead the structure pointer for SMBIOS record changed.\r
+ \r
+ @param StructureNode The structure node whose structure buffer is to be enlarged.\r
+ @param NewLength The new length of SMBIOS record which does not include unformat area.\r
+ @param OldBufferSize The old size of SMBIOS record buffer.\r
+ @param NewSize The new size is targeted for enlarged.\r
+ \r
+ @retval EFI_OUT_OF_RESOURCES No more memory to allocate new record\r
+ @retval EFI_SUCCESS Success to enlarge the record buffer size.\r
+**/\r
+EFI_STATUS\r
+SmbiosEnlargeStructureBuffer (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ UINT8 NewLength,\r
+ UINTN OldBufferSize,\r
+ UINTN NewBufferSize\r
+ );\r
+\r
+/**\r
+ Field Filling Function. Fill a standard Smbios string field. \r
+ Convert the unicode string to single byte chars.\r
+ Only English language is supported.\r
+\r
+ This function changes the Structure pointer value of the structure node, \r
+ which should be noted by Caller.\r
+ \r
+ @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
+ @param Offset Offset of SMBIOS record which RecordData will be filled.\r
+ @param RecordData RecordData buffer will be filled.\r
+ @param RecordDataSize The size of RecordData buffer.\r
+ \r
+ @retval EFI_INVALID_PARAMETER RecordDataSize is too larger\r
+ @retval EFI_OUT_OF_RESOURCES No memory to allocate new buffer for string\r
+ @retval EFI_SUCCESS Sucess append string for a SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldString (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+/**\r
+ Fill the inter link field for a SMBIOS recorder.\r
+ \r
+ Some SMBIOS recorder need to reference the handle of another SMBIOS record. But\r
+ maybe another SMBIOS record has not been added, so put the InterLink request into\r
+ a linked list and the interlink will be fixedup when a new SMBIOS record is added.\r
+ \r
+ @param StructureNode Point to SMBIOS_STRUCTURE_NODE which reference another record's handle\r
+ @param LinkSmbiosNodeOffset The offset in this record for holding the handle of another SMBIOS record\r
+ @param LinkSmbiosType The type of SMBIOS record want to be linked.\r
+ @param InterLink Point to EFI_INTER_LINK_DATA will be put linked list.\r
+ @param SubClassGuid The guid of subclass for linked SMBIOS record.\r
+ \r
+ @retval EFI_SUCESS The linked record is found and no need fixup in future.\r
+ @retval !EFI_SUCESS The linked record can not be found and InterLink is put a fixing-p linked list.\r
+**/\r
+EFI_STATUS\r
+SmbiosFldInterLink (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT16 LinkSmbiosNodeOffset,\r
+ IN UINT8 LinkSmbiosType,\r
+ IN EFI_INTER_LINK_DATA *InterLink,\r
+ IN EFI_GUID *SubClassGuid\r
+ )\r
+;\r
+\r
+/**\r
+ Find a handle that matches the Link Data and the target Smbios type.\r
+ \r
+ @param TargetType the Smbios type\r
+ @param SubClass the SubClass\r
+ @param LinkData Specifies Instance, SubInstance and ProducerName\r
+ @param Handle the HandleNum found \r
+ \r
+ @retval EFI_NOT_FOUND Can not find the record according to handle\r
+ @retval EFI_SUCCESS Success to find the handle\r
+**/\r
+EFI_STATUS\r
+SmbiosFindHandle (\r
+ IN UINT8 TargetType,\r
+ IN EFI_GUID *SubClass,\r
+ IN EFI_INTER_LINK_DATA *LinkData,\r
+ IN OUT UINT16 *HandleNum\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase10ToWordWithMega (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase2ToWordWithKilo (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldTruncateToByte (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldProcessorType6 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldProcessorType9 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldProcessorType17 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase10ToByteWithNano (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldTruncateToWord (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldCacheType10 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+INT8\r
+SmbiosCheckTrailingZero (\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldCacheType5 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType2 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType3 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType4 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType5 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType6 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType7 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType8 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType9 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMemoryType10 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType0 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldBase2ToByteWith64K (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType1 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType2 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType3 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType8 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType9 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType10 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType11 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType12 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType13 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType14 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType15 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType21 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType32 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType38 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ );\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscTypeOEM (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldSMBIOSType6 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset, \r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType22 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType22 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType23 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType24 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType25 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType26 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType27 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType28 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType29 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType30 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType34 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType36 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType38 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType39 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+SmbiosFldMiscType127 (\r
+ IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
+ IN UINT32 Offset,\r
+ IN VOID *RecordData,\r
+ IN UINT32 RecordDataSize\r
+ )\r
+;\r
+ \r
+EFI_STATUS\r
+SmbiosProtocolCreateRecord (\r
+ IN EFI_HANDLE ProducerHandle, OPTIONAL\r
+ IN SMBIOS_STRUCTURE_NODE *StructureNode\r
+ );\r
+ \r
+EFI_SMBIOS_PROTOCOL*\r
+GetSmbiosProtocol (\r
+ VOID\r
+ );\r
+ \r
+EFI_SMBIOS_TABLE_HEADER*\r
+GetSmbiosBufferFromHandle (\r
+ IN EFI_SMBIOS_HANDLE Handle,\r
+ IN EFI_SMBIOS_TYPE Type,\r
+ IN EFI_HANDLE ProducerHandle OPTIONAL\r
+ );\r
+ \r
+EFI_STATUS\r
+EFIAPI\r
+GetSmbiosStructureSize (\r
+ IN EFI_SMBIOS_TABLE_HEADER *Head,\r
+ OUT UINT32 *Size,\r
+ OUT UINT8 *NumberOfStrings\r
+ );\r
+ \r
+#endif\r
--- /dev/null
+/**@file\r
+ Translate the DataHub records via EFI_DATA_HUB_PROTOCOL to Smbios recorders \r
+ via EFI_SMBIOS_PROTOCOL.\r
+ \r
+Copyright (c) 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Thunk.h"\r
+\r
+EFI_GUID ZeroGuid = { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 } };\r
+EFI_SMBIOS_PROTOCOL *mSmbiosProtocol = NULL;\r
+\r
+/**\r
+ Release the structure Node. \r
+ \r
+ @param StructureNode Point to SMBIOS_STRUCTURE_NODE which will be removed.\r
+**/\r
+VOID\r
+ReleaseStructureNode (\r
+ SMBIOS_STRUCTURE_NODE *StructureNode\r
+ )\r
+{\r
+ EFI_SMBIOS_PROTOCOL *Smbios;\r
+ \r
+ RemoveEntryList (&(StructureNode->Link));\r
+ Smbios = GetSmbiosProtocol();\r
+ ASSERT (Smbios != NULL);\r
+ Smbios->Remove (Smbios, StructureNode->SmbiosHandle);\r
+ gBS->FreePool (StructureNode);\r
+}\r
+\r
+/**\r
+ Process a datahub's record and find corresponding translation way to translate\r
+ to SMBIOS record.\r
+ \r
+ @param Record Point to datahub record.\r
+**/\r
+VOID\r
+SmbiosProcessDataRecord (\r
+ IN EFI_DATA_RECORD_HEADER *Record\r
+ )\r
+{\r
+ EFI_DATA_RECORD_HEADER *RecordHeader;\r
+ EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
+ UINTN Index;\r
+ SMBIOS_CONVERSION_TABLE_ENTRY *Conversion;\r
+ UINT8 *SrcData;\r
+ UINTN SrcDataSize;\r
+ LIST_ENTRY *Link;\r
+ SMBIOS_STRUCTURE_NODE *StructureNode;\r
+ BOOLEAN StructureCreated;\r
+ EFI_STATUS Status;\r
+ \r
+ Conversion = NULL;\r
+ StructureNode = NULL;\r
+ StructureCreated = FALSE;\r
+ RecordHeader = Record;\r
+ DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
+ SrcData = (UINT8 *) (DataHeader + 1);\r
+ SrcDataSize = RecordHeader->RecordSize - RecordHeader->HeaderSize - sizeof (EFI_SUBCLASS_TYPE1_HEADER);\r
+\r
+ if (DataHeader->HeaderSize != sizeof (EFI_SUBCLASS_TYPE1_HEADER) ||\r
+ DataHeader->Instance == EFI_SUBCLASS_INSTANCE_RESERVED ||\r
+ DataHeader->SubInstance == EFI_SUBCLASS_INSTANCE_RESERVED\r
+ ) {\r
+ //\r
+ // Invalid Data Record\r
+ //\r
+ goto Done;\r
+ }\r
+\r
+ Index = 0;\r
+ while(TRUE) {\r
+ //\r
+ // Find a matching entry in the conversion table for this\r
+ // (SubClass, RecordNumber) pair\r
+ //\r
+ for (; !CompareGuid (&(mConversionTable[Index].SubClass), &ZeroGuid); Index++) {\r
+ if (CompareGuid (\r
+ &(mConversionTable[Index].SubClass),\r
+ &(RecordHeader->DataRecordGuid)\r
+ )) {\r
+ if (mConversionTable[Index].RecordType == DataHeader->RecordType) {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (CompareGuid (&(mConversionTable[Index].SubClass), &ZeroGuid)) {\r
+ //\r
+ // We cannot find a matching entry in conversion table,\r
+ // this means this data record cannot be used for SMBIOS.\r
+ // Just skip it.\r
+ //\r
+ goto Done;\r
+ }\r
+\r
+ Conversion = &mConversionTable[Index++];\r
+\r
+ //\r
+ // Find corresponding structure in the Structure List\r
+ //\r
+ for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
+\r
+ StructureNode = CR (\r
+ Link,\r
+ SMBIOS_STRUCTURE_NODE,\r
+ Link,\r
+ SMBIOS_STRUCTURE_NODE_SIGNATURE\r
+ );\r
+\r
+ if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER) {\r
+ //\r
+ // Look at SubClass, Instance, SubInstance and ProducerName for a matching\r
+ // node\r
+ //\r
+ if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&\r
+ StructureNode->Instance == DataHeader->Instance &&\r
+ StructureNode->SubInstance == DataHeader->SubInstance &&\r
+ CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))\r
+ ) {\r
+ if (Conversion->SmbiosType >= 0X80) {\r
+ if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {\r
+ break;\r
+ }\r
+ } else if (StructureNode->SmbiosType == Conversion->SmbiosType) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ } else if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_PRODUCER) {\r
+ //\r
+ // Look at SubClass, Instance and ProducerName for a matching node\r
+ //\r
+ if (CompareGuid (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid)) &&\r
+ StructureNode->Instance == DataHeader->Instance &&\r
+ CompareGuid (&(StructureNode->ProducerName), &(RecordHeader->ProducerName))\r
+ ) {\r
+ if (Conversion->SmbiosType >= 0X80) {\r
+ if (StructureNode->SmbiosType == ((SMBIOS_STRUCTURE_HDR *) SrcData)->Type) {\r
+ break;\r
+ }\r
+ } else if (StructureNode->SmbiosType == Conversion->SmbiosType) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ } else {\r
+ //\r
+ // Invalid conversion table entry\r
+ //\r
+ goto Done;\r
+ }\r
+ }\r
+\r
+ if (Link == &mStructureList) {\r
+\r
+ //\r
+ // Not found, create a new structure\r
+ //\r
+ StructureNode = AllocateZeroPool (sizeof (SMBIOS_STRUCTURE_NODE));\r
+\r
+ if (!StructureNode) {\r
+ goto Done;\r
+ }\r
+\r
+ if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_SUBINSTANCE_PRODUCER) {\r
+ //\r
+ // Fill in SubClass, Instance, SubInstance and ProducerName\r
+ //\r
+ CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));\r
+ StructureNode->Instance = DataHeader->Instance;\r
+ StructureNode->SubInstance = DataHeader->SubInstance;\r
+ CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));\r
+\r
+ } else if (Conversion->StructureLocatingMethod == BY_SUBCLASS_INSTANCE_PRODUCER) {\r
+ //\r
+ // Fill in at SubClass, Instance and ProducerName, mark SubInstance as Non\r
+ // Applicable\r
+ //\r
+ CopyMem (&(StructureNode->SubClass), &(RecordHeader->DataRecordGuid), sizeof (EFI_GUID));\r
+ StructureNode->Instance = DataHeader->Instance;\r
+ StructureNode->SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
+ CopyMem (&(StructureNode->ProducerName), &(RecordHeader->ProducerName), sizeof (EFI_GUID));\r
+\r
+ }\r
+ //\r
+ // Allocate the structure instance\r
+ //\r
+ StructureNode->StructureSize = SmbiosGetTypeMinimalLength (Conversion->SmbiosType);\r
+ StructureNode->SmbiosType = Conversion->SmbiosType;\r
+ \r
+ //\r
+ // StructureSize include the TWO trailing zero byte.\r
+ //\r
+ if (StructureNode->StructureSize < (sizeof(SMBIOS_STRUCTURE) + 2)) {\r
+ //\r
+ // Invalid Type\r
+ //\r
+ gBS->FreePool (StructureNode);\r
+ goto Done;\r
+ }\r
+\r
+ StructureNode->SmbiosType = Conversion->SmbiosType;\r
+ StructureNode->SmbiosHandle = 0;\r
+ Status = SmbiosProtocolCreateRecord (\r
+ NULL, \r
+ StructureNode\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ //\r
+ // Temporary cache the structrue pointer to Smbios database.\r
+ //\r
+ StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);\r
+ \r
+ InitializeListHead (&StructureNode->LinkDataFixup);\r
+\r
+ //\r
+ // Insert the Structure Node into the Strucutre List\r
+ //\r
+ StructureNode->Signature = SMBIOS_STRUCTURE_NODE_SIGNATURE;\r
+ InsertTailList (&mStructureList, &(StructureNode->Link));\r
+\r
+ StructureCreated = TRUE;\r
+\r
+ }\r
+ \r
+ \r
+ //\r
+ // Re-calculate the structure pointer to Smbios database.\r
+ //\r
+ StructureNode->Structure = GetSmbiosBufferFromHandle (StructureNode->SmbiosHandle, StructureNode->SmbiosType, NULL);\r
+ \r
+ //\r
+ // Fill the Structure's field corresponding to this data record\r
+ //\r
+ if (Conversion->FieldFillingMethod == RECORD_DATA_UNCHANGED_OFFSET_SPECIFIED) {\r
+ //\r
+ // Field data is just the record data without transforming and\r
+ // offset is specified directly in the conversion table entry\r
+ //\r
+ if (Conversion->FieldOffset + SrcDataSize > StructureNode->Structure->Length) {\r
+ //\r
+ // Invalid Conversion Table Entry\r
+ //\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+ \r
+ CopyMem ((UINT8 *) (StructureNode->Structure) + Conversion->FieldOffset, SrcData, SrcDataSize);\r
+\r
+ } else if (Conversion->FieldFillingMethod == BY_FUNCTION_WITH_OFFSET_SPECIFIED) {\r
+ //\r
+ // Field offfset is specified in the conversion table entry, but\r
+ // record data needs to be transformed to be filled into the field,\r
+ // so let the FieldFillingFunction do it.\r
+ //\r
+ if (!(Conversion->FieldFillingFunction)) {\r
+ //\r
+ // Invalid Conversion Table Entry\r
+ //\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+\r
+ Status = Conversion->FieldFillingFunction (\r
+ StructureNode,\r
+ Conversion->FieldOffset,\r
+ SrcData,\r
+ (UINT32) SrcDataSize\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+ } else if (Conversion->FieldFillingMethod == BY_FUNCTION) {\r
+ //\r
+ // Both field offset and field content are determined by\r
+ // FieldFillingFunction\r
+ //\r
+ if (!(Conversion->FieldFillingFunction)) {\r
+ //\r
+ // Invalid Conversion Table Entry\r
+ //\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+\r
+ Status = Conversion->FieldFillingFunction (\r
+ StructureNode,\r
+ 0,\r
+ SrcData,\r
+ (UINT32) SrcDataSize\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+ } else if (Conversion->FieldFillingMethod == BY_FUNCTION_WITH_WHOLE_DATA_RECORD) {\r
+ //\r
+ // Both field offset and field content are determined by\r
+ // FieldFillingFunction and the function accepts the whole data record\r
+ // including the data header\r
+ //\r
+ if (!(Conversion->FieldFillingFunction)) {\r
+ //\r
+ // Invalid Conversion Table Entry\r
+ //\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+\r
+ Status = Conversion->FieldFillingFunction (\r
+ StructureNode,\r
+ 0,\r
+ DataHeader,\r
+ RecordHeader->RecordSize - RecordHeader->HeaderSize\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+ } else {\r
+ //\r
+ // Invalid Conversion Table Entry\r
+ //\r
+ if (StructureCreated) {\r
+ ReleaseStructureNode (StructureNode);\r
+ }\r
+\r
+ goto Done;\r
+ }\r
+ }\r
+Done:\r
+ return ;\r
+}\r
+\r
+/**\r
+ Calculate the minimal length for a SMBIOS type. This length maybe not equal\r
+ to sizeof (SMBIOS_RECORD_STRUCTURE), but defined in conformance chapter in SMBIOS specification.\r
+ \r
+ @param Type SMBIOS's type.\r
+ \r
+ @return the minimal length of a smbios record.\r
+**/\r
+UINT32\r
+SmbiosGetTypeMinimalLength (\r
+ IN UINT8 Type\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; mTypeInfoTable[Index].MinLength != 0; Index++) {\r
+ if (mTypeInfoTable[Index].Type == Type) {\r
+ return mTypeInfoTable[Index].MinLength;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+/**\r
+ Get pointer of EFI_SMBIOS_PROTOCOL.\r
+ \r
+ @return pointer of EFI_SMBIOS_PROTOCOL.\r
+**/\r
+EFI_SMBIOS_PROTOCOL*\r
+GetSmbiosProtocol(\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ \r
+ if (mSmbiosProtocol == NULL) {\r
+ Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID*) &mSmbiosProtocol);\r
+ ASSERT_EFI_ERROR (Status);\r
+ } \r
+ \r
+ ASSERT (mSmbiosProtocol != NULL);\r
+ return mSmbiosProtocol; \r
+} \r
+\r
+/**\r
+ Create a blank smbios record. The datahub record is only a field of smbios record.\r
+ So before fill any field from datahub's record. A blank smbios record need to be \r
+ created.\r
+ \r
+ @param ProducerHandle The produce handle for a datahub record\r
+ @param StructureNode Point to SMBIOS_STRUCTURE_NODE\r
+ \r
+ @retval EFI_OUT_OF_RESOURCES Fail to allocate memory for new blank SMBIOS record.\r
+ @retval EFI_SUCCESS Success to create blank smbios record.\r
+**/\r
+EFI_STATUS\r
+SmbiosProtocolCreateRecord (\r
+ IN EFI_HANDLE ProducerHandle, OPTIONAL\r
+ IN SMBIOS_STRUCTURE_NODE *StructureNode\r
+ )\r
+{\r
+ EFI_SMBIOS_PROTOCOL *Smbios;\r
+ EFI_SMBIOS_TABLE_HEADER *BlankRecord;\r
+ EFI_STATUS Status;\r
+ SMBIOS_STRUCTURE_NODE *RefStructureNode;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link1;\r
+ LIST_ENTRY *Link2; \r
+ SMBIOS_LINK_DATA_FIXUP_NODE *LinkDataFixupNode;\r
+ UINT8 *BufferPointer;\r
+ \r
+ Smbios = GetSmbiosProtocol();\r
+ ASSERT (Smbios != NULL);\r
+ \r
+ //\r
+ // Prepare a blank smbios record.\r
+ //\r
+ BlankRecord = (EFI_SMBIOS_TABLE_HEADER*) AllocateZeroPool (StructureNode->StructureSize);\r
+ if (BlankRecord == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ BlankRecord->Type = StructureNode->SmbiosType;\r
+ BlankRecord->Length = (UINT8) (StructureNode->StructureSize - 2);\r
+ \r
+ //\r
+ // Add blank record into SMBIOS database.\r
+ //\r
+ Status = Smbios->Add (Smbios, NULL, &StructureNode->SmbiosHandle, BlankRecord);\r
+ FreePool (BlankRecord);\r
+ \r
+ //\r
+ // Fix up the InterLink node for new added smbios record if some other\r
+ // existing smbios record want to link this new record's handle.\r
+ //\r
+ for (Link = mStructureList.ForwardLink; Link != &mStructureList; Link = Link->ForwardLink) {\r
+ RefStructureNode = CR (Link, SMBIOS_STRUCTURE_NODE, Link, SMBIOS_STRUCTURE_NODE_SIGNATURE);\r
+ for (Link1 = RefStructureNode->LinkDataFixup.ForwardLink; Link1 != &RefStructureNode->LinkDataFixup;) {\r
+ LinkDataFixupNode = CR (Link1, SMBIOS_LINK_DATA_FIXUP_NODE, Link, SMBIOS_LINK_DATA_FIXUP_NODE_SIGNATURE);\r
+ Link2 = Link1;\r
+ Link1 = Link1->ForwardLink;\r
+ \r
+ if ((StructureNode->SmbiosType != LinkDataFixupNode->TargetType) ||\r
+ !(CompareGuid (&StructureNode->SubClass, &LinkDataFixupNode->SubClass)) ||\r
+ (StructureNode->Instance != LinkDataFixupNode->LinkData.Instance) ||\r
+ (StructureNode->SubInstance != LinkDataFixupNode->LinkData.SubInstance)) {\r
+ continue;\r
+ }\r
+ \r
+ //\r
+ // Fill the field with the handle found\r
+ //\r
+ BufferPointer = (UINT8 *) (RefStructureNode->Structure) + LinkDataFixupNode->Offset;\r
+ *BufferPointer = (UINT8) (StructureNode->SmbiosHandle & 0xFF);\r
+ *(BufferPointer + 1) = (UINT8) ((StructureNode->SmbiosHandle >> 8) & 0xFF);\r
+ BufferPointer = NULL;\r
+\r
+ RemoveEntryList (Link2);\r
+ FreePool (LinkDataFixupNode);\r
+ }\r
+ }\r
+ \r
+ return Status;\r
+} \r
+\r
+/**\r
+ Get pointer of a SMBIOS record's buffer according to its handle.\r
+ \r
+ @param Handle The handle of SMBIOS record want to be searched.\r
+ @param Type The type of SMBIOS record want to be searched.\r
+ @param ProducerHandle The producer handle of SMBIOS record.\r
+ \r
+ @return EFI_SMBIOS_TABLE_HEADER Point to a SMBIOS record's buffer.\r
+**/ \r
+EFI_SMBIOS_TABLE_HEADER*\r
+GetSmbiosBufferFromHandle (\r
+ IN EFI_SMBIOS_HANDLE Handle,\r
+ IN EFI_SMBIOS_TYPE Type,\r
+ IN EFI_HANDLE ProducerHandle OPTIONAL\r
+ )\r
+{\r
+ EFI_SMBIOS_PROTOCOL* Smbios;\r
+ EFI_SMBIOS_HANDLE SearchingHandle;\r
+ EFI_SMBIOS_TABLE_HEADER *RecordInSmbiosDatabase;\r
+ EFI_STATUS Status;\r
+ \r
+ SearchingHandle = 0;\r
+ Smbios = GetSmbiosProtocol();\r
+ ASSERT (Smbios != NULL);\r
+ \r
+ do {\r
+ Status = Smbios->GetNext (Smbios, &SearchingHandle, &Type, &RecordInSmbiosDatabase, NULL);\r
+ } while ((SearchingHandle != Handle) && (Status != EFI_NOT_FOUND));\r
+ \r
+ return RecordInSmbiosDatabase;\r
+} \r
+\r
+/**\r
+\r
+ Get the full size of smbios structure including optional strings that follow the formatted structure.\r
+\r
+ @param Head Pointer to the beginning of smbios structure.\r
+ @param Size The returned size.\r
+ @param NumberOfStrings The returned number of optional strings that follow the formatted structure.\r
+\r
+ @retval EFI_SUCCESS Size retured in Size.\r
+ @retval EFI_INVALID_PARAMETER Input smbios structure mal-formed or Size is NULL.\r
+ \r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSmbiosStructureSize (\r
+ IN EFI_SMBIOS_TABLE_HEADER *Head,\r
+ OUT UINT32 *Size,\r
+ OUT UINT8 *NumberOfStrings\r
+ )\r
+{\r
+ UINT32 FullSize;\r
+ UINT8 StrLen;\r
+ INT8* CharInStr;\r
+ \r
+ if (Size == NULL || NumberOfStrings == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ FullSize = Head->Length;\r
+ CharInStr = (INT8*)Head + Head->Length;\r
+ *Size = FullSize;\r
+ *NumberOfStrings = 0;\r
+ StrLen = 0;\r
+ //\r
+ // look for the two consecutive zeros, check the string limit by the way.\r
+ //\r
+ while (*CharInStr != 0 || *(CharInStr+1) != 0) { \r
+ if (*CharInStr == 0) {\r
+ *Size += 1;\r
+ CharInStr++;\r
+ }\r
+\r
+ for (StrLen = 0 ; StrLen < SMBIOS_STRING_MAX_LENGTH; StrLen++) {\r
+ if (*(CharInStr+StrLen) == 0) {\r
+ break;\r
+ } \r
+ }\r
+\r
+ if (StrLen == SMBIOS_STRING_MAX_LENGTH) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ //\r
+ // forward the pointer\r
+ //\r
+ CharInStr += StrLen;\r
+ *Size += StrLen;\r
+ *NumberOfStrings += 1;\r
+ \r
+ }\r
+\r
+ //\r
+ // count ending two zeros.\r
+ //\r
+ *Size += 2;\r
+ return EFI_SUCCESS; \r
+}\r
EdkCompatibilityPkg/Compatibility/UcOnUc2Thunk/UcOnUc2Thunk.inf\r
EdkCompatibilityPkg/Compatibility/PrintThunk/PrintThunk.inf\r
EdkCompatibilityPkg/Compatibility/LegacyRegion2OnLegacyRegionThunk/LegacyRegion2OnLegacyRegionThunk.inf\r
+ EdkCompatibilityPkg/Compatibility/DataHubSmBiosRecordsOnPiSmBiosThunk/DataHubSmBiosRecordsOnPiSmBiosThunk.inf\r
EdkCompatibilityPkg/Compatibility/CpuIo2OnCpuIoThunk/CpuIo2OnCpuIoThunk.inf\r
\r
#\r