22
#include "qemu/osdep.h"
23
#include <glib/gprintf.h>
24
#include "hw/acpi/aml-build.h"
25
#include "qemu/bswap.h"
26
#include "qemu/bitops.h"
27
#include "sysemu/numa.h"
29
#include "hw/acpi/tpm.h"
30
#include "hw/pci/pci_host.h"
31
#include "hw/pci/pci_bus.h"
32
#include "hw/pci/pci_bridge.h"
33
#include "qemu/cutils.h"
35
static GArray *build_alloc_array(void)
37
return g_array_new(false, true , 1);
40
static void build_free_array(GArray *array)
42
g_array_free(array, true);
45
static void build_prepend_byte(GArray *array, uint8_t val)
47
g_array_prepend_val(array, val);
50
static void build_append_byte(GArray *array, uint8_t val)
52
g_array_append_val(array, val);
55
static void build_append_padded_str(GArray *array, const char *str,
56
size_t maxlen, char pad)
59
size_t len = strlen(str);
61
g_assert(len <= maxlen);
62
g_array_append_vals(array, str, len);
63
for (i = maxlen - len; i > 0; i--) {
64
g_array_append_val(array, pad);
68
static void build_append_array(GArray *array, GArray *val)
70
g_array_append_vals(array, val->data, val->len);
73
#define ACPI_NAMESEG_LEN 4
75
void crs_range_insert(GPtrArray *ranges, uint64_t base, uint64_t limit)
79
entry = g_malloc(sizeof(*entry));
83
g_ptr_array_add(ranges, entry);
86
static void crs_range_free(gpointer data)
88
CrsRangeEntry *entry = (CrsRangeEntry *)data;
92
void crs_range_set_init(CrsRangeSet *range_set)
94
range_set->io_ranges = g_ptr_array_new_with_free_func(crs_range_free);
95
range_set->mem_ranges = g_ptr_array_new_with_free_func(crs_range_free);
96
range_set->mem_64bit_ranges =
97
g_ptr_array_new_with_free_func(crs_range_free);
100
void crs_range_set_free(CrsRangeSet *range_set)
102
g_ptr_array_free(range_set->io_ranges, true);
103
g_ptr_array_free(range_set->mem_ranges, true);
104
g_ptr_array_free(range_set->mem_64bit_ranges, true);
107
static gint crs_range_compare(gconstpointer a, gconstpointer b)
109
CrsRangeEntry *entry_a = *(CrsRangeEntry **)a;
110
CrsRangeEntry *entry_b = *(CrsRangeEntry **)b;
112
if (entry_a->base < entry_b->base) {
114
} else if (entry_a->base > entry_b->base) {
127
void crs_replace_with_free_ranges(GPtrArray *ranges,
128
uint64_t start, uint64_t end)
130
GPtrArray *free_ranges = g_ptr_array_new();
131
uint64_t free_base = start;
134
g_ptr_array_sort(ranges, crs_range_compare);
135
for (i = 0; i < ranges->len; i++) {
136
CrsRangeEntry *used = g_ptr_array_index(ranges, i);
138
if (free_base < used->base) {
139
crs_range_insert(free_ranges, free_base, used->base - 1);
142
free_base = used->limit + 1;
145
if (free_base < end) {
146
crs_range_insert(free_ranges, free_base, end);
149
g_ptr_array_set_size(ranges, 0);
150
for (i = 0; i < free_ranges->len; i++) {
151
g_ptr_array_add(ranges, g_ptr_array_index(free_ranges, i));
154
g_ptr_array_free(free_ranges, true);
161
static void crs_range_merge(GPtrArray *range)
163
GPtrArray *tmp = g_ptr_array_new_with_free_func(crs_range_free);
164
CrsRangeEntry *entry;
165
uint64_t range_base, range_limit;
172
g_ptr_array_sort(range, crs_range_compare);
174
entry = g_ptr_array_index(range, 0);
175
range_base = entry->base;
176
range_limit = entry->limit;
177
for (i = 1; i < range->len; i++) {
178
entry = g_ptr_array_index(range, i);
179
if (entry->base - 1 == range_limit) {
180
range_limit = entry->limit;
182
crs_range_insert(tmp, range_base, range_limit);
183
range_base = entry->base;
184
range_limit = entry->limit;
187
crs_range_insert(tmp, range_base, range_limit);
189
g_ptr_array_set_size(range, 0);
190
for (i = 0; i < tmp->len; i++) {
191
entry = g_ptr_array_index(tmp, i);
192
crs_range_insert(range, entry->base, entry->limit);
194
g_ptr_array_free(tmp, true);
198
build_append_nameseg(GArray *array, const char *seg)
203
assert(len <= ACPI_NAMESEG_LEN);
205
g_array_append_vals(array, seg, len);
207
g_array_append_vals(array, "____", ACPI_NAMESEG_LEN - len);
210
static void G_GNUC_PRINTF(2, 0)
211
build_append_namestringv(GArray *array, const char *format, va_list ap)
218
s = g_strdup_vprintf(format, ap);
219
segs = g_strsplit(s, ".", 0);
232
assert(seg_count > 0 && seg_count <= 255);
236
while (*s == '\\' || *s == '^') {
237
build_append_byte(array, *s);
244
build_append_byte(array, 0x00);
246
build_append_nameseg(array, s);
251
build_append_byte(array, 0x2E);
252
build_append_nameseg(array, s);
253
build_append_nameseg(array, segs[1]);
256
build_append_byte(array, 0x2F);
257
build_append_byte(array, seg_count);
260
build_append_nameseg(array, s);
263
segs_iter = segs + 1;
265
build_append_nameseg(array, *segs_iter);
274
static void build_append_namestring(GArray *array, const char *format, ...)
278
va_start(ap, format);
279
build_append_namestringv(array, format, ap);
285
PACKAGE_LENGTH_1BYTE_SHIFT = 6,
286
PACKAGE_LENGTH_2BYTE_SHIFT = 4,
287
PACKAGE_LENGTH_3BYTE_SHIFT = 12,
288
PACKAGE_LENGTH_4BYTE_SHIFT = 20,
292
build_prepend_package_length(GArray *package, unsigned length, bool incl_self)
295
unsigned length_bytes;
297
if (length + 1 < (1 << PACKAGE_LENGTH_1BYTE_SHIFT)) {
299
} else if (length + 2 < (1 << PACKAGE_LENGTH_3BYTE_SHIFT)) {
301
} else if (length + 3 < (1 << PACKAGE_LENGTH_4BYTE_SHIFT)) {
317
length += length_bytes;
320
switch (length_bytes) {
323
build_prepend_byte(package, byte);
326
byte = length >> PACKAGE_LENGTH_4BYTE_SHIFT;
327
build_prepend_byte(package, byte);
328
length &= (1 << PACKAGE_LENGTH_4BYTE_SHIFT) - 1;
331
byte = length >> PACKAGE_LENGTH_3BYTE_SHIFT;
332
build_prepend_byte(package, byte);
333
length &= (1 << PACKAGE_LENGTH_3BYTE_SHIFT) - 1;
336
byte = length >> PACKAGE_LENGTH_2BYTE_SHIFT;
337
build_prepend_byte(package, byte);
338
length &= (1 << PACKAGE_LENGTH_2BYTE_SHIFT) - 1;
345
byte = ((length_bytes - 1) << PACKAGE_LENGTH_1BYTE_SHIFT) | length;
346
build_prepend_byte(package, byte);
350
build_append_pkg_length(GArray *array, unsigned length, bool incl_self)
352
GArray *tmp = build_alloc_array();
354
build_prepend_package_length(tmp, length, incl_self);
355
build_append_array(array, tmp);
356
build_free_array(tmp);
359
static void build_package(GArray *package, uint8_t op)
361
build_prepend_package_length(package, package->len, true);
362
build_prepend_byte(package, op);
365
static void build_extop_package(GArray *package, uint8_t op)
367
build_package(package, op);
368
build_prepend_byte(package, 0x5B);
371
void build_append_int_noprefix(GArray *table, uint64_t value, int size)
375
for (i = 0; i < size; ++i) {
376
build_append_byte(table, value & 0xFF);
381
static void build_append_int(GArray *table, uint64_t value)
384
build_append_byte(table, 0x00);
385
} else if (value == 0x01) {
386
build_append_byte(table, 0x01);
387
} else if (value <= 0xFF) {
388
build_append_byte(table, 0x0A);
389
build_append_int_noprefix(table, value, 1);
390
} else if (value <= 0xFFFF) {
391
build_append_byte(table, 0x0B);
392
build_append_int_noprefix(table, value, 2);
393
} else if (value <= 0xFFFFFFFF) {
394
build_append_byte(table, 0x0C);
395
build_append_int_noprefix(table, value, 4);
397
build_append_byte(table, 0x0E);
398
build_append_int_noprefix(table, value, 8);
407
void build_append_gas(GArray *table, AmlAddressSpace as,
408
uint8_t bit_width, uint8_t bit_offset,
409
uint8_t access_width, uint64_t address)
411
build_append_int_noprefix(table, as, 1);
412
build_append_int_noprefix(table, bit_width, 1);
413
build_append_int_noprefix(table, bit_offset, 1);
414
build_append_int_noprefix(table, access_width, 1);
415
build_append_int_noprefix(table, address, 8);
427
build_append_named_dword(GArray *array, const char *name_format, ...)
432
build_append_byte(array, 0x08);
433
va_start(ap, name_format);
434
build_append_namestringv(array, name_format, ap);
437
build_append_byte(array, 0x0C);
440
build_append_int_noprefix(array, 0x00000000, 4);
441
assert(array->len == offset + 4);
446
static GPtrArray *alloc_list;
448
static Aml *aml_alloc(void)
450
Aml *var = g_new0(typeof(*var), 1);
452
g_ptr_array_add(alloc_list, var);
453
var->block_flags = AML_NO_OPCODE;
454
var->buf = build_alloc_array();
458
static Aml *aml_opcode(uint8_t op)
460
Aml *var = aml_alloc();
463
var->block_flags = AML_OPCODE;
467
static Aml *aml_bundle(uint8_t op, AmlBlockFlags flags)
469
Aml *var = aml_alloc();
472
var->block_flags = flags;
476
static void aml_free(gpointer data, gpointer user_data)
479
build_free_array(var->buf);
483
Aml *init_aml_allocator(void)
486
alloc_list = g_ptr_array_new();
490
void free_aml_allocator(void)
492
g_ptr_array_foreach(alloc_list, aml_free, NULL);
493
g_ptr_array_free(alloc_list, true);
498
static void build_buffer(GArray *array, uint8_t op)
500
GArray *data = build_alloc_array();
502
build_append_int(data, array->len);
503
g_array_prepend_vals(array, data->data, data->len);
504
build_free_array(data);
505
build_package(array, op);
508
void aml_append(Aml *parent_ctx, Aml *child)
510
GArray *buf = build_alloc_array();
511
build_append_array(buf, child->buf);
513
switch (child->block_flags) {
515
build_append_byte(parent_ctx->buf, child->op);
517
case AML_EXT_PACKAGE:
518
build_extop_package(buf, child->op);
521
build_package(buf, child->op);
523
case AML_RES_TEMPLATE:
524
build_append_byte(buf, 0x79);
529
build_append_byte(buf, 0);
532
build_buffer(buf, child->op);
540
build_append_array(parent_ctx->buf, buf);
541
build_free_array(buf);
545
Aml *aml_scope(const char *name_format, ...)
548
Aml *var = aml_bundle(0x10 , AML_PACKAGE);
549
va_start(ap, name_format);
550
build_append_namestringv(var->buf, name_format, ap);
556
Aml *aml_return(Aml *val)
558
Aml *var = aml_opcode(0xA4 );
559
aml_append(var, val);
566
Aml *var = aml_alloc();
567
build_append_byte(var->buf, 0x5B);
568
build_append_byte(var->buf, 0x31);
576
Aml *aml_int(const uint64_t val)
578
Aml *var = aml_alloc();
579
build_append_int(var->buf, val);
587
Aml *aml_name(const char *name_format, ...)
590
Aml *var = aml_alloc();
591
va_start(ap, name_format);
592
build_append_namestringv(var->buf, name_format, ap);
598
Aml *aml_name_decl(const char *name, Aml *val)
600
Aml *var = aml_opcode(0x08 );
601
build_append_namestring(var->buf, "%s", name);
602
aml_append(var, val);
609
uint8_t op = 0x68 + pos;
612
return aml_opcode(op);
616
Aml *aml_to_integer(Aml *arg)
618
Aml *var = aml_opcode(0x99 );
619
aml_append(var, arg);
620
build_append_byte(var->buf, 0x00 );
625
Aml *aml_to_hexstring(Aml *src, Aml *dst)
627
Aml *var = aml_opcode(0x98 );
628
aml_append(var, src);
630
aml_append(var, dst);
632
build_append_byte(var->buf, 0x00 );
638
Aml *aml_to_buffer(Aml *src, Aml *dst)
640
Aml *var = aml_opcode(0x96 );
641
aml_append(var, src);
643
aml_append(var, dst);
645
build_append_byte(var->buf, 0x00 );
651
Aml *aml_to_decimalstring(Aml *src, Aml *dst)
653
Aml *var = aml_opcode(0x97 );
654
aml_append(var, src);
656
aml_append(var, dst);
658
build_append_byte(var->buf, 0x00 );
664
Aml *aml_store(Aml *val, Aml *target)
666
Aml *var = aml_opcode(0x70 );
667
aml_append(var, val);
668
aml_append(var, target);
686
build_opcode_2arg_dst(uint8_t op, Aml *arg1, Aml *arg2, Aml *dst)
688
Aml *var = aml_opcode(op);
689
aml_append(var, arg1);
690
aml_append(var, arg2);
692
aml_append(var, dst);
694
build_append_byte(var->buf, 0x00 );
700
Aml *aml_and(Aml *arg1, Aml *arg2, Aml *dst)
702
return build_opcode_2arg_dst(0x7B , arg1, arg2, dst);
706
Aml *aml_or(Aml *arg1, Aml *arg2, Aml *dst)
708
return build_opcode_2arg_dst(0x7D , arg1, arg2, dst);
712
Aml *aml_land(Aml *arg1, Aml *arg2)
714
Aml *var = aml_opcode(0x90 );
715
aml_append(var, arg1);
716
aml_append(var, arg2);
721
Aml *aml_lor(Aml *arg1, Aml *arg2)
723
Aml *var = aml_opcode(0x91 );
724
aml_append(var, arg1);
725
aml_append(var, arg2);
730
Aml *aml_shiftleft(Aml *arg1, Aml *count)
732
return build_opcode_2arg_dst(0x79 , arg1, count, NULL);
736
Aml *aml_shiftright(Aml *arg1, Aml *count, Aml *dst)
738
return build_opcode_2arg_dst(0x7A , arg1, count, dst);
742
Aml *aml_lless(Aml *arg1, Aml *arg2)
744
Aml *var = aml_opcode(0x95 );
745
aml_append(var, arg1);
746
aml_append(var, arg2);
751
Aml *aml_add(Aml *arg1, Aml *arg2, Aml *dst)
753
return build_opcode_2arg_dst(0x72 , arg1, arg2, dst);
757
Aml *aml_subtract(Aml *arg1, Aml *arg2, Aml *dst)
759
return build_opcode_2arg_dst(0x74 , arg1, arg2, dst);
763
Aml *aml_increment(Aml *arg)
765
Aml *var = aml_opcode(0x75 );
766
aml_append(var, arg);
771
Aml *aml_decrement(Aml *arg)
773
Aml *var = aml_opcode(0x76 );
774
aml_append(var, arg);
779
Aml *aml_index(Aml *arg1, Aml *idx)
781
return build_opcode_2arg_dst(0x88 , arg1, idx, NULL);
785
Aml *aml_notify(Aml *arg1, Aml *arg2)
787
Aml *var = aml_opcode(0x86 );
788
aml_append(var, arg1);
789
aml_append(var, arg2);
796
Aml *var = aml_opcode(0xa5 );
801
Aml *aml_call0(const char *method)
803
Aml *var = aml_alloc();
804
build_append_namestring(var->buf, "%s", method);
809
Aml *aml_call1(const char *method, Aml *arg1)
811
Aml *var = aml_alloc();
812
build_append_namestring(var->buf, "%s", method);
813
aml_append(var, arg1);
818
Aml *aml_call2(const char *method, Aml *arg1, Aml *arg2)
820
Aml *var = aml_alloc();
821
build_append_namestring(var->buf, "%s", method);
822
aml_append(var, arg1);
823
aml_append(var, arg2);
828
Aml *aml_call3(const char *method, Aml *arg1, Aml *arg2, Aml *arg3)
830
Aml *var = aml_alloc();
831
build_append_namestring(var->buf, "%s", method);
832
aml_append(var, arg1);
833
aml_append(var, arg2);
834
aml_append(var, arg3);
839
Aml *aml_call4(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4)
841
Aml *var = aml_alloc();
842
build_append_namestring(var->buf, "%s", method);
843
aml_append(var, arg1);
844
aml_append(var, arg2);
845
aml_append(var, arg3);
846
aml_append(var, arg4);
851
Aml *aml_call5(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4,
854
Aml *var = aml_alloc();
855
build_append_namestring(var->buf, "%s", method);
856
aml_append(var, arg1);
857
aml_append(var, arg2);
858
aml_append(var, arg3);
859
aml_append(var, arg4);
860
aml_append(var, arg5);
865
Aml *aml_call6(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4,
866
Aml *arg5, Aml *arg6)
868
Aml *var = aml_alloc();
869
build_append_namestring(var->buf, "%s", method);
870
aml_append(var, arg1);
871
aml_append(var, arg2);
872
aml_append(var, arg3);
873
aml_append(var, arg4);
874
aml_append(var, arg5);
875
aml_append(var, arg6);
884
static Aml *aml_gpio_connection(AmlGpioConnectionType type,
885
AmlConsumerAndProducer con_and_pro,
886
uint8_t flags, AmlPinConfig pin_config,
887
uint16_t output_drive,
888
uint16_t debounce_timeout,
889
const uint32_t pin_list[], uint32_t pin_count,
890
const char *resource_source_name,
891
const uint8_t *vendor_data,
892
uint16_t vendor_data_len)
894
Aml *var = aml_alloc();
895
const uint16_t min_desc_len = 0x16;
896
uint16_t resource_source_name_len, length;
897
uint16_t pin_table_offset, resource_source_name_offset, vendor_data_offset;
900
assert(resource_source_name);
901
resource_source_name_len = strlen(resource_source_name) + 1;
902
length = min_desc_len + resource_source_name_len + vendor_data_len;
903
pin_table_offset = min_desc_len + 1;
904
resource_source_name_offset = pin_table_offset + pin_count * 2;
905
vendor_data_offset = resource_source_name_offset + resource_source_name_len;
907
build_append_byte(var->buf, 0x8C);
908
build_append_int_noprefix(var->buf, length, 2);
909
build_append_byte(var->buf, 1);
910
build_append_byte(var->buf, type);
912
build_append_int_noprefix(var->buf, con_and_pro, 2);
914
build_append_int_noprefix(var->buf, flags, 2);
916
build_append_byte(var->buf, pin_config);
918
build_append_int_noprefix(var->buf, output_drive, 2);
920
build_append_int_noprefix(var->buf, debounce_timeout, 2);
922
build_append_int_noprefix(var->buf, pin_table_offset, 2);
923
build_append_byte(var->buf, 0);
925
build_append_int_noprefix(var->buf, resource_source_name_offset, 2);
927
build_append_int_noprefix(var->buf, vendor_data_offset, 2);
929
build_append_int_noprefix(var->buf, vendor_data_len, 2);
931
for (i = 0; i < pin_count; i++) {
932
build_append_int_noprefix(var->buf, pin_list[i], 2);
936
build_append_namestring(var->buf, "%s", resource_source_name);
937
build_append_byte(var->buf, '\0');
940
if (vendor_data != NULL) {
941
g_array_append_vals(var->buf, vendor_data, vendor_data_len);
951
Aml *aml_gpio_int(AmlConsumerAndProducer con_and_pro,
952
AmlLevelAndEdge edge_level,
953
AmlActiveHighAndLow active_level, AmlShared shared,
954
AmlPinConfig pin_config, uint16_t debounce_timeout,
955
const uint32_t pin_list[], uint32_t pin_count,
956
const char *resource_source_name,
957
const uint8_t *vendor_data, uint16_t vendor_data_len)
959
uint8_t flags = edge_level | (active_level << 1) | (shared << 3);
961
return aml_gpio_connection(AML_INTERRUPT_CONNECTION, con_and_pro, flags,
962
pin_config, 0, debounce_timeout, pin_list,
963
pin_count, resource_source_name, vendor_data,
971
Aml *aml_memory32_fixed(uint32_t addr, uint32_t size,
972
AmlReadAndWrite read_and_write)
974
Aml *var = aml_alloc();
975
build_append_byte(var->buf, 0x86);
976
build_append_byte(var->buf, 9);
977
build_append_byte(var->buf, 0);
978
build_append_byte(var->buf, read_and_write);
981
build_append_byte(var->buf, extract32(addr, 0, 8));
982
build_append_byte(var->buf, extract32(addr, 8, 8));
983
build_append_byte(var->buf, extract32(addr, 16, 8));
984
build_append_byte(var->buf, extract32(addr, 24, 8));
987
build_append_byte(var->buf, extract32(size, 0, 8));
988
build_append_byte(var->buf, extract32(size, 8, 8));
989
build_append_byte(var->buf, extract32(size, 16, 8));
990
build_append_byte(var->buf, extract32(size, 24, 8));
998
Aml *aml_interrupt(AmlConsumerAndProducer con_and_pro,
999
AmlLevelAndEdge level_and_edge,
1000
AmlActiveHighAndLow high_and_low, AmlShared shared,
1001
uint32_t *irq_list, uint8_t irq_count)
1004
Aml *var = aml_alloc();
1005
uint8_t irq_flags = con_and_pro | (level_and_edge << 1)
1006
| (high_and_low << 2) | (shared << 3);
1007
const int header_bytes_in_len = 2;
1008
uint16_t len = header_bytes_in_len + irq_count * sizeof(uint32_t);
1010
assert(irq_count > 0);
1012
build_append_byte(var->buf, 0x89);
1013
build_append_byte(var->buf, len & 0xFF);
1014
build_append_byte(var->buf, len >> 8);
1015
build_append_byte(var->buf, irq_flags);
1016
build_append_byte(var->buf, irq_count);
1019
for (i = 0; i < irq_count; i++) {
1020
build_append_int_noprefix(var->buf, irq_list[i], 4);
1026
Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base,
1027
uint8_t aln, uint8_t len)
1029
Aml *var = aml_alloc();
1030
build_append_byte(var->buf, 0x47);
1031
build_append_byte(var->buf, dec);
1032
build_append_byte(var->buf, min_base & 0xff);
1033
build_append_byte(var->buf, (min_base >> 8) & 0xff);
1034
build_append_byte(var->buf, max_base & 0xff);
1035
build_append_byte(var->buf, (max_base >> 8) & 0xff);
1036
build_append_byte(var->buf, aln);
1037
build_append_byte(var->buf, len);
1048
Aml *aml_irq_no_flags(uint8_t irq)
1051
Aml *var = aml_alloc();
1054
build_append_byte(var->buf, 0x22);
1056
irq_mask = 1U << irq;
1057
build_append_byte(var->buf, irq_mask & 0xFF);
1058
build_append_byte(var->buf, irq_mask >> 8);
1063
Aml *aml_lnot(Aml *arg)
1065
Aml *var = aml_opcode(0x92 );
1066
aml_append(var, arg);
1071
Aml *aml_equal(Aml *arg1, Aml *arg2)
1073
Aml *var = aml_opcode(0x93 );
1074
aml_append(var, arg1);
1075
aml_append(var, arg2);
1080
Aml *aml_lgreater(Aml *arg1, Aml *arg2)
1082
Aml *var = aml_opcode(0x94 );
1083
aml_append(var, arg1);
1084
aml_append(var, arg2);
1089
Aml *aml_lgreater_equal(Aml *arg1, Aml *arg2)
1092
Aml *var = aml_opcode(0x92 );
1093
build_append_byte(var->buf, 0x95 );
1094
aml_append(var, arg1);
1095
aml_append(var, arg2);
1100
Aml *aml_if(Aml *predicate)
1102
Aml *var = aml_bundle(0xA0 , AML_PACKAGE);
1103
aml_append(var, predicate);
1110
Aml *var = aml_bundle(0xA1 , AML_PACKAGE);
1115
Aml *aml_while(Aml *predicate)
1117
Aml *var = aml_bundle(0xA2 , AML_PACKAGE);
1118
aml_append(var, predicate);
1123
Aml *aml_method(const char *name, int arg_count, AmlSerializeFlag sflag)
1125
Aml *var = aml_bundle(0x14 , AML_PACKAGE);
1136
assert(arg_count < 8);
1137
methodflags = arg_count | (sflag << 3);
1139
build_append_namestring(var->buf, "%s", name);
1140
build_append_byte(var->buf, methodflags);
1145
Aml *aml_device(const char *name_format, ...)
1148
Aml *var = aml_bundle(0x82 , AML_EXT_PACKAGE);
1149
va_start(ap, name_format);
1150
build_append_namestringv(var->buf, name_format, ap);
1156
Aml *aml_resource_template(void)
1159
Aml *var = aml_bundle(0x11 , AML_RES_TEMPLATE);
1166
Aml *aml_buffer(int buffer_size, uint8_t *byte_list)
1169
Aml *var = aml_bundle(0x11 , AML_BUFFER);
1171
for (i = 0; i < buffer_size; i++) {
1172
if (byte_list == NULL) {
1173
build_append_byte(var->buf, 0x0);
1175
build_append_byte(var->buf, byte_list[i]);
1183
Aml *aml_package(uint8_t num_elements)
1185
Aml *var = aml_bundle(0x12 , AML_PACKAGE);
1186
build_append_byte(var->buf, num_elements);
1191
Aml *aml_operation_region(const char *name, AmlRegionSpace rs,
1192
Aml *offset, uint32_t len)
1194
Aml *var = aml_alloc();
1195
build_append_byte(var->buf, 0x5B);
1196
build_append_byte(var->buf, 0x80);
1197
build_append_namestring(var->buf, "%s", name);
1198
build_append_byte(var->buf, rs);
1199
aml_append(var, offset);
1200
build_append_int(var->buf, len);
1205
Aml *aml_named_field(const char *name, unsigned length)
1207
Aml *var = aml_alloc();
1208
build_append_nameseg(var->buf, name);
1209
build_append_pkg_length(var->buf, length, false);
1214
Aml *aml_reserved_field(unsigned length)
1216
Aml *var = aml_alloc();
1218
build_append_byte(var->buf, 0x00);
1219
build_append_pkg_length(var->buf, length, false);
1224
Aml *aml_field(const char *name, AmlAccessType type, AmlLockRule lock,
1227
Aml *var = aml_bundle(0x81 , AML_EXT_PACKAGE);
1228
uint8_t flags = rule << 5 | type;
1232
build_append_namestring(var->buf, "%s", name);
1233
build_append_byte(var->buf, flags);
1238
Aml *create_field_common(int opcode, Aml *srcbuf, Aml *index, const char *name)
1240
Aml *var = aml_opcode(opcode);
1241
aml_append(var, srcbuf);
1242
aml_append(var, index);
1243
build_append_namestring(var->buf, "%s", name);
1248
Aml *aml_create_field(Aml *srcbuf, Aml *bit_index, Aml *num_bits,
1251
Aml *var = aml_alloc();
1252
build_append_byte(var->buf, 0x5B);
1253
build_append_byte(var->buf, 0x13);
1254
aml_append(var, srcbuf);
1255
aml_append(var, bit_index);
1256
aml_append(var, num_bits);
1257
build_append_namestring(var->buf, "%s", name);
1262
Aml *aml_create_dword_field(Aml *srcbuf, Aml *index, const char *name)
1264
return create_field_common(0x8A ,
1265
srcbuf, index, name);
1269
Aml *aml_create_qword_field(Aml *srcbuf, Aml *index, const char *name)
1271
return create_field_common(0x8F ,
1272
srcbuf, index, name);
1276
Aml *aml_string(const char *name_format, ...)
1278
Aml *var = aml_opcode(0x0D );
1283
va_start(ap, name_format);
1284
len = g_vasprintf(&s, name_format, ap);
1287
g_array_append_vals(var->buf, s, len + 1);
1294
Aml *aml_local(int num)
1296
uint8_t op = 0x60 + num;
1299
return aml_opcode(op);
1303
Aml *aml_varpackage(uint32_t num_elements)
1305
Aml *var = aml_bundle(0x13 , AML_PACKAGE);
1306
build_append_int(var->buf, num_elements);
1311
Aml *aml_processor(uint8_t proc_id, uint32_t pblk_addr, uint8_t pblk_len,
1312
const char *name_format, ...)
1315
Aml *var = aml_bundle(0x83 , AML_EXT_PACKAGE);
1316
va_start(ap, name_format);
1317
build_append_namestringv(var->buf, name_format, ap);
1319
build_append_byte(var->buf, proc_id);
1320
build_append_int_noprefix(var->buf, pblk_addr, sizeof(pblk_addr));
1321
build_append_byte(var->buf, pblk_len);
1325
static uint8_t Hex2Digit(char c)
1328
return c - 'A' + 10;
1335
Aml *aml_eisaid(const char *str)
1337
Aml *var = aml_alloc();
1340
g_assert(strlen(str) == 7);
1341
id = (str[0] - 0x40) << 26 |
1342
(str[1] - 0x40) << 21 |
1343
(str[2] - 0x40) << 16 |
1344
Hex2Digit(str[3]) << 12 |
1345
Hex2Digit(str[4]) << 8 |
1346
Hex2Digit(str[5]) << 4 |
1349
build_append_byte(var->buf, 0x0C);
1350
build_append_int_noprefix(var->buf, bswap32(id), sizeof(id));
1355
static Aml *aml_as_desc_header(AmlResourceType type, AmlMinFixed min_fixed,
1356
AmlMaxFixed max_fixed, AmlDecode dec,
1359
uint8_t flags = max_fixed | min_fixed | dec;
1360
Aml *var = aml_alloc();
1362
build_append_byte(var->buf, type);
1363
build_append_byte(var->buf, flags);
1364
build_append_byte(var->buf, type_flags);
1369
static Aml *aml_word_as_desc(AmlResourceType type, AmlMinFixed min_fixed,
1370
AmlMaxFixed max_fixed, AmlDecode dec,
1371
uint16_t addr_gran, uint16_t addr_min,
1372
uint16_t addr_max, uint16_t addr_trans,
1373
uint16_t len, uint8_t type_flags)
1375
Aml *var = aml_alloc();
1377
build_append_byte(var->buf, 0x88);
1379
build_append_byte(var->buf, 0x0D);
1380
build_append_byte(var->buf, 0x0);
1383
aml_as_desc_header(type, min_fixed, max_fixed, dec, type_flags));
1384
build_append_int_noprefix(var->buf, addr_gran, sizeof(addr_gran));
1385
build_append_int_noprefix(var->buf, addr_min, sizeof(addr_min));
1386
build_append_int_noprefix(var->buf, addr_max, sizeof(addr_max));
1387
build_append_int_noprefix(var->buf, addr_trans, sizeof(addr_trans));
1388
build_append_int_noprefix(var->buf, len, sizeof(len));
1393
static Aml *aml_dword_as_desc(AmlResourceType type, AmlMinFixed min_fixed,
1394
AmlMaxFixed max_fixed, AmlDecode dec,
1395
uint32_t addr_gran, uint32_t addr_min,
1396
uint32_t addr_max, uint32_t addr_trans,
1397
uint32_t len, uint8_t type_flags)
1399
Aml *var = aml_alloc();
1401
build_append_byte(var->buf, 0x87);
1403
build_append_byte(var->buf, 23);
1404
build_append_byte(var->buf, 0x0);
1408
aml_as_desc_header(type, min_fixed, max_fixed, dec, type_flags));
1409
build_append_int_noprefix(var->buf, addr_gran, sizeof(addr_gran));
1410
build_append_int_noprefix(var->buf, addr_min, sizeof(addr_min));
1411
build_append_int_noprefix(var->buf, addr_max, sizeof(addr_max));
1412
build_append_int_noprefix(var->buf, addr_trans, sizeof(addr_trans));
1413
build_append_int_noprefix(var->buf, len, sizeof(len));
1418
static Aml *aml_qword_as_desc(AmlResourceType type, AmlMinFixed min_fixed,
1419
AmlMaxFixed max_fixed, AmlDecode dec,
1420
uint64_t addr_gran, uint64_t addr_min,
1421
uint64_t addr_max, uint64_t addr_trans,
1422
uint64_t len, uint8_t type_flags)
1424
Aml *var = aml_alloc();
1426
build_append_byte(var->buf, 0x8A);
1428
build_append_byte(var->buf, 0x2B);
1429
build_append_byte(var->buf, 0x0);
1432
aml_as_desc_header(type, min_fixed, max_fixed, dec, type_flags));
1433
build_append_int_noprefix(var->buf, addr_gran, sizeof(addr_gran));
1434
build_append_int_noprefix(var->buf, addr_min, sizeof(addr_min));
1435
build_append_int_noprefix(var->buf, addr_max, sizeof(addr_max));
1436
build_append_int_noprefix(var->buf, addr_trans, sizeof(addr_trans));
1437
build_append_int_noprefix(var->buf, len, sizeof(len));
1447
Aml *aml_word_bus_number(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
1448
AmlDecode dec, uint16_t addr_gran,
1449
uint16_t addr_min, uint16_t addr_max,
1450
uint16_t addr_trans, uint16_t len)
1453
return aml_word_as_desc(AML_BUS_NUMBER_RANGE, min_fixed, max_fixed, dec,
1454
addr_gran, addr_min, addr_max, addr_trans, len, 0);
1463
Aml *aml_word_io(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
1464
AmlDecode dec, AmlISARanges isa_ranges,
1465
uint16_t addr_gran, uint16_t addr_min,
1466
uint16_t addr_max, uint16_t addr_trans,
1470
return aml_word_as_desc(AML_IO_RANGE, min_fixed, max_fixed, dec,
1471
addr_gran, addr_min, addr_max, addr_trans, len,
1481
Aml *aml_dword_io(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
1482
AmlDecode dec, AmlISARanges isa_ranges,
1483
uint32_t addr_gran, uint32_t addr_min,
1484
uint32_t addr_max, uint32_t addr_trans,
1488
return aml_dword_as_desc(AML_IO_RANGE, min_fixed, max_fixed, dec,
1489
addr_gran, addr_min, addr_max, addr_trans, len,
1499
Aml *aml_dword_memory(AmlDecode dec, AmlMinFixed min_fixed,
1500
AmlMaxFixed max_fixed, AmlCacheable cacheable,
1501
AmlReadAndWrite read_and_write,
1502
uint32_t addr_gran, uint32_t addr_min,
1503
uint32_t addr_max, uint32_t addr_trans,
1506
uint8_t flags = read_and_write | (cacheable << 1);
1508
return aml_dword_as_desc(AML_MEMORY_RANGE, min_fixed, max_fixed,
1509
dec, addr_gran, addr_min, addr_max,
1510
addr_trans, len, flags);
1519
Aml *aml_qword_memory(AmlDecode dec, AmlMinFixed min_fixed,
1520
AmlMaxFixed max_fixed, AmlCacheable cacheable,
1521
AmlReadAndWrite read_and_write,
1522
uint64_t addr_gran, uint64_t addr_min,
1523
uint64_t addr_max, uint64_t addr_trans,
1526
uint8_t flags = read_and_write | (cacheable << 1);
1528
return aml_qword_as_desc(AML_MEMORY_RANGE, min_fixed, max_fixed,
1529
dec, addr_gran, addr_min, addr_max,
1530
addr_trans, len, flags);
1534
Aml *aml_dma(AmlDmaType typ, AmlDmaBusMaster bm, AmlTransferSize sz,
1537
Aml *var = aml_alloc();
1538
uint8_t flags = sz | bm << 2 | typ << 5;
1540
assert(channel < 8);
1541
build_append_byte(var->buf, 0x2A);
1542
build_append_byte(var->buf, 1U << channel);
1543
build_append_byte(var->buf, flags);
1548
Aml *aml_sleep(uint64_t msec)
1550
Aml *var = aml_alloc();
1551
build_append_byte(var->buf, 0x5B);
1552
build_append_byte(var->buf, 0x22);
1553
aml_append(var, aml_int(msec));
1557
static uint8_t Hex2Byte(const char *src)
1561
hi = Hex2Digit(src[0]);
1565
lo = Hex2Digit(src[1]);
1568
return (hi << 4) | lo;
1576
Aml *aml_touuid(const char *uuid)
1578
Aml *var = aml_bundle(0x11 , AML_BUFFER);
1580
assert(strlen(uuid) == 36);
1581
assert(uuid[8] == '-');
1582
assert(uuid[13] == '-');
1583
assert(uuid[18] == '-');
1584
assert(uuid[23] == '-');
1586
build_append_byte(var->buf, Hex2Byte(uuid + 6));
1587
build_append_byte(var->buf, Hex2Byte(uuid + 4));
1588
build_append_byte(var->buf, Hex2Byte(uuid + 2));
1589
build_append_byte(var->buf, Hex2Byte(uuid + 0));
1591
build_append_byte(var->buf, Hex2Byte(uuid + 11));
1592
build_append_byte(var->buf, Hex2Byte(uuid + 9));
1594
build_append_byte(var->buf, Hex2Byte(uuid + 16));
1595
build_append_byte(var->buf, Hex2Byte(uuid + 14));
1597
build_append_byte(var->buf, Hex2Byte(uuid + 19));
1598
build_append_byte(var->buf, Hex2Byte(uuid + 21));
1600
build_append_byte(var->buf, Hex2Byte(uuid + 24));
1601
build_append_byte(var->buf, Hex2Byte(uuid + 26));
1602
build_append_byte(var->buf, Hex2Byte(uuid + 28));
1603
build_append_byte(var->buf, Hex2Byte(uuid + 30));
1604
build_append_byte(var->buf, Hex2Byte(uuid + 32));
1605
build_append_byte(var->buf, Hex2Byte(uuid + 34));
1613
Aml *aml_unicode(const char *str)
1616
Aml *var = aml_bundle(0x11 , AML_BUFFER);
1619
build_append_byte(var->buf, str[i]);
1620
build_append_byte(var->buf, 0);
1622
} while (i <= strlen(str));
1628
Aml *aml_refof(Aml *arg)
1630
Aml *var = aml_opcode(0x71 );
1631
aml_append(var, arg);
1636
Aml *aml_derefof(Aml *arg)
1638
Aml *var = aml_opcode(0x83 );
1639
aml_append(var, arg);
1644
Aml *aml_sizeof(Aml *arg)
1646
Aml *var = aml_opcode(0x87 );
1647
aml_append(var, arg);
1652
Aml *aml_mutex(const char *name, uint8_t sync_level)
1654
Aml *var = aml_alloc();
1655
build_append_byte(var->buf, 0x5B);
1656
build_append_byte(var->buf, 0x01);
1657
build_append_namestring(var->buf, "%s", name);
1658
assert(!(sync_level & 0xF0));
1659
build_append_byte(var->buf, sync_level);
1664
Aml *aml_acquire(Aml *mutex, uint16_t timeout)
1666
Aml *var = aml_alloc();
1667
build_append_byte(var->buf, 0x5B);
1668
build_append_byte(var->buf, 0x23);
1669
aml_append(var, mutex);
1670
build_append_int_noprefix(var->buf, timeout, sizeof(timeout));
1675
Aml *aml_release(Aml *mutex)
1677
Aml *var = aml_alloc();
1678
build_append_byte(var->buf, 0x5B);
1679
build_append_byte(var->buf, 0x27);
1680
aml_append(var, mutex);
1685
Aml *aml_alias(const char *source_object, const char *alias_object)
1687
Aml *var = aml_opcode(0x06 );
1688
aml_append(var, aml_name("%s", source_object));
1689
aml_append(var, aml_name("%s", alias_object));
1694
Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target)
1696
return build_opcode_2arg_dst(0x73 , source1, source2,
1701
Aml *aml_object_type(Aml *object)
1703
Aml *var = aml_opcode(0x8E );
1704
aml_append(var, object);
1708
void acpi_table_begin(AcpiTable *desc, GArray *array)
1711
desc->array = array;
1712
desc->table_offset = array->len;
1718
g_assert(strlen(desc->sig) == 4);
1719
g_array_append_vals(array, desc->sig, 4);
1724
build_append_int_noprefix(array, 0, 4);
1725
build_append_int_noprefix(array, desc->rev, 1);
1726
build_append_int_noprefix(array, 0, 1);
1727
build_append_padded_str(array, desc->oem_id, 6, '\0');
1729
build_append_padded_str(array, desc->oem_table_id, 8, '\0');
1730
build_append_int_noprefix(array, 1, 4);
1731
g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4);
1732
build_append_int_noprefix(array, 1, 4);
1735
void acpi_table_end(BIOSLinker *linker, AcpiTable *desc)
1742
const unsigned checksum_offset = 9;
1743
uint32_t table_len = desc->array->len - desc->table_offset;
1744
uint32_t table_len_le = cpu_to_le32(table_len);
1745
gchar *len_ptr = &desc->array->data[desc->table_offset + 4];
1751
memcpy(len_ptr, &table_len_le, sizeof table_len_le);
1753
bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
1754
desc->table_offset, table_len, desc->table_offset + checksum_offset);
1757
void *acpi_data_push(GArray *table_data, unsigned size)
1759
unsigned off = table_data->len;
1760
g_array_set_size(table_data, off + size);
1761
return table_data->data + off;
1764
unsigned acpi_data_len(GArray *table)
1766
assert(g_array_get_element_size(table) == 1);
1770
void acpi_add_table(GArray *table_offsets, GArray *table_data)
1772
uint32_t offset = table_data->len;
1773
g_array_append_val(table_offsets, offset);
1776
void acpi_build_tables_init(AcpiBuildTables *tables)
1778
tables->rsdp = g_array_new(false, true , 1);
1779
tables->table_data = g_array_new(false, true , 1);
1780
tables->tcpalog = g_array_new(false, true , 1);
1781
tables->vmgenid = g_array_new(false, true , 1);
1782
tables->hardware_errors = g_array_new(false, true , 1);
1783
tables->linker = bios_linker_loader_init();
1786
void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)
1788
bios_linker_loader_cleanup(tables->linker);
1789
g_array_free(tables->rsdp, true);
1790
g_array_free(tables->table_data, true);
1791
g_array_free(tables->tcpalog, mfre);
1792
g_array_free(tables->vmgenid, mfre);
1793
g_array_free(tables->hardware_errors, mfre);
1801
build_rsdp(GArray *tbl, BIOSLinker *linker, AcpiRsdpData *rsdp_data)
1803
int tbl_off = tbl->len;
1805
switch (rsdp_data->revision) {
1808
g_assert(rsdp_data->rsdt_tbl_offset);
1812
g_assert(rsdp_data->xsdt_tbl_offset);
1816
g_assert_not_reached();
1819
bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, tbl, 16,
1822
g_array_append_vals(tbl, "RSD PTR ", 8);
1823
build_append_int_noprefix(tbl, 0, 1);
1824
g_array_append_vals(tbl, rsdp_data->oem_id, 6);
1825
build_append_int_noprefix(tbl, rsdp_data->revision, 1);
1826
build_append_int_noprefix(tbl, 0, 4);
1827
if (rsdp_data->rsdt_tbl_offset) {
1829
bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
1831
ACPI_BUILD_TABLE_FILE,
1832
*rsdp_data->rsdt_tbl_offset);
1836
bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
1840
if (rsdp_data->revision == 0) {
1845
build_append_int_noprefix(tbl, 36, 4);
1848
build_append_int_noprefix(tbl, 0, 8);
1850
bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
1852
ACPI_BUILD_TABLE_FILE,
1853
*rsdp_data->xsdt_tbl_offset);
1855
build_append_int_noprefix(tbl, 0, 1);
1856
build_append_int_noprefix(tbl, 0, 3);
1859
bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
1868
build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
1869
const char *oem_id, const char *oem_table_id)
1872
AcpiTable table = { .sig = "RSDT", .rev = 1,
1873
.oem_id = oem_id, .oem_table_id = oem_table_id };
1875
acpi_table_begin(&table, table_data);
1876
for (i = 0; i < table_offsets->len; ++i) {
1877
uint32_t ref_tbl_offset = g_array_index(table_offsets, uint32_t, i);
1878
uint32_t rsdt_entry_offset = table.array->len;
1881
build_append_int_noprefix(table.array, 0, 4);
1884
bios_linker_loader_add_pointer(linker,
1885
ACPI_BUILD_TABLE_FILE, rsdt_entry_offset, 4,
1886
ACPI_BUILD_TABLE_FILE, ref_tbl_offset);
1889
acpi_table_end(linker, &table);
1896
build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
1897
const char *oem_id, const char *oem_table_id)
1900
AcpiTable table = { .sig = "XSDT", .rev = 1,
1901
.oem_id = oem_id, .oem_table_id = oem_table_id };
1903
acpi_table_begin(&table, table_data);
1905
for (i = 0; i < table_offsets->len; ++i) {
1906
uint64_t ref_tbl_offset = g_array_index(table_offsets, uint32_t, i);
1907
uint64_t xsdt_entry_offset = table.array->len;
1910
build_append_int_noprefix(table.array, 0, 8);
1913
bios_linker_loader_add_pointer(linker,
1914
ACPI_BUILD_TABLE_FILE, xsdt_entry_offset, 8,
1915
ACPI_BUILD_TABLE_FILE, ref_tbl_offset);
1917
acpi_table_end(linker, &table);
1924
void build_srat_memory(GArray *table_data, uint64_t base,
1925
uint64_t len, int node, MemoryAffinityFlags flags)
1927
build_append_int_noprefix(table_data, 1, 1);
1928
build_append_int_noprefix(table_data, 40, 1);
1929
build_append_int_noprefix(table_data, node, 4);
1930
build_append_int_noprefix(table_data, 0, 2);
1931
build_append_int_noprefix(table_data, base, 4);
1933
build_append_int_noprefix(table_data, base >> 32, 4);
1934
build_append_int_noprefix(table_data, len, 4);
1935
build_append_int_noprefix(table_data, len >> 32, 4);
1936
build_append_int_noprefix(table_data, 0, 4);
1937
build_append_int_noprefix(table_data, flags, 4);
1938
build_append_int_noprefix(table_data, 0, 8);
1945
void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
1946
const char *oem_id, const char *oem_table_id)
1949
int nb_numa_nodes = ms->numa_state->num_nodes;
1950
AcpiTable table = { .sig = "SLIT", .rev = 1,
1951
.oem_id = oem_id, .oem_table_id = oem_table_id };
1953
acpi_table_begin(&table, table_data);
1955
build_append_int_noprefix(table_data, nb_numa_nodes, 8);
1956
for (i = 0; i < nb_numa_nodes; i++) {
1957
for (j = 0; j < nb_numa_nodes; j++) {
1958
assert(ms->numa_state->nodes[i].distance[j]);
1959
build_append_int_noprefix(table_data,
1960
ms->numa_state->nodes[i].distance[j],
1964
acpi_table_end(linker, &table);
1971
static void build_processor_hierarchy_node(GArray *tbl, uint32_t flags,
1972
uint32_t parent, uint32_t id,
1973
uint32_t *priv_rsrc,
1978
build_append_byte(tbl, 0);
1979
build_append_byte(tbl, 20 + priv_num * 4);
1980
build_append_int_noprefix(tbl, 0, 2);
1981
build_append_int_noprefix(tbl, flags, 4);
1982
build_append_int_noprefix(tbl, parent, 4);
1983
build_append_int_noprefix(tbl, id, 4);
1986
build_append_int_noprefix(tbl, priv_num, 4);
1991
for (i = 0; i < priv_num; i++) {
1992
build_append_int_noprefix(tbl, priv_rsrc[i], 4);
1997
void build_spcr(GArray *table_data, BIOSLinker *linker,
1998
const AcpiSpcrData *f, const uint8_t rev,
1999
const char *oem_id, const char *oem_table_id)
2001
AcpiTable table = { .sig = "SPCR", .rev = rev, .oem_id = oem_id,
2002
.oem_table_id = oem_table_id };
2004
acpi_table_begin(&table, table_data);
2006
build_append_int_noprefix(table_data, f->interface_type, 1);
2008
build_append_int_noprefix(table_data, 0, 3);
2010
build_append_gas(table_data, f->base_addr.id, f->base_addr.width,
2011
f->base_addr.offset, f->base_addr.size,
2014
build_append_int_noprefix(table_data, f->interrupt_type, 1);
2016
build_append_int_noprefix(table_data, f->pc_interrupt, 1);
2018
build_append_int_noprefix(table_data, f->interrupt, 4);
2020
build_append_int_noprefix(table_data, f->baud_rate, 1);
2022
build_append_int_noprefix(table_data, f->parity, 1);
2024
build_append_int_noprefix(table_data, f->stop_bits, 1);
2026
build_append_int_noprefix(table_data, f->flow_control, 1);
2028
build_append_int_noprefix(table_data, f->language, 1);
2030
build_append_int_noprefix(table_data, f->terminal_type, 1);
2032
build_append_int_noprefix(table_data, f->pci_device_id, 2);
2034
build_append_int_noprefix(table_data, f->pci_vendor_id, 2);
2036
build_append_int_noprefix(table_data, f->pci_bus, 1);
2038
build_append_int_noprefix(table_data, f->pci_device, 1);
2040
build_append_int_noprefix(table_data, f->pci_function, 1);
2042
build_append_int_noprefix(table_data, f->pci_flags, 4);
2044
build_append_int_noprefix(table_data, f->pci_segment, 1);
2046
build_append_int_noprefix(table_data, 0, 4);
2048
acpi_table_end(linker, &table);
2054
void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
2055
const char *oem_id, const char *oem_table_id)
2057
MachineClass *mc = MACHINE_GET_CLASS(ms);
2058
CPUArchIdList *cpus = ms->possible_cpus;
2059
int64_t socket_id = -1, cluster_id = -1, core_id = -1;
2060
uint32_t socket_offset = 0, cluster_offset = 0, core_offset = 0;
2061
uint32_t pptt_start = table_data->len;
2063
AcpiTable table = { .sig = "PPTT", .rev = 2,
2064
.oem_id = oem_id, .oem_table_id = oem_table_id };
2066
acpi_table_begin(&table, table_data);
2074
for (n = 0; n < cpus->len; n++) {
2075
if (cpus->cpus[n].props.socket_id != socket_id) {
2076
assert(cpus->cpus[n].props.socket_id > socket_id);
2077
socket_id = cpus->cpus[n].props.socket_id;
2080
socket_offset = table_data->len - pptt_start;
2081
build_processor_hierarchy_node(table_data,
2083
0, socket_id, NULL, 0);
2086
if (mc->smp_props.clusters_supported && mc->smp_props.has_clusters) {
2087
if (cpus->cpus[n].props.cluster_id != cluster_id) {
2088
assert(cpus->cpus[n].props.cluster_id > cluster_id);
2089
cluster_id = cpus->cpus[n].props.cluster_id;
2091
cluster_offset = table_data->len - pptt_start;
2092
build_processor_hierarchy_node(table_data,
2094
socket_offset, cluster_id, NULL, 0);
2097
cluster_offset = socket_offset;
2100
if (ms->smp.threads == 1) {
2101
build_processor_hierarchy_node(table_data,
2104
cluster_offset, n, NULL, 0);
2106
if (cpus->cpus[n].props.core_id != core_id) {
2107
assert(cpus->cpus[n].props.core_id > core_id);
2108
core_id = cpus->cpus[n].props.core_id;
2109
core_offset = table_data->len - pptt_start;
2110
build_processor_hierarchy_node(table_data,
2112
cluster_offset, core_id, NULL, 0);
2115
build_processor_hierarchy_node(table_data,
2119
core_offset, n, NULL, 0);
2123
acpi_table_end(linker, &table);
2127
void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
2128
const char *oem_id, const char *oem_table_id)
2131
AcpiTable table = { .sig = "FACP", .rev = f->rev,
2132
.oem_id = oem_id, .oem_table_id = oem_table_id };
2134
acpi_table_begin(&table, tbl);
2138
build_append_int_noprefix(tbl, 0, 4);
2139
if (f->facs_tbl_offset) {
2140
bios_linker_loader_add_pointer(linker,
2141
ACPI_BUILD_TABLE_FILE, off, 4,
2142
ACPI_BUILD_TABLE_FILE, *f->facs_tbl_offset);
2147
build_append_int_noprefix(tbl, 0, 4);
2148
if (f->dsdt_tbl_offset) {
2149
bios_linker_loader_add_pointer(linker,
2150
ACPI_BUILD_TABLE_FILE, off, 4,
2151
ACPI_BUILD_TABLE_FILE, *f->dsdt_tbl_offset);
2155
build_append_int_noprefix(tbl, f->int_model , 1);
2157
build_append_int_noprefix(tbl, 0 , 1);
2158
build_append_int_noprefix(tbl, f->sci_int, 2);
2159
build_append_int_noprefix(tbl, f->smi_cmd, 4);
2160
build_append_int_noprefix(tbl, f->acpi_enable_cmd, 1);
2161
build_append_int_noprefix(tbl, f->acpi_disable_cmd, 1);
2162
build_append_int_noprefix(tbl, 0 , 1);
2164
build_append_int_noprefix(tbl, 0, 1);
2165
build_append_int_noprefix(tbl, f->pm1a_evt.address, 4);
2166
build_append_int_noprefix(tbl, 0, 4);
2167
build_append_int_noprefix(tbl, f->pm1a_cnt.address, 4);
2168
build_append_int_noprefix(tbl, 0, 4);
2169
build_append_int_noprefix(tbl, 0, 4);
2170
build_append_int_noprefix(tbl, f->pm_tmr.address, 4);
2171
build_append_int_noprefix(tbl, f->gpe0_blk.address, 4);
2172
build_append_int_noprefix(tbl, 0, 4);
2174
build_append_int_noprefix(tbl, f->pm1a_evt.bit_width / 8, 1);
2176
build_append_int_noprefix(tbl, f->pm1a_cnt.bit_width / 8, 1);
2177
build_append_int_noprefix(tbl, 0, 1);
2178
build_append_int_noprefix(tbl, f->pm_tmr.bit_width / 8, 1);
2180
build_append_int_noprefix(tbl, f->gpe0_blk.bit_width / 8, 1);
2181
build_append_int_noprefix(tbl, 0, 1);
2182
build_append_int_noprefix(tbl, 0, 1);
2183
build_append_int_noprefix(tbl, 0, 1);
2184
build_append_int_noprefix(tbl, f->plvl2_lat, 2);
2185
build_append_int_noprefix(tbl, f->plvl3_lat, 2);
2186
build_append_int_noprefix(tbl, 0, 2);
2187
build_append_int_noprefix(tbl, 0, 2);
2188
build_append_int_noprefix(tbl, 0, 1);
2189
build_append_int_noprefix(tbl, 0, 1);
2190
build_append_int_noprefix(tbl, 0, 1);
2191
build_append_int_noprefix(tbl, 0, 1);
2192
build_append_int_noprefix(tbl, f->rtc_century, 1);
2195
build_append_int_noprefix(tbl, 0, 2);
2198
build_append_int_noprefix(tbl, f->iapc_boot_arch, 2);
2200
build_append_int_noprefix(tbl, 0, 1);
2201
build_append_int_noprefix(tbl, f->flags, 4);
2207
build_append_gas_from_struct(tbl, &f->reset_reg);
2208
build_append_int_noprefix(tbl, f->reset_val, 1);
2210
if ((f->rev >= 6) || ((f->rev == 5) && f->minor_ver > 0)) {
2211
build_append_int_noprefix(tbl, f->arm_boot_arch, 2);
2213
build_append_int_noprefix(tbl, f->minor_ver, 1);
2215
build_append_int_noprefix(tbl, 0, 3);
2217
build_append_int_noprefix(tbl, 0, 8);
2221
build_append_int_noprefix(tbl, 0, 8);
2222
if (f->xdsdt_tbl_offset) {
2223
bios_linker_loader_add_pointer(linker,
2224
ACPI_BUILD_TABLE_FILE, off, 8,
2225
ACPI_BUILD_TABLE_FILE, *f->xdsdt_tbl_offset);
2228
build_append_gas_from_struct(tbl, &f->pm1a_evt);
2230
build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0);
2231
build_append_gas_from_struct(tbl, &f->pm1a_cnt);
2233
build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0);
2235
build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0);
2236
build_append_gas_from_struct(tbl, &f->pm_tmr);
2237
build_append_gas_from_struct(tbl, &f->gpe0_blk);
2238
build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0);
2245
build_append_gas_from_struct(tbl, &f->sleep_ctl);
2247
build_append_gas_from_struct(tbl, &f->sleep_sts);
2254
build_append_padded_str(tbl, "QEMU", 8, '\0');
2257
assert(f->rev == 6);
2260
acpi_table_end(linker, &table);
2269
void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
2270
const char *oem_id, const char *oem_table_id)
2272
uint8_t start_method_params[12] = {};
2273
unsigned log_addr_offset;
2274
uint64_t control_area_start_address;
2275
TPMIf *tpmif = tpm_find();
2276
uint32_t start_method;
2277
AcpiTable table = { .sig = "TPM2", .rev = 4,
2278
.oem_id = oem_id, .oem_table_id = oem_table_id };
2280
acpi_table_begin(&table, table_data);
2283
build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2);
2285
build_append_int_noprefix(table_data, 0, 2);
2286
if (TPM_IS_TIS_ISA(tpmif) || TPM_IS_TIS_SYSBUS(tpmif)) {
2287
control_area_start_address = 0;
2288
start_method = TPM2_START_METHOD_MMIO;
2289
} else if (TPM_IS_CRB(tpmif)) {
2290
control_area_start_address = TPM_CRB_ADDR_CTRL;
2291
start_method = TPM2_START_METHOD_CRB;
2293
g_assert_not_reached();
2296
build_append_int_noprefix(table_data, control_area_start_address, 8);
2298
build_append_int_noprefix(table_data, start_method, 4);
2301
g_array_append_vals(table_data, &start_method_params,
2302
ARRAY_SIZE(start_method_params));
2305
build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4);
2307
acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
2308
bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1,
2311
log_addr_offset = table_data->len;
2314
build_append_int_noprefix(table_data, 0, 8);
2315
bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
2317
ACPI_BUILD_TPMLOG_FILE, 0);
2318
acpi_table_end(linker, &table);
2322
Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set, uint32_t io_offset,
2323
uint32_t mmio32_offset, uint64_t mmio64_offset,
2324
uint16_t bus_nr_offset)
2326
Aml *crs = aml_resource_template();
2327
CrsRangeSet temp_range_set;
2328
CrsRangeEntry *entry;
2329
uint8_t max_bus = pci_bus_num(host->bus);
2334
crs_range_set_init(&temp_range_set);
2335
for (devfn = 0; devfn < ARRAY_SIZE(host->bus->devices); devfn++) {
2336
uint64_t range_base, range_limit;
2337
PCIDevice *dev = host->bus->devices[devfn];
2343
for (i = 0; i < PCI_NUM_REGIONS; i++) {
2344
PCIIORegion *r = &dev->io_regions[i];
2346
range_base = r->addr;
2347
range_limit = r->addr + r->size - 1;
2353
if (!range_base || range_base > range_limit) {
2357
if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
2358
crs_range_insert(temp_range_set.io_ranges,
2359
range_base, range_limit);
2361
uint64_t length = range_limit - range_base + 1;
2362
if (range_limit <= UINT32_MAX && length <= UINT32_MAX) {
2363
crs_range_insert(temp_range_set.mem_ranges, range_base,
2366
crs_range_insert(temp_range_set.mem_64bit_ranges,
2367
range_base, range_limit);
2372
type = dev->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
2373
if (type == PCI_HEADER_TYPE_BRIDGE) {
2374
uint8_t subordinate = dev->config[PCI_SUBORDINATE_BUS];
2375
if (subordinate > max_bus) {
2376
max_bus = subordinate;
2379
range_base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO);
2380
range_limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO);
2386
if (range_base && range_base <= range_limit) {
2387
crs_range_insert(temp_range_set.io_ranges,
2388
range_base, range_limit);
2392
pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
2394
pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
2400
if (range_base && range_base <= range_limit) {
2401
uint64_t length = range_limit - range_base + 1;
2402
if (range_limit <= UINT32_MAX && length <= UINT32_MAX) {
2403
crs_range_insert(temp_range_set.mem_ranges,
2404
range_base, range_limit);
2406
crs_range_insert(temp_range_set.mem_64bit_ranges,
2407
range_base, range_limit);
2412
pci_bridge_get_base(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
2414
pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
2420
if (range_base && range_base <= range_limit) {
2421
uint64_t length = range_limit - range_base + 1;
2422
if (range_limit <= UINT32_MAX && length <= UINT32_MAX) {
2423
crs_range_insert(temp_range_set.mem_ranges,
2424
range_base, range_limit);
2426
crs_range_insert(temp_range_set.mem_64bit_ranges,
2427
range_base, range_limit);
2433
crs_range_merge(temp_range_set.io_ranges);
2434
for (i = 0; i < temp_range_set.io_ranges->len; i++) {
2435
entry = g_ptr_array_index(temp_range_set.io_ranges, i);
2437
aml_dword_io(AML_MIN_FIXED, AML_MAX_FIXED,
2438
AML_POS_DECODE, AML_ENTIRE_RANGE,
2439
0, entry->base, entry->limit, io_offset,
2440
entry->limit - entry->base + 1));
2441
crs_range_insert(range_set->io_ranges, entry->base, entry->limit);
2444
crs_range_merge(temp_range_set.mem_ranges);
2445
for (i = 0; i < temp_range_set.mem_ranges->len; i++) {
2446
entry = g_ptr_array_index(temp_range_set.mem_ranges, i);
2447
assert(entry->limit <= UINT32_MAX &&
2448
(entry->limit - entry->base + 1) <= UINT32_MAX);
2450
aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED,
2451
AML_MAX_FIXED, AML_NON_CACHEABLE,
2453
0, entry->base, entry->limit, mmio32_offset,
2454
entry->limit - entry->base + 1));
2455
crs_range_insert(range_set->mem_ranges, entry->base, entry->limit);
2458
crs_range_merge(temp_range_set.mem_64bit_ranges);
2459
for (i = 0; i < temp_range_set.mem_64bit_ranges->len; i++) {
2460
entry = g_ptr_array_index(temp_range_set.mem_64bit_ranges, i);
2462
aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED,
2463
AML_MAX_FIXED, AML_NON_CACHEABLE,
2465
0, entry->base, entry->limit, mmio64_offset,
2466
entry->limit - entry->base + 1));
2467
crs_range_insert(range_set->mem_64bit_ranges,
2468
entry->base, entry->limit);
2471
crs_range_set_free(&temp_range_set);
2474
aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE,
2476
pci_bus_num(host->bus),
2479
max_bus - pci_bus_num(host->bus) + 1));
2485
static Aml *aml_serial_bus_device(uint8_t serial_bus_type, uint8_t flags,
2486
uint16_t type_flags,
2487
uint8_t revid, uint16_t data_length,
2488
uint16_t resource_source_len)
2490
Aml *var = aml_alloc();
2491
uint16_t length = data_length + resource_source_len + 9;
2493
build_append_byte(var->buf, 0x8e);
2494
build_append_int_noprefix(var->buf, length, sizeof(length));
2495
build_append_byte(var->buf, 1);
2496
build_append_byte(var->buf, 0);
2497
build_append_byte(var->buf, serial_bus_type);
2498
build_append_byte(var->buf, flags);
2499
build_append_int_noprefix(var->buf, type_flags,
2500
sizeof(type_flags));
2501
build_append_byte(var->buf, revid);
2502
build_append_int_noprefix(var->buf, data_length, sizeof(data_length));
2508
Aml *aml_i2c_serial_bus_device(uint16_t address, const char *resource_source)
2510
uint16_t resource_source_len = strlen(resource_source) + 1;
2511
Aml *var = aml_serial_bus_device(AML_SERIAL_BUS_TYPE_I2C, 0, 0, 1,
2512
6, resource_source_len);
2515
build_append_int_noprefix(var->buf, 100000, 4);
2516
build_append_int_noprefix(var->buf, address, sizeof(address));
2519
g_array_append_vals(var->buf, resource_source, resource_source_len);