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
;
72 if (FactoryInfo
->StdDtTableGeneratorList
[TableId
] != NULL
) {
73 *Generator
= FactoryInfo
->StdDtTableGeneratorList
[TableId
];
78 if (TableId
> FixedPcdGet16 (PcdMaxCustomDTGenerators
)) {
79 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomDTGenerators
));
80 return EFI_INVALID_PARAMETER
;
83 if (FactoryInfo
->CustomDtTableGeneratorList
[TableId
] != NULL
) {
84 *Generator
= FactoryInfo
->CustomDtTableGeneratorList
[TableId
];
93 /** Register DT table factory generator.
95 The DT table factory maintains a list of the Standard and OEM DT
98 @param [in] Generator Pointer to the DT table generator.
100 @retval EFI_SUCCESS The Generator was registered
102 @retval EFI_INVALID_PARAMETER The Generator ID is invalid or
103 the Generator pointer is NULL.
104 @retval EFI_ALREADY_STARTED The Generator for the Table ID is
109 RegisterDtTableGenerator (
110 IN CONST DT_TABLE_GENERATOR
*CONST Generator
115 if (Generator
== NULL
) {
116 DEBUG ((DEBUG_ERROR
, "ERROR: DT register - Invalid Generator\n"));
117 return EFI_INVALID_PARAMETER
;
120 if (!IS_GENERATOR_TYPE_DT (Generator
->GeneratorID
)) {
123 "ERROR: DT register - Generator" \
126 return EFI_INVALID_PARAMETER
;
129 DEBUG ((DEBUG_INFO
, "Registering %s\n", Generator
->Description
));
131 TableId
= GET_TABLE_ID (Generator
->GeneratorID
);
132 if (IS_GENERATOR_NAMESPACE_STD (Generator
->GeneratorID
)) {
133 if (TableId
>= EStdDtTableIdMax
) {
134 ASSERT (TableId
< EStdDtTableIdMax
);
135 return EFI_INVALID_PARAMETER
;
138 if (TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] == NULL
) {
139 TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] = Generator
;
141 return EFI_ALREADY_STARTED
;
144 if (TableId
> FixedPcdGet16 (PcdMaxCustomDTGenerators
)) {
145 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomDTGenerators
));
146 return EFI_INVALID_PARAMETER
;
149 if (TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] == NULL
) {
150 TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] = Generator
;
152 return EFI_ALREADY_STARTED
;
159 /** Deregister DT generator.
161 This function is called by the DT table generator to deregister itself
162 from the DT table factory.
164 @param [in] Generator Pointer to the DT table generator.
166 @retval EFI_SUCCESS Success.
167 @retval EFI_INVALID_PARAMETER The generator is invalid.
168 @retval EFI_NOT_FOUND The requested generator is not found
169 in the list of registered generators.
173 DeregisterDtTableGenerator (
174 IN CONST DT_TABLE_GENERATOR
*CONST Generator
179 if (Generator
== NULL
) {
180 DEBUG ((DEBUG_ERROR
, "ERROR: DT deregister - Invalid Generator\n"));
181 return EFI_INVALID_PARAMETER
;
184 if (!IS_GENERATOR_TYPE_DT (Generator
->GeneratorID
)) {
187 "ERROR: DT deregister - Generator" \
190 return EFI_INVALID_PARAMETER
;
193 TableId
= GET_TABLE_ID (Generator
->GeneratorID
);
194 if (IS_GENERATOR_NAMESPACE_STD (Generator
->GeneratorID
)) {
195 if (TableId
>= EStdDtTableIdMax
) {
196 ASSERT (TableId
< EStdDtTableIdMax
);
197 return EFI_INVALID_PARAMETER
;
200 if (TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] != NULL
) {
201 if (Generator
!= TableFactoryInfo
.StdDtTableGeneratorList
[TableId
]) {
202 return EFI_INVALID_PARAMETER
;
205 TableFactoryInfo
.StdDtTableGeneratorList
[TableId
] = NULL
;
207 return EFI_NOT_FOUND
;
210 if (TableId
> FixedPcdGet16 (PcdMaxCustomDTGenerators
)) {
211 ASSERT (TableId
<= FixedPcdGet16 (PcdMaxCustomDTGenerators
));
212 return EFI_INVALID_PARAMETER
;
215 if (TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] != NULL
) {
217 TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
])
219 return EFI_INVALID_PARAMETER
;
222 TableFactoryInfo
.CustomDtTableGeneratorList
[TableId
] = NULL
;
224 return EFI_NOT_FOUND
;
228 DEBUG ((DEBUG_INFO
, "Deregistering %s\n", Generator
->Description
));