1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#include <acpi/acpi.h>
46#include "accommon.h"
47#include "acparser.h"
48#include "amlcode.h"
49#include "acdispat.h"
50#include "acnamesp.h"
51
52#define _COMPONENT ACPI_DISPATCHER
53ACPI_MODULE_NAME("dsargs")
54
55
56static acpi_status
57acpi_ds_execute_arguments(struct acpi_namespace_node *node,
58 struct acpi_namespace_node *scope_node,
59 u32 aml_length, u8 *aml_start);
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76static acpi_status
77acpi_ds_execute_arguments(struct acpi_namespace_node *node,
78 struct acpi_namespace_node *scope_node,
79 u32 aml_length, u8 *aml_start)
80{
81 acpi_status status;
82 union acpi_parse_object *op;
83 struct acpi_walk_state *walk_state;
84
85 ACPI_FUNCTION_TRACE(ds_execute_arguments);
86
87
88
89 op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP);
90 if (!op) {
91 return_ACPI_STATUS(AE_NO_MEMORY);
92 }
93
94
95
96 op->common.node = scope_node;
97
98
99
100 walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL);
101 if (!walk_state) {
102 status = AE_NO_MEMORY;
103 goto cleanup;
104 }
105
106 status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start,
107 aml_length, NULL, ACPI_IMODE_LOAD_PASS1);
108 if (ACPI_FAILURE(status)) {
109 acpi_ds_delete_walk_state(walk_state);
110 goto cleanup;
111 }
112
113
114
115 walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP;
116 walk_state->deferred_node = node;
117
118
119
120 status = acpi_ps_parse_aml(walk_state);
121 if (ACPI_FAILURE(status)) {
122 goto cleanup;
123 }
124
125
126
127 op->common.node = node;
128 acpi_ps_delete_parse_tree(op);
129
130
131
132 op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP);
133 if (!op) {
134 return_ACPI_STATUS(AE_NO_MEMORY);
135 }
136
137 op->common.node = scope_node;
138
139
140
141 walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL);
142 if (!walk_state) {
143 status = AE_NO_MEMORY;
144 goto cleanup;
145 }
146
147
148
149 status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start,
150 aml_length, NULL, ACPI_IMODE_EXECUTE);
151 if (ACPI_FAILURE(status)) {
152 acpi_ds_delete_walk_state(walk_state);
153 goto cleanup;
154 }
155
156
157
158 walk_state->deferred_node = node;
159 status = acpi_ps_parse_aml(walk_state);
160
161 cleanup:
162 acpi_ps_delete_parse_tree(op);
163 return_ACPI_STATUS(status);
164}
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179acpi_status
180acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc)
181{
182 union acpi_operand_object *extra_desc;
183 struct acpi_namespace_node *node;
184 acpi_status status;
185
186 ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_field_arguments, obj_desc);
187
188 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
189 return_ACPI_STATUS(AE_OK);
190 }
191
192
193
194 extra_desc = acpi_ns_get_secondary_object(obj_desc);
195 node = obj_desc->buffer_field.node;
196
197 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_BUFFER_FIELD,
198 node, NULL));
199
200 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
201 acpi_ut_get_node_name(node)));
202
203
204
205 status = acpi_ds_execute_arguments(node, node->parent,
206 extra_desc->extra.aml_length,
207 extra_desc->extra.aml_start);
208 return_ACPI_STATUS(status);
209}
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224acpi_status
225acpi_ds_get_bank_field_arguments(union acpi_operand_object *obj_desc)
226{
227 union acpi_operand_object *extra_desc;
228 struct acpi_namespace_node *node;
229 acpi_status status;
230
231 ACPI_FUNCTION_TRACE_PTR(ds_get_bank_field_arguments, obj_desc);
232
233 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
234 return_ACPI_STATUS(AE_OK);
235 }
236
237
238
239 extra_desc = acpi_ns_get_secondary_object(obj_desc);
240 node = obj_desc->bank_field.node;
241
242 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
243 (ACPI_TYPE_LOCAL_BANK_FIELD, node, NULL));
244
245 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n",
246 acpi_ut_get_node_name(node)));
247
248
249
250 status = acpi_ds_execute_arguments(node, node->parent,
251 extra_desc->extra.aml_length,
252 extra_desc->extra.aml_start);
253 if (ACPI_FAILURE(status)) {
254 return_ACPI_STATUS(status);
255 }
256
257 status = acpi_ut_add_address_range(obj_desc->region.space_id,
258 obj_desc->region.address,
259 obj_desc->region.length, node);
260 return_ACPI_STATUS(status);
261}
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc)
277{
278 struct acpi_namespace_node *node;
279 acpi_status status;
280
281 ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_arguments, obj_desc);
282
283 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
284 return_ACPI_STATUS(AE_OK);
285 }
286
287
288
289 node = obj_desc->buffer.node;
290 if (!node) {
291 ACPI_ERROR((AE_INFO,
292 "No pointer back to namespace node in buffer object %p",
293 obj_desc));
294 return_ACPI_STATUS(AE_AML_INTERNAL);
295 }
296
297 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Buffer Arg Init\n"));
298
299
300
301 status = acpi_ds_execute_arguments(node, node,
302 obj_desc->buffer.aml_length,
303 obj_desc->buffer.aml_start);
304 return_ACPI_STATUS(status);
305}
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc)
321{
322 struct acpi_namespace_node *node;
323 acpi_status status;
324
325 ACPI_FUNCTION_TRACE_PTR(ds_get_package_arguments, obj_desc);
326
327 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
328 return_ACPI_STATUS(AE_OK);
329 }
330
331
332
333 node = obj_desc->package.node;
334 if (!node) {
335 ACPI_ERROR((AE_INFO,
336 "No pointer back to namespace node in package %p",
337 obj_desc));
338 return_ACPI_STATUS(AE_AML_INTERNAL);
339 }
340
341 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Package Arg Init\n"));
342
343
344
345 status = acpi_ds_execute_arguments(node, node,
346 obj_desc->package.aml_length,
347 obj_desc->package.aml_start);
348 return_ACPI_STATUS(status);
349}
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
365{
366 struct acpi_namespace_node *node;
367 acpi_status status;
368 union acpi_operand_object *extra_desc;
369
370 ACPI_FUNCTION_TRACE_PTR(ds_get_region_arguments, obj_desc);
371
372 if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
373 return_ACPI_STATUS(AE_OK);
374 }
375
376 extra_desc = acpi_ns_get_secondary_object(obj_desc);
377 if (!extra_desc) {
378 return_ACPI_STATUS(AE_NOT_EXIST);
379 }
380
381
382
383 node = obj_desc->region.node;
384
385 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
386 (ACPI_TYPE_REGION, node, NULL));
387
388 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n",
389 acpi_ut_get_node_name(node),
390 extra_desc->extra.aml_start));
391
392
393
394 status = acpi_ds_execute_arguments(node, extra_desc->extra.scope_node,
395 extra_desc->extra.aml_length,
396 extra_desc->extra.aml_start);
397 if (ACPI_FAILURE(status)) {
398 return_ACPI_STATUS(status);
399 }
400
401 status = acpi_ut_add_address_range(obj_desc->region.space_id,
402 obj_desc->region.address,
403 obj_desc->region.length, node);
404 return_ACPI_STATUS(status);
405}
406