virt-acpi-build.c 42 KB

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