2 Chassis manufacturer information boot time changes.
5 Copyright (c) 2013-2015 Intel Corporation.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
13 #include "CommonHeader.h"
15 #include "SmbiosMisc.h"
18 This function makes boot time changes to the contents of the
19 MiscChassisManufacturer (Type 3).
21 @param RecordData Pointer to copy of RecordData from the Data Table.
23 @retval EFI_SUCCESS All parameters were valid.
24 @retval EFI_UNSUPPORTED Unexpected RecordType value.
25 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
28 MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer
)
30 CHAR8
*OptionalStrStart
;
33 UINTN AssertTagStrLen
;
34 UINTN SerialNumStrLen
;
36 CHAR16 Manufacturer
[SMBIOS_STRING_MAX_LENGTH
];
37 CHAR16 Version
[SMBIOS_STRING_MAX_LENGTH
];
38 CHAR16 SerialNumber
[SMBIOS_STRING_MAX_LENGTH
];
39 CHAR16 AssertTag
[SMBIOS_STRING_MAX_LENGTH
];
40 EFI_STRING ManufacturerPtr
;
41 EFI_STRING VersionPtr
;
42 EFI_STRING SerialNumberPtr
;
43 EFI_STRING AssertTagPtr
;
44 STRING_REF TokenToGet
;
45 STRING_REF TokenToUpdate
;
46 EFI_SMBIOS_HANDLE SmbiosHandle
;
47 SMBIOS_TABLE_TYPE3
*SmbiosRecord
;
48 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
;
60 // Update strings from PCD
62 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSChassisManufacturer
), Manufacturer
);
63 if (StrLen (Manufacturer
) > 0) {
64 TokenToUpdate
= STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
);
65 HiiSetString (mHiiHandle
, TokenToUpdate
, Manufacturer
, NULL
);
67 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
);
68 ManufacturerPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
69 ManuStrLen
= StrLen(ManufacturerPtr
);
70 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
71 return EFI_UNSUPPORTED
;
74 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSChassisVersion
), Version
);
75 if (StrLen (Version
) > 0) {
76 TokenToUpdate
= STRING_TOKEN (STR_MISC_CHASSIS_VERSION
);
77 HiiSetString (mHiiHandle
, TokenToUpdate
, Version
, NULL
);
79 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_VERSION
);
80 VersionPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
81 VerStrLen
= StrLen(VersionPtr
);
82 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
83 return EFI_UNSUPPORTED
;
86 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSChassisSerialNumber
), SerialNumber
);
87 if (StrLen (SerialNumber
) > 0) {
88 TokenToUpdate
= STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
);
89 HiiSetString (mHiiHandle
, TokenToUpdate
, SerialNumber
, NULL
);
91 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
);
92 SerialNumberPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
93 SerialNumStrLen
= StrLen(SerialNumberPtr
);
94 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
95 return EFI_UNSUPPORTED
;
98 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSChassisAssetTag
), AssertTag
);
99 if (StrLen (AssertTag
) > 0) {
100 TokenToUpdate
= STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
);
101 HiiSetString (mHiiHandle
, TokenToUpdate
, AssertTag
, NULL
);
103 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
);
104 AssertTagPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
105 AssertTagStrLen
= StrLen(AssertTagPtr
);
106 if (AssertTagStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
107 return EFI_UNSUPPORTED
;
111 // Two zeros following the last string.
113 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE3
) + ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssertTagStrLen
+ 1 + 1);
114 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE3
) + ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + AssertTagStrLen
+ 1 + 1);
116 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE
;
117 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE3
);
119 // Make handle chosen by smbios protocol.add automatically.
121 SmbiosRecord
->Hdr
.Handle
= 0;
123 // Manu will be the 1st optional string following the formatted structure.
125 SmbiosRecord
->Manufacturer
= 1;
126 SmbiosRecord
->Type
= PcdGet8 (PcdSMBIOSChassisType
);
128 // Version will be the 2nd optional string following the formatted structure.
130 SmbiosRecord
->Version
= 2;
132 // SerialNumber will be the 3rd optional string following the formatted structure.
134 SmbiosRecord
->SerialNumber
= 3;
136 // AssertTag will be the 4th optional string following the formatted structure.
138 SmbiosRecord
->AssetTag
= 4;
139 SmbiosRecord
->BootupState
= PcdGet8 (PcdSMBIOSChassisBootupState
);
140 SmbiosRecord
->PowerSupplyState
= PcdGet8 (PcdSMBIOSChassisPowerSupplyState
);
141 SmbiosRecord
->ThermalState
= (UINT8
)ForType3InputData
->ChassisThermalState
;
142 SmbiosRecord
->SecurityStatus
= PcdGet8 (PcdSMBIOSChassisSecurityState
);
143 *(UINT32
*)&SmbiosRecord
->OemDefined
= PcdGet32 (PcdSMBIOSChassisOemDefined
);
144 SmbiosRecord
->Height
= PcdGet8 (PcdSMBIOSChassisHeight
);
145 SmbiosRecord
->NumberofPowerCords
= PcdGet8 (PcdSMBIOSChassisNumberPowerCords
);
146 SmbiosRecord
->ContainedElementCount
= PcdGet8 (PcdSMBIOSChassisElementCount
);
147 SmbiosRecord
->ContainedElementRecordLength
= PcdGet8 (PcdSMBIOSChassisElementRecordLength
);
149 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
150 UnicodeStrToAsciiStr(ManufacturerPtr
, OptionalStrStart
);
151 UnicodeStrToAsciiStr(VersionPtr
, OptionalStrStart
+ ManuStrLen
+ 1);
152 UnicodeStrToAsciiStr(SerialNumberPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1);
153 UnicodeStrToAsciiStr(AssertTagPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
156 // Now we have got the full smbios record, call smbios protocol to add this record.
158 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
159 Status
= Smbios
-> Add(
163 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
166 FreePool(SmbiosRecord
);