-/*++\r
-\r
-Copyright (c) 2009, Intel Corporation. All rights reserved. <BR> \r
-This software and associated documentation (if any) is furnished\r
-under a license and may only be used or copied in accordance\r
-with the terms of the license. Except as permitted by such\r
-license, no part of this software or documentation may be\r
-reproduced, stored in a retrieval system, or transmitted in any\r
-form or by any means without the express written consent of\r
-Intel Corporation.\r
-\r
-\r
-Module Name:\r
-\r
- MiscChassisManufacturerFunction.c\r
- \r
-Abstract: \r
-\r
+/** @file\r
Chassis manufacturer information boot time changes.\r
SMBIOS type 3.\r
+ \r
+Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>\r
+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
---*/\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 "MiscSubclassDriver.h"\r
\r
CHAR8 *OptionalStrStart;\r
UINTN ManuStrLen;\r
UINTN VerStrLen;\r
- UINTN AssertTagStrLen;\r
+ UINTN AssetTagStrLen;\r
UINTN SerialNumStrLen;\r
+ UINTN SkuNumberStrLen;\r
EFI_STATUS Status;\r
EFI_STRING Manufacturer;\r
EFI_STRING Version;\r
EFI_STRING SerialNumber;\r
- EFI_STRING AssertTag;\r
+ EFI_STRING AssetTag;\r
+ EFI_STRING SkuNumber;\r
STRING_REF TokenToGet;\r
EFI_SMBIOS_HANDLE SmbiosHandle;\r
SMBIOS_TABLE_TYPE3 *SmbiosRecord;\r
EFI_MISC_CHASSIS_MANUFACTURER *ForType3InputData;\r
+ UINT8 *Buffer;\r
\r
ForType3InputData = (EFI_MISC_CHASSIS_MANUFACTURER *)RecordData;\r
\r
}\r
\r
TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG);\r
- AssertTag = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
- AssertTagStrLen = StrLen(AssertTag);\r
- if (AssertTagStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
+ AssetTag = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ AssetTagStrLen = StrLen(AssetTag);\r
+ if (AssetTagStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER);\r
+ SkuNumber = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ SkuNumberStrLen = StrLen(SkuNumber);\r
+ if (SkuNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
//\r
// Two zeros following the last string.\r
//\r
- SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + 1);\r
- ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + 1);\r
+ // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,\r
+ // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].\r
+ //\r
+ // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.\r
+ //\r
+ SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT) + sizeof (SMBIOS_TABLE_STRING) + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1 + SkuNumberStrLen + 1 + 1);\r
+ ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT) + sizeof (SMBIOS_TABLE_STRING) + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1 + SkuNumberStrLen + 1 + 1);\r
+\r
+ Buffer = (UINT8 *) SmbiosRecord;\r
\r
SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE;\r
- SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3);\r
+ //\r
+ // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,\r
+ // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].\r
+ //\r
+ // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.\r
+ //\r
+ SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT) + sizeof (SMBIOS_TABLE_STRING);\r
//\r
// Make handle chosen by smbios protocol.add automatically.\r
//\r
//\r
SmbiosRecord->SerialNumber = 3; \r
//\r
- // AssertTag will be the 4th optional string following the formatted structure.\r
+ // AssetTag will be the 4th optional string following the formatted structure.\r
//\r
- SmbiosRecord->AssetTag = 4; \r
+ SmbiosRecord->AssetTag = 4;\r
+\r
SmbiosRecord->BootupState = (UINT8)ForType3InputData->ChassisBootupState;\r
SmbiosRecord->PowerSupplyState = (UINT8)ForType3InputData->ChassisPowerSupplyState;\r
SmbiosRecord->ThermalState = (UINT8)ForType3InputData->ChassisThermalState;\r
SmbiosRecord->SecurityStatus = (UINT8)ForType3InputData->ChassisSecurityState;\r
CopyMem (SmbiosRecord->OemDefined,(UINT8*)&ForType3InputData->ChassisOemDefined, 4);\r
+ SmbiosRecord->Height = (UINT8)ForType3InputData->ChassisHeight;\r
+ SmbiosRecord->NumberofPowerCords = (UINT8)ForType3InputData->ChassisNumberPowerCords;\r
+ SmbiosRecord->ContainedElementCount = 0;\r
+ SmbiosRecord->ContainedElementRecordLength = 0;\r
+\r
+ //\r
+ // SKU Number will be the 5th optional string following the formatted structure.\r
+ //\r
+ // Since SKU Number is not in SMBIOS_TABLE_TYPE3 structure, must locate it after ContainedElementRecordLength.\r
+ //\r
+ Buffer[sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT)] = 5;\r
\r
OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
- UnicodeStrToAsciiStr(Manufacturer, OptionalStrStart);\r
- UnicodeStrToAsciiStr(Version, OptionalStrStart + ManuStrLen + 1);\r
- UnicodeStrToAsciiStr(SerialNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1);\r
- UnicodeStrToAsciiStr(AssertTag, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);\r
+ //\r
+ // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,\r
+ // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].\r
+ //\r
+ OptionalStrStart -= sizeof (CONTAINED_ELEMENT);\r
+ //\r
+ // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.\r
+ //\r
+ OptionalStrStart += sizeof (SMBIOS_TABLE_STRING);\r
+ UnicodeStrToAsciiStr (Manufacturer, OptionalStrStart);\r
+ UnicodeStrToAsciiStr (Version, OptionalStrStart + ManuStrLen + 1);\r
+ UnicodeStrToAsciiStr (SerialNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1);\r
+ UnicodeStrToAsciiStr (AssetTag, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);\r
+ UnicodeStrToAsciiStr (SkuNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1);\r
\r
//\r
// Now we have got the full smbios record, call smbios protocol to add this record.\r
//\r
- SmbiosHandle = 0;\r
- Status = Smbios-> Add(\r
- Smbios, \r
- NULL,\r
- &SmbiosHandle, \r
- (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
- );\r
+ Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);\r
\r
FreePool(SmbiosRecord);\r
return Status;\r