2 Device Tree Table Factory
4 Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include <Library/BaseLib.h>
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/DebugLib.h>
16 // Module specific include files.
17 #include <DeviceTreeTableGenerator.h>
18 #include <ConfigurationManagerObject.h>
19 #include <Protocol/ConfigurationManagerProtocol.h>
20 #include <Protocol/DynamicTableFactoryProtocol.h>
22 #include "DynamicTableFactory.h"
24 extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo
;
26 /** Return a pointer to the DT table generator.
28 @param [in] This Pointer to the Dynamic Table Factory Protocol.
29 @param [in] GeneratorId The DT table generator ID for the
31 @param [out] Generator Pointer to the requested DT table
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.
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
48 EDKII_DYNAMIC_TABLE_FACTORY_INFO
* FactoryInfo
;
50 ASSERT (This
!= NULL
);
52 FactoryInfo
= This
->TableFactoryInfo
;
54 if (Generator
== NULL
) {
55 DEBUG ((DEBUG_ERROR
, "ERROR: Invalid Generator pointer\n"));
56 return EFI_INVALID_PARAMETER
;
59 if (!IS_GENERATOR_TYPE_DT (GeneratorId
)) {
60 DEBUG ((DEBUG_ERROR
, "ERROR: Generator Type is not DT\n"));
61 return EFI_INVALID_PARAMETER
;
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
;
71 if (FactoryInfo
->StdDtTableGeneratorList
[TableId
] != NULL
) {
72 *Generator
= FactoryInfo
->StdDtTableGeneratorList
[TableId
];
77 if (TableId
> FixedPcdGet16 (PcdMaxCustomDTGenerators
)) {
78 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomDTGenerators
));
79 return EFI_INVALID_PARAMETER
;
81 if (FactoryInfo
->CustomDtTableGeneratorList
[TableId
] != NULL
) {
82 *Generator
= FactoryInfo
->CustomDtTableGeneratorList
[TableId
];
90 /** Register DT table factory generator.
92 The DT table factory maintains a list of the Standard and OEM DT
95 @param [in] Generator Pointer to the DT table generator.
97 @retval EFI_SUCCESS The Generator was registered
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
106 RegisterDtTableGenerator (
107 IN CONST DT_TABLE_GENERATOR
* CONST Generator
112 if (Generator
== NULL
) {
113 DEBUG ((DEBUG_ERROR
, "ERROR: DT register - Invalid Generator\n"));
114 return EFI_INVALID_PARAMETER
;
117 if (!IS_GENERATOR_TYPE_DT (Generator
->GeneratorID
)) {
120 "ERROR: DT register - Generator" \
123 return EFI_INVALID_PARAMETER
;
126 DEBUG ((DEBUG_INFO
, "Registering %s\n", Generator
->Description
));
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
;
134 if (TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] == NULL
) {
135 TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] = Generator
;
137 return EFI_ALREADY_STARTED
;
140 if (TableId
> FixedPcdGet16 (PcdMaxCustomDTGenerators
)) {
141 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomDTGenerators
));
142 return EFI_INVALID_PARAMETER
;
144 if (TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] == NULL
) {
145 TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] = Generator
;
147 return EFI_ALREADY_STARTED
;
153 /** Deregister DT generator.
155 This function is called by the DT table generator to deregister itself
156 from the DT table factory.
158 @param [in] Generator Pointer to the DT table generator.
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.
167 DeregisterDtTableGenerator (
168 IN CONST DT_TABLE_GENERATOR
* CONST Generator
173 if (Generator
== NULL
) {
174 DEBUG ((DEBUG_ERROR
, "ERROR: DT deregister - Invalid Generator\n"));
175 return EFI_INVALID_PARAMETER
;
178 if (!IS_GENERATOR_TYPE_DT (Generator
->GeneratorID
)) {
181 "ERROR: DT deregister - Generator" \
184 return EFI_INVALID_PARAMETER
;
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
;
193 if (TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] != NULL
) {
194 if (Generator
!= TableFactoryInfo
.StdDtTableGeneratorList
[TableId
]) {
195 return EFI_INVALID_PARAMETER
;
197 TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] = NULL
;
199 return EFI_NOT_FOUND
;
202 if (TableId
> FixedPcdGet16 (PcdMaxCustomDTGenerators
)) {
203 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomDTGenerators
));
204 return EFI_INVALID_PARAMETER
;
206 if (TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] != NULL
) {
208 TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
]) {
209 return EFI_INVALID_PARAMETER
;
211 TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] = NULL
;
213 return EFI_NOT_FOUND
;
217 DEBUG ((DEBUG_INFO
, "Deregistering %s\n", Generator
->Description
));