#@TYPE: Machine
#@NAME: genericarm64
#@DESCRIPTION: Generic Arm64 machine for typical SystemReady IR/ES platforms, which
#have working firmware and boot via EFI.

require conf/machine/include/arm/arch-armv8a.inc

# Arm Base System Architecture says v8.0+ is allowed, but FEAT_CRC32 is required
DEFAULTTUNE = "armv8a-crc"

MACHINE_FEATURES = "acpi alsa bluetooth efi keyboard pci qemu-usermode rtc screen usbhost vfat wifi"

KERNEL_IMAGETYPE = "Image"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"

# Install all the kernel modules into the rootfs
MACHINE_EXTRA_RRECOMMENDS += "kernel-modules"
# Install selected pieces of firmware
MACHINE_EXTRA_RRECOMMENDS += "\
    linux-firmware-bcm43455 \
    linux-firmware-wl12xx \
    linux-firmware-wl18xx \
    linux-firmware-rtl-nic \
    ${@bb.utils.contains_any('DISTRO_FEATURES', 'opencl opengl vulkan', 'linux-firmware-qcom-adreno-a660 linux-firmware-qcom-qcm6490-adreno', '', d)} \
    ${@bb.utils.contains('DISTRO_FEATURES', 'wifi', 'linux-firmware-ath11k-wcn6750 linux-firmware-qcom-qcm6490-wifi', '', d)} \
    ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'linux-firmware-qca-wcn6750', '', d)} \
    linux-firmware-qcom-qcm6490-audio \
    linux-firmware-qcom-qcm6490-compute \
    linux-firmware-qcom-vpu \
"
# increase default size since we install a lot of kernel drivers and firmware by default
INITRAMFS_MAXSIZE = "260000"

# Use an initramfs and populate it with the kernel modules and key firmware
INITRAMFS_IMAGE ?= "core-image-initramfs-boot"
PACKAGE_INSTALL:append:pn-core-image-initramfs-boot = " ${MACHINE_EXTRA_RRECOMMENDS}"

IMAGE_FSTYPES ?= "wic.zst"
WKS_FILE ?= "genericarm64.wks.in"

EFI_PROVIDER ?= "${@bb.utils.contains("DISTRO_FEATURES", "systemd", "systemd-boot", "grub-efi", d)}"

# Try to bring up a selection of physical or virtual serial consoles
SERIAL_CONSOLES ?= "115200;ttyAMA0 115200;hvc0 115200;ttyS0 115200;ttyS1 115200;ttyS2 115200;ttyPS1"

# Allow u-boot to be built for use with qemu-system-aarch64.
# This u-boot is _not_ suitable for use with real hardware, and the expectation
# of this machine is that real hardware comes with the firmware pre-loaded.
UBOOT_MACHINE ?= "qemu_arm64_defconfig"

# runqemu configuration to run a genericarm64 image inside a qemu-system-aarch64. You will need
# to build u-boot explicitly.
IMAGE_CLASSES += "qemuboot"
QB_SYSTEM_NAME ?= "qemu-system-aarch64"
# Boot the virtual machine with either an emulated Cortex-A76, or the host if using KVM
QB_MACHINE ?= "-machine virt"
QB_CPU ?= "-cpu cortex-a76"
QB_CPU_KVM ?= "-cpu host -machine gic-version=3"
QB_SMP ?= "-smp 4"
# Boot into U-Boot and let that scan the disk for the next step, don't pass any kernel or filesystem hints
QB_DEFAULT_BIOS ?= "u-boot.bin"
QB_DEFAULT_KERNEL ?= "none"
QB_DEFAULT_FSTYPE ?= "wic.zst"
QB_FSINFO ?= "wic:no-kernel-in-fs"
# Mount the wic rootfs as a virtio block device
QB_ROOTFS_OPT ?= "-drive id=root,file=@ROOTFS@,if=none,format=raw -device virtio-blk-pci,drive=root"
# Virtio graphics
QB_GRAPHICS ?= "-device virtio-gpu-pci"
# Virtio serial consoles
QB_SERIAL_OPT ?= "-device virtio-serial-pci -chardev null,id=virtcon -device virtconsole,chardev=virtcon"
QB_TCPSERIAL_OPT ?= "-device virtio-serial-pci -chardev socket,id=virtcon,port=@PORT@,host=127.0.0.1,nodelay=on -device virtconsole,chardev=virtcon"
# Virtio networking
QB_TAP_OPT ?= "-netdev tap,id=net0,ifname=@TAP@,script=no,downscript=no"

# If we're running testimage then we're in a qemu, so ensure u-boot is build
TESTIMAGEDEPENDS:append = " u-boot:do_deploy"
