Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 1 | /* |
| 2 | * Q35 chipset based pc system emulator |
| 3 | * |
| 4 | * Copyright (c) 2003-2004 Fabrice Bellard |
| 5 | * Copyright (c) 2009, 2010 |
| 6 | * Isaku Yamahata <yamahata at valinux co jp> |
| 7 | * VA Linux Systems Japan K.K. |
| 8 | * Copyright (C) 2012 Jason Baron <jbaron@redhat.com> |
| 9 | * |
| 10 | * This is based on pc.c, but heavily modified. |
| 11 | * |
| 12 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 13 | * of this software and associated documentation files (the "Software"), to deal |
| 14 | * in the Software without restriction, including without limitation the rights |
| 15 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 16 | * copies of the Software, and to permit persons to whom the Software is |
| 17 | * furnished to do so, subject to the following conditions: |
| 18 | * |
| 19 | * The above copyright notice and this permission notice shall be included in |
| 20 | * all copies or substantial portions of the Software. |
| 21 | * |
| 22 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 23 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 24 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 25 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 26 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 27 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 28 | * THE SOFTWARE. |
| 29 | */ |
Markus Armbruster | e688df6 | 2018-02-01 12:18:31 +0100 | [diff] [blame] | 30 | |
Peter Maydell | b6a0aa0 | 2016-01-26 18:17:03 +0000 | [diff] [blame] | 31 | #include "qemu/osdep.h" |
Paolo Bonzini | d471bf3 | 2018-06-29 16:22:13 +0200 | [diff] [blame] | 32 | #include "qemu/units.h" |
Michael S. Tsirkin | 04920fc | 2013-08-19 17:26:55 +0300 | [diff] [blame] | 33 | #include "hw/loader.h" |
Corey Minyard | 93198b6 | 2018-11-13 18:31:27 -0600 | [diff] [blame] | 34 | #include "hw/i2c/smbus_eeprom.h" |
Philippe Mathieu-Daudé | bcdb906 | 2019-10-04 01:03:53 +0200 | [diff] [blame] | 35 | #include "hw/rtc/mc146818rtc.h" |
Paolo Bonzini | 9c17d61 | 2012-12-17 18:20:04 +0100 | [diff] [blame] | 36 | #include "sysemu/kvm.h" |
Paolo Bonzini | 83c9f4c | 2013-02-04 15:40:22 +0100 | [diff] [blame] | 37 | #include "hw/kvm/clock.h" |
Paolo Bonzini | 0d09e41 | 2013-02-05 17:06:20 +0100 | [diff] [blame] | 38 | #include "hw/pci-host/q35.h" |
Julia Suvorova | 3f3cbbb | 2021-07-13 02:42:02 +0200 | [diff] [blame] | 39 | #include "hw/pci/pcie_port.h" |
Markus Armbruster | a27bd6c | 2019-08-12 07:23:51 +0200 | [diff] [blame] | 40 | #include "hw/qdev-properties.h" |
Sergio Lopez | 549e984 | 2019-10-08 11:56:49 +0200 | [diff] [blame] | 41 | #include "hw/i386/x86.h" |
Rita Sinha | b094f2e | 2016-03-08 00:52:05 +0530 | [diff] [blame] | 42 | #include "hw/i386/pc.h" |
Paolo Bonzini | 0d09e41 | 2013-02-05 17:06:20 +0100 | [diff] [blame] | 43 | #include "hw/i386/ich9.h" |
Eduardo Habkost | ef18310 | 2017-11-25 13:16:10 -0200 | [diff] [blame] | 44 | #include "hw/i386/amd_iommu.h" |
| 45 | #include "hw/i386/intel_iommu.h" |
Gerd Hoffmann | 94692dc | 2018-06-13 14:29:46 +0200 | [diff] [blame] | 46 | #include "hw/display/ramfb.h" |
Philippe Mathieu-Daudé | a2eb5c0 | 2018-12-11 17:34:06 +0100 | [diff] [blame] | 47 | #include "hw/firmware/smbios.h" |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 48 | #include "hw/ide/pci.h" |
| 49 | #include "hw/ide/ahci.h" |
| 50 | #include "hw/usb.h" |
Markus Armbruster | e688df6 | 2018-02-01 12:18:31 +0100 | [diff] [blame] | 51 | #include "qapi/error.h" |
Don Slutz | c87b152 | 2014-06-19 21:40:25 -0400 | [diff] [blame] | 52 | #include "qemu/error-report.h" |
Laurent Vivier | 3bfe571 | 2017-05-02 18:29:55 +0200 | [diff] [blame] | 53 | #include "sysemu/numa.h" |
Jon Doron | cab78e7 | 2020-04-24 15:34:42 +0300 | [diff] [blame] | 54 | #include "hw/hyperv/vmbus-bridge.h" |
Philippe Mathieu-Daudé | 4b99769 | 2020-02-28 12:46:47 +0100 | [diff] [blame] | 55 | #include "hw/mem/nvdimm.h" |
Kwangwoo Lee | 5c94b82 | 2020-04-21 13:59:29 +0100 | [diff] [blame] | 56 | #include "hw/i386/acpi-build.h" |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 57 | |
| 58 | /* ICH9 AHCI has 6 ports */ |
| 59 | #define MAX_SATA_PORTS 6 |
| 60 | |
Paolo Bonzini | efce317 | 2018-12-17 17:32:38 +0100 | [diff] [blame] | 61 | struct ehci_companions { |
| 62 | const char *name; |
| 63 | int func; |
| 64 | int port; |
| 65 | }; |
| 66 | |
| 67 | static const struct ehci_companions ich9_1d[] = { |
| 68 | { .name = "ich9-usb-uhci1", .func = 0, .port = 0 }, |
| 69 | { .name = "ich9-usb-uhci2", .func = 1, .port = 2 }, |
| 70 | { .name = "ich9-usb-uhci3", .func = 2, .port = 4 }, |
| 71 | }; |
| 72 | |
| 73 | static const struct ehci_companions ich9_1a[] = { |
| 74 | { .name = "ich9-usb-uhci4", .func = 0, .port = 0 }, |
| 75 | { .name = "ich9-usb-uhci5", .func = 1, .port = 2 }, |
| 76 | { .name = "ich9-usb-uhci6", .func = 2, .port = 4 }, |
| 77 | }; |
| 78 | |
| 79 | static int ehci_create_ich9_with_companions(PCIBus *bus, int slot) |
| 80 | { |
| 81 | const struct ehci_companions *comp; |
| 82 | PCIDevice *ehci, *uhci; |
| 83 | BusState *usbbus; |
| 84 | const char *name; |
| 85 | int i; |
| 86 | |
| 87 | switch (slot) { |
| 88 | case 0x1d: |
| 89 | name = "ich9-usb-ehci1"; |
| 90 | comp = ich9_1d; |
| 91 | break; |
| 92 | case 0x1a: |
| 93 | name = "ich9-usb-ehci2"; |
| 94 | comp = ich9_1a; |
| 95 | break; |
| 96 | default: |
| 97 | return -1; |
| 98 | } |
| 99 | |
Markus Armbruster | 9307d06 | 2020-06-10 07:32:04 +0200 | [diff] [blame] | 100 | ehci = pci_new_multifunction(PCI_DEVFN(slot, 7), true, name); |
| 101 | pci_realize_and_unref(ehci, bus, &error_fatal); |
Paolo Bonzini | efce317 | 2018-12-17 17:32:38 +0100 | [diff] [blame] | 102 | usbbus = QLIST_FIRST(&ehci->qdev.child_bus); |
| 103 | |
| 104 | for (i = 0; i < 3; i++) { |
Markus Armbruster | 9307d06 | 2020-06-10 07:32:04 +0200 | [diff] [blame] | 105 | uhci = pci_new_multifunction(PCI_DEVFN(slot, comp[i].func), true, |
| 106 | comp[i].name); |
Paolo Bonzini | efce317 | 2018-12-17 17:32:38 +0100 | [diff] [blame] | 107 | qdev_prop_set_string(&uhci->qdev, "masterbus", usbbus->name); |
| 108 | qdev_prop_set_uint32(&uhci->qdev, "firstport", comp[i].port); |
Markus Armbruster | 9307d06 | 2020-06-10 07:32:04 +0200 | [diff] [blame] | 109 | pci_realize_and_unref(uhci, bus, &error_fatal); |
Paolo Bonzini | efce317 | 2018-12-17 17:32:38 +0100 | [diff] [blame] | 110 | } |
| 111 | return 0; |
| 112 | } |
| 113 | |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 114 | /* PC hardware initialisation */ |
Marcel Apfelbaum | 3ef9622 | 2014-05-07 17:42:57 +0300 | [diff] [blame] | 115 | static void pc_q35_init(MachineState *machine) |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 116 | { |
Eduardo Habkost | ec68007 | 2015-08-07 16:55:45 -0300 | [diff] [blame] | 117 | PCMachineState *pcms = PC_MACHINE(machine); |
Eduardo Habkost | 7102fa7 | 2015-12-01 20:58:03 -0200 | [diff] [blame] | 118 | PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); |
Paolo Bonzini | f0bb276 | 2019-10-22 09:39:50 +0200 | [diff] [blame] | 119 | X86MachineState *x86ms = X86_MACHINE(machine); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 120 | Q35PCIHost *q35_host; |
Hu Tao | ce88812 | 2013-07-01 18:18:22 +0800 | [diff] [blame] | 121 | PCIHostState *phb; |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 122 | PCIBus *host_bus; |
| 123 | PCIDevice *lpc; |
Efimov Vasily | f999c0d | 2016-06-22 15:24:54 +0300 | [diff] [blame] | 124 | DeviceState *lpc_dev; |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 125 | BusState *idebus[MAX_SATA_PORTS]; |
| 126 | ISADevice *rtc_state; |
Xiao Guangrong | 5fe7938 | 2016-03-05 00:00:32 +0800 | [diff] [blame] | 127 | MemoryRegion *system_io = get_system_io(); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 128 | MemoryRegion *pci_memory; |
| 129 | MemoryRegion *rom_memory; |
| 130 | MemoryRegion *ram_memory; |
| 131 | GSIState *gsi_state; |
| 132 | ISABus *isa_bus; |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 133 | int i; |
| 134 | ICH9LPCState *ich9_lpc; |
| 135 | PCIDevice *ahci; |
Don Slutz | c87b152 | 2014-06-19 21:40:25 -0400 | [diff] [blame] | 136 | ram_addr_t lowmem; |
John Snow | d93162e | 2014-10-01 14:19:29 -0400 | [diff] [blame] | 137 | DriveInfo *hd[MAX_SATA_PORTS]; |
Laszlo Ersek | 6cd2234 | 2015-05-28 22:04:10 +0200 | [diff] [blame] | 138 | MachineClass *mc = MACHINE_GET_CLASS(machine); |
Julia Suvorova | 3f3cbbb | 2021-07-13 02:42:02 +0200 | [diff] [blame] | 139 | bool acpi_pcihp; |
Julia Suvorova | c318bef | 2021-11-12 06:08:54 -0500 | [diff] [blame] | 140 | bool keep_pci_slot_hpc; |
Igor Mammedov | f0513d2 | 2013-04-29 17:02:50 +0200 | [diff] [blame] | 141 | |
Michael S. Tsirkin | 4e17997 | 2013-12-16 13:55:06 +0200 | [diff] [blame] | 142 | /* Check whether RAM fits below 4G (leaving 1/2 GByte for IO memory |
| 143 | * and 256 Mbytes for PCI Express Enhanced Configuration Access Mapping |
| 144 | * also known as MMCFG). |
| 145 | * If it doesn't, we need to split it in chunks below and above 4G. |
| 146 | * In any case, try to make sure that guest addresses aligned at |
| 147 | * 1G boundaries get mapped to host addresses aligned at 1G boundaries. |
Michael S. Tsirkin | 4e17997 | 2013-12-16 13:55:06 +0200 | [diff] [blame] | 148 | */ |
Marcel Apfelbaum | 3ef9622 | 2014-05-07 17:42:57 +0300 | [diff] [blame] | 149 | if (machine->ram_size >= 0xb0000000) { |
Eduardo Habkost | 533e8bb | 2016-01-23 14:02:13 -0200 | [diff] [blame] | 150 | lowmem = 0x80000000; |
Don Slutz | c87b152 | 2014-06-19 21:40:25 -0400 | [diff] [blame] | 151 | } else { |
| 152 | lowmem = 0xb0000000; |
| 153 | } |
| 154 | |
Stefan Weil | a9dd38d | 2014-07-07 21:00:41 +0200 | [diff] [blame] | 155 | /* Handle the machine opt max-ram-below-4g. It is basically doing |
Don Slutz | c87b152 | 2014-06-19 21:40:25 -0400 | [diff] [blame] | 156 | * min(qemu limit, user limit). |
| 157 | */ |
Gerd Hoffmann | 9a45729 | 2020-05-29 09:39:56 +0200 | [diff] [blame] | 158 | if (!pcms->max_ram_below_4g) { |
| 159 | pcms->max_ram_below_4g = 4 * GiB; |
Gerd Hoffmann | 5ec7d09 | 2016-06-24 13:35:17 +0200 | [diff] [blame] | 160 | } |
Gerd Hoffmann | 9a45729 | 2020-05-29 09:39:56 +0200 | [diff] [blame] | 161 | if (lowmem > pcms->max_ram_below_4g) { |
| 162 | lowmem = pcms->max_ram_below_4g; |
Don Slutz | c87b152 | 2014-06-19 21:40:25 -0400 | [diff] [blame] | 163 | if (machine->ram_size - lowmem > lowmem && |
Paolo Bonzini | d471bf3 | 2018-06-29 16:22:13 +0200 | [diff] [blame] | 164 | lowmem & (1 * GiB - 1)) { |
Alistair Francis | 9e5d2c5 | 2017-09-11 12:52:43 -0700 | [diff] [blame] | 165 | warn_report("There is possibly poor performance as the ram size " |
| 166 | " (0x%" PRIx64 ") is more then twice the size of" |
| 167 | " max-ram-below-4g (%"PRIu64") and" |
| 168 | " max-ram-below-4g is not a multiple of 1G.", |
Gerd Hoffmann | 9a45729 | 2020-05-29 09:39:56 +0200 | [diff] [blame] | 169 | (uint64_t)machine->ram_size, pcms->max_ram_below_4g); |
Don Slutz | c87b152 | 2014-06-19 21:40:25 -0400 | [diff] [blame] | 170 | } |
| 171 | } |
| 172 | |
| 173 | if (machine->ram_size >= lowmem) { |
Paolo Bonzini | f0bb276 | 2019-10-22 09:39:50 +0200 | [diff] [blame] | 174 | x86ms->above_4g_mem_size = machine->ram_size - lowmem; |
| 175 | x86ms->below_4g_mem_size = lowmem; |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 176 | } else { |
Paolo Bonzini | f0bb276 | 2019-10-22 09:39:50 +0200 | [diff] [blame] | 177 | x86ms->above_4g_mem_size = 0; |
| 178 | x86ms->below_4g_mem_size = machine->ram_size; |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 179 | } |
| 180 | |
Sean Christopherson | 97488c6 | 2021-07-19 19:21:23 +0800 | [diff] [blame] | 181 | pc_machine_init_sgx_epc(pcms); |
Sergio Lopez | 703a548 | 2019-09-30 17:26:29 +0200 | [diff] [blame] | 182 | x86_cpus_init(x86ms, pcmc->default_cpu_version); |
Don Slutz | 3c2a966 | 2014-06-19 21:40:24 -0400 | [diff] [blame] | 183 | |
Vitaly Kuznetsov | 8700a98 | 2020-09-22 17:19:34 +0200 | [diff] [blame] | 184 | kvmclock_create(pcmc->kvmclock_create_always); |
Don Slutz | 3c2a966 | 2014-06-19 21:40:24 -0400 | [diff] [blame] | 185 | |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 186 | /* pci enabled */ |
Eduardo Habkost | 7102fa7 | 2015-12-01 20:58:03 -0200 | [diff] [blame] | 187 | if (pcmc->pci_enabled) { |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 188 | pci_memory = g_new(MemoryRegion, 1); |
Paolo Bonzini | 286690e | 2013-11-06 20:18:08 +0200 | [diff] [blame] | 189 | memory_region_init(pci_memory, NULL, "pci", UINT64_MAX); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 190 | rom_memory = pci_memory; |
| 191 | } else { |
| 192 | pci_memory = NULL; |
| 193 | rom_memory = get_system_memory(); |
| 194 | } |
| 195 | |
Eduardo Habkost | 5db3f0d | 2015-12-11 16:42:30 -0200 | [diff] [blame] | 196 | pc_guest_info_init(pcms); |
Paolo Bonzini | 07fb617 | 2014-07-28 17:34:15 +0200 | [diff] [blame] | 197 | |
Eduardo Habkost | 7102fa7 | 2015-12-01 20:58:03 -0200 | [diff] [blame] | 198 | if (pcmc->smbios_defaults) { |
Markus Armbruster | b29ad07 | 2013-10-30 13:56:40 +0100 | [diff] [blame] | 199 | /* These values are guest ABI, do not change */ |
Gabriel L. Somlo | e6667f7 | 2014-04-23 09:42:38 -0400 | [diff] [blame] | 200 | smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)", |
Eduardo Habkost | 7102fa7 | 2015-12-01 20:58:03 -0200 | [diff] [blame] | 201 | mc->name, pcmc->smbios_legacy_mode, |
| 202 | pcmc->smbios_uuid_encoded, |
Eduardo Habkost | 0e4edb3 | 2021-10-26 11:11:00 -0400 | [diff] [blame] | 203 | pcms->smbios_entry_point_type); |
Markus Armbruster | b29ad07 | 2013-10-30 13:56:40 +0100 | [diff] [blame] | 204 | } |
| 205 | |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 206 | /* allocate ram and load rom/bios */ |
Philippe Mathieu-Daudé | b2a3b8d | 2020-07-22 10:25:17 +0200 | [diff] [blame] | 207 | pc_memory_init(pcms, get_system_memory(), rom_memory, &ram_memory); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 208 | |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 209 | /* create pci host bus */ |
Markus Armbruster | 3e80f69 | 2020-06-10 07:31:58 +0200 | [diff] [blame] | 210 | q35_host = Q35_HOST_DEVICE(qdev_new(TYPE_Q35_HOST_DEVICE)); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 211 | |
Markus Armbruster | d262312 | 2020-05-05 17:29:22 +0200 | [diff] [blame] | 212 | object_property_add_child(qdev_get_machine(), "q35", OBJECT(q35_host)); |
Markus Armbruster | 5325cc3 | 2020-07-07 18:05:54 +0200 | [diff] [blame] | 213 | object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_RAM_MEM, |
| 214 | OBJECT(ram_memory), NULL); |
| 215 | object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_PCI_MEM, |
| 216 | OBJECT(pci_memory), NULL); |
| 217 | object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_SYSTEM_MEM, |
| 218 | OBJECT(get_system_memory()), NULL); |
| 219 | object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_IO_MEM, |
| 220 | OBJECT(system_io), NULL); |
| 221 | object_property_set_int(OBJECT(q35_host), PCI_HOST_BELOW_4G_MEM_SIZE, |
| 222 | x86ms->below_4g_mem_size, NULL); |
| 223 | object_property_set_int(OBJECT(q35_host), PCI_HOST_ABOVE_4G_MEM_SIZE, |
| 224 | x86ms->above_4g_mem_size, NULL); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 225 | /* pci */ |
Markus Armbruster | 3c6ef47 | 2020-06-10 07:32:34 +0200 | [diff] [blame] | 226 | sysbus_realize_and_unref(SYS_BUS_DEVICE(q35_host), &error_fatal); |
Hu Tao | ce88812 | 2013-07-01 18:18:22 +0800 | [diff] [blame] | 227 | phb = PCI_HOST_BRIDGE(q35_host); |
| 228 | host_bus = phb->bus; |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 229 | /* create ISA bus */ |
| 230 | lpc = pci_create_simple_multifunction(host_bus, PCI_DEVFN(ICH9_LPC_DEV, |
| 231 | ICH9_LPC_FUNC), true, |
| 232 | TYPE_ICH9_LPC_DEVICE); |
Igor Mammedov | 781bbd6 | 2014-06-02 15:25:24 +0200 | [diff] [blame] | 233 | |
| 234 | object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP, |
| 235 | TYPE_HOTPLUG_HANDLER, |
Gerd Hoffmann | 50aef13 | 2020-09-15 14:09:02 +0200 | [diff] [blame] | 236 | (Object **)&x86ms->acpi_dev, |
Igor Mammedov | 781bbd6 | 2014-06-02 15:25:24 +0200 | [diff] [blame] | 237 | object_property_allow_set_link, |
Markus Armbruster | d262312 | 2020-05-05 17:29:22 +0200 | [diff] [blame] | 238 | OBJ_PROP_LINK_STRONG); |
Markus Armbruster | 5325cc3 | 2020-07-07 18:05:54 +0200 | [diff] [blame] | 239 | object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP, |
| 240 | OBJECT(lpc), &error_abort); |
Igor Mammedov | 781bbd6 | 2014-06-02 15:25:24 +0200 | [diff] [blame] | 241 | |
Julia Suvorova | 3f3cbbb | 2021-07-13 02:42:02 +0200 | [diff] [blame] | 242 | acpi_pcihp = object_property_get_bool(OBJECT(lpc), |
Ani Sinha | aa29466 | 2021-08-16 14:02:14 +0530 | [diff] [blame] | 243 | ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, |
Julia Suvorova | 3f3cbbb | 2021-07-13 02:42:02 +0200 | [diff] [blame] | 244 | NULL); |
| 245 | |
Julia Suvorova | c318bef | 2021-11-12 06:08:54 -0500 | [diff] [blame] | 246 | keep_pci_slot_hpc = object_property_get_bool(OBJECT(lpc), |
| 247 | "x-keep-pci-slot-hpc", |
| 248 | NULL); |
| 249 | |
| 250 | if (!keep_pci_slot_hpc && acpi_pcihp) { |
Igor Mammedov | 2aa1842 | 2021-11-12 06:08:53 -0500 | [diff] [blame] | 251 | object_register_sugar_prop(TYPE_PCIE_SLOT, "x-native-hotplug", |
Julia Suvorova | 3f3cbbb | 2021-07-13 02:42:02 +0200 | [diff] [blame] | 252 | "false", true); |
| 253 | } |
| 254 | |
Philippe Mathieu-Daudé | b00c6f1 | 2019-10-18 15:59:08 +0200 | [diff] [blame] | 255 | /* irq lines */ |
| 256 | gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled); |
| 257 | |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 258 | ich9_lpc = ICH9_LPC_DEVICE(lpc); |
Efimov Vasily | f999c0d | 2016-06-22 15:24:54 +0300 | [diff] [blame] | 259 | lpc_dev = DEVICE(lpc); |
| 260 | for (i = 0; i < GSI_NUM_PINS; i++) { |
Paolo Bonzini | f0bb276 | 2019-10-22 09:39:50 +0200 | [diff] [blame] | 261 | qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, x86ms->gsi[i]); |
Efimov Vasily | f999c0d | 2016-06-22 15:24:54 +0300 | [diff] [blame] | 262 | } |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 263 | pci_bus_irqs(host_bus, ich9_lpc_set_irq, ich9_lpc_map_irq, ich9_lpc, |
| 264 | ICH9_LPC_NB_PIRQS); |
Jason Baron | 91c3f2f | 2013-01-22 19:11:37 -0700 | [diff] [blame] | 265 | pci_bus_set_route_irq_fn(host_bus, ich9_route_intx_pin_to_irq); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 266 | isa_bus = ich9_lpc->isa_bus; |
| 267 | |
Xiaoyao Li | c300bbe | 2022-03-10 20:28:11 +0800 | [diff] [blame] | 268 | if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) { |
| 269 | pc_i8259_create(isa_bus, gsi_state->i8259_irq); |
| 270 | } |
Marc-André Lureau | 8197e24 | 2016-07-14 14:27:17 +0200 | [diff] [blame] | 271 | |
Eduardo Habkost | 7102fa7 | 2015-12-01 20:58:03 -0200 | [diff] [blame] | 272 | if (pcmc->pci_enabled) { |
John Snow | 552b48f | 2014-08-04 17:11:19 -0400 | [diff] [blame] | 273 | ioapic_init_gsi(gsi_state, "q35"); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 274 | } |
| 275 | |
Paolo Bonzini | 6f529b7 | 2019-10-16 10:18:10 +0200 | [diff] [blame] | 276 | if (tcg_enabled()) { |
| 277 | x86_register_ferr_irq(x86ms->gsi[13]); |
| 278 | } |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 279 | |
Eric Blake | 7fb1cf1 | 2015-11-18 01:52:57 -0700 | [diff] [blame] | 280 | assert(pcms->vmport != ON_OFF_AUTO__MAX); |
Eduardo Habkost | ec68007 | 2015-08-07 16:55:45 -0300 | [diff] [blame] | 281 | if (pcms->vmport == ON_OFF_AUTO_AUTO) { |
Philippe Mathieu-Daudé | b2a3b8d | 2020-07-22 10:25:17 +0200 | [diff] [blame] | 282 | pcms->vmport = ON_OFF_AUTO_ON; |
Don Slutz | d1048be | 2014-11-21 11:18:52 -0500 | [diff] [blame] | 283 | } |
| 284 | |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 285 | /* init basic PC hardware */ |
Gerd Hoffmann | 10e2483 | 2020-07-02 15:25:16 +0200 | [diff] [blame] | 286 | pc_basic_device_init(pcms, isa_bus, x86ms->gsi, &rtc_state, !mc->no_floppy, |
Chao Peng | feddd2f | 2016-11-05 03:19:50 -0400 | [diff] [blame] | 287 | 0xff0104); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 288 | |
| 289 | /* connect pm stuff to lpc */ |
Paolo Bonzini | ed9e923 | 2019-12-12 17:28:01 +0100 | [diff] [blame] | 290 | ich9_lpc_pm_init(lpc, x86_machine_is_smm_enabled(x86ms)); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 291 | |
Corey Minyard | f5878b0 | 2018-11-07 09:24:34 -0600 | [diff] [blame] | 292 | if (pcms->sata_enabled) { |
Chao Peng | 272f042 | 2016-11-05 03:19:49 -0400 | [diff] [blame] | 293 | /* ahci and SATA device, for q35 1 ahci controller is built-in */ |
| 294 | ahci = pci_create_simple_multifunction(host_bus, |
| 295 | PCI_DEVFN(ICH9_SATA1_DEV, |
| 296 | ICH9_SATA1_FUNC), |
| 297 | true, "ich9-ahci"); |
| 298 | idebus[0] = qdev_get_child_bus(&ahci->qdev, "ide.0"); |
| 299 | idebus[1] = qdev_get_child_bus(&ahci->qdev, "ide.1"); |
John Snow | bbe3179 | 2017-07-18 11:47:56 -0400 | [diff] [blame] | 300 | g_assert(MAX_SATA_PORTS == ahci_get_num_ports(ahci)); |
| 301 | ide_drive_get(hd, ahci_get_num_ports(ahci)); |
Chao Peng | 272f042 | 2016-11-05 03:19:49 -0400 | [diff] [blame] | 302 | ahci_ide_create_devs(ahci, hd); |
| 303 | } else { |
| 304 | idebus[0] = idebus[1] = NULL; |
| 305 | } |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 306 | |
Eduardo Habkost | 4bcbe0b | 2016-06-08 17:50:25 -0300 | [diff] [blame] | 307 | if (machine_usb(machine)) { |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 308 | /* Should we create 6 UHCI according to ich9 spec? */ |
| 309 | ehci_create_ich9_with_companions(host_bus, 0x1d); |
| 310 | } |
| 311 | |
Corey Minyard | f5878b0 | 2018-11-07 09:24:34 -0600 | [diff] [blame] | 312 | if (pcms->smbus_enabled) { |
Chao Peng | be232eb | 2016-11-05 03:19:48 -0400 | [diff] [blame] | 313 | /* TODO: Populate SPD eeprom data. */ |
Corey Minyard | ebe1558 | 2016-05-12 20:43:45 -0500 | [diff] [blame] | 314 | pcms->smbus = ich9_smb_init(host_bus, |
| 315 | PCI_DEVFN(ICH9_SMB_DEV, ICH9_SMB_FUNC), |
| 316 | 0xb100); |
| 317 | smbus_eeprom_init(pcms->smbus, 8, NULL, 0); |
Chao Peng | be232eb | 2016-11-05 03:19:48 -0400 | [diff] [blame] | 318 | } |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 319 | |
Eduardo Habkost | 8807685 | 2015-08-07 16:55:54 -0300 | [diff] [blame] | 320 | pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state); |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 321 | |
| 322 | /* the rest devices to which pci devfn is automatically assigned */ |
| 323 | pc_vga_init(isa_bus, host_bus); |
Paolo Bonzini | 4b9c264 | 2018-03-02 10:29:06 +0100 | [diff] [blame] | 324 | pc_nic_init(pcmc, isa_bus, host_bus); |
Xiao Guangrong | 5fe7938 | 2016-03-05 00:00:32 +0800 | [diff] [blame] | 325 | |
Eric Auger | f6a0d06 | 2019-03-08 19:20:53 +0100 | [diff] [blame] | 326 | if (machine->nvdimms_state->is_enabled) { |
| 327 | nvdimm_init_acpi_state(machine->nvdimms_state, system_io, |
Kwangwoo Lee | 5c94b82 | 2020-04-21 13:59:29 +0100 | [diff] [blame] | 328 | x86_nvdimm_acpi_dsmio, |
Paolo Bonzini | f0bb276 | 2019-10-22 09:39:50 +0200 | [diff] [blame] | 329 | x86ms->fw_cfg, OBJECT(pcms)); |
Xiao Guangrong | 5fe7938 | 2016-03-05 00:00:32 +0800 | [diff] [blame] | 330 | } |
Isaku Yamahata | df2d8b3 | 2012-11-14 15:54:06 -0500 | [diff] [blame] | 331 | } |
| 332 | |
Eduardo Habkost | 99fbeaf | 2015-05-15 14:19:01 -0300 | [diff] [blame] | 333 | #define DEFINE_Q35_MACHINE(suffix, name, compatfn, optionfn) \ |
| 334 | static void pc_init_##suffix(MachineState *machine) \ |
| 335 | { \ |
| 336 | void (*compat)(MachineState *m) = (compatfn); \ |
| 337 | if (compat) { \ |
| 338 | compat(machine); \ |
| 339 | } \ |
| 340 | pc_q35_init(machine); \ |
| 341 | } \ |
| 342 | DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn) |
Jason Wang | 5cb50e0 | 2015-04-23 14:21:35 +0800 | [diff] [blame] | 343 | |
Markus Armbruster | 9953f88 | 2013-04-12 17:25:03 +0200 | [diff] [blame] | 344 | |
Eduardo Habkost | 865906f | 2015-05-15 14:18:56 -0300 | [diff] [blame] | 345 | static void pc_q35_machine_options(MachineClass *m) |
Eduardo Habkost | fddd179 | 2015-05-15 14:18:54 -0300 | [diff] [blame] | 346 | { |
Paolo Bonzini | 4b9c264 | 2018-03-02 10:29:06 +0100 | [diff] [blame] | 347 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
| 348 | pcmc->default_nic_model = "e1000e"; |
Vitaly Cheptsov | 0a343a5 | 2021-03-01 22:59:18 +0300 | [diff] [blame] | 349 | pcmc->pci_root_uid = 0; |
Paolo Bonzini | 4b9c264 | 2018-03-02 10:29:06 +0100 | [diff] [blame] | 350 | |
Eduardo Habkost | fddd179 | 2015-05-15 14:18:54 -0300 | [diff] [blame] | 351 | m->family = "pc_q35"; |
| 352 | m->desc = "Standard PC (Q35 + ICH9, 2009)"; |
Eduardo Habkost | fddd179 | 2015-05-15 14:18:54 -0300 | [diff] [blame] | 353 | m->units_per_default_bus = 1; |
Eduardo Habkost | 0b7783a | 2015-09-11 17:14:23 -0300 | [diff] [blame] | 354 | m->default_machine_opts = "firmware=bios-256k.bin"; |
| 355 | m->default_display = "std"; |
Alex Williamson | c87759c | 2019-05-14 14:14:41 -0600 | [diff] [blame] | 356 | m->default_kernel_irqchip_split = false; |
Eduardo Habkost | 0b7783a | 2015-09-11 17:14:23 -0300 | [diff] [blame] | 357 | m->no_floppy = 1; |
Eduardo Habkost | ef18310 | 2017-11-25 13:16:10 -0200 | [diff] [blame] | 358 | machine_class_allow_dynamic_sysbus_dev(m, TYPE_AMD_IOMMU_DEVICE); |
| 359 | machine_class_allow_dynamic_sysbus_dev(m, TYPE_INTEL_IOMMU_DEVICE); |
Gerd Hoffmann | 94692dc | 2018-06-13 14:29:46 +0200 | [diff] [blame] | 360 | machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE); |
Jon Doron | cab78e7 | 2020-04-24 15:34:42 +0300 | [diff] [blame] | 361 | machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE); |
Igor Mammedov | 00d0f9f | 2016-10-19 14:05:43 +0200 | [diff] [blame] | 362 | m->max_cpus = 288; |
Eduardo Habkost | fddd179 | 2015-05-15 14:18:54 -0300 | [diff] [blame] | 363 | } |
Michael S. Tsirkin | a0dba64 | 2013-08-27 09:48:06 +0300 | [diff] [blame] | 364 | |
Cornelia Huck | 0ca7036 | 2022-03-16 15:55:21 +0100 | [diff] [blame] | 365 | static void pc_q35_7_1_machine_options(MachineClass *m) |
Eduardo Habkost | 87e896a | 2015-09-11 17:14:25 -0300 | [diff] [blame] | 366 | { |
Eduardo Habkost | 0788a56 | 2019-06-27 21:28:42 -0300 | [diff] [blame] | 367 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
Eduardo Habkost | 87e896a | 2015-09-11 17:14:25 -0300 | [diff] [blame] | 368 | pc_q35_machine_options(m); |
| 369 | m->alias = "q35"; |
Eduardo Habkost | 0788a56 | 2019-06-27 21:28:42 -0300 | [diff] [blame] | 370 | pcmc->default_cpu_version = 1; |
Marcel Apfelbaum | a6fd5b0 | 2017-09-06 17:26:57 +0300 | [diff] [blame] | 371 | } |
| 372 | |
Cornelia Huck | 0ca7036 | 2022-03-16 15:55:21 +0100 | [diff] [blame] | 373 | DEFINE_Q35_MACHINE(v7_1, "pc-q35-7.1", NULL, |
| 374 | pc_q35_7_1_machine_options); |
| 375 | |
| 376 | static void pc_q35_7_0_machine_options(MachineClass *m) |
| 377 | { |
| 378 | pc_q35_7_1_machine_options(m); |
| 379 | m->alias = NULL; |
| 380 | compat_props_add(m->compat_props, hw_compat_7_0, hw_compat_7_0_len); |
| 381 | compat_props_add(m->compat_props, pc_compat_7_0, pc_compat_7_0_len); |
| 382 | } |
| 383 | |
Cornelia Huck | 01854af | 2021-12-17 15:39:48 +0100 | [diff] [blame] | 384 | DEFINE_Q35_MACHINE(v7_0, "pc-q35-7.0", NULL, |
| 385 | pc_q35_7_0_machine_options); |
| 386 | |
| 387 | static void pc_q35_6_2_machine_options(MachineClass *m) |
| 388 | { |
| 389 | pc_q35_7_0_machine_options(m); |
| 390 | m->alias = NULL; |
| 391 | compat_props_add(m->compat_props, hw_compat_6_2, hw_compat_6_2_len); |
| 392 | compat_props_add(m->compat_props, pc_compat_6_2, pc_compat_6_2_len); |
| 393 | } |
| 394 | |
Yanan Wang | 52e64f5 | 2021-08-31 09:54:26 +0800 | [diff] [blame] | 395 | DEFINE_Q35_MACHINE(v6_2, "pc-q35-6.2", NULL, |
| 396 | pc_q35_6_2_machine_options); |
| 397 | |
| 398 | static void pc_q35_6_1_machine_options(MachineClass *m) |
| 399 | { |
| 400 | pc_q35_6_2_machine_options(m); |
| 401 | m->alias = NULL; |
| 402 | compat_props_add(m->compat_props, hw_compat_6_1, hw_compat_6_1_len); |
| 403 | compat_props_add(m->compat_props, pc_compat_6_1, pc_compat_6_1_len); |
Yanan Wang | 2b52619 | 2021-09-29 10:58:14 +0800 | [diff] [blame] | 404 | m->smp_props.prefer_sockets = true; |
Yanan Wang | 52e64f5 | 2021-08-31 09:54:26 +0800 | [diff] [blame] | 405 | } |
| 406 | |
Cornelia Huck | da7e13c | 2021-03-31 13:19:00 +0200 | [diff] [blame] | 407 | DEFINE_Q35_MACHINE(v6_1, "pc-q35-6.1", NULL, |
| 408 | pc_q35_6_1_machine_options); |
| 409 | |
| 410 | static void pc_q35_6_0_machine_options(MachineClass *m) |
| 411 | { |
| 412 | pc_q35_6_1_machine_options(m); |
| 413 | m->alias = NULL; |
| 414 | compat_props_add(m->compat_props, hw_compat_6_0, hw_compat_6_0_len); |
| 415 | compat_props_add(m->compat_props, pc_compat_6_0, pc_compat_6_0_len); |
| 416 | } |
| 417 | |
Cornelia Huck | 576a00b | 2020-11-09 18:39:28 +0100 | [diff] [blame] | 418 | DEFINE_Q35_MACHINE(v6_0, "pc-q35-6.0", NULL, |
| 419 | pc_q35_6_0_machine_options); |
| 420 | |
| 421 | static void pc_q35_5_2_machine_options(MachineClass *m) |
| 422 | { |
| 423 | pc_q35_6_0_machine_options(m); |
| 424 | m->alias = NULL; |
| 425 | compat_props_add(m->compat_props, hw_compat_5_2, hw_compat_5_2_len); |
| 426 | compat_props_add(m->compat_props, pc_compat_5_2, pc_compat_5_2_len); |
| 427 | } |
| 428 | |
Cornelia Huck | 3ff3c5d | 2020-08-19 16:40:16 +0200 | [diff] [blame] | 429 | DEFINE_Q35_MACHINE(v5_2, "pc-q35-5.2", NULL, |
| 430 | pc_q35_5_2_machine_options); |
| 431 | |
| 432 | static void pc_q35_5_1_machine_options(MachineClass *m) |
| 433 | { |
Vitaly Kuznetsov | 8700a98 | 2020-09-22 17:19:34 +0200 | [diff] [blame] | 434 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
| 435 | |
Cornelia Huck | 3ff3c5d | 2020-08-19 16:40:16 +0200 | [diff] [blame] | 436 | pc_q35_5_2_machine_options(m); |
| 437 | m->alias = NULL; |
| 438 | compat_props_add(m->compat_props, hw_compat_5_1, hw_compat_5_1_len); |
| 439 | compat_props_add(m->compat_props, pc_compat_5_1, pc_compat_5_1_len); |
Vitaly Kuznetsov | 8700a98 | 2020-09-22 17:19:34 +0200 | [diff] [blame] | 440 | pcmc->kvmclock_create_always = false; |
Vitaly Cheptsov | 0a343a5 | 2021-03-01 22:59:18 +0300 | [diff] [blame] | 441 | pcmc->pci_root_uid = 1; |
Cornelia Huck | 3ff3c5d | 2020-08-19 16:40:16 +0200 | [diff] [blame] | 442 | } |
| 443 | |
Cornelia Huck | 541aaa1 | 2020-04-29 16:46:05 +0200 | [diff] [blame] | 444 | DEFINE_Q35_MACHINE(v5_1, "pc-q35-5.1", NULL, |
| 445 | pc_q35_5_1_machine_options); |
| 446 | |
| 447 | static void pc_q35_5_0_machine_options(MachineClass *m) |
| 448 | { |
| 449 | pc_q35_5_1_machine_options(m); |
| 450 | m->alias = NULL; |
Igor Mammedov | 32a354d | 2020-06-09 09:56:35 -0400 | [diff] [blame] | 451 | m->numa_mem_supported = true; |
Cornelia Huck | 541aaa1 | 2020-04-29 16:46:05 +0200 | [diff] [blame] | 452 | compat_props_add(m->compat_props, hw_compat_5_0, hw_compat_5_0_len); |
| 453 | compat_props_add(m->compat_props, pc_compat_5_0, pc_compat_5_0_len); |
David Hildenbrand | d110b6b | 2020-08-20 11:48:28 +0200 | [diff] [blame] | 454 | m->auto_enable_numa_with_memdev = false; |
Cornelia Huck | 541aaa1 | 2020-04-29 16:46:05 +0200 | [diff] [blame] | 455 | } |
| 456 | |
Cornelia Huck | 3eb74d2 | 2019-11-12 11:48:11 +0100 | [diff] [blame] | 457 | DEFINE_Q35_MACHINE(v5_0, "pc-q35-5.0", NULL, |
| 458 | pc_q35_5_0_machine_options); |
| 459 | |
| 460 | static void pc_q35_4_2_machine_options(MachineClass *m) |
| 461 | { |
| 462 | pc_q35_5_0_machine_options(m); |
| 463 | m->alias = NULL; |
| 464 | compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len); |
| 465 | compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len); |
| 466 | } |
| 467 | |
Cornelia Huck | 9aec2e5 | 2019-07-24 12:35:24 +0200 | [diff] [blame] | 468 | DEFINE_Q35_MACHINE(v4_2, "pc-q35-4.2", NULL, |
| 469 | pc_q35_4_2_machine_options); |
| 470 | |
| 471 | static void pc_q35_4_1_machine_options(MachineClass *m) |
| 472 | { |
| 473 | pc_q35_4_2_machine_options(m); |
| 474 | m->alias = NULL; |
| 475 | compat_props_add(m->compat_props, hw_compat_4_1, hw_compat_4_1_len); |
| 476 | compat_props_add(m->compat_props, pc_compat_4_1, pc_compat_4_1_len); |
| 477 | } |
| 478 | |
Cornelia Huck | 9bf2650 | 2019-04-11 12:20:25 +0200 | [diff] [blame] | 479 | DEFINE_Q35_MACHINE(v4_1, "pc-q35-4.1", NULL, |
| 480 | pc_q35_4_1_machine_options); |
| 481 | |
Alex Williamson | c87759c | 2019-05-14 14:14:41 -0600 | [diff] [blame] | 482 | static void pc_q35_4_0_1_machine_options(MachineClass *m) |
Cornelia Huck | 9bf2650 | 2019-04-11 12:20:25 +0200 | [diff] [blame] | 483 | { |
Eduardo Habkost | 0788a56 | 2019-06-27 21:28:42 -0300 | [diff] [blame] | 484 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
Cornelia Huck | 9bf2650 | 2019-04-11 12:20:25 +0200 | [diff] [blame] | 485 | pc_q35_4_1_machine_options(m); |
| 486 | m->alias = NULL; |
Eduardo Habkost | 0788a56 | 2019-06-27 21:28:42 -0300 | [diff] [blame] | 487 | pcmc->default_cpu_version = CPU_VERSION_LEGACY; |
Greg Kurz | 8e8cbed | 2019-06-14 15:09:02 +0200 | [diff] [blame] | 488 | /* |
| 489 | * This is the default machine for the 4.0-stable branch. It is basically |
| 490 | * a 4.0 that doesn't use split irqchip by default. It MUST hence apply the |
| 491 | * 4.0 compat props. |
| 492 | */ |
| 493 | compat_props_add(m->compat_props, hw_compat_4_0, hw_compat_4_0_len); |
| 494 | compat_props_add(m->compat_props, pc_compat_4_0, pc_compat_4_0_len); |
Alex Williamson | c87759c | 2019-05-14 14:14:41 -0600 | [diff] [blame] | 495 | } |
| 496 | |
| 497 | DEFINE_Q35_MACHINE(v4_0_1, "pc-q35-4.0.1", NULL, |
| 498 | pc_q35_4_0_1_machine_options); |
| 499 | |
| 500 | static void pc_q35_4_0_machine_options(MachineClass *m) |
| 501 | { |
| 502 | pc_q35_4_0_1_machine_options(m); |
| 503 | m->default_kernel_irqchip_split = true; |
| 504 | m->alias = NULL; |
Greg Kurz | 8e8cbed | 2019-06-14 15:09:02 +0200 | [diff] [blame] | 505 | /* Compat props are applied by the 4.0.1 machine */ |
Cornelia Huck | 9bf2650 | 2019-04-11 12:20:25 +0200 | [diff] [blame] | 506 | } |
| 507 | |
Alex Williamson | 84e060b | 2018-12-04 09:27:16 -0700 | [diff] [blame] | 508 | DEFINE_Q35_MACHINE(v4_0, "pc-q35-4.0", NULL, |
| 509 | pc_q35_4_0_machine_options); |
| 510 | |
| 511 | static void pc_q35_3_1_machine_options(MachineClass *m) |
| 512 | { |
Stefano Garzarella | fda672b | 2019-01-22 13:10:48 +0100 | [diff] [blame] | 513 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
| 514 | |
Alex Williamson | 84e060b | 2018-12-04 09:27:16 -0700 | [diff] [blame] | 515 | pc_q35_4_0_machine_options(m); |
Peter Xu | b2fc91d | 2018-12-20 13:40:35 +0800 | [diff] [blame] | 516 | m->default_kernel_irqchip_split = false; |
Corey Minyard | 7fccf2a | 2018-11-14 14:41:01 -0600 | [diff] [blame] | 517 | m->smbus_no_migration_support = true; |
Alex Williamson | 84e060b | 2018-12-04 09:27:16 -0700 | [diff] [blame] | 518 | m->alias = NULL; |
Stefano Garzarella | fda672b | 2019-01-22 13:10:48 +0100 | [diff] [blame] | 519 | pcmc->pvh_enabled = false; |
Marc-André Lureau | abd93cc | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 520 | compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len); |
| 521 | compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len); |
Alex Williamson | 84e060b | 2018-12-04 09:27:16 -0700 | [diff] [blame] | 522 | } |
| 523 | |
Marc-André Lureau | 4a93722 | 2018-11-20 17:26:04 +0400 | [diff] [blame] | 524 | DEFINE_Q35_MACHINE(v3_1, "pc-q35-3.1", NULL, |
| 525 | pc_q35_3_1_machine_options); |
| 526 | |
| 527 | static void pc_q35_3_0_machine_options(MachineClass *m) |
| 528 | { |
| 529 | pc_q35_3_1_machine_options(m); |
Marc-André Lureau | ddb3235 | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 530 | compat_props_add(m->compat_props, hw_compat_3_0, hw_compat_3_0_len); |
| 531 | compat_props_add(m->compat_props, pc_compat_3_0, pc_compat_3_0_len); |
Marc-André Lureau | 4a93722 | 2018-11-20 17:26:04 +0400 | [diff] [blame] | 532 | } |
| 533 | |
Peter Maydell | aa78a16 | 2018-05-22 11:39:57 +0100 | [diff] [blame] | 534 | DEFINE_Q35_MACHINE(v3_0, "pc-q35-3.0", NULL, |
| 535 | pc_q35_3_0_machine_options); |
Babu Moger | 968ee4a | 2018-05-14 11:41:50 -0500 | [diff] [blame] | 536 | |
| 537 | static void pc_q35_2_12_machine_options(MachineClass *m) |
| 538 | { |
Peter Maydell | aa78a16 | 2018-05-22 11:39:57 +0100 | [diff] [blame] | 539 | pc_q35_3_0_machine_options(m); |
Marc-André Lureau | 0d47310 | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 540 | compat_props_add(m->compat_props, hw_compat_2_12, hw_compat_2_12_len); |
| 541 | compat_props_add(m->compat_props, pc_compat_2_12, pc_compat_2_12_len); |
Babu Moger | 968ee4a | 2018-05-14 11:41:50 -0500 | [diff] [blame] | 542 | } |
| 543 | |
Haozhong Zhang | df47ce8 | 2017-12-19 11:37:29 +0800 | [diff] [blame] | 544 | DEFINE_Q35_MACHINE(v2_12, "pc-q35-2.12", NULL, |
| 545 | pc_q35_2_12_machine_options); |
| 546 | |
| 547 | static void pc_q35_2_11_machine_options(MachineClass *m) |
| 548 | { |
Paolo Bonzini | 4b9c264 | 2018-03-02 10:29:06 +0100 | [diff] [blame] | 549 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
| 550 | |
Haozhong Zhang | df47ce8 | 2017-12-19 11:37:29 +0800 | [diff] [blame] | 551 | pc_q35_2_12_machine_options(m); |
Paolo Bonzini | 4b9c264 | 2018-03-02 10:29:06 +0100 | [diff] [blame] | 552 | pcmc->default_nic_model = "e1000"; |
Marc-André Lureau | 43df70a | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 553 | compat_props_add(m->compat_props, hw_compat_2_11, hw_compat_2_11_len); |
| 554 | compat_props_add(m->compat_props, pc_compat_2_11, pc_compat_2_11_len); |
Haozhong Zhang | df47ce8 | 2017-12-19 11:37:29 +0800 | [diff] [blame] | 555 | } |
| 556 | |
Marcel Apfelbaum | a6fd5b0 | 2017-09-06 17:26:57 +0300 | [diff] [blame] | 557 | DEFINE_Q35_MACHINE(v2_11, "pc-q35-2.11", NULL, |
| 558 | pc_q35_2_11_machine_options); |
| 559 | |
| 560 | static void pc_q35_2_10_machine_options(MachineClass *m) |
| 561 | { |
| 562 | pc_q35_2_11_machine_options(m); |
Marc-André Lureau | 503224f | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 563 | compat_props_add(m->compat_props, hw_compat_2_10, hw_compat_2_10_len); |
| 564 | compat_props_add(m->compat_props, pc_compat_2_10, pc_compat_2_10_len); |
Dou Liyang | 7b8be49 | 2017-11-14 10:34:01 +0800 | [diff] [blame] | 565 | m->auto_enable_numa_with_memhp = false; |
Eduardo Habkost | 87e896a | 2015-09-11 17:14:25 -0300 | [diff] [blame] | 566 | } |
| 567 | |
Peter Xu | 465238d | 2017-04-25 17:49:13 +0800 | [diff] [blame] | 568 | DEFINE_Q35_MACHINE(v2_10, "pc-q35-2.10", NULL, |
| 569 | pc_q35_2_10_machine_options); |
| 570 | |
| 571 | static void pc_q35_2_9_machine_options(MachineClass *m) |
| 572 | { |
| 573 | pc_q35_2_10_machine_options(m); |
Marc-André Lureau | 3e80315 | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 574 | compat_props_add(m->compat_props, hw_compat_2_9, hw_compat_2_9_len); |
| 575 | compat_props_add(m->compat_props, pc_compat_2_9, pc_compat_2_9_len); |
Peter Xu | 465238d | 2017-04-25 17:49:13 +0800 | [diff] [blame] | 576 | } |
| 577 | |
Eduardo Habkost | d580bd4 | 2017-01-12 19:24:16 +0100 | [diff] [blame] | 578 | DEFINE_Q35_MACHINE(v2_9, "pc-q35-2.9", NULL, |
| 579 | pc_q35_2_9_machine_options); |
| 580 | |
| 581 | static void pc_q35_2_8_machine_options(MachineClass *m) |
| 582 | { |
| 583 | pc_q35_2_9_machine_options(m); |
Marc-André Lureau | edc24cc | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 584 | compat_props_add(m->compat_props, hw_compat_2_8, hw_compat_2_8_len); |
| 585 | compat_props_add(m->compat_props, pc_compat_2_8, pc_compat_2_8_len); |
Eduardo Habkost | d580bd4 | 2017-01-12 19:24:16 +0100 | [diff] [blame] | 586 | } |
| 587 | |
Longpeng(Mike) | a4d3c83 | 2016-09-07 13:21:12 +0800 | [diff] [blame] | 588 | DEFINE_Q35_MACHINE(v2_8, "pc-q35-2.8", NULL, |
| 589 | pc_q35_2_8_machine_options); |
| 590 | |
| 591 | static void pc_q35_2_7_machine_options(MachineClass *m) |
| 592 | { |
| 593 | pc_q35_2_8_machine_options(m); |
Igor Mammedov | 00d0f9f | 2016-10-19 14:05:43 +0200 | [diff] [blame] | 594 | m->max_cpus = 255; |
Marc-André Lureau | 5a99506 | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 595 | compat_props_add(m->compat_props, hw_compat_2_7, hw_compat_2_7_len); |
| 596 | compat_props_add(m->compat_props, pc_compat_2_7, pc_compat_2_7_len); |
Longpeng(Mike) | a4d3c83 | 2016-09-07 13:21:12 +0800 | [diff] [blame] | 597 | } |
| 598 | |
Igor Mammedov | d86c145 | 2016-05-17 16:43:10 +0200 | [diff] [blame] | 599 | DEFINE_Q35_MACHINE(v2_7, "pc-q35-2.7", NULL, |
| 600 | pc_q35_2_7_machine_options); |
| 601 | |
| 602 | static void pc_q35_2_6_machine_options(MachineClass *m) |
| 603 | { |
Paolo Bonzini | f014c97 | 2021-10-20 14:48:10 +0200 | [diff] [blame] | 604 | X86MachineClass *x86mc = X86_MACHINE_CLASS(m); |
Igor Mammedov | 679dd1a | 2016-06-15 11:25:23 +0200 | [diff] [blame] | 605 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
Marc-André Lureau | 88cbe07 | 2018-12-12 18:01:23 +0400 | [diff] [blame] | 606 | |
Igor Mammedov | d86c145 | 2016-05-17 16:43:10 +0200 | [diff] [blame] | 607 | pc_q35_2_7_machine_options(m); |
Igor Mammedov | 679dd1a | 2016-06-15 11:25:23 +0200 | [diff] [blame] | 608 | pcmc->legacy_cpu_hotplug = true; |
Paolo Bonzini | f014c97 | 2021-10-20 14:48:10 +0200 | [diff] [blame] | 609 | x86mc->fwcfg_dma_enabled = false; |
Marc-André Lureau | ff8f261 | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 610 | compat_props_add(m->compat_props, hw_compat_2_6, hw_compat_2_6_len); |
| 611 | compat_props_add(m->compat_props, pc_compat_2_6, pc_compat_2_6_len); |
Igor Mammedov | d86c145 | 2016-05-17 16:43:10 +0200 | [diff] [blame] | 612 | } |
| 613 | |
Eduardo Habkost | 240240d | 2015-11-30 12:56:36 -0200 | [diff] [blame] | 614 | DEFINE_Q35_MACHINE(v2_6, "pc-q35-2.6", NULL, |
| 615 | pc_q35_2_6_machine_options); |
| 616 | |
| 617 | static void pc_q35_2_5_machine_options(MachineClass *m) |
| 618 | { |
Liam Merwick | 2f34ebf | 2019-11-18 11:13:25 +0000 | [diff] [blame] | 619 | X86MachineClass *x86mc = X86_MACHINE_CLASS(m); |
Marc-André Lureau | 88cbe07 | 2018-12-12 18:01:23 +0400 | [diff] [blame] | 620 | |
Eduardo Habkost | 240240d | 2015-11-30 12:56:36 -0200 | [diff] [blame] | 621 | pc_q35_2_6_machine_options(m); |
Liam Merwick | 2f34ebf | 2019-11-18 11:13:25 +0000 | [diff] [blame] | 622 | x86mc->save_tsc_khz = false; |
Gerd Hoffmann | bab47d9 | 2016-04-07 09:12:58 -0500 | [diff] [blame] | 623 | m->legacy_fw_cfg_order = 1; |
Marc-André Lureau | fe75961 | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 624 | compat_props_add(m->compat_props, hw_compat_2_5, hw_compat_2_5_len); |
| 625 | compat_props_add(m->compat_props, pc_compat_2_5, pc_compat_2_5_len); |
Eduardo Habkost | 240240d | 2015-11-30 12:56:36 -0200 | [diff] [blame] | 626 | } |
| 627 | |
Eduardo Habkost | 87e896a | 2015-09-11 17:14:25 -0300 | [diff] [blame] | 628 | DEFINE_Q35_MACHINE(v2_5, "pc-q35-2.5", NULL, |
| 629 | pc_q35_2_5_machine_options); |
| 630 | |
Eduardo Habkost | 865906f | 2015-05-15 14:18:56 -0300 | [diff] [blame] | 631 | static void pc_q35_2_4_machine_options(MachineClass *m) |
Eduardo Habkost | fddd179 | 2015-05-15 14:18:54 -0300 | [diff] [blame] | 632 | { |
Igor Mammedov | 2f8b500 | 2015-09-07 13:55:32 +0200 | [diff] [blame] | 633 | PCMachineClass *pcmc = PC_MACHINE_CLASS(m); |
Marc-André Lureau | 88cbe07 | 2018-12-12 18:01:23 +0400 | [diff] [blame] | 634 | |
Eduardo Habkost | 87e896a | 2015-09-11 17:14:25 -0300 | [diff] [blame] | 635 | pc_q35_2_5_machine_options(m); |
Eduardo Habkost | de796d9 | 2015-10-30 17:36:07 -0200 | [diff] [blame] | 636 | m->hw_version = "2.4.0"; |
Igor Mammedov | 2f8b500 | 2015-09-07 13:55:32 +0200 | [diff] [blame] | 637 | pcmc->broken_reserved_end = true; |
Marc-André Lureau | 2f99b9c | 2018-12-12 19:36:30 +0400 | [diff] [blame] | 638 | compat_props_add(m->compat_props, hw_compat_2_4, hw_compat_2_4_len); |
| 639 | compat_props_add(m->compat_props, pc_compat_2_4, pc_compat_2_4_len); |
Eduardo Habkost | fddd179 | 2015-05-15 14:18:54 -0300 | [diff] [blame] | 640 | } |
Gerd Hoffmann | aeca6e8 | 2013-12-02 12:47:29 +0100 | [diff] [blame] | 641 | |
Eduardo Habkost | 99fbeaf | 2015-05-15 14:19:01 -0300 | [diff] [blame] | 642 | DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL, |
| 643 | pc_q35_2_4_machine_options); |