1/** @file
2  Chassis manufacturer information boot time changes.
3  SMBIOS type 3.
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/**
19  This function makes boot time changes to the contents of the
20  MiscChassisManufacturer (Type 3).
21
22  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
23
24  @retval EFI_SUCCESS                All parameters were valid.
25  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
26  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
27
28**/
29MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer)
30{
31  CHAR8                           *OptionalStrStart;
32  UINTN                           ManuStrLen;
33  UINTN                           VerStrLen;
34  UINTN                           AssertTagStrLen;
35  UINTN                           SerialNumStrLen;
36  EFI_STATUS                      Status;
37  EFI_STRING                      Manufacturer;
38  EFI_STRING                      Version;
39  EFI_STRING                      SerialNumber;
40  EFI_STRING                      AssertTag;
41  STRING_REF                      TokenToGet;
42  EFI_SMBIOS_HANDLE               SmbiosHandle;
43  SMBIOS_TABLE_TYPE3              *SmbiosRecord;
44  EFI_MISC_CHASSIS_MANUFACTURER   *ForType3InputData;
45
46  ForType3InputData = (EFI_MISC_CHASSIS_MANUFACTURER *)RecordData;
47
48  //
49  // First check for invalid parameters.
50  //
51  if (RecordData == NULL) {
52    return EFI_INVALID_PARAMETER;
53  }
54
55  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER);
56  Manufacturer = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
57  ManuStrLen = StrLen(Manufacturer);
58  if (ManuStrLen > SMBIOS_STRING_MAX_LENGTH) {
59    return EFI_UNSUPPORTED;
60  }
61
62  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_VERSION);
63  Version = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
64  VerStrLen = StrLen(Version);
65  if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {
66    return EFI_UNSUPPORTED;
67  }
68
69  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER);
70  SerialNumber = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
71  SerialNumStrLen = StrLen(SerialNumber);
72  if (SerialNumStrLen > SMBIOS_STRING_MAX_LENGTH) {
73    return EFI_UNSUPPORTED;
74  }
75
76  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG);
77  AssertTag = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
78  AssertTagStrLen = StrLen(AssertTag);
79  if (AssertTagStrLen > SMBIOS_STRING_MAX_LENGTH) {
80    return EFI_UNSUPPORTED;
81  }
82
83  //
84  // Two zeros following the last string.
85  //
86  SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1  + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + 1);
87  ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1  + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + 1);
88
89  SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE;
90  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3);
91  //
92  // Make handle chosen by smbios protocol.add automatically.
93  //
94  SmbiosRecord->Hdr.Handle = 0;
95  //
96  // Manu will be the 1st optional string following the formatted structure.
97  //
98  SmbiosRecord->Manufacturer = 1;
99  SmbiosRecord->Type = (UINT8)ForType3InputData->ChassisType.ChassisType;
100  //
101  // Version will be the 2nd optional string following the formatted structure.
102  //
103  SmbiosRecord->Version = 2;
104  //
105  // SerialNumber will be the 3rd optional string following the formatted structure.
106  //
107  SmbiosRecord->SerialNumber = 3;
108  //
109  // AssertTag will be the 4th optional string following the formatted structure.
110  //
111  SmbiosRecord->AssetTag = 4;
112  SmbiosRecord->BootupState = (UINT8)ForType3InputData->ChassisBootupState;
113  SmbiosRecord->PowerSupplyState = (UINT8)ForType3InputData->ChassisPowerSupplyState;
114  SmbiosRecord->ThermalState = (UINT8)ForType3InputData->ChassisThermalState;
115  SmbiosRecord->SecurityStatus = (UINT8)ForType3InputData->ChassisSecurityState;
116  CopyMem (SmbiosRecord->OemDefined,(UINT8*)&ForType3InputData->ChassisOemDefined, 4);
117
118  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
119  UnicodeStrToAsciiStr(Manufacturer, OptionalStrStart);
120  UnicodeStrToAsciiStr(Version, OptionalStrStart + ManuStrLen + 1);
121  UnicodeStrToAsciiStr(SerialNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1);
122  UnicodeStrToAsciiStr(AssertTag, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);
123
124  //
125  // Now we have got the full smbios record, call smbios protocol to add this record.
126  //
127  Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);
128
129  FreePool(SmbiosRecord);
130  return Status;
131}
132