Lines Matching +full:ecam +full:- +full:based
2 * Generic Loongson-3 Platform support
4 * Copyright (c) 2018-2020 Huacai Chen (chenhc@lemote.com)
5 * Copyright (c) 2018-2020 Jiaxun Yang <jiaxun.yang@flygoat.com>
22 * Generic virtualized PC Platform based on Loongson-3 CPU (MIPS64R2 with
32 #include "hw/char/serial-mm.h"
45 #include "hw/pci-host/gpex.h"
52 #include "qemu/error-report.h"
59 * Loongson-3's virtual machine BIOS can be obtained here:
60 * 1, https://github.com/loongson-community/firmware-nonfree
104 #define TYPE_LOONGSON_MACHINE MACHINE_TYPE_NAME("loongson3-virt")
184 bp->efi.smbios.vers = cpu_to_le16(1); in init_boot_param()
185 init_reset_system(&(bp->reset_system)); in init_boot_param()
187 init_loongson_params(&(bp->efi.smbios.lp), p, in init_boot_param()
290 fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)current_machine->smp.cpus); in fw_conf_init()
291 fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)current_machine->smp.max_cpus); in fw_conf_init()
296 fw_cfg_add_file(fw_cfg, "etc/system-states", in fw_conf_init()
323 ret += (1 + snprintf(cmdline_buf + ret, 256 - ret, "g")); in set_prom_cmdline()
328 ret += (1 + snprintf(cmdline_buf + ret, 256 - ret, in set_prom_cmdline()
333 ret += (1 + snprintf(cmdline_buf + ret, 256 - ret, "%s", in set_prom_cmdline()
386 loaderparams.ram_size - initrd_offset); in load_kernel()
389 if (initrd_size == (target_ulong) -1) { in load_kernel()
405 CPUMIPSState *env = &cpu->env; in main_cpu_reset()
409 /* Loongson-3 reset stuff */ in main_cpu_reset()
412 env->active_tc.gpr[4] = loaderparams.a0; in main_cpu_reset()
413 env->active_tc.gpr[5] = loaderparams.a1; in main_cpu_reset()
414 env->active_tc.gpr[6] = loaderparams.a2; in main_cpu_reset()
415 env->active_tc.PC = loaderparams.kernel_entry; in main_cpu_reset()
417 env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL)); in main_cpu_reset()
434 pci_bus = PCI_HOST_BRIDGE(dev)->bus; in loongson3_virt_devices_init()
436 s->ecam_alias = g_new0(MemoryRegion, 1); in loongson3_virt_devices_init()
438 memory_region_init_alias(s->ecam_alias, OBJECT(dev), "pcie-ecam", in loongson3_virt_devices_init()
442 s->ecam_alias); in loongson3_virt_devices_init()
444 s->mmio_alias = g_new0(MemoryRegion, 1); in loongson3_virt_devices_init()
446 memory_region_init_alias(s->mmio_alias, OBJECT(dev), "pcie-mmio", in loongson3_virt_devices_init()
451 s->mmio_alias); in loongson3_virt_devices_init()
453 s->pio_alias = g_new0(MemoryRegion, 1); in loongson3_virt_devices_init()
454 memory_region_init_alias(s->pio_alias, OBJECT(dev), "pcie-pio", in loongson3_virt_devices_init()
458 virt_memmap[VIRT_PCIE_PIO].base, s->pio_alias); in loongson3_virt_devices_init()
470 if (defaults_enabled() && object_class_by_name("pci-ohci")) { in loongson3_virt_devices_init()
473 pci_create_simple(pci_bus, -1, "pci-ohci"); in loongson3_virt_devices_init()
476 usb_create_simple(usb_bus, "usb-kbd"); in loongson3_virt_devices_init()
477 usb_create_simple(usb_bus, "usb-tablet"); in loongson3_virt_devices_init()
480 pci_init_nic_devices(pci_bus, mc->default_nic); in loongson3_virt_devices_init()
493 const char *kernel_cmdline = machine->kernel_cmdline; in mips_loongson3_virt_init()
494 const char *kernel_filename = machine->kernel_filename; in mips_loongson3_virt_init()
495 const char *initrd_filename = machine->initrd_filename; in mips_loongson3_virt_init()
496 ram_addr_t ram_size = machine->ram_size; in mips_loongson3_virt_init()
506 if (!machine->cpu_type) { in mips_loongson3_virt_init()
507 machine->cpu_type = MIPS_CPU_TYPE_NAME("Loongson-3A1000"); in mips_loongson3_virt_init()
509 if (!cpu_type_supports_isa(machine->cpu_type, INSN_LOONGSON3A)) { in mips_loongson3_virt_init()
510 error_report("Loongson-3/TCG needs a Loongson-3 series cpu"); in mips_loongson3_virt_init()
514 if (!machine->cpu_type) { in mips_loongson3_virt_init()
515 machine->cpu_type = MIPS_CPU_TYPE_NAME("Loongson-3A4000"); in mips_loongson3_virt_init()
517 if (!strstr(machine->cpu_type, "Loongson-3A4000")) { in mips_loongson3_virt_init()
518 error_report("Loongson-3/KVM needs cpu type Loongson-3A4000"); in mips_loongson3_virt_init()
524 error_report("Loongson-3 machine needs at least 512MB memory"); in mips_loongson3_virt_init()
541 qdev_prop_set_uint32(ipi, "num-cpu", machine->smp.cpus); in mips_loongson3_virt_init()
561 cpuclk = clock_new(OBJECT(machine), "cpu-refclk"); in mips_loongson3_virt_init()
564 for (i = 0; i < machine->smp.cpus; i++) { in mips_loongson3_virt_init()
570 cpu = mips_cpu_create_with_clock(machine->cpu_type, cpuclk, false); in mips_loongson3_virt_init()
580 qdev_connect_gpio_out(ipi, i, cpu->env.irq[6]); in mips_loongson3_virt_init()
584 if (ase_lcsr_available(&MIPS_CPU(cpu)->env)) { in mips_loongson3_virt_init()
589 memory_region_add_subregion(&MIPS_CPU(cpu)->env.iocsr.mr, in mips_loongson3_virt_init()
591 s->core_iocsr[i] = core_iocsr; in mips_loongson3_virt_init()
595 continue; /* Only node-0 can be connected to LIOINTC */ in mips_loongson3_virt_init()
601 pin, cpu->env.irq[ip + 2]); in mips_loongson3_virt_init()
604 env = &MIPS_CPU(first_cpu)->env; in mips_loongson3_virt_init()
610 machine->ram, 0, virt_memmap[VIRT_LOWMEM].size); in mips_loongson3_virt_init()
620 virt_memmap[VIRT_HIGHMEM].base, machine->ram); in mips_loongson3_virt_init()
626 * Please use -L to set the BIOS path and -bios to set bios name. in mips_loongson3_virt_init()
641 machine->firmware ?: LOONGSON3_BIOSNAME); in mips_loongson3_virt_init()
648 bios_size = -1; in mips_loongson3_virt_init()
653 error_report("Could not load MIPS bios '%s'", machine->firmware); in mips_loongson3_virt_init()
667 mc->desc = "Loongson-3 Virtualization Platform"; in loongson3v_machine_class_init()
668 mc->init = mips_loongson3_virt_init; in loongson3v_machine_class_init()
669 mc->block_default_type = IF_IDE; in loongson3v_machine_class_init()
670 mc->max_cpus = LOONGSON_MAX_VCPUS; in loongson3v_machine_class_init()
671 mc->default_ram_id = "loongson3.highram"; in loongson3v_machine_class_init()
672 mc->default_ram_size = 1600 * MiB; in loongson3v_machine_class_init()
673 mc->minimum_page_bits = 14; in loongson3v_machine_class_init()
674 mc->default_nic = "virtio-net-pci"; in loongson3v_machine_class_init()