4 Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include <IndustryStandard/SmBios.h>
13 #include <Library/BaseLib.h>
14 #include <Library/BaseMemoryLib.h>
15 #include <Library/DebugLib.h>
17 // Module specific include files.
18 #include <SmbiosTableGenerator.h>
19 #include <ConfigurationManagerObject.h>
20 #include <Protocol/ConfigurationManagerProtocol.h>
21 #include <Protocol/DynamicTableFactoryProtocol.h>
23 #include "DynamicTableFactory.h"
25 extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo
;
27 /** Return a pointer to the SMBIOS table generator.
29 @param [in] This Pointer to the Dynamic Table Factory Protocol.
30 @param [in] GeneratorId The SMBIOS table generator ID for the
32 @param [out] Generator Pointer to the requested SMBIOS table
35 @retval EFI_SUCCESS Success.
36 @retval EFI_INVALID_PARAMETER A parameter is invalid.
37 @retval EFI_NOT_FOUND The requested generator is not found
38 in the list of registered generators.
42 GetSmbiosTableGenerator (
43 IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL
*CONST This
,
44 IN CONST SMBIOS_TABLE_GENERATOR_ID GeneratorId
,
45 OUT CONST SMBIOS_TABLE_GENERATOR
**CONST Generator
49 EDKII_DYNAMIC_TABLE_FACTORY_INFO
*FactoryInfo
;
51 ASSERT (This
!= NULL
);
53 FactoryInfo
= This
->TableFactoryInfo
;
55 if (Generator
== NULL
) {
56 DEBUG ((DEBUG_ERROR
, "ERROR: Invalid Generator pointer\n"));
57 return EFI_INVALID_PARAMETER
;
60 if (!IS_GENERATOR_TYPE_SMBIOS (GeneratorId
)) {
61 DEBUG ((DEBUG_ERROR
, "ERROR: Generator Type is not SMBIOS\n"));
62 return EFI_INVALID_PARAMETER
;
66 TableId
= GET_TABLE_ID (GeneratorId
);
67 if (IS_GENERATOR_NAMESPACE_STD (GeneratorId
)) {
68 if (TableId
>= EStdSmbiosTableIdMax
) {
69 ASSERT (TableId
< EStdSmbiosTableIdMax
);
70 return EFI_INVALID_PARAMETER
;
73 if (FactoryInfo
->StdSmbiosTableGeneratorList
[TableId
] != NULL
) {
74 *Generator
= FactoryInfo
->StdSmbiosTableGeneratorList
[TableId
];
79 if (TableId
> FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators
)) {
80 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators
));
81 return EFI_INVALID_PARAMETER
;
84 if (FactoryInfo
->CustomSmbiosTableGeneratorList
[TableId
] != NULL
) {
85 *Generator
= FactoryInfo
->CustomSmbiosTableGeneratorList
[TableId
];
94 /** Register SMBIOS table factory generator.
96 The SMBIOS table factory maintains a list of the Standard and OEM SMBIOS
99 @param [in] Generator Pointer to the SMBIOS table generator.
101 @retval EFI_SUCCESS The Generator was registered
103 @retval EFI_INVALID_PARAMETER The Generator ID is invalid or
104 the Generator pointer is NULL.
105 @retval EFI_ALREADY_STARTED The Generator for the Table ID is
110 RegisterSmbiosTableGenerator (
111 IN CONST SMBIOS_TABLE_GENERATOR
*CONST Generator
116 if (Generator
== NULL
) {
117 DEBUG ((DEBUG_ERROR
, "ERROR: SMBIOS register - Invalid Generator\n"));
118 return EFI_INVALID_PARAMETER
;
121 if (!IS_GENERATOR_TYPE_SMBIOS (Generator
->GeneratorID
)) {
124 "ERROR: SMBIOS register - Generator" \
125 " Type is not SMBIOS\n"
127 return EFI_INVALID_PARAMETER
;
130 DEBUG ((DEBUG_INFO
, "Registering %s\n", Generator
->Description
));
132 TableId
= GET_TABLE_ID (Generator
->GeneratorID
);
133 if (IS_GENERATOR_NAMESPACE_STD (Generator
->GeneratorID
)) {
134 if (TableId
>= EStdSmbiosTableIdMax
) {
135 ASSERT (TableId
< EStdSmbiosTableIdMax
);
136 return EFI_INVALID_PARAMETER
;
139 if (TableFactoryInfo
.StdSmbiosTableGeneratorList
[TableId
] == NULL
) {
140 TableFactoryInfo
.StdSmbiosTableGeneratorList
[TableId
] = Generator
;
142 return EFI_ALREADY_STARTED
;
145 if (TableId
> FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators
)) {
146 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators
));
147 return EFI_INVALID_PARAMETER
;
150 if (TableFactoryInfo
.CustomSmbiosTableGeneratorList
[TableId
] == NULL
) {
151 TableFactoryInfo
.CustomSmbiosTableGeneratorList
[TableId
] = Generator
;
153 return EFI_ALREADY_STARTED
;
160 /** Deregister SMBIOS generator.
162 This function is called by the SMBIOS table generator to deregister itself
163 from the SMBIOS table factory.
165 @param [in] Generator Pointer to the SMBIOS table generator.
167 @retval EFI_SUCCESS Success.
168 @retval EFI_INVALID_PARAMETER The generator is invalid.
169 @retval EFI_NOT_FOUND The requested generator is not found
170 in the list of registered generators.
174 DeregisterSmbiosTableGenerator (
175 IN CONST SMBIOS_TABLE_GENERATOR
*CONST Generator
180 if (Generator
== NULL
) {
181 DEBUG ((DEBUG_ERROR
, "ERROR: SMBIOS deregister - Invalid Generator\n"));
182 return EFI_INVALID_PARAMETER
;
185 if (!IS_GENERATOR_TYPE_SMBIOS (Generator
->GeneratorID
)) {
188 "ERROR: SMBIOS deregister - Generator" \
189 " Type is not SMBIOS\n"
191 return EFI_INVALID_PARAMETER
;
194 TableId
= GET_TABLE_ID (Generator
->GeneratorID
);
195 if (IS_GENERATOR_NAMESPACE_STD (Generator
->GeneratorID
)) {
196 if (TableId
>= EStdSmbiosTableIdMax
) {
197 ASSERT (TableId
< EStdSmbiosTableIdMax
);
198 return EFI_INVALID_PARAMETER
;
201 if (TableFactoryInfo
.StdSmbiosTableGeneratorList
[TableId
] != NULL
) {
202 if (Generator
!= TableFactoryInfo
.StdSmbiosTableGeneratorList
[TableId
]) {
203 return EFI_INVALID_PARAMETER
;
206 TableFactoryInfo
.StdSmbiosTableGeneratorList
[TableId
] = NULL
;
208 return EFI_NOT_FOUND
;
211 if (TableId
> FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators
)) {
212 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators
));
213 return EFI_INVALID_PARAMETER
;
216 if (TableFactoryInfo
.CustomSmbiosTableGeneratorList
[TableId
] != NULL
) {
218 TableFactoryInfo
.CustomSmbiosTableGeneratorList
[TableId
])
220 return EFI_INVALID_PARAMETER
;
223 TableFactoryInfo
.CustomSmbiosTableGeneratorList
[TableId
] = NULL
;
225 return EFI_NOT_FOUND
;
229 DEBUG ((DEBUG_INFO
, "Deregistering %s\n", Generator
->Description
));