1/****************************************************************************** 2 * 3 * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2005, R. Byron Moore 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 _ACUTILS_H 45#define _ACUTILS_H 46 47typedef 48acpi_status(*acpi_pkg_callback) (u8 object_type, 49 union acpi_operand_object * source_object, 50 union acpi_generic_state * state, 51 void *context); 52 53struct acpi_pkg_info { 54 u8 *free_space; 55 acpi_size length; 56 u32 object_space; 57 u32 num_packages; 58}; 59 60#define REF_INCREMENT (u16) 0 61#define REF_DECREMENT (u16) 1 62#define REF_FORCE_DELETE (u16) 2 63 64/* acpi_ut_dump_buffer */ 65 66#define DB_BYTE_DISPLAY 1 67#define DB_WORD_DISPLAY 2 68#define DB_DWORD_DISPLAY 4 69#define DB_QWORD_DISPLAY 8 70 71/* 72 * utglobal - Global data structures and procedures 73 */ 74void acpi_ut_init_globals(void); 75 76#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 77 78char *acpi_ut_get_mutex_name(u32 mutex_id); 79 80#endif 81 82char *acpi_ut_get_type_name(acpi_object_type type); 83 84char *acpi_ut_get_node_name(void *object); 85 86char *acpi_ut_get_descriptor_name(void *object); 87 88char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc); 89 90char *acpi_ut_get_region_name(u8 space_id); 91 92char *acpi_ut_get_event_name(u32 event_id); 93 94char acpi_ut_hex_to_ascii_char(acpi_integer integer, u32 position); 95 96u8 acpi_ut_valid_object_type(acpi_object_type type); 97 98/* 99 * utinit - miscellaneous initialization and shutdown 100 */ 101acpi_status acpi_ut_hardware_initialize(void); 102 103void acpi_ut_subsystem_shutdown(void); 104 105acpi_status acpi_ut_validate_fadt(void); 106 107/* 108 * utclib - Local implementations of C library functions 109 */ 110#ifndef ACPI_USE_SYSTEM_CLIBRARY 111 112acpi_size acpi_ut_strlen(const char *string); 113 114char *acpi_ut_strcpy(char *dst_string, const char *src_string); 115 116char *acpi_ut_strncpy(char *dst_string, 117 const char *src_string, acpi_size count); 118 119int acpi_ut_memcmp(const char *buffer1, const char *buffer2, acpi_size count); 120 121int acpi_ut_strncmp(const char *string1, const char *string2, acpi_size count); 122 123int acpi_ut_strcmp(const char *string1, const char *string2); 124 125char *acpi_ut_strcat(char *dst_string, const char *src_string); 126 127char *acpi_ut_strncat(char *dst_string, 128 const char *src_string, acpi_size count); 129 130u32 acpi_ut_strtoul(const char *string, char **terminator, u32 base); 131 132char *acpi_ut_strstr(char *string1, char *string2); 133 134void *acpi_ut_memcpy(void *dest, const void *src, acpi_size count); 135 136void *acpi_ut_memset(void *dest, acpi_native_uint value, acpi_size count); 137 138int acpi_ut_to_upper(int c); 139 140int acpi_ut_to_lower(int c); 141 142extern const u8 _acpi_ctype[]; 143 144#define _ACPI_XA 0x00 /* extra alphabetic - not supported */ 145#define _ACPI_XS 0x40 /* extra space */ 146#define _ACPI_BB 0x00 /* BEL, BS, etc. - not supported */ 147#define _ACPI_CN 0x20 /* CR, FF, HT, NL, VT */ 148#define _ACPI_DI 0x04 /* '0'-'9' */ 149#define _ACPI_LO 0x02 /* 'a'-'z' */ 150#define _ACPI_PU 0x10 /* punctuation */ 151#define _ACPI_SP 0x08 /* space */ 152#define _ACPI_UP 0x01 /* 'A'-'Z' */ 153#define _ACPI_XD 0x80 /* '0'-'9', 'A'-'F', 'a'-'f' */ 154 155#define ACPI_IS_DIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_DI)) 156#define ACPI_IS_SPACE(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_SP)) 157#define ACPI_IS_XDIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD)) 158#define ACPI_IS_UPPER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP)) 159#define ACPI_IS_LOWER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO)) 160#define ACPI_IS_PRINT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_SP | _ACPI_PU)) 161#define ACPI_IS_ALPHA(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP)) 162#define ACPI_IS_ASCII(c) ((c) < 0x80) 163 164#endif /* ACPI_USE_SYSTEM_CLIBRARY */ 165 166/* 167 * utcopy - Object construction and conversion interfaces 168 */ 169acpi_status 170acpi_ut_build_simple_object(union acpi_operand_object *obj, 171 union acpi_object *user_obj, 172 u8 * data_space, u32 * buffer_space_used); 173 174acpi_status 175acpi_ut_build_package_object(union acpi_operand_object *obj, 176 u8 * buffer, u32 * space_used); 177 178acpi_status 179acpi_ut_copy_iobject_to_eobject(union acpi_operand_object *obj, 180 struct acpi_buffer *ret_buffer); 181 182acpi_status 183acpi_ut_copy_eobject_to_iobject(union acpi_object *obj, 184 union acpi_operand_object **internal_obj); 185 186acpi_status 187acpi_ut_copy_isimple_to_isimple(union acpi_operand_object *source_obj, 188 union acpi_operand_object *dest_obj); 189 190acpi_status 191acpi_ut_copy_iobject_to_iobject(union acpi_operand_object *source_desc, 192 union acpi_operand_object **dest_desc, 193 struct acpi_walk_state *walk_state); 194 195/* 196 * utcreate - Object creation 197 */ 198acpi_status 199acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action); 200 201/* 202 * utdebug - Debug interfaces 203 */ 204void acpi_ut_init_stack_ptr_trace(void); 205 206void acpi_ut_track_stack_ptr(void); 207 208void 209acpi_ut_trace(u32 line_number, 210 const char *function_name, char *module_name, u32 component_id); 211 212void 213acpi_ut_trace_ptr(u32 line_number, 214 const char *function_name, 215 char *module_name, u32 component_id, void *pointer); 216 217void 218acpi_ut_trace_u32(u32 line_number, 219 const char *function_name, 220 char *module_name, u32 component_id, u32 integer); 221 222void 223acpi_ut_trace_str(u32 line_number, 224 const char *function_name, 225 char *module_name, u32 component_id, char *string); 226 227void 228acpi_ut_exit(u32 line_number, 229 const char *function_name, char *module_name, u32 component_id); 230 231void 232acpi_ut_status_exit(u32 line_number, 233 const char *function_name, 234 char *module_name, u32 component_id, acpi_status status); 235 236void 237acpi_ut_value_exit(u32 line_number, 238 const char *function_name, 239 char *module_name, u32 component_id, acpi_integer value); 240 241void 242acpi_ut_ptr_exit(u32 line_number, 243 const char *function_name, 244 char *module_name, u32 component_id, u8 * ptr); 245 246void acpi_ut_report_info(char *module_name, u32 line_number, u32 component_id); 247 248void acpi_ut_report_error(char *module_name, u32 line_number, u32 component_id); 249 250void 251acpi_ut_report_warning(char *module_name, u32 line_number, u32 component_id); 252 253void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id); 254 255void ACPI_INTERNAL_VAR_XFACE 256acpi_ut_debug_print(u32 requested_debug_level, 257 u32 line_number, 258 const char *function_name, 259 char *module_name, 260 u32 component_id, char *format, ...) ACPI_PRINTF_LIKE_FUNC; 261 262void ACPI_INTERNAL_VAR_XFACE 263acpi_ut_debug_print_raw(u32 requested_debug_level, 264 u32 line_number, 265 const char *function_name, 266 char *module_name, 267 u32 component_id, 268 char *format, ...) ACPI_PRINTF_LIKE_FUNC; 269 270/* 271 * utdelete - Object deletion and reference counts 272 */ 273void acpi_ut_add_reference(union acpi_operand_object *object); 274 275void acpi_ut_remove_reference(union acpi_operand_object *object); 276 277void acpi_ut_delete_internal_package_object(union acpi_operand_object *object); 278 279void acpi_ut_delete_internal_simple_object(union acpi_operand_object *object); 280 281void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list); 282 283/* 284 * uteval - object evaluation 285 */ 286acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state); 287 288acpi_status 289acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node, 290 char *path, 291 u32 expected_return_btypes, 292 union acpi_operand_object **return_desc); 293 294acpi_status 295acpi_ut_evaluate_numeric_object(char *object_name, 296 struct acpi_namespace_node *device_node, 297 acpi_integer * address); 298 299acpi_status 300acpi_ut_execute_HID(struct acpi_namespace_node *device_node, 301 struct acpi_device_id *hid); 302 303acpi_status 304acpi_ut_execute_CID(struct acpi_namespace_node *device_node, 305 struct acpi_compatible_id_list **return_cid_list); 306 307acpi_status 308acpi_ut_execute_STA(struct acpi_namespace_node *device_node, 309 u32 * status_flags); 310 311acpi_status 312acpi_ut_execute_UID(struct acpi_namespace_node *device_node, 313 struct acpi_device_id *uid); 314 315acpi_status 316acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest); 317 318/* 319 * utobject - internal object create/delete/cache routines 320 */ 321union acpi_operand_object *acpi_ut_create_internal_object_dbg(char *module_name, 322 u32 line_number, 323 u32 component_id, 324 acpi_object_type 325 type); 326 327void *acpi_ut_allocate_object_desc_dbg(char *module_name, 328 u32 line_number, u32 component_id); 329 330#define acpi_ut_create_internal_object(t) acpi_ut_create_internal_object_dbg (_acpi_module_name,__LINE__,_COMPONENT,t) 331#define acpi_ut_allocate_object_desc() acpi_ut_allocate_object_desc_dbg (_acpi_module_name,__LINE__,_COMPONENT) 332 333void acpi_ut_delete_object_desc(union acpi_operand_object *object); 334 335u8 acpi_ut_valid_internal_object(void *object); 336 337union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size); 338 339union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size); 340 341acpi_status 342acpi_ut_get_object_size(union acpi_operand_object *obj, acpi_size * obj_length); 343 344/* 345 * utstate - Generic state creation/cache routines 346 */ 347void 348acpi_ut_push_generic_state(union acpi_generic_state **list_head, 349 union acpi_generic_state *state); 350 351union acpi_generic_state *acpi_ut_pop_generic_state(union acpi_generic_state 352 **list_head); 353 354union acpi_generic_state *acpi_ut_create_generic_state(void); 355 356struct acpi_thread_state *acpi_ut_create_thread_state(void); 357 358union acpi_generic_state *acpi_ut_create_update_state(union acpi_operand_object 359 *object, u16 action); 360 361union acpi_generic_state *acpi_ut_create_pkg_state(void *internal_object, 362 void *external_object, 363 u16 index); 364 365acpi_status 366acpi_ut_create_update_state_and_push(union acpi_operand_object *object, 367 u16 action, 368 union acpi_generic_state **state_list); 369 370#ifdef ACPI_FUTURE_USAGE 371acpi_status 372acpi_ut_create_pkg_state_and_push(void *internal_object, 373 void *external_object, 374 u16 index, 375 union acpi_generic_state **state_list); 376#endif /* ACPI_FUTURE_USAGE */ 377 378union acpi_generic_state *acpi_ut_create_control_state(void); 379 380void acpi_ut_delete_generic_state(union acpi_generic_state *state); 381 382/* 383 * utmath 384 */ 385acpi_status 386acpi_ut_divide(acpi_integer in_dividend, 387 acpi_integer in_divisor, 388 acpi_integer * out_quotient, acpi_integer * out_remainder); 389 390acpi_status 391acpi_ut_short_divide(acpi_integer in_dividend, 392 u32 divisor, 393 acpi_integer * out_quotient, u32 * out_remainder); 394 395/* 396 * utmisc 397 */ 398acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id); 399 400void acpi_ut_release_owner_id(acpi_owner_id * owner_id); 401 402acpi_status 403acpi_ut_walk_package_tree(union acpi_operand_object *source_object, 404 void *target_object, 405 acpi_pkg_callback walk_callback, void *context); 406 407void acpi_ut_strupr(char *src_string); 408 409void acpi_ut_print_string(char *string, u8 max_length); 410 411u8 acpi_ut_valid_acpi_name(u32 name); 412 413u8 acpi_ut_valid_acpi_character(char character); 414 415acpi_status 416acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer); 417 418/* Values for Base above (16=Hex, 10=Decimal) */ 419 420#define ACPI_ANY_BASE 0 421 422u8 *acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc); 423 424u8 acpi_ut_generate_checksum(u8 * buffer, u32 length); 425 426u32 acpi_ut_dword_byte_swap(u32 value); 427 428void acpi_ut_set_integer_width(u8 revision); 429 430#ifdef ACPI_DEBUG_OUTPUT 431void 432acpi_ut_display_init_pathname(u8 type, 433 struct acpi_namespace_node *obj_handle, 434 char *path); 435 436#endif 437 438/* 439 * utmutex - mutex support 440 */ 441acpi_status acpi_ut_mutex_initialize(void); 442 443void acpi_ut_mutex_terminate(void); 444 445acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id); 446 447acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id); 448 449/* 450 * utalloc - memory allocation and object caching 451 */ 452acpi_status acpi_ut_create_caches(void); 453 454acpi_status acpi_ut_delete_caches(void); 455 456acpi_status acpi_ut_validate_buffer(struct acpi_buffer *buffer); 457 458acpi_status 459acpi_ut_initialize_buffer(struct acpi_buffer *buffer, 460 acpi_size required_length); 461 462void *acpi_ut_allocate(acpi_size size, u32 component, char *module, u32 line); 463 464void *acpi_ut_callocate(acpi_size size, u32 component, char *module, u32 line); 465 466#ifdef ACPI_DBG_TRACK_ALLOCATIONS 467void *acpi_ut_allocate_and_track(acpi_size size, 468 u32 component, char *module, u32 line); 469 470void *acpi_ut_callocate_and_track(acpi_size size, 471 u32 component, char *module, u32 line); 472 473void 474acpi_ut_free_and_track(void *address, u32 component, char *module, u32 line); 475 476#ifdef ACPI_FUTURE_USAGE 477void acpi_ut_dump_allocation_info(void); 478#endif /* ACPI_FUTURE_USAGE */ 479 480void acpi_ut_dump_allocations(u32 component, char *module); 481#endif 482 483#endif /* _ACUTILS_H */