xref: /openbmc/qemu/hw/i386/pc_piix.c (revision c48eb7a4e869f338e5b3e233fed7c9dbb0520247)
153018216SPaolo Bonzini /*
253018216SPaolo Bonzini  * QEMU PC System Emulator
353018216SPaolo Bonzini  *
453018216SPaolo Bonzini  * Copyright (c) 2003-2004 Fabrice Bellard
553018216SPaolo Bonzini  *
653018216SPaolo Bonzini  * Permission is hereby granted, free of charge, to any person obtaining a copy
753018216SPaolo Bonzini  * of this software and associated documentation files (the "Software"), to deal
853018216SPaolo Bonzini  * in the Software without restriction, including without limitation the rights
953018216SPaolo Bonzini  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1053018216SPaolo Bonzini  * copies of the Software, and to permit persons to whom the Software is
1153018216SPaolo Bonzini  * furnished to do so, subject to the following conditions:
1253018216SPaolo Bonzini  *
1353018216SPaolo Bonzini  * The above copyright notice and this permission notice shall be included in
1453018216SPaolo Bonzini  * all copies or substantial portions of the Software.
1553018216SPaolo Bonzini  *
1653018216SPaolo Bonzini  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1753018216SPaolo Bonzini  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1853018216SPaolo Bonzini  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1953018216SPaolo Bonzini  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2053018216SPaolo Bonzini  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2153018216SPaolo Bonzini  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2253018216SPaolo Bonzini  * THE SOFTWARE.
2353018216SPaolo Bonzini  */
2453018216SPaolo Bonzini 
25b6a0aa05SPeter Maydell #include "qemu/osdep.h"
262becc36aSPaolo Bonzini #include CONFIG_DEVICES
2753018216SPaolo Bonzini 
28d471bf3eSPaolo Bonzini #include "qemu/units.h"
2904920fc0SMichael S. Tsirkin #include "hw/loader.h"
30549e984eSSergio Lopez #include "hw/i386/x86.h"
310d09e41aSPaolo Bonzini #include "hw/i386/pc.h"
320d09e41aSPaolo Bonzini #include "hw/i386/apic.h"
330fd61a2dSPhilippe Mathieu-Daudé #include "hw/pci-host/i440fx.h"
34fff123b8SPhilippe Mathieu-Daudé #include "hw/southbridge/piix.h"
3594692dcdSGerd Hoffmann #include "hw/display/ramfb.h"
36a2eb5c0cSPhilippe Mathieu-Daudé #include "hw/firmware/smbios.h"
3753018216SPaolo Bonzini #include "hw/pci/pci.h"
3853018216SPaolo Bonzini #include "hw/pci/pci_ids.h"
3953018216SPaolo Bonzini #include "hw/usb.h"
4053018216SPaolo Bonzini #include "net/net.h"
41df45d38fSBALATON Zoltan #include "hw/ide/pci.h"
4264552b6bSMarkus Armbruster #include "hw/irq.h"
4353018216SPaolo Bonzini #include "sysemu/kvm.h"
4453018216SPaolo Bonzini #include "hw/kvm/clock.h"
4553018216SPaolo Bonzini #include "hw/sysbus.h"
4693198b6cSCorey Minyard #include "hw/i2c/smbus_eeprom.h"
47c834596fSPhilippe Mathieu-Daudé #include "hw/xen/xen-x86.h"
4853018216SPaolo Bonzini #include "exec/memory.h"
490445259bSMichael S. Tsirkin #include "hw/acpi/acpi.h"
50ee7318bcSMark Cave-Ayland #include "hw/acpi/piix4.h"
51e688df6bSMarkus Armbruster #include "qapi/error.h"
52c87b1520SDon Slutz #include "qemu/error-report.h"
53da278d58SPhilippe Mathieu-Daudé #include "sysemu/xen.h"
5453018216SPaolo Bonzini #ifdef CONFIG_XEN
5553018216SPaolo Bonzini #include <xen/hvm/hvm_info_table.h>
56998250e9STiejun Chen #include "hw/xen/xen_pt.h"
5753018216SPaolo Bonzini #endif
5884a899deSJuan Quintela #include "migration/global_state.h"
59c4b63b7cSJuan Quintela #include "migration/misc.h"
603bfe5716SLaurent Vivier #include "sysemu/numa.h"
61cab78e7cSJon Doron #include "hw/hyperv/vmbus-bridge.h"
624b997690SPhilippe Mathieu-Daudé #include "hw/mem/nvdimm.h"
635c94b826SKwangwoo Lee #include "hw/i386/acpi-build.h"
64f5cc5a5cSClaudio Fontana #include "kvm/kvm-cpu.h"
6553018216SPaolo Bonzini 
6653018216SPaolo Bonzini #define MAX_IDE_BUS 2
6753018216SPaolo Bonzini 
6860386ea2SJulio Montes #ifdef CONFIG_IDE_ISA
6953018216SPaolo Bonzini static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
7053018216SPaolo Bonzini static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
7153018216SPaolo Bonzini static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
7260386ea2SJulio Montes #endif
7353018216SPaolo Bonzini 
7453018216SPaolo Bonzini /* PC hardware initialisation */
7576d39ab4STiejun Chen static void pc_init1(MachineState *machine,
7676d39ab4STiejun Chen                      const char *host_type, const char *pci_type)
7753018216SPaolo Bonzini {
78ec68007aSEduardo Habkost     PCMachineState *pcms = PC_MACHINE(machine);
797102fa70SEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
80f0bb276bSPaolo Bonzini     X86MachineState *x86ms = X86_MACHINE(machine);
811e099556SEduardo Habkost     MemoryRegion *system_memory = get_system_memory();
821e099556SEduardo Habkost     MemoryRegion *system_io = get_system_io();
8353018216SPaolo Bonzini     PCIBus *pci_bus;
8453018216SPaolo Bonzini     ISABus *isa_bus;
8553018216SPaolo Bonzini     int piix3_devfn = -1;
862ba154cfSShannon Zhao     qemu_irq smi_irq;
8753018216SPaolo Bonzini     GSIState *gsi_state;
8853018216SPaolo Bonzini     BusState *idebus[MAX_IDE_BUS];
8953018216SPaolo Bonzini     ISADevice *rtc_state;
9053018216SPaolo Bonzini     MemoryRegion *ram_memory;
9153018216SPaolo Bonzini     MemoryRegion *pci_memory;
9253018216SPaolo Bonzini     MemoryRegion *rom_memory;
93c87b1520SDon Slutz     ram_addr_t lowmem;
94*c48eb7a4SJoao Martins     uint64_t hole64_size;
9548767787SJoao Martins     DeviceState *i440fx_host;
9653018216SPaolo Bonzini 
978156d480SGerd Hoffmann     /*
988156d480SGerd Hoffmann      * Calculate ram split, for memory below and above 4G.  It's a bit
998156d480SGerd Hoffmann      * complicated for backward compatibility reasons ...
1008156d480SGerd Hoffmann      *
1018156d480SGerd Hoffmann      *  - Traditional split is 3.5G (lowmem = 0xe0000000).  This is the
1028156d480SGerd Hoffmann      *    default value for max_ram_below_4g now.
1038156d480SGerd Hoffmann      *
1048156d480SGerd Hoffmann      *  - Then, to gigabyte align the memory, we move the split to 3G
1058156d480SGerd Hoffmann      *    (lowmem = 0xc0000000).  But only in case we have to split in
1068156d480SGerd Hoffmann      *    the first place, i.e. ram_size is larger than (traditional)
1078156d480SGerd Hoffmann      *    lowmem.  And for new machine types (gigabyte_align = true)
1088156d480SGerd Hoffmann      *    only, for live migration compatibility reasons.
1098156d480SGerd Hoffmann      *
1108156d480SGerd Hoffmann      *  - Next the max-ram-below-4g option was added, which allowed to
1118156d480SGerd Hoffmann      *    reduce lowmem to a smaller value, to allow a larger PCI I/O
1128156d480SGerd Hoffmann      *    window below 4G.  qemu doesn't enforce gigabyte alignment here,
1138156d480SGerd Hoffmann      *    but prints a warning.
1148156d480SGerd Hoffmann      *
1158156d480SGerd Hoffmann      *  - Finally max-ram-below-4g got updated to also allow raising lowmem,
1168156d480SGerd Hoffmann      *    so legacy non-PAE guests can get as much memory as possible in
1178156d480SGerd Hoffmann      *    the 32bit address space below 4G.
1188156d480SGerd Hoffmann      *
1195650ac00SPhilippe Mathieu-Daudé      *  - Note that Xen has its own ram setup code in xen_ram_init(),
1205650ac00SPhilippe Mathieu-Daudé      *    called via xen_hvm_init_pc().
1215ec7d098SGerd Hoffmann      *
1228156d480SGerd Hoffmann      * Examples:
1238156d480SGerd Hoffmann      *    qemu -M pc-1.7 -m 4G    (old default)    -> 3584M low,  512M high
1248156d480SGerd Hoffmann      *    qemu -M pc -m 4G        (new default)    -> 3072M low, 1024M high
1258156d480SGerd Hoffmann      *    qemu -M pc,max-ram-below-4g=2G -m 4G     -> 2048M low, 2048M high
1268156d480SGerd Hoffmann      *    qemu -M pc,max-ram-below-4g=4G -m 3968M  -> 3968M low (=4G-128M)
127ecdbfcebSMichael S. Tsirkin      */
1285ec7d098SGerd Hoffmann     if (xen_enabled()) {
1295650ac00SPhilippe Mathieu-Daudé         xen_hvm_init_pc(pcms, &ram_memory);
1305ec7d098SGerd Hoffmann     } else {
1319a45729dSGerd Hoffmann         if (!pcms->max_ram_below_4g) {
1329a45729dSGerd Hoffmann             pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
1335ec7d098SGerd Hoffmann         }
1349a45729dSGerd Hoffmann         lowmem = pcms->max_ram_below_4g;
1359a45729dSGerd Hoffmann         if (machine->ram_size >= pcms->max_ram_below_4g) {
1368156d480SGerd Hoffmann             if (pcmc->gigabyte_align) {
1378156d480SGerd Hoffmann                 if (lowmem > 0xc0000000) {
1388156d480SGerd Hoffmann                     lowmem = 0xc0000000;
1398156d480SGerd Hoffmann                 }
140d471bf3eSPaolo Bonzini                 if (lowmem & (1 * GiB - 1)) {
1413dc6f869SAlistair Francis                     warn_report("Large machine and max_ram_below_4g "
1428156d480SGerd Hoffmann                                 "(%" PRIu64 ") not a multiple of 1G; "
1438156d480SGerd Hoffmann                                 "possible bad performance.",
1449a45729dSGerd Hoffmann                                 pcms->max_ram_below_4g);
145c87b1520SDon Slutz                 }
146c87b1520SDon Slutz             }
1478156d480SGerd Hoffmann         }
148c87b1520SDon Slutz 
149c87b1520SDon Slutz         if (machine->ram_size >= lowmem) {
150f0bb276bSPaolo Bonzini             x86ms->above_4g_mem_size = machine->ram_size - lowmem;
151f0bb276bSPaolo Bonzini             x86ms->below_4g_mem_size = lowmem;
15253018216SPaolo Bonzini         } else {
153f0bb276bSPaolo Bonzini             x86ms->above_4g_mem_size = 0;
154f0bb276bSPaolo Bonzini             x86ms->below_4g_mem_size = machine->ram_size;
15553018216SPaolo Bonzini         }
1563c2a9669SDon Slutz     }
1573c2a9669SDon Slutz 
158fb6986a2SSean Christopherson     pc_machine_init_sgx_epc(pcms);
159703a548aSSergio Lopez     x86_cpus_init(x86ms, pcmc->default_cpu_version);
1603c2a9669SDon Slutz 
1618700a984SVitaly Kuznetsov     if (pcmc->kvmclock_enabled) {
1628700a984SVitaly Kuznetsov         kvmclock_create(pcmc->kvmclock_create_always);
1633c2a9669SDon Slutz     }
1643c2a9669SDon Slutz 
1657102fa70SEduardo Habkost     if (pcmc->pci_enabled) {
16653018216SPaolo Bonzini         pci_memory = g_new(MemoryRegion, 1);
167286690e3SPaolo Bonzini         memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
16853018216SPaolo Bonzini         rom_memory = pci_memory;
16948767787SJoao Martins         i440fx_host = qdev_new(host_type);
170*c48eb7a4SJoao Martins         hole64_size = object_property_get_uint(OBJECT(i440fx_host),
171*c48eb7a4SJoao Martins                                                PCI_HOST_PROP_PCI_HOLE64_SIZE,
172*c48eb7a4SJoao Martins                                                &error_abort);
17353018216SPaolo Bonzini     } else {
17453018216SPaolo Bonzini         pci_memory = NULL;
17553018216SPaolo Bonzini         rom_memory = system_memory;
17648767787SJoao Martins         i440fx_host = NULL;
177*c48eb7a4SJoao Martins         hole64_size = 0;
17853018216SPaolo Bonzini     }
17953018216SPaolo Bonzini 
1805db3f0deSEduardo Habkost     pc_guest_info_init(pcms);
1813459a625SMichael S. Tsirkin 
1827102fa70SEduardo Habkost     if (pcmc->smbios_defaults) {
1833ef96221SMarcel Apfelbaum         MachineClass *mc = MACHINE_GET_CLASS(machine);
184b29ad07eSMarkus Armbruster         /* These values are guest ABI, do not change */
185e6667f71SGabriel L. Somlo         smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
1867102fa70SEduardo Habkost                             mc->name, pcmc->smbios_legacy_mode,
1877102fa70SEduardo Habkost                             pcmc->smbios_uuid_encoded,
1880e4edb3bSEduardo Habkost                             pcms->smbios_entry_point_type);
189b29ad07eSMarkus Armbruster     }
190b29ad07eSMarkus Armbruster 
19153018216SPaolo Bonzini     /* allocate ram and load rom/bios */
19253018216SPaolo Bonzini     if (!xen_enabled()) {
19362b160c0SEduardo Habkost         pc_memory_init(pcms, system_memory,
194*c48eb7a4SJoao Martins                        rom_memory, &ram_memory, hole64_size);
195dd29b5c3SPaul Durrant     } else {
196dd29b5c3SPaul Durrant         pc_system_flash_cleanup_unused(pcms);
197dd29b5c3SPaul Durrant         if (machine->kernel_filename != NULL) {
198b33a5bbfSChunyan Liu             /* For xen HVM direct kernel boot, load linux here */
1997bc35e0fSEduardo Habkost             xen_load_linux(pcms);
20053018216SPaolo Bonzini         }
201dd29b5c3SPaul Durrant     }
20253018216SPaolo Bonzini 
203417258f1SPhilippe Mathieu-Daudé     gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
20453018216SPaolo Bonzini 
2057102fa70SEduardo Habkost     if (pcmc->pci_enabled) {
20648bc99a0SPhilippe Mathieu-Daudé         PIIX3State *piix3;
207988fb613SBernhard Beschow         PCIDevice *pci_dev;
208988fb613SBernhard Beschow         const char *type = xen_enabled() ? TYPE_PIIX3_XEN_DEVICE
209988fb613SBernhard Beschow                                          : TYPE_PIIX3_DEVICE;
21048bc99a0SPhilippe Mathieu-Daudé 
21148767787SJoao Martins         pci_bus = i440fx_init(pci_type,
21248767787SJoao Martins                               i440fx_host,
2133ef96221SMarcel Apfelbaum                               system_memory, system_io, machine->ram_size,
214f0bb276bSPaolo Bonzini                               x86ms->below_4g_mem_size,
215f0bb276bSPaolo Bonzini                               x86ms->above_4g_mem_size,
21653018216SPaolo Bonzini                               pci_memory, ram_memory);
21781ed6482SMarcel Apfelbaum         pcms->bus = pci_bus;
21848bc99a0SPhilippe Mathieu-Daudé 
219988fb613SBernhard Beschow         pci_dev = pci_create_simple_multifunction(pci_bus, -1, true, type);
220988fb613SBernhard Beschow         piix3 = PIIX3_PCI_DEVICE(pci_dev);
22148bc99a0SPhilippe Mathieu-Daudé         piix3->pic = x86ms->gsi;
22248bc99a0SPhilippe Mathieu-Daudé         piix3_devfn = piix3->dev.devfn;
2236e8791fbSBernhard Beschow         isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix3), "isa.0"));
22453018216SPaolo Bonzini     } else {
22553018216SPaolo Bonzini         pci_bus = NULL;
226d10e5432SMarkus Armbruster         isa_bus = isa_bus_new(NULL, get_system_memory(), system_io,
227d10e5432SMarkus Armbruster                               &error_abort);
2280259c78cSEduardo Habkost         pcms->hpet_enabled = false;
22953018216SPaolo Bonzini     }
230f0bb276bSPaolo Bonzini     isa_bus_irqs(isa_bus, x86ms->gsi);
23153018216SPaolo Bonzini 
232c300bbe8SXiaoyao Li     if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
2334501d317SPhilippe Mathieu-Daudé         pc_i8259_create(isa_bus, gsi_state->i8259_irq);
234c300bbe8SXiaoyao Li     }
23553018216SPaolo Bonzini 
2367102fa70SEduardo Habkost     if (pcmc->pci_enabled) {
23753018216SPaolo Bonzini         ioapic_init_gsi(gsi_state, "i440fx");
23853018216SPaolo Bonzini     }
23953018216SPaolo Bonzini 
2406f529b75SPaolo Bonzini     if (tcg_enabled()) {
2416f529b75SPaolo Bonzini         x86_register_ferr_irq(x86ms->gsi[13]);
2426f529b75SPaolo Bonzini     }
24353018216SPaolo Bonzini 
2447102fa70SEduardo Habkost     pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL);
24553018216SPaolo Bonzini 
2467fb1cf16SEric Blake     assert(pcms->vmport != ON_OFF_AUTO__MAX);
247ec68007aSEduardo Habkost     if (pcms->vmport == ON_OFF_AUTO_AUTO) {
248ec68007aSEduardo Habkost         pcms->vmport = xen_enabled() ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON;
249d1048befSDon Slutz     }
250d1048befSDon Slutz 
25153018216SPaolo Bonzini     /* init basic PC hardware */
25210e2483bSGerd Hoffmann     pc_basic_device_init(pcms, isa_bus, x86ms->gsi, &rtc_state, true,
253f5878b03SCorey Minyard                          0x4);
25453018216SPaolo Bonzini 
2554b9c264bSPaolo Bonzini     pc_nic_init(pcmc, isa_bus, pci_bus);
25653018216SPaolo Bonzini 
2577102fa70SEduardo Habkost     if (pcmc->pci_enabled) {
25853018216SPaolo Bonzini         PCIDevice *dev;
259df45d38fSBALATON Zoltan 
2607851b21aSBernhard Beschow         dev = pci_create_simple(pci_bus, piix3_devfn + 1, "piix3-ide");
261be1765f3SBALATON Zoltan         pci_ide_create_devs(dev);
26253018216SPaolo Bonzini         idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
26353018216SPaolo Bonzini         idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
26460386ea2SJulio Montes         pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
26560386ea2SJulio Montes     }
26660386ea2SJulio Montes #ifdef CONFIG_IDE_ISA
26760386ea2SJulio Montes     else {
268be1765f3SBALATON Zoltan         DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
269c9d6da3aSThomas Huth         int i;
270be1765f3SBALATON Zoltan 
271be1765f3SBALATON Zoltan         ide_drive_get(hd, ARRAY_SIZE(hd));
27253018216SPaolo Bonzini         for (i = 0; i < MAX_IDE_BUS; i++) {
27353018216SPaolo Bonzini             ISADevice *dev;
27461de3676SAlexander Graf             char busname[] = "ide.0";
27553018216SPaolo Bonzini             dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
27653018216SPaolo Bonzini                                ide_irq[i],
27753018216SPaolo Bonzini                                hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
27861de3676SAlexander Graf             /*
27961de3676SAlexander Graf              * The ide bus name is ide.0 for the first bus and ide.1 for the
28061de3676SAlexander Graf              * second one.
28161de3676SAlexander Graf              */
28261de3676SAlexander Graf             busname[4] = '0' + i;
28361de3676SAlexander Graf             idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
28453018216SPaolo Bonzini         }
28588076854SEduardo Habkost         pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
28660386ea2SJulio Montes     }
28760386ea2SJulio Montes #endif
28853018216SPaolo Bonzini 
2894bcbe0b6SEduardo Habkost     if (pcmc->pci_enabled && machine_usb(machine)) {
29053018216SPaolo Bonzini         pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
29153018216SPaolo Bonzini     }
29253018216SPaolo Bonzini 
29317e89077SGerd Hoffmann     if (pcmc->pci_enabled && x86_machine_is_acpi_enabled(X86_MACHINE(pcms))) {
294ee7318bcSMark Cave-Ayland         PCIDevice *piix4_pm;
29553018216SPaolo Bonzini 
2962ba154cfSShannon Zhao         smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
297ee7318bcSMark Cave-Ayland         piix4_pm = pci_new(piix3_devfn + 3, TYPE_PIIX4_PM);
298ee7318bcSMark Cave-Ayland         qdev_prop_set_uint32(DEVICE(piix4_pm), "smb_io_base", 0xb100);
299ee7318bcSMark Cave-Ayland         qdev_prop_set_bit(DEVICE(piix4_pm), "smm-enabled",
30019eb2a0dSMark Cave-Ayland                           x86_machine_is_smm_enabled(x86ms));
301ee7318bcSMark Cave-Ayland         pci_realize_and_unref(piix4_pm, pci_bus, &error_fatal);
302ee7318bcSMark Cave-Ayland 
30329786d42SMark Cave-Ayland         qdev_connect_gpio_out(DEVICE(piix4_pm), 0, x86ms->gsi[9]);
304b49e9442SMark Cave-Ayland         qdev_connect_gpio_out_named(DEVICE(piix4_pm), "smi-irq", 0, smi_irq);
30519eb2a0dSMark Cave-Ayland         pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(piix4_pm), "i2c"));
30619eb2a0dSMark Cave-Ayland         /* TODO: Populate SPD eeprom data.  */
307ebe15582SCorey Minyard         smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
308781bbd6bSIgor Mammedov 
309781bbd6bSIgor Mammedov         object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
310781bbd6bSIgor Mammedov                                  TYPE_HOTPLUG_HANDLER,
31150aef131SGerd Hoffmann                                  (Object **)&x86ms->acpi_dev,
312781bbd6bSIgor Mammedov                                  object_property_allow_set_link,
313d2623129SMarkus Armbruster                                  OBJ_PROP_LINK_STRONG);
3145325cc34SMarkus Armbruster         object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
3155325cc34SMarkus Armbruster                                  OBJECT(piix4_pm), &error_abort);
31653018216SPaolo Bonzini     }
31753018216SPaolo Bonzini 
318f6a0d06bSEric Auger     if (machine->nvdimms_state->is_enabled) {
319f6a0d06bSEric Auger         nvdimm_init_acpi_state(machine->nvdimms_state, system_io,
3205c94b826SKwangwoo Lee                                x86_nvdimm_acpi_dsmio,
321f0bb276bSPaolo Bonzini                                x86ms->fw_cfg, OBJECT(pcms));
3225fe79386SXiao Guangrong     }
32353018216SPaolo Bonzini }
32453018216SPaolo Bonzini 
32579859507SEduardo Habkost /* Looking for a pc_compat_2_4() function? It doesn't exist.
32679859507SEduardo Habkost  * pc_compat_*() functions that run on machine-init time and
32779859507SEduardo Habkost  * change global QEMU state are deprecated. Please don't create
32879859507SEduardo Habkost  * one, and implement any pc-*-2.4 (and newer) compat code in
329ac78f737SMarc-André Lureau  * hw_compat_*, pc_compat_*, or * pc_*_machine_options().
33079859507SEduardo Habkost  */
33179859507SEduardo Habkost 
3328995dd90SMarc-André Lureau static void pc_compat_2_3_fn(MachineState *machine)
3335cb50e0aSJason Wang {
334ed9e923cSPaolo Bonzini     X86MachineState *x86ms = X86_MACHINE(machine);
335355023f2SPaolo Bonzini     if (kvm_enabled()) {
336ed9e923cSPaolo Bonzini         x86ms->smm = ON_OFF_AUTO_OFF;
337355023f2SPaolo Bonzini     }
3385cb50e0aSJason Wang }
3395cb50e0aSJason Wang 
3401c30044eSMarc-André Lureau static void pc_compat_2_2_fn(MachineState *machine)
34164bbd372SPaolo Bonzini {
3428995dd90SMarc-André Lureau     pc_compat_2_3_fn(machine);
34364bbd372SPaolo Bonzini }
34464bbd372SPaolo Bonzini 
345c4fc5695SMarc-André Lureau static void pc_compat_2_1_fn(MachineState *machine)
3462cad57c7SEduardo Habkost {
3471c30044eSMarc-André Lureau     pc_compat_2_2_fn(machine);
3485114e842SEduardo Habkost     x86_cpu_change_kvm_default("svm", NULL);
3492cad57c7SEduardo Habkost }
3502cad57c7SEduardo Habkost 
351a310e653SMarc-André Lureau static void pc_compat_2_0_fn(MachineState *machine)
3523458b2b0SMichael S. Tsirkin {
353c4fc5695SMarc-André Lureau     pc_compat_2_1_fn(machine);
3543458b2b0SMichael S. Tsirkin }
3553458b2b0SMichael S. Tsirkin 
356a310e653SMarc-André Lureau static void pc_compat_1_7_fn(MachineState *machine)
357b29ad07eSMarkus Armbruster {
358a310e653SMarc-André Lureau     pc_compat_2_0_fn(machine);
3595114e842SEduardo Habkost     x86_cpu_change_kvm_default("x2apic", NULL);
360b29ad07eSMarkus Armbruster }
361b29ad07eSMarkus Armbruster 
362a310e653SMarc-André Lureau static void pc_compat_1_6_fn(MachineState *machine)
363f8c457b8SMichael S. Tsirkin {
364a310e653SMarc-André Lureau     pc_compat_1_7_fn(machine);
36589b439f3SEduardo Habkost }
36689b439f3SEduardo Habkost 
367a310e653SMarc-André Lureau static void pc_compat_1_5_fn(MachineState *machine)
36889b439f3SEduardo Habkost {
369a310e653SMarc-André Lureau     pc_compat_1_6_fn(machine);
37089b439f3SEduardo Habkost }
37189b439f3SEduardo Habkost 
372a310e653SMarc-André Lureau static void pc_compat_1_4_fn(MachineState *machine)
37389b439f3SEduardo Habkost {
374a310e653SMarc-André Lureau     pc_compat_1_5_fn(machine);
37589b439f3SEduardo Habkost }
37689b439f3SEduardo Habkost 
377274f5e63SThomas Huth #ifdef CONFIG_ISAPC
3783ef96221SMarcel Apfelbaum static void pc_init_isa(MachineState *machine)
37953018216SPaolo Bonzini {
38076d39ab4STiejun Chen     pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
38153018216SPaolo Bonzini }
382274f5e63SThomas Huth #endif
38353018216SPaolo Bonzini 
38453018216SPaolo Bonzini #ifdef CONFIG_XEN
385998250e9STiejun Chen static void pc_xen_hvm_init_pci(MachineState *machine)
386998250e9STiejun Chen {
387acd0c941SAnthony PERARD     const char *pci_type = xen_igd_gfx_pt_enabled() ?
388998250e9STiejun Chen                 TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE : TYPE_I440FX_PCI_DEVICE;
389998250e9STiejun Chen 
390998250e9STiejun Chen     pc_init1(machine,
391998250e9STiejun Chen              TYPE_I440FX_PCI_HOST_BRIDGE,
392998250e9STiejun Chen              pci_type);
393998250e9STiejun Chen }
394998250e9STiejun Chen 
3953ef96221SMarcel Apfelbaum static void pc_xen_hvm_init(MachineState *machine)
39653018216SPaolo Bonzini {
397e492dc5aSDavid Gibson     PCMachineState *pcms = PC_MACHINE(machine);
39839ae4972SPaul Durrant 
399a88ae0d4SEduardo Habkost     if (!xen_enabled()) {
400a88ae0d4SEduardo Habkost         error_report("xenfv machine requires the xen accelerator");
401a88ae0d4SEduardo Habkost         exit(1);
402a88ae0d4SEduardo Habkost     }
403a88ae0d4SEduardo Habkost 
404998250e9STiejun Chen     pc_xen_hvm_init_pci(machine);
405e492dc5aSDavid Gibson     pci_create_simple(pcms->bus, -1, "xen-platform");
40653018216SPaolo Bonzini }
40753018216SPaolo Bonzini #endif
40853018216SPaolo Bonzini 
40999fbeafeSEduardo Habkost #define DEFINE_I440FX_MACHINE(suffix, name, compatfn, optionfn) \
41099fbeafeSEduardo Habkost     static void pc_init_##suffix(MachineState *machine) \
41199fbeafeSEduardo Habkost     { \
41299fbeafeSEduardo Habkost         void (*compat)(MachineState *m) = (compatfn); \
41399fbeafeSEduardo Habkost         if (compat) { \
41499fbeafeSEduardo Habkost             compat(machine); \
41599fbeafeSEduardo Habkost         } \
41676d39ab4STiejun Chen         pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
41776d39ab4STiejun Chen                  TYPE_I440FX_PCI_DEVICE); \
41899fbeafeSEduardo Habkost     } \
41999fbeafeSEduardo Habkost     DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn)
420a0dba644SMichael S. Tsirkin 
421865906f7SEduardo Habkost static void pc_i440fx_machine_options(MachineClass *m)
422fddd179aSEduardo Habkost {
4234b9c264bSPaolo Bonzini     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
4244b9c264bSPaolo Bonzini     pcmc->default_nic_model = "e1000";
4250a343a5aSVitaly Cheptsov     pcmc->pci_root_uid = 0;
4264b9c264bSPaolo Bonzini 
427fddd179aSEduardo Habkost     m->family = "pc_piix";
428fddd179aSEduardo Habkost     m->desc = "Standard PC (i440FX + PIIX, 1996)";
429254bdb1cSEduardo Habkost     m->default_machine_opts = "firmware=bios-256k.bin";
430254bdb1cSEduardo Habkost     m->default_display = "std";
43194692dcdSGerd Hoffmann     machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
432cab78e7cSJon Doron     machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE);
433fddd179aSEduardo Habkost }
434fddd179aSEduardo Habkost 
4350ca70366SCornelia Huck static void pc_i440fx_7_1_machine_options(MachineClass *m)
43687e896abSEduardo Habkost {
4370788a56bSEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
43887e896abSEduardo Habkost     pc_i440fx_machine_options(m);
43987e896abSEduardo Habkost     m->alias = "pc";
440ea0ac7f6SPhilippe Mathieu-Daudé     m->is_default = true;
4410788a56bSEduardo Habkost     pcmc->default_cpu_version = 1;
44287e896abSEduardo Habkost }
44387e896abSEduardo Habkost 
4440ca70366SCornelia Huck DEFINE_I440FX_MACHINE(v7_1, "pc-i440fx-7.1", NULL,
4450ca70366SCornelia Huck                       pc_i440fx_7_1_machine_options);
4460ca70366SCornelia Huck 
4470ca70366SCornelia Huck static void pc_i440fx_7_0_machine_options(MachineClass *m)
4480ca70366SCornelia Huck {
44967f7e426SJason A. Donenfeld     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
4500ca70366SCornelia Huck     pc_i440fx_7_1_machine_options(m);
4510ca70366SCornelia Huck     m->alias = NULL;
4520ca70366SCornelia Huck     m->is_default = false;
45367f7e426SJason A. Donenfeld     pcmc->legacy_no_rng_seed = true;
4540ca70366SCornelia Huck     compat_props_add(m->compat_props, hw_compat_7_0, hw_compat_7_0_len);
4550ca70366SCornelia Huck     compat_props_add(m->compat_props, pc_compat_7_0, pc_compat_7_0_len);
4560ca70366SCornelia Huck }
4570ca70366SCornelia Huck 
45801854af2SCornelia Huck DEFINE_I440FX_MACHINE(v7_0, "pc-i440fx-7.0", NULL,
45901854af2SCornelia Huck                       pc_i440fx_7_0_machine_options);
46001854af2SCornelia Huck 
46101854af2SCornelia Huck static void pc_i440fx_6_2_machine_options(MachineClass *m)
46201854af2SCornelia Huck {
46301854af2SCornelia Huck     pc_i440fx_7_0_machine_options(m);
46401854af2SCornelia Huck     m->alias = NULL;
46501854af2SCornelia Huck     m->is_default = false;
46601854af2SCornelia Huck     compat_props_add(m->compat_props, hw_compat_6_2, hw_compat_6_2_len);
46701854af2SCornelia Huck     compat_props_add(m->compat_props, pc_compat_6_2, pc_compat_6_2_len);
46801854af2SCornelia Huck }
46901854af2SCornelia Huck 
47052e64f5bSYanan Wang DEFINE_I440FX_MACHINE(v6_2, "pc-i440fx-6.2", NULL,
47152e64f5bSYanan Wang                       pc_i440fx_6_2_machine_options);
47252e64f5bSYanan Wang 
47352e64f5bSYanan Wang static void pc_i440fx_6_1_machine_options(MachineClass *m)
47452e64f5bSYanan Wang {
47552e64f5bSYanan Wang     pc_i440fx_6_2_machine_options(m);
47652e64f5bSYanan Wang     m->alias = NULL;
47752e64f5bSYanan Wang     m->is_default = false;
47852e64f5bSYanan Wang     compat_props_add(m->compat_props, hw_compat_6_1, hw_compat_6_1_len);
47952e64f5bSYanan Wang     compat_props_add(m->compat_props, pc_compat_6_1, pc_compat_6_1_len);
4802b526199SYanan Wang     m->smp_props.prefer_sockets = true;
48152e64f5bSYanan Wang }
48252e64f5bSYanan Wang 
483da7e13c0SCornelia Huck DEFINE_I440FX_MACHINE(v6_1, "pc-i440fx-6.1", NULL,
484da7e13c0SCornelia Huck                       pc_i440fx_6_1_machine_options);
485da7e13c0SCornelia Huck 
486da7e13c0SCornelia Huck static void pc_i440fx_6_0_machine_options(MachineClass *m)
487da7e13c0SCornelia Huck {
488da7e13c0SCornelia Huck     pc_i440fx_6_1_machine_options(m);
489da7e13c0SCornelia Huck     m->alias = NULL;
490da7e13c0SCornelia Huck     m->is_default = false;
491da7e13c0SCornelia Huck     compat_props_add(m->compat_props, hw_compat_6_0, hw_compat_6_0_len);
492da7e13c0SCornelia Huck     compat_props_add(m->compat_props, pc_compat_6_0, pc_compat_6_0_len);
493da7e13c0SCornelia Huck }
494da7e13c0SCornelia Huck 
495576a00bdSCornelia Huck DEFINE_I440FX_MACHINE(v6_0, "pc-i440fx-6.0", NULL,
496576a00bdSCornelia Huck                       pc_i440fx_6_0_machine_options);
497576a00bdSCornelia Huck 
498576a00bdSCornelia Huck static void pc_i440fx_5_2_machine_options(MachineClass *m)
499576a00bdSCornelia Huck {
500576a00bdSCornelia Huck     pc_i440fx_6_0_machine_options(m);
501576a00bdSCornelia Huck     m->alias = NULL;
502576a00bdSCornelia Huck     m->is_default = false;
503576a00bdSCornelia Huck     compat_props_add(m->compat_props, hw_compat_5_2, hw_compat_5_2_len);
504576a00bdSCornelia Huck     compat_props_add(m->compat_props, pc_compat_5_2, pc_compat_5_2_len);
505576a00bdSCornelia Huck }
506576a00bdSCornelia Huck 
5073ff3c5d3SCornelia Huck DEFINE_I440FX_MACHINE(v5_2, "pc-i440fx-5.2", NULL,
5083ff3c5d3SCornelia Huck                       pc_i440fx_5_2_machine_options);
5093ff3c5d3SCornelia Huck 
5103ff3c5d3SCornelia Huck static void pc_i440fx_5_1_machine_options(MachineClass *m)
5113ff3c5d3SCornelia Huck {
5128700a984SVitaly Kuznetsov     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
5138700a984SVitaly Kuznetsov 
5143ff3c5d3SCornelia Huck     pc_i440fx_5_2_machine_options(m);
5153ff3c5d3SCornelia Huck     m->alias = NULL;
5163ff3c5d3SCornelia Huck     m->is_default = false;
5173ff3c5d3SCornelia Huck     compat_props_add(m->compat_props, hw_compat_5_1, hw_compat_5_1_len);
5183ff3c5d3SCornelia Huck     compat_props_add(m->compat_props, pc_compat_5_1, pc_compat_5_1_len);
5198700a984SVitaly Kuznetsov     pcmc->kvmclock_create_always = false;
5200a343a5aSVitaly Cheptsov     pcmc->pci_root_uid = 1;
5213ff3c5d3SCornelia Huck }
5223ff3c5d3SCornelia Huck 
523541aaa1dSCornelia Huck DEFINE_I440FX_MACHINE(v5_1, "pc-i440fx-5.1", NULL,
524541aaa1dSCornelia Huck                       pc_i440fx_5_1_machine_options);
525541aaa1dSCornelia Huck 
526541aaa1dSCornelia Huck static void pc_i440fx_5_0_machine_options(MachineClass *m)
527541aaa1dSCornelia Huck {
528541aaa1dSCornelia Huck     pc_i440fx_5_1_machine_options(m);
529541aaa1dSCornelia Huck     m->alias = NULL;
530541aaa1dSCornelia Huck     m->is_default = false;
53132a354dcSIgor Mammedov     m->numa_mem_supported = true;
532541aaa1dSCornelia Huck     compat_props_add(m->compat_props, hw_compat_5_0, hw_compat_5_0_len);
533541aaa1dSCornelia Huck     compat_props_add(m->compat_props, pc_compat_5_0, pc_compat_5_0_len);
534195784a0SDavid Hildenbrand     m->auto_enable_numa_with_memdev = false;
535541aaa1dSCornelia Huck }
536541aaa1dSCornelia Huck 
5373eb74d20SCornelia Huck DEFINE_I440FX_MACHINE(v5_0, "pc-i440fx-5.0", NULL,
5383eb74d20SCornelia Huck                       pc_i440fx_5_0_machine_options);
5393eb74d20SCornelia Huck 
5403eb74d20SCornelia Huck static void pc_i440fx_4_2_machine_options(MachineClass *m)
5413eb74d20SCornelia Huck {
5423eb74d20SCornelia Huck     pc_i440fx_5_0_machine_options(m);
5433eb74d20SCornelia Huck     m->alias = NULL;
544ea0ac7f6SPhilippe Mathieu-Daudé     m->is_default = false;
5453eb74d20SCornelia Huck     compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
5463eb74d20SCornelia Huck     compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
5473eb74d20SCornelia Huck }
5483eb74d20SCornelia Huck 
5499aec2e52SCornelia Huck DEFINE_I440FX_MACHINE(v4_2, "pc-i440fx-4.2", NULL,
5509aec2e52SCornelia Huck                       pc_i440fx_4_2_machine_options);
5519aec2e52SCornelia Huck 
5529aec2e52SCornelia Huck static void pc_i440fx_4_1_machine_options(MachineClass *m)
5539aec2e52SCornelia Huck {
5549aec2e52SCornelia Huck     pc_i440fx_4_2_machine_options(m);
5559aec2e52SCornelia Huck     m->alias = NULL;
556ea0ac7f6SPhilippe Mathieu-Daudé     m->is_default = false;
5579aec2e52SCornelia Huck     compat_props_add(m->compat_props, hw_compat_4_1, hw_compat_4_1_len);
5589aec2e52SCornelia Huck     compat_props_add(m->compat_props, pc_compat_4_1, pc_compat_4_1_len);
5599aec2e52SCornelia Huck }
5609aec2e52SCornelia Huck 
5619bf2650bSCornelia Huck DEFINE_I440FX_MACHINE(v4_1, "pc-i440fx-4.1", NULL,
5629bf2650bSCornelia Huck                       pc_i440fx_4_1_machine_options);
5639bf2650bSCornelia Huck 
5649bf2650bSCornelia Huck static void pc_i440fx_4_0_machine_options(MachineClass *m)
5659bf2650bSCornelia Huck {
5660788a56bSEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
5679bf2650bSCornelia Huck     pc_i440fx_4_1_machine_options(m);
5689bf2650bSCornelia Huck     m->alias = NULL;
569ea0ac7f6SPhilippe Mathieu-Daudé     m->is_default = false;
5700788a56bSEduardo Habkost     pcmc->default_cpu_version = CPU_VERSION_LEGACY;
5719bf2650bSCornelia Huck     compat_props_add(m->compat_props, hw_compat_4_0, hw_compat_4_0_len);
5729bf2650bSCornelia Huck     compat_props_add(m->compat_props, pc_compat_4_0, pc_compat_4_0_len);
5739bf2650bSCornelia Huck }
5749bf2650bSCornelia Huck 
57584e060bfSAlex Williamson DEFINE_I440FX_MACHINE(v4_0, "pc-i440fx-4.0", NULL,
57684e060bfSAlex Williamson                       pc_i440fx_4_0_machine_options);
57784e060bfSAlex Williamson 
57888cbe073SMarc-André Lureau static void pc_i440fx_3_1_machine_options(MachineClass *m)
57988cbe073SMarc-André Lureau {
580fda672b5SStefano Garzarella     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
581fda672b5SStefano Garzarella 
58284e060bfSAlex Williamson     pc_i440fx_4_0_machine_options(m);
583ea0ac7f6SPhilippe Mathieu-Daudé     m->is_default = false;
5847fccf2a0SCorey Minyard     m->smbus_no_migration_support = true;
58584e060bfSAlex Williamson     m->alias = NULL;
586fda672b5SStefano Garzarella     pcmc->pvh_enabled = false;
587abd93cc7SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len);
588abd93cc7SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
58984e060bfSAlex Williamson }
59084e060bfSAlex Williamson 
5914a93722fSMarc-André Lureau DEFINE_I440FX_MACHINE(v3_1, "pc-i440fx-3.1", NULL,
5924a93722fSMarc-André Lureau                       pc_i440fx_3_1_machine_options);
5934a93722fSMarc-André Lureau 
59488cbe073SMarc-André Lureau static void pc_i440fx_3_0_machine_options(MachineClass *m)
59588cbe073SMarc-André Lureau {
5964a93722fSMarc-André Lureau     pc_i440fx_3_1_machine_options(m);
597ddb3235dSMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_3_0, hw_compat_3_0_len);
598ddb3235dSMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_3_0, pc_compat_3_0_len);
5994a93722fSMarc-André Lureau }
6004a93722fSMarc-André Lureau 
601aa78a16dSPeter Maydell DEFINE_I440FX_MACHINE(v3_0, "pc-i440fx-3.0", NULL,
602aa78a16dSPeter Maydell                       pc_i440fx_3_0_machine_options);
603968ee4adSBabu Moger 
60488cbe073SMarc-André Lureau static void pc_i440fx_2_12_machine_options(MachineClass *m)
60588cbe073SMarc-André Lureau {
606aa78a16dSPeter Maydell     pc_i440fx_3_0_machine_options(m);
6070d47310bSMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_12, hw_compat_2_12_len);
6080d47310bSMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_12, pc_compat_2_12_len);
609968ee4adSBabu Moger }
610968ee4adSBabu Moger 
611df47ce8aSHaozhong Zhang DEFINE_I440FX_MACHINE(v2_12, "pc-i440fx-2.12", NULL,
612df47ce8aSHaozhong Zhang                       pc_i440fx_2_12_machine_options);
613df47ce8aSHaozhong Zhang 
61488cbe073SMarc-André Lureau static void pc_i440fx_2_11_machine_options(MachineClass *m)
61588cbe073SMarc-André Lureau {
616df47ce8aSHaozhong Zhang     pc_i440fx_2_12_machine_options(m);
61743df70a9SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_11, hw_compat_2_11_len);
61843df70a9SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_11, pc_compat_2_11_len);
619df47ce8aSHaozhong Zhang }
620df47ce8aSHaozhong Zhang 
621a6fd5b0eSMarcel Apfelbaum DEFINE_I440FX_MACHINE(v2_11, "pc-i440fx-2.11", NULL,
622a6fd5b0eSMarcel Apfelbaum                       pc_i440fx_2_11_machine_options);
623a6fd5b0eSMarcel Apfelbaum 
62488cbe073SMarc-André Lureau static void pc_i440fx_2_10_machine_options(MachineClass *m)
62588cbe073SMarc-André Lureau {
626a6fd5b0eSMarcel Apfelbaum     pc_i440fx_2_11_machine_options(m);
627503224f4SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_10, hw_compat_2_10_len);
628503224f4SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_10, pc_compat_2_10_len);
6297b8be49dSDou Liyang     m->auto_enable_numa_with_memhp = false;
630a6fd5b0eSMarcel Apfelbaum }
631a6fd5b0eSMarcel Apfelbaum 
632465238d9SPeter Xu DEFINE_I440FX_MACHINE(v2_10, "pc-i440fx-2.10", NULL,
633465238d9SPeter Xu                       pc_i440fx_2_10_machine_options);
634465238d9SPeter Xu 
63588cbe073SMarc-André Lureau static void pc_i440fx_2_9_machine_options(MachineClass *m)
63688cbe073SMarc-André Lureau {
637465238d9SPeter Xu     pc_i440fx_2_10_machine_options(m);
6383e803152SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_9, hw_compat_2_9_len);
6393e803152SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_9, pc_compat_2_9_len);
640465238d9SPeter Xu }
641465238d9SPeter Xu 
642d580bd4bSEduardo Habkost DEFINE_I440FX_MACHINE(v2_9, "pc-i440fx-2.9", NULL,
643d580bd4bSEduardo Habkost                       pc_i440fx_2_9_machine_options);
644d580bd4bSEduardo Habkost 
64588cbe073SMarc-André Lureau static void pc_i440fx_2_8_machine_options(MachineClass *m)
64688cbe073SMarc-André Lureau {
647d580bd4bSEduardo Habkost     pc_i440fx_2_9_machine_options(m);
648edc24ccdSMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_8, hw_compat_2_8_len);
649edc24ccdSMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_8, pc_compat_2_8_len);
650d580bd4bSEduardo Habkost }
651d580bd4bSEduardo Habkost 
652a4d3c834SLongpeng(Mike) DEFINE_I440FX_MACHINE(v2_8, "pc-i440fx-2.8", NULL,
653a4d3c834SLongpeng(Mike)                       pc_i440fx_2_8_machine_options);
654a4d3c834SLongpeng(Mike) 
65588cbe073SMarc-André Lureau static void pc_i440fx_2_7_machine_options(MachineClass *m)
65688cbe073SMarc-André Lureau {
657a4d3c834SLongpeng(Mike)     pc_i440fx_2_8_machine_options(m);
6585a995064SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_7, hw_compat_2_7_len);
6595a995064SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_7, pc_compat_2_7_len);
660a4d3c834SLongpeng(Mike) }
661a4d3c834SLongpeng(Mike) 
662d86c1451SIgor Mammedov DEFINE_I440FX_MACHINE(v2_7, "pc-i440fx-2.7", NULL,
663d86c1451SIgor Mammedov                       pc_i440fx_2_7_machine_options);
664d86c1451SIgor Mammedov 
665d86c1451SIgor Mammedov static void pc_i440fx_2_6_machine_options(MachineClass *m)
666d86c1451SIgor Mammedov {
667f014c974SPaolo Bonzini     X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
668679dd1a9SIgor Mammedov     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
66988cbe073SMarc-André Lureau 
670d86c1451SIgor Mammedov     pc_i440fx_2_7_machine_options(m);
671679dd1a9SIgor Mammedov     pcmc->legacy_cpu_hotplug = true;
672f014c974SPaolo Bonzini     x86mc->fwcfg_dma_enabled = false;
673ff8f261fSMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_6, hw_compat_2_6_len);
674ff8f261fSMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_6, pc_compat_2_6_len);
675d86c1451SIgor Mammedov }
676d86c1451SIgor Mammedov 
677240240d5SEduardo Habkost DEFINE_I440FX_MACHINE(v2_6, "pc-i440fx-2.6", NULL,
678240240d5SEduardo Habkost                       pc_i440fx_2_6_machine_options);
679240240d5SEduardo Habkost 
680240240d5SEduardo Habkost static void pc_i440fx_2_5_machine_options(MachineClass *m)
681240240d5SEduardo Habkost {
6822f34ebf2SLiam Merwick     X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
68388cbe073SMarc-André Lureau 
684240240d5SEduardo Habkost     pc_i440fx_2_6_machine_options(m);
6852f34ebf2SLiam Merwick     x86mc->save_tsc_khz = false;
686bab47d9aSGerd Hoffmann     m->legacy_fw_cfg_order = 1;
687fe759610SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_5, hw_compat_2_5_len);
688fe759610SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_5, pc_compat_2_5_len);
689240240d5SEduardo Habkost }
690240240d5SEduardo Habkost 
69187e896abSEduardo Habkost DEFINE_I440FX_MACHINE(v2_5, "pc-i440fx-2.5", NULL,
69287e896abSEduardo Habkost                       pc_i440fx_2_5_machine_options);
69387e896abSEduardo Habkost 
694865906f7SEduardo Habkost static void pc_i440fx_2_4_machine_options(MachineClass *m)
695fddd179aSEduardo Habkost {
6962f8b5008SIgor Mammedov     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
69788cbe073SMarc-André Lureau 
69887e896abSEduardo Habkost     pc_i440fx_2_5_machine_options(m);
699de796d93SEduardo Habkost     m->hw_version = "2.4.0";
7002f8b5008SIgor Mammedov     pcmc->broken_reserved_end = true;
7012f99b9c2SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_4, hw_compat_2_4_len);
7022f99b9c2SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_4, pc_compat_2_4_len);
703fddd179aSEduardo Habkost }
704aeca6e8dSGerd Hoffmann 
70599fbeafeSEduardo Habkost DEFINE_I440FX_MACHINE(v2_4, "pc-i440fx-2.4", NULL,
70625519b06SEduardo Habkost                       pc_i440fx_2_4_machine_options)
7075cb50e0aSJason Wang 
70888cbe073SMarc-André Lureau static void pc_i440fx_2_3_machine_options(MachineClass *m)
70988cbe073SMarc-André Lureau {
7104421c6a3SEduardo Habkost     pc_i440fx_2_4_machine_options(m);
711de796d93SEduardo Habkost     m->hw_version = "2.3.0";
7128995dd90SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_3, hw_compat_2_3_len);
7138995dd90SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_3, pc_compat_2_3_len);
714fddd179aSEduardo Habkost }
7155cb50e0aSJason Wang 
7168995dd90SMarc-André Lureau DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3_fn,
71725519b06SEduardo Habkost                       pc_i440fx_2_3_machine_options);
71861f219dfSEduardo Habkost 
719865906f7SEduardo Habkost static void pc_i440fx_2_2_machine_options(MachineClass *m)
720fddd179aSEduardo Habkost {
7217102fa70SEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
72288cbe073SMarc-André Lureau 
723fddd179aSEduardo Habkost     pc_i440fx_2_3_machine_options(m);
724de796d93SEduardo Habkost     m->hw_version = "2.2.0";
725112394afSEduardo Habkost     m->default_machine_opts = "firmware=bios-256k.bin,suppress-vmdesc=on";
7261c30044eSMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_2, hw_compat_2_2_len);
7271c30044eSMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_2, pc_compat_2_2_len);
7287102fa70SEduardo Habkost     pcmc->rsdp_in_ram = false;
729fddd179aSEduardo Habkost }
73064bbd372SPaolo Bonzini 
7311c30044eSMarc-André Lureau DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2_fn,
73225519b06SEduardo Habkost                       pc_i440fx_2_2_machine_options);
73361f219dfSEduardo Habkost 
734865906f7SEduardo Habkost static void pc_i440fx_2_1_machine_options(MachineClass *m)
735fddd179aSEduardo Habkost {
7367102fa70SEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
73788cbe073SMarc-André Lureau 
738fddd179aSEduardo Habkost     pc_i440fx_2_2_machine_options(m);
739de796d93SEduardo Habkost     m->hw_version = "2.1.0";
740fddd179aSEduardo Habkost     m->default_display = NULL;
741c4fc5695SMarc-André Lureau     compat_props_add(m->compat_props, hw_compat_2_1, hw_compat_2_1_len);
742c4fc5695SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_1, pc_compat_2_1_len);
7437102fa70SEduardo Habkost     pcmc->smbios_uuid_encoded = false;
74416a9e8a5SEduardo Habkost     pcmc->enforce_aligned_dimm = false;
745fddd179aSEduardo Habkost }
746f9f21873SJan Kiszka 
747c4fc5695SMarc-André Lureau DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1_fn,
74825519b06SEduardo Habkost                       pc_i440fx_2_1_machine_options);
74961f219dfSEduardo Habkost 
750865906f7SEduardo Habkost static void pc_i440fx_2_0_machine_options(MachineClass *m)
751fddd179aSEduardo Habkost {
7527102fa70SEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
75388cbe073SMarc-André Lureau 
754fddd179aSEduardo Habkost     pc_i440fx_2_1_machine_options(m);
755de796d93SEduardo Habkost     m->hw_version = "2.0.0";
756a310e653SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_2_0, pc_compat_2_0_len);
7577102fa70SEduardo Habkost     pcmc->smbios_legacy_mode = true;
7587102fa70SEduardo Habkost     pcmc->has_reserved_memory = false;
7592b0ddf66SEduardo Habkost     /* This value depends on the actual DSDT and SSDT compiled into
7602b0ddf66SEduardo Habkost      * the source QEMU; unfortunately it depends on the binary and
7612b0ddf66SEduardo Habkost      * not on the machine type, so we cannot make pc-i440fx-1.7 work on
7622b0ddf66SEduardo Habkost      * both QEMU 1.7 and QEMU 2.0.
7632b0ddf66SEduardo Habkost      *
7642b0ddf66SEduardo Habkost      * Large variations cause migration to fail for more than one
7652b0ddf66SEduardo Habkost      * consecutive value of the "-smp" maxcpus option.
7662b0ddf66SEduardo Habkost      *
7672b0ddf66SEduardo Habkost      * For small variations of the kind caused by different iasl versions,
7682b0ddf66SEduardo Habkost      * the 4k rounding usually leaves slack.  However, there could be still
7692b0ddf66SEduardo Habkost      * one or two values that break.  For QEMU 1.7 and QEMU 2.0 the
7702b0ddf66SEduardo Habkost      * slack is only ~10 bytes before one "-smp maxcpus" value breaks!
7712b0ddf66SEduardo Habkost      *
7722b0ddf66SEduardo Habkost      * 6652 is valid for QEMU 2.0, the right value for pc-i440fx-1.7 on
7732b0ddf66SEduardo Habkost      * QEMU 1.7 it is 6414.  For RHEL/CentOS 7.0 it is 6418.
7742b0ddf66SEduardo Habkost      */
7752b0ddf66SEduardo Habkost     pcmc->legacy_acpi_table_size = 6652;
776cd4040ecSEduardo Habkost     pcmc->acpi_data_size = 0x10000;
777fddd179aSEduardo Habkost }
7783458b2b0SMichael S. Tsirkin 
779a310e653SMarc-André Lureau DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0_fn,
78025519b06SEduardo Habkost                       pc_i440fx_2_0_machine_options);
78161f219dfSEduardo Habkost 
782865906f7SEduardo Habkost static void pc_i440fx_1_7_machine_options(MachineClass *m)
783fddd179aSEduardo Habkost {
7847102fa70SEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
78588cbe073SMarc-André Lureau 
786fddd179aSEduardo Habkost     pc_i440fx_2_0_machine_options(m);
787de796d93SEduardo Habkost     m->hw_version = "1.7.0";
788fddd179aSEduardo Habkost     m->default_machine_opts = NULL;
78971ae9e94SEduardo Habkost     m->option_rom_has_mr = true;
790f59fb188SThomas Huth     m->deprecation_reason = "old and unattended - use a newer version instead";
791a310e653SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_1_7, pc_compat_1_7_len);
7927102fa70SEduardo Habkost     pcmc->smbios_defaults = false;
7937102fa70SEduardo Habkost     pcmc->gigabyte_align = false;
7942b0ddf66SEduardo Habkost     pcmc->legacy_acpi_table_size = 6414;
795fddd179aSEduardo Habkost }
796aeca6e8dSGerd Hoffmann 
797a310e653SMarc-André Lureau DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7_fn,
79825519b06SEduardo Habkost                       pc_i440fx_1_7_machine_options);
79961f219dfSEduardo Habkost 
800865906f7SEduardo Habkost static void pc_i440fx_1_6_machine_options(MachineClass *m)
801fddd179aSEduardo Habkost {
8027102fa70SEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
80388cbe073SMarc-André Lureau 
804fddd179aSEduardo Habkost     pc_i440fx_1_7_machine_options(m);
805de796d93SEduardo Habkost     m->hw_version = "1.6.0";
80671ae9e94SEduardo Habkost     m->rom_file_has_mr = false;
807a310e653SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_1_6, pc_compat_1_6_len);
8087102fa70SEduardo Habkost     pcmc->has_acpi_build = false;
809fddd179aSEduardo Habkost }
810a0dba644SMichael S. Tsirkin 
811a310e653SMarc-André Lureau DEFINE_I440FX_MACHINE(v1_6, "pc-i440fx-1.6", pc_compat_1_6_fn,
81225519b06SEduardo Habkost                       pc_i440fx_1_6_machine_options);
81361f219dfSEduardo Habkost 
81488cbe073SMarc-André Lureau static void pc_i440fx_1_5_machine_options(MachineClass *m)
81588cbe073SMarc-André Lureau {
816fddd179aSEduardo Habkost     pc_i440fx_1_6_machine_options(m);
817de796d93SEduardo Habkost     m->hw_version = "1.5.0";
818a310e653SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_1_5, pc_compat_1_5_len);
819fddd179aSEduardo Habkost }
820b6b5c8e4SEduardo Habkost 
821a310e653SMarc-André Lureau DEFINE_I440FX_MACHINE(v1_5, "pc-i440fx-1.5", pc_compat_1_5_fn,
82225519b06SEduardo Habkost                       pc_i440fx_1_5_machine_options);
82361f219dfSEduardo Habkost 
82488cbe073SMarc-André Lureau static void pc_i440fx_1_4_machine_options(MachineClass *m)
82588cbe073SMarc-André Lureau {
826fddd179aSEduardo Habkost     pc_i440fx_1_5_machine_options(m);
827de796d93SEduardo Habkost     m->hw_version = "1.4.0";
828a310e653SMarc-André Lureau     compat_props_add(m->compat_props, pc_compat_1_4, pc_compat_1_4_len);
829fddd179aSEduardo Habkost }
830a0dba644SMichael S. Tsirkin 
831a310e653SMarc-André Lureau DEFINE_I440FX_MACHINE(v1_4, "pc-i440fx-1.4", pc_compat_1_4_fn,
83225519b06SEduardo Habkost                       pc_i440fx_1_4_machine_options);
83361f219dfSEduardo Habkost 
834274f5e63SThomas Huth #ifdef CONFIG_ISAPC
835865906f7SEduardo Habkost static void isapc_machine_options(MachineClass *m)
836fddd179aSEduardo Habkost {
8377102fa70SEduardo Habkost     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
838fddd179aSEduardo Habkost     m->desc = "ISA-only PC";
839fddd179aSEduardo Habkost     m->max_cpus = 1;
84071ae9e94SEduardo Habkost     m->option_rom_has_mr = true;
84171ae9e94SEduardo Habkost     m->rom_file_has_mr = false;
8427102fa70SEduardo Habkost     pcmc->pci_enabled = false;
8437102fa70SEduardo Habkost     pcmc->has_acpi_build = false;
8447102fa70SEduardo Habkost     pcmc->smbios_defaults = false;
8457102fa70SEduardo Habkost     pcmc->gigabyte_align = false;
8467102fa70SEduardo Habkost     pcmc->smbios_legacy_mode = true;
8477102fa70SEduardo Habkost     pcmc->has_reserved_memory = false;
8484b9c264bSPaolo Bonzini     pcmc->default_nic_model = "ne2k_isa";
849311ca98dSIgor Mammedov     m->default_cpu_type = X86_CPU_TYPE_NAME("486");
850fddd179aSEduardo Habkost }
851b6b5c8e4SEduardo Habkost 
85261f219dfSEduardo Habkost DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
85325519b06SEduardo Habkost                   isapc_machine_options);
854274f5e63SThomas Huth #endif
85553018216SPaolo Bonzini 
85653018216SPaolo Bonzini #ifdef CONFIG_XEN
8579a709f06SOlaf Hering static void xenfv_4_2_machine_options(MachineClass *m)
858fddd179aSEduardo Habkost {
8599a709f06SOlaf Hering     pc_i440fx_4_2_machine_options(m);
860fddd179aSEduardo Habkost     m->desc = "Xen Fully-virtualized PC";
861fddd179aSEduardo Habkost     m->max_cpus = HVM_MAX_VCPUS;
8628959e0a6SJason Andryuk     m->default_machine_opts = "accel=xen,suppress-vmdesc=on";
863fddd179aSEduardo Habkost }
864b6b5c8e4SEduardo Habkost 
8659a709f06SOlaf Hering DEFINE_PC_MACHINE(xenfv_4_2, "xenfv-4.2", pc_xen_hvm_init,
8669a709f06SOlaf Hering                   xenfv_4_2_machine_options);
8679a709f06SOlaf Hering 
8689a709f06SOlaf Hering static void xenfv_3_1_machine_options(MachineClass *m)
8699a709f06SOlaf Hering {
8709a709f06SOlaf Hering     pc_i440fx_3_1_machine_options(m);
8719a709f06SOlaf Hering     m->desc = "Xen Fully-virtualized PC";
8729a709f06SOlaf Hering     m->alias = "xenfv";
8739a709f06SOlaf Hering     m->max_cpus = HVM_MAX_VCPUS;
8748959e0a6SJason Andryuk     m->default_machine_opts = "accel=xen,suppress-vmdesc=on";
8759a709f06SOlaf Hering }
8769a709f06SOlaf Hering 
8779a709f06SOlaf Hering DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init,
8789a709f06SOlaf Hering                   xenfv_3_1_machine_options);
87953018216SPaolo Bonzini #endif
880