xref: /openbmc/qemu/hw/s390x/s390-virtio-ccw.c (revision e7a9d9342865e5f7dcd836afa77990e1980b1986)
1a5c95808SCornelia Huck /*
2a5c95808SCornelia Huck  * virtio ccw machine
3a5c95808SCornelia Huck  *
4c3347ed0SJanosch Frank  * Copyright 2012, 2020 IBM Corp.
56286b419SDavid Hildenbrand  * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
6a5c95808SCornelia Huck  * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
7c3347ed0SJanosch Frank  *            Janosch Frank <frankja@linux.ibm.com>
8a5c95808SCornelia Huck  *
9a5c95808SCornelia Huck  * This work is licensed under the terms of the GNU GPL, version 2 or (at
10a5c95808SCornelia Huck  * your option) any later version. See the COPYING file in the top-level
11a5c95808SCornelia Huck  * directory.
12a5c95808SCornelia Huck  */
13a5c95808SCornelia Huck 
149615495aSPeter Maydell #include "qemu/osdep.h"
15da34e65cSMarkus Armbruster #include "qapi/error.h"
169138977bSDavid Hildenbrand #include "exec/ram_addr.h"
17a14a2b01SXiaoyao Li #include "exec/confidential-guest-support.h"
187fb1e06aSDaniel P. Berrangé #include "hw/boards.h"
197d577546SDavid Hildenbrand #include "hw/s390x/s390-virtio-hcall.h"
2083c9f4caSPaolo Bonzini #include "hw/s390x/sclp.h"
213a553fc6SJens Freimann #include "hw/s390x/s390_flic.h"
22bd3f16acSPaolo Bonzini #include "hw/s390x/ioinst.h"
23bd3f16acSPaolo Bonzini #include "hw/s390x/css.h"
24a5c95808SCornelia Huck #include "virtio-ccw.h"
25b6fe0124SMatthew Rosato #include "qemu/config-file.h"
26856dfd8aSMarkus Armbruster #include "qemu/ctype.h"
27b5684cd8SDavid Hildenbrand #include "qemu/error-report.h"
28922a01a0SMarkus Armbruster #include "qemu/option.h"
295c30ef93SChristian Borntraeger #include "qemu/qemu-print.h"
30a43de798SPaolo Bonzini #include "qemu/units.h"
31408b55dbSMatthew Rosato #include "hw/s390x/s390-pci-bus.h"
3271e8a915SMarkus Armbruster #include "sysemu/reset.h"
330f5f6691SJason J. Herne #include "hw/s390x/storage-keys.h"
34903fd80bSClaudio Imbrenda #include "hw/s390x/storage-attributes.h"
35bc61c8c6SClaudio Imbrenda #include "hw/s390x/event-facility.h"
3604ca4b92SAlexander Yarygin #include "ipl.h"
378b8a61adSJanosch Frank #include "hw/s390x/s390-virtio-ccw.h"
38dd70bd0dSJing Liu #include "hw/s390x/css-bridge.h"
39a51b3153STony Krowiak #include "hw/s390x/ap-bridge.h"
40f2a8f0a6SJuan Quintela #include "migration/register.h"
417223bcceSJason J. Herne #include "cpu_models.h"
426286b419SDavid Hildenbrand #include "hw/nmi.h"
43a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h"
448046f374SDavid Hildenbrand #include "hw/s390x/tod.h"
452f780b6aSMarkus Armbruster #include "sysemu/sysemu.h"
46c3a073c6SClaudio Imbrenda #include "sysemu/cpus.h"
47f5f9c6eaSPhilippe Mathieu-Daudé #include "target/s390x/kvm/pv.h"
480141e1b4SJanosch Frank #include "migration/blocker.h"
491fd396e3SPierre Morel #include "qapi/visitor.h"
50c809bbc8SPierre Morel #include "hw/s390x/cpu-topology.h"
51d6a7c3f4SThomas Huth #include CONFIG_DEVICES
520141e1b4SJanosch Frank 
530141e1b4SJanosch Frank static Error *pv_mig_blocker;
546286b419SDavid Hildenbrand 
s390x_new_cpu(const char * typename,uint32_t core_id,Error ** errp)5532dc6aa0SIgor Mammedov static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
5632dc6aa0SIgor Mammedov                               Error **errp)
5732dc6aa0SIgor Mammedov {
5832dc6aa0SIgor Mammedov     S390CPU *cpu = S390_CPU(object_new(typename));
59f07ad48dSMarkus Armbruster     S390CPU *ret = NULL;
6032dc6aa0SIgor Mammedov 
61992861fbSMarkus Armbruster     if (!object_property_set_int(OBJECT(cpu), "core-id", core_id, errp)) {
6232dc6aa0SIgor Mammedov         goto out;
6332dc6aa0SIgor Mammedov     }
64992861fbSMarkus Armbruster     if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
65f07ad48dSMarkus Armbruster         goto out;
66f07ad48dSMarkus Armbruster     }
67f07ad48dSMarkus Armbruster     ret = cpu;
6832dc6aa0SIgor Mammedov 
6932dc6aa0SIgor Mammedov out:
7032dc6aa0SIgor Mammedov     object_unref(OBJECT(cpu));
71f07ad48dSMarkus Armbruster     return ret;
7232dc6aa0SIgor Mammedov }
7332dc6aa0SIgor Mammedov 
s390_init_cpus(MachineState * machine)746286b419SDavid Hildenbrand static void s390_init_cpus(MachineState *machine)
756286b419SDavid Hildenbrand {
764dc3b151SDavid Hildenbrand     MachineClass *mc = MACHINE_GET_CLASS(machine);
776393b299SPierre Morel     S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
786286b419SDavid Hildenbrand     int i;
796286b419SDavid Hildenbrand 
806393b299SPierre Morel     if (machine->smp.threads > s390mc->max_threads) {
816393b299SPierre Morel         error_report("S390 does not support more than %d threads.",
826393b299SPierre Morel                      s390mc->max_threads);
836393b299SPierre Morel         exit(1);
846393b299SPierre Morel     }
856393b299SPierre Morel 
864dc3b151SDavid Hildenbrand     /* initialize possible_cpus */
874dc3b151SDavid Hildenbrand     mc->possible_cpu_arch_ids(machine);
884dc3b151SDavid Hildenbrand 
89ae71ed86SLike Xu     for (i = 0; i < machine->smp.cpus; i++) {
90b6805e12SIgor Mammedov         s390x_new_cpu(machine->cpu_type, i, &error_fatal);
916286b419SDavid Hildenbrand     }
926286b419SDavid Hildenbrand }
932eb1cd07STony Krowiak 
9409c7f58cSDavid Hildenbrand static const char *const reset_dev_types[] = {
953f9e4859SSascha Silbe     TYPE_VIRTUAL_CSS_BRIDGE,
9609c7f58cSDavid Hildenbrand     "s390-sclp-event-facility",
9709c7f58cSDavid Hildenbrand     "s390-flic",
9809c7f58cSDavid Hildenbrand     "diag288",
99db08244aSMatthew Rosato     TYPE_S390_PCI_HOST_BRIDGE,
100297ec01fSJanosch Frank     TYPE_AP_BRIDGE,
10109c7f58cSDavid Hildenbrand };
10209c7f58cSDavid Hildenbrand 
subsystem_reset(void)103a30fb811SDavid Hildenbrand static void subsystem_reset(void)
1044e872a3fSChristian Borntraeger {
10509c7f58cSDavid Hildenbrand     DeviceState *dev;
10609c7f58cSDavid Hildenbrand     int i;
1074e872a3fSChristian Borntraeger 
10868c691caSMatthew Rosato     /*
10968c691caSMatthew Rosato      * ISM firmware is sensitive to unexpected changes to the IOMMU, which can
11068c691caSMatthew Rosato      * occur during reset of the vfio-pci device (unmap of entire aperture).
11168c691caSMatthew Rosato      * Ensure any passthrough ISM devices are reset now, while CPUs are paused
11268c691caSMatthew Rosato      * but before vfio-pci cleanup occurs.
11368c691caSMatthew Rosato      */
11468c691caSMatthew Rosato     s390_pci_ism_reset();
11568c691caSMatthew Rosato 
11609c7f58cSDavid Hildenbrand     for (i = 0; i < ARRAY_SIZE(reset_dev_types); i++) {
11709c7f58cSDavid Hildenbrand         dev = DEVICE(object_resolve_path_type("", reset_dev_types[i], NULL));
11809c7f58cSDavid Hildenbrand         if (dev) {
119dfa6ba6bSPeter Maydell             device_cold_reset(dev);
1204e872a3fSChristian Borntraeger         }
1210c7322cfSXu Wang     }
1223d6e75f4SPierre Morel     if (s390_has_topology()) {
1233d6e75f4SPierre Morel         s390_topology_reset();
1243d6e75f4SPierre Morel     }
1254e872a3fSChristian Borntraeger }
1264e872a3fSChristian Borntraeger 
virtio_ccw_hcall_notify(const uint64_t * args)127a5c95808SCornelia Huck static int virtio_ccw_hcall_notify(const uint64_t *args)
128a5c95808SCornelia Huck {
129a5c95808SCornelia Huck     uint64_t subch_id = args[0];
130594b543aSJonah Palmer     uint64_t data = args[1];
131a5c95808SCornelia Huck     SubchDev *sch;
132594b543aSJonah Palmer     VirtIODevice *vdev;
133a5c95808SCornelia Huck     int cssid, ssid, schid, m;
134594b543aSJonah Palmer     uint16_t vq_idx = data;
135a5c95808SCornelia Huck 
136a5c95808SCornelia Huck     if (ioinst_disassemble_sch_ident(subch_id, &m, &cssid, &ssid, &schid)) {
137a5c95808SCornelia Huck         return -EINVAL;
138a5c95808SCornelia Huck     }
139a5c95808SCornelia Huck     sch = css_find_subch(m, cssid, ssid, schid);
140a5c95808SCornelia Huck     if (!sch || !css_subch_visible(sch)) {
141a5c95808SCornelia Huck         return -EINVAL;
142a5c95808SCornelia Huck     }
143594b543aSJonah Palmer 
144594b543aSJonah Palmer     vdev = virtio_ccw_get_vdev(sch);
145594b543aSJonah Palmer     if (vq_idx >= VIRTIO_QUEUE_MAX || !virtio_queue_get_num(vdev, vq_idx)) {
146b57ed9bfSCornelia Huck         return -EINVAL;
147b57ed9bfSCornelia Huck     }
148a5c95808SCornelia Huck 
149594b543aSJonah Palmer     if (virtio_vdev_has_feature(vdev, VIRTIO_F_NOTIFICATION_DATA)) {
150594b543aSJonah Palmer         virtio_queue_set_shadow_avail_idx(virtio_get_queue(vdev, vq_idx),
151594b543aSJonah Palmer                                           (data >> 16) & 0xFFFF);
152594b543aSJonah Palmer     }
153594b543aSJonah Palmer 
154594b543aSJonah Palmer     virtio_queue_notify(vdev, vq_idx);
155594b543aSJonah Palmer     return 0;
156a5c95808SCornelia Huck }
157a5c95808SCornelia Huck 
virtio_ccw_hcall_early_printk(const uint64_t * args)158a5c95808SCornelia Huck static int virtio_ccw_hcall_early_printk(const uint64_t *args)
159a5c95808SCornelia Huck {
160a5c95808SCornelia Huck     uint64_t mem = args[0];
161382a04afSPaolo Bonzini     MachineState *ms = MACHINE(qdev_get_machine());
162a5c95808SCornelia Huck 
163382a04afSPaolo Bonzini     if (mem < ms->ram_size) {
164a5c95808SCornelia Huck         /* Early printk */
165a5c95808SCornelia Huck         return 0;
166a5c95808SCornelia Huck     }
167a5c95808SCornelia Huck     return -EINVAL;
168a5c95808SCornelia Huck }
169a5c95808SCornelia Huck 
virtio_ccw_register_hcalls(void)170a5c95808SCornelia Huck static void virtio_ccw_register_hcalls(void)
171a5c95808SCornelia Huck {
172a5c95808SCornelia Huck     s390_register_virtio_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY,
173a5c95808SCornelia Huck                                    virtio_ccw_hcall_notify);
174a5c95808SCornelia Huck     /* Tolerate early printk. */
175a5c95808SCornelia Huck     s390_register_virtio_hypercall(KVM_S390_VIRTIO_NOTIFY,
176a5c95808SCornelia Huck                                    virtio_ccw_hcall_early_printk);
177a5c95808SCornelia Huck }
178a5c95808SCornelia Huck 
s390_memory_init(MemoryRegion * ram)1793a12fc61SIgor Mammedov static void s390_memory_init(MemoryRegion *ram)
180a5c95808SCornelia Huck {
181a5c95808SCornelia Huck     MemoryRegion *sysmem = get_system_memory();
18280d23275SDavid Hildenbrand 
1839d913e01SDavid Hildenbrand     if (!QEMU_IS_ALIGNED(memory_region_size(ram), 1 * MiB)) {
1849d913e01SDavid Hildenbrand         /*
1859d913e01SDavid Hildenbrand          * SCLP cannot possibly expose smaller granularity right now and KVM
1869d913e01SDavid Hildenbrand          * cannot handle smaller granularity. As we don't support NUMA, the
1879d913e01SDavid Hildenbrand          * region size directly corresponds to machine->ram_size, and the region
1889d913e01SDavid Hildenbrand          * is a single RAM memory region.
1899d913e01SDavid Hildenbrand          */
1909d913e01SDavid Hildenbrand         error_report("ram size must be multiples of 1 MiB");
1919d913e01SDavid Hildenbrand         exit(EXIT_FAILURE);
1929d913e01SDavid Hildenbrand     }
1939d913e01SDavid Hildenbrand 
19480d23275SDavid Hildenbrand     /* allocate RAM for core */
195fb1fc5a8SIgor Mammedov     memory_region_add_subregion(sysmem, 0, ram);
19680d23275SDavid Hildenbrand 
1979138977bSDavid Hildenbrand     /*
1989138977bSDavid Hildenbrand      * Configure the maximum page size. As no memory devices were created
1999138977bSDavid Hildenbrand      * yet, this is the page size of initial memory only.
2009138977bSDavid Hildenbrand      */
201805d4496SMarkus Armbruster     s390_set_max_pagesize(qemu_maxrampagesize(), &error_fatal);
20280d23275SDavid Hildenbrand     /* Initialize storage key device */
20380d23275SDavid Hildenbrand     s390_skeys_init();
204903fd80bSClaudio Imbrenda     /* Initialize storage attributes device */
205903fd80bSClaudio Imbrenda     s390_stattrib_init();
20680d23275SDavid Hildenbrand }
20780d23275SDavid Hildenbrand 
s390_init_ipl_dev(const char * kernel_filename,const char * kernel_cmdline,const char * initrd_filename,const char * firmware,bool enforce_bios)2086286b419SDavid Hildenbrand static void s390_init_ipl_dev(const char *kernel_filename,
2096286b419SDavid Hildenbrand                               const char *kernel_cmdline,
2106286b419SDavid Hildenbrand                               const char *initrd_filename, const char *firmware,
211188e255bSThomas Huth                               bool enforce_bios)
2126286b419SDavid Hildenbrand {
2136286b419SDavid Hildenbrand     Object *new = object_new(TYPE_S390_IPL);
2146286b419SDavid Hildenbrand     DeviceState *dev = DEVICE(new);
2156286b419SDavid Hildenbrand 
2166286b419SDavid Hildenbrand     if (kernel_filename) {
2176286b419SDavid Hildenbrand         qdev_prop_set_string(dev, "kernel", kernel_filename);
2186286b419SDavid Hildenbrand     }
2196286b419SDavid Hildenbrand     if (initrd_filename) {
2206286b419SDavid Hildenbrand         qdev_prop_set_string(dev, "initrd", initrd_filename);
2216286b419SDavid Hildenbrand     }
2226286b419SDavid Hildenbrand     qdev_prop_set_string(dev, "cmdline", kernel_cmdline);
2236286b419SDavid Hildenbrand     qdev_prop_set_string(dev, "firmware", firmware);
2246286b419SDavid Hildenbrand     qdev_prop_set_bit(dev, "enforce_bios", enforce_bios);
2256286b419SDavid Hildenbrand     object_property_add_child(qdev_get_machine(), TYPE_S390_IPL,
226d2623129SMarkus Armbruster                               new);
2276286b419SDavid Hildenbrand     object_unref(new);
228ce189ab2SMarkus Armbruster     qdev_realize(dev, NULL, &error_fatal);
2296286b419SDavid Hildenbrand }
2306286b419SDavid Hildenbrand 
s390_create_virtio_net(BusState * bus,const char * name)2316286b419SDavid Hildenbrand static void s390_create_virtio_net(BusState *bus, const char *name)
2326286b419SDavid Hildenbrand {
2336286b419SDavid Hildenbrand     DeviceState *dev;
234999c870eSThomas Huth     int cnt = 0;
2356286b419SDavid Hildenbrand 
236646f87a8SDavid Woodhouse     while ((dev = qemu_create_nic_device(name, true, "virtio"))) {
237999c870eSThomas Huth         g_autofree char *childname = g_strdup_printf("%s[%d]", name, cnt++);
238999c870eSThomas Huth         object_property_add_child(OBJECT(bus), childname, OBJECT(dev));
2393e80f690SMarkus Armbruster         qdev_realize_and_unref(dev, bus, &error_fatal);
2406286b419SDavid Hildenbrand     }
2416286b419SDavid Hildenbrand }
2426286b419SDavid Hildenbrand 
s390_create_sclpconsole(SCLPDevice * sclp,const char * type,Chardev * chardev)243af4a3e32SCédric Le Goater static void s390_create_sclpconsole(SCLPDevice *sclp,
244af4a3e32SCédric Le Goater                                     const char *type, Chardev *chardev)
245052888f0SThomas Huth {
246af4a3e32SCédric Le Goater     SCLPEventFacility *ef = sclp->event_facility;
247af4a3e32SCédric Le Goater     BusState *ev_fac_bus = sclp_get_event_facility_bus(ef);
248052888f0SThomas Huth     DeviceState *dev;
249052888f0SThomas Huth 
2503e80f690SMarkus Armbruster     dev = qdev_new(type);
251af4a3e32SCédric Le Goater     object_property_add_child(OBJECT(ef), type, OBJECT(dev));
252052888f0SThomas Huth     qdev_prop_set_chr(dev, "chardev", chardev);
253c990c1f3SThomas Huth     qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);
254052888f0SThomas Huth }
255052888f0SThomas Huth 
ccw_init(MachineState * machine)25680d23275SDavid Hildenbrand static void ccw_init(MachineState *machine)
25780d23275SDavid Hildenbrand {
258a32b158aSThomas Huth     MachineClass *mc = MACHINE_GET_CLASS(machine);
259b350f6c8SCédric Le Goater     S390CcwMachineState *ms = S390_CCW_MACHINE(machine);
260a5c95808SCornelia Huck     int ret;
261a5c95808SCornelia Huck     VirtualCssBus *css_bus;
262c1843e20SChristian Borntraeger     DeviceState *dev;
263a5c95808SCornelia Huck 
264b350f6c8SCédric Le Goater     ms->sclp = SCLP(object_new(TYPE_SCLP));
265b350f6c8SCédric Le Goater     object_property_add_child(OBJECT(machine), TYPE_SCLP, OBJECT(ms->sclp));
266b350f6c8SCédric Le Goater     qdev_realize_and_unref(DEVICE(ms->sclp), NULL, &error_fatal);
267b350f6c8SCédric Le Goater 
2689138977bSDavid Hildenbrand     /* init memory + setup max page size. Required for the CPU model */
2693a12fc61SIgor Mammedov     s390_memory_init(machine->ram);
270a5c95808SCornelia Huck 
271d32bd032SCornelia Huck     /* init CPUs (incl. CPU model) early so s390_has_feature() works */
2723720d335SYi Min Zhao     s390_init_cpus(machine);
2733720d335SYi Min Zhao 
274651615d9SDavid Gibson     /* Need CPU model to be determined before we can set up PV */
275a14a2b01SXiaoyao Li     if (machine->cgs) {
276a14a2b01SXiaoyao Li         confidential_guest_kvm_init(machine->cgs, &error_fatal);
277a14a2b01SXiaoyao Li     }
278651615d9SDavid Gibson 
279c572d3f3SFei Li     s390_flic_init();
280c572d3f3SFei Li 
28174b4c74dSDavid Hildenbrand     /* init the SIGP facility */
28274b4c74dSDavid Hildenbrand     s390_init_sigp();
28374b4c74dSDavid Hildenbrand 
284a51b3153STony Krowiak     /* create AP bridge and bus(es) */
285a51b3153STony Krowiak     s390_init_ap();
286a51b3153STony Krowiak 
287a5c95808SCornelia Huck     /* get a BUS */
288a5c95808SCornelia Huck     css_bus = virtual_css_bus_init();
2893ef96221SMarcel Apfelbaum     s390_init_ipl_dev(machine->kernel_filename, machine->kernel_cmdline,
290f0344395SPaolo Bonzini                       machine->initrd_filename,
291f0344395SPaolo Bonzini                       machine->firmware ?: "s390-ccw.img",
292188e255bSThomas Huth                       true);
293a5c95808SCornelia Huck 
2943e80f690SMarkus Armbruster     dev = qdev_new(TYPE_S390_PCI_HOST_BRIDGE);
295c1843e20SChristian Borntraeger     object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
296d2623129SMarkus Armbruster                               OBJECT(dev));
2973c6ef471SMarkus Armbruster     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
2988cba80c3SFrank Blaschka 
299a5c95808SCornelia Huck     /* register hypercalls */
300a5c95808SCornelia Huck     virtio_ccw_register_hcalls();
301a5c95808SCornelia Huck 
3025e7164c5SDavid Hildenbrand     s390_enable_css_support(s390_cpu_addr2state(0));
30336699ab4SCornelia Huck 
304a5c95808SCornelia Huck     ret = css_create_css_image(VIRTUAL_CSSID, true);
305a5c95808SCornelia Huck     assert(ret == 0);
306a55ae466SPaolo Bonzini 
307489c909fSHalil Pasic     css_register_vmstate();
308a5c95808SCornelia Huck 
309a5c95808SCornelia Huck     /* Create VirtIO network adapters */
310a32b158aSThomas Huth     s390_create_virtio_net(BUS(css_bus), mc->default_nic);
3113f9e59bbSJason J. Herne 
312052888f0SThomas Huth     /* init consoles */
313052888f0SThomas Huth     if (serial_hd(0)) {
314af4a3e32SCédric Le Goater         s390_create_sclpconsole(ms->sclp, "sclpconsole", serial_hd(0));
315052888f0SThomas Huth     }
316052888f0SThomas Huth     if (serial_hd(1)) {
317af4a3e32SCédric Le Goater         s390_create_sclpconsole(ms->sclp, "sclplmconsole", serial_hd(1));
318052888f0SThomas Huth     }
319052888f0SThomas Huth 
3208046f374SDavid Hildenbrand     /* init the TOD clock */
3218046f374SDavid Hildenbrand     s390_init_tod();
322a5c95808SCornelia Huck }
323a5c95808SCornelia Huck 
s390_cpu_plug(HotplugHandler * hotplug_dev,DeviceState * dev,Error ** errp)324502edbf8SMatthew Rosato static void s390_cpu_plug(HotplugHandler *hotplug_dev,
325502edbf8SMatthew Rosato                         DeviceState *dev, Error **errp)
326502edbf8SMatthew Rosato {
32746ff64a8SZhao Liu     ERRP_GUARD();
3284dc3b151SDavid Hildenbrand     MachineState *ms = MACHINE(hotplug_dev);
329502edbf8SMatthew Rosato     S390CPU *cpu = S390_CPU(dev);
3304dc3b151SDavid Hildenbrand 
3314dc3b151SDavid Hildenbrand     g_assert(!ms->possible_cpus->cpus[cpu->env.core_id].cpu);
33297e03106SPhilippe Mathieu-Daudé     ms->possible_cpus->cpus[cpu->env.core_id].cpu = CPU(dev);
333c5b93430SDavid Hildenbrand 
334c809bbc8SPierre Morel     if (s390_has_topology()) {
335c809bbc8SPierre Morel         s390_topology_setup_cpu(ms, cpu, errp);
336c809bbc8SPierre Morel         if (*errp) {
337c809bbc8SPierre Morel             return;
338c809bbc8SPierre Morel         }
339c809bbc8SPierre Morel     }
340c809bbc8SPierre Morel 
341c5b93430SDavid Hildenbrand     if (dev->hotplugged) {
342c5b93430SDavid Hildenbrand         raise_irq_cpu_hotplug();
343c5b93430SDavid Hildenbrand     }
344502edbf8SMatthew Rosato }
345502edbf8SMatthew Rosato 
s390_do_cpu_ipl(CPUState * cs,run_on_cpu_data arg)346a30fb811SDavid Hildenbrand static inline void s390_do_cpu_ipl(CPUState *cs, run_on_cpu_data arg)
347a30fb811SDavid Hildenbrand {
348a30fb811SDavid Hildenbrand     S390CPU *cpu = S390_CPU(cs);
349a30fb811SDavid Hildenbrand 
350a30fb811SDavid Hildenbrand     s390_ipl_prepare_cpu(cpu);
351a30fb811SDavid Hildenbrand     s390_cpu_set_state(S390_CPU_STATE_OPERATING, cpu);
352a30fb811SDavid Hildenbrand }
353a30fb811SDavid Hildenbrand 
s390_machine_unprotect(S390CcwMachineState * ms)354c3347ed0SJanosch Frank static void s390_machine_unprotect(S390CcwMachineState *ms)
355c3347ed0SJanosch Frank {
35688693ab2SClaudio Imbrenda     if (!s390_pv_vm_try_disable_async(ms)) {
357c3347ed0SJanosch Frank         s390_pv_vm_disable();
358c3a073c6SClaudio Imbrenda     }
359c3347ed0SJanosch Frank     ms->pv = false;
360c8a7fc51SSteve Sistare     migrate_del_blocker(&pv_mig_blocker);
361b030958cSDavid Hildenbrand     ram_block_discard_disable(false);
362c3347ed0SJanosch Frank }
363c3347ed0SJanosch Frank 
s390_machine_protect(S390CcwMachineState * ms)364c3347ed0SJanosch Frank static int s390_machine_protect(S390CcwMachineState *ms)
365c3347ed0SJanosch Frank {
3660141e1b4SJanosch Frank     Error *local_err = NULL;
367c3347ed0SJanosch Frank     int rc;
368c3347ed0SJanosch Frank 
369b1697f63SJanosch Frank    /*
370b030958cSDavid Hildenbrand     * Discarding of memory in RAM blocks does not work as expected with
371b030958cSDavid Hildenbrand     * protected VMs. Sharing and unsharing pages would be required. Disable
372b030958cSDavid Hildenbrand     * it for now, until until we have a solution to make at least Linux
373b030958cSDavid Hildenbrand     * guests either support it (e.g., virtio-balloon) or fail gracefully.
374b1697f63SJanosch Frank     */
375b030958cSDavid Hildenbrand     rc = ram_block_discard_disable(true);
376b030958cSDavid Hildenbrand     if (rc) {
377b030958cSDavid Hildenbrand         error_report("protected VMs: cannot disable RAM discard");
378b030958cSDavid Hildenbrand         return rc;
379b030958cSDavid Hildenbrand     }
380b030958cSDavid Hildenbrand 
3810141e1b4SJanosch Frank     error_setg(&pv_mig_blocker,
38244ee69eaSThomas Huth                "protected VMs are currently not migratable.");
383c8a7fc51SSteve Sistare     rc = migrate_add_blocker(&pv_mig_blocker, &local_err);
3840141e1b4SJanosch Frank     if (rc) {
385b030958cSDavid Hildenbrand         ram_block_discard_disable(false);
3860141e1b4SJanosch Frank         error_report_err(local_err);
3870141e1b4SJanosch Frank         return rc;
3880141e1b4SJanosch Frank     }
3890141e1b4SJanosch Frank 
390c3347ed0SJanosch Frank     /* Create SE VM */
391c3347ed0SJanosch Frank     rc = s390_pv_vm_enable();
392c3347ed0SJanosch Frank     if (rc) {
393b030958cSDavid Hildenbrand         ram_block_discard_disable(false);
394c8a7fc51SSteve Sistare         migrate_del_blocker(&pv_mig_blocker);
395c3347ed0SJanosch Frank         return rc;
396c3347ed0SJanosch Frank     }
397c3347ed0SJanosch Frank 
398c3347ed0SJanosch Frank     ms->pv = true;
399c3347ed0SJanosch Frank 
40003d83ecfSJanosch Frank     /* Will return 0 if API is not available since it's not vital */
40103d83ecfSJanosch Frank     rc = s390_pv_query_info();
40203d83ecfSJanosch Frank     if (rc) {
40303d83ecfSJanosch Frank         goto out_err;
40403d83ecfSJanosch Frank     }
40503d83ecfSJanosch Frank 
406c3347ed0SJanosch Frank     /* Set SE header and unpack */
4077af51621SThomas Huth     rc = s390_ipl_prepare_pv_header(&local_err);
408c3347ed0SJanosch Frank     if (rc) {
409c3347ed0SJanosch Frank         goto out_err;
410c3347ed0SJanosch Frank     }
411c3347ed0SJanosch Frank 
412c3347ed0SJanosch Frank     /* Decrypt image */
413c3347ed0SJanosch Frank     rc = s390_ipl_pv_unpack();
414c3347ed0SJanosch Frank     if (rc) {
415c3347ed0SJanosch Frank         goto out_err;
416c3347ed0SJanosch Frank     }
417c3347ed0SJanosch Frank 
418c3347ed0SJanosch Frank     /* Verify integrity */
419c3347ed0SJanosch Frank     rc = s390_pv_verify();
420c3347ed0SJanosch Frank     if (rc) {
421c3347ed0SJanosch Frank         goto out_err;
422c3347ed0SJanosch Frank     }
423c3347ed0SJanosch Frank     return rc;
424c3347ed0SJanosch Frank 
425c3347ed0SJanosch Frank out_err:
4267af51621SThomas Huth     if (local_err) {
4277af51621SThomas Huth         error_report_err(local_err);
4287af51621SThomas Huth     }
429c3347ed0SJanosch Frank     s390_machine_unprotect(ms);
430c3347ed0SJanosch Frank     return rc;
431c3347ed0SJanosch Frank }
432c3347ed0SJanosch Frank 
s390_pv_prepare_reset(S390CcwMachineState * ms)433c3347ed0SJanosch Frank static void s390_pv_prepare_reset(S390CcwMachineState *ms)
434c3347ed0SJanosch Frank {
435c3347ed0SJanosch Frank     CPUState *cs;
436c3347ed0SJanosch Frank 
437c3347ed0SJanosch Frank     if (!s390_is_pv()) {
438c3347ed0SJanosch Frank         return;
439c3347ed0SJanosch Frank     }
440c3347ed0SJanosch Frank     /* Unsharing requires all cpus to be stopped */
441c3347ed0SJanosch Frank     CPU_FOREACH(cs) {
442c3347ed0SJanosch Frank         s390_cpu_set_state(S390_CPU_STATE_STOPPED, S390_CPU(cs));
443c3347ed0SJanosch Frank     }
444c3347ed0SJanosch Frank     s390_pv_unshare();
4459a432597SJanosch Frank     s390_pv_prep_reset();
446c3347ed0SJanosch Frank }
447c3347ed0SJanosch Frank 
s390_machine_reset(MachineState * machine,ResetType type)4481b063fe2SJuraj Marcin static void s390_machine_reset(MachineState *machine, ResetType type)
4496286b419SDavid Hildenbrand {
450c3347ed0SJanosch Frank     S390CcwMachineState *ms = S390_CCW_MACHINE(machine);
451a30fb811SDavid Hildenbrand     enum s390_reset reset_type;
452a30fb811SDavid Hildenbrand     CPUState *cs, *t;
453c3347ed0SJanosch Frank     S390CPU *cpu;
4546286b419SDavid Hildenbrand 
455a30fb811SDavid Hildenbrand     /* get the reset parameters, reset them once done */
456a30fb811SDavid Hildenbrand     s390_ipl_get_reset_request(&cs, &reset_type);
457a30fb811SDavid Hildenbrand 
458a30fb811SDavid Hildenbrand     /* all CPUs are paused and synchronized at this point */
4596286b419SDavid Hildenbrand     s390_cmma_reset();
460a30fb811SDavid Hildenbrand 
461c3347ed0SJanosch Frank     cpu = S390_CPU(cs);
462c3347ed0SJanosch Frank 
463a30fb811SDavid Hildenbrand     switch (reset_type) {
464a30fb811SDavid Hildenbrand     case S390_RESET_EXTERNAL:
465a30fb811SDavid Hildenbrand     case S390_RESET_REIPL:
466ef153590SJanosch Frank         /*
467ef153590SJanosch Frank          * Reset the subsystem which includes a AP reset. If a PV
468ef153590SJanosch Frank          * guest had APQNs attached the AP reset is a prerequisite to
469ef153590SJanosch Frank          * unprotecting since the UV checks if all APQNs are reset.
470ef153590SJanosch Frank          */
471ef153590SJanosch Frank         subsystem_reset();
472c3347ed0SJanosch Frank         if (s390_is_pv()) {
473c3347ed0SJanosch Frank             s390_machine_unprotect(ms);
474c3347ed0SJanosch Frank         }
475c3347ed0SJanosch Frank 
476ef153590SJanosch Frank         /*
477ef153590SJanosch Frank          * Device reset includes CPU clear resets so this has to be
478ef153590SJanosch Frank          * done AFTER the unprotect call above.
479ef153590SJanosch Frank          */
4801b063fe2SJuraj Marcin         qemu_devices_reset(type);
4816286b419SDavid Hildenbrand         s390_crypto_reset();
4826286b419SDavid Hildenbrand 
483a30fb811SDavid Hildenbrand         /* configure and start the ipl CPU only */
484a30fb811SDavid Hildenbrand         run_on_cpu(cs, s390_do_cpu_ipl, RUN_ON_CPU_NULL);
485a30fb811SDavid Hildenbrand         break;
486a30fb811SDavid Hildenbrand     case S390_RESET_MODIFIED_CLEAR:
487c3347ed0SJanosch Frank         /*
48844ee69eaSThomas Huth          * Subsystem reset needs to be done before we unshare memory
489c3347ed0SJanosch Frank          * and lose access to VIRTIO structures in guest memory.
490c3347ed0SJanosch Frank          */
491c3347ed0SJanosch Frank         subsystem_reset();
492c3347ed0SJanosch Frank         s390_crypto_reset();
493c3347ed0SJanosch Frank         s390_pv_prepare_reset(ms);
494a30fb811SDavid Hildenbrand         CPU_FOREACH(t) {
495a30fb811SDavid Hildenbrand             run_on_cpu(t, s390_do_cpu_full_reset, RUN_ON_CPU_NULL);
496a30fb811SDavid Hildenbrand         }
497a30fb811SDavid Hildenbrand         run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
498a30fb811SDavid Hildenbrand         break;
499a30fb811SDavid Hildenbrand     case S390_RESET_LOAD_NORMAL:
500c3347ed0SJanosch Frank         /*
50144ee69eaSThomas Huth          * Subsystem reset needs to be done before we unshare memory
502c3347ed0SJanosch Frank          * and lose access to VIRTIO structures in guest memory.
503c3347ed0SJanosch Frank          */
504c3347ed0SJanosch Frank         subsystem_reset();
505c3347ed0SJanosch Frank         s390_pv_prepare_reset(ms);
506a30fb811SDavid Hildenbrand         CPU_FOREACH(t) {
507ec922733SJanosch Frank             if (t == cs) {
508ec922733SJanosch Frank                 continue;
509ec922733SJanosch Frank             }
510a30fb811SDavid Hildenbrand             run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
511a30fb811SDavid Hildenbrand         }
512a30fb811SDavid Hildenbrand         run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
513a30fb811SDavid Hildenbrand         run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
514a30fb811SDavid Hildenbrand         break;
515c3347ed0SJanosch Frank     case S390_RESET_PV: /* Subcode 10 */
516c3347ed0SJanosch Frank         subsystem_reset();
517c3347ed0SJanosch Frank         s390_crypto_reset();
518c3347ed0SJanosch Frank 
519c3347ed0SJanosch Frank         CPU_FOREACH(t) {
520c3347ed0SJanosch Frank             if (t == cs) {
521c3347ed0SJanosch Frank                 continue;
522c3347ed0SJanosch Frank             }
523c3347ed0SJanosch Frank             run_on_cpu(t, s390_do_cpu_full_reset, RUN_ON_CPU_NULL);
524c3347ed0SJanosch Frank         }
525c3347ed0SJanosch Frank         run_on_cpu(cs, s390_do_cpu_reset, RUN_ON_CPU_NULL);
526c3347ed0SJanosch Frank 
527c3347ed0SJanosch Frank         if (s390_machine_protect(ms)) {
528fbc1384cSChristian Borntraeger             s390_pv_inject_reset_error(cs);
529c3347ed0SJanosch Frank             /*
530c3347ed0SJanosch Frank              * Continue after the diag308 so the guest knows something
531c3347ed0SJanosch Frank              * went wrong.
532c3347ed0SJanosch Frank              */
533c3347ed0SJanosch Frank             s390_cpu_set_state(S390_CPU_STATE_OPERATING, cpu);
534c3347ed0SJanosch Frank             return;
535c3347ed0SJanosch Frank         }
536c3347ed0SJanosch Frank 
537c3347ed0SJanosch Frank         run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
538c3347ed0SJanosch Frank         break;
539a30fb811SDavid Hildenbrand     default:
540a30fb811SDavid Hildenbrand         g_assert_not_reached();
541a30fb811SDavid Hildenbrand     }
542e2c6cd56SCollin Walling 
543e2c6cd56SCollin Walling     CPU_FOREACH(t) {
544e2c6cd56SCollin Walling         run_on_cpu(t, s390_do_cpu_set_diag318, RUN_ON_CPU_HOST_ULONG(0));
545e2c6cd56SCollin Walling     }
546a30fb811SDavid Hildenbrand     s390_ipl_clear_reset_request();
5476286b419SDavid Hildenbrand }
5486286b419SDavid Hildenbrand 
s390_machine_device_plug(HotplugHandler * hotplug_dev,DeviceState * dev,Error ** errp)549502edbf8SMatthew Rosato static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
550502edbf8SMatthew Rosato                                      DeviceState *dev, Error **errp)
551502edbf8SMatthew Rosato {
552502edbf8SMatthew Rosato     if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
553502edbf8SMatthew Rosato         s390_cpu_plug(hotplug_dev, dev, errp);
554502edbf8SMatthew Rosato     }
555502edbf8SMatthew Rosato }
556502edbf8SMatthew Rosato 
s390_machine_device_unplug_request(HotplugHandler * hotplug_dev,DeviceState * dev,Error ** errp)557f2f3beb0SDavid Hildenbrand static void s390_machine_device_unplug_request(HotplugHandler *hotplug_dev,
558f2f3beb0SDavid Hildenbrand                                                DeviceState *dev, Error **errp)
559f2f3beb0SDavid Hildenbrand {
560f2f3beb0SDavid Hildenbrand     if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
561f2f3beb0SDavid Hildenbrand         error_setg(errp, "CPU hot unplug not supported on this machine");
562f2f3beb0SDavid Hildenbrand         return;
563f2f3beb0SDavid Hildenbrand     }
564f2f3beb0SDavid Hildenbrand }
565f2f3beb0SDavid Hildenbrand 
s390_cpu_index_to_props(MachineState * ms,unsigned cpu_index)56681ce6aa5SDavid Hildenbrand static CpuInstanceProperties s390_cpu_index_to_props(MachineState *ms,
5674dc3b151SDavid Hildenbrand                                                      unsigned cpu_index)
5684dc3b151SDavid Hildenbrand {
56981ce6aa5SDavid Hildenbrand     MachineClass *mc = MACHINE_GET_CLASS(ms);
57081ce6aa5SDavid Hildenbrand     const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms);
5714dc3b151SDavid Hildenbrand 
57281ce6aa5SDavid Hildenbrand     assert(cpu_index < possible_cpus->len);
57381ce6aa5SDavid Hildenbrand     return possible_cpus->cpus[cpu_index].props;
5744dc3b151SDavid Hildenbrand }
5754dc3b151SDavid Hildenbrand 
s390_possible_cpu_arch_ids(MachineState * ms)5764dc3b151SDavid Hildenbrand static const CPUArchIdList *s390_possible_cpu_arch_ids(MachineState *ms)
5774dc3b151SDavid Hildenbrand {
5784dc3b151SDavid Hildenbrand     int i;
579ae71ed86SLike Xu     unsigned int max_cpus = ms->smp.max_cpus;
5804dc3b151SDavid Hildenbrand 
5814dc3b151SDavid Hildenbrand     if (ms->possible_cpus) {
5824dc3b151SDavid Hildenbrand         g_assert(ms->possible_cpus && ms->possible_cpus->len == max_cpus);
5834dc3b151SDavid Hildenbrand         return ms->possible_cpus;
5844dc3b151SDavid Hildenbrand     }
5854dc3b151SDavid Hildenbrand 
5864dc3b151SDavid Hildenbrand     ms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) +
5874dc3b151SDavid Hildenbrand                                   sizeof(CPUArchId) * max_cpus);
5884dc3b151SDavid Hildenbrand     ms->possible_cpus->len = max_cpus;
5894dc3b151SDavid Hildenbrand     for (i = 0; i < ms->possible_cpus->len; i++) {
590c809bbc8SPierre Morel         CpuInstanceProperties *props = &ms->possible_cpus->cpus[i].props;
591c809bbc8SPierre Morel 
592d342eb76SIgor Mammedov         ms->possible_cpus->cpus[i].type = ms->cpu_type;
5934dc3b151SDavid Hildenbrand         ms->possible_cpus->cpus[i].vcpus_count = 1;
5944dc3b151SDavid Hildenbrand         ms->possible_cpus->cpus[i].arch_id = i;
595c809bbc8SPierre Morel 
596c809bbc8SPierre Morel         props->has_core_id = true;
597c809bbc8SPierre Morel         props->core_id = i;
598c809bbc8SPierre Morel         props->has_socket_id = true;
599c809bbc8SPierre Morel         props->socket_id = s390_std_socket(i, &ms->smp);
600c809bbc8SPierre Morel         props->has_book_id = true;
601c809bbc8SPierre Morel         props->book_id = s390_std_book(i, &ms->smp);
602c809bbc8SPierre Morel         props->has_drawer_id = true;
603c809bbc8SPierre Morel         props->drawer_id = s390_std_drawer(i, &ms->smp);
6044dc3b151SDavid Hildenbrand     }
6054dc3b151SDavid Hildenbrand 
6064dc3b151SDavid Hildenbrand     return ms->possible_cpus;
6074dc3b151SDavid Hildenbrand }
6084dc3b151SDavid Hildenbrand 
s390_get_hotplug_handler(MachineState * machine,DeviceState * dev)609502edbf8SMatthew Rosato static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
610502edbf8SMatthew Rosato                                                 DeviceState *dev)
611502edbf8SMatthew Rosato {
612502edbf8SMatthew Rosato     if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
613502edbf8SMatthew Rosato         return HOTPLUG_HANDLER(machine);
614502edbf8SMatthew Rosato     }
615502edbf8SMatthew Rosato     return NULL;
616502edbf8SMatthew Rosato }
617502edbf8SMatthew Rosato 
s390_nmi(NMIState * n,int cpu_index,Error ** errp)6186286b419SDavid Hildenbrand static void s390_nmi(NMIState *n, int cpu_index, Error **errp)
6196286b419SDavid Hildenbrand {
6206286b419SDavid Hildenbrand     CPUState *cs = qemu_get_cpu(cpu_index);
6216286b419SDavid Hildenbrand 
6220fc60ca5SDavid Hildenbrand     s390_cpu_restart(S390_CPU(cs));
6236286b419SDavid Hildenbrand }
6246286b419SDavid Hildenbrand 
s390_fixup_ram_size(ram_addr_t sz)6255c30ef93SChristian Borntraeger static ram_addr_t s390_fixup_ram_size(ram_addr_t sz)
6265c30ef93SChristian Borntraeger {
6275c30ef93SChristian Borntraeger     /* same logic as in sclp.c */
6285c30ef93SChristian Borntraeger     int increment_size = 20;
6295c30ef93SChristian Borntraeger     ram_addr_t newsz;
6305c30ef93SChristian Borntraeger 
6315c30ef93SChristian Borntraeger     while ((sz >> increment_size) > MAX_STORAGE_INCREMENTS) {
6325c30ef93SChristian Borntraeger         increment_size++;
6335c30ef93SChristian Borntraeger     }
6345c30ef93SChristian Borntraeger     newsz = sz >> increment_size << increment_size;
6355c30ef93SChristian Borntraeger 
6365c30ef93SChristian Borntraeger     if (sz != newsz) {
6375c30ef93SChristian Borntraeger         qemu_printf("Ram size %" PRIu64 "MB was fixed up to %" PRIu64
6385c30ef93SChristian Borntraeger                     "MB to match machine restrictions. Consider updating "
6395c30ef93SChristian Borntraeger                     "the guest definition.\n", (uint64_t) (sz / MiB),
6405c30ef93SChristian Borntraeger                     (uint64_t) (newsz / MiB));
6415c30ef93SChristian Borntraeger     }
6425c30ef93SChristian Borntraeger     return newsz;
6435c30ef93SChristian Borntraeger }
6445c30ef93SChristian Borntraeger 
machine_get_aes_key_wrap(Object * obj,Error ** errp)6452eb1cd07STony Krowiak static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
6462eb1cd07STony Krowiak {
6472eb1cd07STony Krowiak     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
6482eb1cd07STony Krowiak 
6492eb1cd07STony Krowiak     return ms->aes_key_wrap;
6502eb1cd07STony Krowiak }
6512eb1cd07STony Krowiak 
machine_set_aes_key_wrap(Object * obj,bool value,Error ** errp)6522eb1cd07STony Krowiak static inline void machine_set_aes_key_wrap(Object *obj, bool value,
6532eb1cd07STony Krowiak                                             Error **errp)
6542eb1cd07STony Krowiak {
6552eb1cd07STony Krowiak     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
6562eb1cd07STony Krowiak 
6572eb1cd07STony Krowiak     ms->aes_key_wrap = value;
6582eb1cd07STony Krowiak }
6592eb1cd07STony Krowiak 
machine_get_dea_key_wrap(Object * obj,Error ** errp)6602eb1cd07STony Krowiak static inline bool machine_get_dea_key_wrap(Object *obj, Error **errp)
6612eb1cd07STony Krowiak {
6622eb1cd07STony Krowiak     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
6632eb1cd07STony Krowiak 
6642eb1cd07STony Krowiak     return ms->dea_key_wrap;
6652eb1cd07STony Krowiak }
6662eb1cd07STony Krowiak 
machine_set_dea_key_wrap(Object * obj,bool value,Error ** errp)6672eb1cd07STony Krowiak static inline void machine_set_dea_key_wrap(Object *obj, bool value,
6682eb1cd07STony Krowiak                                             Error **errp)
6692eb1cd07STony Krowiak {
6702eb1cd07STony Krowiak     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
6712eb1cd07STony Krowiak 
6722eb1cd07STony Krowiak     ms->dea_key_wrap = value;
6732eb1cd07STony Krowiak }
6742eb1cd07STony Krowiak 
675cec8bbf7SHalil Pasic static S390CcwMachineClass *current_mc;
676cec8bbf7SHalil Pasic 
6773e0209bbSThomas Huth /*
6783e0209bbSThomas Huth  * Get the class of the s390-ccw-virtio machine that is currently in use.
6793e0209bbSThomas Huth  * Note: libvirt is using the "none" machine to probe for the features of the
6803e0209bbSThomas Huth  * host CPU, so in case this is called with the "none" machine, the function
6813e0209bbSThomas Huth  * returns the TYPE_S390_CCW_MACHINE base class. In this base class, all the
6823e0209bbSThomas Huth  * various "*_allowed" variables are enabled, so that the *_allowed() wrappers
6833e0209bbSThomas Huth  * below return the correct default value for the "none" machine.
6843e0209bbSThomas Huth  *
6853e0209bbSThomas Huth  * Attention! Do *not* add additional new wrappers for CPU features (e.g. like
6863e0209bbSThomas Huth  * the ri_allowed() wrapper) via this mechanism anymore. CPU features should
6873e0209bbSThomas Huth  * be handled via the CPU models, i.e. checking with cpu_model_allowed() during
6883e0209bbSThomas Huth  * CPU initialization and s390_has_feat() later should be sufficient.
6893e0209bbSThomas Huth  */
get_machine_class(void)690cec8bbf7SHalil Pasic static S390CcwMachineClass *get_machine_class(void)
691cec8bbf7SHalil Pasic {
692cec8bbf7SHalil Pasic     if (unlikely(!current_mc)) {
693cec8bbf7SHalil Pasic         /*
694cec8bbf7SHalil Pasic         * No s390 ccw machine was instantiated, we are likely to
695cec8bbf7SHalil Pasic         * be called for the 'none' machine. The properties will
696cec8bbf7SHalil Pasic         * have their after-initialization values.
697cec8bbf7SHalil Pasic         */
698b1af5872SEduardo Habkost         current_mc = S390_CCW_MACHINE_CLASS(
699cec8bbf7SHalil Pasic                      object_class_by_name(TYPE_S390_CCW_MACHINE));
700cec8bbf7SHalil Pasic     }
701cec8bbf7SHalil Pasic     return current_mc;
702cec8bbf7SHalil Pasic }
703cec8bbf7SHalil Pasic 
ri_allowed(void)7049700230bSFan Zhang bool ri_allowed(void)
7059700230bSFan Zhang {
706cec8bbf7SHalil Pasic     return get_machine_class()->ri_allowed;
7079700230bSFan Zhang }
7089700230bSFan Zhang 
cpu_model_allowed(void)709e73316d5SChristian Borntraeger bool cpu_model_allowed(void)
710e73316d5SChristian Borntraeger {
711cec8bbf7SHalil Pasic     return get_machine_class()->cpu_model_allowed;
712e73316d5SChristian Borntraeger }
713e73316d5SChristian Borntraeger 
hpage_1m_allowed(void)71428221f9cSJanosch Frank bool hpage_1m_allowed(void)
71528221f9cSJanosch Frank {
71628221f9cSJanosch Frank     return get_machine_class()->hpage_1m_allowed;
71728221f9cSJanosch Frank }
71828221f9cSJanosch Frank 
machine_get_loadparm(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)7191fd396e3SPierre Morel static void machine_get_loadparm(Object *obj, Visitor *v,
7201fd396e3SPierre Morel                                  const char *name, void *opaque,
7211fd396e3SPierre Morel                                  Error **errp)
7227104bae9SFarhan Ali {
7237104bae9SFarhan Ali     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
7241fd396e3SPierre Morel     char *str = g_strndup((char *) ms->loadparm, sizeof(ms->loadparm));
7257104bae9SFarhan Ali 
7261fd396e3SPierre Morel     visit_type_str(v, name, &str, errp);
7271fd396e3SPierre Morel     g_free(str);
7287104bae9SFarhan Ali }
7297104bae9SFarhan Ali 
machine_set_loadparm(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)7301fd396e3SPierre Morel static void machine_set_loadparm(Object *obj, Visitor *v,
7311fd396e3SPierre Morel                                  const char *name, void *opaque,
7321fd396e3SPierre Morel                                  Error **errp)
7337104bae9SFarhan Ali {
7347104bae9SFarhan Ali     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
7351fd396e3SPierre Morel     char *val;
7367104bae9SFarhan Ali 
7371fd396e3SPierre Morel     if (!visit_type_str(v, name, &val, errp)) {
7381fd396e3SPierre Morel         return;
7391fd396e3SPierre Morel     }
7401fd396e3SPierre Morel 
741bb185de4SJared Rossi     s390_ipl_fmt_loadparm(ms->loadparm, val, errp);
7427104bae9SFarhan Ali }
7431fd396e3SPierre Morel 
ccw_machine_class_init(ObjectClass * oc,void * data)7441fd396e3SPierre Morel static void ccw_machine_class_init(ObjectClass *oc, void *data)
7452eb1cd07STony Krowiak {
7461fd396e3SPierre Morel     MachineClass *mc = MACHINE_CLASS(oc);
7471fd396e3SPierre Morel     NMIClass *nc = NMI_CLASS(oc);
7481fd396e3SPierre Morel     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
7491fd396e3SPierre Morel     S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
7501fd396e3SPierre Morel 
7511fd396e3SPierre Morel     s390mc->ri_allowed = true;
7521fd396e3SPierre Morel     s390mc->cpu_model_allowed = true;
7531fd396e3SPierre Morel     s390mc->hpage_1m_allowed = true;
7546393b299SPierre Morel     s390mc->max_threads = 1;
7551fd396e3SPierre Morel     mc->init = ccw_init;
7561fd396e3SPierre Morel     mc->reset = s390_machine_reset;
7571fd396e3SPierre Morel     mc->block_default_type = IF_VIRTIO;
7581fd396e3SPierre Morel     mc->no_cdrom = 1;
7591fd396e3SPierre Morel     mc->no_floppy = 1;
7601fd396e3SPierre Morel     mc->no_parallel = 1;
7611fd396e3SPierre Morel     mc->no_sdcard = 1;
7621fd396e3SPierre Morel     mc->max_cpus = S390_MAX_CPUS;
7631fd396e3SPierre Morel     mc->has_hotpluggable_cpus = true;
7645de1aff2SPierre Morel     mc->smp_props.books_supported = true;
7655de1aff2SPierre Morel     mc->smp_props.drawers_supported = true;
7661fd396e3SPierre Morel     assert(!mc->get_hotplug_handler);
7671fd396e3SPierre Morel     mc->get_hotplug_handler = s390_get_hotplug_handler;
7681fd396e3SPierre Morel     mc->cpu_index_to_instance_props = s390_cpu_index_to_props;
7691fd396e3SPierre Morel     mc->possible_cpu_arch_ids = s390_possible_cpu_arch_ids;
7701fd396e3SPierre Morel     /* it is overridden with 'host' cpu *in kvm_arch_init* */
7711fd396e3SPierre Morel     mc->default_cpu_type = S390_CPU_TYPE_NAME("qemu");
7721fd396e3SPierre Morel     hc->plug = s390_machine_device_plug;
7731fd396e3SPierre Morel     hc->unplug_request = s390_machine_device_unplug_request;
7741fd396e3SPierre Morel     nc->nmi_monitor_handler = s390_nmi;
7751fd396e3SPierre Morel     mc->default_ram_id = "s390.ram";
776a32b158aSThomas Huth     mc->default_nic = "virtio-net-ccw";
7771fd396e3SPierre Morel 
7781fd396e3SPierre Morel     object_class_property_add_bool(oc, "aes-key-wrap",
7792eb1cd07STony Krowiak                                    machine_get_aes_key_wrap,
780d2623129SMarkus Armbruster                                    machine_set_aes_key_wrap);
7811fd396e3SPierre Morel     object_class_property_set_description(oc, "aes-key-wrap",
7827eecec7dSMarkus Armbruster             "enable/disable AES key wrapping using the CPACF wrapping key");
7832eb1cd07STony Krowiak 
7841fd396e3SPierre Morel     object_class_property_add_bool(oc, "dea-key-wrap",
7852eb1cd07STony Krowiak                                    machine_get_dea_key_wrap,
786d2623129SMarkus Armbruster                                    machine_set_dea_key_wrap);
7871fd396e3SPierre Morel     object_class_property_set_description(oc, "dea-key-wrap",
7887eecec7dSMarkus Armbruster             "enable/disable DEA key wrapping using the CPACF wrapping key");
7891fd396e3SPierre Morel 
7901fd396e3SPierre Morel     object_class_property_add(oc, "loadparm", "loadparm",
7911fd396e3SPierre Morel                               machine_get_loadparm, machine_set_loadparm,
7921fd396e3SPierre Morel                               NULL, NULL);
7931fd396e3SPierre Morel     object_class_property_set_description(oc, "loadparm",
7947104bae9SFarhan Ali             "Up to 8 chars in set of [A-Za-z0-9. ] (lower case chars converted"
7957104bae9SFarhan Ali             " to upper case) to pass to machine loader, boot manager,"
7967eecec7dSMarkus Armbruster             " and guest kernel");
7971fd396e3SPierre Morel }
7981fd396e3SPierre Morel 
s390_machine_initfn(Object * obj)7991fd396e3SPierre Morel static inline void s390_machine_initfn(Object *obj)
8001fd396e3SPierre Morel {
8011fd396e3SPierre Morel     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
8021fd396e3SPierre Morel 
8031fd396e3SPierre Morel     ms->aes_key_wrap = true;
8041fd396e3SPierre Morel     ms->dea_key_wrap = true;
8052eb1cd07STony Krowiak }
8062eb1cd07STony Krowiak 
807d07aa7c7SAlexey Kardashevskiy static const TypeInfo ccw_machine_info = {
808d07aa7c7SAlexey Kardashevskiy     .name          = TYPE_S390_CCW_MACHINE,
809d07aa7c7SAlexey Kardashevskiy     .parent        = TYPE_MACHINE,
810c4d3c0a2SChristian Borntraeger     .abstract      = true,
8112eb1cd07STony Krowiak     .instance_size = sizeof(S390CcwMachineState),
8122eb1cd07STony Krowiak     .instance_init = s390_machine_initfn,
8139700230bSFan Zhang     .class_size = sizeof(S390CcwMachineClass),
814d07aa7c7SAlexey Kardashevskiy     .class_init    = ccw_machine_class_init,
8153dd7852fSAlexey Kardashevskiy     .interfaces = (InterfaceInfo[]) {
8163dd7852fSAlexey Kardashevskiy         { TYPE_NMI },
817502edbf8SMatthew Rosato         { TYPE_HOTPLUG_HANDLER},
8183dd7852fSAlexey Kardashevskiy         { }
8193dd7852fSAlexey Kardashevskiy     },
820d07aa7c7SAlexey Kardashevskiy };
821d07aa7c7SAlexey Kardashevskiy 
8227fb1e06aSDaniel P. Berrangé #define DEFINE_CCW_MACHINE_IMPL(latest, ...)                                  \
8237fb1e06aSDaniel P. Berrangé     static void MACHINE_VER_SYM(class_init, ccw, __VA_ARGS__)(                \
8247fb1e06aSDaniel P. Berrangé         ObjectClass *oc,                                                      \
8254fca6548SJanosch Frank         void *data)                                                           \
8264fca6548SJanosch Frank     {                                                                         \
8274fca6548SJanosch Frank         MachineClass *mc = MACHINE_CLASS(oc);                                 \
8287fb1e06aSDaniel P. Berrangé         MACHINE_VER_SYM(class_options, ccw, __VA_ARGS__)(mc);                 \
8297fb1e06aSDaniel P. Berrangé         mc->desc = "Virtual s390x machine (version " MACHINE_VER_STR(__VA_ARGS__) ")"; \
8308d3122a8SDaniel P. Berrangé         MACHINE_VER_DEPRECATION(__VA_ARGS__);                                 \
8314fca6548SJanosch Frank         if (latest) {                                                         \
8324fca6548SJanosch Frank             mc->alias = "s390-ccw-virtio";                                    \
833ea0ac7f6SPhilippe Mathieu-Daudé             mc->is_default = true;                                            \
8344fca6548SJanosch Frank         }                                                                     \
8354fca6548SJanosch Frank     }                                                                         \
8367fb1e06aSDaniel P. Berrangé     static void MACHINE_VER_SYM(instance_init, ccw, __VA_ARGS__)(Object *obj) \
8374fca6548SJanosch Frank     {                                                                         \
8384fca6548SJanosch Frank         MachineState *machine = MACHINE(obj);                                 \
839b1af5872SEduardo Habkost         current_mc = S390_CCW_MACHINE_CLASS(MACHINE_GET_CLASS(machine));      \
8407fb1e06aSDaniel P. Berrangé         MACHINE_VER_SYM(instance_options, ccw, __VA_ARGS__)(machine);         \
8414fca6548SJanosch Frank     }                                                                         \
8427fb1e06aSDaniel P. Berrangé     static const TypeInfo MACHINE_VER_SYM(info, ccw, __VA_ARGS__) =           \
8434fca6548SJanosch Frank     {                                                                         \
8447fb1e06aSDaniel P. Berrangé         .name = MACHINE_VER_TYPE_NAME("s390-ccw-virtio", __VA_ARGS__),        \
8457fb1e06aSDaniel P. Berrangé         .parent = TYPE_S390_CCW_MACHINE,                                      \
8467fb1e06aSDaniel P. Berrangé         .class_init = MACHINE_VER_SYM(class_init, ccw, __VA_ARGS__),          \
8477fb1e06aSDaniel P. Berrangé         .instance_init = MACHINE_VER_SYM(instance_init, ccw, __VA_ARGS__),    \
8487fb1e06aSDaniel P. Berrangé     };                                                                        \
8497fb1e06aSDaniel P. Berrangé     static void MACHINE_VER_SYM(register, ccw, __VA_ARGS__)(void)             \
8507fb1e06aSDaniel P. Berrangé     {                                                                         \
851a391eeb1SDaniel P. Berrangé         MACHINE_VER_DELETION(__VA_ARGS__);                                    \
8527fb1e06aSDaniel P. Berrangé         type_register_static(&MACHINE_VER_SYM(info, ccw, __VA_ARGS__));       \
8534fca6548SJanosch Frank     }                                                                         \
8547fb1e06aSDaniel P. Berrangé     type_init(MACHINE_VER_SYM(register, ccw, __VA_ARGS__))
8557fb1e06aSDaniel P. Berrangé 
8567fb1e06aSDaniel P. Berrangé #define DEFINE_CCW_MACHINE_AS_LATEST(major, minor) \
8577fb1e06aSDaniel P. Berrangé     DEFINE_CCW_MACHINE_IMPL(true, major, minor)
8587fb1e06aSDaniel P. Berrangé 
8597fb1e06aSDaniel P. Berrangé #define DEFINE_CCW_MACHINE(major, minor) \
8607fb1e06aSDaniel P. Berrangé     DEFINE_CCW_MACHINE_IMPL(false, major, minor)
8617fb1e06aSDaniel P. Berrangé 
8624fca6548SJanosch Frank 
ccw_machine_9_2_instance_options(MachineState * machine)863fb6051e7SCornelia Huck static void ccw_machine_9_2_instance_options(MachineState *machine)
864fb6051e7SCornelia Huck {
865fb6051e7SCornelia Huck }
866fb6051e7SCornelia Huck 
ccw_machine_9_2_class_options(MachineClass * mc)867fb6051e7SCornelia Huck static void ccw_machine_9_2_class_options(MachineClass *mc)
868fb6051e7SCornelia Huck {
869fb6051e7SCornelia Huck }
870fb6051e7SCornelia Huck DEFINE_CCW_MACHINE_AS_LATEST(9, 2);
871fb6051e7SCornelia Huck 
ccw_machine_9_1_instance_options(MachineState * machine)87285fa9acdSPaolo Bonzini static void ccw_machine_9_1_instance_options(MachineState *machine)
87385fa9acdSPaolo Bonzini {
874fb6051e7SCornelia Huck     ccw_machine_9_2_instance_options(machine);
87585fa9acdSPaolo Bonzini }
87685fa9acdSPaolo Bonzini 
ccw_machine_9_1_class_options(MachineClass * mc)87785fa9acdSPaolo Bonzini static void ccw_machine_9_1_class_options(MachineClass *mc)
87885fa9acdSPaolo Bonzini {
879fb6051e7SCornelia Huck     ccw_machine_9_2_class_options(mc);
880fb6051e7SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_9_1, hw_compat_9_1_len);
88185fa9acdSPaolo Bonzini }
882fb6051e7SCornelia Huck DEFINE_CCW_MACHINE(9, 1);
88385fa9acdSPaolo Bonzini 
ccw_machine_9_0_instance_options(MachineState * machine)8842b10a676SCornelia Huck static void ccw_machine_9_0_instance_options(MachineState *machine)
8852b10a676SCornelia Huck {
88685fa9acdSPaolo Bonzini     ccw_machine_9_1_instance_options(machine);
8872b10a676SCornelia Huck }
8882b10a676SCornelia Huck 
ccw_machine_9_0_class_options(MachineClass * mc)8892b10a676SCornelia Huck static void ccw_machine_9_0_class_options(MachineClass *mc)
8902b10a676SCornelia Huck {
891c1991c09SThomas Huth     static GlobalProperty compat[] = {
892c1991c09SThomas Huth         { TYPE_QEMU_S390_FLIC, "migrate-all-state", "off", },
893c1991c09SThomas Huth     };
894c1991c09SThomas Huth 
89585fa9acdSPaolo Bonzini     ccw_machine_9_1_class_options(mc);
89685fa9acdSPaolo Bonzini     compat_props_add(mc->compat_props, hw_compat_9_0, hw_compat_9_0_len);
897c1991c09SThomas Huth     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
8982b10a676SCornelia Huck }
8997fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(9, 0);
9002b10a676SCornelia Huck 
ccw_machine_8_2_instance_options(MachineState * machine)90195f5c89eSCornelia Huck static void ccw_machine_8_2_instance_options(MachineState *machine)
90295f5c89eSCornelia Huck {
9032b10a676SCornelia Huck     ccw_machine_9_0_instance_options(machine);
90495f5c89eSCornelia Huck }
90595f5c89eSCornelia Huck 
ccw_machine_8_2_class_options(MachineClass * mc)90695f5c89eSCornelia Huck static void ccw_machine_8_2_class_options(MachineClass *mc)
90795f5c89eSCornelia Huck {
9082b10a676SCornelia Huck     ccw_machine_9_0_class_options(mc);
9092b10a676SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_8_2, hw_compat_8_2_len);
91095f5c89eSCornelia Huck }
9117fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(8, 2);
91295f5c89eSCornelia Huck 
ccw_machine_8_1_instance_options(MachineState * machine)913f9be4771SCornelia Huck static void ccw_machine_8_1_instance_options(MachineState *machine)
914f9be4771SCornelia Huck {
91595f5c89eSCornelia Huck     ccw_machine_8_2_instance_options(machine);
916f9be4771SCornelia Huck }
917f9be4771SCornelia Huck 
ccw_machine_8_1_class_options(MachineClass * mc)918f9be4771SCornelia Huck static void ccw_machine_8_1_class_options(MachineClass *mc)
919f9be4771SCornelia Huck {
92095f5c89eSCornelia Huck     ccw_machine_8_2_class_options(mc);
92195f5c89eSCornelia Huck     compat_props_add(mc->compat_props, hw_compat_8_1, hw_compat_8_1_len);
9225de1aff2SPierre Morel     mc->smp_props.drawers_supported = false;
9235de1aff2SPierre Morel     mc->smp_props.books_supported = false;
924f9be4771SCornelia Huck }
9257fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(8, 1);
926f9be4771SCornelia Huck 
ccw_machine_8_0_instance_options(MachineState * machine)927db723c80SCornelia Huck static void ccw_machine_8_0_instance_options(MachineState *machine)
928db723c80SCornelia Huck {
929f9be4771SCornelia Huck     ccw_machine_8_1_instance_options(machine);
930db723c80SCornelia Huck }
931db723c80SCornelia Huck 
ccw_machine_8_0_class_options(MachineClass * mc)932db723c80SCornelia Huck static void ccw_machine_8_0_class_options(MachineClass *mc)
933db723c80SCornelia Huck {
934f9be4771SCornelia Huck     ccw_machine_8_1_class_options(mc);
935f9be4771SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_8_0, hw_compat_8_0_len);
936db723c80SCornelia Huck }
9377fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(8, 0);
938db723c80SCornelia Huck 
ccw_machine_7_2_instance_options(MachineState * machine)939f514e147SCornelia Huck static void ccw_machine_7_2_instance_options(MachineState *machine)
940f514e147SCornelia Huck {
941db723c80SCornelia Huck     ccw_machine_8_0_instance_options(machine);
942f514e147SCornelia Huck }
943f514e147SCornelia Huck 
ccw_machine_7_2_class_options(MachineClass * mc)944f514e147SCornelia Huck static void ccw_machine_7_2_class_options(MachineClass *mc)
945f514e147SCornelia Huck {
946db723c80SCornelia Huck     ccw_machine_8_0_class_options(mc);
947db723c80SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_7_2, hw_compat_7_2_len);
948f514e147SCornelia Huck }
9497fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(7, 2);
950f514e147SCornelia Huck 
ccw_machine_7_1_instance_options(MachineState * machine)9510ca70366SCornelia Huck static void ccw_machine_7_1_instance_options(MachineState *machine)
9520ca70366SCornelia Huck {
9539f17bfdaSJason A. Donenfeld     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V7_1 };
9549f17bfdaSJason A. Donenfeld 
955f514e147SCornelia Huck     ccw_machine_7_2_instance_options(machine);
9561d41de5fSChristian Borntraeger     s390_cpudef_featoff_greater(16, 1, S390_FEAT_PAIE);
9579f17bfdaSJason A. Donenfeld     s390_set_qemu_cpu_model(0x8561, 15, 1, qemu_cpu_feat);
9580ca70366SCornelia Huck }
9590ca70366SCornelia Huck 
ccw_machine_7_1_class_options(MachineClass * mc)9600ca70366SCornelia Huck static void ccw_machine_7_1_class_options(MachineClass *mc)
9610ca70366SCornelia Huck {
9626393b299SPierre Morel     S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
963d3d1a406SCédric Le Goater     static GlobalProperty compat[] = {
964d3d1a406SCédric Le Goater         { TYPE_S390_PCI_DEVICE, "interpret", "off", },
965d3d1a406SCédric Le Goater         { TYPE_S390_PCI_DEVICE, "forwarding-assist", "off", },
966d3d1a406SCédric Le Goater     };
9676393b299SPierre Morel 
968f514e147SCornelia Huck     ccw_machine_7_2_class_options(mc);
969f514e147SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_7_1, hw_compat_7_1_len);
970d3d1a406SCédric Le Goater     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
9716393b299SPierre Morel     s390mc->max_threads = S390_MAX_CPUS;
9720ca70366SCornelia Huck }
9737fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(7, 1);
9740ca70366SCornelia Huck 
ccw_machine_7_0_instance_options(MachineState * machine)97501854af2SCornelia Huck static void ccw_machine_7_0_instance_options(MachineState *machine)
97601854af2SCornelia Huck {
9774f9b6c7dSDavid Miller     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V7_0 };
9784f9b6c7dSDavid Miller 
9790ca70366SCornelia Huck     ccw_machine_7_1_instance_options(machine);
9804f9b6c7dSDavid Miller     s390_set_qemu_cpu_model(0x8561, 15, 1, qemu_cpu_feat);
98101854af2SCornelia Huck }
98201854af2SCornelia Huck 
ccw_machine_7_0_class_options(MachineClass * mc)98301854af2SCornelia Huck static void ccw_machine_7_0_class_options(MachineClass *mc)
98401854af2SCornelia Huck {
9850ca70366SCornelia Huck     ccw_machine_7_1_class_options(mc);
9860ca70366SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_7_0, hw_compat_7_0_len);
98701854af2SCornelia Huck }
9887fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(7, 0);
98901854af2SCornelia Huck 
ccw_machine_6_2_instance_options(MachineState * machine)99052e64f5bSYanan Wang static void ccw_machine_6_2_instance_options(MachineState *machine)
99152e64f5bSYanan Wang {
9928a4eafb6SDavid Miller     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V6_2 };
9938a4eafb6SDavid Miller 
99401854af2SCornelia Huck     ccw_machine_7_0_instance_options(machine);
9958a4eafb6SDavid Miller     s390_set_qemu_cpu_model(0x3906, 14, 2, qemu_cpu_feat);
99652e64f5bSYanan Wang }
99752e64f5bSYanan Wang 
ccw_machine_6_2_class_options(MachineClass * mc)99852e64f5bSYanan Wang static void ccw_machine_6_2_class_options(MachineClass *mc)
99952e64f5bSYanan Wang {
100001854af2SCornelia Huck     ccw_machine_7_0_class_options(mc);
100101854af2SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_6_2, hw_compat_6_2_len);
100252e64f5bSYanan Wang }
10037fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(6, 2);
100452e64f5bSYanan Wang 
ccw_machine_6_1_instance_options(MachineState * machine)1005da7e13c0SCornelia Huck static void ccw_machine_6_1_instance_options(MachineState *machine)
1006da7e13c0SCornelia Huck {
100752e64f5bSYanan Wang     ccw_machine_6_2_instance_options(machine);
100830e398f7SChristian Borntraeger     s390_cpudef_featoff_greater(16, 1, S390_FEAT_NNPA);
100930e398f7SChristian Borntraeger     s390_cpudef_featoff_greater(16, 1, S390_FEAT_VECTOR_PACKED_DECIMAL_ENH2);
101030e398f7SChristian Borntraeger     s390_cpudef_featoff_greater(16, 1, S390_FEAT_BEAR_ENH);
101130e398f7SChristian Borntraeger     s390_cpudef_featoff_greater(16, 1, S390_FEAT_RDP);
101230e398f7SChristian Borntraeger     s390_cpudef_featoff_greater(16, 1, S390_FEAT_PAI);
1013da7e13c0SCornelia Huck }
1014da7e13c0SCornelia Huck 
ccw_machine_6_1_class_options(MachineClass * mc)1015da7e13c0SCornelia Huck static void ccw_machine_6_1_class_options(MachineClass *mc)
1016da7e13c0SCornelia Huck {
101752e64f5bSYanan Wang     ccw_machine_6_2_class_options(mc);
101852e64f5bSYanan Wang     compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len);
10192b526199SYanan Wang     mc->smp_props.prefer_sockets = true;
1020da7e13c0SCornelia Huck }
10217fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(6, 1);
1022da7e13c0SCornelia Huck 
ccw_machine_6_0_instance_options(MachineState * machine)1023576a00bdSCornelia Huck static void ccw_machine_6_0_instance_options(MachineState *machine)
1024576a00bdSCornelia Huck {
1025463e50daSDavid Hildenbrand     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V6_0 };
1026463e50daSDavid Hildenbrand 
1027da7e13c0SCornelia Huck     ccw_machine_6_1_instance_options(machine);
1028463e50daSDavid Hildenbrand     s390_set_qemu_cpu_model(0x2964, 13, 2, qemu_cpu_feat);
1029576a00bdSCornelia Huck }
1030576a00bdSCornelia Huck 
ccw_machine_6_0_class_options(MachineClass * mc)1031576a00bdSCornelia Huck static void ccw_machine_6_0_class_options(MachineClass *mc)
1032576a00bdSCornelia Huck {
1033da7e13c0SCornelia Huck     ccw_machine_6_1_class_options(mc);
1034da7e13c0SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_6_0, hw_compat_6_0_len);
1035576a00bdSCornelia Huck }
10367fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(6, 0);
1037576a00bdSCornelia Huck 
ccw_machine_5_2_instance_options(MachineState * machine)10383ff3c5d3SCornelia Huck static void ccw_machine_5_2_instance_options(MachineState *machine)
10393ff3c5d3SCornelia Huck {
1040576a00bdSCornelia Huck     ccw_machine_6_0_instance_options(machine);
10413ff3c5d3SCornelia Huck }
10423ff3c5d3SCornelia Huck 
ccw_machine_5_2_class_options(MachineClass * mc)10433ff3c5d3SCornelia Huck static void ccw_machine_5_2_class_options(MachineClass *mc)
10443ff3c5d3SCornelia Huck {
1045576a00bdSCornelia Huck     ccw_machine_6_0_class_options(mc);
1046576a00bdSCornelia Huck     compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
10473ff3c5d3SCornelia Huck }
10487fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(5, 2);
10493ff3c5d3SCornelia Huck 
ccw_machine_5_1_instance_options(MachineState * machine)1050541aaa1dSCornelia Huck static void ccw_machine_5_1_instance_options(MachineState *machine)
1051541aaa1dSCornelia Huck {
10523ff3c5d3SCornelia Huck     ccw_machine_5_2_instance_options(machine);
1053541aaa1dSCornelia Huck }
1054541aaa1dSCornelia Huck 
ccw_machine_5_1_class_options(MachineClass * mc)1055541aaa1dSCornelia Huck static void ccw_machine_5_1_class_options(MachineClass *mc)
1056541aaa1dSCornelia Huck {
10573ff3c5d3SCornelia Huck     ccw_machine_5_2_class_options(mc);
10583ff3c5d3SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_5_1, hw_compat_5_1_len);
1059541aaa1dSCornelia Huck }
10607fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(5, 1);
1061541aaa1dSCornelia Huck 
ccw_machine_5_0_instance_options(MachineState * machine)10623eb74d20SCornelia Huck static void ccw_machine_5_0_instance_options(MachineState *machine)
10633eb74d20SCornelia Huck {
1064541aaa1dSCornelia Huck     ccw_machine_5_1_instance_options(machine);
10653eb74d20SCornelia Huck }
10663eb74d20SCornelia Huck 
ccw_machine_5_0_class_options(MachineClass * mc)10673eb74d20SCornelia Huck static void ccw_machine_5_0_class_options(MachineClass *mc)
10683eb74d20SCornelia Huck {
1069541aaa1dSCornelia Huck     ccw_machine_5_1_class_options(mc);
1070541aaa1dSCornelia Huck     compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
10713eb74d20SCornelia Huck }
10727fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(5, 0);
10733eb74d20SCornelia Huck 
ccw_machine_4_2_instance_options(MachineState * machine)10749aec2e52SCornelia Huck static void ccw_machine_4_2_instance_options(MachineState *machine)
10759aec2e52SCornelia Huck {
10763eb74d20SCornelia Huck     ccw_machine_5_0_instance_options(machine);
10779aec2e52SCornelia Huck }
10789aec2e52SCornelia Huck 
ccw_machine_4_2_class_options(MachineClass * mc)10799aec2e52SCornelia Huck static void ccw_machine_4_2_class_options(MachineClass *mc)
10809aec2e52SCornelia Huck {
10813eb74d20SCornelia Huck     ccw_machine_5_0_class_options(mc);
10825c30ef93SChristian Borntraeger     mc->fixup_ram_size = s390_fixup_ram_size;
10835f258577SEvgeny Yakovlev     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
10849aec2e52SCornelia Huck }
10857fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(4, 2);
10869aec2e52SCornelia Huck 
ccw_machine_4_1_instance_options(MachineState * machine)10879bf2650bSCornelia Huck static void ccw_machine_4_1_instance_options(MachineState *machine)
10889bf2650bSCornelia Huck {
1089faa40177SDavid Hildenbrand     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V4_1 };
10909aec2e52SCornelia Huck     ccw_machine_4_2_instance_options(machine);
1091faa40177SDavid Hildenbrand     s390_set_qemu_cpu_model(0x2964, 13, 2, qemu_cpu_feat);
10929bf2650bSCornelia Huck }
10939bf2650bSCornelia Huck 
ccw_machine_4_1_class_options(MachineClass * mc)10949bf2650bSCornelia Huck static void ccw_machine_4_1_class_options(MachineClass *mc)
10959bf2650bSCornelia Huck {
10969aec2e52SCornelia Huck     ccw_machine_4_2_class_options(mc);
10979aec2e52SCornelia Huck     compat_props_add(mc->compat_props, hw_compat_4_1, hw_compat_4_1_len);
10989bf2650bSCornelia Huck }
10997fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(4, 1);
11009bf2650bSCornelia Huck 
ccw_machine_4_0_instance_options(MachineState * machine)110188cbe073SMarc-André Lureau static void ccw_machine_4_0_instance_options(MachineState *machine)
110288cbe073SMarc-André Lureau {
110308ef92d5SDavid Hildenbrand     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V4_0 };
11049bf2650bSCornelia Huck     ccw_machine_4_1_instance_options(machine);
110508ef92d5SDavid Hildenbrand     s390_set_qemu_cpu_model(0x2827, 12, 2, qemu_cpu_feat);
110688cbe073SMarc-André Lureau }
110788cbe073SMarc-André Lureau 
ccw_machine_4_0_class_options(MachineClass * mc)110888cbe073SMarc-André Lureau static void ccw_machine_4_0_class_options(MachineClass *mc)
110988cbe073SMarc-André Lureau {
11109bf2650bSCornelia Huck     ccw_machine_4_1_class_options(mc);
11119bf2650bSCornelia Huck     compat_props_add(mc->compat_props, hw_compat_4_0, hw_compat_4_0_len);
111288cbe073SMarc-André Lureau }
11137fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(4, 0);
111488cbe073SMarc-André Lureau 
ccw_machine_3_1_instance_options(MachineState * machine)111588cbe073SMarc-André Lureau static void ccw_machine_3_1_instance_options(MachineState *machine)
111688cbe073SMarc-André Lureau {
1117d646b16bSDavid Hildenbrand     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V3_1 };
111888cbe073SMarc-André Lureau     ccw_machine_4_0_instance_options(machine);
111984176c79SCollin Walling     s390_cpudef_featoff_greater(14, 1, S390_FEAT_MULTIPLE_EPOCH);
112084176c79SCollin Walling     s390_cpudef_group_featoff_greater(14, 1, S390_FEAT_GROUP_MULTIPLE_EPOCH_PTFF);
1121d646b16bSDavid Hildenbrand     s390_set_qemu_cpu_model(0x2827, 12, 2, qemu_cpu_feat);
112288cbe073SMarc-André Lureau }
112388cbe073SMarc-André Lureau 
ccw_machine_3_1_class_options(MachineClass * mc)112488cbe073SMarc-André Lureau static void ccw_machine_3_1_class_options(MachineClass *mc)
112588cbe073SMarc-André Lureau {
112688cbe073SMarc-André Lureau     ccw_machine_4_0_class_options(mc);
1127abd93cc7SMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
112888cbe073SMarc-André Lureau }
11297fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(3, 1);
113088cbe073SMarc-André Lureau 
ccw_machine_3_0_instance_options(MachineState * machine)113188cbe073SMarc-André Lureau static void ccw_machine_3_0_instance_options(MachineState *machine)
113288cbe073SMarc-André Lureau {
113388cbe073SMarc-André Lureau     ccw_machine_3_1_instance_options(machine);
113488cbe073SMarc-André Lureau }
113588cbe073SMarc-André Lureau 
ccw_machine_3_0_class_options(MachineClass * mc)113688cbe073SMarc-André Lureau static void ccw_machine_3_0_class_options(MachineClass *mc)
113788cbe073SMarc-André Lureau {
1138b1af5872SEduardo Habkost     S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
11399ca056d6SCornelia Huck 
114088cbe073SMarc-André Lureau     s390mc->hpage_1m_allowed = false;
114188cbe073SMarc-André Lureau     ccw_machine_3_1_class_options(mc);
1142ddb3235dSMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_3_0, hw_compat_3_0_len);
114388cbe073SMarc-André Lureau }
11447fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(3, 0);
114588cbe073SMarc-André Lureau 
ccw_machine_2_12_instance_options(MachineState * machine)114688cbe073SMarc-André Lureau static void ccw_machine_2_12_instance_options(MachineState *machine)
114788cbe073SMarc-André Lureau {
114888cbe073SMarc-André Lureau     ccw_machine_3_0_instance_options(machine);
114988cbe073SMarc-André Lureau     s390_cpudef_featoff_greater(11, 1, S390_FEAT_PPA15);
115088cbe073SMarc-André Lureau     s390_cpudef_featoff_greater(11, 1, S390_FEAT_BPB);
115188cbe073SMarc-André Lureau }
115288cbe073SMarc-André Lureau 
ccw_machine_2_12_class_options(MachineClass * mc)115388cbe073SMarc-André Lureau static void ccw_machine_2_12_class_options(MachineClass *mc)
115488cbe073SMarc-André Lureau {
115588cbe073SMarc-André Lureau     ccw_machine_3_0_class_options(mc);
11560d47310bSMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_12, hw_compat_2_12_len);
115788cbe073SMarc-André Lureau }
11587fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 12);
115988cbe073SMarc-André Lureau 
1160d6a7c3f4SThomas Huth #ifdef CONFIG_S390X_LEGACY_CPUS
1161d6a7c3f4SThomas Huth 
ccw_machine_2_11_instance_options(MachineState * machine)116288cbe073SMarc-André Lureau static void ccw_machine_2_11_instance_options(MachineState *machine)
116388cbe073SMarc-André Lureau {
116488cbe073SMarc-André Lureau     static const S390FeatInit qemu_cpu_feat = { S390_FEAT_LIST_QEMU_V2_11 };
116588cbe073SMarc-André Lureau     ccw_machine_2_12_instance_options(machine);
116688cbe073SMarc-André Lureau 
116788cbe073SMarc-André Lureau     /* before 2.12 we emulated the very first z900 */
116888cbe073SMarc-André Lureau     s390_set_qemu_cpu_model(0x2064, 7, 1, qemu_cpu_feat);
116988cbe073SMarc-André Lureau }
117088cbe073SMarc-André Lureau 
ccw_machine_2_11_class_options(MachineClass * mc)117188cbe073SMarc-André Lureau static void ccw_machine_2_11_class_options(MachineClass *mc)
117288cbe073SMarc-André Lureau {
117388cbe073SMarc-André Lureau     static GlobalProperty compat[] = {
11746c36bddfSEduardo Habkost         { TYPE_SCLP_EVENT_FACILITY, "allow_all_mask_sizes", "off", },
1175fa386d98SMarc-André Lureau     };
117667ee0cefSCornelia Huck 
117788cbe073SMarc-André Lureau     ccw_machine_2_12_class_options(mc);
117843df70a9SMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_11, hw_compat_2_11_len);
117988cbe073SMarc-André Lureau     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
118088cbe073SMarc-André Lureau }
11817fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 11);
118288cbe073SMarc-André Lureau 
ccw_machine_2_10_instance_options(MachineState * machine)118388cbe073SMarc-André Lureau static void ccw_machine_2_10_instance_options(MachineState *machine)
118488cbe073SMarc-André Lureau {
118588cbe073SMarc-André Lureau     ccw_machine_2_11_instance_options(machine);
118688cbe073SMarc-André Lureau }
118788cbe073SMarc-André Lureau 
ccw_machine_2_10_class_options(MachineClass * mc)118888cbe073SMarc-André Lureau static void ccw_machine_2_10_class_options(MachineClass *mc)
118988cbe073SMarc-André Lureau {
119088cbe073SMarc-André Lureau     ccw_machine_2_11_class_options(mc);
1191503224f4SMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_10, hw_compat_2_10_len);
119288cbe073SMarc-André Lureau }
11937fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 10);
119488cbe073SMarc-André Lureau 
ccw_machine_2_9_instance_options(MachineState * machine)119588cbe073SMarc-André Lureau static void ccw_machine_2_9_instance_options(MachineState *machine)
119688cbe073SMarc-André Lureau {
119788cbe073SMarc-André Lureau     ccw_machine_2_10_instance_options(machine);
119888cbe073SMarc-André Lureau     s390_cpudef_featoff_greater(12, 1, S390_FEAT_ESOP);
119988cbe073SMarc-André Lureau     s390_cpudef_featoff_greater(12, 1, S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2);
120088cbe073SMarc-André Lureau     s390_cpudef_featoff_greater(12, 1, S390_FEAT_ZPCI);
120188cbe073SMarc-André Lureau     s390_cpudef_featoff_greater(12, 1, S390_FEAT_ADAPTER_INT_SUPPRESSION);
120288cbe073SMarc-André Lureau     s390_cpudef_featoff_greater(12, 1, S390_FEAT_ADAPTER_EVENT_NOTIFICATION);
1203*e7a9d934SFabiano Rosas     css_migration_enabled = false;
120488cbe073SMarc-André Lureau }
120588cbe073SMarc-André Lureau 
ccw_machine_2_9_class_options(MachineClass * mc)120688cbe073SMarc-André Lureau static void ccw_machine_2_9_class_options(MachineClass *mc)
120788cbe073SMarc-André Lureau {
120888cbe073SMarc-André Lureau     static GlobalProperty compat[] = {
12096c36bddfSEduardo Habkost         { TYPE_S390_STATTRIB, "migration-enabled", "off", },
12109d1b0f5bSPaolo Bonzini         { TYPE_S390_FLIC_COMMON, "migration-enabled", "off", },
1211fa386d98SMarc-André Lureau     };
121210890873SCornelia Huck 
121388cbe073SMarc-André Lureau     ccw_machine_2_10_class_options(mc);
12143e803152SMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_9, hw_compat_2_9_len);
121588cbe073SMarc-André Lureau     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
121688cbe073SMarc-André Lureau }
12177fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 9);
121888cbe073SMarc-André Lureau 
ccw_machine_2_8_instance_options(MachineState * machine)121988cbe073SMarc-André Lureau static void ccw_machine_2_8_instance_options(MachineState *machine)
122088cbe073SMarc-André Lureau {
122188cbe073SMarc-André Lureau     ccw_machine_2_9_instance_options(machine);
122288cbe073SMarc-André Lureau }
122388cbe073SMarc-André Lureau 
ccw_machine_2_8_class_options(MachineClass * mc)122488cbe073SMarc-André Lureau static void ccw_machine_2_8_class_options(MachineClass *mc)
122588cbe073SMarc-André Lureau {
122688cbe073SMarc-André Lureau     static GlobalProperty compat[] = {
12276c36bddfSEduardo Habkost         { TYPE_S390_FLIC_COMMON, "adapter_routes_max_batch", "64", },
1228fa386d98SMarc-André Lureau     };
1229113725a6SCornelia Huck 
123088cbe073SMarc-André Lureau     ccw_machine_2_9_class_options(mc);
1231edc24ccdSMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_8, hw_compat_2_8_len);
123288cbe073SMarc-André Lureau     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
123388cbe073SMarc-André Lureau }
12347fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 8);
123588cbe073SMarc-André Lureau 
ccw_machine_2_7_instance_options(MachineState * machine)123688cbe073SMarc-André Lureau static void ccw_machine_2_7_instance_options(MachineState *machine)
123788cbe073SMarc-André Lureau {
123888cbe073SMarc-André Lureau     ccw_machine_2_8_instance_options(machine);
123988cbe073SMarc-André Lureau }
124088cbe073SMarc-André Lureau 
ccw_machine_2_7_class_options(MachineClass * mc)124188cbe073SMarc-André Lureau static void ccw_machine_2_7_class_options(MachineClass *mc)
124288cbe073SMarc-André Lureau {
1243b1af5872SEduardo Habkost     S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
124461823988SCornelia Huck 
124588cbe073SMarc-André Lureau     s390mc->cpu_model_allowed = false;
124688cbe073SMarc-André Lureau     ccw_machine_2_8_class_options(mc);
12475a995064SMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_7, hw_compat_2_7_len);
124888cbe073SMarc-André Lureau }
12497fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 7);
125088cbe073SMarc-André Lureau 
ccw_machine_2_6_instance_options(MachineState * machine)125188cbe073SMarc-André Lureau static void ccw_machine_2_6_instance_options(MachineState *machine)
125288cbe073SMarc-André Lureau {
125388cbe073SMarc-André Lureau     ccw_machine_2_7_instance_options(machine);
125488cbe073SMarc-André Lureau }
125588cbe073SMarc-André Lureau 
ccw_machine_2_6_class_options(MachineClass * mc)125688cbe073SMarc-André Lureau static void ccw_machine_2_6_class_options(MachineClass *mc)
125788cbe073SMarc-André Lureau {
1258b1af5872SEduardo Habkost     S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
125988cbe073SMarc-André Lureau     static GlobalProperty compat[] = {
12606c36bddfSEduardo Habkost         { TYPE_S390_IPL, "iplbext_migration", "off", },
12616c36bddfSEduardo Habkost          { TYPE_VIRTUAL_CSS_BRIDGE, "css_dev_path", "off", },
1262fa386d98SMarc-André Lureau     };
1263946e55f3SCornelia Huck 
126488cbe073SMarc-André Lureau     s390mc->ri_allowed = false;
126588cbe073SMarc-André Lureau     ccw_machine_2_7_class_options(mc);
1266ff8f261fSMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_6, hw_compat_2_6_len);
126788cbe073SMarc-André Lureau     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
126888cbe073SMarc-André Lureau }
12697fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 6);
127088cbe073SMarc-André Lureau 
ccw_machine_2_5_instance_options(MachineState * machine)127188cbe073SMarc-André Lureau static void ccw_machine_2_5_instance_options(MachineState *machine)
127288cbe073SMarc-André Lureau {
127388cbe073SMarc-André Lureau     ccw_machine_2_6_instance_options(machine);
127488cbe073SMarc-André Lureau }
127588cbe073SMarc-André Lureau 
ccw_machine_2_5_class_options(MachineClass * mc)127688cbe073SMarc-André Lureau static void ccw_machine_2_5_class_options(MachineClass *mc)
127788cbe073SMarc-André Lureau {
127888cbe073SMarc-André Lureau     ccw_machine_2_6_class_options(mc);
1279fe759610SMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_5, hw_compat_2_5_len);
128088cbe073SMarc-André Lureau }
12817fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 5);
128288cbe073SMarc-André Lureau 
ccw_machine_2_4_instance_options(MachineState * machine)128388cbe073SMarc-André Lureau static void ccw_machine_2_4_instance_options(MachineState *machine)
128488cbe073SMarc-André Lureau {
128588cbe073SMarc-André Lureau     ccw_machine_2_5_instance_options(machine);
128688cbe073SMarc-André Lureau }
128788cbe073SMarc-André Lureau 
ccw_machine_2_4_class_options(MachineClass * mc)128888cbe073SMarc-André Lureau static void ccw_machine_2_4_class_options(MachineClass *mc)
128988cbe073SMarc-André Lureau {
129088cbe073SMarc-André Lureau     static GlobalProperty compat[] = {
12916c36bddfSEduardo Habkost         { TYPE_S390_SKEYS, "migration-enabled", "off", },
12926c36bddfSEduardo Habkost         { "virtio-blk-ccw", "max_revision", "0", },
12936c36bddfSEduardo Habkost         { "virtio-balloon-ccw", "max_revision", "0", },
12946c36bddfSEduardo Habkost         { "virtio-serial-ccw", "max_revision", "0", },
12956c36bddfSEduardo Habkost         { "virtio-9p-ccw", "max_revision", "0", },
12966c36bddfSEduardo Habkost         { "virtio-rng-ccw", "max_revision", "0", },
12976c36bddfSEduardo Habkost         { "virtio-net-ccw", "max_revision", "0", },
12986c36bddfSEduardo Habkost         { "virtio-scsi-ccw", "max_revision", "0", },
12996c36bddfSEduardo Habkost         { "vhost-scsi-ccw", "max_revision", "0", },
1300fa386d98SMarc-André Lureau     };
13019ef40173SJason J. Herne 
1302946e55f3SCornelia Huck     ccw_machine_2_5_class_options(mc);
13032f99b9c2SMarc-André Lureau     compat_props_add(mc->compat_props, hw_compat_2_4, hw_compat_2_4_len);
130488cbe073SMarc-André Lureau     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
13054fca6548SJanosch Frank }
13067fb1e06aSDaniel P. Berrangé DEFINE_CCW_MACHINE(2, 4);
1307b21b7598SCornelia Huck 
1308d6a7c3f4SThomas Huth #endif
1309d6a7c3f4SThomas Huth 
ccw_machine_register_types(void)1310d07aa7c7SAlexey Kardashevskiy static void ccw_machine_register_types(void)
1311d07aa7c7SAlexey Kardashevskiy {
1312d07aa7c7SAlexey Kardashevskiy     type_register_static(&ccw_machine_info);
1313d07aa7c7SAlexey Kardashevskiy }
1314d07aa7c7SAlexey Kardashevskiy 
1315d07aa7c7SAlexey Kardashevskiy type_init(ccw_machine_register_types)
1316