Lines Matching +full:access +full:- +full:granularity
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
4 * Module Name: exprep - ACPI AML field prep utilities
6 * Copyright (C) 2000 - 2023, Intel Corp.
35 * PARAMETERS: field_bit_offset - Start of field within parent region/buffer
36 * field_bit_length - Length of field in bits
37 * region_length - Length of parent in bytes
39 * RETURN: Field granularity (8, 16, 32 or 64) and
42 * DESCRIPTION: Generate an optimal access width for fields defined with the
46 * conditions (end-of-region). However, the region_length is a deferred
48 * of this access width must be deferred until the region length has
76 field_byte_length = field_byte_end_offset - field_byte_offset; in acpi_ex_generate_access()
88 * Iterative search for the maximum access width that is both aligned in acpi_ex_generate_access()
96 * 1) Round end offset up to next access boundary and make sure that in acpi_ex_generate_access()
98 * 2) When the Access width is greater than the field_byte_length, we in acpi_ex_generate_access()
115 accesses = field_end_offset - field_start_offset; in acpi_ex_generate_access()
122 "Field Start %u, Field End %u -- requires %u accesses\n", in acpi_ex_generate_access()
126 /* Single access is optimal */ in acpi_ex_generate_access()
138 * try the next wider access on next iteration in acpi_ex_generate_access()
150 "Field goes beyond end-of-region!\n")); in acpi_ex_generate_access()
158 * This width goes beyond the end-of-region, back off to in acpi_ex_generate_access()
159 * previous access in acpi_ex_generate_access()
162 "Backing off to previous optimal access width of %u\n", in acpi_ex_generate_access()
170 * just use max access width in acpi_ex_generate_access()
173 "Cannot access field in one operation, using width 8\n")); in acpi_ex_generate_access()
183 * PARAMETERS: obj_desc - Field object
184 * field_flags - Encoded fieldflags (contains access bits)
185 * return_byte_alignment - Where the byte alignment is returned
187 * RETURN: Field granularity (8, 16, 32 or 64) and
198 u32 access; in acpi_ex_decode_field_access() local
204 access = (field_flags & AML_FIELD_ACCESS_TYPE_MASK); in acpi_ex_decode_field_access()
206 switch (access) { in acpi_ex_decode_field_access()
211 acpi_ex_generate_access(obj_desc->common_field. in acpi_ex_decode_field_access()
213 obj_desc->common_field.bit_length, in acpi_ex_decode_field_access()
251 /* Invalid field access type */ in acpi_ex_decode_field_access()
253 ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access)); in acpi_ex_decode_field_access()
258 if (obj_desc->common.type == ACPI_TYPE_BUFFER_FIELD) { in acpi_ex_decode_field_access()
260 * buffer_field access can be on any byte boundary, so the in acpi_ex_decode_field_access()
261 * byte_alignment is always 1 byte -- regardless of any byte_alignment in acpi_ex_decode_field_access()
262 * implied by the field access type. in acpi_ex_decode_field_access()
275 * PARAMETERS: obj_desc - The field object
276 * field_flags - Access, lock_rule, and update_rule.
279 * field_attribute - Special attributes (not used)
280 * field_bit_position - Field start position
281 * field_bit_length - Field length in number of bits
309 obj_desc->common_field.field_flags = field_flags; in acpi_ex_prep_common_field_object()
310 obj_desc->common_field.attribute = field_attribute; in acpi_ex_prep_common_field_object()
311 obj_desc->common_field.bit_length = field_bit_length; in acpi_ex_prep_common_field_object()
314 * Decode the access type so we can compute offsets. The access type gives in acpi_ex_prep_common_field_object()
315 * two pieces of information - the width of each field access and the in acpi_ex_prep_common_field_object()
316 * necessary byte_alignment (address granularity) of the access. in acpi_ex_prep_common_field_object()
319 * necessary and possible in an attempt to access the whole field in one in acpi_ex_prep_common_field_object()
325 * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is in acpi_ex_prep_common_field_object()
334 /* Setup width (access granularity) fields (values are: 1, 2, 4, 8) */ in acpi_ex_prep_common_field_object()
336 obj_desc->common_field.access_byte_width = (u8) in acpi_ex_prep_common_field_object()
341 * region. It is the byte address of the first *datum* (field-width data in acpi_ex_prep_common_field_object()
346 * (Byte access), and it defines the addressing granularity of the parent in acpi_ex_prep_common_field_object()
351 obj_desc->common_field.base_byte_offset = (u32) in acpi_ex_prep_common_field_object()
358 obj_desc->common_field.start_field_bit_offset = (u8) in acpi_ex_prep_common_field_object()
359 (field_bit_position - in acpi_ex_prep_common_field_object()
360 ACPI_MUL_8(obj_desc->common_field.base_byte_offset)); in acpi_ex_prep_common_field_object()
369 * PARAMETERS: info - Contains all field creation info
390 if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) { in acpi_ex_prep_field_value()
391 if (!info->region_node) { in acpi_ex_prep_field_value()
396 type = acpi_ns_get_type(info->region_node); in acpi_ex_prep_field_value()
408 obj_desc = acpi_ut_create_internal_object(info->field_type); in acpi_ex_prep_field_value()
415 obj_desc->common_field.node = info->field_node; in acpi_ex_prep_field_value()
417 info->field_flags, in acpi_ex_prep_field_value()
418 info->attribute, in acpi_ex_prep_field_value()
419 info->field_bit_position, in acpi_ex_prep_field_value()
420 info->field_bit_length); in acpi_ex_prep_field_value()
428 switch (info->field_type) { in acpi_ex_prep_field_value()
431 obj_desc->field.region_obj = in acpi_ex_prep_field_value()
432 acpi_ns_get_attached_object(info->region_node); in acpi_ex_prep_field_value()
436 obj_desc->field.access_length = info->access_length; in acpi_ex_prep_field_value()
438 if (info->connection_node) { in acpi_ex_prep_field_value()
439 second_desc = info->connection_node->object; in acpi_ex_prep_field_value()
443 if (!(second_desc->common.flags & AOPOBJ_DATA_VALID)) { in acpi_ex_prep_field_value()
452 obj_desc->field.resource_buffer = in acpi_ex_prep_field_value()
453 second_desc->buffer.pointer; in acpi_ex_prep_field_value()
454 obj_desc->field.resource_length = in acpi_ex_prep_field_value()
455 (u16)second_desc->buffer.length; in acpi_ex_prep_field_value()
456 } else if (info->resource_buffer) { in acpi_ex_prep_field_value()
457 obj_desc->field.resource_buffer = info->resource_buffer; in acpi_ex_prep_field_value()
458 obj_desc->field.resource_length = info->resource_length; in acpi_ex_prep_field_value()
461 obj_desc->field.pin_number_index = info->pin_number_index; in acpi_ex_prep_field_value()
465 if ((obj_desc->field.region_obj->region.space_id == in acpi_ex_prep_field_value()
467 && (obj_desc->common_field.bit_length > 8)) { in acpi_ex_prep_field_value()
469 ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field. in acpi_ex_prep_field_value()
475 obj_desc->common_field.access_byte_width = in acpi_ex_prep_field_value()
481 obj_desc->field.start_field_bit_offset, in acpi_ex_prep_field_value()
482 obj_desc->field.base_byte_offset, in acpi_ex_prep_field_value()
483 obj_desc->field.access_byte_width, in acpi_ex_prep_field_value()
484 obj_desc->field.region_obj)); in acpi_ex_prep_field_value()
489 obj_desc->bank_field.value = info->bank_value; in acpi_ex_prep_field_value()
490 obj_desc->bank_field.region_obj = in acpi_ex_prep_field_value()
491 acpi_ns_get_attached_object(info->region_node); in acpi_ex_prep_field_value()
492 obj_desc->bank_field.bank_obj = in acpi_ex_prep_field_value()
493 acpi_ns_get_attached_object(info->register_node); in acpi_ex_prep_field_value()
497 acpi_ut_add_reference(obj_desc->bank_field.region_obj); in acpi_ex_prep_field_value()
498 acpi_ut_add_reference(obj_desc->bank_field.bank_obj); in acpi_ex_prep_field_value()
502 obj_desc->bank_field.start_field_bit_offset, in acpi_ex_prep_field_value()
503 obj_desc->bank_field.base_byte_offset, in acpi_ex_prep_field_value()
504 obj_desc->field.access_byte_width, in acpi_ex_prep_field_value()
505 obj_desc->bank_field.region_obj, in acpi_ex_prep_field_value()
506 obj_desc->bank_field.bank_obj)); in acpi_ex_prep_field_value()
510 * opcode and operands -- since the bank_value in acpi_ex_prep_field_value()
513 second_desc = obj_desc->common.next_object; in acpi_ex_prep_field_value()
514 second_desc->extra.aml_start = in acpi_ex_prep_field_value()
516 info->data_register_node)->named.data; in acpi_ex_prep_field_value()
517 second_desc->extra.aml_length = in acpi_ex_prep_field_value()
519 info->data_register_node)->named.length; in acpi_ex_prep_field_value()
527 obj_desc->index_field.index_obj = in acpi_ex_prep_field_value()
528 acpi_ns_get_attached_object(info->register_node); in acpi_ex_prep_field_value()
529 obj_desc->index_field.data_obj = in acpi_ex_prep_field_value()
530 acpi_ns_get_attached_object(info->data_register_node); in acpi_ex_prep_field_value()
532 if (!obj_desc->index_field.data_obj in acpi_ex_prep_field_value()
533 || !obj_desc->index_field.index_obj) { in acpi_ex_prep_field_value()
542 acpi_ut_add_reference(obj_desc->index_field.data_obj); in acpi_ex_prep_field_value()
543 acpi_ut_add_reference(obj_desc->index_field.index_obj); in acpi_ex_prep_field_value()
549 * target field in units of the granularity of the index_field in acpi_ex_prep_field_value()
554 * obj_desc->index_field.Value = (u32) in acpi_ex_prep_field_value()
555 * (Info->field_bit_position / ACPI_MUL_8 ( in acpi_ex_prep_field_value()
556 * obj_desc->Field.access_byte_width)); in acpi_ex_prep_field_value()
559 * obj_desc->index_field.Value = (u32) in acpi_ex_prep_field_value()
560 * ACPI_DIV_8 (Info->field_bit_position); in acpi_ex_prep_field_value()
562 obj_desc->index_field.value = in acpi_ex_prep_field_value()
563 (u32) ACPI_ROUND_DOWN(ACPI_DIV_8(info->field_bit_position), in acpi_ex_prep_field_value()
564 obj_desc->index_field. in acpi_ex_prep_field_value()
570 obj_desc->index_field.start_field_bit_offset, in acpi_ex_prep_field_value()
571 obj_desc->index_field.base_byte_offset, in acpi_ex_prep_field_value()
572 obj_desc->index_field.value, in acpi_ex_prep_field_value()
573 obj_desc->field.access_byte_width, in acpi_ex_prep_field_value()
574 obj_desc->index_field.index_obj, in acpi_ex_prep_field_value()
575 obj_desc->index_field.data_obj)); in acpi_ex_prep_field_value()
590 acpi_ns_attach_object(info->field_node, obj_desc, in acpi_ex_prep_field_value()
591 acpi_ns_get_type(info->field_node)); in acpi_ex_prep_field_value()
595 info->field_node, in acpi_ex_prep_field_value()
596 acpi_ut_get_node_name(info->field_node), obj_desc)); in acpi_ex_prep_field_value()