]> git.proxmox.com Git - mirror_edk2.git/blame - DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/SmbiosTableFactory.c
DynamicTablesPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / DynamicTablesPkg / Drivers / DynamicTableFactoryDxe / SmbiosTableFactory / SmbiosTableFactory.c
CommitLineData
3a609e0a
SM
1/** @file\r
2 SMBIOS Table Factory\r
3\r
4 Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r
5\r
9cd9bdc6 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
3a609e0a
SM
7\r
8 @par Glossary:\r
9 - Std - Standard\r
10**/\r
11\r
12#include <IndustryStandard/SmBios.h>\r
13#include <Library/BaseLib.h>\r
14#include <Library/BaseMemoryLib.h>\r
15#include <Library/DebugLib.h>\r
16\r
17// Module specific include files.\r
18#include <SmbiosTableGenerator.h>\r
19#include <ConfigurationManagerObject.h>\r
20#include <Protocol/ConfigurationManagerProtocol.h>\r
21#include <Protocol/DynamicTableFactoryProtocol.h>\r
22\r
23#include "DynamicTableFactory.h"\r
24\r
25extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;\r
26\r
27/** Return a pointer to the SMBIOS table generator.\r
28\r
29 @param [in] This Pointer to the Dynamic Table Factory Protocol.\r
30 @param [in] GeneratorId The SMBIOS table generator ID for the\r
31 requested generator.\r
32 @param [out] Generator Pointer to the requested SMBIOS table\r
33 generator.\r
34\r
35 @retval EFI_SUCCESS Success.\r
36 @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
37 @retval EFI_NOT_FOUND The requested generator is not found\r
38 in the list of registered generators.\r
39**/\r
40EFI_STATUS\r
41EFIAPI\r
42GetSmbiosTableGenerator (\r
43 IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This,\r
44 IN CONST SMBIOS_TABLE_GENERATOR_ID GeneratorId,\r
45 OUT CONST SMBIOS_TABLE_GENERATOR ** CONST Generator\r
46 )\r
47{\r
48 UINT16 TableId;\r
49 EDKII_DYNAMIC_TABLE_FACTORY_INFO * FactoryInfo;\r
50\r
51 ASSERT (This != NULL);\r
52\r
53 FactoryInfo = This->TableFactoryInfo;\r
54\r
55 if (Generator == NULL) {\r
56 DEBUG ((DEBUG_ERROR, "ERROR: Invalid Generator pointer\n"));\r
57 return EFI_INVALID_PARAMETER;\r
58 }\r
59\r
60 if (!IS_GENERATOR_TYPE_SMBIOS (GeneratorId)) {\r
61 DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not SMBIOS\n"));\r
62 return EFI_INVALID_PARAMETER;\r
63 }\r
64\r
65 *Generator = NULL;\r
66 TableId = GET_TABLE_ID (GeneratorId);\r
67 if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) {\r
68 if (TableId >= EStdSmbiosTableIdMax) {\r
69 ASSERT (TableId < EStdSmbiosTableIdMax);\r
70 return EFI_INVALID_PARAMETER;\r
71 }\r
72 if (FactoryInfo->StdSmbiosTableGeneratorList[TableId] != NULL) {\r
73 *Generator = FactoryInfo->StdSmbiosTableGeneratorList[TableId];\r
74 } else {\r
75 return EFI_NOT_FOUND;\r
76 }\r
77 } else {\r
78 if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {\r
79 ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));\r
80 return EFI_INVALID_PARAMETER;\r
81 }\r
82 if (FactoryInfo->CustomSmbiosTableGeneratorList[TableId] != NULL) {\r
83 *Generator = FactoryInfo->CustomSmbiosTableGeneratorList[TableId];\r
84 } else {\r
85 return EFI_NOT_FOUND;\r
86 }\r
87 }\r
88 return EFI_SUCCESS;\r
89}\r
90\r
91/** Register SMBIOS table factory generator.\r
92\r
93 The SMBIOS table factory maintains a list of the Standard and OEM SMBIOS\r
94 table generators.\r
95\r
96 @param [in] Generator Pointer to the SMBIOS table generator.\r
97\r
98 @retval EFI_SUCCESS The Generator was registered\r
99 successfully.\r
100 @retval EFI_INVALID_PARAMETER The Generator ID is invalid or\r
101 the Generator pointer is NULL.\r
102 @retval EFI_ALREADY_STARTED The Generator for the Table ID is\r
103 already registered.\r
104**/\r
105EFI_STATUS\r
106EFIAPI\r
107RegisterSmbiosTableGenerator (\r
108 IN CONST SMBIOS_TABLE_GENERATOR * CONST Generator\r
109 )\r
110{\r
111 UINT16 TableId;\r
112\r
113 if (Generator == NULL) {\r
114 DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS register - Invalid Generator\n"));\r
115 return EFI_INVALID_PARAMETER;\r
116 }\r
117\r
118 if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) {\r
119 DEBUG ((\r
120 DEBUG_ERROR,\r
121 "ERROR: SMBIOS register - Generator" \\r
122 " Type is not SMBIOS\n"\r
123 ));\r
124 return EFI_INVALID_PARAMETER;\r
125 }\r
126\r
127 DEBUG ((DEBUG_INFO, "Registering %s\n", Generator->Description));\r
128\r
129 TableId = GET_TABLE_ID (Generator->GeneratorID);\r
130 if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
131 if (TableId >= EStdSmbiosTableIdMax) {\r
132 ASSERT (TableId < EStdSmbiosTableIdMax);\r
133 return EFI_INVALID_PARAMETER;\r
134 }\r
135 if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] == NULL) {\r
136 TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = Generator;\r
137 } else {\r
138 return EFI_ALREADY_STARTED;\r
139 }\r
140 } else {\r
141 if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {\r
142 ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));\r
143 return EFI_INVALID_PARAMETER;\r
144 }\r
145 if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] == NULL) {\r
146 TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = Generator;\r
147 } else {\r
148 return EFI_ALREADY_STARTED;\r
149 }\r
150 }\r
151 return EFI_SUCCESS;\r
152}\r
153\r
154/** Deregister SMBIOS generator.\r
155\r
156 This function is called by the SMBIOS table generator to deregister itself\r
157 from the SMBIOS table factory.\r
158\r
159 @param [in] Generator Pointer to the SMBIOS table generator.\r
160\r
161 @retval EFI_SUCCESS Success.\r
162 @retval EFI_INVALID_PARAMETER The generator is invalid.\r
163 @retval EFI_NOT_FOUND The requested generator is not found\r
164 in the list of registered generators.\r
165**/\r
166EFI_STATUS\r
167EFIAPI\r
168DeregisterSmbiosTableGenerator (\r
169 IN CONST SMBIOS_TABLE_GENERATOR * CONST Generator\r
170 )\r
171{\r
172 UINT16 TableId;\r
173\r
174 if (Generator == NULL) {\r
175 DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS deregister - Invalid Generator\n"));\r
176 return EFI_INVALID_PARAMETER;\r
177 }\r
178\r
179 if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) {\r
180 DEBUG ((\r
181 DEBUG_ERROR,\r
182 "ERROR: SMBIOS deregister - Generator" \\r
183 " Type is not SMBIOS\n"\r
184 ));\r
185 return EFI_INVALID_PARAMETER;\r
186 }\r
187\r
188 TableId = GET_TABLE_ID (Generator->GeneratorID);\r
189 if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
190 if (TableId >= EStdSmbiosTableIdMax) {\r
191 ASSERT (TableId < EStdSmbiosTableIdMax);\r
192 return EFI_INVALID_PARAMETER;\r
193 }\r
194 if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] != NULL) {\r
195 if (Generator != TableFactoryInfo.StdSmbiosTableGeneratorList[TableId]) {\r
196 return EFI_INVALID_PARAMETER;\r
197 }\r
198 TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = NULL;\r
199 } else {\r
200 return EFI_NOT_FOUND;\r
201 }\r
202 } else {\r
203 if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {\r
204 ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));\r
205 return EFI_INVALID_PARAMETER;\r
206 }\r
207 if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] != NULL) {\r
208 if (Generator !=\r
209 TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId]) {\r
210 return EFI_INVALID_PARAMETER;\r
211 }\r
212 TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = NULL;\r
213 } else {\r
214 return EFI_NOT_FOUND;\r
215 }\r
216 }\r
217\r
218 DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description));\r
219 return EFI_SUCCESS;\r
220}\r