1 /****************************************************************************** 2 * 3 * Name: acdispat.h - dispatcher (parser to interpreter interface) 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2010, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #ifndef _ACDISPAT_H_ 45 #define _ACDISPAT_H_ 46 47 #define NAMEOF_LOCAL_NTE "__L0" 48 #define NAMEOF_ARG_NTE "__A0" 49 50 /* 51 * dsopcode - support for late evaluation 52 */ 53 acpi_status 54 acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc); 55 56 acpi_status 57 acpi_ds_get_bank_field_arguments(union acpi_operand_object *obj_desc); 58 59 acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *rgn_desc); 60 61 acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc); 62 63 acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc); 64 65 acpi_status 66 acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, 67 union acpi_parse_object *op); 68 69 acpi_status 70 acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, 71 union acpi_parse_object *op); 72 73 acpi_status 74 acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state, 75 union acpi_parse_object *op); 76 77 acpi_status 78 acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state, 79 union acpi_parse_object *op, 80 union acpi_operand_object *obj_desc); 81 82 acpi_status 83 acpi_ds_eval_bank_field_operands(struct acpi_walk_state *walk_state, 84 union acpi_parse_object *op); 85 86 acpi_status acpi_ds_initialize_region(acpi_handle obj_handle); 87 88 /* 89 * dsctrl - Parser/Interpreter interface, control stack routines 90 */ 91 acpi_status 92 acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, 93 union acpi_parse_object *op); 94 95 acpi_status 96 acpi_ds_exec_end_control_op(struct acpi_walk_state *walk_state, 97 union acpi_parse_object *op); 98 99 /* 100 * dsexec - Parser/Interpreter interface, method execution callbacks 101 */ 102 acpi_status 103 acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, 104 union acpi_operand_object *result_obj); 105 106 acpi_status 107 acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, 108 union acpi_parse_object **out_op); 109 110 acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *state); 111 112 /* 113 * dsfield - Parser/Interpreter interface for AML fields 114 */ 115 acpi_status 116 acpi_ds_create_field(union acpi_parse_object *op, 117 struct acpi_namespace_node *region_node, 118 struct acpi_walk_state *walk_state); 119 120 acpi_status 121 acpi_ds_create_bank_field(union acpi_parse_object *op, 122 struct acpi_namespace_node *region_node, 123 struct acpi_walk_state *walk_state); 124 125 acpi_status 126 acpi_ds_create_index_field(union acpi_parse_object *op, 127 struct acpi_namespace_node *region_node, 128 struct acpi_walk_state *walk_state); 129 130 acpi_status 131 acpi_ds_create_buffer_field(union acpi_parse_object *op, 132 struct acpi_walk_state *walk_state); 133 134 acpi_status 135 acpi_ds_init_field_objects(union acpi_parse_object *op, 136 struct acpi_walk_state *walk_state); 137 138 /* 139 * dsload - Parser/Interpreter interface, namespace load callbacks 140 */ 141 acpi_status 142 acpi_ds_load1_begin_op(struct acpi_walk_state *walk_state, 143 union acpi_parse_object **out_op); 144 145 acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state); 146 147 acpi_status 148 acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, 149 union acpi_parse_object **out_op); 150 151 acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state); 152 153 acpi_status 154 acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number); 155 156 /* 157 * dsmthdat - method data (locals/args) 158 */ 159 acpi_status 160 acpi_ds_store_object_to_local(u8 type, 161 u32 index, 162 union acpi_operand_object *src_desc, 163 struct acpi_walk_state *walk_state); 164 165 acpi_status 166 acpi_ds_method_data_get_entry(u16 opcode, 167 u32 index, 168 struct acpi_walk_state *walk_state, 169 union acpi_operand_object ***node); 170 171 void acpi_ds_method_data_delete_all(struct acpi_walk_state *walk_state); 172 173 u8 acpi_ds_is_method_value(union acpi_operand_object *obj_desc); 174 175 acpi_status 176 acpi_ds_method_data_get_value(u8 type, 177 u32 index, 178 struct acpi_walk_state *walk_state, 179 union acpi_operand_object **dest_desc); 180 181 acpi_status 182 acpi_ds_method_data_init_args(union acpi_operand_object **params, 183 u32 max_param_count, 184 struct acpi_walk_state *walk_state); 185 186 acpi_status 187 acpi_ds_method_data_get_node(u8 type, 188 u32 index, 189 struct acpi_walk_state *walk_state, 190 struct acpi_namespace_node **node); 191 192 void acpi_ds_method_data_init(struct acpi_walk_state *walk_state); 193 194 /* 195 * dsmethod - Parser/Interpreter interface - control method parsing 196 */ 197 acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node); 198 199 acpi_status 200 acpi_ds_call_control_method(struct acpi_thread_state *thread, 201 struct acpi_walk_state *walk_state, 202 union acpi_parse_object *op); 203 204 acpi_status 205 acpi_ds_restart_control_method(struct acpi_walk_state *walk_state, 206 union acpi_operand_object *return_desc); 207 208 void 209 acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, 210 struct acpi_walk_state *walk_state); 211 212 acpi_status 213 acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node, 214 union acpi_operand_object *obj_desc, 215 struct acpi_walk_state *walk_state); 216 217 acpi_status 218 acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state); 219 220 /* 221 * dsinit 222 */ 223 acpi_status 224 acpi_ds_initialize_objects(u32 table_index, 225 struct acpi_namespace_node *start_node); 226 227 /* 228 * dsobject - Parser/Interpreter interface - object initialization and conversion 229 */ 230 acpi_status 231 acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, 232 union acpi_parse_object *op, 233 u32 buffer_length, 234 union acpi_operand_object **obj_desc_ptr); 235 236 acpi_status 237 acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, 238 union acpi_parse_object *op, 239 u32 package_length, 240 union acpi_operand_object **obj_desc); 241 242 acpi_status 243 acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, 244 union acpi_parse_object *op, 245 u16 opcode, union acpi_operand_object **obj_desc); 246 247 acpi_status 248 acpi_ds_create_node(struct acpi_walk_state *walk_state, 249 struct acpi_namespace_node *node, 250 union acpi_parse_object *op); 251 252 /* 253 * dsutils - Parser/Interpreter interface utility routines 254 */ 255 void acpi_ds_clear_implicit_return(struct acpi_walk_state *walk_state); 256 257 u8 258 acpi_ds_do_implicit_return(union acpi_operand_object *return_desc, 259 struct acpi_walk_state *walk_state, 260 u8 add_reference); 261 262 u8 263 acpi_ds_is_result_used(union acpi_parse_object *op, 264 struct acpi_walk_state *walk_state); 265 266 void 267 acpi_ds_delete_result_if_not_used(union acpi_parse_object *op, 268 union acpi_operand_object *result_obj, 269 struct acpi_walk_state *walk_state); 270 271 acpi_status 272 acpi_ds_create_operand(struct acpi_walk_state *walk_state, 273 union acpi_parse_object *arg, u32 args_remaining); 274 275 acpi_status 276 acpi_ds_create_operands(struct acpi_walk_state *walk_state, 277 union acpi_parse_object *first_arg); 278 279 acpi_status acpi_ds_resolve_operands(struct acpi_walk_state *walk_state); 280 281 void acpi_ds_clear_operands(struct acpi_walk_state *walk_state); 282 283 acpi_status acpi_ds_evaluate_name_path(struct acpi_walk_state *walk_state); 284 285 /* 286 * dswscope - Scope Stack manipulation 287 */ 288 acpi_status 289 acpi_ds_scope_stack_push(struct acpi_namespace_node *node, 290 acpi_object_type type, 291 struct acpi_walk_state *walk_state); 292 293 acpi_status acpi_ds_scope_stack_pop(struct acpi_walk_state *walk_state); 294 295 void acpi_ds_scope_stack_clear(struct acpi_walk_state *walk_state); 296 297 /* 298 * dswstate - parser WALK_STATE management routines 299 */ 300 acpi_status 301 acpi_ds_obj_stack_push(void *object, struct acpi_walk_state *walk_state); 302 303 acpi_status 304 acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state *walk_state); 305 306 struct acpi_walk_state *acpi_ds_create_walk_state(acpi_owner_id owner_id, union acpi_parse_object 307 *origin, union acpi_operand_object 308 *mth_desc, struct acpi_thread_state 309 *thread); 310 311 acpi_status 312 acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, 313 union acpi_parse_object *op, 314 struct acpi_namespace_node *method_node, 315 u8 * aml_start, 316 u32 aml_length, 317 struct acpi_evaluate_info *info, u8 pass_number); 318 319 void 320 acpi_ds_obj_stack_pop_and_delete(u32 pop_count, 321 struct acpi_walk_state *walk_state); 322 323 void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state); 324 325 struct acpi_walk_state *acpi_ds_pop_walk_state(struct acpi_thread_state 326 *thread); 327 328 void 329 acpi_ds_push_walk_state(struct acpi_walk_state *walk_state, 330 struct acpi_thread_state *thread); 331 332 acpi_status acpi_ds_result_stack_clear(struct acpi_walk_state *walk_state); 333 334 struct acpi_walk_state *acpi_ds_get_current_walk_state(struct acpi_thread_state 335 *thread); 336 337 acpi_status 338 acpi_ds_result_pop(union acpi_operand_object **object, 339 struct acpi_walk_state *walk_state); 340 341 acpi_status 342 acpi_ds_result_push(union acpi_operand_object *object, 343 struct acpi_walk_state *walk_state); 344 345 #endif /* _ACDISPAT_H_ */ 346