Skip to content

Commit 22c9da5

Browse files
gmahadevansamimujawar
authored andcommitted
DynamicTablesPkg: Add SMBIOS table generation
Add the SMBIOS Table generator code to the DynamicTablesPkg. This change includes adding new logic to the DynamicTableManager to process and add SMBIOS tables and augmenting the existing SMBIOS Factory generator to include installing multiple SMBIOS tables . Signed-off-by: Girish Mahadevan <[email protected]> Change-Id: I4c1b04518889806e78a84e7b2c5c3b1c700f2bd2
1 parent f6c8499 commit 22c9da5

File tree

11 files changed

+1026
-20
lines changed

11 files changed

+1026
-20
lines changed

DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ typedef struct DynamicTableFactoryInfo {
4949
CustomDtTableGeneratorList[FixedPcdGet16 (
5050
PcdMaxCustomDTGenerators
5151
)];
52+
53+
/// An array for holding a map of SMBIOS handles and the CM Object
54+
/// token used to build the SMBIOS record.
55+
SMBIOS_HANDLE_MAP
56+
SmbiosHandleMap[FixedPcdGet16 (
57+
PcdMaxSmbiosHandleMapEntries
58+
)];
5259
} EDKII_DYNAMIC_TABLE_FACTORY_INFO;
5360

5461
/** Return a pointer to the ACPI table generator.

DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL DynamicTableFactoryProtocol = {
4444
GetDtTableGenerator,
4545
RegisterDtTableGenerator,
4646
DeregisterDtTableGenerator,
47+
AddSmbiosHandle,
48+
FindSmbiosHandle,
49+
FindSmbiosHandleEx,
4750
&TableFactoryInfo
4851
};
4952

@@ -65,6 +68,12 @@ DynamicTableFactoryDxeInitialize (
6568
)
6669
{
6770
EFI_STATUS Status;
71+
UINTN Idx;
72+
73+
for (Idx = 0; Idx < FixedPcdGet16 (PcdMaxSmbiosHandleMapEntries); Idx++) {
74+
TableFactoryInfo.SmbiosHandleMap[Idx].SmbiosTblHandle = SMBIOS_HANDLE_PI_RESERVED;
75+
TableFactoryInfo.SmbiosHandleMap[Idx].SmbiosCmToken = 0;
76+
}
6877

6978
Status = gBS->InstallProtocolInterface (
7079
&ImageHandle,

DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxCustomACPIGenerators
4545
gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxCustomSMBIOSGenerators
4646
gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxCustomDTGenerators
47+
gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxSmbiosHandleMapEntries
4748

4849
[Protocols]
4950
gEdkiiDynamicTableFactoryProtocolGuid # PRODUCES

DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/SmbiosTableFactory.c

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <IndustryStandard/SmBios.h>
1313
#include <Library/BaseLib.h>
1414
#include <Library/BaseMemoryLib.h>
15+
#include <Library/MemoryAllocationLib.h>
1516
#include <Library/DebugLib.h>
1617

1718
// Module specific include files.
@@ -24,6 +25,112 @@
2425

2526
extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;
2627

28+
/** Add a new entry to the SMBIOS table Map.
29+
30+
@param [in] Smbios SMBIOS Protocol pointer.
31+
@param [in] SmbiosHandle SMBIOS Handle to be added.
32+
@param [in] CmObjectToken CmObjectToken of the CM_OBJECT used to build the SMBIOS Table
33+
@param [in] GeneratorId Smbios Table Generator Id.
34+
35+
@retval EFI_SUCCESS Successfully added/generated the handle.
36+
@retval EFI_OUT_OF_RESOURCES Failure to add/generate the handle.
37+
**/
38+
EFI_STATUS
39+
EFIAPI
40+
AddSmbiosHandle (
41+
IN EFI_SMBIOS_PROTOCOL *Smbios,
42+
IN SMBIOS_HANDLE *SmbiosHandle,
43+
IN CM_OBJECT_TOKEN CmObjectToken,
44+
IN SMBIOS_TABLE_GENERATOR_ID GeneratorId
45+
)
46+
{
47+
EFI_STATUS Status;
48+
UINTN Index;
49+
50+
Status = EFI_OUT_OF_RESOURCES;
51+
52+
for (Index = 0; Index < FixedPcdGet16 (PcdMaxSmbiosHandleMapEntries); Index++) {
53+
if (TableFactoryInfo.SmbiosHandleMap[Index].SmbiosTblHandle == SMBIOS_HANDLE_PI_RESERVED) {
54+
TableFactoryInfo.SmbiosHandleMap[Index].SmbiosTblHandle = *SmbiosHandle;
55+
TableFactoryInfo.SmbiosHandleMap[Index].SmbiosCmToken = CmObjectToken;
56+
TableFactoryInfo.SmbiosHandleMap[Index].SmbiosGeneratorId = GeneratorId;
57+
Status = EFI_SUCCESS;
58+
break;
59+
}
60+
}
61+
62+
return Status;
63+
}
64+
65+
/** Return a pointer to the SMBIOS table Map.
66+
67+
@param [in] GeneratorId The CmObjectToken to look up an SMBIOS Handle.
68+
69+
@retval SMBIOS_HANDLE_MAP Pointer to the SMBIOS Handle Map if the
70+
CmObjectToken is found.
71+
@retval NULL if CmObjectToken is not found.
72+
**/
73+
SMBIOS_HANDLE_MAP *
74+
EFIAPI
75+
FindSmbiosHandle (
76+
CM_OBJECT_TOKEN CmObjectToken
77+
)
78+
{
79+
UINTN Index;
80+
SMBIOS_HANDLE_MAP *SmbiosHandleMap;
81+
82+
SmbiosHandleMap = NULL;
83+
for (Index = 0; Index < FixedPcdGet16 (PcdMaxSmbiosHandleMapEntries); Index++) {
84+
if (TableFactoryInfo.SmbiosHandleMap[Index].SmbiosCmToken == CmObjectToken) {
85+
SmbiosHandleMap = &TableFactoryInfo.SmbiosHandleMap[Index];
86+
break;
87+
}
88+
}
89+
90+
return SmbiosHandleMap;
91+
}
92+
93+
/** Find and return SMBIOS handle based on associated CM object token.
94+
95+
@param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS Table.
96+
@param [in] CmObjectToken Token of the CM_OBJECT used to build the SMBIOS Table.
97+
98+
@return SMBIOS handle of the table associated with SmbiosGeneratorId and
99+
CmObjectToken if found. Otherwise, returns SMBIOS_HANDLE_INVALID.
100+
**/
101+
SMBIOS_HANDLE
102+
EFIAPI
103+
FindSmbiosHandleEx (
104+
IN SMBIOS_TABLE_GENERATOR_ID GeneratorId,
105+
IN CM_OBJECT_TOKEN CmObjToken
106+
)
107+
{
108+
SMBIOS_HANDLE_MAP *HandleMap;
109+
110+
if (CmObjToken == CM_NULL_TOKEN) {
111+
return SMBIOS_HANDLE_INVALID;
112+
}
113+
114+
HandleMap = FindSmbiosHandle (CmObjToken);
115+
if (HandleMap == NULL) {
116+
return SMBIOS_HANDLE_INVALID;
117+
}
118+
119+
if (HandleMap->SmbiosGeneratorId != GeneratorId) {
120+
DEBUG ((
121+
DEBUG_ERROR,
122+
"%a: Expect ID %d but get %d\n",
123+
__func__,
124+
GeneratorId,
125+
HandleMap->SmbiosGeneratorId
126+
));
127+
ASSERT (FALSE);
128+
return SMBIOS_HANDLE_INVALID;
129+
}
130+
131+
return HandleMap->SmbiosTblHandle;
132+
}
133+
27134
/** Return a pointer to the SMBIOS table generator.
28135
29136
@param [in] This Pointer to the Dynamic Table Factory Protocol.

DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "DynamicTableManagerDxe.h"
2525

2626
STATIC VOID *mAcpiTableProtocolRegistration;
27+
STATIC VOID *mSmbiosProtocolRegistration;
2728

2829
/** Entrypoint of Dynamic Table Manager Dxe.
2930
@@ -54,6 +55,7 @@ DynamicTableManagerDxeInitialize (
5455
)
5556
{
5657
EFI_EVENT AcpiEvent;
58+
EFI_EVENT SmbiosEvent;
5759

5860
AcpiEvent = EfiCreateProtocolNotifyEvent (
5961
&gEfiAcpiTableProtocolGuid,
@@ -70,5 +72,21 @@ DynamicTableManagerDxeInitialize (
7072
return EFI_OUT_OF_RESOURCES;
7173
}
7274

75+
SmbiosEvent = EfiCreateProtocolNotifyEvent (
76+
&gEfiSmbiosProtocolGuid,
77+
TPL_CALLBACK,
78+
SmbiosProtocolReady,
79+
NULL,
80+
&mSmbiosProtocolRegistration
81+
);
82+
if (SmbiosEvent == NULL) {
83+
DEBUG ((
84+
DEBUG_ERROR,
85+
"Failed to register SMBIOS protocol notification event.\n"
86+
));
87+
gBS->CloseEvent (AcpiEvent);
88+
return EFI_OUT_OF_RESOURCES;
89+
}
90+
7391
return EFI_SUCCESS;
7492
}

DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,21 @@ AcpiTableProtocolReady (
7777
IN VOID *Context
7878
);
7979

80+
/** SMBIOS table Protocol ready event handler.
81+
82+
This event notification indicates that the SMBIOS protocol is ready.
83+
Therefore, dispatch the building of the SMBIOS tables.
84+
85+
@param [in] Event The Event that is signalled.
86+
@param [in] Context The Context information.
87+
88+
@retval None
89+
**/
90+
VOID
91+
EFIAPI
92+
SmbiosProtocolReady (
93+
IN EFI_EVENT Event,
94+
IN VOID *Context
95+
);
96+
8097
#endif // DYNAMIC_TABLE_MANAGER_DXE_H_

DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
## @file
2-
# Module that drives the table generation and installation process.
2+
# Module that drives the table generation and installation process.
33
#
44
# Copyright (c) 2017 - 2022, Arm Limited. All rights reserved.
55
# Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved.
@@ -27,6 +27,7 @@
2727
SmbiosTableDispatcher.c
2828
SmbiosTableDispatcher.h
2929
AcpiTableBuilder.c
30+
SmbiosTableBuilder.c
3031

3132
[Sources.ARM, Sources.AARCH64]
3233
Arm/ArmDynamicTableManager.c
@@ -52,7 +53,7 @@
5253
[Protocols]
5354
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
5455
gEfiAcpiSdtProtocolGuid # PROTOCOL ALWAYS_CONSUMED
55-
56+
gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED
5657
gEdkiiConfigurationManagerProtocolGuid # PROTOCOL ALWAYS_CONSUMED
5758
gEdkiiDynamicTableFactoryProtocolGuid # PROTOCOL ALWAYS_CONSUMED
5859

0 commit comments

Comments
 (0)