Lines Matching +full:- +full:- +full:disable +full:- +full:xen
19 #include "qemu/error-report.h"
24 #include "qapi/qapi-visit-common.h"
30 #include "acpi-microvm.h"
31 #include "microvm-dt.h"
42 #include "hw/char/serial-isa.h"
47 #include "hw/virtio/virtio-mmio.h"
50 #include "hw/pci-host/gpex.h"
55 #include "hw/xen/start_info.h"
58 #define MICROVM_BIOS_FILENAME "bios-microvm.bin"
65 val = MIN(x86ms->below_4g_mem_size / KiB, 640); in microvm_set_rtc()
69 if (x86ms->below_4g_mem_size > 1 * MiB) { in microvm_set_rtc()
70 val = (x86ms->below_4g_mem_size - 1 * MiB) / KiB; in microvm_set_rtc()
82 if (x86ms->below_4g_mem_size > 16 * MiB) { in microvm_set_rtc()
83 val = (x86ms->below_4g_mem_size - 16 * MiB) / (64 * KiB); in microvm_set_rtc()
93 val = x86ms->above_4g_mem_size / 65536; in microvm_set_rtc()
116 memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam", in create_gpex()
117 ecam_reg, 0, mms->gpex.ecam.size); in create_gpex()
119 mms->gpex.ecam.base, ecam_alias); in create_gpex()
127 if (mms->gpex.mmio32.size) { in create_gpex()
129 memory_region_init_alias(mmio32_alias, OBJECT(dev), "pcie-mmio32", mmio_reg, in create_gpex()
130 mms->gpex.mmio32.base, mms->gpex.mmio32.size); in create_gpex()
132 mms->gpex.mmio32.base, mmio32_alias); in create_gpex()
134 if (mms->gpex.mmio64.size) { in create_gpex()
136 memory_region_init_alias(mmio64_alias, OBJECT(dev), "pcie-mmio64", mmio_reg, in create_gpex()
137 mms->gpex.mmio64.base, mms->gpex.mmio64.size); in create_gpex()
139 mms->gpex.mmio64.base, mmio64_alias); in create_gpex()
144 x86ms->gsi[mms->gpex.irq + i]); in create_gpex()
153 if (mms->ioapic2 == ON_OFF_AUTO_OFF) { in microvm_ioapics()
171 x86ms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state, in microvm_devices_init()
176 isa_bus_register_input_irqs(isa_bus, x86ms->gsi); in microvm_devices_init()
180 x86ms->ioapic2 = ioapic_init_secondary(gsi_state); in microvm_devices_init()
187 mms->virtio_irq_base = 5; in microvm_devices_init()
188 mms->virtio_num_transports = 8; in microvm_devices_init()
189 if (x86ms->ioapic2) { in microvm_devices_init()
190 mms->pcie_irq_base = 16; /* 16 -> 19 */ in microvm_devices_init()
191 /* use second ioapic (24 -> 47) for virtio-mmio irq lines */ in microvm_devices_init()
192 mms->virtio_irq_base = IO_APIC_SECONDARY_IRQBASE; in microvm_devices_init()
193 mms->virtio_num_transports = IOAPIC_NUM_PINS; in microvm_devices_init()
195 mms->pcie_irq_base = 12; /* 12 -> 15 */ in microvm_devices_init()
196 mms->virtio_irq_base = 16; /* 16 -> 23 */ in microvm_devices_init()
199 for (i = 0; i < mms->virtio_num_transports; i++) { in microvm_devices_init()
200 sysbus_create_simple("virtio-mmio", in microvm_devices_init()
202 x86ms->gsi[mms->virtio_irq_base + i]); in microvm_devices_init()
208 qdev_prop_set_uint32(dev, "ged-event", ACPI_GED_PWR_DOWN_EVT); in microvm_devices_init()
214 x86ms->gsi[GED_MMIO_IRQ]); in microvm_devices_init()
215 x86ms->acpi_dev = HOTPLUG_HANDLER(dev); in microvm_devices_init()
227 x86ms->gsi[MICROVM_XHCI_IRQ]); in microvm_devices_init()
230 if (x86_machine_is_acpi_enabled(x86ms) && mms->pcie == ON_OFF_AUTO_ON) { in microvm_devices_init()
232 hwaddr phys_size = (hwaddr)1 << X86_CPU(first_cpu)->phys_bits; in microvm_devices_init()
234 mms->gpex.mmio64.size = phys_size / 4; in microvm_devices_init()
235 mms->gpex.mmio64.base = phys_size - mms->gpex.mmio64.size; in microvm_devices_init()
237 mms->gpex.mmio32.base = PCIE_MMIO_BASE; in microvm_devices_init()
238 mms->gpex.mmio32.size = PCIE_MMIO_SIZE; in microvm_devices_init()
239 mms->gpex.ecam.base = PCIE_ECAM_BASE; in microvm_devices_init()
240 mms->gpex.ecam.size = PCIE_ECAM_SIZE; in microvm_devices_init()
241 mms->gpex.irq = mms->pcie_irq_base; in microvm_devices_init()
243 x86ms->pci_irq_mask = ((1 << (mms->pcie_irq_base + 0)) | in microvm_devices_init()
244 (1 << (mms->pcie_irq_base + 1)) | in microvm_devices_init()
245 (1 << (mms->pcie_irq_base + 2)) | in microvm_devices_init()
246 (1 << (mms->pcie_irq_base + 3))); in microvm_devices_init()
248 x86ms->pci_irq_mask = 0; in microvm_devices_init()
251 if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) { in microvm_devices_init()
256 gsi_state->i8259_irq[i] = i8259[i]; in microvm_devices_init()
261 if (x86ms->pit == ON_OFF_AUTO_ON || x86ms->pit == ON_OFF_AUTO_AUTO) { in microvm_devices_init()
269 if (mms->rtc == ON_OFF_AUTO_ON || in microvm_devices_init()
270 (mms->rtc == ON_OFF_AUTO_AUTO && !kvm_enabled())) { in microvm_devices_init()
274 if (mms->isa_serial) { in microvm_devices_init()
295 if (machine->ram_size > lowmem) { in microvm_memory_init()
296 x86ms->above_4g_mem_size = machine->ram_size - lowmem; in microvm_memory_init()
297 x86ms->below_4g_mem_size = lowmem; in microvm_memory_init()
299 x86ms->above_4g_mem_size = 0; in microvm_memory_init()
300 x86ms->below_4g_mem_size = machine->ram_size; in microvm_memory_init()
304 memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram, in microvm_memory_init()
305 0, x86ms->below_4g_mem_size); in microvm_memory_init()
308 e820_add_entry(0, x86ms->below_4g_mem_size, E820_RAM); in microvm_memory_init()
310 if (x86ms->above_4g_mem_size > 0) { in microvm_memory_init()
312 memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", in microvm_memory_init()
313 machine->ram, in microvm_memory_init()
314 x86ms->below_4g_mem_size, in microvm_memory_init()
315 x86ms->above_4g_mem_size); in microvm_memory_init()
318 e820_add_entry(0x100000000ULL, x86ms->above_4g_mem_size, E820_RAM); in microvm_memory_init()
324 fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, machine->smp.cpus); in microvm_memory_init()
325 fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, machine->smp.max_cpus); in microvm_memory_init()
326 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)machine->ram_size); in microvm_memory_init()
331 if (machine->kernel_filename != NULL) { in microvm_memory_init()
332 mmc->x86_load_linux(x86ms, fw_cfg, 0, true); in microvm_memory_init()
335 if (mms->option_roms) { in microvm_memory_init()
341 x86ms->fw_cfg = fw_cfg; in microvm_memory_init()
342 x86ms->ioapic_as = &address_space_memory; in microvm_memory_init()
389 cmdline = g_strdup(machine->kernel_cmdline); in microvm_fix_kernel_cmdline()
391 QTAILQ_FOREACH(kid, &bus->children, sibling) { in microvm_fix_kernel_cmdline()
392 DeviceState *dev = kid->child; in microvm_fix_kernel_cmdline()
396 VirtioBusState *mmio_virtio_bus = &mmio->bus; in microvm_fix_kernel_cmdline()
397 BusState *mmio_bus = &mmio_virtio_bus->parent_obj; in microvm_fix_kernel_cmdline()
399 if (!QTAILQ_EMPTY(&mmio_bus->children)) { in microvm_fix_kernel_cmdline()
401 (mmio_bus->name, mms->virtio_irq_base); in microvm_fix_kernel_cmdline()
412 fw_cfg_modify_i32(x86ms->fw_cfg, FW_CFG_CMDLINE_SIZE, strlen(cmdline) + 1); in microvm_fix_kernel_cmdline()
413 fw_cfg_modify_string(x86ms->fw_cfg, FW_CFG_CMDLINE_DATA, cmdline); in microvm_fix_kernel_cmdline()
423 cpu->host_phys_bits = true; /* need reliable phys-bits */ in microvm_device_pre_plug_cb()
462 fw_cfg_add_e820(x86ms->fw_cfg); in microvm_machine_done()
471 if (x86ms->acpi_dev) { in microvm_powerdown_req()
472 Object *obj = OBJECT(x86ms->acpi_dev); in microvm_powerdown_req()
474 adevc->send_event(ACPI_DEVICE_IF(x86ms->acpi_dev), in microvm_powerdown_req()
485 mms->kernel_cmdline_fixed = false; in microvm_machine_state_init()
487 mms->machine_done.notify = microvm_machine_done; in microvm_machine_state_init()
488 qemu_add_machine_init_done_notifier(&mms->machine_done); in microvm_machine_state_init()
489 mms->powerdown_req.notify = microvm_powerdown_req; in microvm_machine_state_init()
490 qemu_register_powerdown_notifier(&mms->powerdown_req); in microvm_machine_state_init()
506 machine->kernel_filename != NULL && in microvm_machine_reset()
507 mms->auto_kernel_cmdline && !mms->kernel_cmdline_fixed) { in microvm_machine_reset()
509 mms->kernel_cmdline_fixed = true; in microvm_machine_reset()
525 OnOffAuto rtc = mms->rtc; in microvm_machine_get_rtc()
535 visit_type_OnOffAuto(v, name, &mms->rtc, errp); in microvm_machine_set_rtc()
542 OnOffAuto pcie = mms->pcie; in microvm_machine_get_pcie()
552 visit_type_OnOffAuto(v, name, &mms->pcie, errp); in microvm_machine_set_pcie()
559 OnOffAuto ioapic2 = mms->ioapic2; in microvm_machine_get_ioapic2()
569 visit_type_OnOffAuto(v, name, &mms->ioapic2, errp); in microvm_machine_set_ioapic2()
576 return mms->isa_serial; in microvm_machine_get_isa_serial()
584 mms->isa_serial = value; in microvm_machine_set_isa_serial()
591 return mms->option_roms; in microvm_machine_get_option_roms()
599 mms->option_roms = value; in microvm_machine_set_option_roms()
606 return mms->auto_kernel_cmdline; in microvm_machine_get_auto_kernel_cmdline()
614 mms->auto_kernel_cmdline = value; in microvm_machine_set_auto_kernel_cmdline()
622 mms->rtc = ON_OFF_AUTO_AUTO; in microvm_machine_initfn()
623 mms->pcie = ON_OFF_AUTO_AUTO; in microvm_machine_initfn()
624 mms->ioapic2 = ON_OFF_AUTO_AUTO; in microvm_machine_initfn()
625 mms->isa_serial = true; in microvm_machine_initfn()
626 mms->option_roms = true; in microvm_machine_initfn()
627 mms->auto_kernel_cmdline = true; in microvm_machine_initfn()
635 { "pcie-root-port", "io-reserve", "0" },
645 mmc->x86_load_linux = x86_load_linux; in microvm_class_init()
647 mc->init = microvm_machine_state_init; in microvm_class_init()
649 mc->family = "microvm_i386"; in microvm_class_init()
650 mc->desc = "microvm (i386)"; in microvm_class_init()
651 mc->units_per_default_bus = 1; in microvm_class_init()
652 mc->no_floppy = 1; in microvm_class_init()
653 mc->max_cpus = 288; in microvm_class_init()
654 mc->has_hotpluggable_cpus = false; in microvm_class_init()
655 mc->auto_enable_numa_with_memhp = false; in microvm_class_init()
656 mc->auto_enable_numa_with_memdev = false; in microvm_class_init()
657 mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE; in microvm_class_init()
658 mc->nvdimm_supported = false; in microvm_class_init()
659 mc->default_ram_id = "microvm.ram"; in microvm_class_init()
662 mc->default_kernel_irqchip_split = true; in microvm_class_init()
665 mc->reset = microvm_machine_reset; in microvm_class_init()
668 mc->get_hotplug_handler = microvm_get_hotplug_handler; in microvm_class_init()
669 hc->pre_plug = microvm_device_pre_plug_cb; in microvm_class_init()
670 hc->plug = microvm_device_plug_cb; in microvm_class_init()
671 hc->unplug_request = microvm_device_unplug_request_cb; in microvm_class_init()
672 hc->unplug = microvm_device_unplug_cb; in microvm_class_init()
674 x86mc->fwcfg_dma_enabled = true; in microvm_class_init()
695 "Enable second IO-APIC"); in microvm_class_init()
701 "Set off to disable the instantiation an ISA serial port"); in microvm_class_init()
707 "Set off to disable loading option ROMs"); in microvm_class_init()
714 "Set off to disable adding virtio-mmio devices to the kernel cmdline"); in microvm_class_init()
718 compat_props_add(mc->compat_props, microvm_properties, in microvm_class_init()