/**@file
Copyright (c) 2006 - 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:
SmbiosMiscEntryPoint.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"
#define MAX_HANDLE_COUNT 0x10
EFI_HANDLE mImageHandle;
EFI_HII_HANDLE mHiiHandle;
EFI_SMBIOS_PROTOCOL *mSmbios = NULL;
//
// Data Table Array
//
extern EFI_MISC_SMBIOS_DATA_TABLE mSmbiosMiscDataTable[];
//
// Data Table Array Entries
//
extern UINTN mSmbiosMiscDataTableEntries;
extern UINT8 SmbiosMiscDxeStrings[];
/**
Standard EFI driver point. This driver parses the mSmbiosMiscDataTable
structure and reports any generated data using SMBIOS protocol.
@param ImageHandle Handle for the image of this driver
@param SystemTable Pointer to the EFI System Table
@retval EFI_SUCCESS The data was successfully stored.
**/
EFI_STATUS
EFIAPI
SmbiosMiscEntryPoint(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
UINTN Index;
EFI_STATUS EfiStatus;
EFI_SMBIOS_PROTOCOL *Smbios;
mImageHandle = ImageHandle;
EfiStatus = gBS->LocateProtocol(&gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios);
if (EFI_ERROR(EfiStatus))
{
DEBUG((EFI_D_ERROR, "Could not locate SMBIOS protocol. %r\n", EfiStatus));
return EfiStatus;
}
mSmbios = Smbios;
mHiiHandle = HiiAddPackages (
&gEfiCallerIdGuid,
mImageHandle,
SmbiosMiscDxeStrings,
NULL
);
if(mHiiHandle == NULL)
{
return EFI_OUT_OF_RESOURCES;
}
for (Index = 0; Index < mSmbiosMiscDataTableEntries; ++Index)
{
//
// If the entry have a function pointer, just log the data.
//
if (mSmbiosMiscDataTable[Index].Function != NULL)
{
EfiStatus = (*mSmbiosMiscDataTable[Index].Function)(
mSmbiosMiscDataTable[Index].RecordData,
Smbios
);
if (EFI_ERROR(EfiStatus))
{
DEBUG((EFI_D_ERROR, "Misc smbios store error. Index=%d, ReturnStatus=%r\n", Index, EfiStatus));
return EfiStatus;
}
}
}
return EfiStatus;
}
/**
Logs SMBIOS record.
@param Buffer The data for the fixed portion of the SMBIOS record. The format of the record is
determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
a set of null terminated strings and a null.
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record.
@retval EFI_SUCCESS Record was added.
@retval EFI_OUT_OF_RESOURCES Record was not added due to lack of system resources.
**/
EFI_STATUS
LogSmbiosData (
IN UINT8 *Buffer,
IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle
)
{
EFI_STATUS Status;
*SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
Status = mSmbios->Add (
mSmbios,
NULL,
SmbiosHandle,
(EFI_SMBIOS_TABLE_HEADER *)Buffer
);
return Status;
}
VOID
GetLinkTypeHandle(
IN UINT8 SmbiosType,
OUT UINT16 **HandleArray,
OUT UINTN *HandleCount
)
{
EFI_STATUS Status;
EFI_SMBIOS_HANDLE SmbiosHandle;
EFI_SMBIOS_TABLE_HEADER *LinkTypeData = NULL;
if(mSmbios == NULL)
return ;
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
*HandleArray = AllocateZeroPool(sizeof(UINT16) * MAX_HANDLE_COUNT);
if (*HandleArray == NULL)
{
DEBUG ((EFI_D_INFO, "HandleArray allocate memory resource failed.\n"));
return;
}
*HandleCount = 0;
while(1)
{
Status = mSmbios->GetNext(
mSmbios,
&SmbiosHandle,
&SmbiosType,
&LinkTypeData,
NULL
);
if(!EFI_ERROR(Status))
{
(*HandleArray)[*HandleCount] = LinkTypeData->Handle;
(*HandleCount)++;
}
else
{
break;
}
}
}