2 Chassis manufacturer information boot time changes.
5 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
6 (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "MiscSubclassDriver.h"
20 This function makes boot time changes to the contents of the
21 MiscChassisManufacturer (Type 3).
23 @param RecordData Pointer to copy of RecordData from the Data Table.
25 @retval EFI_SUCCESS All parameters were valid.
26 @retval EFI_UNSUPPORTED Unexpected RecordType value.
27 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
30 MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer
)
32 CHAR8
*OptionalStrStart
;
36 UINTN SerialNumStrLen
;
37 UINTN SkuNumberStrLen
;
39 EFI_STRING Manufacturer
;
41 EFI_STRING SerialNumber
;
44 STRING_REF TokenToGet
;
45 EFI_SMBIOS_HANDLE SmbiosHandle
;
46 SMBIOS_TABLE_TYPE3
*SmbiosRecord
;
47 EFI_MISC_CHASSIS_MANUFACTURER
*ForType3InputData
;
50 ForType3InputData
= (EFI_MISC_CHASSIS_MANUFACTURER
*)RecordData
;
53 // First check for invalid parameters.
55 if (RecordData
== NULL
) {
56 return EFI_INVALID_PARAMETER
;
59 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
);
60 Manufacturer
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
61 ManuStrLen
= StrLen(Manufacturer
);
62 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
63 return EFI_UNSUPPORTED
;
66 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_VERSION
);
67 Version
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
68 VerStrLen
= StrLen(Version
);
69 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
70 return EFI_UNSUPPORTED
;
73 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
);
74 SerialNumber
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
75 SerialNumStrLen
= StrLen(SerialNumber
);
76 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
77 return EFI_UNSUPPORTED
;
80 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
);
81 AssetTag
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
82 AssetTagStrLen
= StrLen(AssetTag
);
83 if (AssetTagStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
84 return EFI_UNSUPPORTED
;
87 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER
);
88 SkuNumber
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
89 SkuNumberStrLen
= StrLen(SkuNumber
);
90 if (SkuNumberStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
91 return EFI_UNSUPPORTED
;
95 // Two zeros following the last string.
97 // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,
98 // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].
100 // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.
102 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
) + sizeof (SMBIOS_TABLE_STRING
) + ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssetTagStrLen
+ 1 + SkuNumberStrLen
+ 1 + 1);
103 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
) + sizeof (SMBIOS_TABLE_STRING
) + ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssetTagStrLen
+ 1 + SkuNumberStrLen
+ 1 + 1);
105 Buffer
= (UINT8
*) SmbiosRecord
;
107 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE
;
109 // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,
110 // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].
112 // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.
114 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
) + sizeof (SMBIOS_TABLE_STRING
);
116 // Make handle chosen by smbios protocol.add automatically.
118 SmbiosRecord
->Hdr
.Handle
= 0;
120 // Manu will be the 1st optional string following the formatted structure.
122 SmbiosRecord
->Manufacturer
= 1;
123 SmbiosRecord
->Type
= (UINT8
)ForType3InputData
->ChassisType
.ChassisType
;
125 // Version will be the 2nd optional string following the formatted structure.
127 SmbiosRecord
->Version
= 2;
129 // SerialNumber will be the 3rd optional string following the formatted structure.
131 SmbiosRecord
->SerialNumber
= 3;
133 // AssetTag will be the 4th optional string following the formatted structure.
135 SmbiosRecord
->AssetTag
= 4;
137 SmbiosRecord
->BootupState
= (UINT8
)ForType3InputData
->ChassisBootupState
;
138 SmbiosRecord
->PowerSupplyState
= (UINT8
)ForType3InputData
->ChassisPowerSupplyState
;
139 SmbiosRecord
->ThermalState
= (UINT8
)ForType3InputData
->ChassisThermalState
;
140 SmbiosRecord
->SecurityStatus
= (UINT8
)ForType3InputData
->ChassisSecurityState
;
141 CopyMem (SmbiosRecord
->OemDefined
,(UINT8
*)&ForType3InputData
->ChassisOemDefined
, 4);
142 SmbiosRecord
->Height
= (UINT8
)ForType3InputData
->ChassisHeight
;
143 SmbiosRecord
->NumberofPowerCords
= (UINT8
)ForType3InputData
->ChassisNumberPowerCords
;
144 SmbiosRecord
->ContainedElementCount
= 0;
145 SmbiosRecord
->ContainedElementRecordLength
= 0;
148 // SKU Number will be the 5th optional string following the formatted structure.
150 // Since SKU Number is not in SMBIOS_TABLE_TYPE3 structure, must locate it after ContainedElementRecordLength.
152 Buffer
[sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
)] = 5;
154 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
156 // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,
157 // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].
159 OptionalStrStart
-= sizeof (CONTAINED_ELEMENT
);
161 // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.
163 OptionalStrStart
+= sizeof (SMBIOS_TABLE_STRING
);
164 UnicodeStrToAsciiStr (Manufacturer
, OptionalStrStart
);
165 UnicodeStrToAsciiStr (Version
, OptionalStrStart
+ ManuStrLen
+ 1);
166 UnicodeStrToAsciiStr (SerialNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1);
167 UnicodeStrToAsciiStr (AssetTag
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
168 UnicodeStrToAsciiStr (SkuNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssetTagStrLen
+ 1);
171 // Now we have got the full smbios record, call smbios protocol to add this record.
173 Status
= AddSmbiosRecord (Smbios
, &SmbiosHandle
, (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
);
175 FreePool(SmbiosRecord
);