#@TYPE: Machine
#@NAME: Generic versal
#@DESCRIPTION: versal devices

# Deprecated board config
USE_BOARD = "${@"conf/machine/include/xilinx-board-pre.inc" if d.getVar("BOARD") or d.getVar("BOARD_VARIANT") else ""}"
require ${USE_BOARD}
unset USE_BOARD

#### Preamble
MACHINEOVERRIDES =. "${@['', 'versal-generic:']['versal-generic' != '${MACHINE}']}"
#### Regular settings follow

require conf/machine/include/soc-versal.inc
require conf/machine/include/machine-xilinx-default.inc
require conf/machine/include/machine-xilinx-qemu.inc

MACHINE_FEATURES += "rtc ext2 ext3 vfat usbhost"

EXTRA_IMAGEDEPENDS += "libyaml-native python3-cython-native python3-pyyaml-native"

UBOOT_MACHINE ?= "xilinx_versal_virt_defconfig"

SERIAL_CONSOLES ?= "115200;ttyAMA0"

MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "device-tree"

HDF_MACHINE = "vck190-versal"

# Default SD image build onfiguration, use qemu-sd to pad
IMAGE_CLASSES += "image-types-xilinx-qemu"
IMAGE_FSTYPES += "wic.qemu-sd"
WKS_FILES ?= "sdimage-bootpart.wks"

EXTRA_IMAGEDEPENDS += " \
   arm-trusted-firmware \
   virtual/boot-bin \
   virtual/bootloader \
   virtual/psm-firmware \
   virtual/plm \
   u-boot-zynq-scr \
   qemu-devicetrees \
   virtual/cdo \
"

IMAGE_BOOT_FILES += " \
    boot.bin \
    ${@bb.utils.contains('PREFERRED_PROVIDER_virtual/dtb', 'device-tree', 'system.dtb', '', d)} \
    Image \
    boot.scr \
"


# This machine has a QEMU model, runqemu setup:
QB_MEM = "-m 8G"
QB_DEFAULT_KERNEL = "none"
QB_NETWORK_DEVICE = ""
QB_KERNEL_CMDLINE_APPEND ?= ""
QB_NET = "none"

QB_DEFAULT_FSTYPE:qemuboot-xilinx = "wic.qemu-sd"
QB_OPT_APPEND:append:qemuboot-xilinx = " -boot mode=5"
QB_ROOTFS_OPT:qemuboot-xilinx = " -drive if=sd,index=1,file=@ROOTFS@,format=raw"

# Use booti 80000 6000000 4000000 to launch
QB_OPT_APPEND ?= " -serial null -serial null -serial mon:stdio -display none"

QEMU_HW_DTB_PATH = "${DEPLOY_DIR_IMAGE}/qemu-hw-devicetrees/multiarch"
QEMU_HW_DTB_PS ?="${QEMU_HW_DTB_PATH}/board-versal-ps-vck190.dtb"
QEMU_HW_DTB_PMC ?="${QEMU_HW_DTB_PATH}/board-versal-pmc-vc-p-a2197-00.dtb"

QEMU_HW_DTB_PS_vp1202-versal = "${QEMU_HW_DTB_PATH}/board-versal-vp1202-ps-virt.dtb"
QEMU_HW_DTB_PMC_vp1202-versal = "${QEMU_HW_DTB_PATH}/board-versal-vp1202-pmc-virt.dtb"

QB_OPT_APPEND:append:qemuboot-xilinx = " \
    -hw-dtb ${QEMU_HW_DTB_PS} \
    -display none \
    -net nic -net user,tftp=${DEPLOY_DIR_IMAGE} \
    "

# PLM instance args
QB_PLM_OPT = " \
    -M microblaze-fdt \
    -device loader,file=${DEPLOY_DIR_IMAGE}/BOOT-${MACHINE}_bh.bin,addr=0xF201E000,force-raw  \
    -device loader,addr=0xf0000000,data=0xba020004,data-len=4 \
    -device loader,addr=0xf0000004,data=0xb800fffc,data-len=4 \
    -device loader,file=${DEPLOY_DIR_IMAGE}/pmc_cdo.bin,addr=0xf2000000,force-raw \
    -device loader,file=${DEPLOY_DIR_IMAGE}/plm-${MACHINE}.elf,cpu-num=1 \
    -device loader,addr=0xF1110624,data=0x0,data-len=4 \
    -device loader,addr=0xF1110620,data=0x1,data-len=4 \
    -hw-dtb ${QEMU_HW_DTB_PMC} \
    -display none \
    "
QB_OPT_APPEND:append:qemuboot-xilinx = " -plm-args '${QB_PLM_OPT}'"

#### No additional settings should be after the Postamble
#### Postamble
PACKAGE_EXTRA_ARCHS:append = "${@['', ' versal_generic']['versal-generic' != "${MACHINE}"]}"

# Deprecated board config
USE_BOARD = "${@"conf/machine/include/xilinx-board-post.inc" if d.getVar("BOARD") or d.getVar("BOARD_VARIANT") else ""}"
require ${USE_BOARD}
unset USE_BOARD
