microvm.c (e57e9ae7992bde44d7938ca9a2ec0aa9c5f0bbb6) microvm.c (4d01b8994ca5ce7f48e85e48fb1d31e73699108b)
1/*
2 * Copyright (c) 2018 Intel Corporation
3 * Copyright (c) 2019 Red Hat, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2 or later, as published by the Free Software Foundation.
8 *

--- 131 unchanged lines hidden (view full) ---

140 }
141
142 for (i = 0; i < GPEX_NUM_IRQS; i++) {
143 sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
144 x86ms->gsi[mms->gpex.irq + i]);
145 }
146}
147
1/*
2 * Copyright (c) 2018 Intel Corporation
3 * Copyright (c) 2019 Red Hat, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2 or later, as published by the Free Software Foundation.
8 *

--- 131 unchanged lines hidden (view full) ---

140 }
141
142 for (i = 0; i < GPEX_NUM_IRQS; i++) {
143 sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
144 x86ms->gsi[mms->gpex.irq + i]);
145 }
146}
147
148static int microvm_ioapics(MicrovmMachineState *mms)
149{
150 if (!x86_machine_is_acpi_enabled(X86_MACHINE(mms))) {
151 return 1;
152 }
153 if (mms->ioapic2 == ON_OFF_AUTO_OFF) {
154 return 1;
155 }
156 return 2;
157}
158
148static void microvm_devices_init(MicrovmMachineState *mms)
149{
150 X86MachineState *x86ms = X86_MACHINE(mms);
151 ISABus *isa_bus;
152 ISADevice *rtc_state;
153 GSIState *gsi_state;
159static void microvm_devices_init(MicrovmMachineState *mms)
160{
161 X86MachineState *x86ms = X86_MACHINE(mms);
162 ISABus *isa_bus;
163 ISADevice *rtc_state;
164 GSIState *gsi_state;
165 int ioapics;
154 int i;
155
156 /* Core components */
166 int i;
167
168 /* Core components */
157
169 ioapics = microvm_ioapics(mms);
158 gsi_state = g_malloc0(sizeof(*gsi_state));
170 gsi_state = g_malloc0(sizeof(*gsi_state));
159 x86ms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
171 x86ms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state,
172 IOAPIC_NUM_PINS * ioapics);
160
161 isa_bus = isa_bus_new(NULL, get_system_memory(), get_system_io(),
162 &error_abort);
163 isa_bus_irqs(isa_bus, x86ms->gsi);
164
165 ioapic_init_gsi(gsi_state, "machine");
173
174 isa_bus = isa_bus_new(NULL, get_system_memory(), get_system_io(),
175 &error_abort);
176 isa_bus_irqs(isa_bus, x86ms->gsi);
177
178 ioapic_init_gsi(gsi_state, "machine");
179 if (ioapics > 1) {
180 x86ms->ioapic2 = ioapic_init_secondary(gsi_state);
181 }
166
167 kvmclock_create(true);
168
169 mms->virtio_irq_base = 5;
170 mms->virtio_num_transports = 8;
182
183 kvmclock_create(true);
184
185 mms->virtio_irq_base = 5;
186 mms->virtio_num_transports = 8;
171 if (x86_machine_is_acpi_enabled(x86ms)) {
172 mms->pcie_irq_base = 12;
173 mms->virtio_irq_base = 16;
187 if (x86ms->ioapic2) {
188 mms->pcie_irq_base = 16; /* 16 -> 19 */
189 /* use second ioapic (24 -> 47) for virtio-mmio irq lines */
190 mms->virtio_irq_base = IO_APIC_SECONDARY_IRQBASE;
191 mms->virtio_num_transports = IOAPIC_NUM_PINS;
192 } else if (x86_machine_is_acpi_enabled(x86ms)) {
193 mms->pcie_irq_base = 12; /* 12 -> 15 */
194 mms->virtio_irq_base = 16; /* 16 -> 23 */
174 }
175
176 for (i = 0; i < mms->virtio_num_transports; i++) {
177 sysbus_create_simple("virtio-mmio",
178 VIRTIO_MMIO_BASE + i * 512,
179 x86ms->gsi[mms->virtio_irq_base + i]);
180 }
181

--- 357 unchanged lines hidden (view full) ---

539static void microvm_machine_set_pcie(Object *obj, Visitor *v, const char *name,
540 void *opaque, Error **errp)
541{
542 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
543
544 visit_type_OnOffAuto(v, name, &mms->pcie, errp);
545}
546
195 }
196
197 for (i = 0; i < mms->virtio_num_transports; i++) {
198 sysbus_create_simple("virtio-mmio",
199 VIRTIO_MMIO_BASE + i * 512,
200 x86ms->gsi[mms->virtio_irq_base + i]);
201 }
202

--- 357 unchanged lines hidden (view full) ---

560static void microvm_machine_set_pcie(Object *obj, Visitor *v, const char *name,
561 void *opaque, Error **errp)
562{
563 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
564
565 visit_type_OnOffAuto(v, name, &mms->pcie, errp);
566}
567
568static void microvm_machine_get_ioapic2(Object *obj, Visitor *v, const char *name,
569 void *opaque, Error **errp)
570{
571 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
572 OnOffAuto ioapic2 = mms->ioapic2;
573
574 visit_type_OnOffAuto(v, name, &ioapic2, errp);
575}
576
577static void microvm_machine_set_ioapic2(Object *obj, Visitor *v, const char *name,
578 void *opaque, Error **errp)
579{
580 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
581
582 visit_type_OnOffAuto(v, name, &mms->ioapic2, errp);
583}
584
547static bool microvm_machine_get_isa_serial(Object *obj, Error **errp)
548{
549 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
550
551 return mms->isa_serial;
552}
553
554static void microvm_machine_set_isa_serial(Object *obj, bool value,

--- 60 unchanged lines hidden (view full) ---

615{
616 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
617
618 /* Configuration */
619 mms->pic = ON_OFF_AUTO_AUTO;
620 mms->pit = ON_OFF_AUTO_AUTO;
621 mms->rtc = ON_OFF_AUTO_AUTO;
622 mms->pcie = ON_OFF_AUTO_AUTO;
585static bool microvm_machine_get_isa_serial(Object *obj, Error **errp)
586{
587 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
588
589 return mms->isa_serial;
590}
591
592static void microvm_machine_set_isa_serial(Object *obj, bool value,

--- 60 unchanged lines hidden (view full) ---

653{
654 MicrovmMachineState *mms = MICROVM_MACHINE(obj);
655
656 /* Configuration */
657 mms->pic = ON_OFF_AUTO_AUTO;
658 mms->pit = ON_OFF_AUTO_AUTO;
659 mms->rtc = ON_OFF_AUTO_AUTO;
660 mms->pcie = ON_OFF_AUTO_AUTO;
661 mms->ioapic2 = ON_OFF_AUTO_AUTO;
623 mms->isa_serial = true;
624 mms->option_roms = true;
625 mms->auto_kernel_cmdline = true;
626
627 /* State */
628 mms->kernel_cmdline_fixed = false;
629
630 mms->machine_done.notify = microvm_machine_done;

--- 57 unchanged lines hidden (view full) ---

688
689 object_class_property_add(oc, MICROVM_MACHINE_PCIE, "OnOffAuto",
690 microvm_machine_get_pcie,
691 microvm_machine_set_pcie,
692 NULL, NULL);
693 object_class_property_set_description(oc, MICROVM_MACHINE_PCIE,
694 "Enable PCIe");
695
662 mms->isa_serial = true;
663 mms->option_roms = true;
664 mms->auto_kernel_cmdline = true;
665
666 /* State */
667 mms->kernel_cmdline_fixed = false;
668
669 mms->machine_done.notify = microvm_machine_done;

--- 57 unchanged lines hidden (view full) ---

727
728 object_class_property_add(oc, MICROVM_MACHINE_PCIE, "OnOffAuto",
729 microvm_machine_get_pcie,
730 microvm_machine_set_pcie,
731 NULL, NULL);
732 object_class_property_set_description(oc, MICROVM_MACHINE_PCIE,
733 "Enable PCIe");
734
735 object_class_property_add(oc, MICROVM_MACHINE_IOAPIC2, "OnOffAuto",
736 microvm_machine_get_ioapic2,
737 microvm_machine_set_ioapic2,
738 NULL, NULL);
739 object_class_property_set_description(oc, MICROVM_MACHINE_IOAPIC2,
740 "Enable second IO-APIC");
741
696 object_class_property_add_bool(oc, MICROVM_MACHINE_ISA_SERIAL,
697 microvm_machine_get_isa_serial,
698 microvm_machine_set_isa_serial);
699 object_class_property_set_description(oc, MICROVM_MACHINE_ISA_SERIAL,
700 "Set off to disable the instantiation an ISA serial port");
701
702 object_class_property_add_bool(oc, MICROVM_MACHINE_OPTION_ROMS,
703 microvm_machine_get_option_roms,

--- 32 unchanged lines hidden ---
742 object_class_property_add_bool(oc, MICROVM_MACHINE_ISA_SERIAL,
743 microvm_machine_get_isa_serial,
744 microvm_machine_set_isa_serial);
745 object_class_property_set_description(oc, MICROVM_MACHINE_ISA_SERIAL,
746 "Set off to disable the instantiation an ISA serial port");
747
748 object_class_property_add_bool(oc, MICROVM_MACHINE_OPTION_ROMS,
749 microvm_machine_get_option_roms,

--- 32 unchanged lines hidden ---