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