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