]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkPlatformPkg/Platform/Dxe/SmbiosMiscDxe/MiscBiosVendorFunction.c
QuarkPlatformPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / QuarkPlatformPkg / Platform / Dxe / SmbiosMiscDxe / MiscBiosVendorFunction.c
CommitLineData
b303605e
MK
1/** @file\r
2BIOS vendor information boot time changes.\r
3Misc. subclass type 2.\r
4SMBIOS type 0.\r
5\r
6Copyright (c) 2013-2015 Intel Corporation.\r
7\r
0eb3de2e 8SPDX-License-Identifier: BSD-2-Clause-Patent\r
b303605e
MK
9\r
10\r
11**/\r
12\r
13\r
14#include "CommonHeader.h"\r
15\r
16#include "SmbiosMisc.h"\r
17\r
18/**\r
19 This function returns the value & exponent to Base2 for a given\r
20 Hex value. This is used to calculate the BiosPhysicalDeviceSize.\r
21\r
22 @param Value The hex value which is to be converted into value-exponent form\r
23 @param Exponent The exponent out of the conversion\r
24\r
25 @retval EFI_SUCCESS All parameters were valid and *Value & *Exponent have been set.\r
26 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
27\r
28**/\r
29EFI_STATUS\r
30GetValueExponentBase2(\r
31 IN OUT UINTN *Value,\r
32 OUT UINTN *Exponent\r
33 )\r
34{\r
35 if ((Value == NULL) || (Exponent == NULL)) {\r
36 return EFI_INVALID_PARAMETER;\r
37 }\r
38\r
39 while ((*Value % 2) == 0) {\r
40 *Value=*Value/2;\r
41 (*Exponent)++;\r
42 }\r
43\r
44 return EFI_SUCCESS;\r
45}\r
46\r
47/**\r
48 Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'\r
49 as the unit.\r
50\r
51 @param Base2Data Pointer to Base2_Data\r
52\r
53 @retval EFI_SUCCESS Transform successfully.\r
54 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
55\r
56**/\r
57UINT16\r
58Base2ToByteWith64KUnit (\r
59 IN EFI_EXP_BASE2_DATA *Base2Data\r
60 )\r
61{\r
62 UINT16 Value;\r
63 UINT16 Exponent;\r
64\r
65 Value = Base2Data->Value;\r
66 Exponent = Base2Data->Exponent;\r
67 Exponent -= 16;\r
68 Value <<= Exponent;\r
69\r
70 return Value;\r
71}\r
72\r
73\r
74/**\r
75 This function makes boot time changes to the contents of the\r
76 MiscBiosVendor (Type 0).\r
77\r
78 @param RecordData Pointer to copy of RecordData from the Data Table.\r
79\r
80 @retval EFI_SUCCESS All parameters were valid.\r
81 @retval EFI_UNSUPPORTED Unexpected RecordType value.\r
82 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
83\r
84**/\r
85MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)\r
86{\r
87 CHAR8 *OptionalStrStart;\r
88 UINTN VendorStrLen;\r
89 UINTN VerStrLen;\r
90 UINTN DateStrLen;\r
91 UINTN BiosPhysicalSizeHexValue;\r
92 UINTN BiosPhysicalSizeExponent;\r
93 CHAR16 Version[SMBIOS_STRING_MAX_LENGTH];\r
94 CHAR16 Vendor[SMBIOS_STRING_MAX_LENGTH];\r
95 CHAR16 ReleaseDate[SMBIOS_STRING_MAX_LENGTH];\r
96 EFI_STRING VersionPtr;\r
97 EFI_STRING VendorPtr;\r
98 EFI_STRING ReleaseDatePtr;\r
99 EFI_STATUS Status;\r
100 STRING_REF TokenToGet;\r
101 STRING_REF TokenToUpdate;\r
102 SMBIOS_TABLE_TYPE0 *SmbiosRecord;\r
103 EFI_SMBIOS_HANDLE SmbiosHandle;\r
104 EFI_MISC_BIOS_VENDOR *ForType0InputData;\r
105\r
106 BiosPhysicalSizeHexValue = 0x0;\r
107 BiosPhysicalSizeExponent = 0x0;\r
108 ForType0InputData = (EFI_MISC_BIOS_VENDOR *)RecordData;\r
109\r
110 //\r
111 // First check for invalid parameters.\r
112 //\r
113 if (RecordData == NULL) {\r
114 return EFI_INVALID_PARAMETER;\r
115 }\r
116 //\r
117 // Now update the BiosPhysicalSize\r
118 //\r
119 BiosPhysicalSizeHexValue = PcdGet32 (PcdFlashAreaSize);\r
120 Status= GetValueExponentBase2 (\r
121 &BiosPhysicalSizeHexValue,\r
122 &BiosPhysicalSizeExponent\r
123 );\r
124 if(Status == EFI_SUCCESS){\r
125 ForType0InputData->BiosPhysicalDeviceSize.Value = (UINT16)BiosPhysicalSizeHexValue;\r
126 ForType0InputData->BiosPhysicalDeviceSize.Exponent = (UINT16)BiosPhysicalSizeExponent;\r
127 }\r
128 //\r
129 // Update strings from PCD\r
130 //\r
131 AsciiStrToUnicodeStr ((CHAR8 *) PcdGetPtr (PcdSMBIOSBiosVendor), Vendor);\r
132 if (StrLen (Vendor) > 0) {\r
133 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VENDOR);\r
134 HiiSetString (mHiiHandle, TokenToUpdate, Vendor, NULL);\r
135 }\r
136 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VENDOR);\r
137 VendorPtr = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
138 VendorStrLen = StrLen(VendorPtr);\r
139 if (VendorStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
140 return EFI_UNSUPPORTED;\r
141 }\r
142\r
143 UnicodeSPrint (Version, sizeof (Version), L"0x%08x", PcdGet32 (PcdFirmwareRevision));\r
144 if (StrLen (Version) > 0) {\r
145 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
146 HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);\r
147 }\r
148 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
149 VersionPtr = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
150 VerStrLen = StrLen(VersionPtr);\r
151 if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
152 return EFI_UNSUPPORTED;\r
153 }\r
154\r
155 AsciiStrToUnicodeStr ((CHAR8 *) PcdGetPtr (PcdSMBIOSBiosReleaseDate), ReleaseDate);\r
156 if (StrLen (ReleaseDate) > 0) {\r
157 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);\r
158 HiiSetString (mHiiHandle, TokenToUpdate, ReleaseDate, NULL);\r
159 }\r
160 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);\r
161 ReleaseDatePtr = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
162 DateStrLen = StrLen(ReleaseDatePtr);\r
163 if (DateStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
164 return EFI_UNSUPPORTED;\r
165 }\r
166\r
167 //\r
168 // Two zeros following the last string.\r
169 //\r
170 SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE0) + VendorStrLen + 1 + VerStrLen + 1 + DateStrLen + 1 + 1);\r
171 ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE0) + VendorStrLen + 1 + VerStrLen + 1 + DateStrLen + 1 + 1);\r
172\r
173 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BIOS_INFORMATION;\r
174 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE0);\r
175 //\r
176 // Make handle chosen by smbios protocol.add automatically.\r
177 //\r
178 SmbiosRecord->Hdr.Handle = 0;\r
179 //\r
180 // Vendor will be the 1st optional string following the formatted structure.\r
181 //\r
182 SmbiosRecord->Vendor = 1;\r
183 //\r
184 // Version will be the 2nd optional string following the formatted structure.\r
185 //\r
186 SmbiosRecord->BiosVersion = 2;\r
187 SmbiosRecord->BiosSegment = PcdGet16 (PcdSMBIOSBiosStartAddress);\r
188 //\r
189 // ReleaseDate will be the 3rd optional string following the formatted structure.\r
190 //\r
191 SmbiosRecord->BiosReleaseDate = 3;\r
192 SmbiosRecord->BiosSize = (UINT8)(Base2ToByteWith64KUnit(&ForType0InputData->BiosPhysicalDeviceSize) - 1);\r
193 *(UINT64 *)&SmbiosRecord->BiosCharacteristics = PcdGet64 (PcdSMBIOSBiosChar);\r
194 //\r
195 // CharacterExtensionBytes also store in ForType0InputData->BiosCharacteristics1 later two bytes to save size.\r
196 //\r
197 SmbiosRecord->BIOSCharacteristicsExtensionBytes[0] = PcdGet8 (PcdSMBIOSBiosCharEx1);\r
198 SmbiosRecord->BIOSCharacteristicsExtensionBytes[1] = PcdGet8 (PcdSMBIOSBiosCharEx2);\r
199\r
200 SmbiosRecord->SystemBiosMajorRelease = ForType0InputData->BiosMajorRelease;\r
201 SmbiosRecord->SystemBiosMinorRelease = ForType0InputData->BiosMinorRelease;\r
202 SmbiosRecord->EmbeddedControllerFirmwareMajorRelease = ForType0InputData->BiosEmbeddedFirmwareMajorRelease;\r
203 SmbiosRecord->EmbeddedControllerFirmwareMinorRelease = ForType0InputData->BiosEmbeddedFirmwareMinorRelease;\r
204\r
205 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
206 UnicodeStrToAsciiStr(VendorPtr, OptionalStrStart);\r
207 UnicodeStrToAsciiStr(VersionPtr, OptionalStrStart + VendorStrLen + 1);\r
208 UnicodeStrToAsciiStr(ReleaseDatePtr, OptionalStrStart + VendorStrLen + 1 + VerStrLen + 1);\r
209 //\r
210 // Now we have got the full smbios record, call smbios protocol to add this record.\r
211 //\r
212 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
213 Status = Smbios-> Add(\r
214 Smbios,\r
215 NULL,\r
216 &SmbiosHandle,\r
217 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
218 );\r
219\r
220 FreePool(SmbiosRecord);\r
221 return Status;\r
222}\r