ReactOS 0.4.16-dev-1506-g117cd33
resources.c
Go to the documentation of this file.
1#include <uacpi/types.h>
2#include <uacpi/acpi.h>
8#include <uacpi/uacpi.h>
9
10#ifndef UACPI_BAREBONES_MODE
11
12#define LARGE_RESOURCE_BASE (ACPI_RESOURCE_END_TAG + 1)
13#define L(x) (x + LARGE_RESOURCE_BASE)
14
15/*
16 * Map raw AML resource types to the internal enum, this also takes care of type
17 * sanitization by returning UACPI_AML_RESOURCE_INVALID for any unknown type.
18 */
19static const uacpi_u8 aml_resource_to_type[256] = {
20 // Small items
30
31 // Large items
50};
51
62
63 // Large items
82};
83
115};
116
117#define SMALL_ITEM_HEADER_SIZE sizeof(struct acpi_small_item)
118#define LARGE_ITEM_HEADER_SIZE sizeof(struct acpi_large_item)
119
123};
124
126{
127 return spec->aml_size +
129}
130
132 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
133)
134{
137 uacpi_u8 i, total_bits, num_bits = 0;
138
139 if (spec->type == UACPI_AML_RESOURCE_IRQ) {
140 struct acpi_resource_irq *irq = data;
141 mask = irq->irq_mask;
142 total_bits = 16;
143 } else {
144 struct acpi_resource_dma *dma = data;
145 mask = dma->channel_mask;
146 total_bits = 8;
147 }
148
149 for (i = 0; i < total_bits; ++i)
150 num_bits += !!(mask & (1 << i));
151
152 return num_bits;
153}
154
156 const struct uacpi_resource_spec *spec, uacpi_resource *resource
157)
158{
161
163
164 switch (irq->length_kind) {
166 goto out_full;
169 if (irq->triggering != UACPI_TRIGGERING_EDGE)
170 goto out_full;
171 if (irq->polarity != UACPI_POLARITY_ACTIVE_HIGH)
172 goto out_full;
173 if (irq->sharing != UACPI_EXCLUSIVE)
174 goto out_full;
175
176 return size - 1;
177 }
178
179out_full:
180 if (uacpi_unlikely(irq->length_kind ==
182 uacpi_warn("requested IRQ resource length is "
183 "not compatible with specified flags, corrected\n");
184 }
185
186 return size;
187}
188
190 const struct uacpi_resource_spec *spec, uacpi_resource *resource
191)
192{
193 uacpi_resource_start_dependent *start_dep = &resource->start_dependent;
195
197 switch (start_dep->length_kind) {
199 goto out_full;
202 if (start_dep->compatibility != UACPI_ACCEPTABLE)
203 goto out_full;
204 if (start_dep->performance != UACPI_ACCEPTABLE)
205 goto out_full;
206
207 return size - 1;
208 }
209
210out_full:
211 if (uacpi_unlikely(start_dep->length_kind ==
213 uacpi_warn("requested StartDependentFn resource length is "
214 "not compatible with specified flags, corrected\n");
215 }
216
217 return size;
218}
219
221 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
222)
223{
224 UACPI_UNUSED(spec);
226 return size;
227}
228
230 const struct uacpi_resource_spec *spec, uacpi_resource *resource
231)
232{
233 UACPI_UNUSED(spec);
234 uacpi_size size = resource->vendor.length;
235
236 if (size > 7 || resource->type == UACPI_RESOURCE_TYPE_VENDOR_LARGE) {
239 ];
240
242 uacpi_warn("vendor data too large for small descriptor (%zu), "
243 "correcting to large\n", size);
245 }
246 } else {
249 ];
250 }
251
252 return size;
253}
254
256 uacpi_size base_size, uacpi_size reported_size
257)
258{
259 uacpi_size string_length;
260
261 if (reported_size <= base_size)
262 return 0;
263
264 /*
265 * The remainder of the descriptor minus the resource index field
266 */
267 string_length = (reported_size - base_size) - 1;
268 return UACPI_ALIGN_UP(string_length, sizeof(void*), uacpi_size);
269}
270
273)
274{
275 uacpi_size length = source->length;
276
277 if (uacpi_unlikely(length && !source->index_present)) {
278 uacpi_warn("resource declares no source index with non-empty "
279 "string (%zu bytes), corrected\n", length);
280 source->index_present = UACPI_TRUE;
281 }
282
283 // If index is included in the dynamic resource source, add it to the length
284 if (with_index)
285 length += source->index_present;
286
287 return length;
288}
289
291 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
292)
293{
296}
297
299 const struct uacpi_resource_spec *spec, uacpi_resource *resource
300)
301{
303 bool has_index = UACPI_TRUE;
304
305 switch (resource->type) {
307 source = &resource->address16.source;
308 break;
310 source = &resource->address32.source;
311 break;
313 source = &resource->address64.source;
314 break;
316 source = &resource->clock_input.source;
317 has_index = UACPI_FALSE;
318 break;
319 default:
320 return 0;
321 }
322
323 return aml_size_with_header(spec) +
325}
326
328 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
329)
330{
332 uacpi_size extra_size = 0;
333
334 extra_size += irq->num_irqs * sizeof(uacpi_u32);
335 extra_size += extra_size_for_resource_source(
336 spec->aml_size, size - extra_size
337 );
338
339 return extra_size;
340}
341
343 const struct uacpi_resource_spec *spec, uacpi_resource *resource
344)
345{
346 uacpi_resource_extended_irq *irq = &resource->extended_irq;
348
350 size += irq->num_irqs * 4;
352
353 return size;
354}
355
357 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
358)
359{
360 uacpi_size pin_table_offset;
361
362 /*
363 * These resources pretend to have variable layout by declaring "offset"
364 * fields, but the layout is hardcoded and mandated by the spec to be
365 * very specific. We can use the offset numbers here to calculate the final
366 * length.
367 *
368 * For example, the layout of GPIO connection _always_ looks as follows:
369 * [0...22] -> fixed data
370 * [23...<source name offset - 1>] -> pin table
371 * [<source name offset>...<vendor data offset - 1>] -> source name
372 * [<vendor data offset>...<data offset + data length>] -> vendor data
373 */
374 switch (spec->type) {
376 struct acpi_resource_gpio_connection *gpio = data;
377 pin_table_offset = gpio->pin_table_offset;
378 break;
379 }
380
383 pin_table_offset = pin->pin_table_offset;
384 break;
385 }
386
388 struct acpi_resource_pin_configuration *config = data;
389 pin_table_offset = config->pin_table_offset;
390 break;
391 }
392
395 pin_table_offset = group->pin_table_offset;
396 break;
397 }
398
399 default:
400 return 0;
401 }
402
403 /*
404 * The size we get passed here does not include the header size because
405 * that's how resources are encoded. Subtract it here so that we get the
406 * correct final length.
407 */
408 return size - (pin_table_offset - LARGE_ITEM_HEADER_SIZE);
409}
410
412 const struct uacpi_resource_spec *spec, uacpi_resource *resource
413)
414{
415 uacpi_size source_length, vendor_length, pin_table_length, size;
416
418 switch (spec->type) {
420 uacpi_resource_gpio_connection *res = &resource->gpio_connection;
421 source_length = res->source.length;
422 pin_table_length = res->pin_table_length;
423 vendor_length = res->vendor_data_length;
424 break;
425 }
426
428 uacpi_resource_pin_function *res = &resource->pin_function;
429 source_length = res->source.length;
430 pin_table_length = res->pin_table_length;
431 vendor_length = res->vendor_data_length;
432 break;
433 }
434
436 uacpi_resource_pin_configuration *res = &resource->pin_configuration;
437 source_length = res->source.length;
438 pin_table_length = res->pin_table_length;
439 vendor_length = res->vendor_data_length;
440 break;
441 }
442
445 source_length = res->label.length;
446 pin_table_length = res->pin_table_length;
447 vendor_length = res->vendor_data_length;
448 break;
449 }
450
451 default:
452 return 0;
453 }
454
455 size += source_length;
456 size += pin_table_length * 2;
457 size += vendor_length;
458
459 return size;
460}
461
463 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
464)
465{
466 uacpi_size source_offset;
467
468 switch (spec->type) {
471 source_offset = func->source_offset;
472 break;
473 }
474
476 struct acpi_resource_pin_group_configuration *config = data;
477 source_offset = config->source_offset;
478 break;
479 }
480
481 default:
482 return 0;
483 }
484
485 // Same logic as extra_size_for_native_gpio_or_pins
486 return size - (source_offset - LARGE_ITEM_HEADER_SIZE);
487}
488
490 const struct uacpi_resource_spec *spec, uacpi_resource *resource
491)
492{
493 uacpi_size source_length, label_length, vendor_length, size;
494
496 switch (spec->type) {
498 uacpi_resource_pin_group_function *res = &resource->pin_group_function;
499 source_length = res->source.length;
500 label_length = res->label.length;
501 vendor_length = res->vendor_data_length;
502 break;
503 }
504
507 res = &resource->pin_group_configuration;
508 source_length = res->source.length;
509 label_length = res->label.length;
510 vendor_length = res->vendor_data_length;
511 break;
512 }
513
514 default:
515 return 0;
516 }
517
518 size += source_length;
519 size += label_length;
520 size += vendor_length;
521
522 return size;
523}
524
525#define AML_SERIAL_RESOURCE_EXTRA_SIZE(type) \
526 (sizeof(struct acpi_resource_serial_##type) \
527 - sizeof(struct acpi_resource_serial))
528
529#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE(type) \
530 (sizeof(uacpi_resource_##type##_connection) \
531 - sizeof(uacpi_resource_serial_bus_common))
532
534[ACPI_SERIAL_TYPE_MAX + 1] = {
539};
540
542[ACPI_SERIAL_TYPE_MAX + 1] = {
547};
548
550 const struct uacpi_resource_spec *spec, void *data, uacpi_size size
551)
552{
553 struct acpi_resource_serial *serial = data;
554 uacpi_size extra_bytes = size;
555
556 extra_bytes -= spec->aml_size;
557 extra_bytes -= aml_serial_resource_to_extra_aml_size[serial->type];
559
560 return extra_bytes;
561}
562
564 const struct uacpi_resource_spec *spec, uacpi_resource *resource
565)
566{
568 uacpi_resource_serial_bus_common *serial_bus = &resource->serial_bus_common;
569
572 size += serial_bus->vendor_data_length;
573 size += serial_bus->source.length;
574
575 return size;
576}
577
578#define OP(short_code, ...) \
579{ \
580 .code = UACPI_RESOURCE_CONVERT_OPCODE_##short_code, \
581 __VA_ARGS__ \
582}
583
584#define END() OP(END)
585
586#define AML_O(short_aml_name, field) \
587 uacpi_offsetof(struct acpi_resource_##short_aml_name, field)
588
589#define AML_F(short_aml_name, field) \
590 .aml_offset = AML_O(short_aml_name, field)
591
592#define NATIVE_O(short_name, field) \
593 uacpi_offsetof(uacpi_resource_##short_name, field)
594
595#define NATIVE_F(short_native_name, field) \
596 .native_offset = NATIVE_O(short_native_name, field)
597
598#define IMM(value) .imm = value
599#define ARG0(value) .arg0 = (value)
600#define ARG1(value) .arg1 = (value)
601#define ARG2(value) .arg2 = (value)
602
603
605 OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
606 ARG2(NATIVE_O(irq, num_irqs))),
607 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(6)),
608 OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
610 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
611 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
612 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
613 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
614 END(),
615 OP(SET_TO_IMM, NATIVE_F(irq, length_kind),
618 END(),
619};
620
622 OP(PACKED_ARRAY_16, AML_F(irq, irq_mask), NATIVE_F(irq, irqs),
623 ARG2(NATIVE_O(irq, num_irqs))),
624 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(3), IMM(4)),
625 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, triggering), IMM(0)),
626 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, polarity), IMM(3)),
627 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, sharing), IMM(4)),
628 OP(BIT_FIELD_1, AML_F(irq, flags), NATIVE_F(irq, wake_capability), IMM(5)),
629 END(),
630};
631
633 OP(PACKED_ARRAY_8, AML_F(dma, channel_mask), NATIVE_F(dma, channels),
634 ARG2(NATIVE_O(dma, num_channels))),
635 OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, transfer_type), IMM(0)),
636 OP(BIT_FIELD_1, AML_F(dma, flags), NATIVE_F(dma, bus_master_status), IMM(2)),
637 OP(BIT_FIELD_2, AML_F(dma, flags), NATIVE_F(dma, channel_speed), IMM(5)),
638 END(),
639};
640
641static const struct uacpi_resource_convert_instruction
643 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(4)),
644 OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
646 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
647 NATIVE_F(start_dependent, compatibility), IMM(0)),
648 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
649 NATIVE_F(start_dependent, performance), IMM(2)),
650 END(),
651 OP(SET_TO_IMM, NATIVE_F(start_dependent, length_kind),
653 OP(SET_TO_IMM, NATIVE_F(start_dependent, compatibility),
655 OP(SET_TO_IMM, NATIVE_F(start_dependent, performance),
657 END(),
658};
659
660static const struct uacpi_resource_convert_instruction
662 OP(SKIP_IF_AML_SIZE_LESS_THAN, ARG0(1), IMM(1)),
663 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
664 NATIVE_F(start_dependent, compatibility), IMM(0)),
665 OP(BIT_FIELD_2, AML_F(start_dependent, flags),
666 NATIVE_F(start_dependent, performance), IMM(2)),
667 END(),
668};
669
671 OP(BIT_FIELD_1, AML_F(io, information), NATIVE_F(io, decode_type)),
672 OP(FIELD_16, AML_F(io, minimum), NATIVE_F(io, minimum)),
673 OP(FIELD_16, AML_F(io, maximum), NATIVE_F(io, maximum)),
674 OP(FIELD_8, AML_F(io, alignment), NATIVE_F(io, alignment)),
675 OP(FIELD_8, AML_F(io, length), NATIVE_F(io, length)),
676 END(),
677};
678
680 OP(FIELD_16, AML_F(fixed_io, address), NATIVE_F(fixed_io, address)),
681 OP(FIELD_8, AML_F(fixed_io, length), NATIVE_F(fixed_io, length)),
682 END(),
683};
684
686 OP(FIELD_16, AML_F(fixed_dma, request_line),
687 NATIVE_F(fixed_dma, request_line)),
688 OP(FIELD_16, AML_F(fixed_dma, channel), NATIVE_F(fixed_dma, channel)),
689 OP(FIELD_8, AML_F(fixed_dma, transfer_width),
690 NATIVE_F(fixed_dma, transfer_width)),
691 END(),
692};
693
695 OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
696 OP(FIELD_8, AML_F(vendor_defined_type0, byte_data), NATIVE_F(vendor, data)),
697 END(),
698};
699
701 OP(LOAD_AML_SIZE_32, NATIVE_F(vendor, length)),
702 OP(FIELD_8, AML_F(vendor_defined_type1, byte_data), NATIVE_F(vendor, data)),
703 END(),
704};
705
707 OP(BIT_FIELD_1, AML_F(memory24, information),
708 NATIVE_F(memory24, write_status), IMM(0)),
709 OP(FIELD_16, AML_F(memory24, minimum), NATIVE_F(memory24, minimum), IMM(4)),
710 END(),
711};
712
714 OP(BIT_FIELD_1, AML_F(memory32, information),
715 NATIVE_F(memory32, write_status), IMM(0)),
716 OP(FIELD_32, AML_F(memory32, minimum), NATIVE_F(memory32, minimum), IMM(4)),
717 END(),
718};
719
720static const struct uacpi_resource_convert_instruction
722 OP(BIT_FIELD_1, AML_F(fixed_memory32, information),
723 NATIVE_F(fixed_memory32, write_status), IMM(0)),
724 OP(FIELD_32, AML_F(fixed_memory32, address),
725 NATIVE_F(fixed_memory32, address)),
726 OP(FIELD_32, AML_F(fixed_memory32, length),
727 NATIVE_F(fixed_memory32, length)),
728 END(),
729};
730
731static const struct uacpi_resource_convert_instruction
733 OP(FIELD_8, AML_F(generic_register, address_space_id),
734 NATIVE_F(generic_register, address_space_id), IMM(4)),
735 OP(FIELD_64, AML_F(generic_register, address),
736 NATIVE_F(generic_register, address)),
737 END(),
738};
739
740#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type) \
741 OP(LOAD_8_STORE, AML_F(addr_type, common.type), \
742 NATIVE_F(addr_type, common.type)), \
743 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_RANGE_MEMORY), IMM(5)), \
744 OP(BIT_FIELD_1, \
745 AML_F(addr_type, common.type_flags), \
746 NATIVE_F(addr_type, common.attribute.memory.write_status), IMM(0)), \
747 OP(BIT_FIELD_2, \
748 AML_F(addr_type, common.type_flags), \
749 NATIVE_F(addr_type, common.attribute.memory.caching), IMM(1)), \
750 OP(BIT_FIELD_2, \
751 AML_F(addr_type, common.type_flags), \
752 NATIVE_F(addr_type, common.attribute.memory.range_type), IMM(3)), \
753 OP(BIT_FIELD_1, \
754 AML_F(addr_type, common.type_flags), \
755 NATIVE_F(addr_type, common.attribute.memory.translation), IMM(5)), \
756 END(), \
757 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_RANGE_IO), IMM(4)), \
758 OP(BIT_FIELD_2, \
759 AML_F(addr_type, common.type_flags), \
760 NATIVE_F(addr_type, common.attribute.io.range_type), IMM(0)), \
761 OP(BIT_FIELD_1, \
762 AML_F(addr_type, common.type_flags), \
763 NATIVE_F(addr_type, common.attribute.io.translation_type), IMM(4)), \
764 OP(BIT_FIELD_1, \
765 AML_F(addr_type, common.type_flags), \
766 NATIVE_F(addr_type, common.attribute.io.translation), IMM(5)), \
767 END(), \
768 /* Memory type that we don't know, just copy the byte */ \
769 OP(FIELD_8, AML_F(addr_type, common.type_flags), \
770 NATIVE_F(addr_type, common.attribute.type_specific), IMM(0xFF)), \
771 END()
772
773#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type) \
774 OP(BIT_FIELD_1, \
775 AML_F(addr_type, common.flags), \
776 NATIVE_F(addr_type, common.direction), IMM(0)), \
777 OP(BIT_FIELD_1, \
778 AML_F(addr_type, common.flags), \
779 NATIVE_F(addr_type, common.decode_type), IMM(1)), \
780 OP(BIT_FIELD_1, \
781 AML_F(addr_type, common.flags), \
782 NATIVE_F(addr_type, common.fixed_min_address), IMM(2)), \
783 OP(BIT_FIELD_1, \
784 AML_F(addr_type, common.flags), \
785 NATIVE_F(addr_type, common.fixed_max_address), IMM(3)) \
786
787#define DEFINE_ADDRESS_CONVERSION(width) \
788 static const struct uacpi_resource_convert_instruction \
789 convert_address##width[] = { \
790 CONVERT_GENERAL_ADDRESS_FLAGS(address##width), \
791 OP(FIELD_##width, AML_F(address##width, granularity), \
792 NATIVE_F(address##width, granularity), IMM(5)), \
793 OP(RESOURCE_SOURCE, NATIVE_F(address##width, source)), \
794 CONVERT_TYPE_SPECIFIC_FLAGS(address##width), \
795 };
796
800
803 CONVERT_GENERAL_ADDRESS_FLAGS(address64_extended),
804 OP(FIELD_8, AML_F(address64_extended, revision_id),
805 NATIVE_F(address64_extended, revision_id)),
806 OP(FIELD_64, AML_F(address64_extended, granularity),
807 NATIVE_F(address64_extended, granularity), IMM(6)),
808 CONVERT_TYPE_SPECIFIC_FLAGS(address64_extended),
809};
810
811static const struct uacpi_resource_convert_instruction
813 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
814 NATIVE_F(extended_irq, direction), IMM(0)),
815 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
816 NATIVE_F(extended_irq, triggering), IMM(1)),
817 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
818 NATIVE_F(extended_irq, polarity), IMM(2)),
819 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
820 NATIVE_F(extended_irq, sharing), IMM(3)),
821 OP(BIT_FIELD_1, AML_F(extended_irq, flags),
822 NATIVE_F(extended_irq, wake_capability), IMM(4)),
823 OP(LOAD_8_STORE, AML_F(extended_irq, num_irqs),
824 NATIVE_F(extended_irq, num_irqs), IMM(4)),
825 OP(RESOURCE_SOURCE, NATIVE_F(extended_irq, source)),
826
827 // Use FIELD_8 here since the accumulator has been multiplied by 4
828 OP(FIELD_8, AML_F(extended_irq, irqs), NATIVE_F(extended_irq, irqs)),
829 END(),
830};
831
833 OP(FIELD_8, AML_F(clock_input, revision_id),
834 NATIVE_F(clock_input, revision_id)),
835 OP(BIT_FIELD_1, AML_F(clock_input, flags), NATIVE_F(clock_input, frequency),
836 IMM(0)),
837 OP(BIT_FIELD_2, AML_F(clock_input, flags), NATIVE_F(clock_input, scale),
838 IMM(1)),
839 OP(FIELD_16, AML_F(clock_input, divisor), NATIVE_F(clock_input, divisor)),
840 OP(FIELD_32, AML_F(clock_input, numerator), NATIVE_F(clock_input, numerator)),
841 OP(FIELD_8, AML_F(clock_input, source_index), NATIVE_F(clock_input, source.index)),
842 OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(clock_input, source)),
843 END(),
844};
845
846#define DECODE_SOURCE_INDEX(short_aml_name) \
847 OP(FIELD_8, AML_F(short_aml_name, source_index), \
848 NATIVE_F(short_aml_name, source.index)) \
849
850#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( \
851 short_aml_name, res_opcode, offset_field, res_field \
852) \
853 OP(LOAD_PIN_TABLE_LENGTH, AML_F(short_aml_name, offset_field), \
854 NATIVE_F(short_aml_name, pin_table_length)), \
855 OP(RESOURCE_##res_opcode, NATIVE_F(short_aml_name, res_field), \
856 AML_F(short_aml_name, offset_field), \
857 ARG2(AML_O(short_aml_name, vendor_data_offset))), \
858 OP(PIN_TABLE, AML_F(short_aml_name, pin_table_offset), \
859 NATIVE_F(short_aml_name, pin_table_length), \
860 ARG2(NATIVE_O(short_aml_name, pin_table))), \
861 OP(VENDOR_DATA, AML_F(short_aml_name, vendor_data_offset), \
862 NATIVE_F(short_aml_name, vendor_data_length), \
863 ARG2(NATIVE_O(short_aml_name, vendor_data)))
864
865static const struct uacpi_resource_convert_instruction
867 OP(FIELD_8, AML_F(gpio_connection, revision_id),
868 NATIVE_F(gpio_connection, revision_id)),
869 OP(BIT_FIELD_1, AML_F(gpio_connection, general_flags),
870 NATIVE_F(gpio_connection, direction)),
871 OP(FIELD_8, AML_F(gpio_connection, pull_configuration),
872 NATIVE_F(gpio_connection, pull_configuration)),
873 OP(FIELD_16, AML_F(gpio_connection, drive_strength),
874 NATIVE_F(gpio_connection, drive_strength), IMM(2)),
875 DECODE_SOURCE_INDEX(gpio_connection),
877 gpio_connection, SOURCE_NO_INDEX, source_offset, source
878 ),
879 OP(LOAD_8_STORE, AML_F(gpio_connection, type), NATIVE_F(gpio_connection, type)),
880 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_GPIO_CONNECTION_INTERRUPT), IMM(5)),
881 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
882 NATIVE_F(gpio_connection, interrupt.triggering), IMM(0)),
883 OP(BIT_FIELD_2, AML_F(gpio_connection, connection_flags),
884 NATIVE_F(gpio_connection, interrupt.polarity), IMM(1)),
885 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
886 NATIVE_F(gpio_connection, interrupt.sharing), IMM(3)),
887 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
888 NATIVE_F(gpio_connection, interrupt.wake_capability), IMM(4)),
889 END(),
890 OP(SKIP_IF_NOT_EQUALS, ARG0(UACPI_GPIO_CONNECTION_IO), IMM(3)),
891 OP(BIT_FIELD_2, AML_F(gpio_connection, connection_flags),
892 NATIVE_F(gpio_connection, io.restriction), IMM(0)),
893 OP(BIT_FIELD_1, AML_F(gpio_connection, connection_flags),
894 NATIVE_F(gpio_connection, io.sharing), IMM(3)),
895 END(),
896 OP(FIELD_16, AML_F(gpio_connection, connection_flags),
897 NATIVE_F(gpio_connection, type_specific), IMM(0xFF)),
898 END(),
899};
900
901static const struct uacpi_resource_convert_instruction
903 OP(FIELD_8, AML_F(pin_function, revision_id),
904 NATIVE_F(pin_function, revision_id)),
905 OP(BIT_FIELD_1, AML_F(pin_function, flags),
906 NATIVE_F(pin_function, sharing), IMM(0)),
907 OP(FIELD_8, AML_F(pin_function, pull_configuration),
908 NATIVE_F(pin_function, pull_configuration)),
909 OP(FIELD_16, AML_F(pin_function, function_number),
910 NATIVE_F(pin_function, function_number)),
911 DECODE_SOURCE_INDEX(pin_function),
913 pin_function, SOURCE_NO_INDEX, source_offset, source
914 ),
915 END(),
916};
917
918static const struct uacpi_resource_convert_instruction
920 OP(FIELD_8, AML_F(pin_configuration, revision_id),
921 NATIVE_F(pin_configuration, revision_id)),
922 OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
923 NATIVE_F(pin_configuration, sharing), IMM(0)),
924 OP(BIT_FIELD_1, AML_F(pin_configuration, flags),
925 NATIVE_F(pin_configuration, direction), IMM(1)),
926 OP(FIELD_8, AML_F(pin_configuration, type),
927 NATIVE_F(pin_configuration, type)),
928 OP(FIELD_32, AML_F(pin_configuration, value),
929 NATIVE_F(pin_configuration, value)),
930 DECODE_SOURCE_INDEX(pin_configuration),
932 pin_configuration, SOURCE_NO_INDEX, source_offset, source
933 ),
934 END(),
935};
936
938 OP(FIELD_8, AML_F(pin_group, revision_id),
939 NATIVE_F(pin_group, revision_id)),
940 OP(BIT_FIELD_1, AML_F(pin_group, flags),
941 NATIVE_F(pin_group, direction), IMM(0)),
943 pin_group, LABEL, source_lable_offset, label
944 ),
945 END(),
946};
947
948#define DECODE_PIN_GROUP_RES_SOURCES(postfix) \
949 DECODE_SOURCE_INDEX(pin_group_##postfix), \
950 OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(pin_group_##postfix, source), \
951 AML_F(pin_group_##postfix, source_offset), \
952 ARG2(AML_O(pin_group_##postfix, source_lable_offset))), \
953 OP(LOAD_16_NATIVE, NATIVE_F(pin_group_##postfix, source.length)), \
954 OP(RESOURCE_LABEL, NATIVE_F(pin_group_##postfix, label), \
955 AML_F(pin_group_##postfix, source_lable_offset), \
956 ARG2(AML_O(pin_group_##postfix, vendor_data_offset))), \
957 OP(VENDOR_DATA, AML_F(pin_group_##postfix, vendor_data_offset), \
958 NATIVE_F(pin_group_##postfix, vendor_data_length), \
959 ARG2(NATIVE_O(pin_group_##postfix, vendor_data)))
960
961static const struct uacpi_resource_convert_instruction
963 OP(FIELD_8, AML_F(pin_group_function, revision_id),
964 NATIVE_F(pin_group_function, revision_id)),
965 OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
966 NATIVE_F(pin_group_function, sharing), IMM(0)),
967 OP(BIT_FIELD_1, AML_F(pin_group_function, flags),
968 NATIVE_F(pin_group_function, direction), IMM(1)),
969 OP(FIELD_16, AML_F(pin_group_function, function),
970 NATIVE_F(pin_group_function, function)),
972 END(),
973};
974
975static const struct uacpi_resource_convert_instruction
977 OP(FIELD_8, AML_F(pin_group_configuration, revision_id),
978 NATIVE_F(pin_group_configuration, revision_id)),
979 OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
980 NATIVE_F(pin_group_configuration, sharing), IMM(0)),
981 OP(BIT_FIELD_1, AML_F(pin_group_configuration, flags),
982 NATIVE_F(pin_group_configuration, direction), IMM(1)),
983 OP(FIELD_8, AML_F(pin_group_configuration, type),
984 NATIVE_F(pin_group_configuration, type)),
985 OP(FIELD_32, AML_F(pin_group_configuration, value),
986 NATIVE_F(pin_group_configuration, value)),
987 DECODE_PIN_GROUP_RES_SOURCES(configuration),
988 END(),
989};
990
991static const struct uacpi_resource_convert_instruction
993 OP(FIELD_8, AML_F(serial, revision_id),
994 NATIVE_F(serial_bus_common, revision_id)),
995 OP(FIELD_8, AML_F(serial, type_specific_revision_id),
996 NATIVE_F(serial_bus_common, type_revision_id)),
997 OP(FIELD_8, AML_F(serial, source_index),
998 NATIVE_F(serial_bus_common, source.index)),
999 OP(FIELD_16, AML_F(serial, type_data_length),
1000 NATIVE_F(serial_bus_common, type_data_length)),
1001 OP(BIT_FIELD_1, AML_F(serial, flags),
1002 NATIVE_F(serial_bus_common, mode), IMM(0)),
1003 OP(BIT_FIELD_1, AML_F(serial, flags),
1004 NATIVE_F(serial_bus_common, direction), IMM(1)),
1005 OP(BIT_FIELD_1, AML_F(serial, flags),
1006 NATIVE_F(serial_bus_common, sharing), IMM(2)),
1007 OP(SERIAL_TYPE_SPECIFIC, AML_F(serial, type),
1008 NATIVE_F(serial_bus_common, type)),
1009 OP(RESOURCE_SOURCE_NO_INDEX, NATIVE_F(serial_bus_common, source)),
1010 OP(LOAD_8_NATIVE, NATIVE_F(serial_bus_common, type)),
1011 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_I2C), IMM(4)),
1012 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1013 NATIVE_F(i2c_connection, addressing_mode), IMM(0)),
1014 OP(FIELD_32, AML_F(serial_i2c, connection_speed),
1015 NATIVE_F(i2c_connection, connection_speed), IMM(0xFF)),
1016 OP(FIELD_16, AML_F(serial_i2c, slave_address),
1017 NATIVE_F(i2c_connection, slave_address)),
1018 END(),
1019 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_SPI), IMM(5)),
1020 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1021 NATIVE_F(spi_connection, wire_mode), IMM(0)),
1022 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1023 NATIVE_F(spi_connection, device_polarity), IMM(1)),
1024 OP(FIELD_32, AML_F(serial_spi, connection_speed),
1025 NATIVE_F(spi_connection, connection_speed), IMM(0xFF)),
1026 OP(FIELD_8, AML_F(serial_spi, data_bit_length),
1027 NATIVE_F(spi_connection, data_bit_length), IMM(5)),
1028 END(),
1029 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_UART), IMM(8)),
1030 OP(BIT_FIELD_2, AML_F(serial, type_specific_flags),
1031 NATIVE_F(uart_connection, flow_control), IMM(0)),
1032 OP(BIT_FIELD_2, AML_F(serial, type_specific_flags),
1033 NATIVE_F(uart_connection, stop_bits), IMM(2)),
1034 OP(BIT_FIELD_3, AML_F(serial, type_specific_flags),
1035 NATIVE_F(uart_connection, data_bits), IMM(4)),
1036 OP(BIT_FIELD_1, AML_F(serial, type_specific_flags),
1037 NATIVE_F(uart_connection, endianness), IMM(7)),
1038 OP(FIELD_32, AML_F(serial_uart, baud_rate),
1039 NATIVE_F(uart_connection, baud_rate), IMM(0xFF)),
1040 OP(FIELD_16, AML_F(serial_uart, rx_fifo),
1041 NATIVE_F(uart_connection, rx_fifo), IMM(2)),
1042 OP(FIELD_8, AML_F(serial_uart, parity),
1043 NATIVE_F(uart_connection, parity), IMM(2)),
1044 END(),
1045 OP(SKIP_IF_NOT_EQUALS, ARG0(ACPI_SERIAL_TYPE_CSI2), IMM(3)),
1046 OP(BIT_FIELD_2, AML_F(serial, type_specific_flags),
1047 NATIVE_F(csi2_connection, phy_type), IMM(0)),
1048 OP(BIT_FIELD_6, AML_F(serial, type_specific_flags),
1049 NATIVE_F(csi2_connection, local_port), IMM(2)),
1050 END(),
1051
1052 /*
1053 * Insert a trap to catch unimplemented types, this should be unreachable
1054 * because of validation earlier.
1055 */
1056 OP(UNREACHABLE),
1057};
1058
1059#define NATIVE_RESOURCE_HEADER_SIZE 8
1060
1061#define DEFINE_SMALL_AML_RESOURCE(aml_type_enum, native_type_enum, \
1062 aml_struct, native_struct, ...) \
1063 [aml_type_enum] = { \
1064 .type = aml_type_enum, \
1065 .native_type = native_type_enum, \
1066 .resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
1067 .aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
1068 .native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
1069 __VA_ARGS__ \
1070 }
1071
1072#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR( \
1073 aml_type_enum, native_type_enum, aml_struct, ... \
1074) \
1075 [aml_type_enum] = { \
1076 .type = aml_type_enum, \
1077 .native_type = native_type_enum, \
1078 .resource_kind = UACPI_AML_RESOURCE_KIND_SMALL, \
1079 .aml_size = sizeof(aml_struct) - SMALL_ITEM_HEADER_SIZE, \
1080 .native_size = NATIVE_RESOURCE_HEADER_SIZE, \
1081 __VA_ARGS__ \
1082 }
1083
1084#define DEFINE_LARGE_AML_RESOURCE(aml_type_enum, native_type_enum, \
1085 aml_struct, native_struct, ...) \
1086 [aml_type_enum] = { \
1087 .type = aml_type_enum, \
1088 .native_type = native_type_enum, \
1089 .resource_kind = UACPI_AML_RESOURCE_KIND_LARGE, \
1090 .aml_size = sizeof(aml_struct) - LARGE_ITEM_HEADER_SIZE, \
1091 .native_size = sizeof(native_struct) + NATIVE_RESOURCE_HEADER_SIZE, \
1092 __VA_ARGS__ \
1093 }
1094
1099 struct acpi_resource_irq,
1106 ),
1110 struct acpi_resource_dma,
1116 ),
1126 ),
1130 struct acpi_resource_end_dependent,
1132 ),
1136 struct acpi_resource_io,
1140 .to_aml = convert_io,
1141 ),
1150 ),
1159 ),
1163 struct acpi_resource_vendor_defined_type0,
1170 ),
1174 struct acpi_resource_end_tag,
1176 ),
1185 ),
1194 ),
1198 struct acpi_resource_vendor_defined_type1,
1205 ),
1214 ),
1223 ),
1232 .to_native = convert_address32,
1233 .to_aml = convert_address32,
1234 ),
1243 .to_native = convert_address16,
1244 .to_aml = convert_address16,
1245 ),
1256 ),
1265 .to_native = convert_address64,
1266 .to_aml = convert_address64,
1267 ),
1271 struct acpi_resource_address64_extended,
1276 ),
1280 struct acpi_resource_gpio_connection,
1287 ),
1298 ),
1301 0, // the native type here is determined dynamically
1302 struct acpi_resource_serial,
1309 ),
1313 struct acpi_resource_pin_configuration,
1320 ),
1331 ),
1342 ),
1346 struct acpi_resource_pin_group_configuration,
1353 ),
1357 struct acpi_resource_clock_input,
1364 ),
1365};
1366
1368{
1369 if (raw_byte & ACPI_LARGE_ITEM) {
1370 return aml_resource_to_type[
1372 ];
1373 }
1374
1375 return aml_resource_to_type[
1377 ];
1378}
1379
1382)
1383{
1385
1386 /*
1387 * Resource header is not included in size for both, so we subtract
1388 * the header size from bytes_left to validate it.
1389 */
1390 if (*data & ACPI_LARGE_ITEM) {
1391 if (uacpi_unlikely(bytes_left < 3))
1393
1394 uacpi_memcpy(&size, data + 1, sizeof(size));
1397 ];
1398 } else {
1402 ];
1403 }
1404
1405 if (uacpi_unlikely(size > bytes_left))
1407
1408 *out_size = size;
1409 return UACPI_STATUS_OK;
1410}
1411
1413{
1416 uacpi_error("invalid/unsupported serial connection type %d\n", type);
1418 }
1419
1420 return UACPI_STATUS_OK;
1421}
1422
1425)
1426{
1428 uacpi_iteration_decision decision;
1429 uacpi_u8 *data;
1430 uacpi_size bytes_left;
1431 uacpi_u16 resource_size;
1433 const struct uacpi_resource_spec *spec;
1434
1435 bytes_left = buffer.length;
1436 data = buffer.bytes;
1437
1438 while (bytes_left) {
1442
1443 ret = get_aml_resource_size(data, bytes_left, &resource_size);
1445 return ret;
1446
1447 spec = &aml_resources[type];
1448 switch (spec->size_kind) {
1450 if (resource_size != spec->aml_size)
1452 break;
1454 if (resource_size < spec->aml_size)
1456 break;
1458 if (resource_size != spec->aml_size &&
1459 resource_size != (spec->aml_size - 1))
1461 break;
1462 default:
1464 }
1465
1467 struct acpi_resource_serial *serial;
1468
1469 serial = (struct acpi_resource_serial*)data;
1470
1473 return ret;
1474 }
1475
1476 decision = cb(user, data, resource_size, spec);
1477 switch (decision) {
1479 return UACPI_STATUS_OK;
1481 uacpi_size total_size = resource_size;
1482
1484 data += total_size;
1485 bytes_left -= total_size;
1486 break;
1487 }
1488 default:
1490 }
1491
1493 return UACPI_STATUS_OK;
1494 }
1495
1497}
1498
1500 void *opaque, uacpi_u8 *data, uacpi_u16 resource_size,
1501 const struct uacpi_resource_spec *spec
1502)
1503{
1504 uacpi_u8 **out_ptr = opaque;
1505 UACPI_UNUSED(resource_size);
1506
1507 if (spec->type != UACPI_AML_RESOURCE_END_TAG)
1509
1510 *out_ptr = data;
1512}
1513
1515 uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec
1516)
1517{
1518 uacpi_size final_size = spec->native_size;
1519
1520 if (spec->extra_size_for_native)
1521 final_size += spec->extra_size_for_native(spec, data, size);
1522
1523 return UACPI_ALIGN_UP(final_size, sizeof(void*), uacpi_size);
1524}
1525
1527 uacpi_data_view buffer, uacpi_size *out_offset
1528)
1529{
1530 uacpi_u8 *end_tag_ptr = UACPI_NULL;
1532
1533 if (buffer.length == 0) {
1534 *out_offset = 0;
1535 return UACPI_STATUS_OK;
1536 }
1537
1538 /*
1539 * This returning UACPI_STATUS_OK guarantees that end_tag_ptr is set to
1540 * a valid value because a missing end tag would produce a
1541 * UACPI_STATUS_NO_RESOURCE_END_TAG error.
1542 */
1545 return ret;
1546
1547 *out_offset = end_tag_ptr - buffer.bytes;
1548 return UACPI_STATUS_OK;
1549}
1550
1552 union {
1553 void *buf;
1556 };
1559};
1560
1563)
1564{
1565 return ctx->just_one ? UACPI_ITERATION_DECISION_BREAK :
1567}
1568
1569// Opcodes that are the same for both AML->native and native->AML
1570#define CONVERSION_OPCODES_COMMON(native_buf) \
1571 case UACPI_RESOURCE_CONVERT_OPCODE_END: \
1572 return conditional_continue(ctx); \
1573 \
1574 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_8: \
1575 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_16: \
1576 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_32: \
1577 case UACPI_RESOURCE_CONVERT_OPCODE_FIELD_64: { \
1578 uacpi_u8 bytes; \
1579 \
1580 bytes = 1 << (insn->code - UACPI_RESOURCE_CONVERT_OPCODE_FIELD_8); \
1581 accumulator = insn->imm == 0xFF ? 0 : accumulator + insn->imm; \
1582 \
1583 uacpi_memcpy(dst, src, bytes * UACPI_MAX(1, accumulator)); \
1584 accumulator = 0; \
1585 break; \
1586 } \
1587 \
1588 case UACPI_RESOURCE_CONVERT_OPCODE_SKIP_IF_AML_SIZE_LESS_THAN: \
1589 if (aml_size < insn->arg0) \
1590 pc += insn->imm; \
1591 break; \
1592 case UACPI_RESOURCE_CONVERT_OPCODE_SKIP_IF_NOT_EQUALS: \
1593 if (insn->arg0 != accumulator) \
1594 pc += insn->imm; \
1595 break; \
1596 \
1597 case UACPI_RESOURCE_CONVERT_OPCODE_SET_TO_IMM: \
1598 uacpi_memcpy(dst, &insn->imm, sizeof(insn->imm)); \
1599 break; \
1600 \
1601 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_IMM: \
1602 accumulator = insn->imm; \
1603 break; \
1604 \
1605 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_8_STORE: \
1606 uacpi_memcpy_zerout(&accumulator, src, sizeof(accumulator), 1); \
1607 uacpi_memcpy(dst, &accumulator, 1); \
1608 \
1609 if (insn->imm) \
1610 accumulator *= insn->imm; \
1611 break; \
1612 \
1613 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_8_NATIVE: \
1614 case UACPI_RESOURCE_CONVERT_OPCODE_LOAD_16_NATIVE: { \
1615 uacpi_u8 bytes; \
1616 \
1617 bytes = \
1618 1 << (insn->code - UACPI_RESOURCE_CONVERT_OPCODE_LOAD_8_NATIVE); \
1619 uacpi_memcpy_zerout( \
1620 &accumulator, native_buf, sizeof(accumulator), bytes \
1621 ); \
1622 break; \
1623 } \
1624 \
1625 case UACPI_RESOURCE_CONVERT_OPCODE_UNREACHABLE: \
1626 default: \
1627 if (insn->code != UACPI_RESOURCE_CONVERT_OPCODE_UNREACHABLE) { \
1628 uacpi_error("unhandled resource conversion opcode %d\n", \
1629 insn->code); \
1630 } else { \
1631 uacpi_error("tried to execute unreachable conversion opcode\n"); \
1632 } \
1633 ctx->st = UACPI_STATUS_INTERNAL_ERROR; \
1634 return UACPI_ITERATION_DECISION_BREAK;
1635
1636#define PTR_AT(ptr, offset) (void*)((uacpi_u8*)(ptr) + (offset))
1637
1638#define NATIVE_OFFSET(res, offset) \
1639 PTR_AT(res, (offset) + (sizeof(uacpi_u32) * 2))
1640
1641#define NATIVE_FIELD(res, name, field) \
1642 NATIVE_OFFSET(res, NATIVE_O(name, field))
1643
1644#define CHECK_AML_OOB(offset, prefix, what) \
1645 if (uacpi_unlikely(offset > ((uacpi_u32)aml_size + header_size))) { \
1646 uacpi_error(prefix what " is OOB: %zu > %u\n", \
1647 (uacpi_size)offset, (uacpi_u32)aml_size + header_size); \
1648 ctx->st = UACPI_STATUS_AML_INVALID_RESOURCE; \
1649 return UACPI_ITERATION_DECISION_BREAK; \
1650 }
1651
1652#define CHECK_AML_OFFSET_BASE(offset, what) \
1653 if (uacpi_unlikely(offset < base_aml_size_with_header)) { \
1654 uacpi_error( \
1655 "invalid " what " offset: %zu, expected at least %u\n", \
1656 (uacpi_size)offset, base_aml_size_with_header); \
1657 ctx->st = UACPI_STATUS_AML_INVALID_RESOURCE; \
1658 return UACPI_ITERATION_DECISION_BREAK; \
1659 }
1660
1661#define CHECK_AML_OFFSET(offset, what) \
1662 CHECK_AML_OOB(offset, "end of ", what) \
1663 CHECK_AML_OFFSET_BASE(offset, what)
1664
1667)
1668{
1669 return (type - ACPI_SERIAL_TYPE_I2C) +
1671}
1672
1674 void *opaque, uacpi_u8 *data, uacpi_u16 aml_size,
1675 const struct uacpi_resource_spec *spec
1676)
1677{
1678 struct resource_conversion_ctx *ctx = opaque;
1679 uacpi_resource *resource = ctx->buf;
1680 const struct uacpi_resource_convert_instruction *insns, *insn;
1681 uacpi_u8 header_size, pc = 0;
1682 uacpi_u8 *src, *dst;
1683 void *resource_end;
1684 uacpi_u16 base_aml_size;
1685 uacpi_u32 base_aml_size_with_header, accumulator = 0;
1686
1687 insns = spec->to_native;
1688
1690 resource->type = spec->native_type;
1691 resource->length = native_size_for_aml_resource(data, aml_size, spec);
1692 resource_end = ctx->byte_buf + spec->native_size;
1693 ctx->byte_buf += resource->length;
1694
1695 base_aml_size = base_aml_size_with_header = spec->aml_size;
1696 base_aml_size_with_header += header_size;
1697
1698 if (insns == UACPI_NULL)
1699 return conditional_continue(ctx);
1700
1701 for (;;) {
1702 insn = &insns[pc++];
1703
1704 src = data + insn->aml_offset;
1706
1707 switch (insn->code) {
1710 uacpi_size i, j, max_bit;
1712
1714 max_bit = 16;
1715 uacpi_memcpy(&value, src, sizeof(uacpi_u16));
1716 } else {
1717 max_bit = 8;
1719 &value, src, sizeof(value), sizeof(uacpi_u8)
1720 );
1721 }
1722
1723 for (i = 0, j = 0; i < max_bit; ++i) {
1724 if (!(value & (1 << i)))
1725 continue;
1726
1727 dst[j++] = i;
1728 }
1729
1731 break;
1732 }
1733
1739
1741 mask = (1 << mask) - 1;
1742
1743 value = (*src >> insn->imm) & mask;
1744 uacpi_memcpy(dst, &value, sizeof(value));
1745 break;
1746 }
1747
1749 accumulator = aml_size;
1750 uacpi_memcpy(dst, &accumulator, 4);
1751 break;
1752
1756 uacpi_size offset = 0, max_offset, length = 0;
1757 uacpi_char *src_string, *dst_string;
1758 union {
1759 void *ptr;
1762 } dst_name = { .ptr = dst };
1763
1764 /*
1765 * Check if the string is bounded by anything at the top. If not, we
1766 * just assume it ends at the end of the resource.
1767 */
1768 if (insn->arg2) {
1769 uacpi_memcpy_zerout(&max_offset, data + insn->arg2,
1770 sizeof(max_offset), sizeof(uacpi_u16));
1771 CHECK_AML_OFFSET(max_offset, "resource source");
1772 } else {
1773 max_offset = aml_size + header_size;
1774 }
1775
1776 offset += base_aml_size_with_header;
1777 offset += accumulator;
1778
1780 dst_name.source->index_present = UACPI_TRUE;
1781
1782 if (offset >= max_offset) {
1784 dst_name.source->index_present = UACPI_FALSE;
1785 break;
1786 }
1787
1788 src_string = PTR_AT(data, offset);
1789
1791 uacpi_memcpy(&dst_name.source->index, src_string++, 1);
1792 offset++;
1793 }
1794
1795 if (offset == max_offset)
1796 break;
1797
1798 while (offset++ < max_offset) {
1799 if (src_string[length++] == '\0')
1800 break;
1801 }
1802
1803 if (src_string[length - 1] != '\0') {
1804 uacpi_error("non-null-terminated resource source string\n");
1807 }
1808
1809 dst_string = PTR_AT(resource_end, accumulator);
1810 uacpi_memcpy(dst_string, src_string, length);
1811
1813 dst_name.label->length = length;
1814 dst_name.label->string = dst_string;
1815 } else {
1816 dst_name.source->length = length;
1817 dst_name.source->string = dst_string;
1818 }
1819
1820 break;
1821 }
1822
1824 uacpi_memcpy_zerout(&accumulator, src,
1825 sizeof(accumulator), sizeof(uacpi_u16));
1826 CHECK_AML_OFFSET(accumulator, "pin table");
1827
1828 accumulator -= base_aml_size_with_header;
1829 break;
1830
1832 uacpi_u16 entry_count = accumulator / 2;
1833
1834 /*
1835 * Pin table is stored right at the end of the resource buffer,
1836 * copy the data there.
1837 */
1839 resource_end,
1840 data + base_aml_size_with_header,
1841 accumulator
1842 );
1843
1844 // Set pin_table_length
1845 uacpi_memcpy(dst, &entry_count, sizeof(entry_count));
1846
1847 // Set pin_table pointer
1849 &resource_end, sizeof(void*));
1850 break;
1851 }
1852
1855 uacpi_u16 data_offset, offset_from_end;
1856 void *native_dst, *vendor_data;
1857
1858 uacpi_memcpy(&data_offset, src, sizeof(data_offset));
1859 CHECK_AML_OFFSET(data_offset, "vendor data");
1860
1861 vendor_data = data + data_offset;
1862
1863 /*
1864 * Rebase the offset to cut off the header as it's not included
1865 * in the size fields.
1866 */
1867 data_offset -= header_size;
1868
1869 length = aml_size - data_offset;
1870 if (length == 0)
1871 break;
1872
1873 uacpi_memcpy(dst, &length, sizeof(uacpi_u16));
1874
1875 offset_from_end = data_offset - base_aml_size;
1876 native_dst = PTR_AT(resource_end, offset_from_end);
1877
1878 uacpi_memcpy(native_dst, vendor_data, length);
1880 &native_dst, sizeof(void*));
1881 break;
1882 }
1883
1885 uacpi_resource_serial_bus_common *serial_bus_common;
1886 uacpi_u8 serial_type, extra_size, type_length;
1887
1888 serial_bus_common = &resource->serial_bus_common;
1889 serial_type = *src;
1890 serial_bus_common->type = serial_type;
1891 resource->type = aml_serial_to_native_type(serial_type);
1892
1893 /*
1894 * Now that we know the serial type rebase the end pointers and
1895 * sizes.
1896 */
1897 resource_end = PTR_AT(
1898 resource_end,
1900 );
1901 extra_size = aml_serial_resource_to_extra_aml_size[serial_type];
1902 base_aml_size += extra_size;
1903 base_aml_size_with_header += extra_size;
1904
1905 type_length = serial_bus_common->type_data_length;
1906 if (uacpi_unlikely(type_length < extra_size)) {
1908 "invalid type-specific data length: %d, "
1909 "expected at least %d\n", type_length, extra_size
1910 );
1913 }
1914
1915 /*
1916 * Calculate the length of the vendor data. All the extra data
1917 * beyond the end of type-specific size is considered vendor data.
1918 */
1919 accumulator = type_length - extra_size;
1920 if (accumulator == 0)
1921 break;
1922
1923 serial_bus_common->vendor_data_length = accumulator;
1924 serial_bus_common->vendor_data = resource_end;
1926 resource_end,
1927 data + base_aml_size_with_header,
1928 accumulator
1929 );
1930 break;
1931 }
1932
1934 }
1935 }
1936}
1937
1939 void *opaque, uacpi_u8 *data, uacpi_u16 resource_size,
1940 const struct uacpi_resource_spec *spec
1941)
1942{
1943 struct resource_conversion_ctx *ctx = opaque;
1944 uacpi_size size_for_this;
1945
1946 size_for_this = native_size_for_aml_resource(data, resource_size, spec);
1947 if (size_for_this == 0 || (ctx->size + size_for_this) < ctx->size) {
1948 uacpi_error("invalid native size for aml resource: %zu\n",
1949 size_for_this);
1952 }
1953
1954 ctx->size += size_for_this;
1955 return conditional_continue(ctx);
1956}
1957
1960 uacpi_object **out_obj
1961)
1962{
1964 uacpi_bool is_device;
1965
1968 return ret;
1969
1970 if (uacpi_unlikely(!is_device))
1972
1974 node, method, out_obj
1975 );
1976}
1977
1979 uacpi_data_view aml_buffer, uacpi_resources **out_resources
1980)
1981{
1983 struct resource_conversion_ctx ctx = { 0 };
1985
1988 );
1990 return ret;
1991
1992 if (uacpi_unlikely_error(ctx.st))
1993 return ctx.st;
1994
1995 // Realistically any resource buffer bigger than this is probably a bug
1996 if (uacpi_unlikely(ctx.size > (5 * 1024u * 1024u))) {
1997 uacpi_error("bug: bogus native resource buffer size %zu\n", ctx.size);
1999 }
2000
2004 resources->length = ctx.size;
2005 resources->entries = UACPI_PTR_ADD(resources, sizeof(uacpi_resources));
2006
2007 ctx = (struct resource_conversion_ctx) {
2008 .buf = resources->entries,
2009 };
2010
2014 return ret;
2015 }
2016
2017 *out_resources = resources;
2018 return ret;
2019}
2020
2022 uacpi_data_view aml_buffer, uacpi_resource **out_resource
2023)
2024{
2026 struct resource_conversion_ctx ctx = {
2027 .just_one = UACPI_TRUE,
2028 };
2030
2033 );
2035 return ret;
2036
2040
2041 ctx = (struct resource_conversion_ctx) {
2042 .buf = resource,
2043 .just_one = UACPI_TRUE,
2044 };
2045
2049 return ret;
2050 }
2051
2052 *out_resource = resource;
2053 return ret;
2054}
2055
2057{
2058 if (resources == UACPI_NULL)
2059 return;
2060
2061 uacpi_free(resources, sizeof(uacpi_resources) + resources->length);
2062}
2063
2065{
2066 if (resource == UACPI_NULL)
2067 return;
2068
2069 uacpi_free(resource, resource->length);
2070}
2071
2074 uacpi_resources **out_resources
2075)
2076{
2080
2083 return ret;
2084
2085 uacpi_buffer_to_view(obj->buffer, &buffer);
2086
2087 ret = uacpi_native_resources_from_aml(buffer, out_resources);
2089
2090 return ret;
2091}
2092
2095)
2096{
2097 return extract_native_resources_from_method(device, "_CRS", out_resources);
2098}
2099
2102)
2103{
2104 return extract_native_resources_from_method(device, "_PRS", out_resources);
2105}
2106
2109 uacpi_resources **out_resources
2110)
2111{
2112 return extract_native_resources_from_method(device, method, out_resources);
2113}
2114
2117)
2118{
2119 uacpi_size bytes_left = resources->length;
2120 uacpi_resource *current = resources->entries;
2121 uacpi_iteration_decision decision;
2122
2123 while (bytes_left) {
2124 // At least the head bytes
2125 if (uacpi_unlikely(bytes_left < 4)) {
2126 uacpi_error("corrupted resource buffer %p length %zu\n",
2127 resources, resources->length);
2129 }
2130
2132 uacpi_error("invalid resource type %d\n", current->type);
2134 }
2135
2136 if (uacpi_unlikely(current->length > bytes_left)) {
2137 uacpi_error("corrupted resource@%p length %u (%zu bytes left)\n",
2138 current, current->length, bytes_left);
2140 }
2141
2142 decision = cb(user, current);
2143
2144 if (decision == UACPI_ITERATION_DECISION_BREAK ||
2146 return UACPI_STATUS_OK;
2147
2148 bytes_left -= current->length;
2149 current = (uacpi_resource*)((uacpi_u8*)current + current->length);
2150 }
2151
2153}
2154
2158)
2159{
2162
2165 return ret;
2166
2169
2170 return ret;
2171}
2172
2175)
2176{
2178}
2179
2181 uacpi_resource *resource, const struct uacpi_resource_spec *spec
2182)
2183{
2184 return spec->size_for_aml ?
2185 spec->size_for_aml(spec, resource) :
2187}
2188
2190 void *opaque, uacpi_resource *resource
2191)
2192{
2193 struct resource_conversion_ctx *ctx = opaque;
2194 const struct uacpi_resource_spec *spec;
2195 const struct uacpi_resource_convert_instruction *insns, *insn;
2196 uacpi_u8 pc = 0;
2197 uacpi_u8 *dst_base, *src, *dst;
2198 uacpi_u32 aml_size, base_aml_size_with_header, accumulator = 0;
2199 void *resource_end;
2200
2202 aml_size = aml_size_for_native_resource(resource, spec);
2203 insns = spec->to_aml;
2204
2205 dst_base = ctx->byte_buf;
2206 ctx->byte_buf += aml_size;
2208
2209 base_aml_size_with_header = spec->aml_size;
2210 base_aml_size_with_header += aml_resource_kind_to_header_size[
2211 spec->resource_kind
2212 ];
2213 resource_end = PTR_AT(resource, spec->native_size);
2214
2216 *dst_base = ACPI_LARGE_ITEM | type_to_aml_resource[spec->type];
2217 uacpi_memcpy(dst_base + 1, &aml_size, sizeof(uacpi_u16));
2218 } else {
2220 *dst_base |= aml_size;
2221 }
2222
2223 if (insns == UACPI_NULL)
2225
2226 for (;;) {
2227 insn = &insns[pc++];
2228
2230 dst = dst_base + insn->aml_offset;
2231
2232 switch (insn->code) {
2235 uacpi_u8 i, *array_size, bytes = 1;
2236 uacpi_u16 mask = 0;
2237
2239 for (i = 0; i < *array_size; ++i)
2240 mask |= 1 << src[i];
2241
2243 bytes = 2;
2244
2246 break;
2247 }
2248
2253 *dst |= *src << insn->imm;
2254 break;
2255
2257 accumulator = aml_size;
2258 break;
2259
2263 uacpi_size source_offset, length;
2264 uacpi_u8 *dst_string;
2265 const uacpi_char *src_string;
2266 union {
2267 void *ptr;
2270 } src_name = { .ptr = src };
2271
2272 source_offset = base_aml_size_with_header + accumulator;
2273 dst_string = dst_base + source_offset;
2274
2275 if (insn->aml_offset)
2276 uacpi_memcpy(dst, &source_offset, sizeof(uacpi_u16));
2277
2279 src_name.source->index_present)
2280 uacpi_memcpy(dst_string++, &src_name.source->index, 1);
2281
2283 length = src_name.label->length;
2284 src_string = src_name.label->string;
2285 } else {
2286 length = src_name.source->length;
2287 src_string = src_name.source->string;
2288 }
2289
2290 if (length == 0)
2291 break;
2292
2293 if (uacpi_unlikely(src_string == UACPI_NULL)) {
2295 "source string length is %zu but the pointer is NULL\n",
2296 length
2297 );
2300 }
2301
2302 uacpi_memcpy(dst_string, src_string, length);
2303 break;
2304 }
2305
2307 uacpi_memcpy_zerout(&accumulator, src,
2308 sizeof(accumulator), sizeof(uacpi_u16));
2309 accumulator *= sizeof(uacpi_u16);
2310 break;
2311
2313 /*
2314 * The pin table resides right at the end of the base resource,
2315 * set the offset to it in the AML we're encoding.
2316 */
2317 uacpi_memcpy(dst, &base_aml_size_with_header, sizeof(uacpi_u16));
2318
2319 /*
2320 * Copy the actual data. It also resides right at the end of the
2321 * native base resource.
2322 */
2324 dst_base + base_aml_size_with_header,
2325 resource_end,
2326 accumulator
2327 );
2328 break;
2329
2331 uacpi_u16 vendor_data_length, data_offset, vendor_data_offset;
2332 uacpi_u8 *vendor_data;
2333
2334 // Read the vendor_data pointer
2335 uacpi_memcpy(&vendor_data, NATIVE_OFFSET(resource, insn->arg2),
2336 sizeof(void*));
2337 uacpi_memcpy(&vendor_data_length, src, sizeof(uacpi_u16));
2338
2339 if (vendor_data == UACPI_NULL) {
2340 uacpi_size full_aml_size;
2341
2342 if (uacpi_unlikely(vendor_data_length != 0)) {
2344 "vendor_data_length is %d, but pointer is NULL\n",
2345 vendor_data_length
2346 );
2349 }
2350
2351 /*
2352 * There's no vendor data. The specification still mandates
2353 * that we fill the vendor data offset field correctly, meaning
2354 * we set it to the total length of the resource.
2355 */
2356 full_aml_size = aml_size;
2357 full_aml_size += aml_resource_kind_to_header_size[
2358 spec->resource_kind
2359 ];
2360
2361 uacpi_memcpy(dst, &full_aml_size, sizeof(uacpi_u16));
2362 break;
2363 }
2364
2365 /*
2366 * Calculate the offset of vendor data from the end of the native
2367 * resource and use it since it matches the offset from the end of
2368 * the AML resource.
2369 *
2370 * Non-zero value means there's a source string in between.
2371 */
2372 data_offset = vendor_data - (uacpi_u8*)resource_end;
2373 vendor_data_offset = data_offset + base_aml_size_with_header;
2374
2375 // Write vendor_data_offset
2376 uacpi_memcpy(dst, &vendor_data_offset, sizeof(uacpi_u16));
2377
2378 /*
2379 * Write vendor_data_length, this field is right after
2380 * vendor_data_offset, and is completely redundant, but it exists
2381 * nonetheless.
2382 */
2384 dst + sizeof(uacpi_u16),
2385 &vendor_data_length,
2386 sizeof(vendor_data_length)
2387 );
2388
2389 // Finally write the data itself
2391 dst_base + vendor_data_offset,
2392 vendor_data,
2393 vendor_data_length
2394 );
2395 break;
2396 }
2397
2399 uacpi_u8 serial_type = *src;
2400 *dst = serial_type;
2401
2402 ctx->st = validate_aml_serial_type(serial_type);
2403 if (uacpi_unlikely_error(ctx->st))
2405
2406 if (uacpi_unlikely(resource->type !=
2407 aml_serial_to_native_type(serial_type))) {
2409 "native serial resource type %d doesn't match expected %d\n",
2410 resource->type, aml_serial_to_native_type(serial_type)
2411 );
2414 }
2415
2416 // Rebase the end pointer & size now that we know the serial type
2417 resource_end = PTR_AT(
2418 resource_end,
2420 );
2421 base_aml_size_with_header += aml_serial_resource_to_extra_aml_size[
2422 serial_type
2423 ];
2424
2425 accumulator = resource->serial_bus_common.vendor_data_length;
2426 if (accumulator == 0)
2427 break;
2428
2429 // Copy vendor data
2431 dst_base + base_aml_size_with_header,
2432 resource_end,
2433 accumulator
2434 );
2435 break;
2436 }
2437
2439 }
2440 }
2441}
2442
2443#define INLINE_END_TAG &(uacpi_resource) { .type = UACPI_RESOURCE_TYPE_END_TAG }
2444
2446 uacpi_resources *native_resources, void *aml_buffer
2447)
2448{
2450 struct resource_conversion_ctx ctx = {
2451 .buf = aml_buffer,
2452 };
2453
2455 native_resources, do_native_resource_to_aml, &ctx
2456 );
2458 // An end tag is always included
2461 }
2463 return ret;
2464
2465 return ctx.st;
2466}
2467
2469 void *opaque, uacpi_resource *resource
2470)
2471{
2472 struct resource_conversion_ctx *ctx = opaque;
2473 const struct uacpi_resource_spec *spec;
2474 uacpi_size size_for_this;
2475
2476 // resource->type is sanitized to be valid here by the iteration function
2478
2479 size_for_this = aml_size_for_native_resource(resource, spec);
2480 if (size_for_this == 0 || (ctx->size + size_for_this) < ctx->size) {
2481 uacpi_error("invalid aml size for native resource: %zu\n",
2482 size_for_this);
2485 }
2486
2487 ctx->size += size_for_this;
2489}
2490
2492 uacpi_resources *resources, uacpi_object **out_template
2493)
2494{
2497 void *buffer;
2498 struct resource_conversion_ctx ctx = { 0 };
2499
2502 );
2504 // An end tag is always included
2507 }
2509 return ret;
2510 if (uacpi_unlikely_error(ctx.st))
2511 return ctx.st;
2512
2513 // Same reasoning as native_resource_from_aml
2514 if (uacpi_unlikely(ctx.size > (5 * 1024u * 1024u))) {
2515 uacpi_error("bug: bogus target aml resource buffer size %zu\n",
2516 ctx.size);
2518 }
2519
2523
2525 if (uacpi_unlikely(obj == UACPI_NULL)) {
2526 uacpi_free(buffer, ctx.size);
2528 }
2529
2530 obj->buffer->data = buffer;
2531 obj->buffer->size = ctx.size;
2532
2536
2537 if (ret == UACPI_STATUS_OK)
2538 *out_template = obj;
2539
2540 return ret;
2541}
2542
2545)
2546{
2548 uacpi_object *res_template;
2550
2553 return ret;
2554
2555 args.objects = &res_template;
2556 args.count = 1;
2557 ret = uacpi_eval(device, "_SRS", &args, UACPI_NULL);
2558
2559 uacpi_object_unref(res_template);
2560 return ret;
2561}
2562
2563#endif // !UACPI_BAREBONES_MODE
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
Definition: align.cpp:48
void user(int argc, const char *argv[])
Definition: cmds.c:1350
static PDB_INFORMATION information
Definition: db.cpp:178
const WCHAR * vendor
Definition: db.cpp:872
method
Definition: dragdrop.c:54
#define ACPI_RESOURCE_START_DEPENDENT
Definition: acpi.h:1081
#define ACPI_SMALL_ITEM_NAME_MASK
Definition: acpi.h:1073
#define ACPI_SERIAL_TYPE_MAX
Definition: acpi.h:1310
#define ACPI_RESOURCE_END_TAG
Definition: acpi.h:1087
#define ACPI_RESOURCE_SERIAL_CONNECTION
Definition: acpi.h:1102
#define ACPI_RESOURCE_ADDRESS32
Definition: acpi.h:1095
#define ACPI_RESOURCE_FIXED_DMA
Definition: acpi.h:1085
#define ACPI_SERIAL_TYPE_CSI2
Definition: acpi.h:1309
#define ACPI_RESOURCE_PIN_CONFIGURATION
Definition: acpi.h:1103
#define ACPI_RESOURCE_ADDRESS16
Definition: acpi.h:1096
#define ACPI_RESOURCE_CLOCK_INPUT
Definition: acpi.h:1107
#define ACPI_RESOURCE_IRQ
Definition: acpi.h:1079
#define ACPI_RESOURCE_VENDOR_TYPE0
Definition: acpi.h:1086
#define ACPI_RESOURCE_GPIO_CONNECTION
Definition: acpi.h:1100
#define ACPI_SERIAL_TYPE_SPI
Definition: acpi.h:1307
#define ACPI_SMALL_ITEM_NAME_IDX
Definition: acpi.h:1072
#define ACPI_RESOURCE_PIN_GROUP_FUNCTION
Definition: acpi.h:1105
#define ACPI_RESOURCE_PIN_GROUP
Definition: acpi.h:1104
#define ACPI_RESOURCE_VENDOR_TYPE1
Definition: acpi.h:1092
#define ACPI_RESOURCE_GENERIC_REGISTER
Definition: acpi.h:1091
#define ACPI_RESOURCE_MEMORY32
Definition: acpi.h:1093
#define ACPI_RESOURCE_IO
Definition: acpi.h:1083
#define ACPI_RESOURCE_PIN_FUNCTION
Definition: acpi.h:1101
#define ACPI_SMALL_ITEM_LENGTH_MASK
Definition: acpi.h:1074
#define ACPI_SERIAL_TYPE_I2C
Definition: acpi.h:1306
#define ACPI_RESOURCE_PIN_GROUP_CONFIGURATION
Definition: acpi.h:1106
#define ACPI_LARGE_ITEM
Definition: acpi.h:1070
#define ACPI_RESOURCE_ADDRESS64
Definition: acpi.h:1098
#define ACPI_RESOURCE_DMA
Definition: acpi.h:1080
#define ACPI_RESOURCE_END_DEPENDENT
Definition: acpi.h:1082
#define ACPI_RESOURCE_ADDRESS64_EXTENDED
Definition: acpi.h:1099
#define ACPI_RESOURCE_FIXED_MEMORY32
Definition: acpi.h:1094
#define ACPI_SERIAL_TYPE_UART
Definition: acpi.h:1308
#define ACPI_LARGE_ITEM_NAME_MASK
Definition: acpi.h:1076
#define ACPI_RESOURCE_EXTENDED_IRQ
Definition: acpi.h:1097
#define ACPI_RESOURCE_MEMORY24
Definition: acpi.h:1090
#define ACPI_RESOURCE_FIXED_IO
Definition: acpi.h:1084
uacpi_u16 uacpi_gpe_triggering triggering
Definition: event.h:118
#define UACPI_UNUSED(x)
Definition: helpers.h:7
#define uacpi_error(...)
Definition: log.h:21
#define uacpi_warn(...)
Definition: log.h:20
@ UACPI_AML_RESOURCE_KIND_LARGE
Definition: resources.h:52
@ UACPI_AML_RESOURCE_KIND_SMALL
Definition: resources.h:51
uacpi_aml_resource
Definition: resources.h:8
@ UACPI_AML_RESOURCE_END_TAG
Definition: resources.h:20
@ UACPI_AML_RESOURCE_PIN_GROUP
Definition: resources.h:37
@ UACPI_AML_RESOURCE_FIXED_MEMORY32
Definition: resources.h:27
@ UACPI_AML_RESOURCE_ADDRESS32
Definition: resources.h:28
@ UACPI_AML_RESOURCE_PIN_CONFIGURATION
Definition: resources.h:36
@ UACPI_AML_RESOURCE_FIXED_IO
Definition: resources.h:17
@ UACPI_AML_RESOURCE_MEMORY24
Definition: resources.h:23
@ UACPI_AML_RESOURCE_TYPE_INVALID
Definition: resources.h:9
@ UACPI_AML_RESOURCE_VENDOR_TYPE0
Definition: resources.h:19
@ UACPI_AML_RESOURCE_PIN_FUNCTION
Definition: resources.h:34
@ UACPI_AML_RESOURCE_IO
Definition: resources.h:16
@ UACPI_AML_RESOURCE_FIXED_DMA
Definition: resources.h:18
@ UACPI_AML_RESOURCE_DMA
Definition: resources.h:13
@ UACPI_AML_RESOURCE_PIN_GROUP_FUNCTION
Definition: resources.h:38
@ UACPI_AML_RESOURCE_GPIO_CONNECTION
Definition: resources.h:33
@ UACPI_AML_RESOURCE_EXTENDED_IRQ
Definition: resources.h:30
@ UACPI_AML_RESOURCE_GENERIC_REGISTER
Definition: resources.h:24
@ UACPI_AML_RESOURCE_END_DEPENDENT
Definition: resources.h:15
@ UACPI_AML_RESOURCE_VENDOR_TYPE1
Definition: resources.h:25
@ UACPI_AML_RESOURCE_IRQ
Definition: resources.h:12
@ UACPI_AML_RESOURCE_ADDRESS64_EXTENDED
Definition: resources.h:32
@ UACPI_AML_RESOURCE_ADDRESS64
Definition: resources.h:31
@ UACPI_AML_RESOURCE_ADDRESS16
Definition: resources.h:29
@ UACPI_AML_RESOURCE_START_DEPENDENT
Definition: resources.h:14
@ UACPI_AML_RESOURCE_CLOCK_INPUT
Definition: resources.h:40
@ UACPI_AML_RESOURCE_SERIAL_CONNECTION
Definition: resources.h:35
@ UACPI_AML_RESOURCE_PIN_GROUP_CONFIGURATION
Definition: resources.h:39
@ UACPI_AML_RESOURCE_MEMORY32
Definition: resources.h:26
@ UACPI_AML_RESOURCE_MAX
Definition: resources.h:41
uacpi_iteration_decision(* uacpi_aml_resource_iteration_callback)(void *, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *)
Definition: resources.h:306
@ UACPI_RESOURCE_CONVERT_OPCODE_PACKED_ARRAY_8
Definition: resources.h:69
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_2
Definition: resources.h:85
@ UACPI_RESOURCE_CONVERT_OPCODE_PIN_TABLE
Definition: resources.h:203
@ UACPI_RESOURCE_CONVERT_OPCODE_PACKED_ARRAY_16
Definition: resources.h:70
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_1
Definition: resources.h:84
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_3
Definition: resources.h:86
@ UACPI_RESOURCE_CONVERT_OPCODE_BIT_FIELD_6
Definition: resources.h:87
@ UACPI_RESOURCE_CONVERT_OPCODE_LOAD_AML_SIZE_32
Definition: resources.h:138
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_LABEL
Definition: resources.h:179
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_SOURCE_NO_INDEX
Definition: resources.h:178
@ UACPI_RESOURCE_CONVERT_OPCODE_LOAD_PIN_TABLE_LENGTH
Definition: resources.h:191
@ UACPI_RESOURCE_CONVERT_OPCODE_SERIAL_TYPE_SPECIFIC
Definition: resources.h:237
@ UACPI_RESOURCE_CONVERT_OPCODE_RESOURCE_SOURCE
Definition: resources.h:177
@ UACPI_RESOURCE_CONVERT_OPCODE_VENDOR_DATA
Definition: resources.h:219
@ UACPI_AML_RESOURCE_SIZE_KIND_FIXED
Definition: resources.h:45
@ UACPI_AML_RESOURCE_SIZE_KIND_FIXED_OR_ONE_LESS
Definition: resources.h:46
@ UACPI_AML_RESOURCE_SIZE_KIND_VARIABLE
Definition: resources.h:47
#define UACPI_ALIGN_UP(x, val, type)
Definition: stdlib.h:106
#define uacpi_kernel_alloc_zeroed
Definition: stdlib.h:127
#define uacpi_memcpy
Definition: stdlib.h:34
#define uacpi_free(mem, _)
Definition: stdlib.h:96
void uacpi_memcpy_zerout(void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
Definition: stdlib.c:112
uacpi_object * uacpi_create_object(uacpi_object_type type)
Definition: types.c:327
void uacpi_buffer_to_view(uacpi_buffer *, uacpi_data_view *)
Definition: types.c:1034
uacpi_status uacpi_namespace_node_is(const uacpi_namespace_node *node, uacpi_object_type type, uacpi_bool *out)
Definition: namespace.c:825
#define uacpi_unlikely(expr)
Definition: compiler.h:58
size_t uacpi_size
Definition: types.h:37
uint32_t uacpi_u32
Definition: types.h:21
bool uacpi_bool
Definition: types.h:31
#define UACPI_FALSE
Definition: types.h:30
char uacpi_char
Definition: types.h:44
uint16_t uacpi_u16
Definition: types.h:20
#define UACPI_NULL
Definition: types.h:33
uint8_t uacpi_u8
Definition: types.h:19
#define UACPI_TRUE
Definition: types.h:29
#define UACPI_EXCLUSIVE
Definition: resources.h:99
uacpi_resource_type
Definition: resources.h:11
@ UACPI_RESOURCE_TYPE_PIN_GROUP_CONFIGURATION
Definition: resources.h:52
@ UACPI_RESOURCE_TYPE_ADDRESS32
Definition: resources.h:22
@ UACPI_RESOURCE_TYPE_START_DEPENDENT
Definition: resources.h:30
@ UACPI_RESOURCE_TYPE_SERIAL_UART_CONNECTION
Definition: resources.h:45
@ UACPI_RESOURCE_TYPE_VENDOR_SMALL
Definition: resources.h:34
@ UACPI_RESOURCE_TYPE_PIN_FUNCTION
Definition: resources.h:48
@ UACPI_RESOURCE_TYPE_EXTENDED_IRQ
Definition: resources.h:13
@ UACPI_RESOURCE_TYPE_MEMORY32
Definition: resources.h:27
@ UACPI_RESOURCE_TYPE_END_DEPENDENT
Definition: resources.h:31
@ UACPI_RESOURCE_TYPE_IO
Definition: resources.h:18
@ UACPI_RESOURCE_TYPE_SERIAL_I2C_CONNECTION
Definition: resources.h:43
@ UACPI_RESOURCE_TYPE_FIXED_DMA
Definition: resources.h:16
@ UACPI_RESOURCE_TYPE_GENERIC_REGISTER
Definition: resources.h:39
@ UACPI_RESOURCE_TYPE_ADDRESS16
Definition: resources.h:21
@ UACPI_RESOURCE_TYPE_SERIAL_SPI_CONNECTION
Definition: resources.h:44
@ UACPI_RESOURCE_TYPE_PIN_GROUP
Definition: resources.h:50
@ UACPI_RESOURCE_TYPE_MAX
Definition: resources.h:57
@ UACPI_RESOURCE_TYPE_IRQ
Definition: resources.h:12
@ UACPI_RESOURCE_TYPE_PIN_CONFIGURATION
Definition: resources.h:49
@ UACPI_RESOURCE_TYPE_FIXED_IO
Definition: resources.h:19
@ UACPI_RESOURCE_TYPE_VENDOR_LARGE
Definition: resources.h:37
@ UACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION
Definition: resources.h:51
@ UACPI_RESOURCE_TYPE_END_TAG
Definition: resources.h:56
@ UACPI_RESOURCE_TYPE_ADDRESS64
Definition: resources.h:23
@ UACPI_RESOURCE_TYPE_CLOCK_INPUT
Definition: resources.h:54
@ UACPI_RESOURCE_TYPE_SERIAL_CSI2_CONNECTION
Definition: resources.h:46
@ UACPI_RESOURCE_TYPE_GPIO_CONNECTION
Definition: resources.h:40
@ UACPI_RESOURCE_TYPE_ADDRESS64_EXTENDED
Definition: resources.h:24
@ UACPI_RESOURCE_TYPE_MEMORY24
Definition: resources.h:26
@ UACPI_RESOURCE_TYPE_FIXED_MEMORY32
Definition: resources.h:28
@ UACPI_RESOURCE_TYPE_DMA
Definition: resources.h:15
#define UACPI_ACCEPTABLE
Definition: resources.h:314
#define UACPI_POLARITY_ACTIVE_HIGH
Definition: resources.h:94
@ UACPI_RESOURCE_LENGTH_KIND_DONT_CARE
Definition: resources.h:84
@ UACPI_RESOURCE_LENGTH_KIND_ONE_LESS
Definition: resources.h:85
@ UACPI_RESOURCE_LENGTH_KIND_FULL
Definition: resources.h:86
#define UACPI_GPIO_CONNECTION_IO
Definition: resources.h:345
uacpi_iteration_decision(* uacpi_resource_iteration_callback)(void *user, uacpi_resource *resource)
Definition: resources.h:651
#define UACPI_TRIGGERING_EDGE
Definition: resources.h:90
#define UACPI_GPIO_CONNECTION_INTERRUPT
Definition: resources.h:344
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_STATUS_INTERNAL_ERROR
Definition: status.h:21
@ UACPI_STATUS_AML_INVALID_RESOURCE
Definition: status.h:42
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_NO_RESOURCE_END_TAG
Definition: status.h:26
@ UACPI_STATUS_OK
Definition: status.h:11
uacpi_iteration_decision
Definition: types.h:28
@ UACPI_ITERATION_DECISION_BREAK
Definition: types.h:30
@ UACPI_ITERATION_DECISION_CONTINUE
Definition: types.h:29
@ UACPI_OBJECT_BUFFER
Definition: types.h:108
@ UACPI_OBJECT_DEVICE
Definition: types.h:111
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:755
return ret
Definition: mutex.c:146
static const struct uacpi_resource_convert_instruction convert_io[]
Definition: resources.c:670
#define OP(short_code,...)
Definition: resources.c:578
const struct uacpi_resource_spec aml_resources[UACPI_AML_RESOURCE_MAX+1]
Definition: resources.c:1095
static const uacpi_u8 aml_resource_to_type[256]
Definition: resources.c:19
static const struct uacpi_resource_convert_instruction convert_pin_group[]
Definition: resources.c:937
static const struct uacpi_resource_convert_instruction convert_vendor_type1[]
Definition: resources.c:700
static const struct uacpi_resource_convert_instruction convert_memory32[]
Definition: resources.c:713
static uacpi_size size_for_aml_resource_source(uacpi_resource_source *source, uacpi_bool with_index)
Definition: resources.c:271
static const struct uacpi_resource_convert_instruction convert_gpio_connection[]
Definition: resources.c:866
static uacpi_resource_type aml_serial_to_native_type(uacpi_u8 type)
Definition: resources.c:1665
uacpi_status uacpi_get_possible_resources(uacpi_namespace_node *device, uacpi_resources **out_resources)
Definition: resources.c:2100
#define NATIVE_F(short_native_name, field)
Definition: resources.c:595
#define LARGE_RESOURCE_BASE
Definition: resources.c:12
static uacpi_iteration_decision do_native_resource_to_aml(void *opaque, uacpi_resource *resource)
Definition: resources.c:2189
static uacpi_size size_for_aml_extended_irq(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:342
#define IMM(value)
Definition: resources.c:598
static const struct uacpi_resource_convert_instruction convert_irq_to_native[]
Definition: resources.c:604
static const uacpi_u8 aml_serial_resource_to_extra_native_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:542
static const struct uacpi_resource_convert_instruction convert_fixed_memory32[]
Definition: resources.c:721
#define CONVERT_TYPE_SPECIFIC_FLAGS(addr_type)
Definition: resources.c:740
#define ARG0(value)
Definition: resources.c:599
static const uacpi_u8 type_to_aml_resource[]
Definition: resources.c:52
static uacpi_iteration_decision conditional_continue(struct resource_conversion_ctx *ctx)
Definition: resources.c:1561
uacpi_status uacpi_find_aml_resource_end_tag(uacpi_data_view buffer, uacpi_size *out_offset)
Definition: resources.c:1526
#define LARGE_ITEM_HEADER_SIZE
Definition: resources.c:118
static uacpi_iteration_decision accumulate_native_buffer_size(void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1938
uacpi_status uacpi_get_current_resources(uacpi_namespace_node *device, uacpi_resources **out_resources)
Definition: resources.c:2093
#define ARG2(value)
Definition: resources.c:601
static uacpi_size size_for_aml_irq(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:155
static uacpi_size size_for_aml_start_dependent(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:189
uacpi_status uacpi_for_each_resource(uacpi_resources *resources, uacpi_resource_iteration_callback cb, void *user)
Definition: resources.c:2115
#define DEFINE_SMALL_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct,...)
Definition: resources.c:1061
static const struct uacpi_resource_convert_instruction convert_fixed_io[]
Definition: resources.c:679
#define END()
Definition: resources.c:584
static const struct uacpi_resource_convert_instruction convert_vendor_type0[]
Definition: resources.c:694
#define DECODE_RES_PIN_TBL_AND_VENDOR_DATA( short_aml_name, res_opcode, offset_field, res_field)
Definition: resources.c:850
static uacpi_iteration_decision do_aml_resource_to_native(void *opaque, uacpi_u8 *data, uacpi_u16 aml_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1673
uacpi_status uacpi_for_each_aml_resource(uacpi_data_view buffer, uacpi_aml_resource_iteration_callback cb, void *user)
Definition: resources.c:1423
void uacpi_free_resources(uacpi_resources *resources)
Definition: resources.c:2056
uacpi_status uacpi_native_resources_to_aml(uacpi_resources *resources, uacpi_object **out_template)
Definition: resources.c:2491
static const struct uacpi_resource_convert_instruction convert_clock_input[]
Definition: resources.c:832
static enum uacpi_aml_resource get_aml_resource_type(uacpi_u8 raw_byte)
Definition: resources.c:1367
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_aml[]
Definition: resources.c:661
#define AML_F(short_aml_name, field)
Definition: resources.c:589
#define DECODE_PIN_GROUP_RES_SOURCES(postfix)
Definition: resources.c:948
uacpi_status uacpi_native_resources_from_aml(uacpi_data_view aml_buffer, uacpi_resources **out_resources)
Definition: resources.c:1978
#define NATIVE_SERIAL_RESOURCE_EXTRA_SIZE(type)
Definition: resources.c:529
static uacpi_size native_size_for_aml_resource(uacpi_u8 *data, uacpi_u16 size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1514
#define L(x)
Definition: resources.c:13
static uacpi_size size_for_aml_pin_group(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:489
static uacpi_status get_aml_resource_size(uacpi_u8 *data, uacpi_size bytes_left, uacpi_u16 *out_size)
Definition: resources.c:1380
static uacpi_size size_for_aml_vendor(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:229
#define AML_SERIAL_RESOURCE_EXTRA_SIZE(type)
Definition: resources.c:525
uacpi_status uacpi_get_device_resources(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
Definition: resources.c:2107
static const struct uacpi_resource_convert_instruction convert_start_dependent_to_native[]
Definition: resources.c:642
static const struct uacpi_resource_convert_instruction convert_pin_configuration[]
Definition: resources.c:919
static uacpi_status validate_aml_serial_type(uacpi_u8 type)
Definition: resources.c:1412
#define PTR_AT(ptr, offset)
Definition: resources.c:1636
static uacpi_iteration_decision accumulate_aml_buffer_size(void *opaque, uacpi_resource *resource)
Definition: resources.c:2468
static const struct uacpi_resource_convert_instruction convert_pin_group_function[]
Definition: resources.c:962
uacpi_status uacpi_set_resources(uacpi_namespace_node *device, uacpi_resources *resources)
Definition: resources.c:2543
#define NATIVE_OFFSET(res, offset)
Definition: resources.c:1638
static const uacpi_u8 aml_resource_kind_to_header_size[2]
Definition: resources.c:120
static uacpi_size aml_size_for_native_resource(uacpi_resource *resource, const struct uacpi_resource_spec *spec)
Definition: resources.c:2180
static const uacpi_u8 aml_serial_resource_to_extra_aml_size[ACPI_SERIAL_TYPE_MAX+1]
Definition: resources.c:534
#define CHECK_AML_OFFSET(offset, what)
Definition: resources.c:1661
static const struct uacpi_resource_convert_instruction convert_generic_register[]
Definition: resources.c:732
static const struct uacpi_resource_convert_instruction convert_generic_serial_bus[]
Definition: resources.c:992
static const struct uacpi_resource_convert_instruction convert_address64_extended[]
Definition: resources.c:802
static uacpi_iteration_decision find_end(void *opaque, uacpi_u8 *data, uacpi_u16 resource_size, const struct uacpi_resource_spec *spec)
Definition: resources.c:1499
static uacpi_size aml_size_with_header(const struct uacpi_resource_spec *spec)
Definition: resources.c:125
uacpi_status uacpi_for_each_device_resource(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resource_iteration_callback cb, void *user)
Definition: resources.c:2155
static const uacpi_u8 native_resource_to_type[UACPI_RESOURCE_TYPE_MAX+1]
Definition: resources.c:84
#define NATIVE_O(short_name, field)
Definition: resources.c:592
static uacpi_size extra_size_for_serial_connection(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:549
static const struct uacpi_resource_convert_instruction convert_pin_group_configuration[]
Definition: resources.c:976
#define SMALL_ITEM_HEADER_SIZE
Definition: resources.c:117
static uacpi_size extra_size_for_native_pin_group(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:462
static uacpi_size extra_size_for_native_vendor(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:220
void uacpi_free_resource(uacpi_resource *resource)
Definition: resources.c:2064
static uacpi_size extra_size_for_resource_source(uacpi_size base_size, uacpi_size reported_size)
Definition: resources.c:255
uacpi_status uacpi_get_resource_from_buffer(uacpi_data_view aml_buffer, uacpi_resource **out_resource)
Definition: resources.c:2021
static uacpi_size extra_size_for_native_irq_or_dma(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:131
#define DEFINE_ADDRESS_CONVERSION(width)
Definition: resources.c:787
static const struct uacpi_resource_convert_instruction convert_extended_irq[]
Definition: resources.c:812
static uacpi_size aml_size_for_serial_connection(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:563
#define CONVERSION_OPCODES_COMMON(native_buf)
Definition: resources.c:1570
static const struct uacpi_resource_spec * resource_spec_from_native(uacpi_resource *resource)
Definition: resources.c:2173
static uacpi_size extra_size_for_native_address_or_clock_input(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:290
static uacpi_size size_for_aml_gpio_or_pins(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:411
static uacpi_status native_resources_to_aml(uacpi_resources *native_resources, void *aml_buffer)
Definition: resources.c:2445
#define CONVERT_GENERAL_ADDRESS_FLAGS(addr_type)
Definition: resources.c:773
#define DEFINE_SMALL_AML_RESOURCE_NO_NATIVE_REPR( aml_type_enum, native_type_enum, aml_struct,...)
Definition: resources.c:1072
static uacpi_size extra_size_for_native_gpio_or_pins(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:356
static uacpi_status eval_resource_helper(uacpi_namespace_node *node, const uacpi_char *method, uacpi_object **out_obj)
Definition: resources.c:1958
static const struct uacpi_resource_convert_instruction convert_dma[]
Definition: resources.c:632
#define DECODE_SOURCE_INDEX(short_aml_name)
Definition: resources.c:846
static const struct uacpi_resource_convert_instruction convert_memory24[]
Definition: resources.c:706
static const struct uacpi_resource_convert_instruction convert_pin_function[]
Definition: resources.c:902
static uacpi_status extract_native_resources_from_method(uacpi_namespace_node *device, const uacpi_char *method, uacpi_resources **out_resources)
Definition: resources.c:2072
static uacpi_size size_for_aml_address_or_clock_input(const struct uacpi_resource_spec *spec, uacpi_resource *resource)
Definition: resources.c:298
#define DEFINE_LARGE_AML_RESOURCE(aml_type_enum, native_type_enum, aml_struct, native_struct,...)
Definition: resources.c:1084
#define INLINE_END_TAG
Definition: resources.c:2443
static uacpi_size extra_size_for_extended_irq(const struct uacpi_resource_spec *spec, void *data, uacpi_size size)
Definition: resources.c:327
const struct uacpi_resource_convert_instruction convert_irq_to_aml[]
Definition: resources.c:621
static const struct uacpi_resource_convert_instruction convert_fixed_dma[]
Definition: resources.c:685
unsigned char irq
Definition: dsp.h:13
static void write_status(LPCWSTR lpFmt,...)
Definition: dwnl.c:45
uint32_t serial
Definition: fsck.fat.h:29
FxCmResList * resources
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum func
Definition: glext.h:6028
GLuint res
Definition: glext.h:9613
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
GLuint address
Definition: glext.h:9393
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum mode
Definition: glext.h:6217
GLenum GLenum dst
Definition: glext.h:6340
GLuint divisor
Definition: glext.h:6313
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLboolean GLuint group
Definition: glext.h:11120
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23
#define resource
Definition: kernel32.h:9
struct task_struct * current
Definition: linux.c:32
static PVOID ptr
Definition: dispmode.c:27
static const WCHAR label[]
Definition: itemdlg.c:1546
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
Definition: file.c:100
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:100
static ULONG POBJECT_ATTRIBUTES PIO_STATUS_BLOCK ULONG sharing
Definition: pipe.c:70
static LARGE_INTEGER * frequency
Definition: time.c:106
static UINT array_size
Definition: msctf.c:67
#define UNREACHABLE
int This channels
Definition: rdpsnd_libao.c:37
#define args
Definition: format.c:66
Definition: match.c:390
Definition: devices.h:37
Definition: regsvr.c:104
DWORD index
Definition: pdh_main.c:175
uacpi_resource_source source
Definition: resources.h:405
uacpi_size(* size_for_aml)(const struct uacpi_resource_spec *, uacpi_resource *)
Definition: resources.h:298
uacpi_u8 native_type
Definition: resources.h:268
uacpi_u16 aml_size
Definition: resources.h:276
const struct uacpi_resource_convert_instruction * to_aml
Definition: resources.h:303
const struct uacpi_resource_convert_instruction * to_native
Definition: resources.h:302
uacpi_u16 native_size
Definition: resources.h:283
uacpi_u8 size_kind
Definition: resources.h:270
uacpi_size(* extra_size_for_native)(const struct uacpi_resource_spec *, void *, uacpi_size)
Definition: resources.h:290
uacpi_u8 resource_kind
Definition: resources.h:269
uacpi_status uacpi_eval_simple_buffer(uacpi_namespace_node *parent, const uacpi_char *path, uacpi_object **ret)
Definition: uacpi.c:961
uacpi_status uacpi_eval(uacpi_namespace_node *parent, const uacpi_char *path, const uacpi_object_array *args, uacpi_object **ret)
Definition: uacpi.c:699
Definition: dlist.c:348
Definition: pdh_main.c:96
#define const
Definition: zconf.h:233