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