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 --- |