Lines Matching +full:3 +full:- +full:tuples
1 // SPDX-License-Identifier: GPL-2.0-only
3 * apple.c - Apple ACPI quirks
19 * acpi_extract_apple_properties - retrieve and convert Apple _DSM properties
25 * of 2-element packages. Convert to _DSD format and make them available under
38 props = acpi_evaluate_dsm_typed(adev->handle, &apple_prp_guid, 1, 0, in acpi_extract_apple_properties()
43 if (!props->buffer.length) in acpi_extract_apple_properties()
46 if (props->buffer.pointer[0] != 3) { in acpi_extract_apple_properties()
47 acpi_handle_info(adev->handle, FW_INFO in acpi_extract_apple_properties()
49 props->buffer.length, props->buffer.pointer); in acpi_extract_apple_properties()
54 props = acpi_evaluate_dsm_typed(adev->handle, &apple_prp_guid, 1, 1, in acpi_extract_apple_properties()
59 numprops = props->package.count / 2; in acpi_extract_apple_properties()
69 union acpi_object *key = &props->package.elements[i * 2]; in acpi_extract_apple_properties()
70 union acpi_object *val = &props->package.elements[i * 2 + 1]; in acpi_extract_apple_properties()
72 if ( key->type != ACPI_TYPE_STRING || in acpi_extract_apple_properties()
73 (val->type != ACPI_TYPE_INTEGER && in acpi_extract_apple_properties()
74 val->type != ACPI_TYPE_BUFFER && in acpi_extract_apple_properties()
75 val->type != ACPI_TYPE_STRING)) in acpi_extract_apple_properties()
79 newsize += key->string.length + 1; in acpi_extract_apple_properties()
80 if ( val->type == ACPI_TYPE_BUFFER) in acpi_extract_apple_properties()
81 newsize += val->buffer.length; in acpi_extract_apple_properties()
82 else if (val->type == ACPI_TYPE_STRING) in acpi_extract_apple_properties()
83 newsize += val->string.length + 1; in acpi_extract_apple_properties()
88 acpi_handle_info(adev->handle, FW_INFO in acpi_extract_apple_properties()
90 numprops - numvalid); in acpi_extract_apple_properties()
94 /* newsize += top-level package + 3 objects for each key/value tuple */ in acpi_extract_apple_properties()
95 newsize += (1 + 3 * numvalid) * sizeof(union acpi_object); in acpi_extract_apple_properties()
100 /* layout: top-level package | packages | key/value tuples | strings */ in acpi_extract_apple_properties()
101 newprops->type = ACPI_TYPE_PACKAGE; in acpi_extract_apple_properties()
102 newprops->package.count = numvalid; in acpi_extract_apple_properties()
103 newprops->package.elements = &newprops[1]; in acpi_extract_apple_properties()
104 free_space = &newprops[1 + 3 * numvalid]; in acpi_extract_apple_properties()
107 union acpi_object *key = &props->package.elements[i * 2]; in acpi_extract_apple_properties()
108 union acpi_object *val = &props->package.elements[i * 2 + 1]; in acpi_extract_apple_properties()
117 newprops[k].string.length = key->string.length; in acpi_extract_apple_properties()
119 memcpy(free_space, key->string.pointer, key->string.length); in acpi_extract_apple_properties()
120 free_space += key->string.length + 1; in acpi_extract_apple_properties()
122 newprops[v].type = val->type; in acpi_extract_apple_properties()
123 if (val->type == ACPI_TYPE_INTEGER) { in acpi_extract_apple_properties()
124 newprops[v].integer.value = val->integer.value; in acpi_extract_apple_properties()
125 } else if (val->type == ACPI_TYPE_STRING) { in acpi_extract_apple_properties()
126 newprops[v].string.length = val->string.length; in acpi_extract_apple_properties()
128 memcpy(free_space, val->string.pointer, in acpi_extract_apple_properties()
129 val->string.length); in acpi_extract_apple_properties()
130 free_space += val->string.length + 1; in acpi_extract_apple_properties()
132 newprops[v].buffer.length = val->buffer.length; in acpi_extract_apple_properties()
134 memcpy(free_space, val->buffer.pointer, in acpi_extract_apple_properties()
135 val->buffer.length); in acpi_extract_apple_properties()
136 free_space += val->buffer.length; in acpi_extract_apple_properties()
142 adev->data.pointer = newprops; in acpi_extract_apple_properties()
143 acpi_data_add_props(&adev->data, &apple_prp_guid, newprops); in acpi_extract_apple_properties()