ArmPkg: Add Universal/Smbios/SmbiosMiscDxe

SmbiosMiscDxe provides SMBIOS tables 0, 1, 2, 3, 13, and 32.

Signed-off-by: Rebecca Cran <rebecca@nuviainc.com>
Reviewed-by: Leif Lindholm <leif@nuviainc.com>
Reviewed-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>
This commit is contained in:
Rebecca Cran 2021-02-07 17:52:54 -07:00 committed by mergify[bot]
parent 660d4faa29
commit ecc267fec5
6 changed files with 531 additions and 0 deletions

View File

@ -149,6 +149,7 @@
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
[Components.AARCH64]
ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf

View File

@ -0,0 +1,134 @@
/** @file
Header file for the SmbiosMisc Driver.
Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef SMBIOS_MISC_H_
#define SMBIOS_MISC_H_
#include <Protocol/Smbios.h>
#include <IndustryStandard/SmBios.h>
//
// Data table entry update function.
//
typedef EFI_STATUS (EFIAPI SMBIOS_MISC_DATA_FUNCTION) (
IN VOID *RecordData,
IN EFI_SMBIOS_PROTOCOL *Smbios
);
//
// Data table entry definition.
//
typedef struct {
//
// intermediate input data for SMBIOS record
//
VOID *RecordData;
SMBIOS_MISC_DATA_FUNCTION *Function;
} SMBIOS_MISC_DATA_TABLE;
//
// SMBIOS table extern definitions
//
#define SMBIOS_MISC_TABLE_EXTERNS(NAME1, NAME2, NAME3) \
extern NAME1 NAME2 ## Data; \
extern SMBIOS_MISC_DATA_FUNCTION NAME3 ## Function;
//
// SMBIOS data table entries
//
// This is used to define a pair of table structure pointer and functions
// in order to iterate through the list of tables, populate them and add
// them into the system.
#define SMBIOS_MISC_TABLE_ENTRY_DATA_AND_FUNCTION(NAME1, NAME2) \
{ \
& NAME1 ## Data, \
NAME2 ## Function \
}
//
// Global definition macros.
//
#define SMBIOS_MISC_TABLE_DATA(NAME1, NAME2) \
NAME1 NAME2 ## Data
#define SMBIOS_MISC_TABLE_FUNCTION(NAME2) \
EFI_STATUS EFIAPI NAME2 ## Function( \
IN VOID *RecordData, \
IN EFI_SMBIOS_PROTOCOL *Smbios \
)
//
// Data Table Array Entries
//
extern EFI_HII_HANDLE mSmbiosMiscHiiHandle;
typedef struct _SMBIOS_TYPE13_BIOS_LANGUAGE_INFORMATION_STRING{
UINT8 *LanguageSignature;
EFI_STRING_ID InstallableLanguageLongString;
EFI_STRING_ID InstallableLanguageAbbreviateString;
} SMBIOS_TYPE13_BIOS_LANGUAGE_INFORMATION_STRING;
/**
Adds an SMBIOS record.
@param Buffer The data for 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
if not NULL.
@retval EFI_SUCCESS Record was added.
@retval EFI_OUT_OF_RESOURCES Record was not added due to lack of system resources.
@retval EFI_ALREADY_STARTED The SmbiosHandle passed in was already in use.
**/
EFI_STATUS
SmbiosMiscAddRecord (
IN UINT8 *Buffer,
IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle OPTIONAL
);
/**
Get Link Type Handle.
@param [in] SmbiosType Get this Type from SMBIOS table
@param [out] HandleArray Pointer to handle array which will be freed by caller
@param [out] HandleCount Pointer to handle count
**/
VOID
SmbiosMiscGetLinkTypeHandle(
IN UINT8 SmbiosType,
OUT UINT16 **HandleArray,
OUT UINTN *HandleCount
);
//
// Data Table Array
//
extern SMBIOS_MISC_DATA_TABLE mSmbiosMiscDataTable[];
//
// Data Table Array Entries
//
extern UINTN mSmbiosMiscDataTableEntries;
extern UINT8 mSmbiosMiscDxeStrings[];
#endif // SMBIOS_MISC_H_

View File

@ -0,0 +1,62 @@
/** @file
This file provides SMBIOS Misc Type.
Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent\
**/
#include "SmbiosMisc.h"
SMBIOS_MISC_TABLE_EXTERNS (SMBIOS_TABLE_TYPE0,
MiscBiosVendor,
MiscBiosVendor)
SMBIOS_MISC_TABLE_EXTERNS (SMBIOS_TABLE_TYPE1,
MiscSystemManufacturer,
MiscSystemManufacturer)
SMBIOS_MISC_TABLE_EXTERNS (SMBIOS_TABLE_TYPE3,
MiscChassisManufacturer,
MiscChassisManufacturer)
SMBIOS_MISC_TABLE_EXTERNS (SMBIOS_TABLE_TYPE2,
MiscBaseBoardManufacturer,
MiscBaseBoardManufacturer)
SMBIOS_MISC_TABLE_EXTERNS (SMBIOS_TABLE_TYPE13,
MiscNumberOfInstallableLanguages,
MiscNumberOfInstallableLanguages)
SMBIOS_MISC_TABLE_EXTERNS (SMBIOS_TABLE_TYPE32,
MiscBootInformation,
MiscBootInformation)
SMBIOS_MISC_DATA_TABLE mSmbiosMiscDataTable[] = {
// Type0
SMBIOS_MISC_TABLE_ENTRY_DATA_AND_FUNCTION (MiscBiosVendor,
MiscBiosVendor),
// Type1
SMBIOS_MISC_TABLE_ENTRY_DATA_AND_FUNCTION (MiscSystemManufacturer,
MiscSystemManufacturer),
// Type3
SMBIOS_MISC_TABLE_ENTRY_DATA_AND_FUNCTION (MiscChassisManufacturer,
MiscChassisManufacturer),
// Type2
SMBIOS_MISC_TABLE_ENTRY_DATA_AND_FUNCTION (MiscBaseBoardManufacturer,
MiscBaseBoardManufacturer),
// Type13
SMBIOS_MISC_TABLE_ENTRY_DATA_AND_FUNCTION (MiscNumberOfInstallableLanguages,
MiscNumberOfInstallableLanguages),
// Type32
SMBIOS_MISC_TABLE_ENTRY_DATA_AND_FUNCTION (MiscBootInformation,
MiscBootInformation),
};
//
// Number of Data Table entries.
//
UINTN mSmbiosMiscDataTableEntries =
(sizeof (mSmbiosMiscDataTable)) / sizeof (SMBIOS_MISC_DATA_TABLE);

View File

@ -0,0 +1,89 @@
#/** @file
# Component description file for SmbiosMisc instance.
#
# Parses the MiscSubclassDataTable and reports any generated data to the DataHub.
# All .uni file who tagged with "ToolCode="DUMMY"" in following file list is included by
# MiscSubclassDriver.uni file, the StrGather tool will expand MiscSubclassDriver.uni file
# and parse all .uni file.
#
# Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
# Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
#
# Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
#**/
[Defines]
INF_VERSION = 1.29
BASE_NAME = SmbiosMiscDxe
FILE_GUID = 7e5e26d4-0be9-401f-b5e1-1c2bda7ca777
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = SmbiosMiscEntryPoint
[Sources]
SmbiosMisc.h
SmbiosMiscDataTable.c
SmbiosMiscEntryPoint.c
SmbiosMiscDxeStrings.uni
Type00/MiscBiosVendorData.c
Type00/MiscBiosVendorFunction.c
Type01/MiscSystemManufacturerData.c
Type01/MiscSystemManufacturerFunction.c
Type02/MiscBaseBoardManufacturerData.c
Type02/MiscBaseBoardManufacturerFunction.c
Type03/MiscChassisManufacturerData.c
Type03/MiscChassisManufacturerFunction.c
Type13/MiscNumberOfInstallableLanguagesData.c
Type13/MiscNumberOfInstallableLanguagesFunction.c
Type32/MiscBootInformationData.c
Type32/MiscBootInformationFunction.c
[Packages]
ArmPkg/ArmPkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
[LibraryClasses]
BaseLib
BaseMemoryLib
DebugLib
DevicePathLib
PcdLib
HiiLib
HobLib
MemoryAllocationLib
OemMiscLib
UefiBootServicesTableLib
UefiDriverEntryPoint
UefiLib
UefiRuntimeServicesTableLib
[Protocols]
gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED
[Pcd]
gArmTokenSpaceGuid.PcdFdSize
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
gArmTokenSpaceGuid.PcdSystemBiosRelease
gArmTokenSpaceGuid.PcdEmbeddedControllerFirmwareRelease
gArmTokenSpaceGuid.PcdSystemProductName
gArmTokenSpaceGuid.PcdSystemVersion
gArmTokenSpaceGuid.PcdBaseBoardManufacturer
gArmTokenSpaceGuid.PcdBaseBoardProductName
gArmTokenSpaceGuid.PcdBaseBoardVersion
gArmTokenSpaceGuid.PcdFdBaseAddress
[Guids]
gEfiGenericVariableGuid
[Depex]
gEfiSmbiosProtocolGuid

View File

@ -0,0 +1,22 @@
/** @file
* Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
*
* Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
* Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
* Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
* Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
* SPDX-License-Identifier: BSD-2-Clause-Patent
*
*
**/
/=#
#langdef en-US "English"
#include "Type00/MiscBiosVendor.uni"
#include "Type01/MiscSystemManufacturer.uni"
#include "Type02/MiscBaseBoardManufacturer.uni"
#include "Type03/MiscChassisManufacturer.uni"
#include "Type13/MiscNumberOfInstallableLanguages.uni"

View File

@ -0,0 +1,223 @@
/** @file
This driver parses the mSmbiosMiscDataTable structure and reports
any generated data using SMBIOS protocol.
Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/HiiLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include "SmbiosMisc.h"
STATIC EFI_HANDLE mSmbiosMiscImageHandle;
STATIC EFI_SMBIOS_PROTOCOL *mSmbiosMiscSmbios = NULL;
EFI_HII_HANDLE mSmbiosMiscHiiHandle;
/**
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;
mSmbiosMiscImageHandle = ImageHandle;
EfiStatus = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL,
(VOID**)&mSmbiosMiscSmbios);
if (EFI_ERROR (EfiStatus)) {
DEBUG ((DEBUG_ERROR, "Could not locate SMBIOS protocol. %r\n", EfiStatus));
return EfiStatus;
}
mSmbiosMiscHiiHandle = HiiAddPackages (&gEfiCallerIdGuid,
mSmbiosMiscImageHandle,
SmbiosMiscDxeStrings,
NULL
);
if (mSmbiosMiscHiiHandle == 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,
mSmbiosMiscSmbios
);
if (EFI_ERROR(EfiStatus)) {
DEBUG ((DEBUG_ERROR, "Misc smbios store error. Index=%d,"
"ReturnStatus=%r\n", Index, EfiStatus));
return EfiStatus;
}
}
}
return EfiStatus;
}
/**
Adds an SMBIOS record.
@param Buffer The data for 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
if not NULL.
@retval EFI_SUCCESS Record was added.
@retval EFI_OUT_OF_RESOURCES Record was not added due to lack of system resources.
@retval EFI_ALREADY_STARTED The SmbiosHandle passed in was already in use.
**/
EFI_STATUS
SmbiosMiscAddRecord (
IN UINT8 *Buffer,
IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle OPTIONAL
)
{
EFI_STATUS Status;
EFI_SMBIOS_HANDLE Handle;
Handle = SMBIOS_HANDLE_PI_RESERVED;
if (SmbiosHandle != NULL) {
Handle = *SmbiosHandle;
}
Status = mSmbiosMiscSmbios->Add (
mSmbiosMiscSmbios,
NULL,
&Handle,
(EFI_SMBIOS_TABLE_HEADER *)Buffer
);
if (SmbiosHandle != NULL) {
*SmbiosHandle = Handle;
}
return Status;
}
/** Fetches the number of handles of the specified SMBIOS type.
*
* @param SmbiosType The type of SMBIOS record to look for.
*
* @return The number of handles
*
**/
STATIC
UINTN
GetHandleCount (
IN UINT8 SmbiosType
)
{
UINTN HandleCount;
EFI_STATUS Status;
EFI_SMBIOS_HANDLE SmbiosHandle;
EFI_SMBIOS_TABLE_HEADER *Record;
HandleCount = 0;
// Iterate through entries to get the number
do {
Status = mSmbiosMiscSmbios->GetNext (mSmbiosMiscSmbios,
&SmbiosHandle,
&SmbiosType,
&Record,
NULL
);
if (Status == EFI_SUCCESS) {
HandleCount++;
}
} while (!EFI_ERROR (Status));
return HandleCount;
}
/**
Fetches a list of the specified SMBIOS table types.
@param[in] SmbiosType The type of table to fetch
@param[out] **HandleArray The array of handles
@param[out] *HandleCount Number of handles in the array
**/
VOID
SmbiosMiscGetLinkTypeHandle(
IN UINT8 SmbiosType,
OUT SMBIOS_HANDLE **HandleArray,
OUT UINTN *HandleCount
)
{
UINTN Index;
EFI_STATUS Status;
EFI_SMBIOS_HANDLE SmbiosHandle;
EFI_SMBIOS_TABLE_HEADER *Record;
if (mSmbiosMiscSmbios == NULL) {
return;
}
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
*HandleCount = GetHandleCount (SmbiosType);
*HandleArray = AllocateZeroPool (sizeof (SMBIOS_HANDLE) * (*HandleCount));
if (*HandleArray == NULL) {
DEBUG ((DEBUG_ERROR, "HandleArray allocate memory resource failed.\n"));
*HandleCount = 0;
return;
}
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
for (Index = 0; Index < (*HandleCount); Index++) {
Status = mSmbiosMiscSmbios->GetNext (mSmbiosMiscSmbios,
&SmbiosHandle,
&SmbiosType,
&Record,
NULL
);
if (!EFI_ERROR (Status)) {
(*HandleArray)[Index] = Record->Handle;
} else {
break;
}
}
}