1 /** @file
2   BaseBoard manufacturer information boot time changes.
3   SMBIOS type 2.
4 
5   Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
6   This program and the accompanying materials
7   are licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #include "MiscSubClassDriver.h"
17 /**
18   This function makes boot time changes to the contents of the
19   MiscBaseBoardManufacturer (Type 2).
20 
21   @param  RecordData                 Pointer to copy of RecordData from the Data Table.
22 
23   @retval EFI_SUCCESS                All parameters were valid.
24   @retval EFI_UNSUPPORTED            Unexpected RecordType value.
25   @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
26 
27 **/
MISC_SMBIOS_TABLE_FUNCTION(MiscBaseBoardManufacturer)28 MISC_SMBIOS_TABLE_FUNCTION(MiscBaseBoardManufacturer)
29 {
30   CHAR8                           *OptionalStrStart;
31   UINTN                           ManuStrLen;
32   UINTN                           ProductStrLen;
33   UINTN                           VerStrLen;
34   UINTN                           AssertTagStrLen;
35   UINTN                           SerialNumStrLen;
36   UINTN                           ChassisStrLen;
37   EFI_STATUS                      Status;
38   EFI_STRING                      Manufacturer;
39   EFI_STRING                      Product;
40   EFI_STRING                      Version;
41   EFI_STRING                      SerialNumber;
42   EFI_STRING                      AssertTag;
43   EFI_STRING                      Chassis;
44   STRING_REF                      TokenToGet;
45   EFI_SMBIOS_HANDLE               SmbiosHandle;
46   SMBIOS_TABLE_TYPE2              *SmbiosRecord;
47   EFI_MISC_BASE_BOARD_MANUFACTURER   *ForType2InputData;
48 
49   ForType2InputData = (EFI_MISC_BASE_BOARD_MANUFACTURER *)RecordData;
50 
51   //
52   // First check for invalid parameters.
53   //
54   if (RecordData == NULL) {
55     return EFI_INVALID_PARAMETER;
56   }
57 
58   TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);
59   Manufacturer = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
60   ManuStrLen = StrLen(Manufacturer);
61   if (ManuStrLen > SMBIOS_STRING_MAX_LENGTH) {
62     return EFI_UNSUPPORTED;
63   }
64 
65   TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);
66   Product = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
67   ProductStrLen = StrLen(Product);
68   if (ProductStrLen > SMBIOS_STRING_MAX_LENGTH) {
69     return EFI_UNSUPPORTED;
70   }
71 
72   TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
73   Version = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
74   VerStrLen = StrLen(Version);
75   if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {
76     return EFI_UNSUPPORTED;
77   }
78 
79   TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER);
80   SerialNumber = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
81   SerialNumStrLen = StrLen(SerialNumber);
82   if (SerialNumStrLen > SMBIOS_STRING_MAX_LENGTH) {
83     return EFI_UNSUPPORTED;
84   }
85 
86   TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG);
87   AssertTag = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
88   AssertTagStrLen = StrLen(AssertTag);
89   if (AssertTagStrLen > SMBIOS_STRING_MAX_LENGTH) {
90     return EFI_UNSUPPORTED;
91   }
92 
93   TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION);
94   Chassis = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
95   ChassisStrLen = StrLen(Chassis);
96   if (ChassisStrLen > SMBIOS_STRING_MAX_LENGTH) {
97     return EFI_UNSUPPORTED;
98   }
99 
100 
101   //
102   // Two zeros following the last string.
103   //
104   SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + ChassisStrLen +1 + 1);
105   ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + ChassisStrLen +1 + 1);
106 
107   SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION;
108   SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE2);
109   //
110   // Make handle chosen by smbios protocol.add automatically.
111   //
112   SmbiosRecord->Hdr.Handle = 0;
113   //
114   // Manu will be the 1st optional string following the formatted structure.
115   //
116   SmbiosRecord->Manufacturer = 1;
117   //
118   // ProductName will be the 2st optional string following the formatted structure.
119   //
120   SmbiosRecord->ProductName  = 2;
121   //
122   // Version will be the 3rd optional string following the formatted structure.
123   //
124   SmbiosRecord->Version = 3;
125   //
126   // SerialNumber will be the 4th optional string following the formatted structure.
127   //
128   SmbiosRecord->SerialNumber = 4;
129   //
130   // AssertTag will be the 5th optional string following the formatted structure.
131   //
132   SmbiosRecord->AssetTag = 5;
133 
134   //
135   // LocationInChassis will be the 6th optional string following the formatted structure.
136   //
137   SmbiosRecord->LocationInChassis = 6;
138   SmbiosRecord->FeatureFlag = (*(BASE_BOARD_FEATURE_FLAGS*)&(ForType2InputData->BaseBoardFeatureFlags));
139   SmbiosRecord->ChassisHandle  = 0;
140   SmbiosRecord->BoardType      = (UINT8)ForType2InputData->BaseBoardType;
141   SmbiosRecord->NumberOfContainedObjectHandles = 0;
142 
143   OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
144   //
145   // Since we fill NumberOfContainedObjectHandles = 0 for simple, just after this filed to fill string
146   //
147   OptionalStrStart -= 2;
148   UnicodeStrToAsciiStr(Manufacturer, OptionalStrStart);
149   UnicodeStrToAsciiStr(Product, OptionalStrStart + ManuStrLen + 1);
150   UnicodeStrToAsciiStr(Version, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1);
151   UnicodeStrToAsciiStr(SerialNumber, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1);
152   UnicodeStrToAsciiStr(AssertTag, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);
153   UnicodeStrToAsciiStr(Chassis, OptionalStrStart + ManuStrLen + 1 + ProductStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1);
154   //
155   // Now we have got the full smbios record, call smbios protocol to add this record.
156   //
157   Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);
158 
159   FreePool(SmbiosRecord);
160   return Status;
161 }
162