agl-qemu-runner: Add recipes 98/28198/1
authorScott Murray <scott.murray@konsulko.com>
Wed, 23 Nov 2022 20:37:20 +0000 (15:37 -0500)
committerScott Murray <scott.murray@konsulko.com>
Wed, 23 Nov 2022 21:17:51 +0000 (16:17 -0500)
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 <scott.murray@konsulko.com>
recipes-config/qemu-config/files/agl-cluster-demo-platform-flutter.conf [new file with mode: 0644]
recipes-config/qemu-config/files/agl-cluster-demo-platform.conf [new file with mode: 0644]
recipes-config/qemu-config/files/agl-demo-platform.conf [new file with mode: 0644]
recipes-config/qemu-config/files/agl-ivi-demo-platform-flutter.conf [new file with mode: 0644]
recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform-flutter.bb [new file with mode: 0644]
recipes-config/qemu-config/qemu-config-agl-cluster-demo-platform.bb [new file with mode: 0644]
recipes-config/qemu-config/qemu-config-agl-demo-platform.bb [new file with mode: 0644]
recipes-config/qemu-config/qemu-config-agl-ivi-demo-platform-flutter.bb [new file with mode: 0644]
recipes-extended/agl-qemu-runner/agl-qemu-runner.bb [new file with mode: 0644]
recipes-extended/agl-qemu-runner/files/agl-qemu-runner.sh [new file with mode: 0755]
recipes-extended/agl-qemu-runner/files/agl-qemu-runner@.service [new file with mode: 0644]

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 (file)
index 0000000..262f3c2
--- /dev/null
@@ -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 (file)
index 0000000..262f3c2
--- /dev/null
@@ -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 (file)
index 0000000..e723867
--- /dev/null
@@ -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 (file)
index 0000000..e723867
--- /dev/null
@@ -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 (file)
index 0000000..c15528a
--- /dev/null
@@ -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 (file)
index 0000000..4f9c5a9
--- /dev/null
@@ -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 (file)
index 0000000..1d5e0df
--- /dev/null
@@ -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 (file)
index 0000000..5efb7a9
--- /dev/null
@@ -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 (file)
index 0000000..b3e3a67
--- /dev/null
@@ -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 (executable)
index 0000000..d127647
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/bash
+# SPDX-License-Identifier: Apache-2.0
+
+if [ -z "$1" ]; then
+    echo "Usage: ${basename $0} <image name>"
+    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 (file)
index 0000000..a9e9f33
--- /dev/null
@@ -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