virt-acpi-build.c 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  1. /* Support for generating ACPI tables and passing them to Guests
  2. *
  3. * ARM virt ACPI generation
  4. *
  5. * Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
  6. * Copyright (C) 2006 Fabrice Bellard
  7. * Copyright (C) 2013 Red Hat Inc
  8. *
  9. * Author: Michael S. Tsirkin <mst@redhat.com>
  10. *
  11. * Copyright (c) 2015 HUAWEI TECHNOLOGIES CO.,LTD.
  12. *
  13. * Author: Shannon Zhao <zhaoshenglong@huawei.com>
  14. *
  15. * This program is free software; you can redistribute it and/or modify
  16. * it under the terms of the GNU General Public License as published by
  17. * the Free Software Foundation; either version 2 of the License, or
  18. * (at your option) any later version.
  19. * This program is distributed in the hope that it will be useful,
  20. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. * GNU General Public License for more details.
  23. * You should have received a copy of the GNU General Public License along
  24. * with this program; if not, see <http://www.gnu.org/licenses/>.
  25. */
  26. #include "qemu/osdep.h"
  27. #include "qapi/error.h"
  28. #include "qemu/bitmap.h"
  29. #include "qemu/error-report.h"
  30. #include "trace.h"
  31. #include "hw/core/cpu.h"
  32. #include "hw/acpi/acpi-defs.h"
  33. #include "hw/acpi/acpi.h"
  34. #include "hw/acpi/acpi_aml_interface.h"
  35. #include "hw/nvram/fw_cfg_acpi.h"
  36. #include "hw/acpi/bios-linker-loader.h"
  37. #include "hw/acpi/aml-build.h"
  38. #include "hw/acpi/utils.h"
  39. #include "hw/acpi/pci.h"
  40. #include "hw/acpi/memory_hotplug.h"
  41. #include "hw/acpi/generic_event_device.h"
  42. #include "hw/acpi/tpm.h"
  43. #include "hw/acpi/hmat.h"
  44. #include "hw/pci/pcie_host.h"
  45. #include "hw/pci/pci.h"
  46. #include "hw/pci/pci_bus.h"
  47. #include "hw/pci-host/gpex.h"
  48. #include "hw/arm/virt.h"
  49. #include "hw/intc/arm_gicv3_its_common.h"
  50. #include "hw/mem/nvdimm.h"
  51. #include "hw/platform-bus.h"
  52. #include "system/numa.h"
  53. #include "system/reset.h"
  54. #include "system/tpm.h"
  55. #include "migration/vmstate.h"
  56. #include "hw/acpi/ghes.h"
  57. #include "hw/acpi/viot.h"
  58. #include "hw/virtio/virtio-acpi.h"
  59. #include "target/arm/multiprocessing.h"
  60. #define ARM_SPI_BASE 32
  61. #define ACPI_BUILD_TABLE_SIZE 0x20000
  62. static void acpi_dsdt_add_cpus(Aml *scope, VirtMachineState *vms)
  63. {
  64. MachineState *ms = MACHINE(vms);
  65. uint16_t i;
  66. for (i = 0; i < ms->smp.cpus; i++) {
  67. Aml *dev = aml_device("C%.03X", i);
  68. aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0007")));
  69. aml_append(dev, aml_name_decl("_UID", aml_int(i)));
  70. aml_append(scope, dev);
  71. }
  72. }
  73. static void acpi_dsdt_add_uart(Aml *scope, const MemMapEntry *uart_memmap,
  74. uint32_t uart_irq, int uartidx)
  75. {
  76. Aml *dev = aml_device("COM%d", uartidx);
  77. aml_append(dev, aml_name_decl("_HID", aml_string("ARMH0011")));
  78. aml_append(dev, aml_name_decl("_UID", aml_int(uartidx)));
  79. Aml *crs = aml_resource_template();
  80. aml_append(crs, aml_memory32_fixed(uart_memmap->base,
  81. uart_memmap->size, AML_READ_WRITE));
  82. aml_append(crs,
  83. aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH,
  84. AML_EXCLUSIVE, &uart_irq, 1));
  85. aml_append(dev, aml_name_decl("_CRS", crs));
  86. aml_append(scope, dev);
  87. }
  88. static void acpi_dsdt_add_flash(Aml *scope, const MemMapEntry *flash_memmap)
  89. {
  90. Aml *dev, *crs;
  91. hwaddr base = flash_memmap->base;
  92. hwaddr size = flash_memmap->size / 2;
  93. dev = aml_device("FLS0");
  94. aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0015")));
  95. aml_append(dev, aml_name_decl("_UID", aml_int(0)));
  96. crs = aml_resource_template();
  97. aml_append(crs, aml_memory32_fixed(base, size, AML_READ_WRITE));
  98. aml_append(dev, aml_name_decl("_CRS", crs));
  99. aml_append(scope, dev);
  100. dev = aml_device("FLS1");
  101. aml_append(dev, aml_name_decl("_HID", aml_string("LNRO0015")));
  102. aml_append(dev, aml_name_decl("_UID", aml_int(1)));
  103. crs = aml_resource_template();
  104. aml_append(crs, aml_memory32_fixed(base + size, size, AML_READ_WRITE));
  105. aml_append(dev, aml_name_decl("_CRS", crs));
  106. aml_append(scope, dev);
  107. }
  108. static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap,
  109. uint32_t irq, VirtMachineState *vms)
  110. {
  111. int ecam_id = VIRT_ECAM_ID(vms->highmem_ecam);
  112. struct GPEXConfig cfg = {
  113. .mmio32 = memmap[VIRT_PCIE_MMIO],
  114. .pio = memmap[VIRT_PCIE_PIO],
  115. .ecam = memmap[ecam_id],
  116. .irq = irq,
  117. .bus = vms->bus,
  118. };
  119. if (vms->highmem_mmio) {
  120. cfg.mmio64 = memmap[VIRT_HIGH_PCIE_MMIO];
  121. }
  122. acpi_dsdt_add_gpex(scope, &cfg);
  123. }
  124. static void acpi_dsdt_add_gpio(Aml *scope, const MemMapEntry *gpio_memmap,
  125. uint32_t gpio_irq)
  126. {
  127. Aml *dev = aml_device("GPO0");
  128. aml_append(dev, aml_name_decl("_HID", aml_string("ARMH0061")));
  129. aml_append(dev, aml_name_decl("_UID", aml_int(0)));
  130. Aml *crs = aml_resource_template();
  131. aml_append(crs, aml_memory32_fixed(gpio_memmap->base, gpio_memmap->size,
  132. AML_READ_WRITE));
  133. aml_append(crs, aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH,
  134. AML_EXCLUSIVE, &gpio_irq, 1));
  135. aml_append(dev, aml_name_decl("_CRS", crs));
  136. Aml *aei = aml_resource_template();
  137. const uint32_t pin = GPIO_PIN_POWER_BUTTON;
  138. aml_append(aei, aml_gpio_int(AML_CONSUMER, AML_EDGE, AML_ACTIVE_HIGH,
  139. AML_EXCLUSIVE, AML_PULL_UP, 0, &pin, 1,
  140. "GPO0", NULL, 0));
  141. aml_append(dev, aml_name_decl("_AEI", aei));
  142. /* _E03 is handle for power button */
  143. Aml *method = aml_method("_E03", 0, AML_NOTSERIALIZED);
  144. aml_append(method, aml_notify(aml_name(ACPI_POWER_BUTTON_DEVICE),
  145. aml_int(0x80)));
  146. aml_append(dev, method);
  147. aml_append(scope, dev);
  148. }
  149. #define ID_MAPPING_ENTRY_SIZE 20
  150. #define SMMU_V3_ENTRY_SIZE 68
  151. #define ROOT_COMPLEX_ENTRY_SIZE 36
  152. #define IORT_NODE_OFFSET 48
  153. /*
  154. * Append an ID mapping entry as described by "Table 4 ID mapping format" in
  155. * "IO Remapping Table System Software on ARM Platforms", Chapter 3.
  156. * Document number: ARM DEN 0049E.f, Apr 2024
  157. *
  158. * Note that @id_count gets internally subtracted by one, following the spec.
  159. */
  160. static void build_iort_id_mapping(GArray *table_data, uint32_t input_base,
  161. uint32_t id_count, uint32_t out_ref)
  162. {
  163. build_append_int_noprefix(table_data, input_base, 4); /* Input base */
  164. /* Number of IDs - The number of IDs in the range minus one */
  165. build_append_int_noprefix(table_data, id_count - 1, 4);
  166. build_append_int_noprefix(table_data, input_base, 4); /* Output base */
  167. build_append_int_noprefix(table_data, out_ref, 4); /* Output Reference */
  168. /* Flags */
  169. build_append_int_noprefix(table_data, 0 /* Single mapping (disabled) */, 4);
  170. }
  171. struct AcpiIortIdMapping {
  172. uint32_t input_base;
  173. uint32_t id_count;
  174. };
  175. typedef struct AcpiIortIdMapping AcpiIortIdMapping;
  176. /* Build the iort ID mapping to SMMUv3 for a given PCI host bridge */
  177. static int
  178. iort_host_bridges(Object *obj, void *opaque)
  179. {
  180. GArray *idmap_blob = opaque;
  181. if (object_dynamic_cast(obj, TYPE_PCI_HOST_BRIDGE)) {
  182. PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus;
  183. if (bus && !pci_bus_bypass_iommu(bus)) {
  184. int min_bus, max_bus;
  185. pci_bus_range(bus, &min_bus, &max_bus);
  186. AcpiIortIdMapping idmap = {
  187. .input_base = min_bus << 8,
  188. .id_count = (max_bus - min_bus + 1) << 8,
  189. };
  190. g_array_append_val(idmap_blob, idmap);
  191. }
  192. }
  193. return 0;
  194. }
  195. static int iort_idmap_compare(gconstpointer a, gconstpointer b)
  196. {
  197. AcpiIortIdMapping *idmap_a = (AcpiIortIdMapping *)a;
  198. AcpiIortIdMapping *idmap_b = (AcpiIortIdMapping *)b;
  199. return idmap_a->input_base - idmap_b->input_base;
  200. }
  201. /*
  202. * Input Output Remapping Table (IORT)
  203. * Conforms to "IO Remapping Table System Software on ARM Platforms",
  204. * Document number: ARM DEN 0049E.b, Feb 2021
  205. */
  206. static void
  207. build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  208. {
  209. int i, nb_nodes, rc_mapping_count;
  210. size_t node_size, smmu_offset = 0;
  211. AcpiIortIdMapping *idmap;
  212. uint32_t id = 0;
  213. GArray *smmu_idmaps = g_array_new(false, true, sizeof(AcpiIortIdMapping));
  214. GArray *its_idmaps = g_array_new(false, true, sizeof(AcpiIortIdMapping));
  215. AcpiTable table = { .sig = "IORT", .rev = 3, .oem_id = vms->oem_id,
  216. .oem_table_id = vms->oem_table_id };
  217. /* Table 2 The IORT */
  218. acpi_table_begin(&table, table_data);
  219. if (vms->iommu == VIRT_IOMMU_SMMUV3) {
  220. AcpiIortIdMapping next_range = {0};
  221. object_child_foreach_recursive(object_get_root(),
  222. iort_host_bridges, smmu_idmaps);
  223. /* Sort the smmu idmap by input_base */
  224. g_array_sort(smmu_idmaps, iort_idmap_compare);
  225. /*
  226. * Split the whole RIDs by mapping from RC to SMMU,
  227. * build the ID mapping from RC to ITS directly.
  228. */
  229. for (i = 0; i < smmu_idmaps->len; i++) {
  230. idmap = &g_array_index(smmu_idmaps, AcpiIortIdMapping, i);
  231. if (next_range.input_base < idmap->input_base) {
  232. next_range.id_count = idmap->input_base - next_range.input_base;
  233. g_array_append_val(its_idmaps, next_range);
  234. }
  235. next_range.input_base = idmap->input_base + idmap->id_count;
  236. }
  237. /* Append the last RC -> ITS ID mapping */
  238. if (next_range.input_base < 0x10000) {
  239. next_range.id_count = 0x10000 - next_range.input_base;
  240. g_array_append_val(its_idmaps, next_range);
  241. }
  242. nb_nodes = 3; /* RC, ITS, SMMUv3 */
  243. rc_mapping_count = smmu_idmaps->len + its_idmaps->len;
  244. } else {
  245. nb_nodes = 2; /* RC, ITS */
  246. rc_mapping_count = 1;
  247. }
  248. /* Number of IORT Nodes */
  249. build_append_int_noprefix(table_data, nb_nodes, 4);
  250. /* Offset to Array of IORT Nodes */
  251. build_append_int_noprefix(table_data, IORT_NODE_OFFSET, 4);
  252. build_append_int_noprefix(table_data, 0, 4); /* Reserved */
  253. /* Table 12 ITS Group Format */
  254. build_append_int_noprefix(table_data, 0 /* ITS Group */, 1); /* Type */
  255. node_size = 20 /* fixed header size */ + 4 /* 1 GIC ITS Identifier */;
  256. build_append_int_noprefix(table_data, node_size, 2); /* Length */
  257. build_append_int_noprefix(table_data, 1, 1); /* Revision */
  258. build_append_int_noprefix(table_data, id++, 4); /* Identifier */
  259. build_append_int_noprefix(table_data, 0, 4); /* Number of ID mappings */
  260. build_append_int_noprefix(table_data, 0, 4); /* Reference to ID Array */
  261. build_append_int_noprefix(table_data, 1, 4); /* Number of ITSs */
  262. /* GIC ITS Identifier Array */
  263. build_append_int_noprefix(table_data, 0 /* MADT translation_id */, 4);
  264. if (vms->iommu == VIRT_IOMMU_SMMUV3) {
  265. int irq = vms->irqmap[VIRT_SMMU] + ARM_SPI_BASE;
  266. smmu_offset = table_data->len - table.table_offset;
  267. /* Table 9 SMMUv3 Format */
  268. build_append_int_noprefix(table_data, 4 /* SMMUv3 */, 1); /* Type */
  269. node_size = SMMU_V3_ENTRY_SIZE + ID_MAPPING_ENTRY_SIZE;
  270. build_append_int_noprefix(table_data, node_size, 2); /* Length */
  271. build_append_int_noprefix(table_data, 4, 1); /* Revision */
  272. build_append_int_noprefix(table_data, id++, 4); /* Identifier */
  273. build_append_int_noprefix(table_data, 1, 4); /* Number of ID mappings */
  274. /* Reference to ID Array */
  275. build_append_int_noprefix(table_data, SMMU_V3_ENTRY_SIZE, 4);
  276. /* Base address */
  277. build_append_int_noprefix(table_data, vms->memmap[VIRT_SMMU].base, 8);
  278. /* Flags */
  279. build_append_int_noprefix(table_data, 1 /* COHACC Override */, 4);
  280. build_append_int_noprefix(table_data, 0, 4); /* Reserved */
  281. build_append_int_noprefix(table_data, 0, 8); /* VATOS address */
  282. /* Model */
  283. build_append_int_noprefix(table_data, 0 /* Generic SMMU-v3 */, 4);
  284. build_append_int_noprefix(table_data, irq, 4); /* Event */
  285. build_append_int_noprefix(table_data, irq + 1, 4); /* PRI */
  286. build_append_int_noprefix(table_data, irq + 3, 4); /* GERR */
  287. build_append_int_noprefix(table_data, irq + 2, 4); /* Sync */
  288. build_append_int_noprefix(table_data, 0, 4); /* Proximity domain */
  289. /* DeviceID mapping index (ignored since interrupts are GSIV based) */
  290. build_append_int_noprefix(table_data, 0, 4);
  291. /* output IORT node is the ITS group node (the first node) */
  292. build_iort_id_mapping(table_data, 0, 0x10000, IORT_NODE_OFFSET);
  293. }
  294. /* Table 17 Root Complex Node */
  295. build_append_int_noprefix(table_data, 2 /* Root complex */, 1); /* Type */
  296. node_size = ROOT_COMPLEX_ENTRY_SIZE +
  297. ID_MAPPING_ENTRY_SIZE * rc_mapping_count;
  298. build_append_int_noprefix(table_data, node_size, 2); /* Length */
  299. build_append_int_noprefix(table_data, 3, 1); /* Revision */
  300. build_append_int_noprefix(table_data, id++, 4); /* Identifier */
  301. /* Number of ID mappings */
  302. build_append_int_noprefix(table_data, rc_mapping_count, 4);
  303. /* Reference to ID Array */
  304. build_append_int_noprefix(table_data, ROOT_COMPLEX_ENTRY_SIZE, 4);
  305. /* Table 14 Memory access properties */
  306. /* CCA: Cache Coherent Attribute */
  307. build_append_int_noprefix(table_data, 1 /* fully coherent */, 4);
  308. build_append_int_noprefix(table_data, 0, 1); /* AH: Note Allocation Hints */
  309. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  310. /* Table 15 Memory Access Flags */
  311. build_append_int_noprefix(table_data, 0x3 /* CCA = CPM = DACS = 1 */, 1);
  312. build_append_int_noprefix(table_data, 0, 4); /* ATS Attribute */
  313. /* MCFG pci_segment */
  314. build_append_int_noprefix(table_data, 0, 4); /* PCI Segment number */
  315. /* Memory address size limit */
  316. build_append_int_noprefix(table_data, 64, 1);
  317. build_append_int_noprefix(table_data, 0, 3); /* Reserved */
  318. /* Output Reference */
  319. if (vms->iommu == VIRT_IOMMU_SMMUV3) {
  320. AcpiIortIdMapping *range;
  321. /* translated RIDs connect to SMMUv3 node: RC -> SMMUv3 -> ITS */
  322. for (i = 0; i < smmu_idmaps->len; i++) {
  323. range = &g_array_index(smmu_idmaps, AcpiIortIdMapping, i);
  324. /* output IORT node is the smmuv3 node */
  325. build_iort_id_mapping(table_data, range->input_base,
  326. range->id_count, smmu_offset);
  327. }
  328. /* bypassed RIDs connect to ITS group node directly: RC -> ITS */
  329. for (i = 0; i < its_idmaps->len; i++) {
  330. range = &g_array_index(its_idmaps, AcpiIortIdMapping, i);
  331. /* output IORT node is the ITS group node (the first node) */
  332. build_iort_id_mapping(table_data, range->input_base,
  333. range->id_count, IORT_NODE_OFFSET);
  334. }
  335. } else {
  336. /* output IORT node is the ITS group node (the first node) */
  337. build_iort_id_mapping(table_data, 0, 0x10000, IORT_NODE_OFFSET);
  338. }
  339. acpi_table_end(linker, &table);
  340. g_array_free(smmu_idmaps, true);
  341. g_array_free(its_idmaps, true);
  342. }
  343. /*
  344. * Serial Port Console Redirection Table (SPCR)
  345. * Rev: 1.07
  346. */
  347. static void
  348. spcr_setup(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  349. {
  350. AcpiSpcrData serial = {
  351. .interface_type = 3, /* ARM PL011 UART */
  352. .base_addr.id = AML_AS_SYSTEM_MEMORY,
  353. .base_addr.width = 32,
  354. .base_addr.offset = 0,
  355. .base_addr.size = 3,
  356. .base_addr.addr = vms->memmap[VIRT_UART0].base,
  357. .interrupt_type = (1 << 3),/* Bit[3] ARMH GIC interrupt*/
  358. .pc_interrupt = 0, /* IRQ */
  359. .interrupt = (vms->irqmap[VIRT_UART0] + ARM_SPI_BASE),
  360. .baud_rate = 3, /* 9600 */
  361. .parity = 0, /* No Parity */
  362. .stop_bits = 1, /* 1 Stop bit */
  363. .flow_control = 1 << 1, /* RTS/CTS hardware flow control */
  364. .terminal_type = 0, /* VT100 */
  365. .language = 0, /* Language */
  366. .pci_device_id = 0xffff, /* not a PCI device*/
  367. .pci_vendor_id = 0xffff, /* not a PCI device*/
  368. .pci_bus = 0,
  369. .pci_device = 0,
  370. .pci_function = 0,
  371. .pci_flags = 0,
  372. .pci_segment = 0,
  373. };
  374. /*
  375. * Passing NULL as the SPCR Table for Revision 2 doesn't support
  376. * NameSpaceString.
  377. */
  378. build_spcr(table_data, linker, &serial, 2, vms->oem_id, vms->oem_table_id,
  379. NULL);
  380. }
  381. /*
  382. * ACPI spec, Revision 5.1
  383. * 5.2.16 System Resource Affinity Table (SRAT)
  384. */
  385. static void
  386. build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  387. {
  388. int i;
  389. uint64_t mem_base;
  390. MachineClass *mc = MACHINE_GET_CLASS(vms);
  391. MachineState *ms = MACHINE(vms);
  392. const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms);
  393. AcpiTable table = { .sig = "SRAT", .rev = 3, .oem_id = vms->oem_id,
  394. .oem_table_id = vms->oem_table_id };
  395. acpi_table_begin(&table, table_data);
  396. build_append_int_noprefix(table_data, 1, 4); /* Reserved */
  397. build_append_int_noprefix(table_data, 0, 8); /* Reserved */
  398. for (i = 0; i < cpu_list->len; ++i) {
  399. uint32_t nodeid = cpu_list->cpus[i].props.node_id;
  400. /*
  401. * 5.2.16.4 GICC Affinity Structure
  402. */
  403. build_append_int_noprefix(table_data, 3, 1); /* Type */
  404. build_append_int_noprefix(table_data, 18, 1); /* Length */
  405. build_append_int_noprefix(table_data, nodeid, 4); /* Proximity Domain */
  406. build_append_int_noprefix(table_data, i, 4); /* ACPI Processor UID */
  407. /* Flags, Table 5-76 */
  408. build_append_int_noprefix(table_data, 1 /* Enabled */, 4);
  409. build_append_int_noprefix(table_data, 0, 4); /* Clock Domain */
  410. }
  411. mem_base = vms->memmap[VIRT_MEM].base;
  412. for (i = 0; i < ms->numa_state->num_nodes; ++i) {
  413. if (ms->numa_state->nodes[i].node_mem > 0) {
  414. build_srat_memory(table_data, mem_base,
  415. ms->numa_state->nodes[i].node_mem, i,
  416. MEM_AFFINITY_ENABLED);
  417. mem_base += ms->numa_state->nodes[i].node_mem;
  418. }
  419. }
  420. build_srat_generic_affinity_structures(table_data);
  421. if (ms->nvdimms_state->is_enabled) {
  422. nvdimm_build_srat(table_data);
  423. }
  424. if (ms->device_memory) {
  425. build_srat_memory(table_data, ms->device_memory->base,
  426. memory_region_size(&ms->device_memory->mr),
  427. ms->numa_state->num_nodes - 1,
  428. MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
  429. }
  430. acpi_table_end(linker, &table);
  431. }
  432. /*
  433. * ACPI spec, Revision 6.5
  434. * 5.2.25 Generic Timer Description Table (GTDT)
  435. */
  436. static void
  437. build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  438. {
  439. VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
  440. /*
  441. * Table 5-117 Flag Definitions
  442. * set only "Timer interrupt Mode" and assume "Timer Interrupt
  443. * polarity" bit as '0: Interrupt is Active high'
  444. */
  445. uint32_t irqflags = vmc->claim_edge_triggered_timers ?
  446. 1 : /* Interrupt is Edge triggered */
  447. 0; /* Interrupt is Level triggered */
  448. AcpiTable table = { .sig = "GTDT", .rev = 3, .oem_id = vms->oem_id,
  449. .oem_table_id = vms->oem_table_id };
  450. acpi_table_begin(&table, table_data);
  451. /* CntControlBase Physical Address */
  452. build_append_int_noprefix(table_data, 0xFFFFFFFFFFFFFFFF, 8);
  453. build_append_int_noprefix(table_data, 0, 4); /* Reserved */
  454. /*
  455. * FIXME: clarify comment:
  456. * The interrupt values are the same with the device tree when adding 16
  457. */
  458. /* Secure EL1 timer GSIV */
  459. build_append_int_noprefix(table_data, ARCH_TIMER_S_EL1_IRQ, 4);
  460. /* Secure EL1 timer Flags */
  461. build_append_int_noprefix(table_data, irqflags, 4);
  462. /* Non-Secure EL1 timer GSIV */
  463. build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL1_IRQ, 4);
  464. /* Non-Secure EL1 timer Flags */
  465. build_append_int_noprefix(table_data, irqflags |
  466. 1UL << 2, /* Always-on Capability */
  467. 4);
  468. /* Virtual timer GSIV */
  469. build_append_int_noprefix(table_data, ARCH_TIMER_VIRT_IRQ, 4);
  470. /* Virtual Timer Flags */
  471. build_append_int_noprefix(table_data, irqflags, 4);
  472. /* Non-Secure EL2 timer GSIV */
  473. build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_IRQ, 4);
  474. /* Non-Secure EL2 timer Flags */
  475. build_append_int_noprefix(table_data, irqflags, 4);
  476. /* CntReadBase Physical address */
  477. build_append_int_noprefix(table_data, 0xFFFFFFFFFFFFFFFF, 8);
  478. /* Platform Timer Count */
  479. build_append_int_noprefix(table_data, 0, 4);
  480. /* Platform Timer Offset */
  481. build_append_int_noprefix(table_data, 0, 4);
  482. if (vms->ns_el2_virt_timer_irq) {
  483. /* Virtual EL2 Timer GSIV */
  484. build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_VIRT_IRQ, 4);
  485. /* Virtual EL2 Timer Flags */
  486. build_append_int_noprefix(table_data, irqflags, 4);
  487. } else {
  488. build_append_int_noprefix(table_data, 0, 4);
  489. build_append_int_noprefix(table_data, 0, 4);
  490. }
  491. acpi_table_end(linker, &table);
  492. }
  493. /* Debug Port Table 2 (DBG2) */
  494. static void
  495. build_dbg2(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  496. {
  497. AcpiTable table = { .sig = "DBG2", .rev = 0, .oem_id = vms->oem_id,
  498. .oem_table_id = vms->oem_table_id };
  499. int dbg2devicelength;
  500. const char name[] = "COM0";
  501. const int namespace_length = sizeof(name);
  502. acpi_table_begin(&table, table_data);
  503. dbg2devicelength = 22 + /* BaseAddressRegister[] offset */
  504. 12 + /* BaseAddressRegister[] */
  505. 4 + /* AddressSize[] */
  506. namespace_length /* NamespaceString[] */;
  507. /* OffsetDbgDeviceInfo */
  508. build_append_int_noprefix(table_data, 44, 4);
  509. /* NumberDbgDeviceInfo */
  510. build_append_int_noprefix(table_data, 1, 4);
  511. /* Table 2. Debug Device Information structure format */
  512. build_append_int_noprefix(table_data, 0, 1); /* Revision */
  513. build_append_int_noprefix(table_data, dbg2devicelength, 2); /* Length */
  514. /* NumberofGenericAddressRegisters */
  515. build_append_int_noprefix(table_data, 1, 1);
  516. /* NameSpaceStringLength */
  517. build_append_int_noprefix(table_data, namespace_length, 2);
  518. build_append_int_noprefix(table_data, 38, 2); /* NameSpaceStringOffset */
  519. build_append_int_noprefix(table_data, 0, 2); /* OemDataLength */
  520. /* OemDataOffset (0 means no OEM data) */
  521. build_append_int_noprefix(table_data, 0, 2);
  522. /* Port Type */
  523. build_append_int_noprefix(table_data, 0x8000 /* Serial */, 2);
  524. /* Port Subtype */
  525. build_append_int_noprefix(table_data, 0x3 /* ARM PL011 UART */, 2);
  526. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  527. /* BaseAddressRegisterOffset */
  528. build_append_int_noprefix(table_data, 22, 2);
  529. /* AddressSizeOffset */
  530. build_append_int_noprefix(table_data, 34, 2);
  531. /* BaseAddressRegister[] */
  532. build_append_gas(table_data, AML_AS_SYSTEM_MEMORY, 32, 0, 3,
  533. vms->memmap[VIRT_UART0].base);
  534. /* AddressSize[] */
  535. build_append_int_noprefix(table_data,
  536. vms->memmap[VIRT_UART0].size, 4);
  537. /* NamespaceString[] */
  538. g_array_append_vals(table_data, name, namespace_length);
  539. acpi_table_end(linker, &table);
  540. };
  541. /*
  542. * ACPI spec, Revision 6.0 Errata A
  543. * 5.2.12 Multiple APIC Description Table (MADT)
  544. */
  545. static void build_append_gicr(GArray *table_data, uint64_t base, uint32_t size)
  546. {
  547. build_append_int_noprefix(table_data, 0xE, 1); /* Type */
  548. build_append_int_noprefix(table_data, 16, 1); /* Length */
  549. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  550. /* Discovery Range Base Address */
  551. build_append_int_noprefix(table_data, base, 8);
  552. build_append_int_noprefix(table_data, size, 4); /* Discovery Range Length */
  553. }
  554. static void
  555. build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  556. {
  557. int i;
  558. VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
  559. const MemMapEntry *memmap = vms->memmap;
  560. AcpiTable table = { .sig = "APIC", .rev = 4, .oem_id = vms->oem_id,
  561. .oem_table_id = vms->oem_table_id };
  562. acpi_table_begin(&table, table_data);
  563. /* Local Interrupt Controller Address */
  564. build_append_int_noprefix(table_data, 0, 4);
  565. build_append_int_noprefix(table_data, 0, 4); /* Flags */
  566. /* 5.2.12.15 GIC Distributor Structure */
  567. build_append_int_noprefix(table_data, 0xC, 1); /* Type */
  568. build_append_int_noprefix(table_data, 24, 1); /* Length */
  569. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  570. build_append_int_noprefix(table_data, 0, 4); /* GIC ID */
  571. /* Physical Base Address */
  572. build_append_int_noprefix(table_data, memmap[VIRT_GIC_DIST].base, 8);
  573. build_append_int_noprefix(table_data, 0, 4); /* System Vector Base */
  574. /* GIC version */
  575. build_append_int_noprefix(table_data, vms->gic_version, 1);
  576. build_append_int_noprefix(table_data, 0, 3); /* Reserved */
  577. for (i = 0; i < MACHINE(vms)->smp.cpus; i++) {
  578. ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));
  579. uint64_t physical_base_address = 0, gich = 0, gicv = 0;
  580. uint32_t vgic_interrupt = vms->virt ? ARCH_GIC_MAINT_IRQ : 0;
  581. uint32_t pmu_interrupt = arm_feature(&armcpu->env, ARM_FEATURE_PMU) ?
  582. VIRTUAL_PMU_IRQ : 0;
  583. if (vms->gic_version == VIRT_GIC_VERSION_2) {
  584. physical_base_address = memmap[VIRT_GIC_CPU].base;
  585. gicv = memmap[VIRT_GIC_VCPU].base;
  586. gich = memmap[VIRT_GIC_HYP].base;
  587. }
  588. /* 5.2.12.14 GIC Structure */
  589. build_append_int_noprefix(table_data, 0xB, 1); /* Type */
  590. build_append_int_noprefix(table_data, 80, 1); /* Length */
  591. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  592. build_append_int_noprefix(table_data, i, 4); /* GIC ID */
  593. build_append_int_noprefix(table_data, i, 4); /* ACPI Processor UID */
  594. /* Flags */
  595. build_append_int_noprefix(table_data, 1, 4); /* Enabled */
  596. /* Parking Protocol Version */
  597. build_append_int_noprefix(table_data, 0, 4);
  598. /* Performance Interrupt GSIV */
  599. build_append_int_noprefix(table_data, pmu_interrupt, 4);
  600. build_append_int_noprefix(table_data, 0, 8); /* Parked Address */
  601. /* Physical Base Address */
  602. build_append_int_noprefix(table_data, physical_base_address, 8);
  603. build_append_int_noprefix(table_data, gicv, 8); /* GICV */
  604. build_append_int_noprefix(table_data, gich, 8); /* GICH */
  605. /* VGIC Maintenance interrupt */
  606. build_append_int_noprefix(table_data, vgic_interrupt, 4);
  607. build_append_int_noprefix(table_data, 0, 8); /* GICR Base Address*/
  608. /* MPIDR */
  609. build_append_int_noprefix(table_data, arm_cpu_mp_affinity(armcpu), 8);
  610. /* Processor Power Efficiency Class */
  611. build_append_int_noprefix(table_data, 0, 1);
  612. /* Reserved */
  613. build_append_int_noprefix(table_data, 0, 3);
  614. }
  615. if (vms->gic_version != VIRT_GIC_VERSION_2) {
  616. build_append_gicr(table_data, memmap[VIRT_GIC_REDIST].base,
  617. memmap[VIRT_GIC_REDIST].size);
  618. if (virt_gicv3_redist_region_count(vms) == 2) {
  619. build_append_gicr(table_data, memmap[VIRT_HIGH_GIC_REDIST2].base,
  620. memmap[VIRT_HIGH_GIC_REDIST2].size);
  621. }
  622. if (its_class_name() && !vmc->no_its) {
  623. /*
  624. * ACPI spec, Revision 6.0 Errata A
  625. * (original 6.0 definition has invalid Length)
  626. * 5.2.12.18 GIC ITS Structure
  627. */
  628. build_append_int_noprefix(table_data, 0xF, 1); /* Type */
  629. build_append_int_noprefix(table_data, 20, 1); /* Length */
  630. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  631. build_append_int_noprefix(table_data, 0, 4); /* GIC ITS ID */
  632. /* Physical Base Address */
  633. build_append_int_noprefix(table_data, memmap[VIRT_GIC_ITS].base, 8);
  634. build_append_int_noprefix(table_data, 0, 4); /* Reserved */
  635. }
  636. } else {
  637. const uint16_t spi_base = vms->irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE;
  638. /* 5.2.12.16 GIC MSI Frame Structure */
  639. build_append_int_noprefix(table_data, 0xD, 1); /* Type */
  640. build_append_int_noprefix(table_data, 24, 1); /* Length */
  641. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  642. build_append_int_noprefix(table_data, 0, 4); /* GIC MSI Frame ID */
  643. /* Physical Base Address */
  644. build_append_int_noprefix(table_data, memmap[VIRT_GIC_V2M].base, 8);
  645. build_append_int_noprefix(table_data, 1, 4); /* Flags */
  646. /* SPI Count */
  647. build_append_int_noprefix(table_data, NUM_GICV2M_SPIS, 2);
  648. build_append_int_noprefix(table_data, spi_base, 2); /* SPI Base */
  649. }
  650. acpi_table_end(linker, &table);
  651. }
  652. /* FADT */
  653. static void build_fadt_rev6(GArray *table_data, BIOSLinker *linker,
  654. VirtMachineState *vms, unsigned dsdt_tbl_offset)
  655. {
  656. /* ACPI v6.3 */
  657. AcpiFadtData fadt = {
  658. .rev = 6,
  659. .minor_ver = 3,
  660. .flags = 1 << ACPI_FADT_F_HW_REDUCED_ACPI,
  661. .xdsdt_tbl_offset = &dsdt_tbl_offset,
  662. };
  663. switch (vms->psci_conduit) {
  664. case QEMU_PSCI_CONDUIT_DISABLED:
  665. fadt.arm_boot_arch = 0;
  666. break;
  667. case QEMU_PSCI_CONDUIT_HVC:
  668. fadt.arm_boot_arch = ACPI_FADT_ARM_PSCI_COMPLIANT |
  669. ACPI_FADT_ARM_PSCI_USE_HVC;
  670. break;
  671. case QEMU_PSCI_CONDUIT_SMC:
  672. fadt.arm_boot_arch = ACPI_FADT_ARM_PSCI_COMPLIANT;
  673. break;
  674. default:
  675. g_assert_not_reached();
  676. }
  677. build_fadt(table_data, linker, &fadt, vms->oem_id, vms->oem_table_id);
  678. }
  679. /* DSDT */
  680. static void
  681. build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
  682. {
  683. VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
  684. Aml *scope, *dsdt;
  685. MachineState *ms = MACHINE(vms);
  686. const MemMapEntry *memmap = vms->memmap;
  687. const int *irqmap = vms->irqmap;
  688. AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = vms->oem_id,
  689. .oem_table_id = vms->oem_table_id };
  690. acpi_table_begin(&table, table_data);
  691. dsdt = init_aml_allocator();
  692. /* When booting the VM with UEFI, UEFI takes ownership of the RTC hardware.
  693. * While UEFI can use libfdt to disable the RTC device node in the DTB that
  694. * it passes to the OS, it cannot modify AML. Therefore, we won't generate
  695. * the RTC ACPI device at all when using UEFI.
  696. */
  697. scope = aml_scope("\\_SB");
  698. acpi_dsdt_add_cpus(scope, vms);
  699. acpi_dsdt_add_uart(scope, &memmap[VIRT_UART0],
  700. (irqmap[VIRT_UART0] + ARM_SPI_BASE), 0);
  701. if (vms->second_ns_uart_present) {
  702. acpi_dsdt_add_uart(scope, &memmap[VIRT_UART1],
  703. (irqmap[VIRT_UART1] + ARM_SPI_BASE), 1);
  704. }
  705. if (vmc->acpi_expose_flash) {
  706. acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
  707. }
  708. fw_cfg_acpi_dsdt_add(scope, &memmap[VIRT_FW_CFG]);
  709. virtio_acpi_dsdt_add(scope, memmap[VIRT_MMIO].base, memmap[VIRT_MMIO].size,
  710. (irqmap[VIRT_MMIO] + ARM_SPI_BASE),
  711. 0, NUM_VIRTIO_TRANSPORTS);
  712. acpi_dsdt_add_pci(scope, memmap, irqmap[VIRT_PCIE] + ARM_SPI_BASE, vms);
  713. if (vms->acpi_dev) {
  714. build_ged_aml(scope, "\\_SB."GED_DEVICE,
  715. HOTPLUG_HANDLER(vms->acpi_dev),
  716. irqmap[VIRT_ACPI_GED] + ARM_SPI_BASE, AML_SYSTEM_MEMORY,
  717. memmap[VIRT_ACPI_GED].base);
  718. } else {
  719. acpi_dsdt_add_gpio(scope, &memmap[VIRT_GPIO],
  720. (irqmap[VIRT_GPIO] + ARM_SPI_BASE));
  721. }
  722. if (vms->acpi_dev) {
  723. uint32_t event = object_property_get_uint(OBJECT(vms->acpi_dev),
  724. "ged-event", &error_abort);
  725. if (event & ACPI_GED_MEM_HOTPLUG_EVT) {
  726. build_memory_hotplug_aml(scope, ms->ram_slots, "\\_SB", NULL,
  727. AML_SYSTEM_MEMORY,
  728. memmap[VIRT_PCDIMM_ACPI].base);
  729. }
  730. }
  731. acpi_dsdt_add_power_button(scope);
  732. #ifdef CONFIG_TPM
  733. call_dev_aml_func(DEVICE(tpm_find()), scope);
  734. #endif
  735. aml_append(dsdt, scope);
  736. /* copy AML table into ACPI tables blob */
  737. g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
  738. acpi_table_end(linker, &table);
  739. free_aml_allocator();
  740. }
  741. typedef
  742. struct AcpiBuildState {
  743. /* Copy of table in RAM (for patching). */
  744. MemoryRegion *table_mr;
  745. MemoryRegion *rsdp_mr;
  746. MemoryRegion *linker_mr;
  747. /* Is table patched? */
  748. bool patched;
  749. } AcpiBuildState;
  750. static void acpi_align_size(GArray *blob, unsigned align)
  751. {
  752. /*
  753. * Align size to multiple of given size. This reduces the chance
  754. * we need to change size in the future (breaking cross version migration).
  755. */
  756. g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align));
  757. }
  758. static
  759. void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
  760. {
  761. VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
  762. GArray *table_offsets;
  763. unsigned dsdt, xsdt;
  764. GArray *tables_blob = tables->table_data;
  765. MachineState *ms = MACHINE(vms);
  766. table_offsets = g_array_new(false, true /* clear */,
  767. sizeof(uint32_t));
  768. bios_linker_loader_alloc(tables->linker,
  769. ACPI_BUILD_TABLE_FILE, tables_blob,
  770. 64, false /* high memory */);
  771. /* DSDT is pointed to by FADT */
  772. dsdt = tables_blob->len;
  773. build_dsdt(tables_blob, tables->linker, vms);
  774. /* FADT MADT PPTT GTDT MCFG SPCR DBG2 pointed to by RSDT */
  775. acpi_add_table(table_offsets, tables_blob);
  776. build_fadt_rev6(tables_blob, tables->linker, vms, dsdt);
  777. acpi_add_table(table_offsets, tables_blob);
  778. build_madt(tables_blob, tables->linker, vms);
  779. if (!vmc->no_cpu_topology) {
  780. acpi_add_table(table_offsets, tables_blob);
  781. build_pptt(tables_blob, tables->linker, ms,
  782. vms->oem_id, vms->oem_table_id);
  783. }
  784. acpi_add_table(table_offsets, tables_blob);
  785. build_gtdt(tables_blob, tables->linker, vms);
  786. acpi_add_table(table_offsets, tables_blob);
  787. {
  788. AcpiMcfgInfo mcfg = {
  789. .base = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].base,
  790. .size = vms->memmap[VIRT_ECAM_ID(vms->highmem_ecam)].size,
  791. };
  792. build_mcfg(tables_blob, tables->linker, &mcfg, vms->oem_id,
  793. vms->oem_table_id);
  794. }
  795. acpi_add_table(table_offsets, tables_blob);
  796. spcr_setup(tables_blob, tables->linker, vms);
  797. acpi_add_table(table_offsets, tables_blob);
  798. build_dbg2(tables_blob, tables->linker, vms);
  799. if (vms->ras) {
  800. acpi_add_table(table_offsets, tables_blob);
  801. acpi_build_hest(tables_blob, tables->hardware_errors, tables->linker,
  802. vms->oem_id, vms->oem_table_id);
  803. }
  804. if (ms->numa_state->num_nodes > 0) {
  805. acpi_add_table(table_offsets, tables_blob);
  806. build_srat(tables_blob, tables->linker, vms);
  807. if (ms->numa_state->have_numa_distance) {
  808. acpi_add_table(table_offsets, tables_blob);
  809. build_slit(tables_blob, tables->linker, ms, vms->oem_id,
  810. vms->oem_table_id);
  811. }
  812. if (ms->numa_state->hmat_enabled) {
  813. acpi_add_table(table_offsets, tables_blob);
  814. build_hmat(tables_blob, tables->linker, ms->numa_state,
  815. vms->oem_id, vms->oem_table_id);
  816. }
  817. }
  818. if (ms->nvdimms_state->is_enabled) {
  819. nvdimm_build_acpi(table_offsets, tables_blob, tables->linker,
  820. ms->nvdimms_state, ms->ram_slots, vms->oem_id,
  821. vms->oem_table_id);
  822. }
  823. if (its_class_name() && !vmc->no_its) {
  824. acpi_add_table(table_offsets, tables_blob);
  825. build_iort(tables_blob, tables->linker, vms);
  826. }
  827. #ifdef CONFIG_TPM
  828. if (tpm_get_version(tpm_find()) == TPM_VERSION_2_0) {
  829. acpi_add_table(table_offsets, tables_blob);
  830. build_tpm2(tables_blob, tables->linker, tables->tcpalog, vms->oem_id,
  831. vms->oem_table_id);
  832. }
  833. #endif
  834. if (vms->iommu == VIRT_IOMMU_VIRTIO) {
  835. acpi_add_table(table_offsets, tables_blob);
  836. build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf,
  837. vms->oem_id, vms->oem_table_id);
  838. }
  839. /* XSDT is pointed to by RSDP */
  840. xsdt = tables_blob->len;
  841. build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id,
  842. vms->oem_table_id);
  843. /* RSDP is in FSEG memory, so allocate it separately */
  844. {
  845. AcpiRsdpData rsdp_data = {
  846. .revision = 2,
  847. .oem_id = vms->oem_id,
  848. .xsdt_tbl_offset = &xsdt,
  849. .rsdt_tbl_offset = NULL,
  850. };
  851. build_rsdp(tables->rsdp, tables->linker, &rsdp_data);
  852. }
  853. /*
  854. * The align size is 128, warn if 64k is not enough therefore
  855. * the align size could be resized.
  856. */
  857. if (tables_blob->len > ACPI_BUILD_TABLE_SIZE / 2) {
  858. warn_report("ACPI table size %u exceeds %d bytes,"
  859. " migration may not work",
  860. tables_blob->len, ACPI_BUILD_TABLE_SIZE / 2);
  861. error_printf("Try removing CPUs, NUMA nodes, memory slots"
  862. " or PCI bridges.\n");
  863. }
  864. acpi_align_size(tables_blob, ACPI_BUILD_TABLE_SIZE);
  865. /* Cleanup memory that's no longer used. */
  866. g_array_free(table_offsets, true);
  867. }
  868. static void acpi_ram_update(MemoryRegion *mr, GArray *data)
  869. {
  870. uint32_t size = acpi_data_len(data);
  871. /* Make sure RAM size is correct - in case it got changed
  872. * e.g. by migration */
  873. memory_region_ram_resize(mr, size, &error_abort);
  874. memcpy(memory_region_get_ram_ptr(mr), data->data, size);
  875. memory_region_set_dirty(mr, 0, size);
  876. }
  877. static void virt_acpi_build_update(void *build_opaque)
  878. {
  879. AcpiBuildState *build_state = build_opaque;
  880. AcpiBuildTables tables;
  881. /* No state to update or already patched? Nothing to do. */
  882. if (!build_state || build_state->patched) {
  883. return;
  884. }
  885. build_state->patched = true;
  886. acpi_build_tables_init(&tables);
  887. virt_acpi_build(VIRT_MACHINE(qdev_get_machine()), &tables);
  888. acpi_ram_update(build_state->table_mr, tables.table_data);
  889. acpi_ram_update(build_state->rsdp_mr, tables.rsdp);
  890. acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob);
  891. acpi_build_tables_cleanup(&tables, true);
  892. }
  893. static void virt_acpi_build_reset(void *build_opaque)
  894. {
  895. AcpiBuildState *build_state = build_opaque;
  896. build_state->patched = false;
  897. }
  898. static const VMStateDescription vmstate_virt_acpi_build = {
  899. .name = "virt_acpi_build",
  900. .version_id = 1,
  901. .minimum_version_id = 1,
  902. .fields = (const VMStateField[]) {
  903. VMSTATE_BOOL(patched, AcpiBuildState),
  904. VMSTATE_END_OF_LIST()
  905. },
  906. };
  907. void virt_acpi_setup(VirtMachineState *vms)
  908. {
  909. AcpiBuildTables tables;
  910. AcpiBuildState *build_state;
  911. AcpiGedState *acpi_ged_state;
  912. if (!vms->fw_cfg) {
  913. trace_virt_acpi_setup();
  914. return;
  915. }
  916. if (!virt_is_acpi_enabled(vms)) {
  917. trace_virt_acpi_setup();
  918. return;
  919. }
  920. build_state = g_malloc0(sizeof *build_state);
  921. acpi_build_tables_init(&tables);
  922. virt_acpi_build(vms, &tables);
  923. /* Now expose it all to Guest */
  924. build_state->table_mr = acpi_add_rom_blob(virt_acpi_build_update,
  925. build_state, tables.table_data,
  926. ACPI_BUILD_TABLE_FILE);
  927. assert(build_state->table_mr != NULL);
  928. build_state->linker_mr = acpi_add_rom_blob(virt_acpi_build_update,
  929. build_state,
  930. tables.linker->cmd_blob,
  931. ACPI_BUILD_LOADER_FILE);
  932. fw_cfg_add_file(vms->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data,
  933. acpi_data_len(tables.tcpalog));
  934. if (vms->ras) {
  935. assert(vms->acpi_dev);
  936. acpi_ged_state = ACPI_GED(vms->acpi_dev);
  937. acpi_ghes_add_fw_cfg(&acpi_ged_state->ghes_state,
  938. vms->fw_cfg, tables.hardware_errors);
  939. }
  940. build_state->rsdp_mr = acpi_add_rom_blob(virt_acpi_build_update,
  941. build_state, tables.rsdp,
  942. ACPI_BUILD_RSDP_FILE);
  943. qemu_register_reset(virt_acpi_build_reset, build_state);
  944. virt_acpi_build_reset(build_state);
  945. vmstate_register(NULL, 0, &vmstate_virt_acpi_build, build_state);
  946. /* Cleanup tables but don't free the memory: we track it
  947. * in build_state.
  948. */
  949. acpi_build_tables_cleanup(&tables, false);
  950. }