Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ACPI 5.0: Implement Connection() and AccessAs() changes

Support within the interpreter and operation region dispatch.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>

authored by

Bob Moore and committed by
Len Brown
9ce81784 ffef6827

+309 -46
+1
drivers/acpi/acpica/acevents.h
··· 162 162 163 163 acpi_status 164 164 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, 165 + union acpi_operand_object *field_obj, 165 166 u32 function, 166 167 u32 region_offset, u32 bit_width, u64 *value); 167 168
+5 -1
drivers/acpi/acpica/aclocal.h
··· 53 53 54 54 /* Total number of aml opcodes defined */ 55 55 56 - #define AML_NUM_OPCODES 0x7F 56 + #define AML_NUM_OPCODES 0x81 57 57 58 58 /* Forward declarations */ 59 59 ··· 249 249 struct acpi_namespace_node *field_node; 250 250 struct acpi_namespace_node *register_node; 251 251 struct acpi_namespace_node *data_register_node; 252 + struct acpi_namespace_node *connection_node; 253 + u8 *resource_buffer; 252 254 u32 bank_value; 253 255 u32 field_bit_position; 254 256 u32 field_bit_length; 257 + u16 resource_length; 255 258 u8 field_flags; 256 259 u8 attribute; 257 260 u8 field_type; 261 + u8 access_length; 258 262 }; 259 263 260 264 typedef
+4 -1
drivers/acpi/acpica/acobject.h
··· 254 254 u32 base_byte_offset; /* Byte offset within containing object */\ 255 255 u32 value; /* Value to store into the Bank or Index register */\ 256 256 u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\ 257 + u8 access_length; /* For serial regions/fields */ 257 258 258 259 259 260 struct acpi_object_field_common { /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */ ··· 262 261 }; 263 262 264 263 struct acpi_object_region_field { 265 - ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing op_region object */ 264 + ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u16 resource_length; 265 + union acpi_operand_object *region_obj; /* Containing op_region object */ 266 + u8 *resource_buffer; /* resource_template for serial regions/fields */ 266 267 }; 267 268 268 269 struct acpi_object_bank_field {
+4
drivers/acpi/acpica/acopcode.h
··· 93 93 #define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) 94 94 #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) 95 95 #define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) 96 + #define ARGP_CONNECTFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) 96 97 #define ARGP_CONTINUE_OP ARG_NONE 97 98 #define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME) 98 99 #define ARGP_CREATE_BIT_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) ··· 165 164 #define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG) 166 165 #define ARGP_REVISION_OP ARG_NONE 167 166 #define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST) 167 + #define ARGP_SERIALFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) 168 168 #define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) 169 169 #define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) 170 170 #define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME) ··· 225 223 #define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) 226 224 #define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF) 227 225 #define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) 226 + #define ARGI_CONNECTFIELD_OP ARGI_INVALID_OPCODE 228 227 #define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE 229 228 #define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET) 230 229 #define ARGI_CREATE_BIT_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) ··· 297 294 #define ARGI_RETURN_OP ARGI_INVALID_OPCODE 298 295 #define ARGI_REVISION_OP ARG_NONE 299 296 #define ARGI_SCOPE_OP ARGI_INVALID_OPCODE 297 + #define ARGI_SERIALFIELD_OP ARGI_INVALID_OPCODE 300 298 #define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) 301 299 #define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) 302 300 #define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT)
+10
drivers/acpi/acpica/amlcode.h
··· 189 189 #define AML_LNOTEQUAL_OP (u16) 0x9293 190 190 191 191 /* 192 + * Opcodes for "Field" operators 193 + */ 194 + #define AML_FIELD_OFFSET_OP (u8) 0x00 195 + #define AML_FIELD_ACCESS_OP (u8) 0x01 196 + #define AML_FIELD_CONNECTION_OP (u8) 0x02 /* ACPI 5.0 */ 197 + #define AML_FIELD_EXT_ACCESS_OP (u8) 0x03 /* ACPI 5.0 */ 198 + 199 + /* 192 200 * Internal opcodes 193 201 * Use only "Unknown" AML opcodes, don't attempt to use 194 202 * any valid ACPI ASCII values (A-Z, 0-9, '-') ··· 210 202 #define AML_INT_METHODCALL_OP (u16) 0x0035 211 203 #define AML_INT_RETURN_VALUE_OP (u16) 0x0036 212 204 #define AML_INT_EVAL_SUBTREE_OP (u16) 0x0037 205 + #define AML_INT_CONNECTION_OP (u16) 0x0038 206 + #define AML_INT_EXTACCESSFIELD_OP (u16) 0x0039 213 207 214 208 #define ARG_NONE 0x0 215 209
+66 -15
drivers/acpi/acpica/dsfield.c
··· 221 221 { 222 222 acpi_status status; 223 223 u64 position; 224 + union acpi_parse_object *child; 224 225 225 226 ACPI_FUNCTION_TRACE_PTR(ds_get_field_names, info); 226 227 ··· 233 232 234 233 while (arg) { 235 234 /* 236 - * Three types of field elements are handled: 237 - * 1) Offset - specifies a bit offset 238 - * 2) access_as - changes the access mode 239 - * 3) Name - Enters a new named field into the namespace 235 + * Four types of field elements are handled: 236 + * 1) Name - Enters a new named field into the namespace 237 + * 2) Offset - specifies a bit offset 238 + * 3) access_as - changes the access mode/attributes 239 + * 4) Connection - Associate a resource template with the field 240 240 */ 241 241 switch (arg->common.aml_opcode) { 242 242 case AML_INT_RESERVEDFIELD_OP: ··· 255 253 break; 256 254 257 255 case AML_INT_ACCESSFIELD_OP: 258 - 256 + case AML_INT_EXTACCESSFIELD_OP: 259 257 /* 260 - * Get a new access_type and access_attribute -- to be used for all 261 - * field units that follow, until field end or another access_as 262 - * keyword. 258 + * Get new access_type, access_attribute, and access_length fields 259 + * -- to be used for all field units that follow, until the 260 + * end-of-field or another access_as keyword is encountered. 261 + * NOTE. These three bytes are encoded in the integer value 262 + * of the parseop for convenience. 263 263 * 264 264 * In field_flags, preserve the flag bits other than the 265 - * ACCESS_TYPE bits 265 + * ACCESS_TYPE bits. 266 266 */ 267 + 268 + /* access_type (byte_acc, word_acc, etc.) */ 269 + 267 270 info->field_flags = (u8) 268 271 ((info-> 269 272 field_flags & ~(AML_FIELD_ACCESS_TYPE_MASK)) | 270 - ((u8) ((u32) arg->common.value.integer >> 8))); 273 + ((u8)((u32)(arg->common.value.integer & 0x07)))); 271 274 272 - info->attribute = (u8) (arg->common.value.integer); 275 + /* access_attribute (attrib_quick, attrib_byte, etc.) */ 276 + 277 + info->attribute = 278 + (u8)((arg->common.value.integer >> 8) & 0xFF); 279 + 280 + /* access_length (for serial/buffer protocols) */ 281 + 282 + info->access_length = 283 + (u8)((arg->common.value.integer >> 16) & 0xFF); 284 + break; 285 + 286 + case AML_INT_CONNECTION_OP: 287 + /* 288 + * Clear any previous connection. New connection is used for all 289 + * fields that follow, similar to access_as 290 + */ 291 + info->resource_buffer = NULL; 292 + info->connection_node = NULL; 293 + 294 + /* 295 + * A Connection() is either an actual resource descriptor (buffer) 296 + * or a named reference to a resource template 297 + */ 298 + child = arg->common.value.arg; 299 + if (child->common.aml_opcode == AML_INT_BYTELIST_OP) { 300 + info->resource_buffer = child->named.data; 301 + info->resource_length = 302 + (u16)child->named.value.integer; 303 + } else { 304 + /* Lookup the Connection() namepath, it should already exist */ 305 + 306 + status = acpi_ns_lookup(walk_state->scope_info, 307 + child->common.value. 308 + name, ACPI_TYPE_ANY, 309 + ACPI_IMODE_EXECUTE, 310 + ACPI_NS_DONT_OPEN_SCOPE, 311 + walk_state, 312 + &info->connection_node); 313 + if (ACPI_FAILURE(status)) { 314 + ACPI_ERROR_NAMESPACE(child->common. 315 + value.name, 316 + status); 317 + return_ACPI_STATUS(status); 318 + } 319 + } 273 320 break; 274 321 275 322 case AML_INT_NAMEDFIELD_OP: ··· 425 374 } 426 375 } 427 376 377 + ACPI_MEMSET(&info, 0, sizeof(struct acpi_create_field_info)); 378 + 428 379 /* Second arg is the field flags */ 429 380 430 381 arg = arg->common.next; ··· 439 386 info.region_node = region_node; 440 387 441 388 status = acpi_ds_get_field_names(&info, walk_state, arg->common.next); 442 - 443 389 return_ACPI_STATUS(status); 444 390 } 445 391 ··· 526 474 */ 527 475 while (arg) { 528 476 /* 529 - * Ignore OFFSET and ACCESSAS terms here; we are only interested in the 530 - * field names in order to enter them into the namespace. 477 + * Ignore OFFSET/ACCESSAS/CONNECTION terms here; we are only interested 478 + * in the field names in order to enter them into the namespace. 531 479 */ 532 480 if (arg->common.aml_opcode == AML_INT_NAMEDFIELD_OP) { 533 481 status = acpi_ns_lookup(walk_state->scope_info, ··· 703 651 info.region_node = region_node; 704 652 705 653 status = acpi_ds_get_field_names(&info, walk_state, arg->common.next); 706 - 707 654 return_ACPI_STATUS(status); 708 655 }
+26 -3
drivers/acpi/acpica/evregion.c
··· 329 329 * FUNCTION: acpi_ev_address_space_dispatch 330 330 * 331 331 * PARAMETERS: region_obj - Internal region object 332 + * field_obj - Corresponding field. Can be NULL. 332 333 * Function - Read or Write operation 333 334 * region_offset - Where in the region to read or write 334 335 * bit_width - Field width in bits (8, 16, 32, or 64) ··· 345 344 346 345 acpi_status 347 346 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, 347 + union acpi_operand_object *field_obj, 348 348 u32 function, 349 349 u32 region_offset, u32 bit_width, u64 *value) 350 350 { ··· 355 353 union acpi_operand_object *handler_desc; 356 354 union acpi_operand_object *region_obj2; 357 355 void *region_context = NULL; 356 + struct acpi_connection_info *context; 358 357 359 358 ACPI_FUNCTION_TRACE(ev_address_space_dispatch); 360 359 ··· 377 374 378 375 return_ACPI_STATUS(AE_NOT_EXIST); 379 376 } 377 + 378 + context = handler_desc->address_space.context; 380 379 381 380 /* 382 381 * It may be the case that the region has never been initialized. ··· 409 404 acpi_ex_exit_interpreter(); 410 405 411 406 status = region_setup(region_obj, ACPI_REGION_ACTIVATE, 412 - handler_desc->address_space.context, 413 - &region_context); 407 + context, &region_context); 414 408 415 409 /* Re-enter the interpreter */ 416 410 ··· 459 455 acpi_ut_get_region_name(region_obj->region. 460 456 space_id))); 461 457 458 + /* 459 + * Special handling for generic_serial_bus and general_purpose_io: 460 + * There are three extra parameters that must be passed to the 461 + * handler via the context: 462 + * 1) Connection buffer, a resource template from Connection() op. 463 + * 2) Length of the above buffer. 464 + * 3) Actual access length from the access_as() op. 465 + */ 466 + if (((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) || 467 + (region_obj->region.space_id == ACPI_ADR_SPACE_GPIO)) && 468 + context && field_obj) { 469 + 470 + /* Get the Connection (resource_template) buffer */ 471 + 472 + context->connection = field_obj->field.resource_buffer; 473 + context->length = field_obj->field.resource_length; 474 + context->access_length = field_obj->field.access_length; 475 + } 476 + 462 477 if (!(handler_desc->address_space.handler_flags & 463 478 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { 464 479 /* ··· 492 469 493 470 status = handler(function, 494 471 (region_obj->region.address + region_offset), 495 - bit_width, value, handler_desc->address_space.context, 472 + bit_width, value, context, 496 473 region_obj2->extra.region_context); 497 474 498 475 if (ACPI_FAILURE(status)) {
+3 -3
drivers/acpi/acpica/exconfig.c
··· 297 297 /* Bytewise reads */ 298 298 299 299 for (i = 0; i < length; i++) { 300 - status = acpi_ev_address_space_dispatch(obj_desc, ACPI_READ, 301 - region_offset, 8, 302 - &value); 300 + status = 301 + acpi_ev_address_space_dispatch(obj_desc, NULL, ACPI_READ, 302 + region_offset, 8, &value); 303 303 if (ACPI_FAILURE(status)) { 304 304 return status; 305 305 }
+5 -2
drivers/acpi/acpica/exdump.c
··· 192 192 "Buffer Object"} 193 193 }; 194 194 195 - static struct acpi_exdump_info acpi_ex_dump_region_field[3] = { 195 + static struct acpi_exdump_info acpi_ex_dump_region_field[5] = { 196 196 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region_field), NULL}, 197 197 {ACPI_EXD_FIELD, 0, NULL}, 198 - {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.region_obj), "Region Object"} 198 + {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(field.access_length), "AccessLength"}, 199 + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.region_obj), "Region Object"}, 200 + {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.resource_buffer), 201 + "ResourceBuffer"} 199 202 }; 200 203 201 204 static struct acpi_exdump_info acpi_ex_dump_bank_field[5] = {
+6 -5
drivers/acpi/acpica/exfldio.c
··· 283 283 284 284 /* Invoke the appropriate address_space/op_region handler */ 285 285 286 - status = 287 - acpi_ev_address_space_dispatch(rgn_desc, function, region_offset, 288 - ACPI_MUL_8(obj_desc->common_field. 289 - access_byte_width), 290 - value); 286 + status = acpi_ev_address_space_dispatch(rgn_desc, obj_desc, 287 + function, region_offset, 288 + ACPI_MUL_8(obj_desc-> 289 + common_field. 290 + access_byte_width), 291 + value); 291 292 292 293 if (ACPI_FAILURE(status)) { 293 294 if (status == AE_NOT_IMPLEMENTED) {
+25
drivers/acpi/acpica/exprep.c
··· 47 47 #include "acinterp.h" 48 48 #include "amlcode.h" 49 49 #include "acnamesp.h" 50 + #include "acdispat.h" 50 51 51 52 #define _COMPONENT ACPI_EXECUTER 52 53 ACPI_MODULE_NAME("exprep") ··· 455 454 456 455 obj_desc->field.region_obj = 457 456 acpi_ns_get_attached_object(info->region_node); 457 + 458 + /* Fields specific to generic_serial_bus fields */ 459 + 460 + obj_desc->field.access_length = info->access_length; 461 + 462 + if (info->connection_node) { 463 + second_desc = info->connection_node->object; 464 + if (!(second_desc->common.flags & AOPOBJ_DATA_VALID)) { 465 + status = 466 + acpi_ds_get_buffer_arguments(second_desc); 467 + if (ACPI_FAILURE(status)) { 468 + acpi_ut_delete_object_desc(obj_desc); 469 + return_ACPI_STATUS(status); 470 + } 471 + } 472 + 473 + obj_desc->field.resource_buffer = 474 + second_desc->buffer.pointer; 475 + obj_desc->field.resource_length = 476 + (u16)second_desc->buffer.length; 477 + } else if (info->resource_buffer) { 478 + obj_desc->field.resource_buffer = info->resource_buffer; 479 + obj_desc->field.resource_length = info->resource_length; 480 + } 458 481 459 482 /* Allow full data read from EC address space */ 460 483
+129 -14
drivers/acpi/acpica/psargs.c
··· 484 484 static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state 485 485 *parser_state) 486 486 { 487 - u32 aml_offset = (u32) 488 - ACPI_PTR_DIFF(parser_state->aml, 489 - parser_state->aml_start); 487 + u32 aml_offset; 490 488 union acpi_parse_object *field; 489 + union acpi_parse_object *arg = NULL; 491 490 u16 opcode; 492 491 u32 name; 492 + u8 access_type; 493 + u8 access_attribute; 494 + u8 access_length; 495 + u32 pkg_length; 496 + u8 *pkg_end; 497 + u32 buffer_length; 493 498 494 499 ACPI_FUNCTION_TRACE(ps_get_next_field); 500 + 501 + aml_offset = 502 + (u32)ACPI_PTR_DIFF(parser_state->aml, parser_state->aml_start); 495 503 496 504 /* Determine field type */ 497 505 498 506 switch (ACPI_GET8(parser_state->aml)) { 499 - default: 500 - 501 - opcode = AML_INT_NAMEDFIELD_OP; 502 - break; 503 - 504 - case 0x00: 507 + case AML_FIELD_OFFSET_OP: 505 508 506 509 opcode = AML_INT_RESERVEDFIELD_OP; 507 510 parser_state->aml++; 508 511 break; 509 512 510 - case 0x01: 513 + case AML_FIELD_ACCESS_OP: 511 514 512 515 opcode = AML_INT_ACCESSFIELD_OP; 513 516 parser_state->aml++; 517 + break; 518 + 519 + case AML_FIELD_CONNECTION_OP: 520 + 521 + opcode = AML_INT_CONNECTION_OP; 522 + parser_state->aml++; 523 + break; 524 + 525 + case AML_FIELD_EXT_ACCESS_OP: 526 + 527 + opcode = AML_INT_EXTACCESSFIELD_OP; 528 + parser_state->aml++; 529 + break; 530 + 531 + default: 532 + 533 + opcode = AML_INT_NAMEDFIELD_OP; 514 534 break; 515 535 } 516 536 ··· 569 549 break; 570 550 571 551 case AML_INT_ACCESSFIELD_OP: 552 + case AML_INT_EXTACCESSFIELD_OP: 572 553 573 554 /* 574 555 * Get access_type and access_attrib and merge into the field Op 575 - * access_type is first operand, access_attribute is second 556 + * access_type is first operand, access_attribute is second. stuff 557 + * these bytes into the node integer value for convenience. 576 558 */ 577 - field->common.value.integer = 578 - (((u32) ACPI_GET8(parser_state->aml) << 8)); 559 + 560 + /* Get the two bytes (Type/Attribute) */ 561 + 562 + access_type = ACPI_GET8(parser_state->aml); 579 563 parser_state->aml++; 580 - field->common.value.integer |= ACPI_GET8(parser_state->aml); 564 + access_attribute = ACPI_GET8(parser_state->aml); 581 565 parser_state->aml++; 566 + 567 + field->common.value.integer = (u8)access_type; 568 + field->common.value.integer |= (u16)(access_attribute << 8); 569 + 570 + /* This opcode has a third byte, access_length */ 571 + 572 + if (opcode == AML_INT_EXTACCESSFIELD_OP) { 573 + access_length = ACPI_GET8(parser_state->aml); 574 + parser_state->aml++; 575 + 576 + field->common.value.integer |= 577 + (u32)(access_length << 16); 578 + } 579 + break; 580 + 581 + case AML_INT_CONNECTION_OP: 582 + 583 + /* 584 + * Argument for Connection operator can be either a Buffer 585 + * (resource descriptor), or a name_string. 586 + */ 587 + if (ACPI_GET8(parser_state->aml) == AML_BUFFER_OP) { 588 + parser_state->aml++; 589 + 590 + pkg_end = parser_state->aml; 591 + pkg_length = 592 + acpi_ps_get_next_package_length(parser_state); 593 + pkg_end += pkg_length; 594 + 595 + if (parser_state->aml < pkg_end) { 596 + 597 + /* Non-empty list */ 598 + 599 + arg = acpi_ps_alloc_op(AML_INT_BYTELIST_OP); 600 + if (!arg) { 601 + return_PTR(NULL); 602 + } 603 + 604 + /* Get the actual buffer length argument */ 605 + 606 + opcode = ACPI_GET8(parser_state->aml); 607 + parser_state->aml++; 608 + 609 + switch (opcode) { 610 + case AML_BYTE_OP: /* AML_BYTEDATA_ARG */ 611 + buffer_length = 612 + ACPI_GET8(parser_state->aml); 613 + parser_state->aml += 1; 614 + break; 615 + 616 + case AML_WORD_OP: /* AML_WORDDATA_ARG */ 617 + buffer_length = 618 + ACPI_GET16(parser_state->aml); 619 + parser_state->aml += 2; 620 + break; 621 + 622 + case AML_DWORD_OP: /* AML_DWORDATA_ARG */ 623 + buffer_length = 624 + ACPI_GET32(parser_state->aml); 625 + parser_state->aml += 4; 626 + break; 627 + 628 + default: 629 + buffer_length = 0; 630 + break; 631 + } 632 + 633 + /* Fill in bytelist data */ 634 + 635 + arg->named.value.size = buffer_length; 636 + arg->named.data = parser_state->aml; 637 + } 638 + 639 + /* Skip to End of byte data */ 640 + 641 + parser_state->aml = pkg_end; 642 + } else { 643 + arg = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP); 644 + if (!arg) { 645 + return_PTR(NULL); 646 + } 647 + 648 + /* Get the Namestring argument */ 649 + 650 + arg->common.value.name = 651 + acpi_ps_get_next_namestring(parser_state); 652 + } 653 + 654 + /* Link the buffer/namestring to parent (CONNECTION_OP) */ 655 + 656 + acpi_ps_append_arg(field, arg); 582 657 break; 583 658 584 659 default:
+11 -2
drivers/acpi/acpica/psopcode.c
··· 638 638 639 639 /* 7E */ ACPI_OP("Timer", ARGP_TIMER_OP, ARGI_TIMER_OP, ACPI_TYPE_ANY, 640 640 AML_CLASS_EXECUTE, AML_TYPE_EXEC_0A_0T_1R, 641 - AML_FLAGS_EXEC_0A_0T_1R) 641 + AML_FLAGS_EXEC_0A_0T_1R), 642 + 643 + /* ACPI 5.0 opcodes */ 644 + 645 + /* 7F */ ACPI_OP("-ConnectField-", ARGP_CONNECTFIELD_OP, 646 + ARGI_CONNECTFIELD_OP, ACPI_TYPE_ANY, 647 + AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), 648 + /* 80 */ ACPI_OP("-ExtAccessField-", ARGP_CONNECTFIELD_OP, 649 + ARGI_CONNECTFIELD_OP, ACPI_TYPE_ANY, 650 + AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0) 642 651 643 652 /*! [End] no source code translation !*/ 644 653 }; ··· 666 657 /* 0x20 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 667 658 /* 0x28 */ _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX, 668 659 /* 0x30 */ 0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, 0x7D, 669 - /* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 660 + /* 0x38 */ 0x7F, 0x80, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 670 661 /* 0x40 */ _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, 671 662 /* 0x48 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, 672 663 /* 0x50 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
+6
drivers/acpi/acpica/pstree.c
··· 74 74 75 75 ACPI_FUNCTION_ENTRY(); 76 76 77 + /* 78 + if (Op->Common.aml_opcode == AML_INT_CONNECTION_OP) 79 + { 80 + return (Op->Common.Value.Arg); 81 + } 82 + */ 77 83 /* Get the info structure for this opcode */ 78 84 79 85 op_info = acpi_ps_get_opcode_info(op->common.aml_opcode);
+8
include/acpi/actypes.h
··· 957 957 958 958 #define ACPI_DEFAULT_HANDLER NULL 959 959 960 + /* Special Context data for generic_serial_bus/general_purpose_io (ACPI 5.0) */ 961 + 962 + struct acpi_connection_info { 963 + u8 *connection; 964 + u16 length; 965 + u8 access_length; 966 + }; 967 + 960 968 typedef 961 969 acpi_status(*acpi_adr_space_setup) (acpi_handle region_handle, 962 970 u32 function,