]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/MiscSubClassPlatformDxe/MiscBiosVendorFunction.c
According to PI errata 0000654 and 000811, we need use 0xFFFE to instead of 0 for...
[mirror_edk2.git] / Nt32Pkg / MiscSubClassPlatformDxe / MiscBiosVendorFunction.c
CommitLineData
5e973c96 1/** @file\r
1fdd39d3 2 BIOS vendor information boot time changes.\r
3 Misc. subclass type 2.\r
4 SMBIOS type 0.\r
5e973c96 5 \r
8f2a5f80
HT
6Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>\r
7This program and the accompanying materials\r
5e973c96 8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
1fdd39d3 14\r
5e973c96 15**/\r
1fdd39d3 16\r
17#include "MiscSubclassDriver.h"\r
18\r
19/**\r
20 This function returns the value & exponent to Base2 for a given\r
21 Hex value. This is used to calculate the BiosPhysicalDeviceSize.\r
22\r
23 @param Value The hex value which is to be converted into value-exponent form\r
24 @param Exponent The exponent out of the conversion\r
25\r
26 @retval EFI_SUCCESS All parameters were valid and *Value & *Exponent have been set.\r
27 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
28 \r
29**/\r
30EFI_STATUS \r
31GetValueExponentBase2(\r
32 IN OUT UINTN *Value,\r
33 OUT UINTN *Exponent\r
34 )\r
35{\r
36 if ((Value == NULL) || (Exponent == NULL)) {\r
37 return EFI_INVALID_PARAMETER;\r
38 }\r
39 \r
40 while ((*Value % 2) == 0) {\r
41 *Value=*Value/2;\r
42 (*Exponent)++;\r
43 }\r
44\r
45 return EFI_SUCCESS;\r
46}\r
47\r
48/**\r
49 Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'\r
50 as the unit.\r
51\r
52 @param Base2Data Pointer to Base2_Data\r
53\r
54 @retval EFI_SUCCESS Transform successfully. \r
55 @retval EFI_INVALID_PARAMETER Invalid parameter was found. \r
56\r
57**/\r
58UINT16\r
59Base2ToByteWith64KUnit (\r
60 IN EFI_EXP_BASE2_DATA *Base2Data\r
61 )\r
62{ \r
63 UINT16 Value;\r
64 UINT16 Exponent;\r
65\r
66 Value = Base2Data->Value;\r
67 Exponent = Base2Data->Exponent;\r
68 Exponent -= 16;\r
69 Value <<= Exponent;\r
70\r
71 return Value;\r
72}\r
73\r
74\r
75/**\r
76 This function makes boot time changes to the contents of the\r
77 MiscBiosVendor (Type 0).\r
78\r
79 @param RecordData Pointer to copy of RecordData from the Data Table.\r
80\r
81 @retval EFI_SUCCESS All parameters were valid.\r
82 @retval EFI_UNSUPPORTED Unexpected RecordType value.\r
83 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
84\r
85**/\r
86MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)\r
87{\r
88 CHAR8 *OptionalStrStart;\r
89 UINTN VendorStrLen;\r
90 UINTN VerStrLen;\r
91 UINTN DateStrLen;\r
92 CHAR16 *Version;\r
93 CHAR16 *ReleaseDate;\r
94 EFI_STATUS Status;\r
95 EFI_STRING Char16String;\r
96 STRING_REF TokenToGet;\r
97 STRING_REF TokenToUpdate;\r
98 SMBIOS_TABLE_TYPE0 *SmbiosRecord;\r
99 EFI_SMBIOS_HANDLE SmbiosHandle;\r
100 EFI_MISC_BIOS_VENDOR *ForType0InputData;\r
101\r
102 ForType0InputData = (EFI_MISC_BIOS_VENDOR *)RecordData;\r
103\r
104 //\r
105 // First check for invalid parameters.\r
106 //\r
107 if (RecordData == NULL) {\r
108 return EFI_INVALID_PARAMETER;\r
109 }\r
110\r
111 Version = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);\r
112 if (StrLen (Version) > 0) { \r
113 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
114 HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);\r
115 }\r
116 \r
117 ReleaseDate = (CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString);\r
118 if (StrLen(ReleaseDate) > 0) {\r
119 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);\r
120 HiiSetString (mHiiHandle, TokenToUpdate, ReleaseDate, NULL);\r
121 }\r
122\r
123 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VENDOR);\r
124 Char16String = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
125 VendorStrLen = StrLen(Char16String);\r
126 if (VendorStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
127 return EFI_UNSUPPORTED;\r
128 }\r
129\r
130 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
131 Version = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
132 VerStrLen = StrLen(Version);\r
133 if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
134 return EFI_UNSUPPORTED;\r
135 }\r
136\r
137 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);\r
138 ReleaseDate = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
139 DateStrLen = StrLen(ReleaseDate);\r
140 if (DateStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
141 return EFI_UNSUPPORTED;\r
142 }\r
143 \r
144 //\r
145 // Two zeros following the last string.\r
146 //\r
147 SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE0) + VendorStrLen + 1 + VerStrLen + 1 + DateStrLen + 1 + 1);\r
148 ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE0) + VendorStrLen + 1 + VerStrLen + 1 + DateStrLen + 1 + 1);\r
149\r
150 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BIOS_INFORMATION;\r
151 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE0);\r
152 //\r
153 // Make handle chosen by smbios protocol.add automatically.\r
154 //\r
155 SmbiosRecord->Hdr.Handle = 0;\r
156 //\r
157 // Vendor will be the 1st optional string following the formatted structure.\r
158 //\r
159 SmbiosRecord->Vendor = 1; \r
160 //\r
161 // Version will be the 2nd optional string following the formatted structure.\r
162 //\r
163 SmbiosRecord->BiosVersion = 2;\r
164 SmbiosRecord->BiosSegment = (UINT16)ForType0InputData->BiosStartingAddress;\r
165 //\r
166 // ReleaseDate will be the 3rd optional string following the formatted structure.\r
167 //\r
168 SmbiosRecord->BiosReleaseDate = 3;\r
169 //\r
170 // Nt32 has no PCD value to indicate BIOS Size, just fill 0 for simply.\r
171 //\r
172 SmbiosRecord->BiosSize = 0;\r
173 SmbiosRecord->BiosCharacteristics = *(MISC_BIOS_CHARACTERISTICS*)(&ForType0InputData->BiosCharacteristics1);\r
174 //\r
175 // CharacterExtensionBytes also store in ForType0InputData->BiosCharacteristics1 later two bytes to save size.\r
176 //\r
177 SmbiosRecord->BIOSCharacteristicsExtensionBytes[0] = *((UINT8 *) &ForType0InputData->BiosCharacteristics1 + 4);\r
178 SmbiosRecord->BIOSCharacteristicsExtensionBytes[1] = *((UINT8 *) &ForType0InputData->BiosCharacteristics1 + 5);\r
179\r
180 SmbiosRecord->SystemBiosMajorRelease = ForType0InputData->BiosMajorRelease;\r
181 SmbiosRecord->SystemBiosMinorRelease = ForType0InputData->BiosMinorRelease;\r
182 SmbiosRecord->EmbeddedControllerFirmwareMajorRelease = ForType0InputData->BiosEmbeddedFirmwareMajorRelease;\r
183 SmbiosRecord->EmbeddedControllerFirmwareMinorRelease = ForType0InputData->BiosEmbeddedFirmwareMinorRelease;\r
184\r
185 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
186 UnicodeStrToAsciiStr(Char16String, OptionalStrStart);\r
187 UnicodeStrToAsciiStr(Version, OptionalStrStart + VendorStrLen + 1);\r
188 UnicodeStrToAsciiStr(ReleaseDate, OptionalStrStart + VendorStrLen + 1 + VerStrLen + 1);\r
189 //\r
190 // Now we have got the full smbios record, call smbios protocol to add this record.\r
191 //\r
192 SmbiosHandle = 0;\r
193 Status = Smbios-> Add(\r
194 Smbios, \r
195 NULL,\r
196 &SmbiosHandle, \r
197 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
198 );\r
199\r
200 FreePool(SmbiosRecord);\r
201 return Status;\r
202}\r