]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlChild.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / AcpiTableDxe / AmlChild.c
CommitLineData
3dc8585e
JY
1/** @file\r
2 ACPI Sdt Protocol Driver\r
3\r
d1102dba 4 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR>\r
9d510e61 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
3dc8585e
JY
6\r
7**/\r
8\r
9#include "AcpiTable.h"\r
10\r
11/**\r
12 Return the child objects buffer from AML Handle's buffer.\r
d1102dba 13\r
3dc8585e
JY
14 @param[in] AmlParentHandle Parent handle.\r
15 @param[in] CurrentBuffer The current child buffer.\r
16 @param[out] Buffer On return, points to the next returned child buffer or NULL if there are no\r
17 child buffer.\r
18\r
19 @retval EFI_SUCCESS Success\r
d1102dba 20 @retval EFI_INVALID_PARAMETER AmlParentHandle does not refer to a valid ACPI object.\r
3dc8585e
JY
21**/\r
22EFI_STATUS\r
23AmlGetChildFromObjectBuffer (\r
24 IN EFI_AML_HANDLE *AmlParentHandle,\r
25 IN UINT8 *CurrentBuffer,\r
26 OUT VOID **Buffer\r
27 )\r
28{\r
29 AML_BYTE_ENCODING *AmlByteEncoding;\r
30 UINTN DataSize;\r
31\r
32 //\r
33 // Root is considered as SCOPE, which has TermList.\r
34 // We need return only Object in TermList.\r
35 //\r
36 while ((UINTN)CurrentBuffer < (UINTN)(AmlParentHandle->Buffer + AmlParentHandle->Size)) {\r
37 AmlByteEncoding = AmlSearchByOpByte (CurrentBuffer);\r
38 if (AmlByteEncoding == NULL) {\r
39 return EFI_INVALID_PARAMETER;\r
40 }\r
41 //\r
42 // NOTE: We need return everything, because user might need parse the returned object.\r
43 //\r
44 if ((AmlByteEncoding->Attribute & AML_IS_NAME_CHAR) == 0) {\r
45 *Buffer = CurrentBuffer;\r
46 return EFI_SUCCESS;\r
47 }\r
48\r
49 DataSize = AmlGetObjectSize (\r
50 AmlByteEncoding,\r
51 CurrentBuffer,\r
52 (UINTN)AmlParentHandle->Buffer + AmlParentHandle->Size - (UINTN)CurrentBuffer\r
53 );\r
54 if (DataSize == 0) {\r
55 return EFI_INVALID_PARAMETER;\r
56 }\r
57 CurrentBuffer += DataSize;\r
58 }\r
59\r
60 //\r
61 // No more\r
62 //\r
63 *Buffer = NULL;\r
64 return EFI_SUCCESS;\r
65}\r
66\r
67/**\r
68 Return the child ACPI objects from Root Handle.\r
d1102dba 69\r
3dc8585e
JY
70 @param[in] AmlParentHandle Parent handle. It is Root Handle.\r
71 @param[in] AmlHandle The previously returned handle or NULL to start with the first handle.\r
72 @param[out] Buffer On return, points to the next returned ACPI handle or NULL if there are no\r
73 child objects.\r
74\r
75 @retval EFI_SUCCESS Success\r
d1102dba 76 @retval EFI_INVALID_PARAMETER ParentHandle is NULL or does not refer to a valid ACPI object.\r
3dc8585e
JY
77**/\r
78EFI_STATUS\r
79AmlGetChildFromRoot (\r
80 IN EFI_AML_HANDLE *AmlParentHandle,\r
81 IN EFI_AML_HANDLE *AmlHandle,\r
82 OUT VOID **Buffer\r
83 )\r
84{\r
85 UINT8 *CurrentBuffer;\r
86\r
87 if (AmlHandle == NULL) {\r
88 //\r
89 // First One\r
90 //\r
91 CurrentBuffer = (VOID *)AmlParentHandle->Buffer;\r
92 } else {\r
93 CurrentBuffer = (VOID *)(AmlHandle->Buffer + AmlHandle->Size);\r
94 }\r
95\r
96 return AmlGetChildFromObjectBuffer (AmlParentHandle, CurrentBuffer, Buffer);\r
97}\r
98\r
99/**\r
100 Return the child objects buffer from AML Handle's option list.\r
d1102dba 101\r
3dc8585e
JY
102 @param[in] AmlParentHandle Parent handle.\r
103 @param[in] AmlHandle The current child handle.\r
104 @param[out] Buffer On return, points to the next returned child buffer or NULL if there are no\r
105 child buffer.\r
106\r
107 @retval EFI_SUCCESS Success\r
d1102dba 108 @retval EFI_INVALID_PARAMETER AmlParentHandle does not refer to a valid ACPI object.\r
3dc8585e
JY
109**/\r
110EFI_STATUS\r
111AmlGetChildFromOptionList (\r
112 IN EFI_AML_HANDLE *AmlParentHandle,\r
113 IN EFI_AML_HANDLE *AmlHandle,\r
114 OUT VOID **Buffer\r
115 )\r
116{\r
117 EFI_ACPI_DATA_TYPE DataType;\r
118 VOID *Data;\r
119 UINTN DataSize;\r
120 AML_OP_PARSE_INDEX Index;\r
121 EFI_STATUS Status;\r
122 AML_OP_PARSE_INDEX MaxTerm;\r
123\r
124 Index = AML_OP_PARSE_INDEX_GET_TERM1;\r
125 MaxTerm = AmlParentHandle->AmlByteEncoding->MaxIndex;\r
126 while (Index <= MaxTerm) {\r
127 Status = AmlParseOptionHandleCommon (\r
128 AmlParentHandle,\r
129 (AML_OP_PARSE_INDEX)Index,\r
130 &DataType,\r
131 (VOID **)&Data,\r
132 &DataSize\r
133 );\r
134 if (EFI_ERROR (Status)) {\r
135 return EFI_INVALID_PARAMETER;\r
136 }\r
137 if (DataType == EFI_ACPI_DATA_TYPE_NONE) {\r
138 //\r
139 // Not found\r
140 //\r
141 break;\r
142 }\r
143\r
144 //\r
145 // Find it, and Check Data\r
146 //\r
147 if ((DataType == EFI_ACPI_DATA_TYPE_CHILD) &&\r
148 ((UINTN)AmlHandle->Buffer < (UINTN)Data)) {\r
149 //\r
150 // Buffer < Data means current node is next one\r
151 //\r
152 *Buffer = Data;\r
153 return EFI_SUCCESS;\r
154 }\r
155 //\r
156 // Not Child\r
157 //\r
158 Index ++;\r
159 }\r
160\r
161 *Buffer = NULL;\r
162 return EFI_SUCCESS;\r
163}\r
164\r
165/**\r
166 Return the child objects buffer from AML Handle's object child list.\r
d1102dba 167\r
3dc8585e
JY
168 @param[in] AmlParentHandle Parent handle.\r
169 @param[in] AmlHandle The current child handle.\r
170 @param[out] Buffer On return, points to the next returned child buffer or NULL if there are no\r
171 child buffer.\r
172\r
173 @retval EFI_SUCCESS Success\r
d1102dba 174 @retval EFI_INVALID_PARAMETER AmlParentHandle does not refer to a valid ACPI object.\r
3dc8585e
JY
175**/\r
176EFI_STATUS\r
177AmlGetChildFromObjectChildList (\r
178 IN EFI_AML_HANDLE *AmlParentHandle,\r
179 IN EFI_AML_HANDLE *AmlHandle,\r
180 OUT VOID **Buffer\r
181 )\r
182{\r
183 EFI_STATUS Status;\r
184 UINT8 *CurrentBuffer;\r
185\r
4e1005ec
ED
186 CurrentBuffer = NULL;\r
187\r
3dc8585e
JY
188 if ((AmlParentHandle->AmlByteEncoding->Attribute & AML_HAS_CHILD_OBJ) == 0) {\r
189 //\r
190 // No ObjectList\r
191 //\r
192 *Buffer = NULL;\r
193 return EFI_SUCCESS;\r
194 }\r
195\r
196 //\r
197 // Do we need add node within METHOD?\r
198 // Yes, just add Object is OK. But we need filter NameString for METHOD invoke.\r
199 //\r
200\r
201 //\r
202 // Now, we get the last node.\r
203 //\r
204 Status = AmlGetOffsetAfterLastOption (AmlParentHandle, &CurrentBuffer);\r
205 if (EFI_ERROR (Status)) {\r
206 return EFI_INVALID_PARAMETER;\r
207 }\r
208\r
209 //\r
210 // Go through all the reset buffer.\r
211 //\r
212 if ((UINTN)AmlHandle->Buffer < (UINTN)CurrentBuffer) {\r
213 //\r
214 // Buffer < Data means next node is first object\r
215 //\r
216 } else if ((UINTN)AmlHandle->Buffer + AmlHandle->Size < (UINTN)AmlParentHandle->Buffer + AmlParentHandle->Size) {\r
217 //\r
218 // There is still more node\r
219 //\r
220 CurrentBuffer = AmlHandle->Buffer + AmlHandle->Size;\r
221 } else {\r
222 //\r
223 // No more data\r
224 //\r
225 *Buffer = NULL;\r
226 return EFI_SUCCESS;\r
227 }\r
228\r
229 return AmlGetChildFromObjectBuffer (AmlParentHandle, CurrentBuffer, Buffer);\r
230}\r
231\r
232/**\r
233 Return the child ACPI objects from Non-Root Handle.\r
d1102dba 234\r
3dc8585e
JY
235 @param[in] AmlParentHandle Parent handle. It is Non-Root Handle.\r
236 @param[in] AmlHandle The previously returned handle or NULL to start with the first handle.\r
237 @param[out] Buffer On return, points to the next returned ACPI handle or NULL if there are no\r
238 child objects.\r
239\r
240 @retval EFI_SUCCESS Success\r
d1102dba 241 @retval EFI_INVALID_PARAMETER ParentHandle is NULL or does not refer to a valid ACPI object.\r
3dc8585e
JY
242**/\r
243EFI_STATUS\r
244AmlGetChildFromNonRoot (\r
245 IN EFI_AML_HANDLE *AmlParentHandle,\r
246 IN EFI_AML_HANDLE *AmlHandle,\r
247 OUT VOID **Buffer\r
248 )\r
249{\r
250 EFI_STATUS Status;\r
251\r
252 if (AmlHandle == NULL) {\r
253 //\r
254 // NULL means first one\r
255 //\r
256 AmlHandle = AmlParentHandle;\r
257 }\r
258\r
259 //\r
260 // 1. Get Option\r
261 //\r
262 Status = AmlGetChildFromOptionList (AmlParentHandle, AmlHandle, Buffer);\r
263 if (EFI_ERROR (Status)) {\r
264 return EFI_INVALID_PARAMETER;\r
265 }\r
266 if (*Buffer != NULL) {\r
267 return EFI_SUCCESS;\r
268 }\r
269\r
270 //\r
271 // 2. search ObjectList\r
272 //\r
273 return AmlGetChildFromObjectChildList (AmlParentHandle, AmlHandle, Buffer);\r
274}\r