Skip to content

Commit eea04dc

Browse files
committed
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]>
1 parent ab47e00 commit eea04dc

File tree

9 files changed

+839
-9
lines changed

9 files changed

+839
-9
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: 106 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,70 @@
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_RESOURCESNULL 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 if the CmObjectToken is found.
70+
@retval NULL if not found.
71+
**/
72+
SMBIOS_HANDLE_MAP *
73+
EFIAPI
74+
FindSmbiosHandle (
75+
CM_OBJECT_TOKEN CmObjectToken
76+
)
77+
{
78+
UINTN Index;
79+
SMBIOS_HANDLE_MAP *SmbiosHandleMap;
80+
81+
SmbiosHandleMap = NULL;
82+
for (Index = 0; Index < FixedPcdGet16(PcdMaxSmbiosHandleMapEntries); Index++) {
83+
if (TableFactoryInfo.SmbiosHandleMap[Index].SmbiosCmToken == CmObjectToken) {
84+
SmbiosHandleMap = &TableFactoryInfo.SmbiosHandleMap[Index];
85+
break;
86+
}
87+
}
88+
89+
return SmbiosHandleMap;
90+
}
91+
2792
/** Return a pointer to the SMBIOS table generator.
2893
2994
@param [in] This Pointer to the Dynamic Table Factory Protocol.
@@ -229,3 +294,44 @@ DeregisterSmbiosTableGenerator (
229294
DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description));
230295
return EFI_SUCCESS;
231296
}
297+
298+
/** Find and return SMBIOS handle based on associated CM object token.
299+
300+
@param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS Table.
301+
@param [in] CmObjectToken Token of the CM_OBJECT used to build the SMBIOS Table.
302+
303+
@return SMBIOS handle of the table associated with SmbiosGeneratorId and
304+
CmObjectToken if found. Otherwise, returns 0xFFFF.
305+
**/
306+
SMBIOS_HANDLE
307+
EFIAPI
308+
FindSmbiosHandleEx (
309+
IN SMBIOS_TABLE_GENERATOR_ID GeneratorId,
310+
IN CM_OBJECT_TOKEN CmObjToken
311+
)
312+
{
313+
SMBIOS_HANDLE_MAP *HandleMap;
314+
315+
if (CmObjToken == CM_NULL_TOKEN) {
316+
return SMBIOS_HANDLE_INVALID;
317+
}
318+
319+
HandleMap = FindSmbiosHandle (CmObjToken);
320+
if (HandleMap == NULL) {
321+
return SMBIOS_HANDLE_INVALID;
322+
}
323+
324+
if (HandleMap->SmbiosGeneratorId != GeneratorId) {
325+
DEBUG ((
326+
DEBUG_ERROR,
327+
"%a: Expect ID %d but get %d\n",
328+
__func__,
329+
GeneratorId,
330+
HandleMap->SmbiosGeneratorId
331+
));
332+
ASSERT (FALSE);
333+
return SMBIOS_HANDLE_INVALID;
334+
}
335+
336+
return HandleMap->SmbiosTblHandle;
337+
}

0 commit comments

Comments
 (0)