]>
Commit | Line | Data |
---|---|---|
95857638 | 1 | // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 |
1da177e4 LT |
2 | /****************************************************************************** |
3 | * | |
4 | * Module Name: exresolv - AML Interpreter object resolution | |
5 | * | |
800ba7c5 | 6 | * Copyright (C) 2000 - 2020, Intel Corp. |
1da177e4 | 7 | * |
95857638 | 8 | *****************************************************************************/ |
1da177e4 | 9 | |
1da177e4 | 10 | #include <acpi/acpi.h> |
e2f7a777 LB |
11 | #include "accommon.h" |
12 | #include "amlcode.h" | |
13 | #include "acdispat.h" | |
14 | #include "acinterp.h" | |
15 | #include "acnamesp.h" | |
1da177e4 | 16 | |
1da177e4 | 17 | #define _COMPONENT ACPI_EXECUTER |
4be44fcd | 18 | ACPI_MODULE_NAME("exresolv") |
1da177e4 | 19 | |
44f6c012 | 20 | /* Local prototypes */ |
44f6c012 | 21 | static acpi_status |
4be44fcd LB |
22 | acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, |
23 | struct acpi_walk_state *walk_state); | |
1da177e4 LT |
24 | |
25 | /******************************************************************************* | |
26 | * | |
27 | * FUNCTION: acpi_ex_resolve_to_value | |
28 | * | |
29 | * PARAMETERS: **stack_ptr - Points to entry on obj_stack, which can | |
30 | * be either an (union acpi_operand_object *) | |
31 | * or an acpi_handle. | |
32 | * walk_state - Current method state | |
33 | * | |
34 | * RETURN: Status | |
35 | * | |
36 | * DESCRIPTION: Convert Reference objects to values | |
37 | * | |
38 | ******************************************************************************/ | |
39 | ||
40 | acpi_status | |
4be44fcd LB |
41 | acpi_ex_resolve_to_value(union acpi_operand_object **stack_ptr, |
42 | struct acpi_walk_state *walk_state) | |
1da177e4 | 43 | { |
4be44fcd | 44 | acpi_status status; |
1da177e4 | 45 | |
b229cf92 | 46 | ACPI_FUNCTION_TRACE_PTR(ex_resolve_to_value, stack_ptr); |
1da177e4 LT |
47 | |
48 | if (!stack_ptr || !*stack_ptr) { | |
b8e4d893 | 49 | ACPI_ERROR((AE_INFO, "Internal - null pointer")); |
4be44fcd | 50 | return_ACPI_STATUS(AE_AML_NO_OPERAND); |
1da177e4 LT |
51 | } |
52 | ||
53 | /* | |
54 | * The entity pointed to by the stack_ptr can be either | |
55 | * 1) A valid union acpi_operand_object, or | |
56 | * 2) A struct acpi_namespace_node (named_obj) | |
57 | */ | |
4be44fcd LB |
58 | if (ACPI_GET_DESCRIPTOR_TYPE(*stack_ptr) == ACPI_DESC_TYPE_OPERAND) { |
59 | status = acpi_ex_resolve_object_to_value(stack_ptr, walk_state); | |
60 | if (ACPI_FAILURE(status)) { | |
61 | return_ACPI_STATUS(status); | |
1da177e4 | 62 | } |
44f6c012 RM |
63 | |
64 | if (!*stack_ptr) { | |
b8e4d893 | 65 | ACPI_ERROR((AE_INFO, "Internal - null pointer")); |
4be44fcd | 66 | return_ACPI_STATUS(AE_AML_NO_OPERAND); |
44f6c012 | 67 | } |
1da177e4 LT |
68 | } |
69 | ||
70 | /* | |
71 | * Object on the stack may have changed if acpi_ex_resolve_object_to_value() | |
72 | * was called (i.e., we can't use an _else_ here.) | |
73 | */ | |
4be44fcd LB |
74 | if (ACPI_GET_DESCRIPTOR_TYPE(*stack_ptr) == ACPI_DESC_TYPE_NAMED) { |
75 | status = | |
76 | acpi_ex_resolve_node_to_value(ACPI_CAST_INDIRECT_PTR | |
77 | (struct acpi_namespace_node, | |
78 | stack_ptr), walk_state); | |
79 | if (ACPI_FAILURE(status)) { | |
80 | return_ACPI_STATUS(status); | |
1da177e4 LT |
81 | } |
82 | } | |
83 | ||
4be44fcd LB |
84 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Resolved object %p\n", *stack_ptr)); |
85 | return_ACPI_STATUS(AE_OK); | |
1da177e4 LT |
86 | } |
87 | ||
1da177e4 LT |
88 | /******************************************************************************* |
89 | * | |
90 | * FUNCTION: acpi_ex_resolve_object_to_value | |
91 | * | |
44f6c012 | 92 | * PARAMETERS: stack_ptr - Pointer to an internal object |
1da177e4 LT |
93 | * walk_state - Current method state |
94 | * | |
95 | * RETURN: Status | |
96 | * | |
44f6c012 | 97 | * DESCRIPTION: Retrieve the value from an internal object. The Reference type |
1da177e4 LT |
98 | * uses the associated AML opcode to determine the value. |
99 | * | |
100 | ******************************************************************************/ | |
101 | ||
44f6c012 | 102 | static acpi_status |
4be44fcd LB |
103 | acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, |
104 | struct acpi_walk_state *walk_state) | |
1da177e4 | 105 | { |
4be44fcd LB |
106 | acpi_status status = AE_OK; |
107 | union acpi_operand_object *stack_desc; | |
65e4b9b0 | 108 | union acpi_operand_object *obj_desc = NULL; |
1044f1f6 | 109 | u8 ref_type; |
1da177e4 | 110 | |
b229cf92 | 111 | ACPI_FUNCTION_TRACE(ex_resolve_object_to_value); |
1da177e4 LT |
112 | |
113 | stack_desc = *stack_ptr; | |
114 | ||
cf48958e | 115 | /* This is an object of type union acpi_operand_object */ |
1da177e4 | 116 | |
3371c19c | 117 | switch (stack_desc->common.type) { |
1da177e4 LT |
118 | case ACPI_TYPE_LOCAL_REFERENCE: |
119 | ||
1044f1f6 | 120 | ref_type = stack_desc->reference.class; |
1da177e4 | 121 | |
1044f1f6 BM |
122 | switch (ref_type) { |
123 | case ACPI_REFCLASS_LOCAL: | |
124 | case ACPI_REFCLASS_ARG: | |
1da177e4 LT |
125 | /* |
126 | * Get the local from the method's state info | |
127 | * Note: this increments the local's object reference count | |
128 | */ | |
1044f1f6 | 129 | status = acpi_ds_method_data_get_value(ref_type, |
4be44fcd | 130 | stack_desc-> |
1044f1f6 | 131 | reference.value, |
4be44fcd LB |
132 | walk_state, |
133 | &obj_desc); | |
134 | if (ACPI_FAILURE(status)) { | |
135 | return_ACPI_STATUS(status); | |
1da177e4 LT |
136 | } |
137 | ||
4be44fcd | 138 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
b229cf92 | 139 | "[Arg/Local %X] ValueObj is %p\n", |
1044f1f6 | 140 | stack_desc->reference.value, |
4be44fcd | 141 | obj_desc)); |
1da177e4 LT |
142 | |
143 | /* | |
144 | * Now we can delete the original Reference Object and | |
145 | * replace it with the resolved value | |
146 | */ | |
4be44fcd | 147 | acpi_ut_remove_reference(stack_desc); |
1da177e4 LT |
148 | *stack_ptr = obj_desc; |
149 | break; | |
150 | ||
1044f1f6 | 151 | case ACPI_REFCLASS_INDEX: |
1da177e4 LT |
152 | |
153 | switch (stack_desc->reference.target_type) { | |
154 | case ACPI_TYPE_BUFFER_FIELD: | |
155 | ||
1cb2ef66 | 156 | /* Just return - do not dereference */ |
1da177e4 LT |
157 | break; |
158 | ||
1da177e4 LT |
159 | case ACPI_TYPE_PACKAGE: |
160 | ||
1cb2ef66 | 161 | /* If method call or copy_object - do not dereference */ |
e5bcc811 | 162 | |
1cb2ef66 LM |
163 | if ((walk_state->opcode == |
164 | AML_INT_METHODCALL_OP) | |
9ff5a21a BM |
165 | || (walk_state->opcode == |
166 | AML_COPY_OBJECT_OP)) { | |
e5bcc811 LM |
167 | break; |
168 | } | |
169 | ||
1cb2ef66 LM |
170 | /* Otherwise, dereference the package_index to a package element */ |
171 | ||
1da177e4 LT |
172 | obj_desc = *stack_desc->reference.where; |
173 | if (obj_desc) { | |
174 | /* | |
1cb2ef66 | 175 | * Valid object descriptor, copy pointer to return value |
1da177e4 LT |
176 | * (i.e., dereference the package index) |
177 | * Delete the ref object, increment the returned object | |
178 | */ | |
4be44fcd | 179 | acpi_ut_add_reference(obj_desc); |
1da177e4 | 180 | *stack_ptr = obj_desc; |
4be44fcd | 181 | } else { |
1da177e4 | 182 | /* |
1cb2ef66 | 183 | * A NULL object descriptor means an uninitialized element of |
1da177e4 LT |
184 | * the package, can't dereference it |
185 | */ | |
b8e4d893 | 186 | ACPI_ERROR((AE_INFO, |
1fad8738 BM |
187 | "Attempt to dereference an Index to " |
188 | "NULL package element Idx=%p", | |
b8e4d893 | 189 | stack_desc)); |
1da177e4 LT |
190 | status = AE_AML_UNINITIALIZED_ELEMENT; |
191 | } | |
192 | break; | |
193 | ||
1da177e4 LT |
194 | default: |
195 | ||
196 | /* Invalid reference object */ | |
197 | ||
b8e4d893 | 198 | ACPI_ERROR((AE_INFO, |
f6a22b0b | 199 | "Unknown TargetType 0x%X in Index/Reference object %p", |
b8e4d893 BM |
200 | stack_desc->reference.target_type, |
201 | stack_desc)); | |
1da177e4 LT |
202 | status = AE_AML_INTERNAL; |
203 | break; | |
204 | } | |
205 | break; | |
206 | ||
1044f1f6 BM |
207 | case ACPI_REFCLASS_REFOF: |
208 | case ACPI_REFCLASS_DEBUG: | |
209 | case ACPI_REFCLASS_TABLE: | |
1da177e4 | 210 | |
1cb2ef66 | 211 | /* Just leave the object as-is, do not dereference */ |
1da177e4 LT |
212 | |
213 | break; | |
214 | ||
1044f1f6 | 215 | case ACPI_REFCLASS_NAME: /* Reference to a named object */ |
44f6c012 | 216 | |
4c90ece2 BM |
217 | /* Dereference the name */ |
218 | ||
219 | if ((stack_desc->reference.node->type == | |
220 | ACPI_TYPE_DEVICE) | |
221 | || (stack_desc->reference.node->type == | |
222 | ACPI_TYPE_THERMAL)) { | |
223 | ||
224 | /* These node types do not have 'real' subobjects */ | |
225 | ||
226 | *stack_ptr = (void *)stack_desc->reference.node; | |
227 | } else { | |
228 | /* Get the object pointed to by the namespace node */ | |
229 | ||
230 | *stack_ptr = | |
231 | (stack_desc->reference.node)->object; | |
232 | acpi_ut_add_reference(*stack_ptr); | |
233 | } | |
44f6c012 | 234 | |
4be44fcd | 235 | acpi_ut_remove_reference(stack_desc); |
44f6c012 | 236 | break; |
1da177e4 LT |
237 | |
238 | default: | |
239 | ||
b8e4d893 | 240 | ACPI_ERROR((AE_INFO, |
f6a22b0b BM |
241 | "Unknown Reference type 0x%X in %p", |
242 | ref_type, stack_desc)); | |
1da177e4 LT |
243 | status = AE_AML_INTERNAL; |
244 | break; | |
245 | } | |
246 | break; | |
247 | ||
1da177e4 LT |
248 | case ACPI_TYPE_BUFFER: |
249 | ||
4be44fcd | 250 | status = acpi_ds_get_buffer_arguments(stack_desc); |
1da177e4 LT |
251 | break; |
252 | ||
1da177e4 LT |
253 | case ACPI_TYPE_PACKAGE: |
254 | ||
4be44fcd | 255 | status = acpi_ds_get_package_arguments(stack_desc); |
1da177e4 LT |
256 | break; |
257 | ||
1da177e4 LT |
258 | case ACPI_TYPE_BUFFER_FIELD: |
259 | case ACPI_TYPE_LOCAL_REGION_FIELD: | |
260 | case ACPI_TYPE_LOCAL_BANK_FIELD: | |
261 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | |
262 | ||
4be44fcd | 263 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
b229cf92 | 264 | "FieldRead SourceDesc=%p Type=%X\n", |
3371c19c | 265 | stack_desc, stack_desc->common.type)); |
1da177e4 | 266 | |
4be44fcd LB |
267 | status = |
268 | acpi_ex_read_data_from_field(walk_state, stack_desc, | |
269 | &obj_desc); | |
65e4b9b0 FS |
270 | |
271 | /* Remove a reference to the original operand, then override */ | |
272 | ||
273 | acpi_ut_remove_reference(*stack_ptr); | |
4be44fcd | 274 | *stack_ptr = (void *)obj_desc; |
1da177e4 LT |
275 | break; |
276 | ||
277 | default: | |
1d1ea1b7 | 278 | |
1da177e4 LT |
279 | break; |
280 | } | |
281 | ||
4be44fcd | 282 | return_ACPI_STATUS(status); |
1da177e4 LT |
283 | } |
284 | ||
1da177e4 LT |
285 | /******************************************************************************* |
286 | * | |
287 | * FUNCTION: acpi_ex_resolve_multiple | |
288 | * | |
289 | * PARAMETERS: walk_state - Current state (contains AML opcode) | |
ba494bee | 290 | * operand - Starting point for resolution |
1da177e4 LT |
291 | * return_type - Where the object type is returned |
292 | * return_desc - Where the resolved object is returned | |
293 | * | |
294 | * RETURN: Status | |
295 | * | |
73a3090a | 296 | * DESCRIPTION: Return the base object and type. Traverse a reference list if |
1da177e4 LT |
297 | * necessary to get to the base object. |
298 | * | |
299 | ******************************************************************************/ | |
300 | ||
301 | acpi_status | |
4be44fcd LB |
302 | acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, |
303 | union acpi_operand_object *operand, | |
f5c1e1c5 | 304 | acpi_object_type *return_type, |
4be44fcd | 305 | union acpi_operand_object **return_desc) |
1da177e4 | 306 | { |
4712f71b BM |
307 | union acpi_operand_object *obj_desc = ACPI_CAST_PTR(void, operand); |
308 | struct acpi_namespace_node *node = | |
309 | ACPI_CAST_PTR(struct acpi_namespace_node, operand); | |
4be44fcd LB |
310 | acpi_object_type type; |
311 | acpi_status status; | |
1da177e4 | 312 | |
b229cf92 | 313 | ACPI_FUNCTION_TRACE(acpi_ex_resolve_multiple); |
1da177e4 | 314 | |
44f6c012 RM |
315 | /* Operand can be either a namespace node or an operand descriptor */ |
316 | ||
4be44fcd | 317 | switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) { |
1da177e4 | 318 | case ACPI_DESC_TYPE_OPERAND: |
1d1ea1b7 | 319 | |
1da177e4 LT |
320 | type = obj_desc->common.type; |
321 | break; | |
322 | ||
323 | case ACPI_DESC_TYPE_NAMED: | |
1d1ea1b7 | 324 | |
4be44fcd | 325 | type = ((struct acpi_namespace_node *)obj_desc)->type; |
4712f71b | 326 | obj_desc = acpi_ns_get_attached_object(node); |
1da177e4 LT |
327 | |
328 | /* If we had an Alias node, use the attached object for type info */ | |
329 | ||
330 | if (type == ACPI_TYPE_LOCAL_ALIAS) { | |
4be44fcd | 331 | type = ((struct acpi_namespace_node *)obj_desc)->type; |
1fad8738 BM |
332 | obj_desc = acpi_ns_get_attached_object((struct |
333 | acpi_namespace_node | |
334 | *)obj_desc); | |
1da177e4 | 335 | } |
4712f71b | 336 | |
1d6e9cfa BM |
337 | switch (type) { |
338 | case ACPI_TYPE_DEVICE: | |
339 | case ACPI_TYPE_THERMAL: | |
340 | ||
341 | /* These types have no attached subobject */ | |
342 | break; | |
343 | ||
344 | default: | |
345 | ||
346 | /* All other types require a subobject */ | |
347 | ||
348 | if (!obj_desc) { | |
349 | ACPI_ERROR((AE_INFO, | |
350 | "[%4.4s] Node is unresolved or uninitialized", | |
351 | acpi_ut_get_node_name(node))); | |
352 | return_ACPI_STATUS(AE_AML_UNINITIALIZED_NODE); | |
353 | } | |
354 | break; | |
4712f71b | 355 | } |
1da177e4 LT |
356 | break; |
357 | ||
358 | default: | |
4be44fcd | 359 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
1da177e4 LT |
360 | } |
361 | ||
44f6c012 | 362 | /* If type is anything other than a reference, we are done */ |
1da177e4 | 363 | |
1da177e4 LT |
364 | if (type != ACPI_TYPE_LOCAL_REFERENCE) { |
365 | goto exit; | |
366 | } | |
367 | ||
368 | /* | |
bc7a36ab LM |
369 | * For reference objects created via the ref_of, Index, or Load/load_table |
370 | * operators, we need to get to the base object (as per the ACPI | |
371 | * specification of the object_type and size_of operators). This means | |
372 | * traversing the list of possibly many nested references. | |
1da177e4 | 373 | */ |
3371c19c | 374 | while (obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) { |
1044f1f6 BM |
375 | switch (obj_desc->reference.class) { |
376 | case ACPI_REFCLASS_REFOF: | |
377 | case ACPI_REFCLASS_NAME: | |
1da177e4 LT |
378 | |
379 | /* Dereference the reference pointer */ | |
380 | ||
1044f1f6 | 381 | if (obj_desc->reference.class == ACPI_REFCLASS_REFOF) { |
52fc0b02 BM |
382 | node = obj_desc->reference.object; |
383 | } else { /* AML_INT_NAMEPATH_OP */ | |
384 | ||
385 | node = obj_desc->reference.node; | |
386 | } | |
1da177e4 LT |
387 | |
388 | /* All "References" point to a NS node */ | |
389 | ||
4be44fcd LB |
390 | if (ACPI_GET_DESCRIPTOR_TYPE(node) != |
391 | ACPI_DESC_TYPE_NAMED) { | |
f6a22b0b BM |
392 | ACPI_ERROR((AE_INFO, |
393 | "Not a namespace node %p [%s]", | |
b8e4d893 BM |
394 | node, |
395 | acpi_ut_get_descriptor_name(node))); | |
4be44fcd | 396 | return_ACPI_STATUS(AE_AML_INTERNAL); |
1da177e4 LT |
397 | } |
398 | ||
399 | /* Get the attached object */ | |
400 | ||
4be44fcd | 401 | obj_desc = acpi_ns_get_attached_object(node); |
1da177e4 | 402 | if (!obj_desc) { |
52fc0b02 | 403 | |
1da177e4 LT |
404 | /* No object, use the NS node type */ |
405 | ||
4be44fcd | 406 | type = acpi_ns_get_type(node); |
1da177e4 LT |
407 | goto exit; |
408 | } | |
409 | ||
410 | /* Check for circular references */ | |
411 | ||
412 | if (obj_desc == operand) { | |
4be44fcd | 413 | return_ACPI_STATUS(AE_AML_CIRCULAR_REFERENCE); |
1da177e4 LT |
414 | } |
415 | break; | |
416 | ||
1044f1f6 | 417 | case ACPI_REFCLASS_INDEX: |
1da177e4 LT |
418 | |
419 | /* Get the type of this reference (index into another object) */ | |
420 | ||
421 | type = obj_desc->reference.target_type; | |
422 | if (type != ACPI_TYPE_PACKAGE) { | |
423 | goto exit; | |
424 | } | |
425 | ||
426 | /* | |
427 | * The main object is a package, we want to get the type | |
428 | * of the individual package element that is referenced by | |
429 | * the index. | |
430 | * | |
431 | * This could of course in turn be another reference object. | |
432 | */ | |
433 | obj_desc = *(obj_desc->reference.where); | |
434 | if (!obj_desc) { | |
52fc0b02 | 435 | |
1da177e4 LT |
436 | /* NULL package elements are allowed */ |
437 | ||
4be44fcd | 438 | type = 0; /* Uninitialized */ |
1da177e4 LT |
439 | goto exit; |
440 | } | |
441 | break; | |
442 | ||
1044f1f6 | 443 | case ACPI_REFCLASS_TABLE: |
bc7a36ab LM |
444 | |
445 | type = ACPI_TYPE_DDB_HANDLE; | |
446 | goto exit; | |
447 | ||
1044f1f6 BM |
448 | case ACPI_REFCLASS_LOCAL: |
449 | case ACPI_REFCLASS_ARG: | |
1da177e4 LT |
450 | |
451 | if (return_desc) { | |
4be44fcd LB |
452 | status = |
453 | acpi_ds_method_data_get_value(obj_desc-> | |
454 | reference. | |
1044f1f6 | 455 | class, |
4be44fcd LB |
456 | obj_desc-> |
457 | reference. | |
1044f1f6 | 458 | value, |
4be44fcd LB |
459 | walk_state, |
460 | &obj_desc); | |
461 | if (ACPI_FAILURE(status)) { | |
462 | return_ACPI_STATUS(status); | |
1da177e4 | 463 | } |
4be44fcd LB |
464 | acpi_ut_remove_reference(obj_desc); |
465 | } else { | |
466 | status = | |
467 | acpi_ds_method_data_get_node(obj_desc-> | |
468 | reference. | |
1044f1f6 | 469 | class, |
4be44fcd LB |
470 | obj_desc-> |
471 | reference. | |
1044f1f6 | 472 | value, |
4be44fcd LB |
473 | walk_state, |
474 | &node); | |
475 | if (ACPI_FAILURE(status)) { | |
476 | return_ACPI_STATUS(status); | |
1da177e4 LT |
477 | } |
478 | ||
4be44fcd | 479 | obj_desc = acpi_ns_get_attached_object(node); |
1da177e4 LT |
480 | if (!obj_desc) { |
481 | type = ACPI_TYPE_ANY; | |
482 | goto exit; | |
483 | } | |
484 | } | |
485 | break; | |
486 | ||
1044f1f6 | 487 | case ACPI_REFCLASS_DEBUG: |
1da177e4 | 488 | |
b229cf92 | 489 | /* The Debug Object is of type "DebugObject" */ |
1da177e4 LT |
490 | |
491 | type = ACPI_TYPE_DEBUG_OBJECT; | |
492 | goto exit; | |
493 | ||
1da177e4 LT |
494 | default: |
495 | ||
b8e4d893 | 496 | ACPI_ERROR((AE_INFO, |
f6a22b0b | 497 | "Unknown Reference Class 0x%2.2X", |
1044f1f6 | 498 | obj_desc->reference.class)); |
4be44fcd | 499 | return_ACPI_STATUS(AE_AML_INTERNAL); |
1da177e4 LT |
500 | } |
501 | } | |
502 | ||
503 | /* | |
504 | * Now we are guaranteed to have an object that has not been created | |
505 | * via the ref_of or Index operators. | |
506 | */ | |
3371c19c | 507 | type = obj_desc->common.type; |
1da177e4 | 508 | |
10622bf8 | 509 | exit: |
1da177e4 LT |
510 | /* Convert internal types to external types */ |
511 | ||
512 | switch (type) { | |
513 | case ACPI_TYPE_LOCAL_REGION_FIELD: | |
514 | case ACPI_TYPE_LOCAL_BANK_FIELD: | |
515 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | |
516 | ||
517 | type = ACPI_TYPE_FIELD_UNIT; | |
518 | break; | |
519 | ||
520 | case ACPI_TYPE_LOCAL_SCOPE: | |
521 | ||
522 | /* Per ACPI Specification, Scope is untyped */ | |
523 | ||
524 | type = ACPI_TYPE_ANY; | |
525 | break; | |
526 | ||
527 | default: | |
1d1ea1b7 | 528 | |
1da177e4 | 529 | /* No change to Type required */ |
1d1ea1b7 | 530 | |
1da177e4 LT |
531 | break; |
532 | } | |
533 | ||
534 | *return_type = type; | |
535 | if (return_desc) { | |
536 | *return_desc = obj_desc; | |
537 | } | |
4be44fcd | 538 | return_ACPI_STATUS(AE_OK); |
1da177e4 | 539 | } |