Home | History | Annotate | Download | only in MiscSubClassPlatformDxe
      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 **/
     29 MISC_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