/** @file
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
Copyright (c) 2015, Hisilicon Limited. All rights reserved.
Copyright (c) 2015, Linaro Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
Module Name:
MiscBaseBoardManufacturerFunction.c
Abstract:
This driver parses the mSmbiosMiscDataTable structure and reports
any generated data using SMBIOS protocol.
Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
**/
#include "SmbiosMisc.h"
/**
This function makes basic board manufacturer to the contents of the
Misc Base Board Manufacturer (Type 2).
@param RecordData Pointer to copy of RecordData from the Data Table.
@retval EFI_SUCCESS All parameters were valid.
@retval EFI_UNSUPPORTED Unexpected RecordType value.
@retval EFI_INVALID_PARAMETER Invalid parameter was found.
**/
MISC_SMBIOS_TABLE_FUNCTION(MiscBaseBoardManufacturer)
{
CHAR8 *OptionalStrStart;
UINTN ManuStrLen;
UINTN ProductNameStrLen;
UINTN VerStrLen;
UINTN SerialNumStrLen;
UINTN AssetTagStrLen;
UINTN ChassisLocaStrLen;
UINTN HandleCount = 0;
UINT16 *HandleArray = NULL;
CHAR16 *BaseBoardManufacturer;
CHAR16 *BaseBoardProductName;
CHAR16 *Version;
EFI_STRING SerialNumber;
EFI_STRING AssetTag;
EFI_STRING ChassisLocation;
EFI_STRING_ID TokenToGet;
EFI_SMBIOS_HANDLE SmbiosHandle;
SMBIOS_TABLE_TYPE2 *SmbiosRecord;
SMBIOS_TABLE_TYPE2 *InputData = NULL;
EFI_STATUS Status;
EFI_STRING_ID TokenToUpdate;
//CHAR16 *ProductName;
//CHAR16 *pVersion;
//uniBIOS_y00216284_018_end 2015-1-13 09:08:22
//
// First check for invalid parameters.
//
if (RecordData == NULL)
{
return EFI_INVALID_PARAMETER;
}
InputData = (SMBIOS_TABLE_TYPE2*)RecordData;
BaseBoardProductName = (CHAR16 *) PcdGetPtr (PcdBaseBoardProductName);
if (StrLen(BaseBoardProductName) > 0)
{
TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);
HiiSetString (mHiiHandle, TokenToUpdate, BaseBoardProductName, NULL);
}
Version = (CHAR16 *) PcdGetPtr (PcdBaseBoardVersion);
if (StrLen(Version) > 0)
{
TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);
}
UpdateSmbiosInfo(mHiiHandle, STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG), AssertTagType02);
UpdateSmbiosInfo(mHiiHandle, STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER), SrNumType02);
UpdateSmbiosInfo(mHiiHandle, STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER), BoardManufacturerType02);
TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);
BaseBoardManufacturer = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
ManuStrLen = StrLen(BaseBoardManufacturer);
TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);
BaseBoardProductName = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
ProductNameStrLen = StrLen(BaseBoardProductName);
TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
Version = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
VerStrLen = StrLen(Version);
TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER);
SerialNumber = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
SerialNumStrLen = StrLen(SerialNumber);
TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG);
AssetTag = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
AssetTagStrLen = StrLen(AssetTag);
TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION);
ChassisLocation = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);
ChassisLocaStrLen = StrLen(ChassisLocation);
//
// Two zeros following the last string.
//
SmbiosRecord = AllocateZeroPool(sizeof (SMBIOS_TABLE_TYPE2) + ManuStrLen + 1
+ ProductNameStrLen + 1
+ VerStrLen + 1
+ SerialNumStrLen + 1
+ AssetTagStrLen + 1
+ ChassisLocaStrLen + 1 + 1);
if (NULL == SmbiosRecord)
{
Status = EFI_OUT_OF_RESOURCES;
goto Exit;
}
(VOID)CopyMem(SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE2));
SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE2);
//
// Update Contained objects Handle
//
SmbiosRecord->NumberOfContainedObjectHandles = 0;
GetLinkTypeHandle(EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, &HandleArray, &HandleCount);
if(HandleCount)
{
SmbiosRecord->ChassisHandle = HandleArray[0];
}
FreePool(HandleArray);
OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
Status = UnicodeStrToAsciiStrS (BaseBoardManufacturer, OptionalStrStart, ManuStrLen + 1);
ASSERT_EFI_ERROR (Status);
Status = UnicodeStrToAsciiStrS (BaseBoardProductName, OptionalStrStart + ManuStrLen + 1, ProductNameStrLen + 1);
ASSERT_EFI_ERROR (Status);
Status = UnicodeStrToAsciiStrS (Version, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1, VerStrLen + 1);
ASSERT_EFI_ERROR (Status);
Status = UnicodeStrToAsciiStrS (SerialNumber, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1 + VerStrLen + 1, SerialNumStrLen + 1);
ASSERT_EFI_ERROR (Status);
Status = UnicodeStrToAsciiStrS (AssetTag, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1, AssetTagStrLen + 1);
ASSERT_EFI_ERROR (Status);
Status = UnicodeStrToAsciiStrS (ChassisLocation, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1, ChassisLocaStrLen + 1);
ASSERT_EFI_ERROR (Status);
Status = LogSmbiosData( (UINT8*)SmbiosRecord, &SmbiosHandle);
if(EFI_ERROR(Status))
{
DEBUG((EFI_D_ERROR, "[%a]:[%dL] Smbios Type02 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));
}
FreePool(SmbiosRecord);
Exit:
if(BaseBoardManufacturer != NULL)
{
FreePool(BaseBoardManufacturer);
}
if(BaseBoardProductName != NULL)
{
FreePool(BaseBoardProductName);
}
if(Version != NULL)
{
FreePool(Version);
}
if(SerialNumber != NULL)
{
FreePool(SerialNumber);
}
if(AssetTag != NULL)
{
FreePool(AssetTag);
}
if(ChassisLocation != NULL)
{
FreePool(ChassisLocation);
}
return Status;
}