From 7aeccbeaf418826795f7f1be4715d857628f8982 Mon Sep 17 00:00:00 2001 From: Scott Murray Date: Wed, 23 Nov 2022 15:37:20 -0500 Subject: [PATCH] agl-qemu-runner: Add recipes Add recipes for agl-qemu-runner.sh QEMU wrapper script and template systemd unit, and guest per-image configuration files and systemd unit links for the various demo platform images. The configurations for the demo images can be mixed and matched somewhat, but only one each of IVI and cluster should be used, as there are some static CPU assignments in the configurations. As well, this has only been tested on the AGL reference hardware at present, some rework will likely be required to support other platforms. There is room to add a bbclass to simplify the guest configuration recipes, but that has not been done for now as this approach may be temporary; a switch to libvirtd with appropriate configurations is likely. Bug-AGL: SPEC-4618 Change-Id: Ieefbd4081cca506f915957cc313411a5ed1ece5c Signed-off-by: Scott Murray (cherry picked from commit dce8116fb1a1b6f3c2976db126d9f923e2fe4c6f) --- .../files/agl-cluster-demo-platform-flutter.conf | 4 ++ .../files/agl-cluster-demo-platform.conf | 4 ++ .../qemu-config/files/agl-demo-platform.conf | 6 ++ .../files/agl-ivi-demo-platform-flutter.conf | 6 ++ ...emu-config-agl-cluster-demo-platform-flutter.bb | 29 +++++++++ .../qemu-config-agl-cluster-demo-platform.bb | 29 +++++++++ .../qemu-config/qemu-config-agl-demo-platform.bb | 29 +++++++++ .../qemu-config-agl-ivi-demo-platform-flutter.bb | 29 +++++++++ .../agl-qemu-runner/agl-qemu-runner.bb | 25 ++++++++ .../agl-qemu-runner/files/agl-qemu-runner.sh | 71 ++++++++++++++++++++++ .../agl-qemu-runner/files/agl-qemu-runner@.service | 11 ++++ 11 files changed, 243 insertions(+) create mode 100644 recipes-config/qemu-config/files/agl-cluster-demo-platform-flutter.conf create mode 100644 recipes-config/qemu-config/files/agl-cluster-demo-platform.conf create mode 100644 recipes-config/qemu-config/files/agl-demo-platform.conf create mode 100644 recipes-config/qemu-config/files/agl-ivi-demo-platform-flutter.conf create mode 100644 recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform-flutter.bb create mode 100644 recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform.bb create mode 100644 recipes-config/qemu-config/qemu-config-agl-demo-platform.bb create mode 100644 recipes-config/qemu-config/qemu-config-agl-ivi-demo-platform-flutter.bb create mode 100644 recipes-extended/agl-qemu-runner/agl-qemu-runner.bb create mode 100755 recipes-extended/agl-qemu-runner/files/agl-qemu-runner.sh create mode 100644 recipes-extended/agl-qemu-runner/files/agl-qemu-runner@.service diff --git a/recipes-config/qemu-config/files/agl-cluster-demo-platform-flutter.conf b/recipes-config/qemu-config/files/agl-cluster-demo-platform-flutter.conf new file mode 100644 index 000000000..262f3c2d4 --- /dev/null +++ b/recipes-config/qemu-config/files/agl-cluster-demo-platform-flutter.conf @@ -0,0 +1,4 @@ +QEMU_TASKSET_CPUS="4-7" +QEMU_SMP_OPT="-smp 4" +QEMU_MEM_OPT="-m 2G" +QEMU_KERNEL_CMDLINE_APPEND="root=/dev/vda rw mem=2048M video=Virtual-1:1920x1080" diff --git a/recipes-config/qemu-config/files/agl-cluster-demo-platform.conf b/recipes-config/qemu-config/files/agl-cluster-demo-platform.conf new file mode 100644 index 000000000..262f3c2d4 --- /dev/null +++ b/recipes-config/qemu-config/files/agl-cluster-demo-platform.conf @@ -0,0 +1,4 @@ +QEMU_TASKSET_CPUS="4-7" +QEMU_SMP_OPT="-smp 4" +QEMU_MEM_OPT="-m 2G" +QEMU_KERNEL_CMDLINE_APPEND="root=/dev/vda rw mem=2048M video=Virtual-1:1920x1080" diff --git a/recipes-config/qemu-config/files/agl-demo-platform.conf b/recipes-config/qemu-config/files/agl-demo-platform.conf new file mode 100644 index 000000000..e72386789 --- /dev/null +++ b/recipes-config/qemu-config/files/agl-demo-platform.conf @@ -0,0 +1,6 @@ +QEMU_TASKSET_CPUS="0-3" +QEMU_SMP_OPT="-smp 4" +QEMU_MEM_OPT="-m 4G" +QEMU_INPUT_OPT="-device virtio-tablet-device" +QEMU_AUDIO_OPT="-audiodev alsa,id=agl -device intel-hda -device hda-duplex,audiodev=agl" +QEMU_KERNEL_CMDLINE_APPEND="root=/dev/vda rw mem=4196M video=Virtual-1:1920x1080" diff --git a/recipes-config/qemu-config/files/agl-ivi-demo-platform-flutter.conf b/recipes-config/qemu-config/files/agl-ivi-demo-platform-flutter.conf new file mode 100644 index 000000000..e72386789 --- /dev/null +++ b/recipes-config/qemu-config/files/agl-ivi-demo-platform-flutter.conf @@ -0,0 +1,6 @@ +QEMU_TASKSET_CPUS="0-3" +QEMU_SMP_OPT="-smp 4" +QEMU_MEM_OPT="-m 4G" +QEMU_INPUT_OPT="-device virtio-tablet-device" +QEMU_AUDIO_OPT="-audiodev alsa,id=agl -device intel-hda -device hda-duplex,audiodev=agl" +QEMU_KERNEL_CMDLINE_APPEND="root=/dev/vda rw mem=4196M video=Virtual-1:1920x1080" diff --git a/recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform-flutter.bb b/recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform-flutter.bb new file mode 100644 index 000000000..c15528a6e --- /dev/null +++ b/recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform-flutter.bb @@ -0,0 +1,29 @@ +SUMMARY = "Setting files for agl-cluster-demo-plaform-flutter guest VM" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +inherit systemd allarch + +SRC_URI = "file://${QEMU_IMAGE}.conf" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +QEMU_IMAGE = "agl-cluster-demo-platform-flutter" +QEMU_UNIT = "agl-qemu-runner@${QEMU_IMAGE}.service" + +do_install() { + # Install template unit links + install -d ${D}${systemd_system_unitdir} + ln -sf agl-qemu-runner@.service ${D}${systemd_system_unitdir}/${QEMU_UNIT} + install -d ${D}${systemd_system_unitdir}/multi-user.target.wants + ln -sf ${systemd_system_unitdir}/${QEMU_UNIT} ${D}${systemd_system_unitdir}/multi-user.target.wants/${QEMU_UNIT} + + # Install conf file + install -d ${D}${sysconfdir}/agl-qemu-runner + install -m 0644 ${WORKDIR}/${QEMU_IMAGE}.conf ${D}${sysconfdir}/agl-qemu-runner/ +} + +FILES:${PN} += "${systemd_system_unitdir}" + +RDEPENDS:${PN} += "agl-qemu-runner" diff --git a/recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform.bb b/recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform.bb new file mode 100644 index 000000000..4f9c5a92f --- /dev/null +++ b/recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform.bb @@ -0,0 +1,29 @@ +SUMMARY = "Setting files for agl-cluster-demo-plaform guest VM" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +inherit systemd allarch + +SRC_URI = "file://${QEMU_IMAGE}.conf" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +QEMU_IMAGE = "agl-cluster-demo-platform" +QEMU_UNIT = "agl-qemu-runner@${QEMU_IMAGE}.service" + +do_install() { + # Install template unit links + install -d ${D}${systemd_system_unitdir} + ln -sf agl-qemu-runner@.service ${D}${systemd_system_unitdir}/${QEMU_UNIT} + install -d ${D}${systemd_system_unitdir}/multi-user.target.wants + ln -sf ${systemd_system_unitdir}/${QEMU_UNIT} ${D}${systemd_system_unitdir}/multi-user.target.wants/${QEMU_UNIT} + + # Install conf file + install -d ${D}${sysconfdir}/agl-qemu-runner + install -m 0644 ${WORKDIR}/${QEMU_IMAGE}.conf ${D}${sysconfdir}/agl-qemu-runner/ +} + +FILES:${PN} += "${systemd_system_unitdir}" + +RDEPENDS:${PN} += "agl-qemu-runner" diff --git a/recipes-config/qemu-config/qemu-config-agl-demo-platform.bb b/recipes-config/qemu-config/qemu-config-agl-demo-platform.bb new file mode 100644 index 000000000..1d5e0df22 --- /dev/null +++ b/recipes-config/qemu-config/qemu-config-agl-demo-platform.bb @@ -0,0 +1,29 @@ +SUMMARY = "Setting files for agl-demo-plaform guest VM" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +inherit systemd allarch + +SRC_URI = "file://${QEMU_IMAGE}.conf" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +QEMU_IMAGE = "agl-demo-platform" +QEMU_UNIT = "agl-qemu-runner@${QEMU_IMAGE}.service" + +do_install() { + # Install template unit links + install -d ${D}${systemd_system_unitdir} + ln -sf agl-qemu-runner@.service ${D}${systemd_system_unitdir}/${QEMU_UNIT} + install -d ${D}${systemd_system_unitdir}/multi-user.target.wants + ln -sf ${systemd_system_unitdir}/${QEMU_UNIT} ${D}${systemd_system_unitdir}/multi-user.target.wants/${QEMU_UNIT} + + # Install conf file + install -d ${D}${sysconfdir}/agl-qemu-runner + install -m 0644 ${WORKDIR}/${QEMU_IMAGE}.conf ${D}${sysconfdir}/agl-qemu-runner/ +} + +FILES:${PN} += "${systemd_system_unitdir}" + +RDEPENDS:${PN} += "agl-qemu-runner" diff --git a/recipes-config/qemu-config/qemu-config-agl-ivi-demo-platform-flutter.bb b/recipes-config/qemu-config/qemu-config-agl-ivi-demo-platform-flutter.bb new file mode 100644 index 000000000..5efb7a96c --- /dev/null +++ b/recipes-config/qemu-config/qemu-config-agl-ivi-demo-platform-flutter.bb @@ -0,0 +1,29 @@ +SUMMARY = "Setting files for agl-ivi-demo-plaform-flutter guest VM" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +inherit systemd allarch + +SRC_URI = "file://${QEMU_IMAGE}.conf" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +QEMU_IMAGE = "agl-ivi-demo-platform-flutter" +QEMU_UNIT = "agl-qemu-runner@${QEMU_IMAGE}.service" + +do_install() { + # Install template unit links + install -d ${D}${systemd_system_unitdir} + ln -sf agl-qemu-runner@.service ${D}${systemd_system_unitdir}/${QEMU_UNIT} + install -d ${D}${systemd_system_unitdir}/multi-user.target.wants + ln -sf ${systemd_system_unitdir}/${QEMU_UNIT} ${D}${systemd_system_unitdir}/multi-user.target.wants/${QEMU_UNIT} + + # Install conf file + install -d ${D}${sysconfdir}/agl-qemu-runner + install -m 0644 ${WORKDIR}/${QEMU_IMAGE}.conf ${D}${sysconfdir}/agl-qemu-runner/ +} + +FILES:${PN} += "${systemd_system_unitdir}" + +RDEPENDS:${PN} += "agl-qemu-runner" diff --git a/recipes-extended/agl-qemu-runner/agl-qemu-runner.bb b/recipes-extended/agl-qemu-runner/agl-qemu-runner.bb new file mode 100644 index 000000000..b3e3a67dd --- /dev/null +++ b/recipes-extended/agl-qemu-runner/agl-qemu-runner.bb @@ -0,0 +1,25 @@ +SUMMARY = "AGL simple QEMU runner script" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10" + +inherit systemd allarch + +SRC_URI = "file://agl-qemu-runner.sh \ + file://agl-qemu-runner@.service \ +" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +do_install() { + # Install template unit + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/agl-qemu-runner@.service ${D}${systemd_system_unitdir}/ + + # Install script + install -D -m 0755 ${WORKDIR}/agl-qemu-runner.sh ${D}${sbindir}/agl-qemu-runner.sh +} + +FILES:${PN} += "${systemd_system_unitdir}" + +RDEPENDS:${PN} += "bash qemu" diff --git a/recipes-extended/agl-qemu-runner/files/agl-qemu-runner.sh b/recipes-extended/agl-qemu-runner/files/agl-qemu-runner.sh new file mode 100755 index 000000000..d12764735 --- /dev/null +++ b/recipes-extended/agl-qemu-runner/files/agl-qemu-runner.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# SPDX-License-Identifier: Apache-2.0 + +if [ -z "$1" ]; then + echo "Usage: ${basename $0} " + exit 1 +fi +image="$1" + +conf="/etc/agl-qemu-runner/${image}.conf" +if [ ! -f "$conf" ]; then + echo "No configuration file $conf" + exit 1 +fi + +. $conf + +arch="$(uname -m)" +if [ -z "$QEMU_IMAGE_ARCH" ]; then + QEMU_IMAGE_ARCH="virtio-${arch}" +fi + +disk="/var/lib/machines/${image}/${image}-${QEMU_IMAGE_ARCH}.ext4" +if [ ! -f "$disk" ]; then + echo "No disk image for $image" + exit 1 +fi +kernel="/var/lib/machines/${image}/Image-${QEMU_IMAGE_ARCH}.bin" +if [ ! -f "$kernel" ]; then + echo "No kernel for $image" + exit 1 +fi + +TASKSET_CMD="" +if [ -n "$QEMU_TASKSET_CPUS" ]; then + TASKSET_CMD="taskset -c ${QEMU_TASKSET_CPUS}" +fi + +export SDL_VIDEODRIVER=wayland +export XDG_RUNTIME_DIR=/run/user/1001 +# The following may be needed if the socket is not wayland-0, as SDL +# seems to lack detection logic for that case. +#export WAYLAND_DISPLAY=wayland-1 + +# This sets the XDG app id, which we need for setting outputs with +# agl-compositor +export SDL_VIDEO_WAYLAND_WMCLASS="${image}" + +${TASKSET_CMD} \ +qemu-system-${arch} \ + -enable-kvm \ + -machine virt,gic-version=max,iommu=smmuv3 \ + -cpu host \ + ${QEMU_SMP_OPT} \ + ${QEMU_MEM_OPT} \ + -kernel $kernel \ + -append "${QEMU_KERNEL_CMDLINE_APPEND}" \ + -drive id=disk0,file=${disk},format=raw,if=none \ + -serial mon:pty \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -netdev user,id=net-user \ + -device virtio-blk-device,drive=disk0 \ + -device virtio-net-device,netdev=net-user,mac=52:54:00:12:00:02 \ + -device virtio-rng-device,rng=rng0 \ + ${QEMU_INPUT_OPT} \ + -global virtio-mmio.force-legacy=false \ + -device virtio-gpu-gl-device \ + -display sdl,gl=on -vga std \ + ${QEMU_AUDIO_OPT} \ + ${QEMU_EXTRA_OPT} \ + -full-screen diff --git a/recipes-extended/agl-qemu-runner/files/agl-qemu-runner@.service b/recipes-extended/agl-qemu-runner/files/agl-qemu-runner@.service new file mode 100644 index 000000000..a9e9f3346 --- /dev/null +++ b/recipes-extended/agl-qemu-runner/files/agl-qemu-runner@.service @@ -0,0 +1,11 @@ +[Unit] +Requires=agl-session@agl-driver.service +After=agl-session@agl-driver.service + +[Service] +Type=simple +ExecStart=/usr/sbin/agl-qemu-runner.sh %i +Restart=on-failure + +[Install] +WantedBy=multi-user.target -- 2.16.6