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