Lines Matching +full:gfx +full:- +full:mem
7 * See the COPYING file in the top-level directory.
9 * SPDX-License-Identifier: GPL-2.0-or-later
11 * VMApple is the device model that the macOS built-in hypervisor called
20 #include "qemu/error-report.h"
21 #include "qemu/guest-random.h"
22 #include "qemu/help-texts.h"
31 #include "hw/qdev-properties.h"
40 #include "hw/pci-host/gpex.h"
41 #include "hw/usb/hcd-xhci-pci.h"
42 #include "hw/virtio/virtio-pci.h"
47 #include "qapi/qapi-visit-common.h"
49 #include "standard-headers/linux/input.h"
134 static void create_bdif(VMAppleMachineState *vms, MemoryRegion *mem) in create_bdif() argument
159 sysbus_mmio_map(bdif_sb, 0, vms->memmap[VMAPPLE_BDOOR].base); in create_bdif()
167 static void create_pvpanic(VMAppleMachineState *vms, MemoryRegion *mem) in create_pvpanic() argument
171 vms->pvpanic = qdev_new(TYPE_PVPANIC_MMIO_DEVICE); in create_pvpanic()
172 pvpanic = SYS_BUS_DEVICE(vms->pvpanic); in create_pvpanic()
173 sysbus_mmio_map(pvpanic, 0, vms->memmap[VMAPPLE_PVPANIC].base); in create_pvpanic()
178 static bool create_cfg(VMAppleMachineState *vms, MemoryRegion *mem, in create_cfg() argument
186 vms->cfg = qdev_new(TYPE_VMAPPLE_CFG); in create_cfg()
187 cfg = SYS_BUS_DEVICE(vms->cfg); in create_cfg()
188 sysbus_mmio_map(cfg, 0, vms->memmap[VMAPPLE_CONFIG].base); in create_cfg()
192 qdev_prop_set_uint32(vms->cfg, "nr-cpus", machine->smp.cpus); in create_cfg()
193 qdev_prop_set_uint64(vms->cfg, "ecid", vms->uuid); in create_cfg()
194 qdev_prop_set_uint64(vms->cfg, "ram-size", machine->ram_size); in create_cfg()
195 qdev_prop_set_uint32(vms->cfg, "rnd", rnd); in create_cfg()
205 static void create_gfx(VMAppleMachineState *vms, MemoryRegion *mem) in create_gfx() argument
207 int irq_gfx = vms->irqmap[VMAPPLE_APV_GFX]; in create_gfx()
208 int irq_iosfc = vms->irqmap[VMAPPLE_APV_IOSFC]; in create_gfx()
209 SysBusDevice *gfx; in create_gfx() local
211 gfx = SYS_BUS_DEVICE(qdev_new("apple-gfx-mmio")); in create_gfx()
212 sysbus_mmio_map(gfx, 0, vms->memmap[VMAPPLE_APV_GFX].base); in create_gfx()
213 sysbus_mmio_map(gfx, 1, vms->memmap[VMAPPLE_APV_IOSFC].base); in create_gfx()
214 sysbus_connect_irq(gfx, 0, qdev_get_gpio_in(vms->gic, irq_gfx)); in create_gfx()
215 sysbus_connect_irq(gfx, 1, qdev_get_gpio_in(vms->gic, irq_iosfc)); in create_gfx()
216 sysbus_realize_and_unref(gfx, &error_fatal); in create_gfx()
219 static void create_aes(VMAppleMachineState *vms, MemoryRegion *mem) in create_aes() argument
221 int irq = vms->irqmap[VMAPPLE_AES_1]; in create_aes()
225 sysbus_mmio_map(aes, 0, vms->memmap[VMAPPLE_AES_1].base); in create_aes()
226 sysbus_mmio_map(aes, 1, vms->memmap[VMAPPLE_AES_2].base); in create_aes()
227 sysbus_connect_irq(aes, 0, qdev_get_gpio_in(vms->gic, irq)); in create_aes()
236 static void create_gic(VMAppleMachineState *vms, MemoryRegion *mem) in create_gic() argument
243 unsigned int smp_cpus = ms->smp.cpus; in create_gic()
245 vms->gic = qdev_new(gicv3_class_name()); in create_gic()
246 qdev_prop_set_uint32(vms->gic, "revision", 3); in create_gic()
247 qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus); in create_gic()
249 * Note that the num-irq property counts both internal and external in create_gic()
252 qdev_prop_set_uint32(vms->gic, "num-irq", NUM_IRQS + 32); in create_gic()
255 vms->memmap[VMAPPLE_GIC_REDIST].size / GICV3_REDIST_SIZE; in create_gic()
260 qdev_prop_set_array(vms->gic, "redist-region-count", redist_region_count); in create_gic()
262 gicbusdev = SYS_BUS_DEVICE(vms->gic); in create_gic()
264 sysbus_mmio_map(gicbusdev, 0, vms->memmap[VMAPPLE_GIC_DIST].base); in create_gic()
265 sysbus_mmio_map(gicbusdev, 1, vms->memmap[VMAPPLE_GIC_REDIST].base); in create_gic()
277 qdev_get_gpio_in(vms->gic, in create_gic()
288 MemoryRegion *mem, Chardev *chr) in create_uart() argument
290 hwaddr base = vms->memmap[uart].base; in create_uart()
291 int irq = vms->irqmap[uart]; in create_uart()
297 memory_region_add_subregion(mem, base, in create_uart()
299 sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq)); in create_uart()
304 hwaddr base = vms->memmap[VMAPPLE_RTC].base; in create_rtc()
305 int irq = vms->irqmap[VMAPPLE_RTC]; in create_rtc()
307 sysbus_create_simple("pl031", base, qdev_get_gpio_in(vms->gic, irq)); in create_rtc()
318 MemoryRegion *mem) in create_gpio_devices() argument
321 hwaddr base = vms->memmap[gpio].base; in create_gpio_devices()
322 int irq = vms->irqmap[gpio]; in create_gpio_devices()
331 memory_region_add_subregion(mem, base, sysbus_mmio_get_region(s, 0)); in create_gpio_devices()
332 sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq)); in create_gpio_devices()
333 gpio_key_dev = sysbus_create_simple("gpio-key", -1, in create_gpio_devices()
340 hwaddr size = vms->memmap[VMAPPLE_FIRMWARE].size; in vmapple_firmware_init()
341 hwaddr base = vms->memmap[VMAPPLE_FIRMWARE].base; in vmapple_firmware_init()
346 bios_name = MACHINE(vms)->firmware; in vmapple_firmware_init()
358 memory_region_init_ram(&vms->fw_mr, NULL, "firmware", size, &error_fatal); in vmapple_firmware_init()
359 image_size = load_image_mr(fname, &vms->fw_mr); in vmapple_firmware_init()
367 memory_region_add_subregion(get_system_memory(), base, &vms->fw_mr); in vmapple_firmware_init()
372 hwaddr base_mmio = vms->memmap[VMAPPLE_PCIE_MMIO].base; in create_pcie()
373 hwaddr size_mmio = vms->memmap[VMAPPLE_PCIE_MMIO].size; in create_pcie()
374 hwaddr base_ecam = vms->memmap[VMAPPLE_PCIE_ECAM].base; in create_pcie()
375 hwaddr size_ecam = vms->memmap[VMAPPLE_PCIE_ECAM].size; in create_pcie()
376 int irq = vms->irqmap[VMAPPLE_PCIE]; in create_pcie()
387 qdev_prop_set_uint32(dev, "num-irqs", GPEX_NUM_IRQS); in create_pcie()
392 memory_region_init_alias(&vms->ecam_alias, OBJECT(dev), "pcie-ecam", in create_pcie()
395 &vms->ecam_alias); in create_pcie()
398 * Map the MMIO window from [0x50000000-0x7fff0000] in PCI space into in create_pcie()
399 * system address space at [0x50000000-0x7fff0000]. in create_pcie()
403 memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio", in create_pcie()
409 qdev_get_gpio_in(vms->gic, irq + i)); in create_pcie()
414 vms->bus = pci->bus; in create_pcie()
415 g_assert(vms->bus); in create_pcie()
417 while ((dev = qemu_create_nic_device("virtio-net-pci", true, NULL))) { in create_pcie()
418 qdev_realize_and_unref(dev, BUS(vms->bus), &error_fatal); in create_pcie()
423 qdev_realize_and_unref(usb_controller, BUS(pci->bus), &error_fatal); in create_pcie()
427 usb_create_simple(usb_bus, "usb-kbd"); in create_pcie()
428 usb_create_simple(usb_bus, "usb-tablet"); in create_pcie()
435 hwaddr base = vms->memmap[VMAPPLE_FIRMWARE].base; in vmapple_reset()
447 unsigned int smp_cpus = machine->smp.cpus; in mach_vmapple_init()
448 unsigned int max_cpus = machine->smp.max_cpus; in mach_vmapple_init()
450 vms->memmap = memmap; in mach_vmapple_init()
451 machine->usb = true; in mach_vmapple_init()
453 possible_cpus = mc->possible_cpu_arch_ids(machine); in mach_vmapple_init()
454 assert(possible_cpus->len == max_cpus); in mach_vmapple_init()
455 for (n = 0; n < possible_cpus->len; n++) { in mach_vmapple_init()
463 cpu = object_new(possible_cpus->cpus[n].type); in mach_vmapple_init()
464 object_property_set_int(cpu, "mp-affinity", in mach_vmapple_init()
465 possible_cpus->cpus[n].arch_id, &error_fatal); in mach_vmapple_init()
468 cs->cpu_index = n; in mach_vmapple_init()
470 numa_cpu_pre_plug(&possible_cpus->cpus[cs->cpu_index], DEVICE(cpu), in mach_vmapple_init()
479 object_property_set_int(cpu, "psci-conduit", QEMU_PSCI_CONDUIT_HVC, in mach_vmapple_init()
482 /* Secondary CPUs start in PSCI powered-down state */ in mach_vmapple_init()
484 object_property_set_bool(cpu, "start-powered-off", true, in mach_vmapple_init()
493 memory_region_add_subregion(sysmem, vms->memmap[VMAPPLE_MEM].base, in mach_vmapple_init()
494 machine->ram); in mach_vmapple_init()
511 vms->powerdown_notifier.notify = vmapple_powerdown_req; in mach_vmapple_init()
512 qemu_register_powerdown_notifier(&vms->powerdown_notifier); in mach_vmapple_init()
514 vms->bootinfo.ram_size = machine->ram_size; in mach_vmapple_init()
515 vms->bootinfo.board_id = -1; in mach_vmapple_init()
516 vms->bootinfo.loader_start = vms->memmap[VMAPPLE_MEM].base; in mach_vmapple_init()
517 vms->bootinfo.skip_dtb_autoload = true; in mach_vmapple_init()
518 vms->bootinfo.firmware_loaded = true; in mach_vmapple_init()
519 arm_load_kernel(ARM_CPU(first_cpu), machine, &vms->bootinfo); in mach_vmapple_init()
528 const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms); in vmapple_cpu_index_to_props()
530 assert(cpu_index < possible_cpus->len); in vmapple_cpu_index_to_props()
531 return possible_cpus->cpus[cpu_index].props; in vmapple_cpu_index_to_props()
537 return idx % ms->numa_state->num_nodes; in vmapple_get_default_cpu_node_id()
543 unsigned int max_cpus = ms->smp.max_cpus; in vmapple_possible_cpu_arch_ids()
545 if (ms->possible_cpus) { in vmapple_possible_cpu_arch_ids()
546 assert(ms->possible_cpus->len == max_cpus); in vmapple_possible_cpu_arch_ids()
547 return ms->possible_cpus; in vmapple_possible_cpu_arch_ids()
550 ms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) + in vmapple_possible_cpu_arch_ids()
552 ms->possible_cpus->len = max_cpus; in vmapple_possible_cpu_arch_ids()
553 for (n = 0; n < ms->possible_cpus->len; n++) { in vmapple_possible_cpu_arch_ids()
554 ms->possible_cpus->cpus[n].type = ms->cpu_type; in vmapple_possible_cpu_arch_ids()
555 ms->possible_cpus->cpus[n].arch_id = in vmapple_possible_cpu_arch_ids()
557 ms->possible_cpus->cpus[n].props.has_thread_id = true; in vmapple_possible_cpu_arch_ids()
558 ms->possible_cpus->cpus[n].props.thread_id = n; in vmapple_possible_cpu_arch_ids()
560 return ms->possible_cpus; in vmapple_possible_cpu_arch_ids()
564 { TYPE_VIRTIO_PCI, "disable-legacy", "on" },
567 * even when (as here) there is no MSI(-X) support. Disabling interrupter
570 { TYPE_XHCI_PCI, "conditional-intr-mapping", "on" },
577 mc->init = mach_vmapple_init; in vmapple_machine_class_init()
578 mc->max_cpus = 32; in vmapple_machine_class_init()
579 mc->block_default_type = IF_VIRTIO; in vmapple_machine_class_init()
580 mc->no_cdrom = 1; in vmapple_machine_class_init()
581 mc->pci_allow_0_address = true; in vmapple_machine_class_init()
582 mc->minimum_page_bits = 12; in vmapple_machine_class_init()
583 mc->possible_cpu_arch_ids = vmapple_possible_cpu_arch_ids; in vmapple_machine_class_init()
584 mc->cpu_index_to_instance_props = vmapple_cpu_index_to_props; in vmapple_machine_class_init()
585 mc->default_cpu_type = ARM_CPU_TYPE_NAME("host"); in vmapple_machine_class_init()
586 mc->get_default_cpu_node_id = vmapple_get_default_cpu_node_id; in vmapple_machine_class_init()
587 mc->default_ram_id = "mach-vmapple.ram"; in vmapple_machine_class_init()
588 mc->desc = "Apple aarch64 Virtual Machine"; in vmapple_machine_class_init()
590 compat_props_add(mc->compat_props, vmapple_compat_defaults, in vmapple_machine_class_init()
598 vms->irqmap = irqmap; in vmapple_instance_init()
600 object_property_add_uint64_ptr(obj, "uuid", &vms->uuid, in vmapple_instance_init()