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 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include "MiscSubclassDriver.h"
14 This function makes boot time changes to the contents of the
15 MiscChassisManufacturer (Type 3).
17 @param RecordData Pointer to copy of RecordData from the Data Table.
19 @retval EFI_SUCCESS All parameters were valid.
20 @retval EFI_UNSUPPORTED Unexpected RecordType value.
21 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
24 MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer
)
26 CHAR8
*OptionalStrStart
;
30 UINTN SerialNumStrLen
;
31 UINTN SkuNumberStrLen
;
33 EFI_STRING Manufacturer
;
35 EFI_STRING SerialNumber
;
38 STRING_REF TokenToGet
;
39 EFI_SMBIOS_HANDLE SmbiosHandle
;
40 SMBIOS_TABLE_TYPE3
*SmbiosRecord
;
41 EFI_MISC_CHASSIS_MANUFACTURER
*ForType3InputData
;
44 ForType3InputData
= (EFI_MISC_CHASSIS_MANUFACTURER
*)RecordData
;
47 // First check for invalid parameters.
49 if (RecordData
== NULL
) {
50 return EFI_INVALID_PARAMETER
;
53 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
);
54 Manufacturer
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
55 ManuStrLen
= StrLen(Manufacturer
);
56 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
57 return EFI_UNSUPPORTED
;
60 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_VERSION
);
61 Version
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
62 VerStrLen
= StrLen(Version
);
63 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
64 return EFI_UNSUPPORTED
;
67 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
);
68 SerialNumber
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
69 SerialNumStrLen
= StrLen(SerialNumber
);
70 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
71 return EFI_UNSUPPORTED
;
74 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
);
75 AssetTag
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
76 AssetTagStrLen
= StrLen(AssetTag
);
77 if (AssetTagStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
78 return EFI_UNSUPPORTED
;
81 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER
);
82 SkuNumber
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
83 SkuNumberStrLen
= StrLen(SkuNumber
);
84 if (SkuNumberStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
85 return EFI_UNSUPPORTED
;
89 // Two zeros following the last string.
91 // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,
92 // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].
94 // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.
96 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
) + sizeof (SMBIOS_TABLE_STRING
) + ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssetTagStrLen
+ 1 + SkuNumberStrLen
+ 1 + 1);
97 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
) + sizeof (SMBIOS_TABLE_STRING
) + ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssetTagStrLen
+ 1 + SkuNumberStrLen
+ 1 + 1);
99 Buffer
= (UINT8
*) SmbiosRecord
;
101 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE
;
103 // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,
104 // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].
106 // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.
108 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
) + sizeof (SMBIOS_TABLE_STRING
);
110 // Make handle chosen by smbios protocol.add automatically.
112 SmbiosRecord
->Hdr
.Handle
= 0;
114 // Manu will be the 1st optional string following the formatted structure.
116 SmbiosRecord
->Manufacturer
= 1;
117 SmbiosRecord
->Type
= (UINT8
)ForType3InputData
->ChassisType
.ChassisType
;
119 // Version will be the 2nd optional string following the formatted structure.
121 SmbiosRecord
->Version
= 2;
123 // SerialNumber will be the 3rd optional string following the formatted structure.
125 SmbiosRecord
->SerialNumber
= 3;
127 // AssetTag will be the 4th optional string following the formatted structure.
129 SmbiosRecord
->AssetTag
= 4;
131 SmbiosRecord
->BootupState
= (UINT8
)ForType3InputData
->ChassisBootupState
;
132 SmbiosRecord
->PowerSupplyState
= (UINT8
)ForType3InputData
->ChassisPowerSupplyState
;
133 SmbiosRecord
->ThermalState
= (UINT8
)ForType3InputData
->ChassisThermalState
;
134 SmbiosRecord
->SecurityStatus
= (UINT8
)ForType3InputData
->ChassisSecurityState
;
135 CopyMem (SmbiosRecord
->OemDefined
,(UINT8
*)&ForType3InputData
->ChassisOemDefined
, 4);
136 SmbiosRecord
->Height
= (UINT8
)ForType3InputData
->ChassisHeight
;
137 SmbiosRecord
->NumberofPowerCords
= (UINT8
)ForType3InputData
->ChassisNumberPowerCords
;
138 SmbiosRecord
->ContainedElementCount
= 0;
139 SmbiosRecord
->ContainedElementRecordLength
= 0;
142 // SKU Number will be the 5th optional string following the formatted structure.
144 // Since SKU Number is not in SMBIOS_TABLE_TYPE3 structure, must locate it after ContainedElementRecordLength.
146 Buffer
[sizeof (SMBIOS_TABLE_TYPE3
) - sizeof (CONTAINED_ELEMENT
)] = 5;
148 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
150 // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,
151 // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].
153 OptionalStrStart
-= sizeof (CONTAINED_ELEMENT
);
155 // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.
157 OptionalStrStart
+= sizeof (SMBIOS_TABLE_STRING
);
158 UnicodeStrToAsciiStr (Manufacturer
, OptionalStrStart
);
159 UnicodeStrToAsciiStr (Version
, OptionalStrStart
+ ManuStrLen
+ 1);
160 UnicodeStrToAsciiStr (SerialNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1);
161 UnicodeStrToAsciiStr (AssetTag
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
162 UnicodeStrToAsciiStr (SkuNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssetTagStrLen
+ 1);
165 // Now we have got the full smbios record, call smbios protocol to add this record.
167 Status
= AddSmbiosRecord (Smbios
, &SmbiosHandle
, (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
);
169 FreePool(SmbiosRecord
);