Home | History | Annotate | Download | only in Type00
      1 /** @file
      2 
      3   Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
      4   Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
      5   Copyright (c) 2015, Linaro Limited. 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 Module Name:
     16 
     17   MiscBiosVendorData.c
     18 
     19 Abstract:
     20 
     21   This driver parses the mMiscSubclassDataTable structure and reports
     22   any generated data to the DataHub.
     23 
     24 Based on the files under Nt32Pkg/MiscSubClassPlatformDxe/
     25 
     26 --*/
     27 
     28 //
     29 #include "SmbiosMisc.h"
     30 #include <Library/HobLib.h>
     31 #include <Guid/VersionInfoHobGuid.h>
     32 
     33 
     34 /**
     35   Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'
     36   as the unit.
     37 
     38   @param  Value              Pointer to Base2_Data
     39 
     40   @retval
     41 
     42 **/
     43 UINT8
     44 Base2ToByteWith64KUnit (
     45   IN  UINTN  Value
     46   )
     47 {
     48     UINT8 Size;
     49 
     50     Size = Value / SIZE_64KB + (Value % SIZE_64KB + SIZE_64KB - 1) / SIZE_64KB;
     51 
     52     return Size;
     53 }
     54 
     55 
     56 /**
     57 
     58 **/
     59 VOID *
     60 GetBiosReleaseDate (
     61   )
     62 {
     63     CHAR16                  *ReleaseDate = NULL;
     64     VERSION_INFO            *Version;
     65     VOID                    *Hob;
     66 
     67     ReleaseDate = AllocateZeroPool ((sizeof (CHAR16)) * SMBIOS_STRING_MAX_LENGTH);
     68     if(NULL == ReleaseDate)
     69     {
     70         return NULL;
     71     }
     72 
     73     Hob = GetFirstGuidHob (&gVersionInfoHobGuid);
     74     if (Hob == NULL) {
     75       DEBUG ((EFI_D_ERROR, "[%a:%d] Version info HOB not found!\n", __FUNCTION__, __LINE__));
     76       return NULL;
     77     }
     78 
     79     Version = GET_GUID_HOB_DATA (Hob);
     80     (VOID)UnicodeSPrintAsciiFormat( ReleaseDate,
     81                           (sizeof (CHAR16)) * SMBIOS_STRING_MAX_LENGTH,
     82                           "%02d/%02d/%4d",
     83                           Version->BuildTime.Month,
     84                           Version->BuildTime.Day,
     85                           Version->BuildTime.Year
     86                           );
     87 
     88     return ReleaseDate;
     89 }
     90 
     91 VOID *
     92 GetBiosVersion (
     93   )
     94 {
     95     VERSION_INFO            *Version;
     96     VOID                    *Hob;
     97 
     98     Hob = GetFirstGuidHob (&gVersionInfoHobGuid);
     99     if (Hob == NULL) {
    100       DEBUG ((EFI_D_ERROR, "[%a:%d] Version info HOB not found!\n", __FUNCTION__, __LINE__));
    101       return NULL;
    102     }
    103     Version = GET_GUID_HOB_DATA (Hob);
    104     return Version->String;
    105 }
    106 
    107 
    108 /**
    109   This function makes boot time changes to the contents of the
    110   MiscBiosVendor (Type 0).
    111 
    112   @param  RecordData                 Pointer to copy of RecordData from the Data Table.
    113 
    114   @retval EFI_SUCCESS                All parameters were valid.
    115   @retval EFI_UNSUPPORTED            Unexpected RecordType value.
    116   @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
    117 
    118 **/
    119 MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)
    120 {
    121     CHAR8                 *OptionalStrStart;
    122     UINTN                 VendorStrLen;
    123     UINTN                 VerStrLen;
    124     UINTN                 DateStrLen;
    125     UINTN                 BiosPhysicalSizeHexValue;
    126     CHAR16                *Vendor;
    127     CHAR16                *Version;
    128     CHAR16                *ReleaseDate;
    129     CHAR16                *Char16String;
    130     EFI_STATUS            Status;
    131     STRING_REF            TokenToUpdate;
    132     STRING_REF            TokenToGet;
    133     SMBIOS_TABLE_TYPE0    *SmbiosRecord;
    134     EFI_SMBIOS_HANDLE     SmbiosHandle;
    135     SMBIOS_TABLE_TYPE0    *InputData;
    136 
    137     //
    138     // First check for invalid parameters.
    139     //
    140     if (RecordData == NULL)
    141     {
    142         return EFI_INVALID_PARAMETER;
    143     }
    144 
    145     InputData = (SMBIOS_TABLE_TYPE0 *)RecordData;
    146 
    147     Vendor = (CHAR16 *) PcdGetPtr (PcdFirmwareVendor);
    148     if (StrLen(Vendor) > 0)
    149     {
    150         TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VENDOR);
    151         HiiSetString (mHiiHandle, TokenToUpdate, Vendor, NULL);
    152     }
    153 
    154     Version = GetBiosVersion();
    155     if (StrLen (Version) > 0)
    156     {
    157         TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);
    158         HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);
    159     }
    160     else
    161     {
    162         Version = (CHAR16 *) PcdGetPtr (PcdBiosVersionForBmc);
    163         if (StrLen (Version) > 0)
    164         {
    165             TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);
    166             HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);
    167         }
    168         else
    169         {
    170             Version = (CHAR16 *) PcdGetPtr (PcdBiosVersionString);
    171             if (StrLen (Version) > 0)
    172             {
    173                 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);
    174                 HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);
    175             }
    176         }
    177     }
    178 
    179     Char16String = GetBiosReleaseDate ();
    180     if (StrLen(Char16String) > 0)
    181     {
    182         TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);
    183         HiiSetString (mHiiHandle, TokenToUpdate, Char16String, NULL);
    184     }
    185 
    186     TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VENDOR);
    187     Vendor = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
    188     VendorStrLen = StrLen(Vendor);
    189 
    190 
    191     TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VERSION);
    192     Version = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
    193     VerStrLen = StrLen(Version);
    194 
    195 
    196     TokenToGet = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);
    197     ReleaseDate = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
    198     DateStrLen = StrLen(ReleaseDate);
    199 
    200     //
    201     // Now update the BiosPhysicalSize
    202     //
    203     BiosPhysicalSizeHexValue = FixedPcdGet32 (PcdFdSize);
    204 
    205     //
    206     // Two zeros following the last string.
    207     //
    208     SmbiosRecord = AllocateZeroPool(sizeof (SMBIOS_TABLE_TYPE0) + VendorStrLen + 1 + VerStrLen + 1 + DateStrLen + 1 + 1);
    209     if(NULL == SmbiosRecord)
    210     {
    211         Status = EFI_OUT_OF_RESOURCES;
    212         goto Exit;
    213     }
    214 
    215     (VOID)CopyMem(SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE0));
    216 
    217     SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE0);
    218     SmbiosRecord->BiosSegment = (UINT16)(FixedPcdGet32 (PcdFdBaseAddress) / 0x10000);
    219     SmbiosRecord->BiosSize = Base2ToByteWith64KUnit(BiosPhysicalSizeHexValue) - 1;
    220 
    221     OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
    222     UnicodeStrToAsciiStr(Vendor, OptionalStrStart);
    223     UnicodeStrToAsciiStr(Version, OptionalStrStart + VendorStrLen + 1);
    224     UnicodeStrToAsciiStr(ReleaseDate, OptionalStrStart + VendorStrLen + 1 + VerStrLen + 1);
    225     //
    226     // Now we have got the full smbios record, call smbios protocol to add this record.
    227     //
    228     Status = LogSmbiosData( (UINT8*)SmbiosRecord, &SmbiosHandle);
    229     if(EFI_ERROR(Status))
    230     {
    231         DEBUG((EFI_D_ERROR, "[%a]:[%dL] Smbios Type00 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));
    232     }
    233 
    234     FreePool(SmbiosRecord);
    235 
    236 Exit:
    237     if(Vendor != NULL)
    238     {
    239         FreePool(Vendor);
    240     }
    241 
    242     if(Version != NULL)
    243     {
    244         FreePool(Version);
    245     }
    246 
    247     if(ReleaseDate != NULL)
    248     {
    249         FreePool(ReleaseDate);
    250     }
    251 
    252     if(Char16String != NULL)
    253     {
    254         FreePool(Char16String);
    255     }
    256 
    257     return Status;
    258 }
    259