1*99575102SLv Zheng /******************************************************************************* 2*99575102SLv Zheng * 3*99575102SLv Zheng * Module Name: dbtest - Various debug-related tests 4*99575102SLv Zheng * 5*99575102SLv Zheng ******************************************************************************/ 6*99575102SLv Zheng 7*99575102SLv Zheng /* 8*99575102SLv Zheng * Copyright (C) 2000 - 2015, Intel Corp. 9*99575102SLv Zheng * All rights reserved. 10*99575102SLv Zheng * 11*99575102SLv Zheng * Redistribution and use in source and binary forms, with or without 12*99575102SLv Zheng * modification, are permitted provided that the following conditions 13*99575102SLv Zheng * are met: 14*99575102SLv Zheng * 1. Redistributions of source code must retain the above copyright 15*99575102SLv Zheng * notice, this list of conditions, and the following disclaimer, 16*99575102SLv Zheng * without modification. 17*99575102SLv Zheng * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*99575102SLv Zheng * substantially similar to the "NO WARRANTY" disclaimer below 19*99575102SLv Zheng * ("Disclaimer") and any redistribution must be conditioned upon 20*99575102SLv Zheng * including a substantially similar Disclaimer requirement for further 21*99575102SLv Zheng * binary redistribution. 22*99575102SLv Zheng * 3. Neither the names of the above-listed copyright holders nor the names 23*99575102SLv Zheng * of any contributors may be used to endorse or promote products derived 24*99575102SLv Zheng * from this software without specific prior written permission. 25*99575102SLv Zheng * 26*99575102SLv Zheng * Alternatively, this software may be distributed under the terms of the 27*99575102SLv Zheng * GNU General Public License ("GPL") version 2 as published by the Free 28*99575102SLv Zheng * Software Foundation. 29*99575102SLv Zheng * 30*99575102SLv Zheng * NO WARRANTY 31*99575102SLv Zheng * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*99575102SLv Zheng * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*99575102SLv Zheng * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*99575102SLv Zheng * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*99575102SLv Zheng * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*99575102SLv Zheng * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*99575102SLv Zheng * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*99575102SLv Zheng * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*99575102SLv Zheng * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*99575102SLv Zheng * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*99575102SLv Zheng * POSSIBILITY OF SUCH DAMAGES. 42*99575102SLv Zheng */ 43*99575102SLv Zheng 44*99575102SLv Zheng #include <acpi/acpi.h> 45*99575102SLv Zheng #include "accommon.h" 46*99575102SLv Zheng #include "acdebug.h" 47*99575102SLv Zheng #include "acnamesp.h" 48*99575102SLv Zheng #include "acpredef.h" 49*99575102SLv Zheng 50*99575102SLv Zheng #define _COMPONENT ACPI_CA_DEBUGGER 51*99575102SLv Zheng ACPI_MODULE_NAME("dbtest") 52*99575102SLv Zheng 53*99575102SLv Zheng /* Local prototypes */ 54*99575102SLv Zheng static void acpi_db_test_all_objects(void); 55*99575102SLv Zheng 56*99575102SLv Zheng static acpi_status 57*99575102SLv Zheng acpi_db_test_one_object(acpi_handle obj_handle, 58*99575102SLv Zheng u32 nesting_level, void *context, void **return_value); 59*99575102SLv Zheng 60*99575102SLv Zheng static acpi_status 61*99575102SLv Zheng acpi_db_test_integer_type(struct acpi_namespace_node *node, u32 bit_length); 62*99575102SLv Zheng 63*99575102SLv Zheng static acpi_status 64*99575102SLv Zheng acpi_db_test_buffer_type(struct acpi_namespace_node *node, u32 bit_length); 65*99575102SLv Zheng 66*99575102SLv Zheng static acpi_status 67*99575102SLv Zheng acpi_db_test_string_type(struct acpi_namespace_node *node, u32 byte_length); 68*99575102SLv Zheng 69*99575102SLv Zheng static acpi_status 70*99575102SLv Zheng acpi_db_read_from_object(struct acpi_namespace_node *node, 71*99575102SLv Zheng acpi_object_type expected_type, 72*99575102SLv Zheng union acpi_object **value); 73*99575102SLv Zheng 74*99575102SLv Zheng static acpi_status 75*99575102SLv Zheng acpi_db_write_to_object(struct acpi_namespace_node *node, 76*99575102SLv Zheng union acpi_object *value); 77*99575102SLv Zheng 78*99575102SLv Zheng static void acpi_db_evaluate_all_predefined_names(char *count_arg); 79*99575102SLv Zheng 80*99575102SLv Zheng static acpi_status 81*99575102SLv Zheng acpi_db_evaluate_one_predefined_name(acpi_handle obj_handle, 82*99575102SLv Zheng u32 nesting_level, 83*99575102SLv Zheng void *context, void **return_value); 84*99575102SLv Zheng 85*99575102SLv Zheng /* 86*99575102SLv Zheng * Test subcommands 87*99575102SLv Zheng */ 88*99575102SLv Zheng static struct acpi_db_argument_info acpi_db_test_types[] = { 89*99575102SLv Zheng {"OBJECTS"}, 90*99575102SLv Zheng {"PREDEFINED"}, 91*99575102SLv Zheng {NULL} /* Must be null terminated */ 92*99575102SLv Zheng }; 93*99575102SLv Zheng 94*99575102SLv Zheng #define CMD_TEST_OBJECTS 0 95*99575102SLv Zheng #define CMD_TEST_PREDEFINED 1 96*99575102SLv Zheng 97*99575102SLv Zheng #define BUFFER_FILL_VALUE 0xFF 98*99575102SLv Zheng 99*99575102SLv Zheng /* 100*99575102SLv Zheng * Support for the special debugger read/write control methods. 101*99575102SLv Zheng * These methods are installed into the current namespace and are 102*99575102SLv Zheng * used to read and write the various namespace objects. The point 103*99575102SLv Zheng * is to force the AML interpreter do all of the work. 104*99575102SLv Zheng */ 105*99575102SLv Zheng #define ACPI_DB_READ_METHOD "\\_T98" 106*99575102SLv Zheng #define ACPI_DB_WRITE_METHOD "\\_T99" 107*99575102SLv Zheng 108*99575102SLv Zheng static acpi_handle read_handle = NULL; 109*99575102SLv Zheng static acpi_handle write_handle = NULL; 110*99575102SLv Zheng 111*99575102SLv Zheng /* ASL Definitions of the debugger read/write control methods */ 112*99575102SLv Zheng 113*99575102SLv Zheng #if 0 114*99575102SLv Zheng definition_block("ssdt.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001) 115*99575102SLv Zheng { 116*99575102SLv Zheng method(_T98, 1, not_serialized) { /* Read */ 117*99575102SLv Zheng return (de_ref_of(arg0)) 118*99575102SLv Zheng } 119*99575102SLv Zheng } 120*99575102SLv Zheng 121*99575102SLv Zheng definition_block("ssdt2.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001) 122*99575102SLv Zheng { 123*99575102SLv Zheng method(_T99, 2, not_serialized) { /* Write */ 124*99575102SLv Zheng store(arg1, arg0) 125*99575102SLv Zheng } 126*99575102SLv Zheng } 127*99575102SLv Zheng #endif 128*99575102SLv Zheng 129*99575102SLv Zheng static unsigned char read_method_code[] = { 130*99575102SLv Zheng 0x53, 0x53, 0x44, 0x54, 0x2E, 0x00, 0x00, 0x00, /* 00000000 "SSDT...." */ 131*99575102SLv Zheng 0x02, 0xC9, 0x49, 0x6E, 0x74, 0x65, 0x6C, 0x00, /* 00000008 "..Intel." */ 132*99575102SLv Zheng 0x44, 0x45, 0x42, 0x55, 0x47, 0x00, 0x00, 0x00, /* 00000010 "DEBUG..." */ 133*99575102SLv Zheng 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, /* 00000018 "....INTL" */ 134*99575102SLv Zheng 0x18, 0x12, 0x13, 0x20, 0x14, 0x09, 0x5F, 0x54, /* 00000020 "... .._T" */ 135*99575102SLv Zheng 0x39, 0x38, 0x01, 0xA4, 0x83, 0x68 /* 00000028 "98...h" */ 136*99575102SLv Zheng }; 137*99575102SLv Zheng 138*99575102SLv Zheng static unsigned char write_method_code[] = { 139*99575102SLv Zheng 0x53, 0x53, 0x44, 0x54, 0x2E, 0x00, 0x00, 0x00, /* 00000000 "SSDT...." */ 140*99575102SLv Zheng 0x02, 0x15, 0x49, 0x6E, 0x74, 0x65, 0x6C, 0x00, /* 00000008 "..Intel." */ 141*99575102SLv Zheng 0x44, 0x45, 0x42, 0x55, 0x47, 0x00, 0x00, 0x00, /* 00000010 "DEBUG..." */ 142*99575102SLv Zheng 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, /* 00000018 "....INTL" */ 143*99575102SLv Zheng 0x18, 0x12, 0x13, 0x20, 0x14, 0x09, 0x5F, 0x54, /* 00000020 "... .._T" */ 144*99575102SLv Zheng 0x39, 0x39, 0x02, 0x70, 0x69, 0x68 /* 00000028 "99.pih" */ 145*99575102SLv Zheng }; 146*99575102SLv Zheng 147*99575102SLv Zheng /******************************************************************************* 148*99575102SLv Zheng * 149*99575102SLv Zheng * FUNCTION: acpi_db_execute_test 150*99575102SLv Zheng * 151*99575102SLv Zheng * PARAMETERS: type_arg - Subcommand 152*99575102SLv Zheng * 153*99575102SLv Zheng * RETURN: None 154*99575102SLv Zheng * 155*99575102SLv Zheng * DESCRIPTION: Execute various debug tests. 156*99575102SLv Zheng * 157*99575102SLv Zheng * Note: Code is prepared for future expansion of the TEST command. 158*99575102SLv Zheng * 159*99575102SLv Zheng ******************************************************************************/ 160*99575102SLv Zheng 161*99575102SLv Zheng void acpi_db_execute_test(char *type_arg) 162*99575102SLv Zheng { 163*99575102SLv Zheng u32 temp; 164*99575102SLv Zheng 165*99575102SLv Zheng acpi_ut_strupr(type_arg); 166*99575102SLv Zheng temp = acpi_db_match_argument(type_arg, acpi_db_test_types); 167*99575102SLv Zheng if (temp == ACPI_TYPE_NOT_FOUND) { 168*99575102SLv Zheng acpi_os_printf("Invalid or unsupported argument\n"); 169*99575102SLv Zheng return; 170*99575102SLv Zheng } 171*99575102SLv Zheng 172*99575102SLv Zheng switch (temp) { 173*99575102SLv Zheng case CMD_TEST_OBJECTS: 174*99575102SLv Zheng 175*99575102SLv Zheng acpi_db_test_all_objects(); 176*99575102SLv Zheng break; 177*99575102SLv Zheng 178*99575102SLv Zheng case CMD_TEST_PREDEFINED: 179*99575102SLv Zheng 180*99575102SLv Zheng acpi_db_evaluate_all_predefined_names(NULL); 181*99575102SLv Zheng break; 182*99575102SLv Zheng 183*99575102SLv Zheng default: 184*99575102SLv Zheng break; 185*99575102SLv Zheng } 186*99575102SLv Zheng } 187*99575102SLv Zheng 188*99575102SLv Zheng /******************************************************************************* 189*99575102SLv Zheng * 190*99575102SLv Zheng * FUNCTION: acpi_db_test_all_objects 191*99575102SLv Zheng * 192*99575102SLv Zheng * PARAMETERS: None 193*99575102SLv Zheng * 194*99575102SLv Zheng * RETURN: None 195*99575102SLv Zheng * 196*99575102SLv Zheng * DESCRIPTION: This test implements the OBJECTS subcommand. It exercises the 197*99575102SLv Zheng * namespace by reading/writing/comparing all data objects such 198*99575102SLv Zheng * as integers, strings, buffers, fields, buffer fields, etc. 199*99575102SLv Zheng * 200*99575102SLv Zheng ******************************************************************************/ 201*99575102SLv Zheng 202*99575102SLv Zheng static void acpi_db_test_all_objects(void) 203*99575102SLv Zheng { 204*99575102SLv Zheng acpi_status status; 205*99575102SLv Zheng 206*99575102SLv Zheng /* Install the debugger read-object control method if necessary */ 207*99575102SLv Zheng 208*99575102SLv Zheng if (!read_handle) { 209*99575102SLv Zheng status = acpi_install_method(read_method_code); 210*99575102SLv Zheng if (ACPI_FAILURE(status)) { 211*99575102SLv Zheng acpi_os_printf 212*99575102SLv Zheng ("%s, Could not install debugger read method\n", 213*99575102SLv Zheng acpi_format_exception(status)); 214*99575102SLv Zheng return; 215*99575102SLv Zheng } 216*99575102SLv Zheng 217*99575102SLv Zheng status = 218*99575102SLv Zheng acpi_get_handle(NULL, ACPI_DB_READ_METHOD, &read_handle); 219*99575102SLv Zheng if (ACPI_FAILURE(status)) { 220*99575102SLv Zheng acpi_os_printf 221*99575102SLv Zheng ("Could not obtain handle for debug method %s\n", 222*99575102SLv Zheng ACPI_DB_READ_METHOD); 223*99575102SLv Zheng return; 224*99575102SLv Zheng } 225*99575102SLv Zheng } 226*99575102SLv Zheng 227*99575102SLv Zheng /* Install the debugger write-object control method if necessary */ 228*99575102SLv Zheng 229*99575102SLv Zheng if (!write_handle) { 230*99575102SLv Zheng status = acpi_install_method(write_method_code); 231*99575102SLv Zheng if (ACPI_FAILURE(status)) { 232*99575102SLv Zheng acpi_os_printf 233*99575102SLv Zheng ("%s, Could not install debugger write method\n", 234*99575102SLv Zheng acpi_format_exception(status)); 235*99575102SLv Zheng return; 236*99575102SLv Zheng } 237*99575102SLv Zheng 238*99575102SLv Zheng status = 239*99575102SLv Zheng acpi_get_handle(NULL, ACPI_DB_WRITE_METHOD, &write_handle); 240*99575102SLv Zheng if (ACPI_FAILURE(status)) { 241*99575102SLv Zheng acpi_os_printf 242*99575102SLv Zheng ("Could not obtain handle for debug method %s\n", 243*99575102SLv Zheng ACPI_DB_WRITE_METHOD); 244*99575102SLv Zheng return; 245*99575102SLv Zheng } 246*99575102SLv Zheng } 247*99575102SLv Zheng 248*99575102SLv Zheng /* Walk the entire namespace, testing each supported named data object */ 249*99575102SLv Zheng 250*99575102SLv Zheng (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 251*99575102SLv Zheng ACPI_UINT32_MAX, acpi_db_test_one_object, 252*99575102SLv Zheng NULL, NULL, NULL); 253*99575102SLv Zheng } 254*99575102SLv Zheng 255*99575102SLv Zheng /******************************************************************************* 256*99575102SLv Zheng * 257*99575102SLv Zheng * FUNCTION: acpi_db_test_one_object 258*99575102SLv Zheng * 259*99575102SLv Zheng * PARAMETERS: acpi_walk_callback 260*99575102SLv Zheng * 261*99575102SLv Zheng * RETURN: Status 262*99575102SLv Zheng * 263*99575102SLv Zheng * DESCRIPTION: Test one namespace object. Supported types are Integer, 264*99575102SLv Zheng * String, Buffer, buffer_field, and field_unit. All other object 265*99575102SLv Zheng * types are simply ignored. 266*99575102SLv Zheng * 267*99575102SLv Zheng * Note: Support for Packages is not implemented. 268*99575102SLv Zheng * 269*99575102SLv Zheng ******************************************************************************/ 270*99575102SLv Zheng 271*99575102SLv Zheng static acpi_status 272*99575102SLv Zheng acpi_db_test_one_object(acpi_handle obj_handle, 273*99575102SLv Zheng u32 nesting_level, void *context, void **return_value) 274*99575102SLv Zheng { 275*99575102SLv Zheng struct acpi_namespace_node *node; 276*99575102SLv Zheng union acpi_operand_object *obj_desc; 277*99575102SLv Zheng union acpi_operand_object *region_obj; 278*99575102SLv Zheng acpi_object_type local_type; 279*99575102SLv Zheng u32 bit_length = 0; 280*99575102SLv Zheng u32 byte_length = 0; 281*99575102SLv Zheng acpi_status status = AE_OK; 282*99575102SLv Zheng 283*99575102SLv Zheng node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle); 284*99575102SLv Zheng obj_desc = node->object; 285*99575102SLv Zheng 286*99575102SLv Zheng /* 287*99575102SLv Zheng * For the supported types, get the actual bit length or 288*99575102SLv Zheng * byte length. Map the type to one of Integer/String/Buffer. 289*99575102SLv Zheng */ 290*99575102SLv Zheng switch (node->type) { 291*99575102SLv Zheng case ACPI_TYPE_INTEGER: 292*99575102SLv Zheng 293*99575102SLv Zheng /* Integer width is either 32 or 64 */ 294*99575102SLv Zheng 295*99575102SLv Zheng local_type = ACPI_TYPE_INTEGER; 296*99575102SLv Zheng bit_length = acpi_gbl_integer_bit_width; 297*99575102SLv Zheng break; 298*99575102SLv Zheng 299*99575102SLv Zheng case ACPI_TYPE_STRING: 300*99575102SLv Zheng 301*99575102SLv Zheng local_type = ACPI_TYPE_STRING; 302*99575102SLv Zheng byte_length = obj_desc->string.length; 303*99575102SLv Zheng break; 304*99575102SLv Zheng 305*99575102SLv Zheng case ACPI_TYPE_BUFFER: 306*99575102SLv Zheng 307*99575102SLv Zheng local_type = ACPI_TYPE_BUFFER; 308*99575102SLv Zheng byte_length = obj_desc->buffer.length; 309*99575102SLv Zheng bit_length = byte_length * 8; 310*99575102SLv Zheng break; 311*99575102SLv Zheng 312*99575102SLv Zheng case ACPI_TYPE_FIELD_UNIT: 313*99575102SLv Zheng case ACPI_TYPE_BUFFER_FIELD: 314*99575102SLv Zheng case ACPI_TYPE_LOCAL_REGION_FIELD: 315*99575102SLv Zheng case ACPI_TYPE_LOCAL_INDEX_FIELD: 316*99575102SLv Zheng case ACPI_TYPE_LOCAL_BANK_FIELD: 317*99575102SLv Zheng 318*99575102SLv Zheng local_type = ACPI_TYPE_INTEGER; 319*99575102SLv Zheng if (obj_desc) { 320*99575102SLv Zheng /* 321*99575102SLv Zheng * Returned object will be a Buffer if the field length 322*99575102SLv Zheng * is larger than the size of an Integer (32 or 64 bits 323*99575102SLv Zheng * depending on the DSDT version). 324*99575102SLv Zheng */ 325*99575102SLv Zheng bit_length = obj_desc->common_field.bit_length; 326*99575102SLv Zheng byte_length = ACPI_ROUND_BITS_UP_TO_BYTES(bit_length); 327*99575102SLv Zheng if (bit_length > acpi_gbl_integer_bit_width) { 328*99575102SLv Zheng local_type = ACPI_TYPE_BUFFER; 329*99575102SLv Zheng } 330*99575102SLv Zheng } 331*99575102SLv Zheng break; 332*99575102SLv Zheng 333*99575102SLv Zheng default: 334*99575102SLv Zheng 335*99575102SLv Zheng /* Ignore all other types */ 336*99575102SLv Zheng 337*99575102SLv Zheng return (AE_OK); 338*99575102SLv Zheng } 339*99575102SLv Zheng 340*99575102SLv Zheng /* Emit the common prefix: Type:Name */ 341*99575102SLv Zheng 342*99575102SLv Zheng acpi_os_printf("%14s: %4.4s", 343*99575102SLv Zheng acpi_ut_get_type_name(node->type), node->name.ascii); 344*99575102SLv Zheng if (!obj_desc) { 345*99575102SLv Zheng acpi_os_printf(" Ignoring, no attached object\n"); 346*99575102SLv Zheng return (AE_OK); 347*99575102SLv Zheng } 348*99575102SLv Zheng 349*99575102SLv Zheng /* 350*99575102SLv Zheng * Check for unsupported region types. Note: acpi_exec simulates 351*99575102SLv Zheng * access to system_memory, system_IO, PCI_Config, and EC. 352*99575102SLv Zheng */ 353*99575102SLv Zheng switch (node->type) { 354*99575102SLv Zheng case ACPI_TYPE_LOCAL_REGION_FIELD: 355*99575102SLv Zheng 356*99575102SLv Zheng region_obj = obj_desc->field.region_obj; 357*99575102SLv Zheng switch (region_obj->region.space_id) { 358*99575102SLv Zheng case ACPI_ADR_SPACE_SYSTEM_MEMORY: 359*99575102SLv Zheng case ACPI_ADR_SPACE_SYSTEM_IO: 360*99575102SLv Zheng case ACPI_ADR_SPACE_PCI_CONFIG: 361*99575102SLv Zheng case ACPI_ADR_SPACE_EC: 362*99575102SLv Zheng 363*99575102SLv Zheng break; 364*99575102SLv Zheng 365*99575102SLv Zheng default: 366*99575102SLv Zheng 367*99575102SLv Zheng acpi_os_printf 368*99575102SLv Zheng (" %s space is not supported [%4.4s]\n", 369*99575102SLv Zheng acpi_ut_get_region_name(region_obj->region. 370*99575102SLv Zheng space_id), 371*99575102SLv Zheng region_obj->region.node->name.ascii); 372*99575102SLv Zheng return (AE_OK); 373*99575102SLv Zheng } 374*99575102SLv Zheng break; 375*99575102SLv Zheng 376*99575102SLv Zheng default: 377*99575102SLv Zheng break; 378*99575102SLv Zheng } 379*99575102SLv Zheng 380*99575102SLv Zheng /* At this point, we have resolved the object to one of the major types */ 381*99575102SLv Zheng 382*99575102SLv Zheng switch (local_type) { 383*99575102SLv Zheng case ACPI_TYPE_INTEGER: 384*99575102SLv Zheng 385*99575102SLv Zheng status = acpi_db_test_integer_type(node, bit_length); 386*99575102SLv Zheng break; 387*99575102SLv Zheng 388*99575102SLv Zheng case ACPI_TYPE_STRING: 389*99575102SLv Zheng 390*99575102SLv Zheng status = acpi_db_test_string_type(node, byte_length); 391*99575102SLv Zheng break; 392*99575102SLv Zheng 393*99575102SLv Zheng case ACPI_TYPE_BUFFER: 394*99575102SLv Zheng 395*99575102SLv Zheng status = acpi_db_test_buffer_type(node, bit_length); 396*99575102SLv Zheng break; 397*99575102SLv Zheng 398*99575102SLv Zheng default: 399*99575102SLv Zheng 400*99575102SLv Zheng acpi_os_printf(" Ignoring, type not implemented (%2.2X)", 401*99575102SLv Zheng local_type); 402*99575102SLv Zheng break; 403*99575102SLv Zheng } 404*99575102SLv Zheng 405*99575102SLv Zheng switch (node->type) { 406*99575102SLv Zheng case ACPI_TYPE_LOCAL_REGION_FIELD: 407*99575102SLv Zheng 408*99575102SLv Zheng region_obj = obj_desc->field.region_obj; 409*99575102SLv Zheng acpi_os_printf(" (%s)", 410*99575102SLv Zheng acpi_ut_get_region_name(region_obj->region. 411*99575102SLv Zheng space_id)); 412*99575102SLv Zheng break; 413*99575102SLv Zheng 414*99575102SLv Zheng default: 415*99575102SLv Zheng break; 416*99575102SLv Zheng } 417*99575102SLv Zheng 418*99575102SLv Zheng acpi_os_printf("\n"); 419*99575102SLv Zheng return (status); 420*99575102SLv Zheng } 421*99575102SLv Zheng 422*99575102SLv Zheng /******************************************************************************* 423*99575102SLv Zheng * 424*99575102SLv Zheng * FUNCTION: acpi_db_test_integer_type 425*99575102SLv Zheng * 426*99575102SLv Zheng * PARAMETERS: node - Parent NS node for the object 427*99575102SLv Zheng * bit_length - Actual length of the object. Used for 428*99575102SLv Zheng * support of arbitrary length field_unit 429*99575102SLv Zheng * and buffer_field objects. 430*99575102SLv Zheng * 431*99575102SLv Zheng * RETURN: Status 432*99575102SLv Zheng * 433*99575102SLv Zheng * DESCRIPTION: Test read/write for an Integer-valued object. Performs a 434*99575102SLv Zheng * write/read/compare of an arbitrary new value, then performs 435*99575102SLv Zheng * a write/read/compare of the original value. 436*99575102SLv Zheng * 437*99575102SLv Zheng ******************************************************************************/ 438*99575102SLv Zheng 439*99575102SLv Zheng static acpi_status 440*99575102SLv Zheng acpi_db_test_integer_type(struct acpi_namespace_node *node, u32 bit_length) 441*99575102SLv Zheng { 442*99575102SLv Zheng union acpi_object *temp1 = NULL; 443*99575102SLv Zheng union acpi_object *temp2 = NULL; 444*99575102SLv Zheng union acpi_object *temp3 = NULL; 445*99575102SLv Zheng union acpi_object write_value; 446*99575102SLv Zheng u64 value_to_write; 447*99575102SLv Zheng acpi_status status; 448*99575102SLv Zheng 449*99575102SLv Zheng if (bit_length > 64) { 450*99575102SLv Zheng acpi_os_printf(" Invalid length for an Integer: %u", 451*99575102SLv Zheng bit_length); 452*99575102SLv Zheng return (AE_OK); 453*99575102SLv Zheng } 454*99575102SLv Zheng 455*99575102SLv Zheng /* Read the original value */ 456*99575102SLv Zheng 457*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_INTEGER, &temp1); 458*99575102SLv Zheng if (ACPI_FAILURE(status)) { 459*99575102SLv Zheng return (status); 460*99575102SLv Zheng } 461*99575102SLv Zheng 462*99575102SLv Zheng acpi_os_printf(" (%4.4X/%3.3X) %8.8X%8.8X", 463*99575102SLv Zheng bit_length, ACPI_ROUND_BITS_UP_TO_BYTES(bit_length), 464*99575102SLv Zheng ACPI_FORMAT_UINT64(temp1->integer.value)); 465*99575102SLv Zheng 466*99575102SLv Zheng value_to_write = ACPI_UINT64_MAX >> (64 - bit_length); 467*99575102SLv Zheng if (temp1->integer.value == value_to_write) { 468*99575102SLv Zheng value_to_write = 0; 469*99575102SLv Zheng } 470*99575102SLv Zheng 471*99575102SLv Zheng /* Write a new value */ 472*99575102SLv Zheng 473*99575102SLv Zheng write_value.type = ACPI_TYPE_INTEGER; 474*99575102SLv Zheng write_value.integer.value = value_to_write; 475*99575102SLv Zheng status = acpi_db_write_to_object(node, &write_value); 476*99575102SLv Zheng if (ACPI_FAILURE(status)) { 477*99575102SLv Zheng goto exit; 478*99575102SLv Zheng } 479*99575102SLv Zheng 480*99575102SLv Zheng /* Ensure that we can read back the new value */ 481*99575102SLv Zheng 482*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_INTEGER, &temp2); 483*99575102SLv Zheng if (ACPI_FAILURE(status)) { 484*99575102SLv Zheng goto exit; 485*99575102SLv Zheng } 486*99575102SLv Zheng 487*99575102SLv Zheng if (temp2->integer.value != value_to_write) { 488*99575102SLv Zheng acpi_os_printf(" MISMATCH 2: %8.8X%8.8X, expecting %8.8X%8.8X", 489*99575102SLv Zheng ACPI_FORMAT_UINT64(temp2->integer.value), 490*99575102SLv Zheng ACPI_FORMAT_UINT64(value_to_write)); 491*99575102SLv Zheng } 492*99575102SLv Zheng 493*99575102SLv Zheng /* Write back the original value */ 494*99575102SLv Zheng 495*99575102SLv Zheng write_value.integer.value = temp1->integer.value; 496*99575102SLv Zheng status = acpi_db_write_to_object(node, &write_value); 497*99575102SLv Zheng if (ACPI_FAILURE(status)) { 498*99575102SLv Zheng goto exit; 499*99575102SLv Zheng } 500*99575102SLv Zheng 501*99575102SLv Zheng /* Ensure that we can read back the original value */ 502*99575102SLv Zheng 503*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_INTEGER, &temp3); 504*99575102SLv Zheng if (ACPI_FAILURE(status)) { 505*99575102SLv Zheng goto exit; 506*99575102SLv Zheng } 507*99575102SLv Zheng 508*99575102SLv Zheng if (temp3->integer.value != temp1->integer.value) { 509*99575102SLv Zheng acpi_os_printf(" MISMATCH 3: %8.8X%8.8X, expecting %8.8X%8.8X", 510*99575102SLv Zheng ACPI_FORMAT_UINT64(temp3->integer.value), 511*99575102SLv Zheng ACPI_FORMAT_UINT64(temp1->integer.value)); 512*99575102SLv Zheng } 513*99575102SLv Zheng 514*99575102SLv Zheng exit: 515*99575102SLv Zheng if (temp1) { 516*99575102SLv Zheng acpi_os_free(temp1); 517*99575102SLv Zheng } 518*99575102SLv Zheng if (temp2) { 519*99575102SLv Zheng acpi_os_free(temp2); 520*99575102SLv Zheng } 521*99575102SLv Zheng if (temp3) { 522*99575102SLv Zheng acpi_os_free(temp3); 523*99575102SLv Zheng } 524*99575102SLv Zheng return (AE_OK); 525*99575102SLv Zheng } 526*99575102SLv Zheng 527*99575102SLv Zheng /******************************************************************************* 528*99575102SLv Zheng * 529*99575102SLv Zheng * FUNCTION: acpi_db_test_buffer_type 530*99575102SLv Zheng * 531*99575102SLv Zheng * PARAMETERS: node - Parent NS node for the object 532*99575102SLv Zheng * bit_length - Actual length of the object. 533*99575102SLv Zheng * 534*99575102SLv Zheng * RETURN: Status 535*99575102SLv Zheng * 536*99575102SLv Zheng * DESCRIPTION: Test read/write for an Buffer-valued object. Performs a 537*99575102SLv Zheng * write/read/compare of an arbitrary new value, then performs 538*99575102SLv Zheng * a write/read/compare of the original value. 539*99575102SLv Zheng * 540*99575102SLv Zheng ******************************************************************************/ 541*99575102SLv Zheng 542*99575102SLv Zheng static acpi_status 543*99575102SLv Zheng acpi_db_test_buffer_type(struct acpi_namespace_node *node, u32 bit_length) 544*99575102SLv Zheng { 545*99575102SLv Zheng union acpi_object *temp1 = NULL; 546*99575102SLv Zheng union acpi_object *temp2 = NULL; 547*99575102SLv Zheng union acpi_object *temp3 = NULL; 548*99575102SLv Zheng u8 *buffer; 549*99575102SLv Zheng union acpi_object write_value; 550*99575102SLv Zheng acpi_status status; 551*99575102SLv Zheng u32 byte_length; 552*99575102SLv Zheng u32 i; 553*99575102SLv Zheng u8 extra_bits; 554*99575102SLv Zheng 555*99575102SLv Zheng byte_length = ACPI_ROUND_BITS_UP_TO_BYTES(bit_length); 556*99575102SLv Zheng if (byte_length == 0) { 557*99575102SLv Zheng acpi_os_printf(" Ignoring zero length buffer"); 558*99575102SLv Zheng return (AE_OK); 559*99575102SLv Zheng } 560*99575102SLv Zheng 561*99575102SLv Zheng /* Allocate a local buffer */ 562*99575102SLv Zheng 563*99575102SLv Zheng buffer = ACPI_ALLOCATE_ZEROED(byte_length); 564*99575102SLv Zheng if (!buffer) { 565*99575102SLv Zheng return (AE_NO_MEMORY); 566*99575102SLv Zheng } 567*99575102SLv Zheng 568*99575102SLv Zheng /* Read the original value */ 569*99575102SLv Zheng 570*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_BUFFER, &temp1); 571*99575102SLv Zheng if (ACPI_FAILURE(status)) { 572*99575102SLv Zheng goto exit; 573*99575102SLv Zheng } 574*99575102SLv Zheng 575*99575102SLv Zheng /* Emit a few bytes of the buffer */ 576*99575102SLv Zheng 577*99575102SLv Zheng acpi_os_printf(" (%4.4X/%3.3X)", bit_length, temp1->buffer.length); 578*99575102SLv Zheng for (i = 0; ((i < 4) && (i < byte_length)); i++) { 579*99575102SLv Zheng acpi_os_printf(" %2.2X", temp1->buffer.pointer[i]); 580*99575102SLv Zheng } 581*99575102SLv Zheng acpi_os_printf("... "); 582*99575102SLv Zheng 583*99575102SLv Zheng /* 584*99575102SLv Zheng * Write a new value. 585*99575102SLv Zheng * 586*99575102SLv Zheng * Handle possible extra bits at the end of the buffer. Can 587*99575102SLv Zheng * happen for field_units larger than an integer, but the bit 588*99575102SLv Zheng * count is not an integral number of bytes. Zero out the 589*99575102SLv Zheng * unused bits. 590*99575102SLv Zheng */ 591*99575102SLv Zheng memset(buffer, BUFFER_FILL_VALUE, byte_length); 592*99575102SLv Zheng extra_bits = bit_length % 8; 593*99575102SLv Zheng if (extra_bits) { 594*99575102SLv Zheng buffer[byte_length - 1] = ACPI_MASK_BITS_ABOVE(extra_bits); 595*99575102SLv Zheng } 596*99575102SLv Zheng 597*99575102SLv Zheng write_value.type = ACPI_TYPE_BUFFER; 598*99575102SLv Zheng write_value.buffer.length = byte_length; 599*99575102SLv Zheng write_value.buffer.pointer = buffer; 600*99575102SLv Zheng 601*99575102SLv Zheng status = acpi_db_write_to_object(node, &write_value); 602*99575102SLv Zheng if (ACPI_FAILURE(status)) { 603*99575102SLv Zheng goto exit; 604*99575102SLv Zheng } 605*99575102SLv Zheng 606*99575102SLv Zheng /* Ensure that we can read back the new value */ 607*99575102SLv Zheng 608*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_BUFFER, &temp2); 609*99575102SLv Zheng if (ACPI_FAILURE(status)) { 610*99575102SLv Zheng goto exit; 611*99575102SLv Zheng } 612*99575102SLv Zheng 613*99575102SLv Zheng if (memcmp(temp2->buffer.pointer, buffer, byte_length)) { 614*99575102SLv Zheng acpi_os_printf(" MISMATCH 2: New buffer value"); 615*99575102SLv Zheng } 616*99575102SLv Zheng 617*99575102SLv Zheng /* Write back the original value */ 618*99575102SLv Zheng 619*99575102SLv Zheng write_value.buffer.length = byte_length; 620*99575102SLv Zheng write_value.buffer.pointer = temp1->buffer.pointer; 621*99575102SLv Zheng 622*99575102SLv Zheng status = acpi_db_write_to_object(node, &write_value); 623*99575102SLv Zheng if (ACPI_FAILURE(status)) { 624*99575102SLv Zheng goto exit; 625*99575102SLv Zheng } 626*99575102SLv Zheng 627*99575102SLv Zheng /* Ensure that we can read back the original value */ 628*99575102SLv Zheng 629*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_BUFFER, &temp3); 630*99575102SLv Zheng if (ACPI_FAILURE(status)) { 631*99575102SLv Zheng goto exit; 632*99575102SLv Zheng } 633*99575102SLv Zheng 634*99575102SLv Zheng if (memcmp(temp1->buffer.pointer, temp3->buffer.pointer, byte_length)) { 635*99575102SLv Zheng acpi_os_printf(" MISMATCH 3: While restoring original buffer"); 636*99575102SLv Zheng } 637*99575102SLv Zheng 638*99575102SLv Zheng exit: 639*99575102SLv Zheng ACPI_FREE(buffer); 640*99575102SLv Zheng if (temp1) { 641*99575102SLv Zheng acpi_os_free(temp1); 642*99575102SLv Zheng } 643*99575102SLv Zheng if (temp2) { 644*99575102SLv Zheng acpi_os_free(temp2); 645*99575102SLv Zheng } 646*99575102SLv Zheng if (temp3) { 647*99575102SLv Zheng acpi_os_free(temp3); 648*99575102SLv Zheng } 649*99575102SLv Zheng return (status); 650*99575102SLv Zheng } 651*99575102SLv Zheng 652*99575102SLv Zheng /******************************************************************************* 653*99575102SLv Zheng * 654*99575102SLv Zheng * FUNCTION: acpi_db_test_string_type 655*99575102SLv Zheng * 656*99575102SLv Zheng * PARAMETERS: node - Parent NS node for the object 657*99575102SLv Zheng * byte_length - Actual length of the object. 658*99575102SLv Zheng * 659*99575102SLv Zheng * RETURN: Status 660*99575102SLv Zheng * 661*99575102SLv Zheng * DESCRIPTION: Test read/write for an String-valued object. Performs a 662*99575102SLv Zheng * write/read/compare of an arbitrary new value, then performs 663*99575102SLv Zheng * a write/read/compare of the original value. 664*99575102SLv Zheng * 665*99575102SLv Zheng ******************************************************************************/ 666*99575102SLv Zheng 667*99575102SLv Zheng static acpi_status 668*99575102SLv Zheng acpi_db_test_string_type(struct acpi_namespace_node *node, u32 byte_length) 669*99575102SLv Zheng { 670*99575102SLv Zheng union acpi_object *temp1 = NULL; 671*99575102SLv Zheng union acpi_object *temp2 = NULL; 672*99575102SLv Zheng union acpi_object *temp3 = NULL; 673*99575102SLv Zheng char *value_to_write = "Test String from AML Debugger"; 674*99575102SLv Zheng union acpi_object write_value; 675*99575102SLv Zheng acpi_status status; 676*99575102SLv Zheng 677*99575102SLv Zheng /* Read the original value */ 678*99575102SLv Zheng 679*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_STRING, &temp1); 680*99575102SLv Zheng if (ACPI_FAILURE(status)) { 681*99575102SLv Zheng return (status); 682*99575102SLv Zheng } 683*99575102SLv Zheng 684*99575102SLv Zheng acpi_os_printf(" (%4.4X/%3.3X) \"%s\"", (temp1->string.length * 8), 685*99575102SLv Zheng temp1->string.length, temp1->string.pointer); 686*99575102SLv Zheng 687*99575102SLv Zheng /* Write a new value */ 688*99575102SLv Zheng 689*99575102SLv Zheng write_value.type = ACPI_TYPE_STRING; 690*99575102SLv Zheng write_value.string.length = strlen(value_to_write); 691*99575102SLv Zheng write_value.string.pointer = value_to_write; 692*99575102SLv Zheng 693*99575102SLv Zheng status = acpi_db_write_to_object(node, &write_value); 694*99575102SLv Zheng if (ACPI_FAILURE(status)) { 695*99575102SLv Zheng goto exit; 696*99575102SLv Zheng } 697*99575102SLv Zheng 698*99575102SLv Zheng /* Ensure that we can read back the new value */ 699*99575102SLv Zheng 700*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_STRING, &temp2); 701*99575102SLv Zheng if (ACPI_FAILURE(status)) { 702*99575102SLv Zheng goto exit; 703*99575102SLv Zheng } 704*99575102SLv Zheng 705*99575102SLv Zheng if (strcmp(temp2->string.pointer, value_to_write)) { 706*99575102SLv Zheng acpi_os_printf(" MISMATCH 2: %s, expecting %s", 707*99575102SLv Zheng temp2->string.pointer, value_to_write); 708*99575102SLv Zheng } 709*99575102SLv Zheng 710*99575102SLv Zheng /* Write back the original value */ 711*99575102SLv Zheng 712*99575102SLv Zheng write_value.string.length = strlen(temp1->string.pointer); 713*99575102SLv Zheng write_value.string.pointer = temp1->string.pointer; 714*99575102SLv Zheng 715*99575102SLv Zheng status = acpi_db_write_to_object(node, &write_value); 716*99575102SLv Zheng if (ACPI_FAILURE(status)) { 717*99575102SLv Zheng goto exit; 718*99575102SLv Zheng } 719*99575102SLv Zheng 720*99575102SLv Zheng /* Ensure that we can read back the original value */ 721*99575102SLv Zheng 722*99575102SLv Zheng status = acpi_db_read_from_object(node, ACPI_TYPE_STRING, &temp3); 723*99575102SLv Zheng if (ACPI_FAILURE(status)) { 724*99575102SLv Zheng goto exit; 725*99575102SLv Zheng } 726*99575102SLv Zheng 727*99575102SLv Zheng if (strcmp(temp1->string.pointer, temp3->string.pointer)) { 728*99575102SLv Zheng acpi_os_printf(" MISMATCH 3: %s, expecting %s", 729*99575102SLv Zheng temp3->string.pointer, temp1->string.pointer); 730*99575102SLv Zheng } 731*99575102SLv Zheng 732*99575102SLv Zheng exit: 733*99575102SLv Zheng if (temp1) { 734*99575102SLv Zheng acpi_os_free(temp1); 735*99575102SLv Zheng } 736*99575102SLv Zheng if (temp2) { 737*99575102SLv Zheng acpi_os_free(temp2); 738*99575102SLv Zheng } 739*99575102SLv Zheng if (temp3) { 740*99575102SLv Zheng acpi_os_free(temp3); 741*99575102SLv Zheng } 742*99575102SLv Zheng return (status); 743*99575102SLv Zheng } 744*99575102SLv Zheng 745*99575102SLv Zheng /******************************************************************************* 746*99575102SLv Zheng * 747*99575102SLv Zheng * FUNCTION: acpi_db_read_from_object 748*99575102SLv Zheng * 749*99575102SLv Zheng * PARAMETERS: node - Parent NS node for the object 750*99575102SLv Zheng * expected_type - Object type expected from the read 751*99575102SLv Zheng * value - Where the value read is returned 752*99575102SLv Zheng * 753*99575102SLv Zheng * RETURN: Status 754*99575102SLv Zheng * 755*99575102SLv Zheng * DESCRIPTION: Performs a read from the specified object by invoking the 756*99575102SLv Zheng * special debugger control method that reads the object. Thus, 757*99575102SLv Zheng * the AML interpreter is doing all of the work, increasing the 758*99575102SLv Zheng * validity of the test. 759*99575102SLv Zheng * 760*99575102SLv Zheng ******************************************************************************/ 761*99575102SLv Zheng 762*99575102SLv Zheng static acpi_status 763*99575102SLv Zheng acpi_db_read_from_object(struct acpi_namespace_node *node, 764*99575102SLv Zheng acpi_object_type expected_type, 765*99575102SLv Zheng union acpi_object **value) 766*99575102SLv Zheng { 767*99575102SLv Zheng union acpi_object *ret_value; 768*99575102SLv Zheng struct acpi_object_list param_objects; 769*99575102SLv Zheng union acpi_object params[2]; 770*99575102SLv Zheng struct acpi_buffer return_obj; 771*99575102SLv Zheng acpi_status status; 772*99575102SLv Zheng 773*99575102SLv Zheng params[0].type = ACPI_TYPE_LOCAL_REFERENCE; 774*99575102SLv Zheng params[0].reference.actual_type = node->type; 775*99575102SLv Zheng params[0].reference.handle = ACPI_CAST_PTR(acpi_handle, node); 776*99575102SLv Zheng 777*99575102SLv Zheng param_objects.count = 1; 778*99575102SLv Zheng param_objects.pointer = params; 779*99575102SLv Zheng 780*99575102SLv Zheng return_obj.length = ACPI_ALLOCATE_BUFFER; 781*99575102SLv Zheng 782*99575102SLv Zheng acpi_gbl_method_executing = TRUE; 783*99575102SLv Zheng status = acpi_evaluate_object(read_handle, NULL, 784*99575102SLv Zheng ¶m_objects, &return_obj); 785*99575102SLv Zheng acpi_gbl_method_executing = FALSE; 786*99575102SLv Zheng 787*99575102SLv Zheng if (ACPI_FAILURE(status)) { 788*99575102SLv Zheng acpi_os_printf("Could not read from object, %s", 789*99575102SLv Zheng acpi_format_exception(status)); 790*99575102SLv Zheng return (status); 791*99575102SLv Zheng } 792*99575102SLv Zheng 793*99575102SLv Zheng ret_value = (union acpi_object *)return_obj.pointer; 794*99575102SLv Zheng 795*99575102SLv Zheng switch (ret_value->type) { 796*99575102SLv Zheng case ACPI_TYPE_INTEGER: 797*99575102SLv Zheng case ACPI_TYPE_BUFFER: 798*99575102SLv Zheng case ACPI_TYPE_STRING: 799*99575102SLv Zheng /* 800*99575102SLv Zheng * Did we receive the type we wanted? Most important for the 801*99575102SLv Zheng * Integer/Buffer case (when a field is larger than an Integer, 802*99575102SLv Zheng * it should return a Buffer). 803*99575102SLv Zheng */ 804*99575102SLv Zheng if (ret_value->type != expected_type) { 805*99575102SLv Zheng acpi_os_printf 806*99575102SLv Zheng (" Type mismatch: Expected %s, Received %s", 807*99575102SLv Zheng acpi_ut_get_type_name(expected_type), 808*99575102SLv Zheng acpi_ut_get_type_name(ret_value->type)); 809*99575102SLv Zheng 810*99575102SLv Zheng return (AE_TYPE); 811*99575102SLv Zheng } 812*99575102SLv Zheng 813*99575102SLv Zheng *value = ret_value; 814*99575102SLv Zheng break; 815*99575102SLv Zheng 816*99575102SLv Zheng default: 817*99575102SLv Zheng 818*99575102SLv Zheng acpi_os_printf(" Unsupported return object type, %s", 819*99575102SLv Zheng acpi_ut_get_type_name(ret_value->type)); 820*99575102SLv Zheng 821*99575102SLv Zheng acpi_os_free(return_obj.pointer); 822*99575102SLv Zheng return (AE_TYPE); 823*99575102SLv Zheng } 824*99575102SLv Zheng 825*99575102SLv Zheng return (status); 826*99575102SLv Zheng } 827*99575102SLv Zheng 828*99575102SLv Zheng /******************************************************************************* 829*99575102SLv Zheng * 830*99575102SLv Zheng * FUNCTION: acpi_db_write_to_object 831*99575102SLv Zheng * 832*99575102SLv Zheng * PARAMETERS: node - Parent NS node for the object 833*99575102SLv Zheng * value - Value to be written 834*99575102SLv Zheng * 835*99575102SLv Zheng * RETURN: Status 836*99575102SLv Zheng * 837*99575102SLv Zheng * DESCRIPTION: Performs a write to the specified object by invoking the 838*99575102SLv Zheng * special debugger control method that writes the object. Thus, 839*99575102SLv Zheng * the AML interpreter is doing all of the work, increasing the 840*99575102SLv Zheng * validity of the test. 841*99575102SLv Zheng * 842*99575102SLv Zheng ******************************************************************************/ 843*99575102SLv Zheng 844*99575102SLv Zheng static acpi_status 845*99575102SLv Zheng acpi_db_write_to_object(struct acpi_namespace_node *node, 846*99575102SLv Zheng union acpi_object *value) 847*99575102SLv Zheng { 848*99575102SLv Zheng struct acpi_object_list param_objects; 849*99575102SLv Zheng union acpi_object params[2]; 850*99575102SLv Zheng acpi_status status; 851*99575102SLv Zheng 852*99575102SLv Zheng params[0].type = ACPI_TYPE_LOCAL_REFERENCE; 853*99575102SLv Zheng params[0].reference.actual_type = node->type; 854*99575102SLv Zheng params[0].reference.handle = ACPI_CAST_PTR(acpi_handle, node); 855*99575102SLv Zheng 856*99575102SLv Zheng /* Copy the incoming user parameter */ 857*99575102SLv Zheng 858*99575102SLv Zheng memcpy(¶ms[1], value, sizeof(union acpi_object)); 859*99575102SLv Zheng 860*99575102SLv Zheng param_objects.count = 2; 861*99575102SLv Zheng param_objects.pointer = params; 862*99575102SLv Zheng 863*99575102SLv Zheng acpi_gbl_method_executing = TRUE; 864*99575102SLv Zheng status = acpi_evaluate_object(write_handle, NULL, ¶m_objects, NULL); 865*99575102SLv Zheng acpi_gbl_method_executing = FALSE; 866*99575102SLv Zheng 867*99575102SLv Zheng if (ACPI_FAILURE(status)) { 868*99575102SLv Zheng acpi_os_printf("Could not write to object, %s", 869*99575102SLv Zheng acpi_format_exception(status)); 870*99575102SLv Zheng } 871*99575102SLv Zheng 872*99575102SLv Zheng return (status); 873*99575102SLv Zheng } 874*99575102SLv Zheng 875*99575102SLv Zheng /******************************************************************************* 876*99575102SLv Zheng * 877*99575102SLv Zheng * FUNCTION: acpi_db_evaluate_all_predefined_names 878*99575102SLv Zheng * 879*99575102SLv Zheng * PARAMETERS: count_arg - Max number of methods to execute 880*99575102SLv Zheng * 881*99575102SLv Zheng * RETURN: None 882*99575102SLv Zheng * 883*99575102SLv Zheng * DESCRIPTION: Namespace batch execution. Execute predefined names in the 884*99575102SLv Zheng * namespace, up to the max count, if specified. 885*99575102SLv Zheng * 886*99575102SLv Zheng ******************************************************************************/ 887*99575102SLv Zheng 888*99575102SLv Zheng static void acpi_db_evaluate_all_predefined_names(char *count_arg) 889*99575102SLv Zheng { 890*99575102SLv Zheng struct acpi_db_execute_walk info; 891*99575102SLv Zheng 892*99575102SLv Zheng info.count = 0; 893*99575102SLv Zheng info.max_count = ACPI_UINT32_MAX; 894*99575102SLv Zheng 895*99575102SLv Zheng if (count_arg) { 896*99575102SLv Zheng info.max_count = strtoul(count_arg, NULL, 0); 897*99575102SLv Zheng } 898*99575102SLv Zheng 899*99575102SLv Zheng /* Search all nodes in namespace */ 900*99575102SLv Zheng 901*99575102SLv Zheng (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 902*99575102SLv Zheng ACPI_UINT32_MAX, 903*99575102SLv Zheng acpi_db_evaluate_one_predefined_name, NULL, 904*99575102SLv Zheng (void *)&info, NULL); 905*99575102SLv Zheng 906*99575102SLv Zheng acpi_os_printf("Evaluated %u predefined names in the namespace\n", 907*99575102SLv Zheng info.count); 908*99575102SLv Zheng } 909*99575102SLv Zheng 910*99575102SLv Zheng /******************************************************************************* 911*99575102SLv Zheng * 912*99575102SLv Zheng * FUNCTION: acpi_db_evaluate_one_predefined_name 913*99575102SLv Zheng * 914*99575102SLv Zheng * PARAMETERS: Callback from walk_namespace 915*99575102SLv Zheng * 916*99575102SLv Zheng * RETURN: Status 917*99575102SLv Zheng * 918*99575102SLv Zheng * DESCRIPTION: Batch execution module. Currently only executes predefined 919*99575102SLv Zheng * ACPI names. 920*99575102SLv Zheng * 921*99575102SLv Zheng ******************************************************************************/ 922*99575102SLv Zheng 923*99575102SLv Zheng static acpi_status 924*99575102SLv Zheng acpi_db_evaluate_one_predefined_name(acpi_handle obj_handle, 925*99575102SLv Zheng u32 nesting_level, 926*99575102SLv Zheng void *context, void **return_value) 927*99575102SLv Zheng { 928*99575102SLv Zheng struct acpi_namespace_node *node = 929*99575102SLv Zheng (struct acpi_namespace_node *)obj_handle; 930*99575102SLv Zheng struct acpi_db_execute_walk *info = 931*99575102SLv Zheng (struct acpi_db_execute_walk *)context; 932*99575102SLv Zheng char *pathname; 933*99575102SLv Zheng const union acpi_predefined_info *predefined; 934*99575102SLv Zheng struct acpi_device_info *obj_info; 935*99575102SLv Zheng struct acpi_object_list param_objects; 936*99575102SLv Zheng union acpi_object params[ACPI_METHOD_NUM_ARGS]; 937*99575102SLv Zheng union acpi_object *this_param; 938*99575102SLv Zheng struct acpi_buffer return_obj; 939*99575102SLv Zheng acpi_status status; 940*99575102SLv Zheng u16 arg_type_list; 941*99575102SLv Zheng u8 arg_count; 942*99575102SLv Zheng u8 arg_type; 943*99575102SLv Zheng u32 i; 944*99575102SLv Zheng 945*99575102SLv Zheng /* The name must be a predefined ACPI name */ 946*99575102SLv Zheng 947*99575102SLv Zheng predefined = acpi_ut_match_predefined_method(node->name.ascii); 948*99575102SLv Zheng if (!predefined) { 949*99575102SLv Zheng return (AE_OK); 950*99575102SLv Zheng } 951*99575102SLv Zheng 952*99575102SLv Zheng if (node->type == ACPI_TYPE_LOCAL_SCOPE) { 953*99575102SLv Zheng return (AE_OK); 954*99575102SLv Zheng } 955*99575102SLv Zheng 956*99575102SLv Zheng pathname = acpi_ns_get_external_pathname(node); 957*99575102SLv Zheng if (!pathname) { 958*99575102SLv Zheng return (AE_OK); 959*99575102SLv Zheng } 960*99575102SLv Zheng 961*99575102SLv Zheng /* Get the object info for number of method parameters */ 962*99575102SLv Zheng 963*99575102SLv Zheng status = acpi_get_object_info(obj_handle, &obj_info); 964*99575102SLv Zheng if (ACPI_FAILURE(status)) { 965*99575102SLv Zheng ACPI_FREE(pathname); 966*99575102SLv Zheng return (status); 967*99575102SLv Zheng } 968*99575102SLv Zheng 969*99575102SLv Zheng param_objects.count = 0; 970*99575102SLv Zheng param_objects.pointer = NULL; 971*99575102SLv Zheng 972*99575102SLv Zheng if (obj_info->type == ACPI_TYPE_METHOD) { 973*99575102SLv Zheng 974*99575102SLv Zheng /* Setup default parameters (with proper types) */ 975*99575102SLv Zheng 976*99575102SLv Zheng arg_type_list = predefined->info.argument_list; 977*99575102SLv Zheng arg_count = METHOD_GET_ARG_COUNT(arg_type_list); 978*99575102SLv Zheng 979*99575102SLv Zheng /* 980*99575102SLv Zheng * Setup the ACPI-required number of arguments, regardless of what 981*99575102SLv Zheng * the actual method defines. If there is a difference, then the 982*99575102SLv Zheng * method is wrong and a warning will be issued during execution. 983*99575102SLv Zheng */ 984*99575102SLv Zheng this_param = params; 985*99575102SLv Zheng for (i = 0; i < arg_count; i++) { 986*99575102SLv Zheng arg_type = METHOD_GET_NEXT_TYPE(arg_type_list); 987*99575102SLv Zheng this_param->type = arg_type; 988*99575102SLv Zheng 989*99575102SLv Zheng switch (arg_type) { 990*99575102SLv Zheng case ACPI_TYPE_INTEGER: 991*99575102SLv Zheng 992*99575102SLv Zheng this_param->integer.value = 1; 993*99575102SLv Zheng break; 994*99575102SLv Zheng 995*99575102SLv Zheng case ACPI_TYPE_STRING: 996*99575102SLv Zheng 997*99575102SLv Zheng this_param->string.pointer = 998*99575102SLv Zheng "This is the default argument string"; 999*99575102SLv Zheng this_param->string.length = 1000*99575102SLv Zheng strlen(this_param->string.pointer); 1001*99575102SLv Zheng break; 1002*99575102SLv Zheng 1003*99575102SLv Zheng case ACPI_TYPE_BUFFER: 1004*99575102SLv Zheng 1005*99575102SLv Zheng this_param->buffer.pointer = (u8 *)params; /* just a garbage buffer */ 1006*99575102SLv Zheng this_param->buffer.length = 48; 1007*99575102SLv Zheng break; 1008*99575102SLv Zheng 1009*99575102SLv Zheng case ACPI_TYPE_PACKAGE: 1010*99575102SLv Zheng 1011*99575102SLv Zheng this_param->package.elements = NULL; 1012*99575102SLv Zheng this_param->package.count = 0; 1013*99575102SLv Zheng break; 1014*99575102SLv Zheng 1015*99575102SLv Zheng default: 1016*99575102SLv Zheng 1017*99575102SLv Zheng acpi_os_printf 1018*99575102SLv Zheng ("%s: Unsupported argument type: %u\n", 1019*99575102SLv Zheng pathname, arg_type); 1020*99575102SLv Zheng break; 1021*99575102SLv Zheng } 1022*99575102SLv Zheng 1023*99575102SLv Zheng this_param++; 1024*99575102SLv Zheng } 1025*99575102SLv Zheng 1026*99575102SLv Zheng param_objects.count = arg_count; 1027*99575102SLv Zheng param_objects.pointer = params; 1028*99575102SLv Zheng } 1029*99575102SLv Zheng 1030*99575102SLv Zheng ACPI_FREE(obj_info); 1031*99575102SLv Zheng return_obj.pointer = NULL; 1032*99575102SLv Zheng return_obj.length = ACPI_ALLOCATE_BUFFER; 1033*99575102SLv Zheng 1034*99575102SLv Zheng /* Do the actual method execution */ 1035*99575102SLv Zheng 1036*99575102SLv Zheng acpi_gbl_method_executing = TRUE; 1037*99575102SLv Zheng 1038*99575102SLv Zheng status = acpi_evaluate_object(node, NULL, ¶m_objects, &return_obj); 1039*99575102SLv Zheng 1040*99575102SLv Zheng acpi_os_printf("%-32s returned %s\n", 1041*99575102SLv Zheng pathname, acpi_format_exception(status)); 1042*99575102SLv Zheng acpi_gbl_method_executing = FALSE; 1043*99575102SLv Zheng ACPI_FREE(pathname); 1044*99575102SLv Zheng 1045*99575102SLv Zheng /* Ignore status from method execution */ 1046*99575102SLv Zheng 1047*99575102SLv Zheng status = AE_OK; 1048*99575102SLv Zheng 1049*99575102SLv Zheng /* Update count, check if we have executed enough methods */ 1050*99575102SLv Zheng 1051*99575102SLv Zheng info->count++; 1052*99575102SLv Zheng if (info->count >= info->max_count) { 1053*99575102SLv Zheng status = AE_CTRL_TERMINATE; 1054*99575102SLv Zheng } 1055*99575102SLv Zheng 1056*99575102SLv Zheng return (status); 1057*99575102SLv Zheng } 1058