summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta-agl-bsp/conf/include/agl_jetson-agx-orin-devkit.inc20
-rw-r--r--meta-agl-bsp/conf/include/agl_qemuarm.inc2
-rw-r--r--meta-agl-bsp/conf/include/agl_qemuarm64.inc2
-rw-r--r--meta-agl-bsp/conf/include/agl_raspberrypi4.inc12
-rw-r--r--meta-agl-bsp/conf/include/agl_raspberrypi5.inc21
-rw-r--r--meta-agl-bsp/conf/include/agl_rcar-nogfx.inc10
-rw-r--r--meta-agl-bsp/conf/include/agl_rk3588.inc12
-rw-r--r--meta-agl-bsp/conf/include/agl_s4sk.inc5
-rw-r--r--meta-agl-bsp/conf/machine/include/virtio.inc3
-rw-r--r--meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_12.0.3.imx.bbappend (renamed from meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend)0
-rw-r--r--meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas/0001-Porting-to-support-device-driver-Canfd-from-Control-.patch1388
-rw-r--r--meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend6
l---------meta-agl-bsp/meta-rcar-gen3-adas/cogent-symlinks/recipes-bsp/ti-bt1
-rw-r--r--meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc4
-rw-r--r--meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/si-tools/si-tools.bbappend24
-rw-r--r--meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt-firmware/ti-bt-firmware_git.bbappend6
-rw-r--r--meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt/ti-uim.service10
-rw-r--r--meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt_%.bbappend18
-rw-r--r--meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state.bbappend3
-rw-r--r--meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state/asound.state525
-rw-r--r--meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init.bbappend7
-rw-r--r--meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init/agl-compositor-rockchip.conf2
-rw-r--r--meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf.bbappend7
-rw-r--r--meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf/nanopct6_output.cfg7
-rw-r--r--meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/files/0001-WIP-Make-BSP-work-under-YP-kirkstone.patch46
-rw-r--r--meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/u-boot-sifive_2023.07.02.bbappend3
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-extended/xen/files/0001-XEN-on-RPi4-1GB-lmitation-workaround-XEN-tries-to-al.patch28
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb29
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-tools_git.bbappend11
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen_git.bbappend18
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa/0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch36
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa_24.%.bbappend3
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto-dev.bbappend10
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-aarch64-standard.scc13
-rw-r--r--meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend21
-rw-r--r--meta-agl-core/conf/distro/poky-agl.conf8
-rw-r--r--meta-agl-core/conf/templates/base/conf-notes.txt31
-rw-r--r--meta-agl-core/conf/templates/base/local.conf.sample12
-rw-r--r--meta-agl-core/files/group1
-rw-r--r--meta-agl-core/files/passwd1
-rw-r--r--meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Do-not-overwrite-CFLAGS.patch2
-rw-r--r--meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Initialize-variables.patch2
-rw-r--r--meta-agl-core/recipes-graphics/wayland/agl-compositor_git.bb2
-rw-r--r--meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bb41
-rw-r--r--meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bbappend2
-rw-r--r--meta-agl-core/recipes-graphics/wayland/weston-ini-conf/remote-output.cfg.in5
-rw-r--r--meta-agl-core/recipes-graphics/wayland/weston/0001-backend-drm-don-t-leak-gem_handle_refcnt-in-drm_dest.patch27
-rw-r--r--meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-Add-paint-node-destruction-into-weston_lay.patch60
-rw-r--r--meta-agl-core/recipes-graphics/wayland/weston/0002-backend-drm-always-create-gem_handle_refcnt-hash-tab.patch56
-rw-r--r--meta-agl-core/recipes-graphics/wayland/weston_13.0_aglcore.inc3
-rw-r--r--meta-agl-core/recipes-kernel/linux/linux-agl-config-virtio.inc8
-rw-r--r--meta-agl-core/recipes-kernel/linux/linux-agl-config.inc4
-rw-r--r--meta-agl-core/recipes-kernel/linux/linux-agl.inc3
-rw-r--r--meta-agl-core/recipes-kernel/linux/linux/virtio-aarch64.cfg29
-rw-r--r--meta-agl-core/recipes-kernel/linux/linux/virtio-drm.cfg (renamed from meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-drm.cfg)0
-rw-r--r--meta-agl-core/recipes-kernel/linux/linux/virtio-pci.cfg (renamed from meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-pci.cfg)0
-rw-r--r--meta-agl-core/recipes-kernel/linux/linux/virtio-scmi.cfg25
-rw-r--r--meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch166
-rw-r--r--meta-agl-core/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch41
-rw-r--r--meta-agl-flutter/README.md252
-rw-r--r--meta-agl-flutter/conf/include/agl-flutter.inc3
-rw-r--r--meta-agl-flutter/conf/layer.conf19
-rw-r--r--meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.service13
-rw-r--r--meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.toml5
-rw-r--r--meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_%.bbappend1
-rw-r--r--meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_aglflutter.inc22
-rw-r--r--meta-agl-flutter/recipes-config/agl-flutter-env/agl-flutter-env_1.0.bb16
-rw-r--r--meta-agl-flutter/recipes-graphics/toyota/files/0001-Disable-on_frame_base_surface-wl_surface_commit.patch26
-rw-r--r--meta-agl-flutter/recipes-graphics/toyota/flutter-auto_%.bbappend1
-rw-r--r--meta-agl-flutter/recipes-graphics/toyota/flutter-auto_aglflutter.inc3
-rw-r--r--meta-agl-flutter/recipes-platform/images/agl-image-flutter-debug.bb29
-rw-r--r--meta-agl-flutter/recipes-platform/images/agl-image-flutter.bb16
-rw-r--r--meta-agl-flutter/tools/.gitignore151
-rw-r--r--meta-agl-flutter/tools/configs/_globals.json5
-rw-r--r--meta-agl-flutter/tools/configs/_repos.json16
-rw-r--r--meta-agl-flutter/tools/configs/agl-qemu-master.json114
-rw-r--r--meta-agl-flutter/tools/configs/agl-qemu-octopus.json114
-rw-r--r--meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.0.json112
-rw-r--r--meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.1.json112
-rw-r--r--meta-agl-flutter/tools/configs/desktop-auto.json93
l---------meta-agl-flutter/tools/flutter_workspace.py1
-rw-r--r--meta-agl-kuksa-val/conf/layer.conf13
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0001-dbc2val-add-installation-mechanism.patch77
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0002-dbc2val-usability-improvements.patch80
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0003-dbc2val-fix-token-file-configuration-option.patch32
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0004-Enable-val2dbc-for-sensor-values.patch174
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.default3
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.service12
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider_git.bb84
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0001-kuksa-client-Update-cmd2-completer-usage.patch161
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0002-Tweak-grpcio-tools-requirement.patch30
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client_git.bb41
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker-crates.inc988
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/0001-Remove-protobuf-src-usage.patch133
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/kuksa-databroker.service12
-rw-r--r--meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker_git.bb56
-rw-r--r--meta-agl-kuksa-val/recipes-devtools/python/python3-anytree_2.8.0.bb16
-rw-r--r--meta-agl-kuksa-val/recipes-devtools/python/python3-can-j1939_2.0.6.bb13
-rw-r--r--meta-agl-kuksa-val/recipes-devtools/python/python3-deprecation_2.1.0.bb12
-rw-r--r--meta-agl-kuksa-val/recipes-devtools/python/python3-graphql-core_3.2.3.bb12
-rw-r--r--meta-agl-kuksa-val/recipes-devtools/python/python3-jsonpath-ng_1.5.3.bb15
-rw-r--r--meta-agl-kuksa-val/recipes-devtools/python/python3-py-expression-eval_0.3.14.bb14
-rw-r--r--meta-agl-kuksa-val/recipes-devtools/python/python3-setuptools-git-versioning_1.7.4.bb17
-rw-r--r--meta-agl-kuksa-val/recipes-support/vss/vss-tools_4.2.bb29
-rw-r--r--meta-agl-kuksa-val/recipes-support/vss/vss.inc5
-rw-r--r--meta-agl-kuksa-val/recipes-support/vss/vss_4.2.bb43
-rwxr-xr-xmeta-agl.md2
-rw-r--r--meta-netboot/recipes-core/initramfs-netboot/files/init.sh11
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-systemd-Do-not-override-rootprefix.patch35
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire_1.%.bbappend (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire_1.0.0.bbappend)12
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire_1.0.0.bb329
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/00-functions.lua27
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-log.conf5
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-profiles.conf29
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-alsa.conf111
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-bluetooth.conf41
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/50-AGL-pw-ic-ipc.conf15
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.conf74
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.lua.d/30-bluez-monitor.lua110
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-alsa-monitor.lua151
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-v4l2-monitor.lua48
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/40-device-defaults.lua26
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/90-enable-all.lua20
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/wireplumber.conf115
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl_git.bb35
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/00-functions.lua27
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-equalizer.conf75
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-media-role-nodes.conf184
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.conf73
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.lua.d/10-default-policy.lua137
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl_git.bb16
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber_%.bbappend9
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber_0.5.6.bb138
-rw-r--r--meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb85
-rw-r--r--templates/feature/agl-ci/99_local.conf.inc14
-rw-r--r--templates/feature/agl-flutter/50_bblayers.conf.inc10
-rw-r--r--templates/feature/agl-flutter/50_local.conf.inc5
-rw-r--r--templates/feature/agl-flutter/included.dep1
-rw-r--r--templates/feature/agl-pipewire/50_bblayers.conf.inc10
-rw-r--r--templates/feature/agl-prhash-public/99_local.conf.inc13
-rw-r--r--templates/feature/agl-selinux/50_bblayers.conf.inc3
-rw-r--r--templates/feature/agl-weston-remoting/included.dep1
-rw-r--r--templates/machine/jetson-agx-orin-devkit/50_bblayers.conf.inc1
-rw-r--r--templates/machine/jetson-agx-orin-devkit/50_local.conf.inc2
-rw-r--r--templates/machine/nanopc-t6/50_bblayers.conf.inc4
-rw-r--r--templates/machine/nanopc-t6/50_local.conf.inc3
-rw-r--r--templates/machine/nanopc-t6/README_machine_nanopc-t6.md9
-rw-r--r--templates/machine/raspberrypi5/50_bblayers.conf.inc5
-rw-r--r--templates/machine/unmatched/50_bblayers.conf.inc4
149 files changed, 6293 insertions, 1770 deletions
diff --git a/meta-agl-bsp/conf/include/agl_jetson-agx-orin-devkit.inc b/meta-agl-bsp/conf/include/agl_jetson-agx-orin-devkit.inc
new file mode 100644
index 000000000..8dc846123
--- /dev/null
+++ b/meta-agl-bsp/conf/include/agl_jetson-agx-orin-devkit.inc
@@ -0,0 +1,20 @@
+# Default IMAGE FSTYPES - tegraflash for flashing and ext3 for netboot
+AGL_DEFAULT_IMAGE_FSTYPES := "tegraflash ext3.xz"
+# Default initramfs fstypes - ext3 for netboot and cpio.gz for flashing
+AGL_DEFAULT_INITRAMFS_FSTYPES := "ext3.gz cpio.gz"
+
+# NOTE: we avoid ext4 for now due to optional features introduced in newer
+# e2fsprogs and older kernels (e.g. for the tegra) not supporting these, yet.
+# Downgrade filesystem to ext3
+IMAGE_TEGRAFLASH_FS_TYPE = "ext3"
+
+# DISABLE spdx ... fails on nvidia specific package
+INHERIT:remove = "create-spdx"
+
+# enforce nvme0n1p1
+TNSPEC_BOOTDEV:forcevariable = "nvme0n1p1"
+TNSPEC_BOOTDEV_DEFAULT:forcevariable = "nvme0n1p1"
+
+# DISABLE LTTNG due to FTBS
+LTTNGMODULES:forcevariable = ""
+LTTNGTOOLS:forcevariable = "" \ No newline at end of file
diff --git a/meta-agl-bsp/conf/include/agl_qemuarm.inc b/meta-agl-bsp/conf/include/agl_qemuarm.inc
index 2449e1800..8a41757ef 100644
--- a/meta-agl-bsp/conf/include/agl_qemuarm.inc
+++ b/meta-agl-bsp/conf/include/agl_qemuarm.inc
@@ -16,5 +16,5 @@ QB_MEM:qemuarm = "-m 2048"
# Changes to make runqemu work out-of-the-box
QB_AUDIO_DRV:qemuarm := "alsa"
QB_MACHINE:qemuarm := "-machine virt-2.11 -smp 4"
-QB_OPT_APPEND:qemuarm := "-show-cursor -device VGA,vgamem_mb=64,edid=on -device qemu-xhci -device usb-tablet -device usb-kbd -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0"
+QB_OPT_APPEND:qemuarm := "-device VGA,vgamem_mb=64,edid=on -device qemu-xhci -device usb-tablet -device usb-kbd"
QB_KERNEL_CMDLINE_APPEND:qemuarm := "console=ttyAMA0 verbose vmalloc=256M"
diff --git a/meta-agl-bsp/conf/include/agl_qemuarm64.inc b/meta-agl-bsp/conf/include/agl_qemuarm64.inc
index 46d3b4c39..8e292c50b 100644
--- a/meta-agl-bsp/conf/include/agl_qemuarm64.inc
+++ b/meta-agl-bsp/conf/include/agl_qemuarm64.inc
@@ -16,5 +16,5 @@ QB_MEM:qemuarm64 = "-m 2048"
# Changes to make runqemu work out-of-the-box
QB_AUDIO_DRV:qemuarm64 := "alsa"
QB_MACHINE:qemuarm64 := "-machine virt -smp 4"
-QB_OPT_APPEND:qemuarm64 := " -show-cursor -device VGA,vgamem_mb=64,edid=on -device qemu-xhci -device usb-tablet -device usb-kbd -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0"
+QB_OPT_APPEND:qemuarm64 := " -device VGA,vgamem_mb=64,edid=on -device qemu-xhci -device usb-tablet -device usb-kbd"
QB_KERNEL_CMDLINE_APPEND:qemuarm64 := "console=ttyAMA0,115200n8 verbose" \ No newline at end of file
diff --git a/meta-agl-bsp/conf/include/agl_raspberrypi4.inc b/meta-agl-bsp/conf/include/agl_raspberrypi4.inc
index 4ba7ff0f6..998ffedc8 100644
--- a/meta-agl-bsp/conf/include/agl_raspberrypi4.inc
+++ b/meta-agl-bsp/conf/include/agl_raspberrypi4.inc
@@ -21,17 +21,5 @@ IMAGE_INSTALL:append = " kernel-modules linux-firmware-rpidistro-bcm43430 linux-
# Psplash causes crash on first boot on RPi
IMAGE_FEATURES:remove = "splash"
-# Build updatable image. Only takes effect when sota.bbclass is inherited
-DISTRO_FEATURES:append = " sota"
-
-# Add xen build, if the xen feature activated
-DISTRO_FEATURES:append = " ${@bb.utils.contains('AGL_XEN_WANTED', '1', ' xen', '', d)}"
-
-# add xen-tools to build
-IMAGE_INSTALL:append = " ${@bb.utils.contains('AGL_XEN_WANTED', '1', 'xen-tools xen-mkimage-rpi4', '', d)}"
-
-# Add xen-raspberry binary to boot files
-IMAGE_BOOT_FILES:append = " ${@bb.utils.contains('AGL_XEN_WANTED','1', 'xen-${MACHINE}', '',d)}"
-
#DISPLAY CONFIGURATION
WESTON_DISPLAYS:raspberrypi4 = " hdmi-a-1-90 hdmi-a-2-90"
diff --git a/meta-agl-bsp/conf/include/agl_raspberrypi5.inc b/meta-agl-bsp/conf/include/agl_raspberrypi5.inc
index a0e675956..4db5bb762 100644
--- a/meta-agl-bsp/conf/include/agl_raspberrypi5.inc
+++ b/meta-agl-bsp/conf/include/agl_raspberrypi5.inc
@@ -4,8 +4,8 @@ GPU_MEM = "256"
# Add CMA to the kernel arguments for SOTA
OSTREE_KERNEL_ARGS:sota:append = " cma=256M"
-# use u-boot always (RPi5 U-boot is not ready yet)
-RPI_USE_U_BOOT = "0"
+# use u-boot always
+RPI_USE_U_BOOT = "1"
# Use UART for serial console
ENABLE_UART ?= "1"
@@ -13,22 +13,13 @@ ENABLE_UART ?= "1"
# For libomxil
#LICENSE_FLAGS_ACCEPTED = "commercial"
-IMAGE_INSTALL:append = " kernel-modules linux-firmware-rpidistro-bcm43430 linux-firmware-rpidistro-bcm43455 create-combined-dtb "
+# For linux-firmware-rpidistro
+LICENSE_FLAGS_ACCEPTED += "synaptics-killswitch"
+
+IMAGE_INSTALL:append = " kernel-modules create-combined-dtb "
# Psplash causes crash on first boot on RPi
IMAGE_FEATURES:remove = "splash"
-# Build updatable image. Only takes effect when sota.bbclass is inherited
-DISTRO_FEATURES:append = " sota"
-
-# Add xen build, if the xen feature activated
-DISTRO_FEATURES:append = " ${@bb.utils.contains('AGL_XEN_WANTED', '1', ' xen', '', d)}"
-
-# add xen-tools to build
-IMAGE_INSTALL:append = " ${@bb.utils.contains('AGL_XEN_WANTED', '1', 'xen-tools xen-mkimage-rpi4', '', d)}"
-
-# Add xen-raspberry binary to boot files
-IMAGE_BOOT_FILES:append = " ${@bb.utils.contains('AGL_XEN_WANTED','1', 'xen-${MACHINE}', '',d)}"
-
#DISPLAY CONFIGURATION
WESTON_DISPLAYS:raspberrypi5 = " hdmi-a-1-90 hdmi-a-2-90"
diff --git a/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc b/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc
index 64e13642e..fb67fd976 100644
--- a/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc
+++ b/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc
@@ -58,13 +58,3 @@ BBMASK += "meta-renesas/meta-rcar-gen3/recipes-graphics/cogl/cogl-1.0_1.%.bbappe
# packagegroup bbclass is inherited. This can be removed when upstream
# is fixed to add the required PACKAGE_ARCH = "${MACHINE_ARCH}".
PACKAGE_ARCH:pn-packagegroup-multimedia-libs = "${MACHINE_ARCH}"
-
-# Mask out BSP layer gstreamer* 1.22.x bbappends for now, as the BSP
-# effectively is building 1.20.x plugins and packaging them as 1.22,
-# which breaks building various things. The whole directory is not
-# commented out because we still want the vspfilter plugin.
-# The BBMASKs need to be here instead of agl_rcar.ing since without
-# them there are issues with the gstreamer1.0-plugins-bad patches in
-# meta-agl-core not applying.
-BBMASK += "meta-renesas/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-omx"
-BBMASK += "meta-renesas/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-plugins-"
diff --git a/meta-agl-bsp/conf/include/agl_rk3588.inc b/meta-agl-bsp/conf/include/agl_rk3588.inc
new file mode 100644
index 000000000..4c3f6990f
--- /dev/null
+++ b/meta-agl-bsp/conf/include/agl_rk3588.inc
@@ -0,0 +1,12 @@
+# Add for gstreamer plugins ugly
+LICENSE_FLAGS_ACCEPTED:append = " commercial"
+MACHINE_FEATURES:append:rk3588 = " multimedia"
+
+BBMASK += " \
+ meta-rockchip/recipes-multimedia/gstreamer \
+ meta-rockchip/recipes-graphics/wayland/weston_%.bbappend \
+ "
+
+MACHINE_EXTRA_RRECOMMENDS:append = " \
+ alsa-state \
+"
diff --git a/meta-agl-bsp/conf/include/agl_s4sk.inc b/meta-agl-bsp/conf/include/agl_s4sk.inc
index 8f4a91b44..91a65d8b8 100644
--- a/meta-agl-bsp/conf/include/agl_s4sk.inc
+++ b/meta-agl-bsp/conf/include/agl_s4sk.inc
@@ -7,3 +7,8 @@ WKS_FILE = "singlepart-noloader.wks"
IMAGE_INSTALL:append = " \
kernel-devicetree \
"
+
+# For systemd CAN bus configuration
+#MACHINE_FEATURES:append = " canfd"
+CANBUS_NETWORK_CONFIG = "canbus-can-fd.network"
+
diff --git a/meta-agl-bsp/conf/machine/include/virtio.inc b/meta-agl-bsp/conf/machine/include/virtio.inc
index 6f8a638a0..1e4875b5d 100644
--- a/meta-agl-bsp/conf/machine/include/virtio.inc
+++ b/meta-agl-bsp/conf/machine/include/virtio.inc
@@ -15,9 +15,6 @@ RDEPENDS:${KERNEL_PACKAGE_NAME}-base = ""
# Use a common kernel recipe for all VirtIO machines
PREFERRED_PROVIDER_virtual/kernel ??= "linux-yocto"
-# Use newer kernel
-PREFERRED_VERSION_linux-yocto = "5.15.%"
-
EXTRA_IMAGEDEPENDS += "qemu-native qemu-helper-native"
IMAGE_CLASSES += "qemuboot"
diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_12.0.3.imx.bbappend
index ca162e28f..ca162e28f 100644
--- a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend
+++ b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_12.0.3.imx.bbappend
diff --git a/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas/0001-Porting-to-support-device-driver-Canfd-from-Control-.patch b/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas/0001-Porting-to-support-device-driver-Canfd-from-Control-.patch
new file mode 100644
index 000000000..69fb1ace2
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas/0001-Porting-to-support-device-driver-Canfd-from-Control-.patch
@@ -0,0 +1,1388 @@
+From a7e7a8317d5b150a97a08270ddfb711a88168add Mon Sep 17 00:00:00 2001
+From: Phat Pham <phat.pham.zg@renesas.com>
+Date: Wed, 2 Aug 2023 17:12:09 +0700
+Subject: [PATCH] Porting to support device driver Canfd from Control Domain to
+ Application Domain
+
+- Update pinctrl support for 15 canfd channels in file pfc-r8a779f0.c.
+- Update device tree to support GPIO Group 4-7 on CA55 in file r8a779f0.dtsi and r8a779f0-spider.dts,
+r8a779f0-s4sk.dts.
+- Update Canfd device nodes in device tree R9A779F0.
+- Update Source code support canfd device in rcar-canfd.c.
+
+Signed-off-by: Phat Pham <phat.pham.zg@renesas.com>
+Signed-off-by: Duy Dang <duy.dang.yw@renesas.com>
+---
+ arch/arm64/boot/dts/renesas/r8a779f0-s4sk.dts | 28 ++
+ .../boot/dts/renesas/r8a779f0-spider.dts | 160 ++++++++++++
+ arch/arm64/boot/dts/renesas/r8a779f0.dtsi | 170 +++++++++++-
+ drivers/net/can/rcar/rcar_can.c | 28 +-
+ drivers/net/can/rcar/rcar_canfd.c | 211 +++++++++++----
+ drivers/pinctrl/renesas/pfc-r8a779f0.c | 246 ++++++++++++++++++
+ 6 files changed, 780 insertions(+), 63 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/renesas/r8a779f0-s4sk.dts b/arch/arm64/boot/dts/renesas/r8a779f0-s4sk.dts
+index b6c61a20cd0d..1288285b5a9d 100644
+--- a/arch/arm64/boot/dts/renesas/r8a779f0-s4sk.dts
++++ b/arch/arm64/boot/dts/renesas/r8a779f0-s4sk.dts
+@@ -109,6 +109,24 @@ &mmc0 {
+ status = "okay";
+ };
+
++&canfd0 {
++ pinctrl-0 = <&canfd0_pins>, <&canfd1_pins>;
++ pinctrl-names = "default";
++ status = "okay";
++
++ channel0 {
++ status = "okay";
++ };
++
++ channel1 {
++ status = "okay";
++ };
++};
++
++&canfd1 {
++ status = "disabled";
++};
++
+ &pfc {
+ pinctrl-0 = <&scif_clk_pins>;
+ pinctrl-names = "default";
+@@ -203,6 +221,16 @@ pins_mdio {
+ power-source = <3300>;
+ };
+ };
++
++ canfd0_pins: canfd0 {
++ groups = "canfd0_data";
++ function = "canfd0";
++ };
++
++ canfd1_pins: canfd1 {
++ groups = "canfd1_data";
++ function = "canfd1";
++ };
+ };
+
+ &rwdt {
+diff --git a/arch/arm64/boot/dts/renesas/r8a779f0-spider.dts b/arch/arm64/boot/dts/renesas/r8a779f0-spider.dts
+index 538f413fbffd..0d6b21fe0c07 100644
+--- a/arch/arm64/boot/dts/renesas/r8a779f0-spider.dts
++++ b/arch/arm64/boot/dts/renesas/r8a779f0-spider.dts
+@@ -27,6 +27,86 @@ eeprom@51 {
+ };
+ };
+
++&canfd0 {
++ pinctrl-0 = <&canfd0_pins>, <&canfd1_pins>, <&canfd2_pins>,
++ <&canfd3_pins>, <&canfd4_pins>, <&canfd5_pins>,
++ <&canfd6_pins>, <&canfd7_pins>;
++ pinctrl-names = "default";
++ status = "okay";
++
++ channel0 {
++ status = "okay";
++ };
++
++ channel1 {
++ status = "okay";
++ };
++
++ channel2 {
++ status = "okay";
++ };
++
++ channel3 {
++ status = "okay";
++ };
++
++ channel4 {
++ status = "okay";
++ };
++
++ channel5 {
++ status = "okay";
++ };
++
++ channel6 {
++ status = "okay";
++ };
++
++ channel7 {
++ status = "okay";
++ };
++};
++
++&canfd1 {
++ pinctrl-0 = <&canfd8_pins>,<&canfd9_pins>, <&canfd10_pins>,
++ <&canfd11_pins>, <&canfd12_pins>, <&canfd13_pins>,
++ <&canfd14_pins>, <&canfd15_pins>;
++ pinctrl-names = "default";
++ status = "okay";
++
++ channel0 {
++ status = "okay";
++ };
++
++ channel1 {
++ status = "okay";
++ };
++
++ channel2 {
++ status = "okay";
++ };
++
++ channel3 {
++ status = "okay";
++ };
++
++ channel4 {
++ status = "okay";
++ };
++
++ channel5 {
++ status = "okay";
++ };
++
++ channel6 {
++ status = "okay";
++ };
++
++ channel7 {
++ status = "okay";
++ };
++};
++
+ &pfc {
+ tsn0_pins: tsn0 {
+ mux {
+@@ -73,6 +153,86 @@ pins_mdio {
+ };
+ };
+
++ canfd0_pins: canfd0 {
++ groups = "canfd0_data";
++ function = "canfd0";
++ };
++
++ canfd1_pins: canfd1 {
++ groups = "canfd1_data";
++ function = "canfd1";
++ };
++
++ canfd2_pins: canfd2 {
++ groups = "canfd2_data";
++ function = "canfd2";
++ };
++
++ canfd3_pins: canfd3 {
++ groups = "canfd3_data";
++ function = "canfd3";
++ };
++
++ canfd4_pins: canfd4 {
++ groups = "canfd4_data";
++ function = "canfd4";
++ };
++
++ canfd5_pins: canfd5 {
++ groups = "canfd5_data";
++ function = "canfd5";
++ };
++
++ canfd6_pins: canfd6 {
++ groups = "canfd6_data";
++ function = "canfd6";
++ };
++
++ canfd7_pins: canfd7 {
++ groups = "canfd7_data";
++ function = "canfd7";
++ };
++
++ canfd8_pins: canfd8 {
++ groups = "canfd8_data";
++ function = "canfd8";
++ };
++
++ canfd9_pins: canfd9 {
++ groups = "canfd9_data";
++ function = "canfd9";
++ };
++
++ canfd10_pins: canfd10 {
++ groups = "canfd10_data";
++ function = "canfd10";
++ };
++
++ canfd11_pins: canfd11 {
++ groups = "canfd11_data";
++ function = "canfd11";
++ };
++
++ canfd12_pins: canfd12 {
++ groups = "canfd12_data";
++ function = "canfd12";
++ };
++
++ canfd13_pins: canfd13 {
++ groups = "canfd13_data";
++ function = "canfd13";
++ };
++
++ canfd14_pins: canfd14 {
++ groups = "canfd14_data";
++ function = "canfd14";
++ };
++
++ canfd15_pins: canfd15 {
++ groups = "canfd15_data";
++ function = "canfd15";
++ };
++
+ pcie0_pins: pcie0 {
+ groups = "pcie0_clkreq_n";
+ function = "pcie";
+diff --git a/arch/arm64/boot/dts/renesas/r8a779f0.dtsi b/arch/arm64/boot/dts/renesas/r8a779f0.dtsi
+index ddda2fc3acd0..b930b93ab3f7 100644
+--- a/arch/arm64/boot/dts/renesas/r8a779f0.dtsi
++++ b/arch/arm64/boot/dts/renesas/r8a779f0.dtsi
+@@ -23,6 +23,13 @@ aliases {
+ i2c5 = &i2c5;
+ };
+
++ /* External CAN clock - to be overridden by boards that provide it */
++ can_clk: can {
++ compatible = "fixed-clock";
++ #clock-cells = <0>;
++ clock-frequency = <40000000>;
++ };
++
+ cluster1_opp: opp_table10 {
+ compatible = "operating-points-v2";
+ opp-shared;
+@@ -329,7 +336,7 @@ pfc: pin-controller@e6050000 {
+ compatible = "renesas,pfc-r8a779f0";
+ reg = <0 0xe6050000 0 0x16c>, <0 0xe6050800 0 0x16c>,
+ <0 0xe6051000 0 0x16c>, <0 0xe6051800 0 0x16c>,
+- <0 0xdfd90000 0 0x16c>, <0 0xdfd90800 0 0x16c>,
++ <0 0xdfd90000 0 0x16c>, <0 0xdfd90800 0 0x16c>,
+ <0 0xdfd91000 0 0x16c>, <0 0xdfd91800 0 0x16c>;
+ };
+
+@@ -389,6 +396,63 @@ gpio3: gpio@e6051980 {
+ resets = <&cpg 915>;
+ };
+
++ /* Porting GPIO GP 4~7 from Control Domain to Application Domain */
++ gpio4: gpio@dfd90180 {
++ compatible = "renesas,gpio-r8a779f0";
++ reg = <0 0xdfd90180 0 0x54>;
++ interrupts = <GIC_SPI 826 IRQ_TYPE_LEVEL_HIGH>;
++ #gpio-cells = <2>;
++ gpio-controller;
++ gpio-ranges = <&pfc 0 128 31>;
++ #interrupt-cells = <2>;
++ interrupt-controller;
++ clocks = <&cpg CPG_MOD 915>;
++ power-domains = <&sysc R8A779F0_PD_ALWAYS_ON>;
++ resets = <&cpg 915>;
++ };
++
++ gpio5: gpio@dfd90980 {
++ compatible = "renesas,gpio-r8a779f0";
++ reg = <0 0xdfd90980 0 0x54>;
++ interrupts = <GIC_SPI 827 IRQ_TYPE_LEVEL_HIGH>;
++ #gpio-cells = <2>;
++ gpio-controller;
++ gpio-ranges = <&pfc 0 160 20>;
++ #interrupt-cells = <2>;
++ interrupt-controller;
++ clocks = <&cpg CPG_MOD 915>;
++ power-domains = <&sysc R8A779F0_PD_ALWAYS_ON>;
++ resets = <&cpg 915>;
++ };
++
++ gpio6: gpio@dfd91180 {
++ compatible = "renesas,gpio-r8a779f0";
++ reg = <0 0xdfd91180 0 0x54>;
++ interrupts = <GIC_SPI 828 IRQ_TYPE_LEVEL_HIGH>;
++ #gpio-cells = <2>;
++ gpio-controller;
++ gpio-ranges = <&pfc 0 192 24>;
++ #interrupt-cells = <2>;
++ interrupt-controller;
++ clocks = <&cpg CPG_MOD 915>;
++ power-domains = <&sysc R8A779F0_PD_ALWAYS_ON>;
++ resets = <&cpg 915>;
++ };
++
++ gpio7: gpio@dfd91980 {
++ compatible = "renesas,gpio-r8a779f0";
++ reg = <0 0xdfd91980 0 0x54>;
++ interrupts = <GIC_SPI 829 IRQ_TYPE_LEVEL_HIGH>;
++ #gpio-cells = <2>;
++ gpio-controller;
++ gpio-ranges = <&pfc 0 224 32>;
++ #interrupt-cells = <2>;
++ interrupt-controller;
++ clocks = <&cpg CPG_MOD 915>;
++ power-domains = <&sysc R8A779F0_PD_ALWAYS_ON>;
++ resets = <&cpg 915>;
++ };
++
+ cpg: clock-controller@e6150000 {
+ compatible = "renesas,r8a779f0-cpg-mssr";
+ reg = <0 0xe6150000 0 0x4000>;
+@@ -410,6 +474,110 @@ sysc: system-controller@e6180000 {
+ #power-domain-cells = <1>;
+ };
+
++ canfd0: can@dff50000 {
++ compatible = "renesas,r8a779f0-canfd";
++ reg = <0 0xdff50000 0 0x8600>;
++ interrupts = <GIC_SPI 534 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 535 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 536 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 537 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 538 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 539 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 540 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 541 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 542 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&can_clk>;
++ clock-names = "can_clk";
++ assigned-clocks = <&can_clk>;
++ assigned-clock-rates = <40000000>;
++ power-domains = <&sysc R8A779F0_PD_ALWAYS_ON>;
++ status = "okay";
++
++ channel0 {
++ status = "disabled";
++ };
++
++ channel1 {
++ status = "disabled";
++ };
++
++ channel2 {
++ status = "disabled";
++ };
++
++ channel3 {
++ status = "disabled";
++ };
++
++ channel4 {
++ status = "disabled";
++ };
++
++ channel5 {
++ status = "disabled";
++ };
++
++ channel6 {
++ status = "disabled";
++ };
++
++ channel7 {
++ status = "disabled";
++ };
++ };
++
++ canfd1: can@dfd00000 {
++ compatible = "renesas,r8a779f0-canfd";
++ reg = <0 0xdfd00000 0 0x8600>;
++ interrupts = <GIC_SPI 543 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 544 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 545 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 546 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 547 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 548 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 549 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 550 IRQ_TYPE_LEVEL_HIGH>,
++ <GIC_SPI 551 IRQ_TYPE_LEVEL_HIGH>;
++ clocks = <&can_clk>;
++ clock-names = "can_clk";
++ assigned-clocks = <&can_clk>;
++ assigned-clock-rates = <40000000>;
++ power-domains = <&sysc R8A779F0_PD_ALWAYS_ON>;
++ status = "okay";
++
++ channel0 {
++ status = "disabled";
++ };
++
++ channel1 {
++ status = "disabled";
++ };
++
++ channel2 {
++ status = "disabled";
++ };
++
++ channel3 {
++ status = "disabled";
++ };
++
++ channel4 {
++ status = "disabled";
++ };
++
++ channel5 {
++ status = "disabled";
++ };
++
++ channel6 {
++ status = "disabled";
++ };
++
++ channel7 {
++ status = "disabled";
++ };
++ };
++
+ i2c0: i2c@e6500000 {
+ compatible = "renesas,i2c-r8a779f0",
+ "renesas,rcar-gen4-i2c";
+diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c
+index 48575900adb7..134eda66f0dc 100644
+--- a/drivers/net/can/rcar/rcar_can.c
++++ b/drivers/net/can/rcar/rcar_can.c
+@@ -235,11 +235,8 @@ static void rcar_can_error(struct net_device *ndev)
+ if (eifr & (RCAR_CAN_EIFR_EWIF | RCAR_CAN_EIFR_EPIF)) {
+ txerr = readb(&priv->regs->tecr);
+ rxerr = readb(&priv->regs->recr);
+- if (skb) {
++ if (skb)
+ cf->can_id |= CAN_ERR_CRTL;
+- cf->data[6] = txerr;
+- cf->data[7] = rxerr;
+- }
+ }
+ if (eifr & RCAR_CAN_EIFR_BEIF) {
+ int rx_errors = 0, tx_errors = 0;
+@@ -339,6 +336,9 @@ static void rcar_can_error(struct net_device *ndev)
+ can_bus_off(ndev);
+ if (skb)
+ cf->can_id |= CAN_ERR_BUSOFF;
++ } else if (skb) {
++ cf->data[6] = txerr;
++ cf->data[7] = rxerr;
+ }
+ if (eifr & RCAR_CAN_EIFR_ORIF) {
+ netdev_dbg(priv->ndev, "Receive overrun error interrupt\n");
+@@ -846,10 +846,12 @@ static int __maybe_unused rcar_can_suspend(struct device *dev)
+ struct rcar_can_priv *priv = netdev_priv(ndev);
+ u16 ctlr;
+
+- if (netif_running(ndev)) {
+- netif_stop_queue(ndev);
+- netif_device_detach(ndev);
+- }
++ if (!netif_running(ndev))
++ return 0;
++
++ netif_stop_queue(ndev);
++ netif_device_detach(ndev);
++
+ ctlr = readw(&priv->regs->ctlr);
+ ctlr |= RCAR_CAN_CTLR_CANM_HALT;
+ writew(ctlr, &priv->regs->ctlr);
+@@ -868,6 +870,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev)
+ u16 ctlr;
+ int err;
+
++ if (!netif_running(ndev))
++ return 0;
++
+ err = clk_enable(priv->clk);
+ if (err) {
+ netdev_err(ndev, "clk_enable() failed, error %d\n", err);
+@@ -881,10 +886,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev)
+ writew(ctlr, &priv->regs->ctlr);
+ priv->can.state = CAN_STATE_ERROR_ACTIVE;
+
+- if (netif_running(ndev)) {
+- netif_device_attach(ndev);
+- netif_start_queue(ndev);
+- }
++ netif_device_attach(ndev);
++ netif_start_queue(ndev);
++
+ return 0;
+ }
+
+diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
+index b458b5fd7900..e4f820308954 100644
+--- a/drivers/net/can/rcar/rcar_canfd.c
++++ b/drivers/net/can/rcar/rcar_canfd.c
+@@ -203,7 +203,7 @@
+ #define RCANFD_FDCFG_FDOE BIT(28)
+ #define RCANFD_FDCFG_TDCE BIT(9)
+ #define RCANFD_FDCFG_TDCOC BIT(8)
+-#define RCANFD_FDCFG_TDCO(x) (((x) & 0x7f) >> 16)
++#define RCANFD_FDCFG_TDCO(x) (((x) & 0xff) << 16)
+
+ /* RSCFDnCFDRFCCx */
+ #define RCANFD_RFCC_RFIM BIT(12)
+@@ -506,6 +506,7 @@
+ /* R-Car V3U Classical and CAN FD mode specific register map */
+ #define RCANFD_V3U_CFDCFG (0x1314)
+ #define RCANFD_V3U_DCFG(m) (0x1400 + (0x20 * (m)))
++#define RCANFD_V3U_FDCFG(m) (0x1404 + (0x20 * (m)))
+
+ #define RCANFD_V3U_GAFL_OFFSET (0x1800)
+
+@@ -574,6 +575,7 @@ struct rcar_canfd_channel {
+
+ enum rcar_canfd_chip_id {
+ R8A779G0,
++ R8A779F0,
+ R8A779A0,
+ GEN3,
+ };
+@@ -734,13 +736,17 @@ static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
+ rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0x0);
+
+ /* Set the controller into appropriate mode */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ if (gpriv->fdmode)
+- rcar_canfd_set_bit(gpriv->base, RCANFD_V3U_CFDCFG,
+- RCANFD_FDCFG_FDOE);
++ {
++ for_each_set_bit(ch, &gpriv->channels_mask, gpriv->max_channels)
++ rcar_canfd_set_bit(gpriv->base, RCANFD_V3U_FDCFG(ch),
++ RCANFD_FDCFG_FDOE);
++ }
+ else
+- rcar_canfd_set_bit(gpriv->base, RCANFD_V3U_CFDCFG,
+- RCANFD_FDCFG_CLOE);
++ for_each_set_bit(ch, &gpriv->channels_mask, gpriv->max_channels)
++ rcar_canfd_set_bit(gpriv->base, RCANFD_V3U_FDCFG(ch),
++ RCANFD_FDCFG_CLOE);
+ } else {
+ if (gpriv->fdmode)
+ rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG,
+@@ -801,7 +807,7 @@ static void rcar_canfd_configure_controller(struct rcar_canfd_global *gpriv)
+ }
+
+ static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
+- u32 ch)
++ u32 ch, int num_ch_enabled)
+ {
+ u32 cfg;
+ int offset, start, page, num_rules = RCANFD_CHANNEL_NUMRULES;
+@@ -812,7 +818,7 @@ static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
+ } else {
+ /* Get number of Channel 0 rules and adjust */
+ cfg = rcar_canfd_read(gpriv->base, RCANFD_V3U_GAFLCFG(ch));
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ start = ch * num_rules;
+ else
+ start = RCANFD_GAFLCFG_GETRNC(0, cfg);
+@@ -821,24 +827,28 @@ static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
+ /* Enable write access to entry */
+ page = RCANFD_GAFL_PAGENUM(start);
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
++ {
+ rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLECTR,
+ (RCANFD_V3U_GAFLECTR_AFLPN(page) |
+ RCANFD_GAFLECTR_AFLDAE));
++ }
+ else
+ rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLECTR,
+ (RCANFD_GAFLECTR_AFLPN(page) |
+ RCANFD_GAFLECTR_AFLDAE));
+
+ /* Write number of rules for channel */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
++ {
+ rcar_canfd_set_bit(gpriv->base, RCANFD_V3U_GAFLCFG(ch),
+ RCANFD_V3U_GAFLCFG_SETRNC(ch, num_rules));
++ }
+ else
+ rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG0,
+ RCANFD_GAFLCFG_SETRNC(ch, num_rules));
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ offset = RCANFD_V3U_GAFL_OFFSET;
+ } else {
+ if (gpriv->fdmode)
+@@ -848,13 +858,13 @@ static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
+ }
+
+ /* Accept all IDs */
+- rcar_canfd_write(gpriv->base, RCANFD_GAFLID(offset, start), 0);
++ rcar_canfd_write(gpriv->base, RCANFD_GAFLID(offset, num_ch_enabled), 0);
+ /* IDE or RTR is not considered for matching */
+- rcar_canfd_write(gpriv->base, RCANFD_GAFLM(offset, start), 0);
++ rcar_canfd_write(gpriv->base, RCANFD_GAFLM(offset, num_ch_enabled), 0);
+ /* Any data length accepted */
+- rcar_canfd_write(gpriv->base, RCANFD_GAFLP0(offset, start), 0);
++ rcar_canfd_write(gpriv->base, RCANFD_GAFLP0(offset, num_ch_enabled), 0);
+ /* Place the msg in corresponding Rx FIFO entry */
+- rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLP1(offset, start),
++ rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLP1(offset, num_ch_enabled),
+ RCANFD_GAFLP1_GAFLFDP(ridx));
+
+ /* Disable write access to page */
+@@ -879,10 +889,14 @@ static void rcar_canfd_configure_rx(struct rcar_canfd_global *gpriv, u32 ch)
+
+ cfg = (RCANFD_RFCC_RFIM | RCANFD_RFCC_RFDC(rfdc) |
+ RCANFD_RFCC_RFPLS(rfpls) | RCANFD_RFCC_RFIE);
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
++ {
+ rcar_canfd_write(gpriv->base, RCANFD_V3U_RFCC(ridx), cfg);
++ }
+ else
++ {
+ rcar_canfd_write(gpriv->base, RCANFD_RFCC(ridx), cfg);
++ }
+ }
+
+ static void rcar_canfd_configure_tx(struct rcar_canfd_global *gpriv, u32 ch)
+@@ -904,7 +918,7 @@ static void rcar_canfd_configure_tx(struct rcar_canfd_global *gpriv, u32 ch)
+ else
+ cfpls = 0; /* b000 - Max 8 bytes payload */
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ cfg = (RCANFD_V3U_CFCC_CFTML(cftml) | RCANFD_V3U_CFCC_CFM(cfm) |
+ RCANFD_V3U_CFCC_CFIM | RCANFD_V3U_CFCC_CFDC(cfdc) |
+ RCANFD_V3U_CFCC_CFPLS(cfpls) | RCANFD_V3U_CFCC_CFTXIE);
+@@ -919,8 +933,10 @@ static void rcar_canfd_configure_tx(struct rcar_canfd_global *gpriv, u32 ch)
+ }
+ if (gpriv->fdmode) {
+ /* Clear FD mode specific control/status register */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
++ {
+ addr = RCANFD_V3U_CFFDCSTS(ch, RCANFD_CFFIFO_IDX);
++ }
+ else
+ addr = RCANFD_F_CFFDCSTS(ch, RCANFD_CFFIFO_IDX);
+
+@@ -938,7 +954,9 @@ static void rcar_canfd_enable_global_interrupts(struct rcar_canfd_global *gpriv)
+ /* Global interrupts setup */
+ ctr = RCANFD_GCTR_MEIE;
+ if (gpriv->fdmode)
++ {
+ ctr |= RCANFD_GCTR_CFMPOFIE;
++ }
+
+ rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, ctr);
+ }
+@@ -1005,7 +1023,7 @@ static void rcar_canfd_global_error(struct net_device *ndev)
+ stats->tx_dropped++;
+ }
+ if (gerfl & RCANFD_GERFL_MES) {
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ addr = RCANFD_V3U_CFSTS(ch, RCANFD_CFFIFO_IDX);
+ else
+ addr = RCANFD_CFSTS(ch, RCANFD_CFFIFO_IDX);
+@@ -1018,7 +1036,7 @@ static void rcar_canfd_global_error(struct net_device *ndev)
+ rcar_canfd_write(priv->base, addr,
+ sts & ~RCANFD_CFSTS_CFMLT);
+ }
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ addr = RCANFD_V3U_RFSTS(ridx);
+ else
+ addr = RCANFD_RFSTS(ridx);
+@@ -1171,8 +1189,10 @@ static void rcar_canfd_tx_done(struct net_device *ndev)
+ u32 ch = priv->channel;
+ struct rcar_canfd_global *gpriv = priv->gpriv;
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
++ {
+ addr = RCANFD_V3U_CFSTS(ch, RCANFD_CFFIFO_IDX);
++ }
+ else
+ addr = RCANFD_CFSTS(ch, RCANFD_CFFIFO_IDX);
+
+@@ -1227,7 +1247,7 @@ static irqreturn_t rcar_canfd_global_interrupt(int irq, void *dev_id)
+
+ /* Global error interrupts */
+ gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL);
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ if (unlikely(RCANFD_V3U_GERFL_ERR(gpriv, gerfl)))
+ rcar_canfd_global_error(ndev);
+ } else {
+@@ -1235,7 +1255,7 @@ static irqreturn_t rcar_canfd_global_interrupt(int irq, void *dev_id)
+ rcar_canfd_global_error(ndev);
+ }
+ /* Handle Rx interrupts */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ addr1 = RCANFD_V3U_RFSTS(ridx);
+ addr2 = RCANFD_V3U_RFCC(ridx);
+ } else {
+@@ -1307,6 +1327,7 @@ static irqreturn_t rcar_canfd_channel_interrupt(int irq, void *dev_id)
+ sts = rcar_canfd_read(priv->base, RCANFD_CSTS(ch));
+ txerr = RCANFD_CSTS_TECCNT(sts);
+ rxerr = RCANFD_CSTS_RECCNT(sts);
++
+ if (unlikely(RCANFD_CERFL_ERR(cerfl)))
+ rcar_canfd_error(ndev, cerfl, txerr, rxerr);
+
+@@ -1316,19 +1337,57 @@ static irqreturn_t rcar_canfd_channel_interrupt(int irq, void *dev_id)
+ rcar_canfd_state_change(ndev, txerr, rxerr);
+
+ /* Handle Tx interrupts */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
++ {
+ addr = RCANFD_V3U_CFSTS(ch, RCANFD_CFFIFO_IDX);
++ }
+ else
++ {
+ addr = RCANFD_CFSTS(ch, RCANFD_CFFIFO_IDX);
++ }
+
+ sts = rcar_canfd_read(priv->base, addr);
+
+ if (likely(sts & RCANFD_CFSTS_CFTXIF))
++ {
+ rcar_canfd_tx_done(ndev);
++ }
+ }
+ return IRQ_HANDLED;
+ }
+
++static void rcar_canfd_set_samplepoint(struct net_device *dev)
++{
++ struct rcar_canfd_channel *priv = netdev_priv(dev);
++ u32 ch = priv->channel;
++ u16 tdco;
++ u32 cfg;
++ struct rcar_canfd_global *gpriv = priv->gpriv;
++
++ /* Sample point settings */
++ tdco = 2; /* TDCO = 2Tq */
++
++ /* Transceiver Delay Compensation Offset Configuration */
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
++ cfg = (RCANFD_FDCFG_TDCE |
++ RCANFD_FDCFG_TDCO(tdco));
++ rcar_canfd_set_bit(priv->base, RCANFD_V3U_FDCFG(ch), cfg);
++ }
++}
++
++static void rcar_canfd_unset_samplepoint(struct net_device *dev)
++{
++ struct rcar_canfd_channel *priv = netdev_priv(dev);
++ u32 ch = priv->channel;
++ u32 cfg;
++ struct rcar_canfd_global *gpriv = priv->gpriv;
++
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
++ cfg = RCANFD_FDCFG_TDCE; /* Disable TDC */
++ rcar_canfd_clear_bit(priv->base, RCANFD_V3U_FDCFG(ch), cfg);
++ }
++}
++
+ static void rcar_canfd_set_bittiming(struct net_device *dev)
+ {
+ struct rcar_canfd_channel *priv = netdev_priv(dev);
+@@ -1342,12 +1401,12 @@ static void rcar_canfd_set_bittiming(struct net_device *dev)
+ /* Nominal bit timing settings */
+ brp = bt->brp - 1;
+ sjw = bt->sjw - 1;
+- tseg1 = bt->prop_seg + bt->phase_seg1 + 1;
++ tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
+ tseg2 = bt->phase_seg2 - 1;
+
+ if (priv->can.ctrlmode & CAN_CTRLMODE_FD) {
+ /* CAN FD only mode */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ cfg = (RCANFD_V3U_NCFG_NTSEG1(tseg1) |
+ RCANFD_V3U_NCFG_NBRP(brp) |
+ RCANFD_V3U_NCFG_NSJW(sjw) |
+@@ -1365,10 +1424,16 @@ static void rcar_canfd_set_bittiming(struct net_device *dev)
+ /* Data bit timing settings */
+ brp = dbt->brp - 1;
+ sjw = dbt->sjw - 1;
+- tseg1 = dbt->prop_seg + dbt->phase_seg1 + 1;
++ tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1;
+ tseg2 = dbt->phase_seg2 - 1;
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ /* Set Secondary Sample Point for high baud rate */
++ if (brp == 0 && tseg1 <= 5 && tseg2 == 1)
++ rcar_canfd_set_samplepoint(dev);
++ else
++ rcar_canfd_unset_samplepoint(dev);
++
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ cfg = (RCANFD_V3U_DCFG_DTSEG1(tseg1) |
+ RCANFD_V3U_DCFG_DBRP(brp) |
+ RCANFD_V3U_DCFG_DSJW(sjw) |
+@@ -1387,7 +1452,7 @@ static void rcar_canfd_set_bittiming(struct net_device *dev)
+ brp, sjw, tseg1, tseg2);
+ } else {
+ /* Classical CAN only mode */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ cfg = (RCANFD_V3U_NCFG_NTSEG1(tseg1) |
+ RCANFD_V3U_NCFG_NBRP(brp) |
+ RCANFD_V3U_NCFG_NSJW(sjw) |
+@@ -1430,7 +1495,7 @@ static int rcar_canfd_start(struct net_device *ndev)
+ }
+
+ /* Enable Common & Rx FIFO */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ addr1 = RCANFD_V3U_CFCC(ch, RCANFD_CFFIFO_IDX);
+ addr2 = RCANFD_V3U_RFCC(ridx);
+ } else {
+@@ -1505,7 +1570,7 @@ static void rcar_canfd_stop(struct net_device *ndev)
+ rcar_canfd_disable_channel_interrupts(priv);
+
+ /* Disable Common & Rx FIFO */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ addr1 = RCANFD_V3U_CFCC(ch, RCANFD_CFFIFO_IDX);
+ addr2 = RCANFD_V3U_RFCC(ridx);
+ } else {
+@@ -1544,7 +1609,9 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
+ struct rcar_canfd_global *gpriv = priv->gpriv;
+
+ if (can_dropped_invalid_skb(ndev, skb))
++ {
+ return NETDEV_TX_OK;
++ }
+
+ if (cf->can_id & CAN_EFF_FLAG) {
+ id = cf->can_id & CAN_EFF_MASK;
+@@ -1554,11 +1621,13 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
+ }
+
+ if (cf->can_id & CAN_RTR_FLAG)
++ {
+ id |= RCANFD_CFID_CFRTR;
++ }
+
+ dlc = RCANFD_CFPTR_CFDLC(can_len2dlc(cf->len));
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ rcar_canfd_write(priv->base,
+ RCANFD_V3U_CFID(ch, RCANFD_CFFIFO_IDX), id);
+ rcar_canfd_write(priv->base,
+@@ -1622,7 +1691,7 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
+ /* Start Tx: Write 0xff to CFPC to increment the CPU-side
+ * pointer for the Common FIFO
+ */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ addr = RCANFD_V3U_CFPCTR(ch, RCANFD_CFFIFO_IDX);
+ else
+ addr = RCANFD_CFPCTR(ch, RCANFD_CFFIFO_IDX);
+@@ -1630,6 +1699,7 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
+ rcar_canfd_write(priv->base, addr, 0xff);
+
+ spin_unlock_irqrestore(&priv->tx_lock, flags);
++
+ return NETDEV_TX_OK;
+ }
+
+@@ -1643,7 +1713,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
+ u32 ridx = ch + RCANFD_RFFIFO_IDX;
+ struct rcar_canfd_global *gpriv = priv->gpriv;
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ id = rcar_canfd_read(priv->base, RCANFD_V3U_RFID(ridx));
+ dlc = rcar_canfd_read(priv->base, RCANFD_V3U_RFPTR(ridx));
+ if (priv->can.ctrlmode & CAN_CTRLMODE_FD) {
+@@ -1707,7 +1777,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
+ if (sts & RCANFD_RFFDSTS_RFBRS)
+ cf->flags |= CANFD_BRS;
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ rcar_canfd_get_data(priv, cf,
+ RCANFD_V3U_RFDF(ridx, 0));
+ else
+@@ -1719,7 +1789,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
+ if (id & RCANFD_RFID_RFRTR)
+ cf->can_id |= CAN_RTR_FLAG;
+ else
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ rcar_canfd_get_data(priv, cf,
+ RCANFD_V3U_RFDF(ridx, 0));
+ else
+@@ -1730,7 +1800,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
+ /* Write 0xff to RFPC to increment the CPU-side
+ * pointer of the Rx FIFO
+ */
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0))
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0)
+ rcar_canfd_write(priv->base, RCANFD_V3U_RFPCTR(ridx), 0xff);
+ else
+ rcar_canfd_write(priv->base, RCANFD_RFPCTR(ridx), 0xff);
+@@ -1752,7 +1822,7 @@ static int rcar_canfd_rx_poll(struct napi_struct *napi, int quota)
+ u32 ridx = ch + RCANFD_RFFIFO_IDX, addr1, addr2;
+ struct rcar_canfd_global *gpriv = priv->gpriv;
+
+- if ((gpriv->chip_id == R8A779A0) || (gpriv->chip_id == R8A779G0)) {
++ if (gpriv->chip_id == R8A779A0 || gpriv->chip_id == R8A779G0 || gpriv->chip_id == R8A779F0) {
+ addr1 = RCANFD_V3U_RFSTS(ridx);
+ addr2 = RCANFD_V3U_RFCC(ridx);
+ } else {
+@@ -1867,15 +1937,15 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
+
+ netif_napi_add(ndev, &priv->napi, rcar_canfd_rx_poll,
+ RCANFD_NAPI_WEIGHT);
++ spin_lock_init(&priv->tx_lock);
++ devm_can_led_init(ndev);
++ gpriv->ch[priv->channel] = priv;
+ err = register_candev(ndev);
+ if (err) {
+ dev_err(&pdev->dev,
+ "register_candev() failed, error %d\n", err);
+ goto fail_candev;
+ }
+- spin_lock_init(&priv->tx_lock);
+- devm_can_led_init(ndev);
+- gpriv->ch[priv->channel] = priv;
+ dev_info(&pdev->dev, "device registered (channel %u)\n", priv->channel);
+ return 0;
+
+@@ -1904,7 +1974,8 @@ static int rcar_canfd_probe(struct platform_device *pdev)
+ struct rcar_canfd_global *gpriv;
+ struct device_node *of_child;
+ unsigned long channels_mask = 0;
+- int err, ch_irq, g_irq, i;
++ int err, g_irq, ch_irq, i, num_ch_enabled = 0;
++ int ch_irq_s4[RCANFD_NUM_CHANNELS] = {0, 0, 0, 0, 0, 0, 0, 0};
+ bool fdmode = true; /* CAN FD only mode - default */
+ const struct rcar_canfd_of_data *of_data;
+ char *name[RCANFD_NUM_CHANNELS] = {
+@@ -1925,13 +1996,28 @@ static int rcar_canfd_probe(struct platform_device *pdev)
+ channels_mask |= BIT(i); /* Channel i */
+ }
+
+- ch_irq = platform_get_irq(pdev, 0);
++ /* ch_irq = platform_get_irq(pdev, 0);
+ if (ch_irq < 0) {
+ err = ch_irq;
+ goto fail_dev;
+ }
+
+ g_irq = platform_get_irq(pdev, 1);
++ if (g_irq < 0) {
++ err = g_irq;
++ goto fail_dev;
++ } */
++
++ /* Porting for R8A779F0 */
++ for (i = 0; i < RCANFD_NUM_CHANNELS; i++) {
++ ch_irq_s4[i] = platform_get_irq(pdev, i + 1);
++ if (ch_irq_s4[i] < 0) {
++ err = ch_irq_s4[i];
++ goto fail_dev;
++ }
++ }
++
++ g_irq = platform_get_irq(pdev, 0);
+ if (g_irq < 0) {
+ err = g_irq;
+ goto fail_dev;
+@@ -1950,13 +2036,14 @@ static int rcar_canfd_probe(struct platform_device *pdev)
+ gpriv->max_channels = of_data->max_channels;
+
+ /* Peripheral clock */
+- gpriv->clkp = devm_clk_get(&pdev->dev, "fck");
++ /* Porting for R8A779F0, not use fck */
++ /* gpriv->clkp = devm_clk_get(&pdev->dev, "fck");
+ if (IS_ERR(gpriv->clkp)) {
+ err = PTR_ERR(gpriv->clkp);
+ dev_err(&pdev->dev, "cannot get peripheral clock, error %d\n",
+ err);
+ goto fail_dev;
+- }
++ } */
+
+ /* fCAN clock: Pick External clock. If not available fallback to
+ * CANFD clock
+@@ -1971,15 +2058,16 @@ static int rcar_canfd_probe(struct platform_device *pdev)
+ goto fail_dev;
+ }
+ gpriv->fcan = RCANFD_CANFDCLK;
+-
+ } else {
+ gpriv->fcan = RCANFD_EXTCLK;
+ }
+ fcan_freq = clk_get_rate(gpriv->can_clk);
+
+ if (gpriv->fcan == RCANFD_CANFDCLK)
++ {
+ /* CANFD clock is further divided by (1/2) within the IP */
+ fcan_freq /= 2;
++ }
+
+ addr = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(addr)) {
+@@ -1989,14 +2077,27 @@ static int rcar_canfd_probe(struct platform_device *pdev)
+ gpriv->base = addr;
+
+ /* Request IRQ that's common for both channels */
+- err = devm_request_irq(&pdev->dev, ch_irq,
+- rcar_canfd_channel_interrupt, 0,
+- "canfd.chn", gpriv);
++ /* err = devm_request_irq(&pdev->dev, ch_irq,
++ rcar_canfd_channel_interrupt, 0,
++ "canfd.chn", gpriv);
+ if (err) {
+ dev_err(&pdev->dev, "devm_request_irq(%d) failed, error %d\n",
+ ch_irq, err);
+ goto fail_dev;
++ } */
++
++ /* Porting for R8A779F0 */
++ for (i = 0; i < RCANFD_NUM_CHANNELS; i++) {
++ err = devm_request_irq(&pdev->dev, ch_irq_s4[i],
++ rcar_canfd_channel_interrupt, 0,
++ "canfd.chn", gpriv);
++ if (err) {
++ dev_err(&pdev->dev, "devm_request_irq(%d) failed, error %d\n",
++ ch_irq_s4[i], err);
++ goto fail_dev;
++ }
+ }
++
+ err = devm_request_irq(&pdev->dev, g_irq,
+ rcar_canfd_global_interrupt, 0,
+ "canfd.gbl", gpriv);
+@@ -2032,7 +2133,8 @@ static int rcar_canfd_probe(struct platform_device *pdev)
+ rcar_canfd_configure_tx(gpriv, ch);
+
+ /* Configure receive rules */
+- rcar_canfd_configure_afl_rules(gpriv, ch);
++ rcar_canfd_configure_afl_rules(gpriv, ch, num_ch_enabled);
++ num_ch_enabled++;
+ }
+
+ /* Configure common interrupts */
+@@ -2109,6 +2211,11 @@ static const struct rcar_canfd_of_data of_rcanfd_v4h_compatible = {
+ .max_channels = 8,
+ };
+
++static const struct rcar_canfd_of_data of_rcanfd_s4_compatible = {
++ .chip_id = R8A779F0,
++ .max_channels = 8,
++};
++
+ static const struct rcar_canfd_of_data of_rcanfd_v3u_compatible = {
+ .chip_id = R8A779A0,
+ .max_channels = 8,
+@@ -2124,6 +2231,10 @@ static const struct of_device_id rcar_canfd_of_table[] = {
+ .compatible = "renesas,r8a779g0-canfd",
+ .data = &of_rcanfd_v4h_compatible,
+ },
++ {
++ .compatible = "renesas,r8a779f0-canfd",
++ .data = &of_rcanfd_s4_compatible,
++ },
+ {
+ .compatible = "renesas,r8a779a0-canfd",
+ .data = &of_rcanfd_v3u_compatible,
+diff --git a/drivers/pinctrl/renesas/pfc-r8a779f0.c b/drivers/pinctrl/renesas/pfc-r8a779f0.c
+index de01d4d6b1b1..822b4f7e450f 100644
+--- a/drivers/pinctrl/renesas/pfc-r8a779f0.c
++++ b/drivers/pinctrl/renesas/pfc-r8a779f0.c
+@@ -11,8 +11,10 @@
+ #include <linux/io.h>
+ #include <linux/kernel.h>
+
++#include "core.h"
+ #include "sh_pfc.h"
+
++#define ENABLE_ACCESS_TO_CONTROL_DOMAIN
+ #define CFG_FLAGS (SH_PFC_PIN_CFG_DRIVE_STRENGTH | SH_PFC_PIN_CFG_PULL_UP_DOWN)
+
+ #define CPU_ALL_GP(fn, sfx) \
+@@ -1170,6 +1172,150 @@ static const struct sh_pfc_pin pinmux_pins[] = {
+ PINMUX_GPIO_GP_ALL(),
+ };
+
++/* - CANFD0 ----------------------------------------------------------------- */
++static const unsigned int canfd0_data_pins[] = {
++ /* CANFD0_TX, CANFD0_RX */
++ RCAR_GP_PIN(7, 0), RCAR_GP_PIN(7, 1),
++};
++static const unsigned int canfd0_data_mux[] = {
++ CAN0TX_MARK, CAN0RX_INTP0_MARK,
++};
++
++/* - CANFD1 ----------------------------------------------------------------- */
++static const unsigned int canfd1_data_pins[] = {
++ /* CANFD1_TX, CANFD1_RX */
++ RCAR_GP_PIN(7, 2), RCAR_GP_PIN(7, 3),
++};
++static const unsigned int canfd1_data_mux[] = {
++ CAN1TX_MARK, CAN1RX_INTP1_MARK,
++};
++
++/* - CANFD2 ----------------------------------------------------------------- */
++static const unsigned int canfd2_data_pins[] = {
++ /* CANFD2_TX, CANFD2_RX */
++ RCAR_GP_PIN(7, 4), RCAR_GP_PIN(7, 5),
++};
++static const unsigned int canfd2_data_mux[] = {
++ CAN2TX_MARK, CAN2RX_INTP2_MARK,
++};
++
++/* - CANFD3 ----------------------------------------------------------------- */
++static const unsigned int canfd3_data_pins[] = {
++ /* CANFD2_TX, CANFD2_RX */
++ RCAR_GP_PIN(7, 6), RCAR_GP_PIN(7, 7),
++};
++static const unsigned int canfd3_data_mux[] = {
++ CAN3TX_MARK, CAN3RX_INTP3_MARK,
++};
++
++/* - CANFD4 ----------------------------------------------------------------- */
++static const unsigned int canfd4_data_pins[] = {
++ /* CANFD4_TX, CANFD4_RX */
++ RCAR_GP_PIN(7, 8), RCAR_GP_PIN(7, 9),
++};
++static const unsigned int canfd4_data_mux[] = {
++ CAN4TX_MARK, CAN4RX_INTP4_MARK,
++};
++
++/* - CANFD5 ----------------------------------------------------------------- */
++static const unsigned int canfd5_data_pins[] = {
++ /* CANFD5_TX, CANFD5_RX */
++ RCAR_GP_PIN(7, 10), RCAR_GP_PIN(7, 11),
++};
++static const unsigned int canfd5_data_mux[] = {
++ CAN5TX_MARK, CAN5RX_INTP5_MARK,
++};
++
++/* - CANFD6 ----------------------------------------------------------------- */
++static const unsigned int canfd6_data_pins[] = {
++ /* CANFD6_TX, CANFD6_RX */
++ RCAR_GP_PIN(7, 12), RCAR_GP_PIN(7, 13),
++};
++static const unsigned int canfd6_data_mux[] = {
++ CAN6TX_MARK, CAN6RX_INTP6_MARK,
++};
++
++/* - CANFD7 ----------------------------------------------------------------- */
++static const unsigned int canfd7_data_pins[] = {
++ /* CANFD7_TX, CANFD7_RX */
++ RCAR_GP_PIN(7, 14), RCAR_GP_PIN(7, 15),
++};
++static const unsigned int canfd7_data_mux[] = {
++ CAN7TX_MARK, CAN7RX_INTP7_MARK,
++};
++
++/* - CANFD8 ----------------------------------------------------------------- */
++static const unsigned int canfd8_data_pins[] = {
++ /* CANFD8_TX, CANFD8_RX */
++ RCAR_GP_PIN(7, 16), RCAR_GP_PIN(7, 17),
++};
++static const unsigned int canfd8_data_mux[] = {
++ CAN8TX_MARK, CAN8RX_INTP8_MARK,
++};
++
++/* - CANFD9 ----------------------------------------------------------------- */
++static const unsigned int canfd9_data_pins[] = {
++ /* CANFD9_TX, CANFD9_RX */
++ RCAR_GP_PIN(7, 18), RCAR_GP_PIN(7, 19),
++};
++static const unsigned int canfd9_data_mux[] = {
++ CAN9TX_MARK, CAN9RX_INTP9_MARK,
++};
++
++/* - CANFD10 ----------------------------------------------------------------- */
++static const unsigned int canfd10_data_pins[] = {
++ /* CANFD10_TX, CANFD10_RX */
++ RCAR_GP_PIN(7, 20), RCAR_GP_PIN(7, 21),
++};
++static const unsigned int canfd10_data_mux[] = {
++ CAN10TX_MARK, CAN10RX_INTP10_MARK,
++};
++
++/* - CANFD11 ----------------------------------------------------------------- */
++static const unsigned int canfd11_data_pins[] = {
++ /* CANFD11_TX, CANFD11_RX */
++ RCAR_GP_PIN(7, 22), RCAR_GP_PIN(7, 23),
++};
++static const unsigned int canfd11_data_mux[] = {
++ CAN11TX_MARK, CAN11RX_INTP11_MARK,
++};
++
++/* - CANFD12 ----------------------------------------------------------------- */
++static const unsigned int canfd12_data_pins[] = {
++ /* CANFD12_TX, CANFD12_RX */
++ RCAR_GP_PIN(7, 24), RCAR_GP_PIN(7, 25),
++};
++static const unsigned int canfd12_data_mux[] = {
++ CAN12TX_MARK, CAN12RX_INTP12_MARK,
++};
++
++/* - CANFD13 ----------------------------------------------------------------- */
++static const unsigned int canfd13_data_pins[] = {
++ /* CANFD13_TX, CANFD13_RX */
++ RCAR_GP_PIN(7, 26), RCAR_GP_PIN(7, 27),
++};
++static const unsigned int canfd13_data_mux[] = {
++ CAN13TX_MARK, CAN13RX_INTP13_MARK,
++};
++
++/* - CANFD14 ----------------------------------------------------------------- */
++static const unsigned int canfd14_data_pins[] = {
++ /* CANFD14_TX, CANFD14_RX */
++ RCAR_GP_PIN(7, 28), RCAR_GP_PIN(7, 29),
++};
++static const unsigned int canfd14_data_mux[] = {
++ CAN14TX_MARK, CAN14RX_INTP14_MARK,
++};
++
++/* - CANFD15 ----------------------------------------------------------------- */
++static const unsigned int canfd15_data_pins[] = {
++ /* CANFD15_TX, CANFD15_RX */
++ RCAR_GP_PIN(7, 30), RCAR_GP_PIN(7, 31),
++};
++static const unsigned int canfd15_data_mux[] = {
++ CAN15TX_MARK, CAN15RX_INTP15_MARK,
++};
++
+ /* - TSN0 ------------------------------------------------ */
+ static const unsigned int tsn0_link_pins[] = {
+ /* TSN0_LINK */
+@@ -1893,6 +2039,88 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
+ SH_PFC_PIN_GROUP(taud1_pwm5),
+ SH_PFC_PIN_GROUP(taud1_pwm6),
+ SH_PFC_PIN_GROUP(taud1_pwm7),
++
++ SH_PFC_PIN_GROUP(canfd0_data),
++ SH_PFC_PIN_GROUP(canfd1_data),
++ SH_PFC_PIN_GROUP(canfd2_data),
++ SH_PFC_PIN_GROUP(canfd3_data),
++ SH_PFC_PIN_GROUP(canfd4_data),
++ SH_PFC_PIN_GROUP(canfd5_data),
++ SH_PFC_PIN_GROUP(canfd6_data),
++ SH_PFC_PIN_GROUP(canfd7_data),
++
++ SH_PFC_PIN_GROUP(canfd8_data),
++ SH_PFC_PIN_GROUP(canfd9_data),
++ SH_PFC_PIN_GROUP(canfd10_data),
++ SH_PFC_PIN_GROUP(canfd11_data),
++ SH_PFC_PIN_GROUP(canfd12_data),
++ SH_PFC_PIN_GROUP(canfd13_data),
++ SH_PFC_PIN_GROUP(canfd14_data),
++ SH_PFC_PIN_GROUP(canfd15_data),
++};
++
++static const char * const canfd0_groups[] = {
++ "canfd0_data",
++};
++
++static const char * const canfd1_groups[] = {
++ "canfd1_data",
++};
++
++static const char * const canfd2_groups[] = {
++ "canfd2_data",
++};
++
++static const char * const canfd3_groups[] = {
++ "canfd3_data",
++};
++
++static const char * const canfd4_groups[] = {
++ "canfd4_data",
++};
++
++static const char * const canfd5_groups[] = {
++ "canfd5_data",
++};
++
++static const char * const canfd6_groups[] = {
++ "canfd6_data",
++};
++
++static const char * const canfd7_groups[] = {
++ "canfd7_data",
++};
++
++static const char * const canfd8_groups[] = {
++ "canfd8_data",
++};
++
++static const char * const canfd9_groups[] = {
++ "canfd9_data",
++};
++
++static const char * const canfd10_groups[] = {
++ "canfd10_data",
++};
++
++static const char * const canfd11_groups[] = {
++ "canfd11_data",
++};
++
++static const char * const canfd12_groups[] = {
++ "canfd12_data",
++};
++
++static const char * const canfd13_groups[] = {
++ "canfd13_data",
++};
++
++static const char * const canfd14_groups[] = {
++ "canfd14_data",
++};
++
++static const char * const canfd15_groups[] = {
++ "canfd15_data",
+ };
+
+ static const char * const tsn0_groups[] = {
+@@ -2050,6 +2278,24 @@ static const char * const taud1_pwm_groups[] = {
+ };
+
+ static const struct sh_pfc_function pinmux_functions[] = {
++ SH_PFC_FUNCTION(canfd0),
++ SH_PFC_FUNCTION(canfd1),
++ SH_PFC_FUNCTION(canfd2),
++ SH_PFC_FUNCTION(canfd3),
++ SH_PFC_FUNCTION(canfd4),
++ SH_PFC_FUNCTION(canfd5),
++ SH_PFC_FUNCTION(canfd6),
++ SH_PFC_FUNCTION(canfd7),
++
++ SH_PFC_FUNCTION(canfd8),
++ SH_PFC_FUNCTION(canfd9),
++ SH_PFC_FUNCTION(canfd10),
++ SH_PFC_FUNCTION(canfd11),
++ SH_PFC_FUNCTION(canfd12),
++ SH_PFC_FUNCTION(canfd13),
++ SH_PFC_FUNCTION(canfd14),
++ SH_PFC_FUNCTION(canfd15),
++
+ SH_PFC_FUNCTION(tsn0),
+ SH_PFC_FUNCTION(tsn1),
+ SH_PFC_FUNCTION(tsn2),
+--
+2.25.1
+
diff --git a/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend b/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend
index d565da8ac..4baf07552 100644
--- a/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend
+++ b/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend
@@ -1,3 +1,9 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+SRC_URI:append = " \
+ ${@bb.utils.contains('MACHINE_FEATURES', 'canfd', 'file://0001-Porting-to-support-device-driver-Canfd-from-Control-.patch', '', d)} \
+"
+
do_install:append () {
# Remove firmware file that is not packaged in the kernel.
diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/cogent-symlinks/recipes-bsp/ti-bt b/meta-agl-bsp/meta-rcar-gen3-adas/cogent-symlinks/recipes-bsp/ti-bt
deleted file mode 120000
index 13ea60b90..000000000
--- a/meta-agl-bsp/meta-rcar-gen3-adas/cogent-symlinks/recipes-bsp/ti-bt
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../bsp/meta-rcar/meta-rcar-gen3-adas/recipes-bsp/ti-bt \ No newline at end of file
diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc b/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc
index 0c344a471..40d0ef0cb 100644
--- a/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc
+++ b/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc
@@ -6,8 +6,7 @@
# recipes.
AGL_FEATURES:append:rcar-gen3 = " kingfisher"
-IMAGE_NAME:rcar-gen3 = "${IMAGE_BASENAME}-${MACHINE}-kf${IMAGE_VERSION_SUFFIX}"
-IMAGE_LINK_NAME:rcar-gen3 = "${IMAGE_BASENAME}-${MACHINE}-kf"
+IMAGE_MACHINE_SUFFIX = "-${MACHINE}-kf"
TOOLCHAIN_OUTPUTNAME:rcar-gen3 = "${SDK_NAME}-kf-toolchain-${SDK_VERSION}"
# Radio packages
@@ -15,6 +14,5 @@ IMAGE_INSTALL:append:rcar-gen3 = " \
si-tools \
si-init \
linux-firmware-wl18xx \
- ti-bt \
ti-bt-firmware \
"
diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/si-tools/si-tools.bbappend b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/si-tools/si-tools.bbappend
index 7121bd168..9a5347b68 100644
--- a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/si-tools/si-tools.bbappend
+++ b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/si-tools/si-tools.bbappend
@@ -6,23 +6,7 @@ SRC_URI += " \
EXTRA_OEMAKE:append = " 'LDFLAGS=${LDFLAGS}'"
-do_install() {
- install -d ${D}${bindir}
- install -d ${D}${nonarch_base_libdir}/firmware/radio/
-
- install -m 755 si_ctl ${D}${bindir}
- install -m 755 si_flash ${D}${bindir}
- for file in ${SCRIPTS}; do
- install -m 755 ${S}/scripts/$file ${D}${bindir}
- sed -e 's,^\(SI_ARGS\s*=\s*\).*,\1"/dev/i2c-12 0x65",' -i ${D}${bindir}/$file
- done
-
- for file in ${FIRMWARE}; do
- install -m 644 ${S}/firmware/$file ${D}${nonarch_base_libdir}/firmware/radio/
- done
-}
-
-FILES:${PN} = " \
- ${bindir} \
- ${nonarch_base_libdir}/firmware/radio \
-"
+# Setting LDFLAGS fixes the QA issue, disable INSANE_SKIP over-ride
+# done in the recipe
+INSANE_SKIP:${PN} = ""
+INSANE_SKIP:${PN}-dev = "" \ No newline at end of file
diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt-firmware/ti-bt-firmware_git.bbappend b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt-firmware/ti-bt-firmware_git.bbappend
deleted file mode 100644
index 52bee656d..000000000
--- a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt-firmware/ti-bt-firmware_git.bbappend
+++ /dev/null
@@ -1,6 +0,0 @@
-do_install() {
- install -d ${D}${nonarch_base_libdir}/firmware/ti-connectivity/
- cp *.bts ${D}${nonarch_base_libdir}/firmware/ti-connectivity/
-}
-
-FILES:${PN} = "${nonarch_base_libdir}/firmware/ti-connectivity/*"
diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt/ti-uim.service b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt/ti-uim.service
deleted file mode 100644
index 214e60707..000000000
--- a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt/ti-uim.service
+++ /dev/null
@@ -1,10 +0,0 @@
-[Unit]
-Description=User Mode Init Manager for TI shared transport
-Before=bluetooth.service
-
-[Service]
-ExecStartPre=-/sbin/modprobe -q btwilink
-ExecStart=/usr/bin/uim -f /sys/devices/platform/kim
-
-[Install]
-WantedBy=multi-user.target
diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt_%.bbappend b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt_%.bbappend
deleted file mode 100644
index 55d570fc7..000000000
--- a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-bsp/ti-bt/ti-bt_%.bbappend
+++ /dev/null
@@ -1,18 +0,0 @@
-inherit systemd
-
-FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
-
-SRC_URI += "file://ti-uim.service"
-
-SYSTEMD_SERVICE:${PN} = "ti-uim.service"
-
-PR = "r0"
-PV = "0.1+git${SRCPV}"
-
-do_install:append() {
- # We do not want the blacklist
- rm -f ${D}/${sysconfdir}/modprobe.d/ti_bt.conf
-
- install -d ${D}${systemd_unitdir}/system/
- install -m 0644 ${WORKDIR}/ti-uim.service ${D}${systemd_unitdir}/system
-}
diff --git a/meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state.bbappend b/meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state.bbappend
new file mode 100644
index 000000000..784560131
--- /dev/null
+++ b/meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state.bbappend
@@ -0,0 +1,3 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
diff --git a/meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state/asound.state b/meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state/asound.state
new file mode 100644
index 000000000..c4039455a
--- /dev/null
+++ b/meta-agl-bsp/meta-rockchip/recipes-bsp/alsa-state/alsa-state/asound.state
@@ -0,0 +1,525 @@
+state.realtekrt5616co {
+ control.1 {
+ iface CARD
+ name 'Headphone Jack'
+ value true
+ comment {
+ access read
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.2 {
+ iface MIXER
+ name 'I2STDM Digital Loopback Mode'
+ value Disabled
+ comment {
+ access 'read write'
+ type ENUMERATED
+ count 1
+ item.0 Disabled
+ item.1 Mode1
+ item.2 Mode2
+ item.3 'Mode2 Swap'
+ }
+ }
+ control.3 {
+ iface MIXER
+ name 'HP Playback Switch'
+ value.0 true
+ value.1 true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.4 {
+ iface MIXER
+ name 'HPVOL Playback Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.5 {
+ iface MIXER
+ name 'HP Playback Volume'
+ value.0 0
+ value.1 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 39'
+ dbmin -4650
+ dbmax 1200
+ dbvalue.0 -4650
+ dbvalue.1 -4650
+ }
+ }
+ control.6 {
+ iface MIXER
+ name 'OUT Playback Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.7 {
+ iface MIXER
+ name 'OUT Channel Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.8 {
+ iface MIXER
+ name 'OUT Playback Volume'
+ value.0 31
+ value.1 31
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 39'
+ dbmin -4650
+ dbmax 1200
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.9 {
+ iface MIXER
+ name 'DAC1 Playback Volume'
+ value.0 175
+ value.1 175
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 175'
+ dbmin -65625
+ dbmax 0
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.10 {
+ iface MIXER
+ name 'IN1 Boost Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 8'
+ dbmin 0
+ dbmax 5200
+ dbvalue.0 0
+ }
+ }
+ control.11 {
+ iface MIXER
+ name 'IN2 Boost Volume'
+ value 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 1
+ range '0 - 8'
+ dbmin 0
+ dbmax 5200
+ dbvalue.0 0
+ }
+ }
+ control.12 {
+ iface MIXER
+ name 'IN Capture Volume'
+ value.0 23
+ value.1 23
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 31'
+ dbmin -3450
+ dbmax 1200
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.13 {
+ iface MIXER
+ name 'ADC Capture Switch'
+ value.0 false
+ value.1 false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 2
+ }
+ }
+ control.14 {
+ iface MIXER
+ name 'ADC Capture Volume'
+ value.0 47
+ value.1 47
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 127'
+ dbmin -17625
+ dbmax 30000
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.15 {
+ iface MIXER
+ name 'ADC Boost Volume'
+ value.0 0
+ value.1 0
+ comment {
+ access 'read write'
+ type INTEGER
+ count 2
+ range '0 - 3'
+ dbmin 0
+ dbmax 3600
+ dbvalue.0 0
+ dbvalue.1 0
+ }
+ }
+ control.16 {
+ iface MIXER
+ name 'RECMIXL INL1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.17 {
+ iface MIXER
+ name 'RECMIXL BST2 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.18 {
+ iface MIXER
+ name 'RECMIXL BST1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.19 {
+ iface MIXER
+ name 'RECMIXR INR1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.20 {
+ iface MIXER
+ name 'RECMIXR BST2 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.21 {
+ iface MIXER
+ name 'RECMIXR BST1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.22 {
+ iface MIXER
+ name 'Stereo1 ADC MIXL ADC1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.23 {
+ iface MIXER
+ name 'Stereo1 ADC MIXR ADC1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.24 {
+ iface MIXER
+ name 'DAC MIXL Stereo ADC Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.25 {
+ iface MIXER
+ name 'DAC MIXL INF1 Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.26 {
+ iface MIXER
+ name 'DAC MIXR Stereo ADC Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.27 {
+ iface MIXER
+ name 'DAC MIXR INF1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.28 {
+ iface MIXER
+ name 'Stereo DAC MIXL DAC L1 Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.29 {
+ iface MIXER
+ name 'Stereo DAC MIXL DAC R1 Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.30 {
+ iface MIXER
+ name 'Stereo DAC MIXR DAC R1 Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.31 {
+ iface MIXER
+ name 'Stereo DAC MIXR DAC L1 Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.32 {
+ iface MIXER
+ name 'OUT MIXL BST1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.33 {
+ iface MIXER
+ name 'OUT MIXL BST2 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.34 {
+ iface MIXER
+ name 'OUT MIXL INL1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.35 {
+ iface MIXER
+ name 'OUT MIXL REC MIXL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.36 {
+ iface MIXER
+ name 'OUT MIXL DAC L1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.37 {
+ iface MIXER
+ name 'OUT MIXR BST2 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.38 {
+ iface MIXER
+ name 'OUT MIXR BST1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.39 {
+ iface MIXER
+ name 'OUT MIXR INR1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.40 {
+ iface MIXER
+ name 'OUT MIXR REC MIXR Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.41 {
+ iface MIXER
+ name 'OUT MIXR DAC R1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.42 {
+ iface MIXER
+ name 'HPO MIX DAC1 Switch'
+ value true
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.43 {
+ iface MIXER
+ name 'HPO MIX HPVOL Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.44 {
+ iface MIXER
+ name 'LOUT MIX DAC L1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.45 {
+ iface MIXER
+ name 'LOUT MIX DAC R1 Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.46 {
+ iface MIXER
+ name 'LOUT MIX OUTVOL L Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+ control.47 {
+ iface MIXER
+ name 'LOUT MIX OUTVOL R Switch'
+ value false
+ comment {
+ access 'read write'
+ type BOOLEAN
+ count 1
+ }
+ }
+}
diff --git a/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init.bbappend b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init.bbappend
new file mode 100644
index 000000000..ab14bdbc2
--- /dev/null
+++ b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init.bbappend
@@ -0,0 +1,7 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+SRC_URI:append = " file://agl-compositor-rockchip.conf "
+
+do_install:append() {
+ install -m644 ${WORKDIR}/agl-compositor-rockchip.conf ${D}/${systemd_system_unitdir}/agl-compositor.service.d/agl-compositor-rockchip.conf
+}
diff --git a/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init/agl-compositor-rockchip.conf b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init/agl-compositor-rockchip.conf
new file mode 100644
index 000000000..e85d7fa91
--- /dev/null
+++ b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/agl-compositor-init/agl-compositor-rockchip.conf
@@ -0,0 +1,2 @@
+[Service]
+Environment=LD_PRELOAD=/usr/lib/libmali.so.1
diff --git a/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf.bbappend b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf.bbappend
new file mode 100644
index 000000000..a7bebe3fc
--- /dev/null
+++ b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf.bbappend
@@ -0,0 +1,7 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+SRC_URI:append = " \
+ file://nanopct6_output.cfg \
+"
+
+WESTON_FRAGMENTS:append:nanopct6 = " nanopct6_output"
diff --git a/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf/nanopct6_output.cfg b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf/nanopct6_output.cfg
new file mode 100644
index 000000000..fbee86693
--- /dev/null
+++ b/meta-agl-bsp/meta-rockchip/recipes-graphics/wayland/weston-ini-conf/nanopct6_output.cfg
@@ -0,0 +1,7 @@
+[output]
+name=HDMI-A-2
+mode=off
+
+[output]
+name=DP-1
+transform=rotate-90
diff --git a/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/files/0001-WIP-Make-BSP-work-under-YP-kirkstone.patch b/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/files/0001-WIP-Make-BSP-work-under-YP-kirkstone.patch
deleted file mode 100644
index 7fce516f0..000000000
--- a/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/files/0001-WIP-Make-BSP-work-under-YP-kirkstone.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 57575ce80a96411bce828be6fc84ebd2ed003810 Mon Sep 17 00:00:00 2001
-From: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
-Date: Tue, 12 Sep 2023 22:50:28 +0200
-Subject: [PATCH] [WIP] Make BSP work under YP kirkstone
-
-This fixes build issues when using the layer with YP 'kirkstone' branch.
-
-check-config.sh can be solved differently as well.
-binman/control.py needs a little investigation
-
-Upstream-Status: Inappropriate
-Signed-off-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
----
- scripts/check-config.sh | 2 +-
- tools/binman/control.py | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/scripts/check-config.sh b/scripts/check-config.sh
-index cc1c9a54d9..633c69eb76 100755
---- a/scripts/check-config.sh
-+++ b/scripts/check-config.sh
-@@ -57,7 +57,7 @@ if [ -s ${new_adhoc} ]; then
- echo >&2 "Please add these via Kconfig instead. Find a suitable Kconfig"
- echo >&2 "file and add a 'config' or 'menuconfig' option."
- # Don't delete the temporary files in case they are useful
-- exit 1
-+ exit 0
- else
- rm ${suspects} ${ok} ${new_adhoc}
- fi
-diff --git a/tools/binman/control.py b/tools/binman/control.py
-index 47aac207b4..3d013dea17 100644
---- a/tools/binman/control.py
-+++ b/tools/binman/control.py
-@@ -8,7 +8,7 @@
- from collections import OrderedDict
- import glob
- import os
--import pkg_resources
-+#import pkg_resources
- import re
-
- import sys
---
-2.35.3
-
diff --git a/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/u-boot-sifive_2023.07.02.bbappend b/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/u-boot-sifive_2023.07.02.bbappend
deleted file mode 100644
index 30bf957cf..000000000
--- a/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/u-boot-sifive_2023.07.02.bbappend
+++ /dev/null
@@ -1,3 +0,0 @@
-FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
-
-SRC_URI:append = " file://0001-WIP-Make-BSP-work-under-YP-kirkstone.patch "
diff --git a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/files/0001-XEN-on-RPi4-1GB-lmitation-workaround-XEN-tries-to-al.patch b/meta-agl-bsp/virtualization-layer/recipes-extended/xen/files/0001-XEN-on-RPi4-1GB-lmitation-workaround-XEN-tries-to-al.patch
deleted file mode 100644
index d83c65257..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/files/0001-XEN-on-RPi4-1GB-lmitation-workaround-XEN-tries-to-al.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 2701d65271686dff0cb39ab7da1e821f5dede61e Mon Sep 17 00:00:00 2001
-From: Leonid Lazarev <leonid.lazarev@mera.com>
-Date: Tue, 21 Apr 2020 17:28:16 +0300
-Subject: [PATCH] XEN on RPi4 1GB lmitation workaround: XEN tries to allocated
- the memopry for dom0 within first 4GB, but for some reason raspberry pi only
- allows to load kernel from 1st GB. Push XEN to allocate first bank for dom0
- from 1st GB
-
----
- xen/arch/arm/domain_build.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
-index dd9c3b73ba..8501a8c8aa 100644
---- a/xen/arch/arm/domain_build.c
-+++ b/xen/arch/arm/domain_build.c
-@@ -281,7 +281,7 @@ static void __init allocate_memory_11(struct domain *d,
- */
- while ( order >= min_low_order )
- {
-- for ( bits = order ; bits <= (lowmem ? 32 : PADDR_BITS); bits++ )
-+ for ( bits = order ; bits <= (lowmem ? 30 : PADDR_BITS); bits++ )
- {
- pg = alloc_domheap_pages(d, order, MEMF_bits(bits));
- if ( pg != NULL )
---
-2.17.1
-
diff --git a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb b/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb
deleted file mode 100644
index b857cb19f..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb
+++ /dev/null
@@ -1,29 +0,0 @@
-DESCRIPTION = "Xen hypervisor u-boot image"
-LICENSE = "GPL-2.0-only"
-SECTION = "console/tools"
-
-LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
-
-
-
-ALLOW_EMPTY:${PN} = "1"
-FILES:${PN} = ""
-S = "${WORKDIR}"
-
-DEPENDS = "u-boot-mkimage-native "
-
-# Only for aarch64
-COMPATIBLE_MACHINE = "(-)"
-COMPATIBLE_MACHINE:aarch64 = "(.*)"
-
-PACKAGE_ARCH = "${MACHINE_ARCH}"
-
-do_configure[noexec] = "1"
-do_deploy[noexec] = "1"
-
-do_compile[depends] += "xen:do_deploy"
-
-# Uboot compatible image
-do_compile () {
- uboot-mkimage -A arm64 -C none -T kernel -a 0x48080000 -e 0x48080000 -n "XEN" -d ${DEPLOY_DIR_IMAGE}/xen-${MACHINE} ${DEPLOY_DIR_IMAGE}/xen-${MACHINE}.uImage
-}
diff --git a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-tools_git.bbappend b/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-tools_git.bbappend
deleted file mode 100644
index a67200618..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-tools_git.bbappend
+++ /dev/null
@@ -1,11 +0,0 @@
-
-# make the package specific to the machine for now
-PACKAGE_ARCH = "${MACHINE_ARCH}"
-
-# rpi4
-LIC_FILES_CHKSUM:raspberrypi4 = "file://COPYING;md5=4295d895d4b5ce9d070263d52f030e49"
-XEN_REL:raspberrypi4 = "4.13"
-SRCREV:raspberrypi4 = "721f2c323ca55c77857c93e7275b4a93a0e15e1f"
-SRC_URI:raspberrypi4 = " \
- git://xenbits.xen.org/xen.git;branch=${XEN_BRANCH} \
- "
diff --git a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen_git.bbappend b/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen_git.bbappend
deleted file mode 100644
index 2d63e1841..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen_git.bbappend
+++ /dev/null
@@ -1,18 +0,0 @@
-FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
-
-# make the package machine-specific
-PACKAGE_ARCH = "${MACHINE_ARCH}"
-
-# rpi4 specifics
-LIC_FILES_CHKSUM:raspberrypi4 = "file://COPYING;md5=4295d895d4b5ce9d070263d52f030e49"
-XEN_REL:raspberrypi4 = "4.13"
-
-SRCREV:raspberrypi4 = "721f2c323ca55c77857c93e7275b4a93a0e15e1f"
-SRC_URI:append:raspberrypi4 = " file://0001-XEN-on-RPi4-1GB-lmitation-workaround-XEN-tries-to-al.patch"
-
-#due to incorrect xen binary preparation in external library, we add additional deploy
-do_deploy:append:raspberrypi4() {
- if [ -f ${B}/xen/xen ]; then
- install -m 0644 ${B}/xen/xen ${DEPLOYDIR}/xen-${MACHINE}
- fi
-}
diff --git a/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa/0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch b/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa/0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch
deleted file mode 100644
index d27696056..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa/0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 737ccb36c0faf275037e5e96a263c89a44886ddd Mon Sep 17 00:00:00 2001
-From: Marius Vlad <marius.vlad@collabora.com>
-Date: Mon, 19 Dec 2022 11:51:28 +0200
-Subject: [PATCH] virgl/virgl_driinfo.h.in: Disable by default emulated BGRA
-
- and swizzling
-
-Workaround in place for virtio aarch64 to avoid graphical artefacts when
-first time booting up on PVR host driver.
-
-Introduced with patch 'virgl: Always enable emulated BGRA and swizzling
-unless specifically told not to' in mesa-20.3.0.
-
-Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
----
- src/gallium/drivers/virgl/virgl_driinfo.h.in | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/gallium/drivers/virgl/virgl_driinfo.h.in b/src/gallium/drivers/virgl/virgl_driinfo.h.in
-index ec688f5..244021e 100644
---- a/src/gallium/drivers/virgl/virgl_driinfo.h.in
-+++ b/src/gallium/drivers/virgl/virgl_driinfo.h.in
-@@ -8,8 +8,8 @@
- // 5. Implement the tweak in virglrenderer
- DRI_CONF_SECTION_MISCELLANEOUS
- DRI_CONF_FORMAT_L8_SRGB_ENABLE_READBACK(false)
-- DRI_CONF_GLES_EMULATE_BGRA(true)
-- DRI_CONF_GLES_APPLY_BGRA_DEST_SWIZZLE(true)
-+ DRI_CONF_GLES_EMULATE_BGRA(false)
-+ DRI_CONF_GLES_APPLY_BGRA_DEST_SWIZZLE(false)
- DRI_CONF_GLES_SAMPLES_PASSED_VALUE(1024, 1, 400000000)
-
- /*
---
-2.30.2
-
diff --git a/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa_24.%.bbappend b/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa_24.%.bbappend
deleted file mode 100644
index 0a6606ebf..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa_24.%.bbappend
+++ /dev/null
@@ -1,3 +0,0 @@
-FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
-
-SRC_URI += "file://0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch"
diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto-dev.bbappend b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto-dev.bbappend
deleted file mode 100644
index 5970414eb..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ /dev/null
@@ -1,10 +0,0 @@
-FILESEXTRAPATHS:prepend := "${THISDIR}/linux-yocto:"
-
-SRC_URI:append:virtio-all = " \
- git://gerrit.automotivelinux.org/gerrit/src/agl-yocto-kernel-meta.git;protocol=https;type=kmeta;name=agl-meta;destsuffix=agl-kernel-meta;branch=master \
- file://virtio-aarch64-${LINUX_KERNEL_TYPE}.scc \
-"
-
-SRCREV_agl-meta = "c5008f4ba9e1b9f11c1014b53477079e605ceab7"
-
-COMPATIBLE_MACHINE:virtio-aarch64 = "virtio-aarch64"
diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-aarch64-standard.scc b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-aarch64-standard.scc
deleted file mode 100644
index 2d1570e9f..000000000
--- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-aarch64-standard.scc
+++ /dev/null
@@ -1,13 +0,0 @@
-# SPDX-License-Identifier: MIT
-define KMACHINE virtio-aarch64
-define KTYPE standard
-define KARCH arm64
-
-include ktypes/standard/standard.scc nopatch
-include arch/arm/aarch64.scc
-include cfg/8250.scc
-include cfg/virtio.scc
-include bsp/virtio/agl-virtio.scc
-
-# enable the ability to run 32 bit apps
-include arch/arm/32bit-compat.scc
diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend
index 6952436a3..15cb9ea98 100644
--- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend
+++ b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend
@@ -1,17 +1,6 @@
-FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
-
-# Cannot just append to SRC_URI, as the metadata interferes with the
-# AGL config fragment scheme
-AGL_KERNEL_SRC:prepend:virtio-all = " \
- git://gerrit.automotivelinux.org/gerrit/src/agl-yocto-kernel-meta.git;protocol=https;type=kmeta;name=agl-meta;destsuffix=agl-kernel-meta;branch=kernel-5.15 \
- file://virtio-aarch64-${LINUX_KERNEL_TYPE}.scc \
-"
-
-SRCREV_agl-meta = "4deb7357eab5962b0553a5ad1f11be5ac35f9da9"
-
-AGL_KCONFIG_FRAGMENTS:append:virtio-all = " \
- virtio-drm.cfg \
- virtio-pci.cfg \
-"
-
+# NOTE: Has to be in bbappend itself because BitBake does not fully
+# parse recipes when checking it
COMPATIBLE_MACHINE:virtio-aarch64 = "virtio-aarch64"
+
+# Reuse base qemuarm64 machine to avoid needing our own kernel metadata
+KMACHINE:virtio-aarch64 = "qemuarm64" \ No newline at end of file
diff --git a/meta-agl-core/conf/distro/poky-agl.conf b/meta-agl-core/conf/distro/poky-agl.conf
index 266a06d70..1ce721f59 100644
--- a/meta-agl-core/conf/distro/poky-agl.conf
+++ b/meta-agl-core/conf/distro/poky-agl.conf
@@ -9,9 +9,9 @@ DISTRO_NAME = "Automotive Grade Linux"
# Release flags
-DISTRO_CODENAME = "ricefish"
+DISTRO_CODENAME = "salmon"
AGL_BRANCH = "master"
-AGLVERSION = "17.90.0"
+AGLVERSION = "18.90.0"
# switch devel/release
#AGLRELEASETYPE ?= "agldevelopment"
@@ -29,8 +29,8 @@ DISTRO_BRANCH_VERSION_TAG = "${DISTRO_CODENAME}/${@'${DISTRO_VERSION}'.replace('
# reproducible builds:
# Set the desired timestamps
# E.g. update for (major) releases
-export SOURCE_DATE_EPOCH = "1706800000"
-REPRODUCIBLE_TIMESTAMP_ROOTFS = "1706800000"
+export SOURCE_DATE_EPOCH = "1721815278"
+REPRODUCIBLE_TIMESTAMP_ROOTFS = "1721815278"
# SDK
diff --git a/meta-agl-core/conf/templates/base/conf-notes.txt b/meta-agl-core/conf/templates/base/conf-notes.txt
index 09ae72647..2e77ae5bf 100644
--- a/meta-agl-core/conf/templates/base/conf-notes.txt
+++ b/meta-agl-core/conf/templates/base/conf-notes.txt
@@ -6,30 +6,21 @@ Common targets are:
* agl-image-minimal-crosssdk (crosssdk for ^^)
* agl-image-weston (minimal filesystem with weston)
+ * agl-image-compositor (minimal filesystem with AGL compositor)
- meta-agl-demo: (IVI demo with UI)
- with 'agl-demo'
- * agl-image-ivi (base for IVI targets)
- * agl-image-ivi-crosssdk (sdk for ^^)
+ * agl-ivi-image (base for IVI targets)
+ * agl-ivi-image-crosssdk (sdk for ^^)
- * agl-image-graphical-qt5 (weston plus qt5 framework libs)
- * agl-image-graphical-qt5-crosssdk (sdk for ^^)
+ * agl-ivi-demo-qt (IVI Qt demo image)
+ * agl-ivi-demo-qt-crosssdk (sdk for ^^)
+ * agl-ivi-demo-flutter (IVI Flutter demo image)
+ * agl-ivi-demo-html5 (IVI HTML5 demo image)
- * agl-image-graphical-html5 (weston plus chromium for html5)
-
- * agl-image-cluster (minimal image with APIs for cluster)
- * agl-image-cluster-qt5 (image with QT5 and APIs for cluster)
-
- * agl-image-telematics (image with APIs for telematics)
-
- * agl-demo-platform (* default IVI demo target *)
- * agl-demo-platform-crosssdk (sdk for ^^)
-
- * agl-cluster-demo-platform (cluster demo image)
- * agl-cluster-demo-platform-crosssdk (sdk for ^^)
- * agl-cluster-demo-qtcompositor (cluster demo using own compositor)
-
- * agl-telematics-demo-platform (telematics demo image)
- * agl-telematics-demo-platform-crosssdk (sdk for ^^)
+ * agl-cluster-demo-qt (cluster Qt demo image)
+ * agl-cluster-demo-flutter (cluster Flutter demo image)
+ * agl-telematics-demo (telematics demo image)
+ * agl-gateway-demo (gateway demo image)
diff --git a/meta-agl-core/conf/templates/base/local.conf.sample b/meta-agl-core/conf/templates/base/local.conf.sample
index be49ed00d..5e9de61b3 100644
--- a/meta-agl-core/conf/templates/base/local.conf.sample
+++ b/meta-agl-core/conf/templates/base/local.conf.sample
@@ -279,9 +279,15 @@ PACKAGECONFIG:append:pn-qemu-system-native = " sdl"
#
# A shared hash equivalent server can be set with "<HOSTNAME>:<PORT>" format
#
+# local only
#BB_HASHSERVE = "auto"
#BB_SIGNATURE_HANDLER = "OEEquivHash"
-
+#
+# online/upstream r/o
+#AGL_HOST_HASHSERV = "prserv.automotivelinux.org"
+#BB_SIGNATURE_HANDLER = "OEEquivHash"
+#BB_HASHSERVE = "auto"
+#BB_HASHSERVE_UPSTREAM = "${AGL_HOST_HASHSERV}:8888"
# The network based PR service host and port
# Uncomment the following lines to enable PRservice.
@@ -289,6 +295,10 @@ PACKAGECONFIG:append:pn-qemu-system-native = " sdl"
# start local PRService.
# Set to other values to use remote PRService.
#PRSERV_HOST = "localhost:0"
+#
+# r/o upstream prserv
+#AGL_HOST_PRSERV = "prserv.automotivelinux.org"
+#PRSERV_HOST = "prserv.automotivelinux.org:8686"
# Archive the source and put them to ${DEPLOY_DIR}/sources/.
diff --git a/meta-agl-core/files/group b/meta-agl-core/files/group
index a7e0cd17f..c7d4507b4 100644
--- a/meta-agl-core/files/group
+++ b/meta-agl-core/files/group
@@ -99,4 +99,5 @@ sgx::1010:
kuksa::900:
qemu::901:
kvm::902:
+persistent-api::903:
ptest::2001:
diff --git a/meta-agl-core/files/passwd b/meta-agl-core/files/passwd
index ea54d06e4..3f30a0480 100644
--- a/meta-agl-core/files/passwd
+++ b/meta-agl-core/files/passwd
@@ -64,5 +64,6 @@ mosquitto::1007:1007:::
pipewire::1008:1008:::
kuksa::900:900:::
qemu::901:901:::
+persistent-api::903:903:::
user::1004:100:::
ptest::2001:2001:::
diff --git a/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Do-not-overwrite-CFLAGS.patch b/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Do-not-overwrite-CFLAGS.patch
index 4a86e6c57..479e5c1c7 100644
--- a/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Do-not-overwrite-CFLAGS.patch
+++ b/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Do-not-overwrite-CFLAGS.patch
@@ -3,6 +3,8 @@ From: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
Date: Tue, 19 Jul 2022 23:28:21 +0200
Subject: [PATCH] Do not overwrite CFLAGS
+Upstream-Status: Pending
+
Signed-off-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
---
configure.ac | 16 ++++++++--------
diff --git a/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Initialize-variables.patch b/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Initialize-variables.patch
index 9a1078426..d106ada00 100644
--- a/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Initialize-variables.patch
+++ b/meta-agl-core/recipes-connectivity/connman-ncurses/connman-ncurses/0001-Initialize-variables.patch
@@ -5,6 +5,8 @@ Subject: [PATCH] Initialize variables
This fixes compiler warnings.
+Upstream-Status: Pending
+
Signed-off-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
---
main.c | 2 +-
diff --git a/meta-agl-core/recipes-graphics/wayland/agl-compositor_git.bb b/meta-agl-core/recipes-graphics/wayland/agl-compositor_git.bb
index 41240309b..79b13df71 100644
--- a/meta-agl-core/recipes-graphics/wayland/agl-compositor_git.bb
+++ b/meta-agl-core/recipes-graphics/wayland/agl-compositor_git.bb
@@ -11,7 +11,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=fac6abe0003c4d142ff8fa1f18316df0"
DEPENDS = "wayland wayland-protocols wayland-native weston"
SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/agl-compositor.git;protocol=https;branch=${AGL_BRANCH}"
-SRCREV = "18e93caca8ad397d504215d673765871b2c88f25"
+SRCREV = "c8ffca8f9c67114ca424b88df0740943fe7768e3"
AGL_BRANCH:aglnext = "next"
SRCREV:aglnext = "${AUTOREV}"
diff --git a/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bb b/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bb
index 0611ec5b4..f6b27a14b 100644
--- a/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bb
+++ b/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bb
@@ -13,7 +13,6 @@ SRC_URI = " \
file://hdmi-a-2-90.cfg \
file://hdmi-a-2-180.cfg \
file://hdmi-a-2-270.cfg \
- file://remote-output.cfg.in \
file://virtual-0.cfg \
file://virtual-90.cfg \
file://virtual-180.cfg \
@@ -31,23 +30,12 @@ WESTON_DISPLAYS ?= "hdmi-a-1-90"
# Configuration fragments to use in weston.ini.*
# Note that some may be replaced/removed when building the landscape
# configuration.
-WESTON_FRAGMENTS = "core shell grpc-proxy ${WESTON_DISPLAYS}"
+WESTON_FRAGMENTS_BASE = "core shell"
+WESTON_FRAGMENTS = "${WESTON_FRAGMENTS_BASE} ${WESTON_DISPLAYS}"
# On-target weston.ini directory
weston_ini_dir = "${sysconfdir}/xdg/weston"
-# Options for the user to change in local.conf
-# e.g. REMOTING_OUTPUT_MODE = "1080x1488"
-REMOTING_OUTPUT_MODE ??= "640x720@30"
-REMOTING_OUTPUT_HOST ??= "192.168.10.3"
-REMOTING_OUTPUT_PORT ??= "5005"
-
-do_configure() {
- sed -e "s#host=.*#host=${REMOTING_OUTPUT_HOST}#" \
- -e "s#port=.*#port=${REMOTING_OUTPUT_PORT}#" \
- ${WORKDIR}/remote-output.cfg.in > ${WORKDIR}/remote-output.cfg
-}
-
do_compile() {
# Put all of our cfg files together for a default portrait
# orientation configuration
@@ -109,47 +97,42 @@ PACKAGE_ARCH = "${MACHINE_ARCH}"
ALTERNATIVE_LINK_NAME[weston.ini] = "${weston_ini_dir}/weston.ini"
RPROVIDES:${PN} = "weston-ini"
-RCONFLICTS:${PN} = "${PN}-landscape"
ALTERNATIVE:${PN} = "weston.ini"
ALTERNATIVE_TARGET_${PN} = "${weston_ini_dir}/weston.ini.default"
-PACKAGE_BEFORE_PN += "${PN}-landscape"
+# landscape
+PACKAGE_BEFORE_PN += "${PN}-landscape"
FILES:${PN}-landscape = "${weston_ini_dir}/weston.ini.landscape"
-
RPROVIDES:${PN}-landscape = "weston-ini"
-RCONFLICTS:${PN}-landscape = "${PN}"
ALTERNATIVE:${PN}-landscape = "weston.ini"
ALTERNATIVE_TARGET_${PN}-landscape = "${weston_ini_dir}/weston.ini.landscape"
+ALTERNATIVE_PRIORITY_${PN}-landscape = "20"
-PACKAGE_BEFORE_PN += "${PN}-landscape-inverted"
+# landscape-inverted
+PACKAGE_BEFORE_PN += "${PN}-landscape-inverted"
FILES:${PN}-landscape-inverted = "${weston_ini_dir}/weston.ini.landscape-inverted"
-
RPROVIDES:${PN}-landscape-inverted = "weston-ini"
-RCONFLICTS:${PN}-landscape-inverted = "${PN}"
ALTERNATIVE:${PN}-landscape-inverted = "weston.ini"
ALTERNATIVE_TARGET_${PN}-landscape-inverted = "${weston_ini_dir}/weston.ini.landscape-inverted"
+ALTERNATIVE_PRIORITY_${PN}-landscape-inverted = "25"
-# no activation by default
+# no-activate, no activation by default
PACKAGE_BEFORE_PN += "${PN}-no-activate"
-
FILES:${PN}-no-activate = "${weston_ini_dir}/weston.ini.default-no-activate"
-
RPROVIDES:${PN}-no-activate = "weston-ini"
-RCONFLICTS:${PN}-no-activate = "${PN}"
ALTERNATIVE:${PN}-no-activate = "weston.ini"
ALTERNATIVE_TARGET_${PN}-no-activate = "${weston_ini_dir}/weston.ini.default-no-activate"
+ALTERNATIVE_PRIORITY_${PN}-no-activate = "21"
-# landscape, no activation by default
+# landscape-no-activate, no activation by default
PACKAGE_BEFORE_PN += "${PN}-landscape-no-activate"
-
FILES:${PN}-landscape-no-activate = "${weston_ini_dir}/weston.ini.landscape-no-activate"
-
RPROVIDES:${PN}-landscape-no-activate = "weston-ini"
-RCONFLICTS:${PN}-landscape-no-activate = "${PN}"
ALTERNATIVE:${PN}-landscape-no-activate = "weston.ini"
ALTERNATIVE_TARGET_${PN}-landscape-no-activate = "${weston_ini_dir}/weston.ini.landscape-no-activate"
+ALTERNATIVE_PRIORITY_${PN}-landscape-no-activate = "26"
# This is a settings-only package, we do not need a development package
# (and its fixed dependency to ${PN} being installed)
diff --git a/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bbappend b/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bbappend
index 746bde339..b6095f2fa 100644
--- a/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bbappend
+++ b/meta-agl-core/recipes-graphics/wayland/weston-ini-conf.bbappend
@@ -2,8 +2,6 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
PACKAGE_ARCH = "${MACHINE_ARCH}"
-WESTON_DISPLAYS:append = "${@bb.utils.contains("DISTRO_FEATURES", "weston-remoting", " remote-output", "", d)}"
-
# For virtual machines and intel-corei7-64 we want to support both the HDMI-A-1
# and Virtual-1 outputs. This allows us to run virtual images on real hardware
# and vice versa.
diff --git a/meta-agl-core/recipes-graphics/wayland/weston-ini-conf/remote-output.cfg.in b/meta-agl-core/recipes-graphics/wayland/weston-ini-conf/remote-output.cfg.in
deleted file mode 100644
index 940cbdd0c..000000000
--- a/meta-agl-core/recipes-graphics/wayland/weston-ini-conf/remote-output.cfg.in
+++ /dev/null
@@ -1,5 +0,0 @@
-[remote-output]
-name=remote-1
-mode=640x720@30
-host=192.168.10.3
-port=5005
diff --git a/meta-agl-core/recipes-graphics/wayland/weston/0001-backend-drm-don-t-leak-gem_handle_refcnt-in-drm_dest.patch b/meta-agl-core/recipes-graphics/wayland/weston/0001-backend-drm-don-t-leak-gem_handle_refcnt-in-drm_dest.patch
new file mode 100644
index 000000000..0e3ab7613
--- /dev/null
+++ b/meta-agl-core/recipes-graphics/wayland/weston/0001-backend-drm-don-t-leak-gem_handle_refcnt-in-drm_dest.patch
@@ -0,0 +1,27 @@
+From fb60f9c16ce8865fbdcd181419f44b72af1aa3c2 Mon Sep 17 00:00:00 2001
+From: Ray Smith <rsmith@brightsign.biz>
+Date: Tue, 19 Dec 2023 11:43:55 +0000
+Subject: [PATCH 1/2] backend-drm: don't leak gem_handle_refcnt in drm_destroy
+
+Signed-off-by: Ray Smith <rsmith@brightsign.biz>
+---
+ libweston/backend-drm/drm.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
+index 8092789..fcececb 100644
+--- a/libweston/backend-drm/drm.c
++++ b/libweston/backend-drm/drm.c
+@@ -3364,6 +3364,9 @@ drm_destroy(struct weston_backend *backend)
+ weston_launcher_close(ec->launcher, device->drm.fd);
+ weston_launcher_destroy(ec->launcher);
+
++ if (device->gem_handle_refcnt)
++ hash_table_destroy(device->gem_handle_refcnt);
++
+ free(device->drm.filename);
+ free(device);
+ free(b);
+--
+2.43.0
+
diff --git a/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-Add-paint-node-destruction-into-weston_lay.patch b/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-Add-paint-node-destruction-into-weston_lay.patch
deleted file mode 100644
index 19eadcf7f..000000000
--- a/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-Add-paint-node-destruction-into-weston_lay.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From cfde02d47a503cbfd0629bbfe0cb776686af8a91 Mon Sep 17 00:00:00 2001
-From: Marius Vlad <marius.vlad@collabora.com>
-Date: Tue, 9 Apr 2024 18:34:22 +0300
-Subject: [PATCH] libweston: Add paint node destruction into
- weston_layer_entry_remove()
-
-This prevents a potential crash where users of
-weston_layer_entry_insert/layer_entry_remove() would see when moving
-views into a NULL layer (effectively unmapping the surface/view).
-
-Users that have migrated to the weston_view_move_to_layer() are immune
-to this issue because that takes care paint node destruction.
-
-Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
----
- libweston/compositor.c | 17 ++++++++++-------
- 1 file changed, 10 insertions(+), 7 deletions(-)
-
-diff --git a/libweston/compositor.c b/libweston/compositor.c
-index bb29b83b5..ea257bb90 100644
---- a/libweston/compositor.c
-+++ b/libweston/compositor.c
-@@ -3980,17 +3980,10 @@ weston_view_move_to_layer(struct weston_view *view,
- struct weston_layer_entry *layer)
- {
- bool was_mapped = view->is_mapped;
-- struct weston_paint_node *pnode, *pntmp;
-
- if (layer == &view->layer_link)
- return;
-
-- /* Remove all paint nodes because we have no idea what a layer change
-- * does to view visibility on any output.
-- */
-- wl_list_for_each_safe(pnode, pntmp, &view->paint_node_list, view_link)
-- weston_paint_node_destroy(pnode);
--
- view->surface->compositor->view_list_needs_rebuild = true;
-
- /* Damage the view's old region, and remove it from the layer. */
-@@ -4020,6 +4013,16 @@ weston_view_move_to_layer(struct weston_view *view,
- WL_EXPORT void
- weston_layer_entry_remove(struct weston_layer_entry *entry)
- {
-+ struct weston_paint_node *pnode, *pntmp;
-+ struct weston_view *view;
-+
-+ /* Remove all paint nodes because we have no idea what a layer change
-+ * does to view visibility on any output.
-+ */
-+ view = container_of(entry, struct weston_view, layer_link);
-+ wl_list_for_each_safe(pnode, pntmp, &view->paint_node_list, view_link)
-+ weston_paint_node_destroy(pnode);
-+
- wl_list_remove(&entry->link);
- wl_list_init(&entry->link);
- entry->layer = NULL;
---
-2.43.0
-
diff --git a/meta-agl-core/recipes-graphics/wayland/weston/0002-backend-drm-always-create-gem_handle_refcnt-hash-tab.patch b/meta-agl-core/recipes-graphics/wayland/weston/0002-backend-drm-always-create-gem_handle_refcnt-hash-tab.patch
new file mode 100644
index 000000000..0ae82088a
--- /dev/null
+++ b/meta-agl-core/recipes-graphics/wayland/weston/0002-backend-drm-always-create-gem_handle_refcnt-hash-tab.patch
@@ -0,0 +1,56 @@
+From 10fcfd66069c774e28f67b18afd329e4bcf9f5b3 Mon Sep 17 00:00:00 2001
+From: Ray Smith <rsmith@brightsign.biz>
+Date: Tue, 19 Dec 2023 11:45:45 +0000
+Subject: [PATCH 2/2] backend-drm: always create gem_handle_refcnt hash table
+
+Devices created via drm_device_create have this hash table, but those
+created via drm_backend_create don't.
+
+Signed-off-by: Ray Smith <rsmith@brightsign.biz>
+---
+ libweston/backend-drm/drm.c | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
+index fcececb..9d6a9cf 100644
+--- a/libweston/backend-drm/drm.c
++++ b/libweston/backend-drm/drm.c
+@@ -3364,8 +3364,7 @@ drm_destroy(struct weston_backend *backend)
+ weston_launcher_close(ec->launcher, device->drm.fd);
+ weston_launcher_destroy(ec->launcher);
+
+- if (device->gem_handle_refcnt)
+- hash_table_destroy(device->gem_handle_refcnt);
++ hash_table_destroy(device->gem_handle_refcnt);
+
+ free(device->drm.filename);
+ free(device);
+@@ -3867,10 +3866,13 @@ drm_backend_create(struct weston_compositor *compositor,
+
+ device = zalloc(sizeof *device);
+ if (device == NULL)
+- return NULL;
++ goto err_backend;
+ device->state_invalid = true;
+ device->drm.fd = -1;
+ device->backend = b;
++ device->gem_handle_refcnt = hash_table_create();
++ if (!device->gem_handle_refcnt)
++ goto err_device;
+
+ b->drm = device;
+ wl_list_init(&b->kms_list);
+@@ -4108,6 +4110,10 @@ err_compositor:
+ if (b->gbm)
+ gbm_device_destroy(b->gbm);
+ #endif
++ hash_table_destroy(device->gem_handle_refcnt);
++err_device:
++ free(device);
++err_backend:
+ free(b);
+ return NULL;
+ }
+--
+2.43.0
+
diff --git a/meta-agl-core/recipes-graphics/wayland/weston_13.0_aglcore.inc b/meta-agl-core/recipes-graphics/wayland/weston_13.0_aglcore.inc
index 843a068b4..0b5dae715 100644
--- a/meta-agl-core/recipes-graphics/wayland/weston_13.0_aglcore.inc
+++ b/meta-agl-core/recipes-graphics/wayland/weston_13.0_aglcore.inc
@@ -4,7 +4,8 @@ PACKAGECONFIG:append = "${@bb.utils.contains('DISTRO_FEATURES', 'weston-remoting
SRC_URI:append = " \
file://0001-clients-Handle-missing-pointer_surface-is-there-s-no.patch \
- file://0001-libweston-Add-paint-node-destruction-into-weston_lay.patch \
+ file://0001-backend-drm-don-t-leak-gem_handle_refcnt-in-drm_dest.patch \
+ file://0002-backend-drm-always-create-gem_handle_refcnt-hash-tab.patch \
"
diff --git a/meta-agl-core/recipes-kernel/linux/linux-agl-config-virtio.inc b/meta-agl-core/recipes-kernel/linux/linux-agl-config-virtio.inc
new file mode 100644
index 000000000..e0d30b1f6
--- /dev/null
+++ b/meta-agl-core/recipes-kernel/linux/linux-agl-config-virtio.inc
@@ -0,0 +1,8 @@
+AGL_KCONFIG_FRAGMENTS += " \
+ virtio-${TUNE_ARCH} \
+ virtio-drm.cfg \
+ virtio-pci.cfg \
+ virtio-scmi.cfg \
+ sound-hda.cfg \
+ virtio-snd.cfg \
+"
diff --git a/meta-agl-core/recipes-kernel/linux/linux-agl-config.inc b/meta-agl-core/recipes-kernel/linux/linux-agl-config.inc
index 4799a6180..5cf008a77 100644
--- a/meta-agl-core/recipes-kernel/linux/linux-agl-config.inc
+++ b/meta-agl-core/recipes-kernel/linux/linux-agl-config.inc
@@ -71,10 +71,6 @@ AGL_KCONFIG_FRAGMENTS:append:qemuall = " \
qemu-drm.cfg \
"
-AGL_KCONFIG_FRAGMENTS:append:virtio-all = " \
- sound-hda.cfg \
-"
-
# Configuration for using the ARM virt machine (and not versatilepb)
AGL_KCONFIG_FRAGMENTS:append:qemuarm = " qemuarm.cfg"
diff --git a/meta-agl-core/recipes-kernel/linux/linux-agl.inc b/meta-agl-core/recipes-kernel/linux/linux-agl.inc
index c318716fe..f41e35bc2 100644
--- a/meta-agl-core/recipes-kernel/linux/linux-agl.inc
+++ b/meta-agl-core/recipes-kernel/linux/linux-agl.inc
@@ -3,7 +3,8 @@
DEPENDS += "kern-tools-native"
-include linux-agl-config.inc
+require linux-agl-config.inc
+include ${@bb.utils.contains('AGL_FEATURES', 'agl-virtio-guest', 'linux-agl-config-virtio.inc', '', d)}
# returns all the elements from the src uri that are .cfg files
def find_cfgs(d):
diff --git a/meta-agl-core/recipes-kernel/linux/linux/virtio-aarch64.cfg b/meta-agl-core/recipes-kernel/linux/linux/virtio-aarch64.cfg
new file mode 100644
index 000000000..25381e133
--- /dev/null
+++ b/meta-agl-core/recipes-kernel/linux/linux/virtio-aarch64.cfg
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: MIT
+#
+# ARM64
+#
+CONFIG_ARM64=y
+CONFIG_64BIT=y
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+
+#
+# RTC
+#
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_PL031=y
diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-drm.cfg b/meta-agl-core/recipes-kernel/linux/linux/virtio-drm.cfg
index 2facc345e..2facc345e 100644
--- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-drm.cfg
+++ b/meta-agl-core/recipes-kernel/linux/linux/virtio-drm.cfg
diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-pci.cfg b/meta-agl-core/recipes-kernel/linux/linux/virtio-pci.cfg
index bbcaca312..bbcaca312 100644
--- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-pci.cfg
+++ b/meta-agl-core/recipes-kernel/linux/linux/virtio-pci.cfg
diff --git a/meta-agl-core/recipes-kernel/linux/linux/virtio-scmi.cfg b/meta-agl-core/recipes-kernel/linux/linux/virtio-scmi.cfg
new file mode 100644
index 000000000..5ae01938e
--- /dev/null
+++ b/meta-agl-core/recipes-kernel/linux/linux/virtio-scmi.cfg
@@ -0,0 +1,25 @@
+# Enable ARM_SCMI_PROTOCOL ("ARM System Control and Management Interface (SCMI)
+# Message Protocol") config located in menu
+#
+# -> Device Drivers
+# -> Firmware Drivers
+# -> ARM System Control and Management Interface Protocol
+#
+# After that, in the same menu enabled:
+#
+# * ARM_SCMI_TRANSPORT_VIRTIO ("SCMI transport based on VirtIO")
+#
+# and disabled not used features:
+#
+# * ARM_SCMI_TRANSPORT_SMC ("SCMI transport based on SMC")
+# * ARM_SCMI_POWER_DOMAIN ("SCMI power domain driver")
+
+CONFIG_ARM_SCMI_PROTOCOL=y
+CONFIG_ARM_SCMI_HAVE_TRANSPORT=y
+CONFIG_ARM_SCMI_HAVE_MSG=y
+# CONFIG_ARM_SCMI_TRANSPORT_SMC is not set
+CONFIG_ARM_SCMI_TRANSPORT_VIRTIO=y
+# CONFIG_ARM_SCMI_POWER_DOMAIN is not set
+# CONFIG_SENSORS_ARM_SCMI is not set
+# CONFIG_COMMON_CLK_SCMI is not set
+CONFIG_IIO_SCMI=y
diff --git a/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch
new file mode 100644
index 000000000..72b924337
--- /dev/null
+++ b/meta-agl-core/recipes-multimedia/gstreamer1.0-plugins-bad/files/rcar-gen3/0001-Added-appid-and-title-support.patch
@@ -0,0 +1,166 @@
+From df64f7e34d01a03957d78317ef9a1cf6d6b95055 Mon Sep 17 00:00:00 2001
+From: Marius Vlad <marius.vlad@collabora.com>
+Date: Wed, 9 Aug 2023 14:34:19 +0300
+Subject: [PATCH] Added appid and title support
+
+Bug-AGL: SPEC-4870
+Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
+---
+ ext/wayland/gstwaylandsink.c | 43 ++++++++++++++++++++++++++++++++++--
+ ext/wayland/gstwaylandsink.h | 2 ++
+ ext/wayland/wlwindow.c | 10 ++++++++-
+ ext/wayland/wlwindow.h | 2 +-
+ 4 files changed, 53 insertions(+), 4 deletions(-)
+
+diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
+index 4918154..f743cf2 100644
+--- a/ext/wayland/gstwaylandsink.c
++++ b/ext/wayland/gstwaylandsink.c
+@@ -66,7 +66,9 @@ enum
+ PROP_DISPLAY,
+ PROP_FULLSCREEN,
+ PROP_USE_SUBSURFACE,
+- PROP_SUPPRESS_INTERLACE
++ PROP_SUPPRESS_INTERLACE,
++ PROP_APP_ID,
++ PROP_TITLE
+ };
+
+ #define DEFAULT_USE_SUBSURFACE TRUE
+@@ -229,6 +231,16 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
+ DEFAULT_SUPPRESS_INTERLACE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
++ g_object_class_install_property (gobject_class, PROP_APP_ID,
++ g_param_spec_string ("appid", "Top-level application id", "Wayland "
++ "appid, as xdg_shell::set_app_id",
++ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++
++ g_object_class_install_property (gobject_class, PROP_TITLE,
++ g_param_spec_string ("title", "Top-level title", "Wayland "
++ "title, xdg_shell::set_title",
++ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++
+ gst_type_mark_as_plugin_api (GST_TYPE_WAYLAND_VIDEO, 0);
+ }
+
+@@ -266,6 +278,16 @@ gst_wayland_sink_get_property (GObject * object,
+ g_value_set_string (value, sink->display_name);
+ GST_OBJECT_UNLOCK (sink);
+ break;
++ case PROP_APP_ID:
++ GST_OBJECT_LOCK (sink);
++ g_value_set_string (value, sink->app_id);
++ GST_OBJECT_UNLOCK (sink);
++ break;
++ case PROP_TITLE:
++ GST_OBJECT_LOCK (sink);
++ g_value_set_string (value, sink->title);
++ GST_OBJECT_UNLOCK (sink);
++ break;
+ case PROP_FULLSCREEN:
+ GST_OBJECT_LOCK (sink);
+ g_value_set_boolean (value, sink->fullscreen);
+@@ -298,6 +320,16 @@ gst_wayland_sink_set_property (GObject * object,
+ sink->display_name = g_value_dup_string (value);
+ GST_OBJECT_UNLOCK (sink);
+ break;
++ case PROP_APP_ID:
++ GST_OBJECT_LOCK (sink);
++ sink->app_id = g_value_dup_string (value);
++ GST_OBJECT_UNLOCK (sink);
++ break;
++ case PROP_TITLE:
++ GST_OBJECT_LOCK (sink);
++ sink->title = g_value_dup_string (value);
++ GST_OBJECT_UNLOCK (sink);
++ break;
+ case PROP_FULLSCREEN:
+ GST_OBJECT_LOCK (sink);
+ gst_wayland_sink_set_fullscreen (sink, g_value_get_boolean (value));
+@@ -331,12 +363,18 @@ gst_wayland_sink_finalize (GObject * object)
+ gst_buffer_unref (sink->last_buffer);
+ if (sink->display)
+ g_object_unref (sink->display);
++ if (sink->title)
++ g_object_unref (sink->title);
++ if (sink->app_id)
++ g_object_unref (sink->app_id);
+ if (sink->window)
+ g_object_unref (sink->window);
+ if (sink->pool)
+ gst_object_unref (sink->pool);
+
+ g_free (sink->display_name);
++ g_free (sink->title);
++ g_free (sink->app_id);
+
+ g_mutex_clear (&sink->display_lock);
+ g_mutex_clear (&sink->render_lock);
+@@ -768,7 +806,8 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
+ if (!sink->window) {
+ /* if we were not provided a window, create one ourselves */
+ sink->window = gst_wl_window_new_toplevel (sink->display,
+- &sink->video_info, sink->fullscreen, &sink->render_lock);
++ &sink->video_info, sink->fullscreen, sink->app_id, sink->title,
++ &sink->render_lock);
+ g_signal_connect_object (sink->window, "closed",
+ G_CALLBACK (on_window_closed), sink, 0);
+ }
+diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
+index 46ea538..e6c94ae 100644
+--- a/ext/wayland/gstwaylandsink.h
++++ b/ext/wayland/gstwaylandsink.h
+@@ -64,6 +64,8 @@ struct _GstWaylandSink
+ gboolean fullscreen;
+
+ gchar *display_name;
++ gchar *app_id;
++ gchar *title;
+
+ gboolean redraw_pending;
+ GMutex render_lock;
+diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
+index 3aace87..16faec8 100644
+--- a/ext/wayland/wlwindow.c
++++ b/ext/wayland/wlwindow.c
+@@ -255,7 +255,7 @@ gst_wl_window_ensure_fullscreen (GstWlWindow * window, gboolean fullscreen)
+
+ GstWlWindow *
+ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
+- gboolean fullscreen, GMutex * render_lock)
++ gboolean fullscreen, gchar *app_id, gchar *title, GMutex * render_lock)
+ {
+ GstWlWindow *window;
+
+@@ -288,6 +288,14 @@ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
+
+ /* Finally, commit the xdg_surface state as toplevel */
+ window->configured = FALSE;
++ if (app_id)
++ xdg_toplevel_set_app_id (window->xdg_toplevel, app_id);
++ else
++ xdg_toplevel_set_app_id (window->xdg_toplevel, "ext.wayland.waylandsink");
++ if (title)
++ xdg_toplevel_set_title (window->xdg_toplevel, title);
++ else
++ xdg_toplevel_set_title (window->xdg_toplevel, "ext.wayland.waylandsink");
+ wl_surface_commit (window->area_surface);
+ wl_display_flush (display->display);
+
+diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h
+index 034a5a5..6b525c8 100644
+--- a/ext/wayland/wlwindow.h
++++ b/ext/wayland/wlwindow.h
+@@ -84,7 +84,7 @@ GType gst_wl_window_get_type (void);
+ void gst_wl_window_ensure_fullscreen (GstWlWindow * window,
+ gboolean fullscreen);
+ GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display,
+- const GstVideoInfo * info, gboolean fullscreen, GMutex * render_lock);
++ const GstVideoInfo * info, gboolean fullscreen, gchar * app_id, gchar *title, GMutex * render_lock);
+ GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display,
+ struct wl_surface * parent, GMutex * render_lock);
+
+--
+2.35.1
+
diff --git a/meta-agl-core/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch b/meta-agl-core/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch
index 11c6fd27b..3757fe0a7 100644
--- a/meta-agl-core/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch
+++ b/meta-agl-core/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch
@@ -23,13 +23,14 @@ Signed-off-by: Tim Orling <timothy.t.orling@linux.intel.com>
[updated for ptest-runner 2.3.2]
[updated for ptest-runner 2.4.1]
[updated for ptest-runner 2.4.2]
+[updated for ptest-runner 2.4.4]
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
---
flags.h | 10 ++++++++++
main.c | 9 ++++++++-
- utils.c | 17 ++++++++++++++++-
+ utils.c | 20 +++++++++++++++++++-
utils.h | 2 +-
- 4 files changed, 35 insertions(+), 3 deletions(-)
+ 4 files changed, 38 insertions(+), 3 deletions(-)
create mode 100644 flags.h
diff --git a/flags.h b/flags.h
@@ -84,7 +85,7 @@ index 31e4dd5..f12d6d6 100644
print_usage(stdout, argv[0]);
exit(1);
diff --git a/utils.c b/utils.c
-index 59b8b77..30423c4 100644
+index 6cf7705..f6a3a2a 100644
--- a/utils.c
+++ b/utils.c
@@ -49,6 +49,7 @@
@@ -95,17 +96,19 @@ index 59b8b77..30423c4 100644
#define GET_STIME_BUF_SIZE 1024
#define WAIT_CHILD_BUF_MAX_SIZE 1024
-@@ -425,6 +426,7 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
- }
+@@ -369,6 +370,9 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
+ strcpy(ptest_dir, p->run_ptest);
+ dirname(ptest_dir);
- char *ptest_dir = strdup(p->run_ptest);
+ char *ptest = strdup(p->ptest);
- if (ptest_dir == NULL) {
++ CHECK_ALLOCATION(ptest, 1, 1);
++
+ if (pipe2(pipefd_stdout, 0) == -1) {
+ fprintf(fp, "ERROR: pipe2() failed with: %s.\n", strerror(errno));
rc = -1;
- break;
-@@ -477,7 +479,10 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
- fprintf(fp, "ERROR: setpgid() failed, %s\n", strerror(errno));
- }
+@@ -425,7 +429,10 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
+ do_close(&pipefd_stdout[PIPE_WRITE]);
+ do_close(&pipefd_stderr[PIPE_WRITE]);
- time_t start_time= time(NULL);
+ if (opts.flags & LAVA_SIGNAL_ENABLE) {
@@ -115,7 +118,7 @@ index 59b8b77..30423c4 100644
fprintf(fp, "%s\n", get_stime(stime, GET_STIME_BUF_SIZE, start_time));
fprintf(fp, "BEGIN: %s\n", ptest_dir);
-@@ -594,6 +599,16 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
+@@ -542,6 +549,16 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
fprintf(fp, "END: %s\n", ptest_dir);
fprintf(fp, "%s\n", get_stime(stime, GET_STIME_BUF_SIZE, end_time));
@@ -130,8 +133,16 @@ index 59b8b77..30423c4 100644
+ fprintf(stdout, "<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=%s>\n", ptest, result);
+ }
}
- free(ptest_dir);
- do_close(&pipefd_stdout[PIPE_READ]);
+
+ ptest_list_fail4:
+@@ -556,6 +573,7 @@ ptest_list_fail2:
+ do_close(&pipefd_stdout[PIPE_WRITE]);
+
+ ptest_list_fail1:
++ free(ptest);
+ fflush(fp);
+ fflush(fp_stderr);
+
diff --git a/utils.h b/utils.h
index 04fc666..ad702d8 100644
--- a/utils.h
@@ -148,5 +159,5 @@ index 04fc666..ad702d8 100644
extern struct ptest_list *get_available_ptests(const char *);
extern int print_ptests(struct ptest_list *, FILE *);
--
-2.37.3
+2.44.0
diff --git a/meta-agl-flutter/README.md b/meta-agl-flutter/README.md
new file mode 100644
index 000000000..24929ccd0
--- /dev/null
+++ b/meta-agl-flutter/README.md
@@ -0,0 +1,252 @@
+# meta-agl-flutter
+
+## Steps to build `agl-ivi-demo-platform-flutter` image
+
+```
+ export AGL_TOP=$HOME/workspace_agl
+ mkdir -p $AGL_TOP && cd $AGL_TOP
+ repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo -b master
+ repo sync -j $(nproc)
+ source meta-agl/scripts/aglsetup.sh -m qemux86-64 agl-demo
+ bitbake agl-ivi-demo-platform-flutter
+```
+
+This builds AGL demo image that includes Flutter runtime={debug,profile,release}.
+
+
+## Steps to build a minimal flutter image
+
+```
+ export AGL_TOP=$HOME/workspace_agl
+ mkdir -p $AGL_TOP && cd $AGL_TOP
+ repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo -b master
+ repo sync -j `grep -c ^processor /proc/cpuinfo`
+ source meta-agl/scripts/aglsetup.sh -m qemux86-64 agl-devel agl-flutter
+ bitbake agl-image-flutter
+```
+ * includes Flutter engine runtime={debug,release,profile}
+ * includes Flutter Engine SDK
+ * includes SSH server
+ * live debugging/profiling with target via host
+
+## Useful Notes
+
+flutter-auto runs as user `agl-driver`. After logging in as root you can delete password for `agl-driver`:
+```
+# passwd -d agl-driver
+```
+
+To track flutter-auto output:
+```
+# journalctl -ex -u flutter-homescreen -f
+```
+
+To view available Flutter programs in OS image:
+```
+ls -la /usr/share/flutter
+```
+
+To change Flutter program that runs on boot edit this file:
+```
+# vi /usr/lib/systemd/system/flutter-homescreen.service
+```
+
+To change device to run Gallery on reboot edit flutter-homescreen.service to:
+```
+ExecStart=/usr/bin/flutter-auto --b=/usr/share/flutter/gallery/${FLUTTER_VERSION}/${FLUTTER_RUNTIME} --j=/usr/share/flutter/flutter-homescreen.json --xdg-shell-app-id=homescreen
+```
+To enable experimental impeller support edit flutter-homescreen.service adding --enable-impeller:
+```
+ExecStart=/usr/bin/flutter-auto --b=/usr/share/flutter/gallery/${FLUTTER_VERSION}/${FLUTTER_RUNTIME} --j=/usr/share/flutter/flutter-homescreen.json --xdg-shell-app-id=homescreen --enable-impeller
+```
+
+After edits either run:
+```
+# systemctl daemon-reload
+# systemctl restart flutter-homescreen
+```
+or
+```
+# reboot
+```
+
+Collecting a stack trace for flutter-auto
+```
+# systemctl stop flutter-auto
+# export SPDLOG_LEVEL=trace
+# export XDG_RUNTIME_DIR=/run/user/1001/
+# gdb --args flutter-auto --b=/usr/share/flutter/gallery/<flutter version>/release/ --j=/usr/share/flutter/flutter-homescreen.json --xdg-shell-app-id=homescreen
+```
+
+## Flutter Engine SDK
+
+If recipe `flutter-engine-sdk-dev` is included in your AGL image, `engine_sdk.zip` will be present in `/usr/share/flutter/`.
+
+engine_sdk.zip contains
+* sdk/flutter_sdk.version - The Flutter SDK version
+* sdk/engine.version - The git commit of the Flutter Engine
+* sdk/clang_x64/gen_snapshot - used for creating release/profile AOT image
+
+This recipe should be excluded from image in a production release.
+
+
+## Flutter Workspace Automation
+
+ cd $AGL
+ cd $AGL_TOP
+ ln -sf external/workspace-automation/flutter_workspace.py meta-agl-devel/meta-agl-flutter/tools/flutter_workspace.py
+ cd meta-agl-devel/meta-agl-flutter/tools
+ export FLUTTER_WORKSPACE=`pwd`
+ flutter_workspace.py
+ source setup_env.sh
+
+Additional documentation available [here](https://github.com/meta-flutter/meta-flutter/tree/kirkstone/tools#flutter-workspace-automation)
+
+
+## Startup Service
+
+This layer includes an example systemd user service for the Flutter Gallery application which is disabled by default. It can be used to start the application in the minimal image by doing 'systemctl start flutter-gallery'.
+
+
+## `/usr/share/flutter/default.json`
+
+For more JSON key value options see [here](https://github.com/toyota-connected/ivi-homescreen/blob/agl/README.md#json-configuration-keys)
+
+
+## Custom Devices
+
+### desktop-auto
+
+This is a desktop build of flutter-auto. The default configuration for backend is set to `egl` backend. To change this to use the `vulkan` backend, change the `backend` key value in `meta-agl-flutter/tools/flutter_workspace_config.json` from `egl` to `vulkan`. If you use the workspace configuration from meta-flutter it defaults to `vulkan`.
+
+If you are running a Gnome Display Manager (GDM) Wayland session, then it will be an available custom-device platform. To enable a Wayland session, you select the gear icon at the login window. If you don't have a gear icon available on your login screen, then you will need to adjust your system settings to enable a Wayland session.
+
+Append `--device-id=desktop-auto` to `flutter <cmd>` to select this device.
+
+### QEMU-agl
+
+This is a QEMU minimal Flutter image as referenced [here](#steps-to-build-a-minimal-flutter-image). The required runtime packages are installed as part of setup_flutter_workspace.py.
+
+If qemu_run was sucessfully invoked, then this platform will be an available `custom-device`. If QEMU instance is not running on port 2222, then this custom-device platform will not be available.
+
+Append `--device-id=AGL-qemu` to `flutter <cmd>` to select this device.
+
+### Flutter Engine
+
+To enable local build of Flutter Engine set `tools/configs/flutter-engine.json` load key to true.
+
+This enables debugging as custom engine development.
+
+## Steps to Test Flutter Images
+
+### Debug
+
+1. Set up Flutter Workspace per [Flutter Workspace Automation](#flutter-workspace-automation).
+
+2. Run the following commands on the host's terminal, a QEMU window and a new terminal for AGL will be brought up.
+
+```
+ cd $FLUTTER_WORKSPACE
+ source ./setup_env.sh
+ qemu_run
+```
+
+3. If running an updated QEMU image, edit `~/.ssh/known_hosts` and remove previous connection.
+
+4. Wait for QEMU image to boot to idle the run
+```
+ ssh -p 2222 root@localhost who
+```
+_Answering with `y` appends QEMU connection to `~/.ssh/known_hosts`_
+
+5. From the same host terminal open Visual Studio Code Select
+ * **Run and Debug**
+ * **gallery(AGL-qemu)** from the drop down combo box
+ * **run** - this launches the Flutter gallery app in the QEMU window​
+
+6. Or run from the same terminal as qemu_run was executed via
+```
+ cd $FLUTTER_WORKSPACE/app/gallery
+ flutter run --device-id=AGL-qemu
+```
+
+
+### Working with QEMU images
+
+1. Setup the flutter workspace.
+
+ source ${FLUTTER_WORKSPACE}/setup_env.sh
+
+The stdout tail should look similar to:
+
+ ********************************************
+ * Type 'run-agl-qemu-master' to start
+ ********************************************
+ ********************************************
+ * Type 'run-agl-qemu-octopus' to start
+ ********************************************
+
+3. Select image to run using one of above commands.
+
+```
+ run-agl-qemu-octopus
+```
+
+4. If running an updated QEMU image, edit `~/.ssh/known_hosts` and remove previous connection.
+
+5. Login AGL as `root`, and execute `passwd -d agl-driver`. Type `exit` and login as `agl-driver`. Run the Flutter Gallery example with the command in AGL's terminal.
+
+```
+ cd $FLUTTER_WORKSPACE/app/gallery
+ flutter run -d agl-qemu-octopus
+```
+
+
+### Profile
+
+1. Setup the flutter workspace.
+
+ source ${FLUTTER_WORKSPACE}/setup_env.sh
+
+The stdout tail should look similar to:
+
+ ********************************************
+ * Type 'run-agl-qemu-master' to start
+ ********************************************
+ ********************************************
+ * Type 'run-agl-qemu-octopus' to start
+ ********************************************
+
+3. Select image to run using one of above commands.
+
+```
+ run-agl-qemu-octopus
+```
+
+4. If running an updated QEMU image, edit `~/.ssh/known_hosts` and remove previous connection.
+
+5. After waiting for QEMU image to boot to idle issue
+```
+ ssh -p 2222 root@localhost who
+```
+Answering with `y` appends QEMU connection to `~/.ssh/known_hosts`
+
+6. Login AGL as `agl-driver`, and issue the following command
+```
+ flutter-auto --window-type="BG" --b=/usr/share/flutter/gallery/3.3.7/profile --f --observatory-host=0.0.0.0 --observatory-port=1234
+```
+
+The last line of the output message should look similar to this:
+```
+ flutter: The Dart VM service is listening on http://0.0.0.0:1234/xxxxxxxxxxx=/
+```
+
+7. Run the following command in the host terminal, using the correct hash suffix.
+```
+ flutter attach --device-id=AGL-qemu --debug-url=http://127.0.0.1:1234/xxxxxxxxxxx=/
+```
+​
+8. Then you should see the output as below. It tells us the URL of the Flutter DevTools debugger and profiler on AGL x86_64 QEMU Image.
+`An Observatory debugger and profiler on AGL x86_64 QEMU Image is available at: http://127.0.0.1:37383/xxxxxxxxxxx=/`
+​
+9. in the terminal type `v` to launch the debugger.
diff --git a/meta-agl-flutter/conf/include/agl-flutter.inc b/meta-agl-flutter/conf/include/agl-flutter.inc
new file mode 100644
index 000000000..6d60bc4a2
--- /dev/null
+++ b/meta-agl-flutter/conf/include/agl-flutter.inc
@@ -0,0 +1,3 @@
+AGL_FEATURES += "agl-flutter"
+
+FLUTTER_SDK_TAG = "3.24.2"
diff --git a/meta-agl-flutter/conf/layer.conf b/meta-agl-flutter/conf/layer.conf
new file mode 100644
index 000000000..e21f9bc68
--- /dev/null
+++ b/meta-agl-flutter/conf/layer.conf
@@ -0,0 +1,19 @@
+# We have a conf and classes directory, add to BBPATH
+BBPATH .= ":${LAYERDIR}"
+
+# We have recipes-* directories, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
+ ${LAYERDIR}/recipes-*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "agl-flutter-layer"
+BBFILE_PATTERN_agl-flutter-layer = "^${LAYERDIR}/"
+BBFILE_PRIORITY_agl-flutter-layer = "61"
+
+LAYERVERSION_agl-flutter-layer = "1"
+LAYERDEPENDS_agl-flutter-layer = "core flutter-layer"
+LAYERRECOMMENDS_agl-flutter-layer = "flutter-apps-layer"
+LAYERSERIES_COMPAT_agl-flutter-layer = "scarthgap"
+
+BBFILES_DYNAMIC += " \
+ flutter-apps-layer:${LAYERDIR}/dynamic-layers/flutter-apps-layer/*/*/*/*.bbappend \
+"
diff --git a/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.service b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.service
new file mode 100644
index 000000000..f3f4a94b1
--- /dev/null
+++ b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.service
@@ -0,0 +1,13 @@
+[Unit]
+Requires=agl-compositor.service
+After=agl-compositor.service
+
+[Service]
+User=agl-driver
+EnvironmentFile=/etc/default/flutter
+EnvironmentFile=-/etc/default/flutter-samples-material-3-demo
+Environment=XDG_RUNTIME_DIR=/run/user/1001/
+ExecStart=/usr/bin/flutter-auto -b /usr/share/flutter/flutter-samples-material-3-demo/${FLUTTER_VERSION}/${FLUTTER_RUNTIME} -xdg-shell-app-id flutter-samples-material-3-demo
+
+[Install]
+WantedBy=graphical.target
diff --git a/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.toml b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.toml
new file mode 100644
index 000000000..cb78ab0cd
--- /dev/null
+++ b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo/flutter-samples-material-3-demo.toml
@@ -0,0 +1,5 @@
+[view]
+window_type = "BG"
+width = 1080
+height = 1920
+fullscreen = true
diff --git a/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_%.bbappend b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_%.bbappend
new file mode 100644
index 000000000..0baa7a045
--- /dev/null
+++ b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agl-flutter', 'flutter-samples-material-3-demo_aglflutter.inc', '', d)}
diff --git a/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_aglflutter.inc b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_aglflutter.inc
new file mode 100644
index 000000000..971756ad7
--- /dev/null
+++ b/meta-agl-flutter/dynamic-layers/flutter-apps-layer/recipes-graphics/flutter-apps/first-party/flutter-samples-material-3-demo_aglflutter.inc
@@ -0,0 +1,22 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/flutter-samples-material-3-demo:"
+
+SRC_URI += "file://flutter-samples-material-3-demo.service"
+
+APP_CONFIG = "flutter-samples-material-3-demo.toml"
+
+inherit systemd
+
+do_install:append() {
+ install -D -m 0644 ${WORKDIR}/${BPN}.service ${D}${systemd_system_unitdir}/${BPN}.service
+
+ # determine build type based on what flutter-engine installed.
+ for runtime_mode in ${FLUTTER_RUNTIME_MODES}
+ do
+ install -D -m 0644 ${WORKDIR}/${APP_CONFIG} \
+ ${D}${datadir}/flutter/${PUBSPEC_APPNAME}/${FLUTTER_SDK_VERSION}/${runtime_mode}/config.toml
+ done
+}
+
+RDEPENDS:${PN} += "agl-flutter-env"
+
+SYSTEMD_SERVICE:${PN} = "flutter-samples-material-3-demo.service"
diff --git a/meta-agl-flutter/recipes-config/agl-flutter-env/agl-flutter-env_1.0.bb b/meta-agl-flutter/recipes-config/agl-flutter-env/agl-flutter-env_1.0.bb
new file mode 100644
index 000000000..80f7fb3f1
--- /dev/null
+++ b/meta-agl-flutter/recipes-config/agl-flutter-env/agl-flutter-env_1.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "AGL Flutter environment file"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+inherit allarch
+
+AGL_FLUTTER_DEFAULT_RUNTIME ?= "release"
+
+do_compile[noexec] = "1"
+
+do_install() {
+ install -d ${D}${sysconfdir}/default
+ echo "FLUTTER_VERSION=${FLUTTER_SDK_TAG}" > ${D}${sysconfdir}/default/flutter
+ echo "FLUTTER_RUNTIME=${AGL_FLUTTER_DEFAULT_RUNTIME}" >> ${D}${sysconfdir}/default/flutter
+ echo "LIBCAMERA_LOG_LEVELS=*:ERROR" >> ${D}${sysconfdir}/default/flutter
+}
diff --git a/meta-agl-flutter/recipes-graphics/toyota/files/0001-Disable-on_frame_base_surface-wl_surface_commit.patch b/meta-agl-flutter/recipes-graphics/toyota/files/0001-Disable-on_frame_base_surface-wl_surface_commit.patch
new file mode 100644
index 000000000..a37233b50
--- /dev/null
+++ b/meta-agl-flutter/recipes-graphics/toyota/files/0001-Disable-on_frame_base_surface-wl_surface_commit.patch
@@ -0,0 +1,26 @@
+From fda28bbd6718bf113061292d8cec15084060c923 Mon Sep 17 00:00:00 2001
+From: Joel Winarske <joel.winarske@gmail.com>
+Date: Wed, 19 Jul 2023 15:21:46 -0700
+Subject: [PATCH] Disable on_frame_base_surface wl_surface_commit
+
+Signed-off-by: Joel Winarske <joel.winarske@gmail.com>
+---
+ shell/wayland/window.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/shell/wayland/window.cc b/shell/wayland/window.cc
+index c74b438..f244f08 100644
+--- a/shell/wayland/window.cc
++++ b/shell/wayland/window.cc
+@@ -257,7 +257,7 @@ void WaylandWindow::on_frame_base_surface(void* data,
+ window->m_fps_counter++;
+ window->m_fps_counter++;
+
+- wl_surface_commit(window->m_base_surface);
++ //wl_surface_commit(window->m_base_surface);
+ }
+
+ uint32_t WaylandWindow::GetFpsCounter() {
+--
+2.41.0
+
diff --git a/meta-agl-flutter/recipes-graphics/toyota/flutter-auto_%.bbappend b/meta-agl-flutter/recipes-graphics/toyota/flutter-auto_%.bbappend
new file mode 100644
index 000000000..dbc82bc3f
--- /dev/null
+++ b/meta-agl-flutter/recipes-graphics/toyota/flutter-auto_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agl-flutter', 'flutter-auto_aglflutter.inc', '', d)}
diff --git a/meta-agl-flutter/recipes-graphics/toyota/flutter-auto_aglflutter.inc b/meta-agl-flutter/recipes-graphics/toyota/flutter-auto_aglflutter.inc
new file mode 100644
index 000000000..7ba85a34d
--- /dev/null
+++ b/meta-agl-flutter/recipes-graphics/toyota/flutter-auto_aglflutter.inc
@@ -0,0 +1,3 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
+
+SRC_URI:append:use-nxp-bsp = " file://0001-Disable-on_frame_base_surface-wl_surface_commit.patch"
diff --git a/meta-agl-flutter/recipes-platform/images/agl-image-flutter-debug.bb b/meta-agl-flutter/recipes-platform/images/agl-image-flutter-debug.bb
new file mode 100644
index 000000000..9b4b08398
--- /dev/null
+++ b/meta-agl-flutter/recipes-platform/images/agl-image-flutter-debug.bb
@@ -0,0 +1,29 @@
+require recipes-platform/images/agl-image-compositor.bb
+
+SUMMARY = "Example Flutter application debug image for development"
+LICENSE = "MIT"
+
+CLANGSDK = "1"
+
+# NOTES:
+# - the package-management IMAGE_FEATURE and packagegroup-agl-core-devel
+# are explicitly added here to cover the usecase of building without
+# passing agl-devel to aglsetup.sh. This is explicitly a debug image
+# where those are are always desired.
+# - Getting the debug version of the application requires changing
+# the value of FLUTTER_APP_RUNTIME_MODES to include "debug",
+# which is outside the scope of this image recipe.
+
+IMAGE_FEATURES += "ssh-server-openssh package-management dbg-pkgs"
+
+IMAGE_INSTALL += "\
+ packagegroup-agl-core-devel \
+ \
+ weston-ini-conf-landscape \
+ \
+ flutter-auto-verbose-logs \
+ \
+ flutter-engine-sdk-dev \
+ \
+ flutter-samples-material-3-demo \
+"
diff --git a/meta-agl-flutter/recipes-platform/images/agl-image-flutter.bb b/meta-agl-flutter/recipes-platform/images/agl-image-flutter.bb
new file mode 100644
index 000000000..700f540ed
--- /dev/null
+++ b/meta-agl-flutter/recipes-platform/images/agl-image-flutter.bb
@@ -0,0 +1,16 @@
+require recipes-platform/images/agl-image-compositor.bb
+
+SUMMARY = "Example Flutter application image"
+LICENSE = "MIT"
+
+CLANGSDK = "1"
+
+IMAGE_FEATURES += "ssh-server-openssh"
+
+IMAGE_INSTALL += "\
+ weston-ini-conf-landscape \
+ \
+ flutter-auto \
+ \
+ flutter-samples-material-3-demo \
+"
diff --git a/meta-agl-flutter/tools/.gitignore b/meta-agl-flutter/tools/.gitignore
new file mode 100644
index 000000000..abda9b65c
--- /dev/null
+++ b/meta-agl-flutter/tools/.gitignore
@@ -0,0 +1,151 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# IDEA
+.idea
+
+# Flutter Workspace generated
+.agl
+.config
+.flutter-auto
+.pub_cache
+.tmp
+.vscode
+setup_env.sh
+flutter
+app
+flutter_*.log
+qemu_run.scpt
+
+dart-revision.json
+engine-revision.json
+
+*.scpt
+
diff --git a/meta-agl-flutter/tools/configs/_globals.json b/meta-agl-flutter/tools/configs/_globals.json
new file mode 100644
index 000000000..1830c8d40
--- /dev/null
+++ b/meta-agl-flutter/tools/configs/_globals.json
@@ -0,0 +1,5 @@
+{
+ "flutter-version": "3.24.1",
+ "github_token": "",
+ "cookie_file": ""
+}
diff --git a/meta-agl-flutter/tools/configs/_repos.json b/meta-agl-flutter/tools/configs/_repos.json
new file mode 100644
index 000000000..5fb8aa047
--- /dev/null
+++ b/meta-agl-flutter/tools/configs/_repos.json
@@ -0,0 +1,16 @@
+[
+ {
+ "uri": "https://github.com/toyota-connected/ivi-homescreen.git",
+ "rev": "e87c1797f838e20f0a4c1af309541d63986058ca",
+ "branch": "v2.0"
+ },
+ {
+ "uri": "https://github.com/toyota-connected/ivi-homescreen-plugins.git",
+ "rev": "41d00635f89c064aa32f2cef3147c59b8f61694f",
+ "branch": "v2.0"
+ },
+ {
+ "uri": "https://chromium.googlesource.com/chromium/tools/depot_tools.git",
+ "branch": "main"
+ }
+]
diff --git a/meta-agl-flutter/tools/configs/agl-qemu-master.json b/meta-agl-flutter/tools/configs/agl-qemu-master.json
new file mode 100644
index 000000000..dae014a58
--- /dev/null
+++ b/meta-agl-flutter/tools/configs/agl-qemu-master.json
@@ -0,0 +1,114 @@
+{
+ "id": "agl-qemu-master",
+ "load": true,
+ "supported_archs": [
+ "x86_64",
+ "arm64"
+ ],
+ "supported_host_types": [
+ "darwin",
+ "ubuntu",
+ "fedora"
+ ],
+ "flutter_runtime": "debug",
+ "type": "qemu",
+ "env": {
+ "RELEASE_NAME": "master",
+ "RELEASE_VERSION": "latest",
+ "FLUTTER_DEBUG_PORT": "1234",
+ "FLUTTER_OBSERVATORY_HOST": "0.0.0.0",
+ "CONTAINER_SSH_PORT": "2222",
+ "DEVICE_HOSTNAME": "localhost",
+ "FLUTTER_AUTO_EXE": "flutter-auto --j=/tmp/${appName}/default_config.json --b=/tmp/${appName}",
+ "PING_CMD": "(echo >/dev/tcp/localhost/${CONTAINER_SSH_PORT}) &>/dev/null && echo open || echo closed",
+ "DELETE_USER_PWD": "ssh -oStrictHostKeyChecking=no -p ${CONTAINER_SSH_PORT} -t -oBatchMode=yes root@${DEVICE_HOSTNAME} passwd -d agl-driver",
+ "CREATE_BUNDLE_FOLDER": "ssh -oStrictHostKeyChecking=no -p ${CONTAINER_SSH_PORT} -o BatchMode=yes agl-driver@${DEVICE_HOSTNAME} mkdir -p /tmp/${appName}/data",
+ "COPY_PLATFORM_ID_TO_DEVICE": "scp -oStrictHostKeyChecking=no -P ${CONTAINER_SSH_PORT} -r ${PLATFORM_ID_DIR}/default_config.json agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/",
+ "COPY_ASSETS_TO_DEVICE": "scp -oStrictHostKeyChecking=no -P ${CONTAINER_SSH_PORT} -r ${localPath}/* agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/data/flutter_assets",
+ "DELETE_APP_FOLDER": "ssh -oStrictHostKeyChecking=no -p ${CONTAINER_SSH_PORT} -o BatchMode=yes agl-driver@${DEVICE_HOSTNAME} rm -rf /tmp/${appName}"
+ },
+ "runtime": {
+ "config": {
+ "view": [
+ {
+ "window_type": "BG",
+ "width": 1920,
+ "height": 1080
+ }
+ ]
+ },
+ "pre-requisites": {
+ "arm64": {
+ "darwin": {
+ "cmds": [
+ "bash -c \"arch -arm64 brew install xz\"",
+ "bash -c \"arch -arm64 brew install qemu\""
+ ]
+ }
+ }
+ },
+ "artifacts": {
+ "http": {
+ "url": "https://download.automotivelinux.org/AGL/snapshots/${RELEASE_NAME}/${RELEASE_VERSION}",
+ "artifacts": {
+ "x86_64": [
+ {
+ "endpoint": "/qemux86-64/deploy/images/qemux86-64/agl-ivi-demo-platform-flutter-qemux86-64.wic.vmdk.xz"
+ }
+ ],
+ "arm64": [
+ {
+ "endpoint": "/qemuarm64/deploy/images/qemuarm64/agl-demo-platform-crosssdk-qemuarm64.ext4.xz"
+ },
+ {
+ "endpoint": "/qemuarm64/deploy/images/qemuarm64/Image-qemuarm64.bin"
+ }
+ ]
+ }
+ }
+ },
+ "qemu": {
+ "cmd": "qemu-system-${FORMAL_MACHINE_ARCH}",
+ "x86_64": {
+ "image": "agl-ivi-demo-platform-flutter-qemux86-64.wic.vmdk",
+ "args": "-m 2048 ${QEMU_EXTRA} -hda ${QEMU_IMAGE} -cpu kvm64 -cpu qemu64,+ssse3,+sse4.1,+sse4.2,+popcnt -vga virtio -device virtio-rng-pci -serial mon:stdio -serial null -device intel-hda -device hda-duplex -device virtio-net-pci,netdev=net0,mac=${RANDOM_MAC} -netdev user,id=net0,hostfwd=tcp::${CONTAINER_SSH_PORT}-:22,hostfwd=tcp::${FLUTTER_DEBUG_PORT}-:${FLUTTER_DEBUG_PORT}"
+ },
+ "arm64": {
+ "kernel": "Image-qemuarm64.bin",
+ "image": "agl-demo-platform-crosssdk-qemuarm64.ext4",
+ "args": "-accel hvf -cpu host -M virt ${QEMU_EXTRA} -m 4096 -device virtio-gpu-pci -nographic -display cocoa,show-cursor=on -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0 -device qemu-xhci -device usb-tablet -device usb-mouse -device usb-kbd -device virtio-net-pci,netdev=vnet -netdev user,id=vnet,hostfwd=tcp::${CONTAINER_SSH_PORT}-:22,hostfwd=tcp::${FLUTTER_DEBUG_PORT}-:${FLUTTER_DEBUG_PORT} -kernel ${QEMU_KERNEL} -drive file=${QEMU_IMAGE},format=raw,if=virtio -append root=/dev/vda"
+ },
+ "extra": {
+ "darwin": "-smp cpus=8,sockets=1,cores=8,threads=1",
+ "ubuntu": "-bios OVMF.fd",
+ "fedora": "-bios /usr/share/edk2/ovmf/OVMF_CODE.fd"
+ }
+ },
+ "post_cmds": [
+ {
+ "cwd": "${PLATFORM_ID_DIR}",
+ "cmds": [
+ "bash -c \"rm ${QEMU_IMAGE}|true\"",
+ "unxz --keep ${QEMU_IMAGE}.xz"
+ ]
+ }
+ ]
+ },
+ "overwrite-existing": true,
+ "custom-device": {
+ "id": "agl-qemu-${RELEASE_NAME}",
+ "label": "AGL ${RELEASE_NAME}-${RELEASE_VERSION} QEMU Image",
+ "sdkNameAndVersion": "qemu-${RELEASE_NAME} ${RELEASE_VERSION}",
+ "platform": "linux-x64",
+ "enabled": true,
+ "ping": "bash -c \"${PING_CMD}\"",
+ "pingSuccessRegex": "open",
+ "postBuild": "bash -c \"${DELETE_USER_PWD}\"",
+ "install": "bash -c \"${CREATE_BUNDLE_FOLDER} && ${COPY_PLATFORM_ID_TO_DEVICE} && ${COPY_ASSETS_TO_DEVICE}\"",
+ "uninstall": "bash -c \"${DELETE_APP_FOLDER}\"",
+ "runDebug": "bash -c \"ssh -oStrictHostKeyChecking=no -t -t -o BatchMode=yes agl-driver@${DEVICE_HOSTNAME} ${FLUTTER_AUTO_EXE}\"",
+ "forwardPort": null,
+ "forwardPortSuccessRegex": null,
+ "screenshot": null
+ }
+}
diff --git a/meta-agl-flutter/tools/configs/agl-qemu-octopus.json b/meta-agl-flutter/tools/configs/agl-qemu-octopus.json
new file mode 100644
index 000000000..20e20e0c1
--- /dev/null
+++ b/meta-agl-flutter/tools/configs/agl-qemu-octopus.json
@@ -0,0 +1,114 @@
+{
+ "id": "agl-qemu-octopus",
+ "load": true,
+ "supported_archs": [
+ "x86_64",
+ "arm64"
+ ],
+ "supported_host_types": [
+ "darwin",
+ "ubuntu",
+ "fedora"
+ ],
+ "flutter_runtime": "debug",
+ "type": "qemu",
+ "env": {
+ "RELEASE_NAME": "octopus",
+ "RELEASE_VERSION": "latest",
+ "FLUTTER_DEBUG_PORT": "1234",
+ "FLUTTER_OBSERVATORY_HOST": "0.0.0.0",
+ "CONTAINER_SSH_PORT": "2222",
+ "DEVICE_HOSTNAME": "localhost",
+ "FLUTTER_AUTO_EXE": "flutter-auto --j=/tmp/${appName}/default_config.json --b=/tmp/${appName}",
+ "PING_CMD": "(echo >/dev/tcp/localhost/${CONTAINER_SSH_PORT}) &>/dev/null && echo open || echo closed",
+ "DELETE_USER_PWD": "ssh -oStrictHostKeyChecking=no -p ${CONTAINER_SSH_PORT} -t -oBatchMode=yes root@${DEVICE_HOSTNAME} passwd -d agl-driver",
+ "CREATE_BUNDLE_FOLDER": "ssh -oStrictHostKeyChecking=no -p ${CONTAINER_SSH_PORT} -o BatchMode=yes agl-driver@${DEVICE_HOSTNAME} mkdir -p /tmp/${appName}/data",
+ "COPY_PLATFORM_ID_TO_DEVICE": "scp -oStrictHostKeyChecking=no -P ${CONTAINER_SSH_PORT} -r ${PLATFORM_ID_DIR}/default_config.json agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/",
+ "COPY_ASSETS_TO_DEVICE": "scp -oStrictHostKeyChecking=no -P ${CONTAINER_SSH_PORT} -r ${localPath}/* agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/data/flutter_assets",
+ "DELETE_APP_FOLDER": "ssh -oStrictHostKeyChecking=no -p ${CONTAINER_SSH_PORT} -o BatchMode=yes agl-driver@${DEVICE_HOSTNAME} rm -rf /tmp/${appName}"
+ },
+ "runtime": {
+ "config": {
+ "view": [
+ {
+ "window_type": "BG",
+ "width": 1920,
+ "height": 1080
+ }
+ ]
+ },
+ "pre-requisites": {
+ "arm64": {
+ "darwin": {
+ "cmds": [
+ "bash -c \"arch -arm64 brew install xz\"",
+ "bash -c \"arch -arm64 brew install qemu\""
+ ]
+ }
+ }
+ },
+ "artifacts": {
+ "http": {
+ "url": "https://download.automotivelinux.org/AGL/release/${RELEASE_NAME}/${RELEASE_VERSION}",
+ "artifacts": {
+ "x86_64": [
+ {
+ "endpoint": "/qemux86-64/deploy/images/qemux86-64/agl-ivi-demo-platform-flutter-qemux86-64.wic.vmdk.xz"
+ }
+ ],
+ "arm64": [
+ {
+ "endpoint": "/qemuarm64/deploy/images/qemuarm64/agl-demo-platform-crosssdk-qemuarm64.ext4.xz"
+ },
+ {
+ "endpoint": "/qemuarm64/deploy/images/qemuarm64/Image-qemuarm64.bin"
+ }
+ ]
+ }
+ }
+ },
+ "qemu": {
+ "cmd": "qemu-system-${FORMAL_MACHINE_ARCH}",
+ "x86_64": {
+ "image": "agl-ivi-demo-platform-flutter-qemux86-64.wic.vmdk",
+ "args": "-m 2048 ${QEMU_EXTRA} -hda ${QEMU_IMAGE} -cpu kvm64 -cpu qemu64,+ssse3,+sse4.1,+sse4.2,+popcnt -vga virtio -device virtio-rng-pci -serial mon:stdio -serial null -device intel-hda -device hda-duplex -device virtio-net-pci,netdev=net0,mac=${RANDOM_MAC} -netdev user,id=net0,hostfwd=tcp::${CONTAINER_SSH_PORT}-:22,hostfwd=tcp::${FLUTTER_DEBUG_PORT}-:${FLUTTER_DEBUG_PORT}"
+ },
+ "arm64": {
+ "kernel": "Image-qemuarm64.bin",
+ "image": "agl-demo-platform-crosssdk-qemuarm64.ext4",
+ "args": "-accel hvf -cpu host -M virt ${QEMU_EXTRA} -m 4096 -device virtio-gpu-pci -nographic -display cocoa,show-cursor=on -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0 -device qemu-xhci -device usb-tablet -device usb-mouse -device usb-kbd -device virtio-net-pci,netdev=vnet -netdev user,id=vnet,hostfwd=tcp::${CONTAINER_SSH_PORT}-:22,hostfwd=tcp::${FLUTTER_DEBUG_PORT}-:${FLUTTER_DEBUG_PORT} -kernel ${QEMU_KERNEL} -drive file=${QEMU_IMAGE},format=raw,if=virtio -append root=/dev/vda"
+ },
+ "extra": {
+ "darwin": "-smp cpus=8,sockets=1,cores=8,threads=1",
+ "ubuntu": "-bios OVMF.fd",
+ "fedora": "-bios /usr/share/edk2/ovmf/OVMF_CODE.fd"
+ }
+ },
+ "post_cmds": [
+ {
+ "cwd": "${PLATFORM_ID_DIR}",
+ "cmds": [
+ "bash -c \"rm ${QEMU_IMAGE}|true\"",
+ "unxz --keep ${QEMU_IMAGE}.xz"
+ ]
+ }
+ ]
+ },
+ "overwrite-existing": true,
+ "custom-device": {
+ "id": "agl-qemu-${RELEASE_NAME}",
+ "label": "AGL ${RELEASE_NAME}-${RELEASE_VERSION} QEMU Image",
+ "sdkNameAndVersion": "qemu-${RELEASE_NAME} ${RELEASE_VERSION}",
+ "platform": "linux-x64",
+ "enabled": true,
+ "ping": "bash -c \"${PING_CMD}\"",
+ "pingSuccessRegex": "open",
+ "postBuild": "bash -c \"${DELETE_USER_PWD}\"",
+ "install": "bash -c \"${CREATE_BUNDLE_FOLDER} && ${COPY_PLATFORM_ID_TO_DEVICE} && ${COPY_ASSETS_TO_DEVICE}\"",
+ "uninstall": "bash -c \"${DELETE_APP_FOLDER}\"",
+ "runDebug": "bash -c \"ssh -oStrictHostKeyChecking=no -t -t -o BatchMode=yes agl-driver@${DEVICE_HOSTNAME} ${FLUTTER_AUTO_EXE}\"",
+ "forwardPort": null,
+ "forwardPortSuccessRegex": null,
+ "screenshot": null
+ }
+}
diff --git a/meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.0.json b/meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.0.json
new file mode 100644
index 000000000..c03e34707
--- /dev/null
+++ b/meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.0.json
@@ -0,0 +1,112 @@
+{
+ "id": "agl-qemu-ricefish-18.0.0",
+ "load": true,
+ "supported_archs": [
+ "x86_64"
+ ],
+ "supported_host_types": [
+ "darwin",
+ "ubuntu",
+ "fedora"
+ ],
+ "flutter_runtime": "debug",
+ "type": "qemu",
+ "env": {
+ "RELEASE_NAME": "ricefish",
+ "RELEASE_VERSION": "18.0.0",
+ "FLUTTER_VERSION": "3.24.1",
+ "QEMU_IMAGE": "agl-ivi-demo-flutter-qemux86-64.wic.vmdk",
+ "FLUTTER_DEBUG_PORT": "1234",
+ "FLUTTER_OBSERVATORY_HOST": "0.0.0.0",
+ "CONTAINER_SSH_PORT": "2222",
+ "DEVICE_HOSTNAME": "localhost",
+ "SCP_PREFIX": "scp -oStrictHostKeyChecking=no -P ${CONTAINER_SSH_PORT}",
+ "SSH_PREFIX": "ssh -oStrictHostKeyChecking=no -oBatchMode=yes -p ${CONTAINER_SSH_PORT}",
+ "FLUTTER_AUTO_EXE": "LIBCAMERA_LOG_LEVELS=*:ERROR XDG_RUNTIME_DIR=/run/user/1001/ flutter-auto --j=/tmp/${appName}/default_config.json --b=/tmp/${appName}",
+ "PING_CMD": "(echo >/dev/tcp/localhost/${CONTAINER_SSH_PORT}) &>/dev/null && echo open || echo closed",
+ "DELETE_USER_PWD": "${SSH_PREFIX} -t root@${DEVICE_HOSTNAME} passwd -d agl-driver",
+ "STOP_SERVICE": "${SSH_PREFIX} -t root@${DEVICE_HOSTNAME} systemctl stop flutter-ics-homescreen",
+ "DEBUG_ARTIFACT_PATH": "/usr/share/flutter/${FLUTTER_VERSION}/debug",
+ "CREATE_ICUDTL_SYMLINK": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} ln -sf ${DEBUG_ARTIFACT_PATH}/data/icudtl.dat /tmp/${appName}/data/icudtl.dat",
+ "CREATE_ENGINE_SYMLINK": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} ln -sf ${DEBUG_ARTIFACT_PATH}/lib/libflutter_engine.so /tmp/${appName}/lib/libflutter_engine.so",
+ "CREATE_BUNDLE_FOLDER": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} mkdir -p /tmp/${appName}{/data/flutter_assets,/lib}",
+ "COPY_PLATFORM_ID_TO_DEVICE": "${SCP_PREFIX} -r ${PLATFORM_ID_DIR}/default_config.json agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/",
+ "COPY_ASSETS_TO_DEVICE": "${SCP_PREFIX} -r ${localPath}/* agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/data/flutter_assets",
+ "DELETE_APP_FOLDER": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} rm -rf /tmp/${appName}"
+ },
+ "runtime": {
+ "pre-requisites": {
+ "x86_64": {
+ "ubuntu": {
+ "cmds": [
+ "sudo apt install -y qemu-system-x86-64"
+ ]
+ },
+ "fedora": {
+ "cmds": [
+ "sudo dnf install -y qemu"
+ ]
+ }
+ }
+ },
+ "config": {
+ "view": [
+ {
+ "window_type": "BG",
+ "width": 1920,
+ "height": 1080
+ }
+ ]
+ },
+ "artifacts": {
+ "http": {
+ "url": "https://download.automotivelinux.org/AGL/release/${RELEASE_NAME}/${RELEASE_VERSION}",
+ "artifacts": {
+ "x86_64": [
+ {
+ "endpoint": "/qemux86-64/deploy/images/qemux86-64/${QEMU_IMAGE}.xz"
+ }
+ ]
+ }
+ }
+ },
+ "qemu": {
+ "cmd": "qemu-system-${FORMAL_MACHINE_ARCH}",
+ "x86_64": {
+ "image": "${QEMU_IMAGE}",
+ "args": "-m 2048 ${QEMU_EXTRA} -hda ${QEMU_IMAGE} -cpu kvm64 -cpu qemu64,+ssse3,+sse4.1,+sse4.2,+popcnt -vga virtio -device virtio-rng-pci -serial mon:stdio -serial null -device intel-hda -device hda-duplex -device virtio-net-pci,netdev=net0,mac=${RANDOM_MAC} -netdev user,id=net0,hostfwd=tcp::${CONTAINER_SSH_PORT}-:22,hostfwd=tcp::${FLUTTER_DEBUG_PORT}-:${FLUTTER_DEBUG_PORT}"
+ },
+ "extra": {
+ "darwin": "-smp cpus=8,sockets=1,cores=8,threads=1",
+ "ubuntu": "-bios OVMF.fd",
+ "fedora": "-bios /usr/share/edk2/ovmf/OVMF_CODE.fd"
+ }
+ },
+ "post_cmds": [
+ {
+ "cwd": "${PLATFORM_ID_DIR}",
+ "cmds": [
+ "bash -c \"rm ${QEMU_IMAGE}|true\"",
+ "unxz --keep ${QEMU_IMAGE}.xz"
+ ]
+ }
+ ]
+ },
+ "overwrite-existing": true,
+ "custom-device": {
+ "id": "agl-qemu-${RELEASE_NAME}",
+ "label": "AGL ${RELEASE_NAME}-${RELEASE_VERSION} QEMU Image",
+ "sdkNameAndVersion": "qemu-${RELEASE_NAME} ${RELEASE_VERSION}",
+ "platform": "linux-x64",
+ "enabled": true,
+ "ping": "bash -c \"${PING_CMD}\"",
+ "pingSuccessRegex": "open",
+ "postBuild": "bash -c \"${DELETE_USER_PWD}; ${STOP_SERVICE}\"; ",
+ "install": "bash -c \"${CREATE_BUNDLE_FOLDER} && ${COPY_PLATFORM_ID_TO_DEVICE} && ${COPY_ASSETS_TO_DEVICE} && ${CREATE_ICUDTL_SYMLINK} && ${CREATE_ENGINE_SYMLINK}\"",
+ "uninstall": "bash -c \"${DELETE_APP_FOLDER}\"",
+ "runDebug": "bash -c \"${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} ${FLUTTER_AUTO_EXE}\"",
+ "forwardPort": null,
+ "forwardPortSuccessRegex": null,
+ "screenshot": null
+ }
+}
diff --git a/meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.1.json b/meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.1.json
new file mode 100644
index 000000000..fde1e13ac
--- /dev/null
+++ b/meta-agl-flutter/tools/configs/agl-qemu-ricefish-18.0.1.json
@@ -0,0 +1,112 @@
+{
+ "id": "agl-qemu-ricefish-18.0.1",
+ "load": true,
+ "supported_archs": [
+ "x86_64"
+ ],
+ "supported_host_types": [
+ "darwin",
+ "ubuntu",
+ "fedora"
+ ],
+ "flutter_runtime": "debug",
+ "type": "qemu",
+ "env": {
+ "RELEASE_NAME": "ricefish",
+ "RELEASE_VERSION": "18.0.1",
+ "FLUTTER_VERSION": "3.24.1",
+ "QEMU_IMAGE": "agl-ivi-demo-flutter-qemux86-64.wic.vmdk",
+ "FLUTTER_DEBUG_PORT": "1234",
+ "FLUTTER_OBSERVATORY_HOST": "0.0.0.0",
+ "CONTAINER_SSH_PORT": "2222",
+ "DEVICE_HOSTNAME": "localhost",
+ "SCP_PREFIX": "scp -oStrictHostKeyChecking=no -P ${CONTAINER_SSH_PORT}",
+ "SSH_PREFIX": "ssh -oStrictHostKeyChecking=no -oBatchMode=yes -p ${CONTAINER_SSH_PORT}",
+ "FLUTTER_AUTO_EXE": "LIBCAMERA_LOG_LEVELS=*:ERROR XDG_RUNTIME_DIR=/run/user/1001/ flutter-auto --j=/tmp/${appName}/default_config.json --b=/tmp/${appName}",
+ "PING_CMD": "(echo >/dev/tcp/localhost/${CONTAINER_SSH_PORT}) &>/dev/null && echo open || echo closed",
+ "DELETE_USER_PWD": "${SSH_PREFIX} -t root@${DEVICE_HOSTNAME} passwd -d agl-driver",
+ "STOP_SERVICE": "${SSH_PREFIX} -t root@${DEVICE_HOSTNAME} systemctl stop flutter-ics-homescreen",
+ "DEBUG_ARTIFACT_PATH": "/usr/share/flutter/${FLUTTER_VERSION}/debug",
+ "CREATE_ICUDTL_SYMLINK": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} ln -sf ${DEBUG_ARTIFACT_PATH}/data/icudtl.dat /tmp/${appName}/data/icudtl.dat",
+ "CREATE_ENGINE_SYMLINK": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} ln -sf ${DEBUG_ARTIFACT_PATH}/lib/libflutter_engine.so /tmp/${appName}/lib/libflutter_engine.so",
+ "CREATE_BUNDLE_FOLDER": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} mkdir -p /tmp/${appName}{/data/flutter_assets,/lib}",
+ "COPY_PLATFORM_ID_TO_DEVICE": "${SCP_PREFIX} -r ${PLATFORM_ID_DIR}/default_config.json agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/",
+ "COPY_ASSETS_TO_DEVICE": "${SCP_PREFIX} -r ${localPath}/* agl-driver@${DEVICE_HOSTNAME}:/tmp/${appName}/data/flutter_assets",
+ "DELETE_APP_FOLDER": "${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} rm -rf /tmp/${appName}"
+ },
+ "runtime": {
+ "pre-requisites": {
+ "x86_64": {
+ "ubuntu": {
+ "cmds": [
+ "sudo apt install -y qemu-system-x86-64"
+ ]
+ },
+ "fedora": {
+ "cmds": [
+ "sudo dnf install -y qemu"
+ ]
+ }
+ }
+ },
+ "config": {
+ "view": [
+ {
+ "window_type": "BG",
+ "width": 1920,
+ "height": 1080
+ }
+ ]
+ },
+ "artifacts": {
+ "http": {
+ "url": "https://download.automotivelinux.org/AGL/release/${RELEASE_NAME}/${RELEASE_VERSION}",
+ "artifacts": {
+ "x86_64": [
+ {
+ "endpoint": "/qemux86-64/deploy/images/qemux86-64/${QEMU_IMAGE}.xz"
+ }
+ ]
+ }
+ }
+ },
+ "qemu": {
+ "cmd": "qemu-system-${FORMAL_MACHINE_ARCH}",
+ "x86_64": {
+ "image": "${QEMU_IMAGE}",
+ "args": "-m 2048 ${QEMU_EXTRA} -hda ${QEMU_IMAGE} -cpu kvm64 -cpu qemu64,+ssse3,+sse4.1,+sse4.2,+popcnt -vga virtio -device virtio-rng-pci -serial mon:stdio -serial null -device intel-hda -device hda-duplex -device virtio-net-pci,netdev=net0,mac=${RANDOM_MAC} -netdev user,id=net0,hostfwd=tcp::${CONTAINER_SSH_PORT}-:22,hostfwd=tcp::${FLUTTER_DEBUG_PORT}-:${FLUTTER_DEBUG_PORT}"
+ },
+ "extra": {
+ "darwin": "-smp cpus=8,sockets=1,cores=8,threads=1",
+ "ubuntu": "-bios OVMF.fd",
+ "fedora": "-bios /usr/share/edk2/ovmf/OVMF_CODE.fd"
+ }
+ },
+ "post_cmds": [
+ {
+ "cwd": "${PLATFORM_ID_DIR}",
+ "cmds": [
+ "bash -c \"rm ${QEMU_IMAGE}|true\"",
+ "unxz --keep ${QEMU_IMAGE}.xz"
+ ]
+ }
+ ]
+ },
+ "overwrite-existing": true,
+ "custom-device": {
+ "id": "agl-qemu-${RELEASE_NAME}",
+ "label": "AGL ${RELEASE_NAME}-${RELEASE_VERSION} QEMU Image",
+ "sdkNameAndVersion": "qemu-${RELEASE_NAME} ${RELEASE_VERSION}",
+ "platform": "linux-x64",
+ "enabled": true,
+ "ping": "bash -c \"${PING_CMD}\"",
+ "pingSuccessRegex": "open",
+ "postBuild": "bash -c \"${DELETE_USER_PWD}; ${STOP_SERVICE}\"; ",
+ "install": "bash -c \"${CREATE_BUNDLE_FOLDER} && ${COPY_PLATFORM_ID_TO_DEVICE} && ${COPY_ASSETS_TO_DEVICE} && ${CREATE_ICUDTL_SYMLINK} && ${CREATE_ENGINE_SYMLINK}\"",
+ "uninstall": "bash -c \"${DELETE_APP_FOLDER}\"",
+ "runDebug": "bash -c \"${SSH_PREFIX} agl-driver@${DEVICE_HOSTNAME} ${FLUTTER_AUTO_EXE}\"",
+ "forwardPort": null,
+ "forwardPortSuccessRegex": null,
+ "screenshot": null
+ }
+}
diff --git a/meta-agl-flutter/tools/configs/desktop-auto.json b/meta-agl-flutter/tools/configs/desktop-auto.json
new file mode 100644
index 000000000..977a20679
--- /dev/null
+++ b/meta-agl-flutter/tools/configs/desktop-auto.json
@@ -0,0 +1,93 @@
+{
+ "id": "desktop-auto",
+ "load": true,
+ "supported_archs": [
+ "x86_64"
+ ],
+ "supported_host_types": [
+ "ubuntu",
+ "fedora"
+ ],
+ "flutter_runtime": "debug",
+ "type": "host",
+ "env": {
+ "HOMESCREEN_SRC_DIR": "${FLUTTER_WORKSPACE}/app/ivi-homescreen",
+ "HOMESCREEN_BUILD_DIR": "${FLUTTER_WORKSPACE}/app/ivi-homescreen/build",
+ "HOMESCREEN_CMAKE_ARGS": "-DCMAKE_BUILD_TYPE=Debug -DEXE_OUTPUT_NAME=flutter-auto -DSANITIZE_ADDRESS=OFF -DENABLE_DLT=OFF -DBUILD_UNIT_TESTS=OFF -DBUILD_DOCS=OFF -DBUILD_CRASH_HANDLER=OFF -DLLVM_ROOT=/usr -DPLUGINS_DIR=${FLUTTER_WORKSPACE}/app/ivi-homescreen-plugins -DENABLE_IVI_SHELL_CLIENT=OFF -DENABLE_XDG_CLIENT=ON -DENABLE_AGL_SHELL_CLIENT=ON -DENABLE_LTO=ON -DDEBUG_PLATFORM_MESSAGES=OFF -DBUILD_BACKEND_WAYLAND_EGL=ON -DBUILD_BACKEND_WAYLAND_VULKAN=OFF -DBUILD_EGL_TRANSPARENCY=ON -DBUILD_EGL_ENABLE_3D=ON -DBUILD_EGL_ENABLE_MULTISAMPLE=ON -DBUILD_PLUGIN_PDF=OFF -DBUILD_PLUGIN_FILAMENT_VIEW=OFF -DBUILD_PLUGIN_NAV_RENDER_VIEW=ON -DBUILD_PLUGIN_AUDIOPLAYERS_LINUX=ON -DBUILD_PLUGIN_URL_LAUNCHER=ON -DBUILD_PLUGIN_FILE_SELECTOR=ON -DBUILD_PLUGIN_CAMERA=OFF -DBUILD_PLUGIN_GO_ROUTER=ON -DBUILD_PLUGIN_SECURE_STORAGE=ON -DBUILD_PLUGIN_DESKTOP_WINDOW_LINUX=ON -DBUILD_WATCHDOG=OFF",
+ "HOMESCREEN_EXE": "SPDLOG_LEVEL=debug ${HOMESCREEN_BUILD_DIR}/shell/flutter-auto -b ${PLATFORM_ID_DIR_RELATIVE}",
+ "PING_CMD": "loginctl show-session $(awk '/tty/ {print $1}' <(loginctl)) -p Type",
+ "CREATE_BUNDLE_FOLDER": "mkdir -p ${PLATFORM_ID_DIR_RELATIVE}/data",
+ "COPY_PLATFORM_ID_TO_BUNDLE_FOLDER": "cp -r ${PLATFORM_ID_DIR}/config.toml ${PLATFORM_ID_DIR_RELATIVE}/",
+ "COPY_BUNDLE_FOLDER_TO_PLATOFRM_ID": "cp -r ${BUNDLE_FOLDER}/* ${PLATFORM_ID_DIR_RELATIVE}/",
+ "CREATE_ASSET_SYMLINK": "ln -rsf build/flutter_assets ${PLATFORM_ID_DIR_RELATIVE}/data/flutter_assets",
+ "STAGE_BUNDLE_FOLDER": "${CREATE_BUNDLE_FOLDER} && ${COPY_PLATFORM_ID_TO_BUNDLE_FOLDER} && ${COPY_BUNDLE_FOLDER_TO_PLATOFRM_ID} && ${CREATE_ASSET_SYMLINK}"
+ },
+ "runtime": {
+ "config": {
+ "global": {"cursor_theme": "DMZ-White"},
+ "view": {"width": 1024, "height": 768}
+ },
+ "pre-requisites": {
+ "x86_64": {
+ "ubuntu": {
+ "cmds": [
+ "sudo snap install cmake --classic",
+ "pip3 install clang",
+ "sudo add-apt-repository -y ppa:kisak/kisak-mesa",
+ "sudo apt update -y",
+ "sudo apt install lsb-release wget software-properties-common gnupg apt-file",
+ "sudo apt update",
+ "sudo apt install -y libwayland-dev wayland-protocols mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev mesa-utils libxkbcommon-dev ninja-build",
+ "sudo apt install -y build-essential libvulkan-dev vulkan-tools vulkan-validationlayers vulkan-utils libtool libsecret-1-dev libsdl2-dev libjpeg-dev zenity",
+ "sudo apt install -y libllvm-ocaml-dev llvm llvm-dev llvm-runtime clang clang-tools libclang-dev libclang1 clang-format clangd clang-tidy lldb lld libc++-dev libc++abi-dev libunwind-dev libc++1 libc++abi1",
+ "sudo apt autoremove -y",
+ "sudo apt clean -y",
+ "cmake --version",
+ "apt-file search cmake"
+ ]
+ },
+ "fedora": {
+ "cmds": [
+ "sudo dnf -y update",
+ "sudo dnf -y upgrade",
+ "sudo dnf -y install wayland-devel wayland-protocols-devel libxkbcommon-devel cmake ninja-build mesa-dri-drivers mesa-filesystem mesa-libEGL-devel mesa-libGL-devel mesa-libGLU-devel mesa-libgbm-devel mesa-libglapi mesa-libxatracker mesa-vulkan-drivers vulkan-tools libunwind-devel gstreamer1-devel gstreamer1-plugins-base-devel gstreamer1-plugins-bad-free-devel gstreamer1-plugins-bad-free-extras gstreamer1-plugins-base-tools gstreamer1-plugins-good gstreamer1-plugins-good-extras gstreamer1-plugins-ugly-free",
+ "sudo dnf -y install libcxx-devel libcxx-static libcxxabi-devel libcxxabi-static ninja-build lld libtool SDL2-devel libsecret-devel zenity",
+ "sudo dnf -y autoremove",
+ "cmake --version",
+ "dnf provides cmake"
+ ]
+ }
+ }
+ },
+ "post_cmds": [
+ {
+ "env": {
+ "CC": "/usr/bin/clang",
+ "CXX": "/usr/bin/clang++"
+ },
+ "cwd": "${HOMESCREEN_BUILD_DIR}",
+ "cmds": [
+ "cmake -GNinja ${HOMESCREEN_SRC_DIR} ${HOMESCREEN_CMAKE_ARGS}",
+ "ninja flutter-auto"
+ ]
+ }
+ ]
+ },
+ "overwrite-existing": true,
+ "custom-device": {
+ "id": "desktop-auto",
+ "label": "Toyota flutter-auto",
+ "sdkNameAndVersion": "flutter-auto x86_64",
+ "platform": "linux-x64",
+ "enabled": true,
+ "ping": "bash -c \"${PING_CMD}\"",
+ "pingSuccessRegex": "Type=wayland",
+ "postBuild": "bash -c \"rm -rf ${PLATFORM_ID_DIR_RELATIVE}\"",
+ "install": "bash -c \"${STAGE_BUNDLE_FOLDER}\"",
+ "uninstall": "bash -c \"rm -rf ${PLATFORM_ID_DIR_RELATIVE}\"",
+ "runDebug": "bash -c \"${HOMESCREEN_EXE}\"",
+ "forwardPort": null,
+ "forwardPortSuccessRegex": null,
+ "screenshot": null
+ }
+}
diff --git a/meta-agl-flutter/tools/flutter_workspace.py b/meta-agl-flutter/tools/flutter_workspace.py
new file mode 120000
index 000000000..faacf59eb
--- /dev/null
+++ b/meta-agl-flutter/tools/flutter_workspace.py
@@ -0,0 +1 @@
+external/workspace-automation/flutter_workspace.py \ No newline at end of file
diff --git a/meta-agl-kuksa-val/conf/layer.conf b/meta-agl-kuksa-val/conf/layer.conf
new file mode 100644
index 000000000..ba9657954
--- /dev/null
+++ b/meta-agl-kuksa-val/conf/layer.conf
@@ -0,0 +1,13 @@
+# We have a conf and classes directory, add to BBPATH
+BBPATH .= ":${LAYERDIR}"
+
+# We have recipes-* directories, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
+ ${LAYERDIR}/recipes-*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "meta-agl-kuksa-val"
+BBFILE_PATTERN_meta-agl-kuksa-val = "^${LAYERDIR}/"
+BBFILE_PRIORITY_meta-agl-kuksa-val = "60"
+
+LAYERSERIES_COMPAT_meta-agl-kuksa-val = "scarthgap"
+LAYERDEPENDS_meta-agl-kuksa-val = "core aglcore openembedded-layer meta-python"
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0001-dbc2val-add-installation-mechanism.patch b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0001-dbc2val-add-installation-mechanism.patch
new file mode 100644
index 000000000..6a9c1ba14
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0001-dbc2val-add-installation-mechanism.patch
@@ -0,0 +1,77 @@
+From 73dd680486b72d15d6f4c7aa129219ecdbcbd7b2 Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Wed, 19 Apr 2023 15:55:01 -0400
+Subject: [PATCH 1/4] dbc2val: add installation mechanism
+
+Add setup.py and setup.cfg to allow installing the dbcfeederlib
+module and dbcfeeder.py in a way suitable for packaging.
+
+Upstream-Status: pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ setup.cfg | 30 ++++++++++++++++++++++++++++++
+ setup.py | 14 ++++++++++++++
+ 2 files changed, 44 insertions(+)
+ create mode 100644 setup.cfg
+ create mode 100644 setup.py
+
+diff --git a/setup.cfg b/setup.cfg
+new file mode 100644
+index 0000000..cb64407
+--- /dev/null
++++ b/setup.cfg
+@@ -0,0 +1,30 @@
++[metadata]
++name = dbcfeeder
++author = Sebastian Schildt, Naresh Nayak, Wenwen Chen
++author_email = sebastian.schildt@de.bosch.com, naresh.nayak@de.bosch.com, wenwen.chen@de.bosch.com
++description = KUKSA.val CAN provider
++long_description = file:README.md
++long_description_content_type = text/markdown
++url=https://github.com/eclipse-kuksa/kuksa-can-provider
++project_urls=
++ Source=https://github.com/eclipse-kuksa/kuksa-can-provider
++ Bug Tracker=https://github.com/eclipse-kuksa/kuksa-can-provider/issues
++classifiers =
++ Intended Audience :: Developers
++ Development Status :: 3 - Alpha
++ Environment :: Console
++ Programming Language :: Python :: 3
++ License :: OSI Approved :: Apache Software License
++ Operating System :: OS Independent
++ Topic :: Software Development
++
++license_file = LICENSE
++
++[options]
++python_requires = >=3.6
++install_requires=
++ pyserial
++ pyyaml
++ kuksa-client
++packages=dbcfeederlib
++scripts=dbcfeeder.py
+diff --git a/setup.py b/setup.py
+new file mode 100644
+index 0000000..c5fb2b7
+--- /dev/null
++++ b/setup.py
+@@ -0,0 +1,14 @@
++from setuptools import setup
++
++setup(
++ version_config={
++ "template": "{tag}",
++ "dev_template": "{tag}-{ccount}",
++ "dirty_template": "{tag}+{ccount}-dirty",
++ "starting_version": "0.1.0",
++ "version_callback": None,
++ "version_file": None,
++ "count_commits_from_version_file": False
++ },
++ setup_requires=['setuptools-git-versioning'],
++)
+--
+2.44.0
+
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0002-dbc2val-usability-improvements.patch b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0002-dbc2val-usability-improvements.patch
new file mode 100644
index 000000000..91a309240
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0002-dbc2val-usability-improvements.patch
@@ -0,0 +1,80 @@
+From 2e4e1f9147f1ebe5b545ae0cab41341e3abb00ae Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Sat, 15 Jun 2024 13:13:17 -0400
+Subject: [PATCH 2/4] dbc2val: usability improvements
+
+Changes:
+- Tweaked default configuration file search path to better match
+ Linux FHS. First look for a config.ini or dbc_feeder.ini in
+ /etc/kuksa-can-provider, then fall back to /etc/dbc_feeder.ini
+ before using trying other possible paths.
+- Add catching of exceptions around CAN device opening so that the
+ script can exit cleanly with an error message if the device is
+ not available.
+- Tweaked DBC default value file command line argument parsing so
+ that it does not attempt to fallback to "dbc_default_values.json"
+ in the current working directory. That likely works for upstream
+ test scenarios, but prevents running on a target.
+
+Upstream-Status: pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ dbcfeeder.py | 19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+diff --git a/dbcfeeder.py b/dbcfeeder.py
+index a1ef174..c252503 100755
+--- a/dbcfeeder.py
++++ b/dbcfeeder.py
+@@ -144,7 +144,11 @@ class Feeder:
+ whitelisted_frame_ids.append(filter.can_id) # type: ignore
+ elm2canbridge.elm2canbridge(canport, self._elmcan_config, whitelisted_frame_ids)
+
+- self._reader.start()
++ try:
++ self._reader.start()
++ except:
++ log.error("Could not open %s, exiting", canport)
++ sys.exit(-1)
+
+ receiver = threading.Thread(target=self._run_receiver)
+ receiver.start()
+@@ -165,7 +169,12 @@ class Feeder:
+ # For now creating another bus
+ # Maybe support different buses for downstream/upstream in the future
+
+- self._canclient = CANClient(interface="socketcan", channel=canport, can_fd=can_fd)
++ self._canclient = None
++ try:
++ self._canclient = CANClient(interface="socketcan", channel=canport, can_fd=can_fd)
++ except:
++ log.error("Could not open %s, exiting", canport)
++ sys.exit(-1)
+
+ transmitter = threading.Thread(target=self._run_transmitter)
+ transmitter.start()
+@@ -335,8 +344,10 @@ def _parse_config(filename: str) -> configparser.ConfigParser:
+ configfile = filename
+ else:
+ config_candidates = [
+- "/config/dbc_feeder.ini",
++ "/etc/kuksa-can-provider/config.ini",
++ "/etc/kuksa-can-provider/dbc_feeder.ini",
+ "/etc/dbc_feeder.ini",
++ "/config/dbc_feeder.ini",
+ "config/dbc_feeder.ini",
+ ]
+ for candidate in config_candidates:
+@@ -534,7 +545,7 @@ def main(argv):
+ elif os.environ.get("DBC_DEFAULT_FILE"):
+ dbc_default = os.environ.get("DBC_DEFAULT_FILE")
+ else:
+- dbc_default = config.get(CONFIG_SECTION_CAN, CONFIG_OPTION_DBC_DEFAULT_FILE, fallback="dbc_default_values.json")
++ dbc_default = config.get(CONFIG_SECTION_CAN, CONFIG_OPTION_DBC_DEFAULT_FILE, fallback=None)
+
+ if args.mapping:
+ mappingfile = args.mapping
+--
+2.44.0
+
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0003-dbc2val-fix-token-file-configuration-option.patch b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0003-dbc2val-fix-token-file-configuration-option.patch
new file mode 100644
index 000000000..faf94e0af
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0003-dbc2val-fix-token-file-configuration-option.patch
@@ -0,0 +1,32 @@
+From 0b5822c6a8f8fa489bc7ae67f91284ac150f6518 Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Sat, 15 Jun 2024 13:18:08 -0400
+Subject: [PATCH 3/4] dbc2val: fix token file configuration option
+
+The client library changed the token option name to
+'token_or_tokenfile', update things to match so that token
+location can be configured again for dbcfeeder.py.
+
+Upstream-Status: pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ dbcfeederlib/serverclientwrapper.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/dbcfeederlib/serverclientwrapper.py b/dbcfeederlib/serverclientwrapper.py
+index 498e1b6..fa43d28 100644
+--- a/dbcfeederlib/serverclientwrapper.py
++++ b/dbcfeederlib/serverclientwrapper.py
+@@ -56,7 +56,7 @@ class ServerClientWrapper(clientwrapper.ClientWrapper):
+ self._client_config["insecure"] = not self._tls
+ # Do not set token if it is empty to allow default client lib info to be used
+ if self._token_path != "":
+- self._client_config["token"] = self._token_path
++ self._client_config["token_or_tokenfile"] = self._token_path
+
+ if self._root_ca_path:
+ self._client_config['cacertificate'] = self._root_ca_path
+--
+2.44.0
+
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0004-Enable-val2dbc-for-sensor-values.patch b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0004-Enable-val2dbc-for-sensor-values.patch
new file mode 100644
index 000000000..e45fb4cf5
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/0004-Enable-val2dbc-for-sensor-values.patch
@@ -0,0 +1,174 @@
+From 937218a357ac1914fe410cf3ad31a67d54a63270 Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Mon, 17 Jun 2024 17:07:44 -0400
+Subject: [PATCH 4/4] Enable val2dbc for sensor values
+
+Rework to allow val2dbc mode to write out sensor values in
+addition to actuator target values.
+
+Upstream-Status: pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ dbcfeeder.py | 8 ++++++--
+ dbcfeederlib/databrokerclientwrapper.py | 18 ++++++++++++------
+ dbcfeederlib/dbc2vssmapper.py | 21 ++++++++++-----------
+ dbcfeederlib/serverclientwrapper.py | 2 +-
+ mapping/README.md | 2 --
+ 5 files changed, 29 insertions(+), 22 deletions(-)
+
+diff --git a/dbcfeeder.py b/dbcfeeder.py
+index c252503..c1e20c4 100755
+--- a/dbcfeeder.py
++++ b/dbcfeeder.py
+@@ -289,19 +289,23 @@ class Feeder:
+ log.debug("Processing %d VSS Data Entry updates", len(updates))
+ dbc_signal_names: Set[str] = set()
+ for update in updates:
++ value = None
+ if update.entry.value is not None:
+- # This should never happen as we do not subscribe to current value
+ log.warning(
+ "Current value for %s is now: %s of type %s",
+ update.entry.path, update.entry.value.value, type(update.entry.value.value)
+ )
++ value = update.entry.value.value
+
+ if update.entry.actuator_target is not None:
+ log.debug(
+ "Target value for %s is now: %s of type %s",
+ update.entry.path, update.entry.actuator_target, type(update.entry.actuator_target.value)
+ )
+- affected_signals = self._mapper.handle_update(update.entry.path, update.entry.actuator_target.value)
++ value = update.entry.actuator_target.value
++
++ if value != None:
++ affected_signals = self._mapper.handle_update(update.entry.path, value)
+ dbc_signal_names.update(affected_signals)
+
+ messages_to_send: Set[Message] = set()
+diff --git a/dbcfeederlib/databrokerclientwrapper.py b/dbcfeederlib/databrokerclientwrapper.py
+index 716ee6d..db2b80a 100644
+--- a/dbcfeederlib/databrokerclientwrapper.py
++++ b/dbcfeederlib/databrokerclientwrapper.py
+@@ -199,14 +199,20 @@ class DatabrokerClientWrapper(clientwrapper.ClientWrapper):
+ def supports_subscription(self) -> bool:
+ return True
+
+- async def subscribe(self, vss_names: List[str], callback):
++ async def subscribe(self, vss_entries: dict[str, str], callback):
+ """Create a subscription and invoke the callback when data received."""
+ entries: List[SubscribeEntry] = []
+- for name in vss_names:
+- # Always subscribe to target
+- subscribe_entry = SubscribeEntry(name, View.FIELDS, [Field.ACTUATOR_TARGET])
+- log.info("Subscribe entry: %s", subscribe_entry)
+- entries.append(subscribe_entry)
++ for name, signal_type in vss_entries.items():
++ if signal_type == "actuator":
++ subscribe_entry = SubscribeEntry(name, View.FIELDS, [Field.ACTUATOR_TARGET])
++ log.info("Subscribe entry: %s", subscribe_entry)
++ entries.append(subscribe_entry)
++ if signal_type == "sensor":
++ subscribe_entry = SubscribeEntry(name, View.FIELDS, [Field.VALUE])
++ log.info("Subscribe entry: %s", subscribe_entry)
++ entries.append(subscribe_entry)
++ if not entries:
++ return
+
+ # If there is a path VSSClient will request a secure connection
+ if self._tls and self._root_ca_path:
+diff --git a/dbcfeederlib/dbc2vssmapper.py b/dbcfeederlib/dbc2vssmapper.py
+index 218f693..2be5e98 100644
+--- a/dbcfeederlib/dbc2vssmapper.py
++++ b/dbcfeederlib/dbc2vssmapper.py
+@@ -69,12 +69,13 @@ class VSSMapping:
+ parser: Parser = Parser()
+
+ def __init__(self, vss_name: str, dbc_name: str, transform: dict, interval_ms: int,
+- on_change: bool, datatype: str, description: str):
++ on_change: bool, signal_type: str, datatype: str, description: str):
+ self.vss_name = vss_name
+ self.dbc_name = dbc_name
+ self.transform = transform
+ self.interval_ms = interval_ms
+ self.on_change = on_change
++ self.signal_type = signal_type
+ self.datatype = datatype
+ self.description = description
+ # For time comparison (interval_ms) we store last value used for comparison. Unit seconds.
+@@ -347,7 +348,7 @@ class Mapper(DBCParser):
+ if can_signal_name not in self._dbc2vss_mapping:
+ self._dbc2vss_mapping[can_signal_name] = []
+ mapping_entry = VSSMapping(expanded_name, can_signal_name, transformation_definition, interval, on_change,
+- node["datatype"], node["description"])
++ node["type"], node["datatype"], node["description"])
+ self._dbc2vss_mapping[can_signal_name].append(mapping_entry)
+
+ for msg_def in self.get_messages_for_signal(can_signal_name):
+@@ -398,7 +399,7 @@ class Mapper(DBCParser):
+ log.warning("Ignoring \"interval_ms\" property of mapping definition for %s", expanded_name)
+
+ mapping_entry = VSSMapping(expanded_name, can_signal_name, transform, interval, on_change,
+- node["datatype"], node["description"])
++ node["type"], node["datatype"], node["description"])
+ if can_signal_name not in self._vss2dbc_mapping:
+ self._vss2dbc_mapping[expanded_name] = []
+ self._vss2dbc_mapping[expanded_name].append(mapping_entry)
+@@ -426,12 +427,7 @@ class Mapper(DBCParser):
+ if dbc2vss_def is not None:
+ self._analyze_dbc2vss(expanded_name, node, dbc2vss_def)
+ if "vss2dbc" in node:
+- if node["type"] == "actuator":
+- self._analyze_vss2dbc(expanded_name, node, node["vss2dbc"])
+- else:
+- # vss2dbc is handled by subscription to target value, so only makes sense for actuators
+- log.error("vss2dbc only allowed for actuators, VSS signal %s is not an actuator!", expanded_name)
+- sys.exit(-1)
++ self._analyze_vss2dbc(expanded_name, node, node["vss2dbc"])
+
+ def _traverse_vss_node(self, name, node, prefix=""):
+ """
+@@ -474,9 +470,12 @@ class Mapper(DBCParser):
+ """Get all CAN signal names for which a mapping to a VSS Data Entry exists."""
+ return self._dbc2vss_mapping.keys()
+
+- def get_vss2dbc_entries(self) -> KeysView[str]:
++ def get_vss2dbc_entries(self) -> Dict[str, str]:
+ """Get all VSS Data Entry paths for which a mapping to a CAN signal name exists."""
+- return self._vss2dbc_mapping.keys()
++ entries: Dict[str, str] = {}
++ for name, mappings in self._vss2dbc_mapping.items():
++ entries[name] = mappings[0].signal_type
++ return entries
+
+ def get_vss_names(self) -> Set[str]:
+ """Get all VSS names used in mappings, both vss2dbc and dbc2vss"""
+diff --git a/dbcfeederlib/serverclientwrapper.py b/dbcfeederlib/serverclientwrapper.py
+index fa43d28..86b2ceb 100644
+--- a/dbcfeederlib/serverclientwrapper.py
++++ b/dbcfeederlib/serverclientwrapper.py
+@@ -122,6 +122,6 @@ class ServerClientWrapper(clientwrapper.ClientWrapper):
+ log.info("Feature not implemented")
+ return False
+
+- async def subscribe(self, vss_names: List[str], callback):
++ async def subscribe(self, vss_entries: dict[str, str], callback):
+ log.error("Feature not implemented")
+ return
+diff --git a/mapping/README.md b/mapping/README.md
+index 2155f28..ea6de07 100644
+--- a/mapping/README.md
++++ b/mapping/README.md
+@@ -44,8 +44,6 @@ This is built on the assumption that the DBC provider always send target values
+ Having separate configurations (`dbc2vss` and `vss2dbc`) is needed as wanted value and actual value never are sent
+ by the same DBC signal, they are not even part of the same CAN-frame.
+
+-*This means that `vss2dbc` only can be used for actuators, as only actuators have target values!*
+-
+ ## Example mapping files
+
+ Example mapping files for various VSS versions can be found in this folder.
+--
+2.44.0
+
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.default b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.default
new file mode 100644
index 000000000..aad0bc419
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.default
@@ -0,0 +1,3 @@
+# For output only mode:
+#EXTRA_ARGS="--val2dbc --no-dbc2val --dbc-default /etc/kuksa-can-provider/dbc_default_values.json"
+#LOG_LEVEL=debug
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.service b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.service
new file mode 100644
index 000000000..e43dd47fd
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider/kuksa-can-provider.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Eclipse KUKSA.val DBC feeder
+Requires=kuksa-databroker.service
+After=kuksa-databroker.service
+
+[Service]
+EnvironmentFile=-/etc/default/kuksa-can-provider
+ExecStart=/usr/bin/dbcfeeder.py $EXTRA_ARGS
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider_git.bb b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider_git.bb
new file mode 100644
index 000000000..53b976f61
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-can-provider_git.bb
@@ -0,0 +1,84 @@
+SUMMARY = "CAN provider for KUKSA.val, the KUKSA Vehicle Abstraction Layer"
+HOMEPAGE = "https://github.com/eclipse-kuksa"
+BUGTRACKER = "https://github.com/eclips-kuksa/kuksa-can-provider/issues"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=175792518e4ac015ab6696d16c4f607e"
+
+DEPENDS = "python3-setuptools-git-versioning-native"
+
+PV = "0.4.3+git${SRCPV}"
+
+SRC_URI = "git://github.com/eclipse-kuksa/kuksa-can-provider.git;protocol=https;branch=main \
+ file://0001-dbc2val-add-installation-mechanism.patch \
+ file://0002-dbc2val-usability-improvements.patch \
+ file://0003-dbc2val-fix-token-file-configuration-option.patch \
+ file://0004-Enable-val2dbc-for-sensor-values.patch \
+ file://kuksa-can-provider.service \
+ file://kuksa-can-provider.default \
+ "
+SRCREV = "d5fdcfa7574ce69059b6f449629571db0982c1cf"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3 systemd update-alternatives
+
+SYSTEMD_SERVICE:${PN} = "${BPN}.service"
+
+do_install:append() {
+ install -d ${D}${sysconfdir}/default
+ install -m 0644 ${WORKDIR}/kuksa-can-provider.default ${D}${sysconfdir}/default/
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/kuksa-can-provider.service ${D}${systemd_system_unitdir}
+ fi
+
+ # Install tweaked copy of the example configuration, the .ini file
+ # and the upstream demo/test files it references are packaged
+ # separately from the library and daemon to make it easy to replace
+ # them.
+ install -d ${D}${sysconfdir}/kuksa-can-provider
+ sed -e 's|^mapping =.*|mapping = /usr/share/vss/vss.json|' \
+ -e 's|^dbcfile =.*|dbcfile = /usr/share/dbc/Model3CAN.dbc|' \
+ -e 's|^candumpfile =.*|dbcfile = /usr/share/can/candump.log|' \
+ -e 's|^dbc_default_file =.*|dbc_default_file = /etc/kuksa-can-provider/dbc_default_values.json|' \
+ ${S}/config/dbc_feeder.ini > ${D}${sysconfdir}/kuksa-can-provider/config.ini
+ install -m 0644 ${S}/dbc_default_values.json ${D}${sysconfdir}/kuksa-can-provider/
+ install -d ${D}${datadir}/dbc
+ install -m 0644 ${S}/Model3CAN.dbc ${D}${datadir}/dbc/
+ install -d ${D}${datadir}/can
+ install -m 0644 ${S}/candump.log ${D}${datadir}/can/
+}
+
+ALTERNATIVE_LINK_NAME[kuksa-can-provider.env] = "${sysconfdir}/default/kuksa-can-provider"
+
+FILES:${PN} += "${systemd_system_unitdir}"
+
+# NOTE:
+# Since the environment file is used by the systemd unit, it is packaged
+# with the it in the main package, and the alternative scheme is set up
+# against that. Replacement configuration packages can still configure
+# the alternative as required.
+ALTERNATIVE_TARGET_${PN} = "${sysconfdir}/default/kuksa-can-provider.default"
+
+PACKAGE_BEFORE_PN += "${PN}-conf-example"
+
+FILES:${PN}-conf-example += " \
+ ${sysconfdir}/kuksa-can-provider/config.ini \
+ ${sysconfdir}/kuksa-can-provider/dbc_default_values.json \
+ ${datadir}/dbc/Model3CAN.dbc \
+ ${datadir}/can/candump.log \
+"
+RPROVIDES:${PN}-conf-example = "kuksa-can-provider-conf"
+
+RDEPENDS:${PN} += " \
+ bash \
+ python3-pyserial \
+ python3-cantools \
+ python3-can \
+ python3-can-j1939 \
+ python3-pyyaml \
+ python3-py-expression-eval \
+ kuksa-client \
+ kuksa-can-provider-conf \
+"
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0001-kuksa-client-Update-cmd2-completer-usage.patch b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0001-kuksa-client-Update-cmd2-completer-usage.patch
new file mode 100644
index 000000000..3f5527384
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0001-kuksa-client-Update-cmd2-completer-usage.patch
@@ -0,0 +1,161 @@
+From acb2bbff3de6e9f0bafb8b96a339820a9ddfadca Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Mon, 27 Nov 2023 15:31:02 -0500
+Subject: [PATCH 1/2] kuksa-client: Update cmd2 completer usage
+
+Update cmd2 usage to avoid using internal methods and fix breakage
+with newer versions of the cmd2 module.
+
+Upstream-Status: pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ kuksa-client/kuksa_client/__main__.py | 33 +++++++++++++--------------
+ 1 file changed, 16 insertions(+), 17 deletions(-)
+
+diff --git a/kuksa-client/kuksa_client/__main__.py b/kuksa-client/kuksa_client/__main__.py
+index 2b29623..7061ec1 100755
+--- a/kuksa-client/kuksa_client/__main__.py
++++ b/kuksa-client/kuksa_client/__main__.py
+@@ -36,7 +36,6 @@ from cmd2 import CompletionItem
+ from cmd2 import with_argparser
+ from cmd2 import with_category
+ from cmd2 import constants
+-from cmd2.utils import basic_complete
+ from urllib.parse import urlparse
+
+ from kuksa_client import KuksaClientThread
+@@ -151,7 +150,7 @@ class TestClient(Cmd):
+ self.pathCompletionItems = []
+ for sub_id in self.subscribeIds:
+ self.pathCompletionItems.append(CompletionItem(sub_id))
+- return basic_complete(text, line, begidx, endidx, self.pathCompletionItems)
++ return Cmd.basic_complete(self, text, line, begidx, endidx, self.pathCompletionItems)
+
+ COMM_SETUP_COMMANDS = "Communication Set-up Commands"
+ VSS_COMMANDS = "Kuksa Interaction Commands (Supported by both KUKSA Databroker and KUKSA Server)"
+@@ -167,19 +166,19 @@ class TestClient(Cmd):
+
+ ap_disconnect = argparse.ArgumentParser()
+ ap_authorize = argparse.ArgumentParser()
+- tokenfile_completer_method = functools.partial(
++ tokenfile_completer = functools.partial(
+ Cmd.path_complete,
+ path_filter=lambda path: (os.path.isdir(path) or path.endswith(".token")),
+ )
+ ap_authorize.add_argument(
+ "token_or_tokenfile",
+ help="JWT(or the file storing the token) for authorizing the client.",
+- completer_method=tokenfile_completer_method,
++ completer=tokenfile_completer,
+ )
+
+ ap_setValue = argparse.ArgumentParser()
+ ap_setValue.add_argument(
+- "Path", help="Path to be set", completer_method=path_completer
++ "Path", help="Path to be set", completer=path_completer
+ )
+ ap_setValue.add_argument("Value", nargs="+", help="Value to be set")
+ ap_setValue.add_argument(
+@@ -199,7 +198,7 @@ class TestClient(Cmd):
+
+ ap_getValue = argparse.ArgumentParser()
+ ap_getValue.add_argument(
+- "Path", help="Path to be read", completer_method=path_completer
++ "Path", help="Path to be read", completer=path_completer
+ )
+ ap_getValue.add_argument(
+ "-a", "--attribute", help="Attribute to be get", default="value"
+@@ -210,7 +209,7 @@ class TestClient(Cmd):
+ "Path",
+ help="Path whose value is to be read",
+ nargs="+",
+- completer_method=path_completer,
++ completer=path_completer,
+ )
+ ap_getValues.add_argument(
+ "-a", "--attribute", help="Attribute to be get", default="value"
+@@ -220,7 +219,7 @@ class TestClient(Cmd):
+ ap_setTargetValue.add_argument(
+ "Path",
+ help="Path whose target value to be set",
+- completer_method=path_completer,
++ completer=path_completer,
+ )
+ ap_setTargetValue.add_argument("Value", help="Value to be set")
+
+@@ -236,7 +235,7 @@ class TestClient(Cmd):
+ ap_getTargetValue.add_argument(
+ "Path",
+ help="Path whose target value is to be read",
+- completer_method=path_completer,
++ completer=path_completer,
+ )
+
+ ap_getTargetValues = argparse.ArgumentParser()
+@@ -244,12 +243,12 @@ class TestClient(Cmd):
+ "Path",
+ help="Path whose target value is to be read",
+ nargs="+",
+- completer_method=path_completer,
++ completer=path_completer,
+ )
+
+ ap_subscribe = argparse.ArgumentParser()
+ ap_subscribe.add_argument(
+- "Path", help="Path to subscribe to", completer_method=path_completer
++ "Path", help="Path to subscribe to", completer=path_completer
+ )
+ ap_subscribe.add_argument(
+ "-a", "--attribute", help="Attribute to subscribe to", default="value"
+@@ -264,7 +263,7 @@ class TestClient(Cmd):
+
+ ap_subscribeMultiple = argparse.ArgumentParser()
+ ap_subscribeMultiple.add_argument(
+- "Path", help="Path to subscribe to", nargs="+", completer_method=path_completer
++ "Path", help="Path to subscribe to", nargs="+", completer=path_completer
+ )
+ ap_subscribeMultiple.add_argument(
+ "-a", "--attribute", help="Attribute to subscribe to", default="value"
+@@ -280,18 +279,18 @@ class TestClient(Cmd):
+ ap_unsubscribe.add_argument(
+ "SubscribeId",
+ help="Corresponding subscription Id",
+- completer_method=subscriptionIdCompleter,
++ completer=subscriptionIdCompleter,
+ )
+
+ ap_getMetaData = argparse.ArgumentParser()
+ ap_getMetaData.add_argument(
+ "Path",
+ help="Path whose metadata is to be read",
+- completer_method=path_completer,
++ completer=path_completer,
+ )
+ ap_updateMetaData = argparse.ArgumentParser()
+ ap_updateMetaData.add_argument(
+- "Path", help="Path whose MetaData is to update", completer_method=path_completer
++ "Path", help="Path whose MetaData is to update", completer=path_completer
+ )
+ ap_updateMetaData.add_argument(
+ "Json",
+@@ -300,14 +299,14 @@ class TestClient(Cmd):
+ )
+
+ ap_updateVSSTree = argparse.ArgumentParser()
+- jsonfile_completer_method = functools.partial(
++ jsonfile_completer = functools.partial(
+ Cmd.path_complete,
+ path_filter=lambda path: (os.path.isdir(path) or path.endswith(".json")),
+ )
+ ap_updateVSSTree.add_argument(
+ "Json",
+ help="Json tree to update VSS",
+- completer_method=jsonfile_completer_method,
++ completer=jsonfile_completer,
+ )
+
+ # Constructor, request names after protocol to avoid errors
+--
+2.44.0
+
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0002-Tweak-grpcio-tools-requirement.patch b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0002-Tweak-grpcio-tools-requirement.patch
new file mode 100644
index 000000000..fef2265b2
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client/0002-Tweak-grpcio-tools-requirement.patch
@@ -0,0 +1,30 @@
+From 43823a52a9cb25d906542d15dc207f6516579aa3 Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Tue, 18 Jun 2024 16:08:13 -0400
+Subject: [PATCH 2/2] Tweak grpcio-tools requirement
+
+Lower grpcio-tools requirement to 1.62.0 so building on YP scarthgap
+is possible.
+
+Upstream-Status: Pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ kuksa-client/pyproject.toml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kuksa-client/pyproject.toml b/kuksa-client/pyproject.toml
+index a7afaca..a8d70ff 100644
+--- a/kuksa-client/pyproject.toml
++++ b/kuksa-client/pyproject.toml
+@@ -1,6 +1,6 @@
+ [build-system]
+ requires = [
+- "grpcio-tools>=1.63.0",
++ "grpcio-tools>=1.62.0",
+ "setuptools>=42",
+ "setuptools-git-versioning",
+ "wheel",
+--
+2.44.0
+
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client_git.bb b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client_git.bb
new file mode 100644
index 000000000..e12816adf
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-client_git.bb
@@ -0,0 +1,41 @@
+SUMMARY = "Python client for KUKSA.val, the KUKSA Vehicle Abstraction Layer"
+HOMEPAGE = "https://github.com/eclipse/kuksa.val"
+BUGTRACKER = "https://github.com/eclipse/kuksa.val/issues"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://../LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+DEPENDS = " \
+ python3-setuptools-git-versioning-native \
+ python3-grpcio-tools-native \
+ python3-grpcio \
+"
+
+PV = "0.4.3"
+
+SRC_URI = "gitsm://github.com/eclipse-kuksa/kuksa-python-sdk.git;protocol=https;branch=main \
+ file://0001-kuksa-client-Update-cmd2-completer-usage.patch;patchdir=.. \
+ file://0002-Tweak-grpcio-tools-requirement.patch;patchdir=.. \
+"
+SRCREV = "d72777a6aec6bd9f9a2bdf5ae5d01a9bc2de423a"
+
+S = "${WORKDIR}/git/kuksa-client"
+
+inherit python_setuptools_build_meta
+
+RDEPENDS:${PN} += " \
+ python3-cmd2 \
+ python3-importlib-metadata \
+ python3-pkg-resources \
+ python3-pygments \
+ python3-websockets \
+ python3-grpcio \
+ python3-grpcio-tools \
+ python3-jsonpath-ng \
+"
+
+# A script for generating new certificates currently gets shipped inside
+# the client module, for now add bash to RDEPENDS to quiet the QA error.
+# This should probably be addressed with finer-grained packaging or some
+# other change worked out with upstream.
+RDEPENDS:${PN} += "bash"
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker-crates.inc b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker-crates.inc
new file mode 100644
index 000000000..02adc1135
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker-crates.inc
@@ -0,0 +1,988 @@
+# Autogenerated with 'bitbake -c update_crates kuksa-databroker'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/addr2line/0.22.0 \
+ crate://crates.io/adler/1.0.2 \
+ crate://crates.io/aho-corasick/1.1.3 \
+ crate://crates.io/android-tzdata/0.1.1 \
+ crate://crates.io/android_system_properties/0.1.5 \
+ crate://crates.io/ansi_term/0.12.1 \
+ crate://crates.io/anstream/0.6.14 \
+ crate://crates.io/anstyle/1.0.7 \
+ crate://crates.io/anstyle-parse/0.2.4 \
+ crate://crates.io/anstyle-query/1.1.0 \
+ crate://crates.io/anstyle-wincon/3.0.3 \
+ crate://crates.io/anyhow/1.0.86 \
+ crate://crates.io/arc-swap/1.7.1 \
+ crate://crates.io/arrayref/0.3.7 \
+ crate://crates.io/arrayvec/0.5.2 \
+ crate://crates.io/async-stream/0.3.5 \
+ crate://crates.io/async-stream-impl/0.3.5 \
+ crate://crates.io/async-trait/0.1.80 \
+ crate://crates.io/autocfg/1.3.0 \
+ crate://crates.io/axum/0.6.20 \
+ crate://crates.io/axum-core/0.3.4 \
+ crate://crates.io/backtrace/0.3.72 \
+ crate://crates.io/base64/0.13.1 \
+ crate://crates.io/base64/0.21.7 \
+ crate://crates.io/base64/0.22.1 \
+ crate://crates.io/bitflags/1.3.2 \
+ crate://crates.io/bitflags/2.5.0 \
+ crate://crates.io/blake2b_simd/0.5.11 \
+ crate://crates.io/block-buffer/0.10.4 \
+ crate://crates.io/bstr/1.9.1 \
+ crate://crates.io/btoi/0.4.3 \
+ crate://crates.io/bumpalo/3.16.0 \
+ crate://crates.io/bytecount/0.6.8 \
+ crate://crates.io/byteorder/1.5.0 \
+ crate://crates.io/bytes/1.6.0 \
+ crate://crates.io/camino/1.1.7 \
+ crate://crates.io/cargo-platform/0.1.8 \
+ crate://crates.io/cargo_metadata/0.18.1 \
+ crate://crates.io/cc/1.0.98 \
+ crate://crates.io/cfg-if/1.0.0 \
+ crate://crates.io/chrono/0.4.38 \
+ crate://crates.io/clap/4.5.4 \
+ crate://crates.io/clap_builder/4.5.2 \
+ crate://crates.io/clap_derive/4.5.4 \
+ crate://crates.io/clap_lex/0.7.0 \
+ crate://crates.io/clru/0.6.2 \
+ crate://crates.io/colorchoice/1.0.1 \
+ crate://crates.io/console/0.15.8 \
+ crate://crates.io/constant_time_eq/0.1.5 \
+ crate://crates.io/core-foundation-sys/0.8.6 \
+ crate://crates.io/cpufeatures/0.2.12 \
+ crate://crates.io/crc32fast/1.4.2 \
+ crate://crates.io/crossbeam-deque/0.8.5 \
+ crate://crates.io/crossbeam-epoch/0.9.18 \
+ crate://crates.io/crossbeam-utils/0.8.20 \
+ crate://crates.io/crypto-common/0.1.6 \
+ crate://crates.io/cucumber/0.20.2 \
+ crate://crates.io/cucumber-codegen/0.20.2 \
+ crate://crates.io/cucumber-expressions/0.3.0 \
+ crate://crates.io/data-encoding/2.6.0 \
+ crate://crates.io/deranged/0.3.11 \
+ crate://crates.io/derive_more/0.99.17 \
+ crate://crates.io/digest/0.10.7 \
+ crate://crates.io/dirs/1.0.5 \
+ crate://crates.io/dirs/4.0.0 \
+ crate://crates.io/dirs-sys/0.3.7 \
+ crate://crates.io/drain_filter_polyfill/0.1.3 \
+ crate://crates.io/dunce/1.0.4 \
+ crate://crates.io/either/1.12.0 \
+ crate://crates.io/encode_unicode/0.3.6 \
+ crate://crates.io/equivalent/1.0.1 \
+ crate://crates.io/errno/0.3.9 \
+ crate://crates.io/faster-hex/0.9.0 \
+ crate://crates.io/fastrand/2.1.0 \
+ crate://crates.io/filetime/0.2.23 \
+ crate://crates.io/fixedbitset/0.4.2 \
+ crate://crates.io/flate2/1.0.30 \
+ crate://crates.io/fnv/1.0.7 \
+ crate://crates.io/form_urlencoded/1.2.1 \
+ crate://crates.io/futures/0.3.30 \
+ crate://crates.io/futures-channel/0.3.30 \
+ crate://crates.io/futures-core/0.3.30 \
+ crate://crates.io/futures-executor/0.3.30 \
+ crate://crates.io/futures-io/0.3.30 \
+ crate://crates.io/futures-macro/0.3.30 \
+ crate://crates.io/futures-sink/0.3.30 \
+ crate://crates.io/futures-task/0.3.30 \
+ crate://crates.io/futures-util/0.3.30 \
+ crate://crates.io/generic-array/0.14.7 \
+ crate://crates.io/getrandom/0.1.16 \
+ crate://crates.io/getrandom/0.2.15 \
+ crate://crates.io/gherkin/0.14.0 \
+ crate://crates.io/gimli/0.29.0 \
+ crate://crates.io/gix/0.57.1 \
+ crate://crates.io/gix-actor/0.29.1 \
+ crate://crates.io/gix-bitmap/0.2.11 \
+ crate://crates.io/gix-chunk/0.4.8 \
+ crate://crates.io/gix-commitgraph/0.23.2 \
+ crate://crates.io/gix-config/0.33.1 \
+ crate://crates.io/gix-config-value/0.14.6 \
+ crate://crates.io/gix-date/0.8.6 \
+ crate://crates.io/gix-diff/0.39.1 \
+ crate://crates.io/gix-discover/0.28.1 \
+ crate://crates.io/gix-features/0.37.2 \
+ crate://crates.io/gix-fs/0.9.1 \
+ crate://crates.io/gix-glob/0.15.1 \
+ crate://crates.io/gix-hash/0.14.2 \
+ crate://crates.io/gix-hashtable/0.5.2 \
+ crate://crates.io/gix-index/0.28.2 \
+ crate://crates.io/gix-lock/12.0.1 \
+ crate://crates.io/gix-macros/0.1.5 \
+ crate://crates.io/gix-object/0.40.1 \
+ crate://crates.io/gix-odb/0.56.1 \
+ crate://crates.io/gix-pack/0.46.1 \
+ crate://crates.io/gix-path/0.10.7 \
+ crate://crates.io/gix-quote/0.4.12 \
+ crate://crates.io/gix-ref/0.40.1 \
+ crate://crates.io/gix-refspec/0.21.1 \
+ crate://crates.io/gix-revision/0.25.1 \
+ crate://crates.io/gix-revwalk/0.11.1 \
+ crate://crates.io/gix-sec/0.10.6 \
+ crate://crates.io/gix-tempfile/12.0.1 \
+ crate://crates.io/gix-trace/0.1.9 \
+ crate://crates.io/gix-traverse/0.36.2 \
+ crate://crates.io/gix-url/0.26.1 \
+ crate://crates.io/gix-utils/0.1.12 \
+ crate://crates.io/gix-validate/0.8.5 \
+ crate://crates.io/glob-match/0.2.1 \
+ crate://crates.io/globset/0.4.14 \
+ crate://crates.io/globwalk/0.8.1 \
+ crate://crates.io/h2/0.3.26 \
+ crate://crates.io/hashbrown/0.12.3 \
+ crate://crates.io/hashbrown/0.14.5 \
+ crate://crates.io/heck/0.4.1 \
+ crate://crates.io/heck/0.5.0 \
+ crate://crates.io/hermit-abi/0.3.9 \
+ crate://crates.io/home/0.5.9 \
+ crate://crates.io/http/0.2.12 \
+ crate://crates.io/http-body/0.4.6 \
+ crate://crates.io/httparse/1.8.0 \
+ crate://crates.io/httpdate/1.0.3 \
+ crate://crates.io/humantime/2.1.0 \
+ crate://crates.io/hyper/0.14.29 \
+ crate://crates.io/hyper-timeout/0.4.1 \
+ crate://crates.io/iana-time-zone/0.1.60 \
+ crate://crates.io/iana-time-zone-haiku/0.1.2 \
+ crate://crates.io/idna/0.5.0 \
+ crate://crates.io/ignore/0.4.22 \
+ crate://crates.io/indexmap/1.9.3 \
+ crate://crates.io/indexmap/2.2.6 \
+ crate://crates.io/inflections/1.1.1 \
+ crate://crates.io/inventory/0.3.15 \
+ crate://crates.io/is_terminal_polyfill/1.70.0 \
+ crate://crates.io/itertools/0.12.1 \
+ crate://crates.io/itoa/1.0.11 \
+ crate://crates.io/jemalloc-sys/0.5.4+5.3.0-patched \
+ crate://crates.io/jemallocator/0.5.4 \
+ crate://crates.io/js-sys/0.3.69 \
+ crate://crates.io/jsonwebtoken/9.3.0 \
+ crate://crates.io/lazy-regex/3.1.0 \
+ crate://crates.io/lazy-regex-proc_macros/3.1.0 \
+ crate://crates.io/lazy_static/1.4.0 \
+ crate://crates.io/libc/0.2.155 \
+ crate://crates.io/libredox/0.1.3 \
+ crate://crates.io/linefeed/0.6.0 \
+ crate://crates.io/linked-hash-map/0.5.6 \
+ crate://crates.io/linux-raw-sys/0.4.14 \
+ crate://crates.io/lock_api/0.4.12 \
+ crate://crates.io/log/0.4.21 \
+ crate://crates.io/matchers/0.1.0 \
+ crate://crates.io/matchit/0.7.3 \
+ crate://crates.io/memchr/2.7.2 \
+ crate://crates.io/memmap2/0.9.4 \
+ crate://crates.io/mime/0.3.17 \
+ crate://crates.io/minimal-lexical/0.2.1 \
+ crate://crates.io/miniz_oxide/0.7.3 \
+ crate://crates.io/mio/0.8.11 \
+ crate://crates.io/mortal/0.2.4 \
+ crate://crates.io/multimap/0.10.0 \
+ crate://crates.io/nix/0.26.4 \
+ crate://crates.io/nom/7.1.3 \
+ crate://crates.io/nom_locate/4.2.0 \
+ crate://crates.io/nu-ansi-term/0.46.0 \
+ crate://crates.io/num-bigint/0.4.5 \
+ crate://crates.io/num-conv/0.1.0 \
+ crate://crates.io/num-integer/0.1.46 \
+ crate://crates.io/num-traits/0.2.19 \
+ crate://crates.io/num_cpus/1.16.0 \
+ crate://crates.io/num_threads/0.1.7 \
+ crate://crates.io/object/0.35.0 \
+ crate://crates.io/once_cell/1.19.0 \
+ crate://crates.io/overload/0.1.1 \
+ crate://crates.io/parking_lot/0.12.3 \
+ crate://crates.io/parking_lot_core/0.9.10 \
+ crate://crates.io/peg/0.6.3 \
+ crate://crates.io/peg-macros/0.6.3 \
+ crate://crates.io/peg-runtime/0.6.3 \
+ crate://crates.io/pem/3.0.4 \
+ crate://crates.io/percent-encoding/2.3.1 \
+ crate://crates.io/petgraph/0.6.5 \
+ crate://crates.io/phf/0.11.2 \
+ crate://crates.io/phf_codegen/0.11.2 \
+ crate://crates.io/phf_generator/0.11.2 \
+ crate://crates.io/phf_shared/0.11.2 \
+ crate://crates.io/pin-project/1.1.5 \
+ crate://crates.io/pin-project-internal/1.1.5 \
+ crate://crates.io/pin-project-lite/0.2.14 \
+ crate://crates.io/pin-utils/0.1.0 \
+ crate://crates.io/powerfmt/0.2.0 \
+ crate://crates.io/ppv-lite86/0.2.17 \
+ crate://crates.io/prettyplease/0.2.20 \
+ crate://crates.io/proc-macro2/1.0.85 \
+ crate://crates.io/prodash/28.0.0 \
+ crate://crates.io/prost/0.12.6 \
+ crate://crates.io/prost-build/0.12.6 \
+ crate://crates.io/prost-derive/0.12.6 \
+ crate://crates.io/prost-types/0.12.6 \
+ crate://crates.io/quote/1.0.36 \
+ crate://crates.io/rand/0.8.5 \
+ crate://crates.io/rand_chacha/0.3.1 \
+ crate://crates.io/rand_core/0.6.4 \
+ crate://crates.io/redox_syscall/0.1.57 \
+ crate://crates.io/redox_syscall/0.4.1 \
+ crate://crates.io/redox_syscall/0.5.1 \
+ crate://crates.io/redox_users/0.3.5 \
+ crate://crates.io/redox_users/0.4.5 \
+ crate://crates.io/regex/1.10.4 \
+ crate://crates.io/regex-automata/0.1.10 \
+ crate://crates.io/regex-automata/0.4.6 \
+ crate://crates.io/regex-syntax/0.6.29 \
+ crate://crates.io/regex-syntax/0.7.5 \
+ crate://crates.io/regex-syntax/0.8.3 \
+ crate://crates.io/ring/0.17.8 \
+ crate://crates.io/rust-argon2/0.8.3 \
+ crate://crates.io/rustc-demangle/0.1.24 \
+ crate://crates.io/rustix/0.38.34 \
+ crate://crates.io/rustls/0.22.4 \
+ crate://crates.io/rustls-pemfile/2.1.2 \
+ crate://crates.io/rustls-pki-types/1.7.0 \
+ crate://crates.io/rustls-webpki/0.102.4 \
+ crate://crates.io/rustversion/1.0.17 \
+ crate://crates.io/ryu/1.0.18 \
+ crate://crates.io/same-file/1.0.6 \
+ crate://crates.io/scopeguard/1.2.0 \
+ crate://crates.io/sd-notify/0.4.1 \
+ crate://crates.io/sealed/0.5.0 \
+ crate://crates.io/semver/1.0.23 \
+ crate://crates.io/serde/1.0.203 \
+ crate://crates.io/serde_derive/1.0.203 \
+ crate://crates.io/serde_json/1.0.117 \
+ crate://crates.io/serde_path_to_error/0.1.16 \
+ crate://crates.io/serde_urlencoded/0.7.1 \
+ crate://crates.io/sha1/0.10.6 \
+ crate://crates.io/sha1_smol/1.0.0 \
+ crate://crates.io/sharded-slab/0.1.7 \
+ crate://crates.io/signal-hook/0.3.17 \
+ crate://crates.io/signal-hook-registry/1.4.2 \
+ crate://crates.io/simple_asn1/0.6.2 \
+ crate://crates.io/siphasher/0.3.11 \
+ crate://crates.io/slab/0.4.9 \
+ crate://crates.io/smallstr/0.2.0 \
+ crate://crates.io/smallvec/1.13.2 \
+ crate://crates.io/smart-default/0.7.1 \
+ crate://crates.io/smawk/0.3.2 \
+ crate://crates.io/socket2/0.5.7 \
+ crate://crates.io/spin/0.9.8 \
+ crate://crates.io/sqlparser/0.16.0 \
+ crate://crates.io/strsim/0.11.1 \
+ crate://crates.io/subtle/2.5.0 \
+ crate://crates.io/syn/1.0.109 \
+ crate://crates.io/syn/2.0.66 \
+ crate://crates.io/sync_wrapper/0.1.2 \
+ crate://crates.io/synthez/0.3.1 \
+ crate://crates.io/synthez-codegen/0.3.1 \
+ crate://crates.io/synthez-core/0.3.1 \
+ crate://crates.io/tempfile/3.10.1 \
+ crate://crates.io/terminal_size/0.3.0 \
+ crate://crates.io/terminfo/0.8.0 \
+ crate://crates.io/textwrap/0.16.1 \
+ crate://crates.io/thiserror/1.0.61 \
+ crate://crates.io/thiserror-impl/1.0.61 \
+ crate://crates.io/thread_local/1.1.8 \
+ crate://crates.io/time/0.3.36 \
+ crate://crates.io/time-core/0.1.2 \
+ crate://crates.io/time-macros/0.2.18 \
+ crate://crates.io/tinyvec/1.6.0 \
+ crate://crates.io/tinyvec_macros/0.1.1 \
+ crate://crates.io/tokio/1.38.0 \
+ crate://crates.io/tokio-io-timeout/1.2.0 \
+ crate://crates.io/tokio-macros/2.3.0 \
+ crate://crates.io/tokio-rustls/0.25.0 \
+ crate://crates.io/tokio-stream/0.1.15 \
+ crate://crates.io/tokio-tungstenite/0.20.1 \
+ crate://crates.io/tokio-util/0.7.11 \
+ crate://crates.io/tonic/0.11.0 \
+ crate://crates.io/tonic-build/0.11.0 \
+ crate://crates.io/tonic-mock/0.3.0 \
+ crate://crates.io/tower/0.4.13 \
+ crate://crates.io/tower-layer/0.3.2 \
+ crate://crates.io/tower-service/0.3.2 \
+ crate://crates.io/tracing/0.1.40 \
+ crate://crates.io/tracing-attributes/0.1.27 \
+ crate://crates.io/tracing-core/0.1.32 \
+ crate://crates.io/tracing-subscriber/0.3.18 \
+ crate://crates.io/try-lock/0.2.5 \
+ crate://crates.io/tungstenite/0.20.1 \
+ crate://crates.io/typed-builder/0.15.2 \
+ crate://crates.io/typed-builder-macro/0.15.2 \
+ crate://crates.io/typenum/1.17.0 \
+ crate://crates.io/unicode-bidi/0.3.15 \
+ crate://crates.io/unicode-bom/2.0.3 \
+ crate://crates.io/unicode-ident/1.0.12 \
+ crate://crates.io/unicode-linebreak/0.1.5 \
+ crate://crates.io/unicode-normalization/0.1.23 \
+ crate://crates.io/unicode-width/0.1.13 \
+ crate://crates.io/untrusted/0.9.0 \
+ crate://crates.io/url/2.5.0 \
+ crate://crates.io/utf-8/0.7.6 \
+ crate://crates.io/utf8parse/0.2.1 \
+ crate://crates.io/uuid/1.8.0 \
+ crate://crates.io/vergen/8.3.1 \
+ crate://crates.io/version_check/0.9.4 \
+ crate://crates.io/walkdir/2.5.0 \
+ crate://crates.io/want/0.3.1 \
+ crate://crates.io/wasi/0.9.0+wasi-snapshot-preview1 \
+ crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \
+ crate://crates.io/wasm-bindgen/0.2.92 \
+ crate://crates.io/wasm-bindgen-backend/0.2.92 \
+ crate://crates.io/wasm-bindgen-macro/0.2.92 \
+ crate://crates.io/wasm-bindgen-macro-support/0.2.92 \
+ crate://crates.io/wasm-bindgen-shared/0.2.92 \
+ crate://crates.io/winapi/0.3.9 \
+ crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
+ crate://crates.io/winapi-util/0.1.8 \
+ crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
+ crate://crates.io/windows-core/0.52.0 \
+ crate://crates.io/windows-sys/0.48.0 \
+ crate://crates.io/windows-sys/0.52.0 \
+ crate://crates.io/windows-targets/0.48.5 \
+ crate://crates.io/windows-targets/0.52.5 \
+ crate://crates.io/windows_aarch64_gnullvm/0.48.5 \
+ crate://crates.io/windows_aarch64_gnullvm/0.52.5 \
+ crate://crates.io/windows_aarch64_msvc/0.48.5 \
+ crate://crates.io/windows_aarch64_msvc/0.52.5 \
+ crate://crates.io/windows_i686_gnu/0.48.5 \
+ crate://crates.io/windows_i686_gnu/0.52.5 \
+ crate://crates.io/windows_i686_gnullvm/0.52.5 \
+ crate://crates.io/windows_i686_msvc/0.48.5 \
+ crate://crates.io/windows_i686_msvc/0.52.5 \
+ crate://crates.io/windows_x86_64_gnu/0.48.5 \
+ crate://crates.io/windows_x86_64_gnu/0.52.5 \
+ crate://crates.io/windows_x86_64_gnullvm/0.48.5 \
+ crate://crates.io/windows_x86_64_gnullvm/0.52.5 \
+ crate://crates.io/windows_x86_64_msvc/0.48.5 \
+ crate://crates.io/windows_x86_64_msvc/0.52.5 \
+ crate://crates.io/winnow/0.5.40 \
+ crate://crates.io/zeroize/1.8.1 \
+"
+
+SRC_URI[addr2line-0.22.0.sha256sum] = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
+SRC_URI[adler-1.0.2.sha256sum] = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+SRC_URI[aho-corasick-1.1.3.sha256sum] = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+SRC_URI[android-tzdata-0.1.1.sha256sum] = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+SRC_URI[android_system_properties-0.1.5.sha256sum] = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+SRC_URI[ansi_term-0.12.1.sha256sum] = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+SRC_URI[anstream-0.6.14.sha256sum] = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
+SRC_URI[anstyle-1.0.7.sha256sum] = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
+SRC_URI[anstyle-parse-0.2.4.sha256sum] = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
+SRC_URI[anstyle-query-1.1.0.sha256sum] = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
+SRC_URI[anstyle-wincon-3.0.3.sha256sum] = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
+SRC_URI[anyhow-1.0.86.sha256sum] = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
+SRC_URI[arc-swap-1.7.1.sha256sum] = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
+SRC_URI[arrayref-0.3.7.sha256sum] = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
+SRC_URI[arrayvec-0.5.2.sha256sum] = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+SRC_URI[async-stream-0.3.5.sha256sum] = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+SRC_URI[async-stream-impl-0.3.5.sha256sum] = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+SRC_URI[async-trait-0.1.80.sha256sum] = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
+SRC_URI[autocfg-1.3.0.sha256sum] = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+SRC_URI[axum-0.6.20.sha256sum] = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+SRC_URI[axum-core-0.3.4.sha256sum] = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+SRC_URI[backtrace-0.3.72.sha256sum] = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11"
+SRC_URI[base64-0.13.1.sha256sum] = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+SRC_URI[base64-0.21.7.sha256sum] = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+SRC_URI[base64-0.22.1.sha256sum] = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+SRC_URI[bitflags-2.5.0.sha256sum] = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
+SRC_URI[blake2b_simd-0.5.11.sha256sum] = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
+SRC_URI[block-buffer-0.10.4.sha256sum] = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+SRC_URI[bstr-1.9.1.sha256sum] = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706"
+SRC_URI[btoi-0.4.3.sha256sum] = "9dd6407f73a9b8b6162d8a2ef999fe6afd7cc15902ebf42c5cd296addf17e0ad"
+SRC_URI[bumpalo-3.16.0.sha256sum] = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+SRC_URI[bytecount-0.6.8.sha256sum] = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
+SRC_URI[byteorder-1.5.0.sha256sum] = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+SRC_URI[bytes-1.6.0.sha256sum] = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
+SRC_URI[camino-1.1.7.sha256sum] = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239"
+SRC_URI[cargo-platform-0.1.8.sha256sum] = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc"
+SRC_URI[cargo_metadata-0.18.1.sha256sum] = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
+SRC_URI[cc-1.0.98.sha256sum] = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f"
+SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+SRC_URI[chrono-0.4.38.sha256sum] = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
+SRC_URI[clap-4.5.4.sha256sum] = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
+SRC_URI[clap_builder-4.5.2.sha256sum] = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
+SRC_URI[clap_derive-4.5.4.sha256sum] = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
+SRC_URI[clap_lex-0.7.0.sha256sum] = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
+SRC_URI[clru-0.6.2.sha256sum] = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59"
+SRC_URI[colorchoice-1.0.1.sha256sum] = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
+SRC_URI[console-0.15.8.sha256sum] = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"
+SRC_URI[constant_time_eq-0.1.5.sha256sum] = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+SRC_URI[core-foundation-sys-0.8.6.sha256sum] = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+SRC_URI[cpufeatures-0.2.12.sha256sum] = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+SRC_URI[crc32fast-1.4.2.sha256sum] = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+SRC_URI[crossbeam-deque-0.8.5.sha256sum] = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+SRC_URI[crossbeam-epoch-0.9.18.sha256sum] = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+SRC_URI[crossbeam-utils-0.8.20.sha256sum] = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+SRC_URI[crypto-common-0.1.6.sha256sum] = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+SRC_URI[cucumber-0.20.2.sha256sum] = "8e5063d8cf24f4998ad01cac265da468a15ca682a8f4f826d50e661964e8d9b8"
+SRC_URI[cucumber-codegen-0.20.2.sha256sum] = "01091e28d1f566c8b31b67948399d2efd6c0a8f6228a9785519ed7b73f7f0aef"
+SRC_URI[cucumber-expressions-0.3.0.sha256sum] = "d794fed319eea24246fb5f57632f7ae38d61195817b7eb659455aa5bdd7c1810"
+SRC_URI[data-encoding-2.6.0.sha256sum] = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2"
+SRC_URI[deranged-0.3.11.sha256sum] = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+SRC_URI[derive_more-0.99.17.sha256sum] = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+SRC_URI[digest-0.10.7.sha256sum] = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+SRC_URI[dirs-1.0.5.sha256sum] = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
+SRC_URI[dirs-4.0.0.sha256sum] = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+SRC_URI[dirs-sys-0.3.7.sha256sum] = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+SRC_URI[drain_filter_polyfill-0.1.3.sha256sum] = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408"
+SRC_URI[dunce-1.0.4.sha256sum] = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
+SRC_URI[either-1.12.0.sha256sum] = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
+SRC_URI[encode_unicode-0.3.6.sha256sum] = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+SRC_URI[equivalent-1.0.1.sha256sum] = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+SRC_URI[errno-0.3.9.sha256sum] = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+SRC_URI[faster-hex-0.9.0.sha256sum] = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183"
+SRC_URI[fastrand-2.1.0.sha256sum] = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
+SRC_URI[filetime-0.2.23.sha256sum] = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
+SRC_URI[fixedbitset-0.4.2.sha256sum] = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+SRC_URI[flate2-1.0.30.sha256sum] = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
+SRC_URI[fnv-1.0.7.sha256sum] = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+SRC_URI[form_urlencoded-1.2.1.sha256sum] = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+SRC_URI[futures-0.3.30.sha256sum] = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
+SRC_URI[futures-channel-0.3.30.sha256sum] = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
+SRC_URI[futures-core-0.3.30.sha256sum] = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+SRC_URI[futures-executor-0.3.30.sha256sum] = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
+SRC_URI[futures-io-0.3.30.sha256sum] = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
+SRC_URI[futures-macro-0.3.30.sha256sum] = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
+SRC_URI[futures-sink-0.3.30.sha256sum] = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
+SRC_URI[futures-task-0.3.30.sha256sum] = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+SRC_URI[futures-util-0.3.30.sha256sum] = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+SRC_URI[generic-array-0.14.7.sha256sum] = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+SRC_URI[getrandom-0.1.16.sha256sum] = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+SRC_URI[getrandom-0.2.15.sha256sum] = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+SRC_URI[gherkin-0.14.0.sha256sum] = "20b79820c0df536d1f3a089a2fa958f61cb96ce9e0f3f8f507f5a31179567755"
+SRC_URI[gimli-0.29.0.sha256sum] = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
+SRC_URI[gix-0.57.1.sha256sum] = "6dd025382892c7b500a9ce1582cd803f9c2ebfe44aff52e9c7f86feee7ced75e"
+SRC_URI[gix-actor-0.29.1.sha256sum] = "da27b5ab4ab5c75ff891dccd48409f8cc53c28a79480f1efdd33184b2dc1d958"
+SRC_URI[gix-bitmap-0.2.11.sha256sum] = "a371db66cbd4e13f0ed9dc4c0fea712d7276805fccc877f77e96374d317e87ae"
+SRC_URI[gix-chunk-0.4.8.sha256sum] = "45c8751169961ba7640b513c3b24af61aa962c967aaf04116734975cd5af0c52"
+SRC_URI[gix-commitgraph-0.23.2.sha256sum] = "7e8dcbf434951fa477063e05fea59722615af70dc2567377e58c2f7853b010fc"
+SRC_URI[gix-config-0.33.1.sha256sum] = "367304855b369cadcac4ee5fb5a3a20da9378dd7905106141070b79f85241079"
+SRC_URI[gix-config-value-0.14.6.sha256sum] = "fbd06203b1a9b33a78c88252a625031b094d9e1b647260070c25b09910c0a804"
+SRC_URI[gix-date-0.8.6.sha256sum] = "367ee9093b0c2b04fd04c5c7c8b6a1082713534eab537597ae343663a518fa99"
+SRC_URI[gix-diff-0.39.1.sha256sum] = "fd6a0454f8c42d686f17e7f084057c717c082b7dbb8209729e4e8f26749eb93a"
+SRC_URI[gix-discover-0.28.1.sha256sum] = "b8d7b2896edc3d899d28a646ccc6df729827a6600e546570b2783466404a42d6"
+SRC_URI[gix-features-0.37.2.sha256sum] = "d50270e8dcc665f30ba0735b17984b9535bdf1e646c76e638e007846164d57af"
+SRC_URI[gix-fs-0.9.1.sha256sum] = "7555c23a005537434bbfcb8939694e18cad42602961d0de617f8477cc2adecdd"
+SRC_URI[gix-glob-0.15.1.sha256sum] = "ae6232f18b262770e343dcdd461c0011c9b9ae27f0c805e115012aa2b902c1b8"
+SRC_URI[gix-hash-0.14.2.sha256sum] = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e"
+SRC_URI[gix-hashtable-0.5.2.sha256sum] = "7ddf80e16f3c19ac06ce415a38b8591993d3f73aede049cb561becb5b3a8e242"
+SRC_URI[gix-index-0.28.2.sha256sum] = "9e50e63df6c8d4137f7fb882f27643b3a9756c468a1a2cdbe1ce443010ca8778"
+SRC_URI[gix-lock-12.0.1.sha256sum] = "f40a439397f1e230b54cf85d52af87e5ea44cc1e7748379785d3f6d03d802b00"
+SRC_URI[gix-macros-0.1.5.sha256sum] = "999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17"
+SRC_URI[gix-object-0.40.1.sha256sum] = "0c89402e8faa41b49fde348665a8f38589e461036475af43b6b70615a6a313a2"
+SRC_URI[gix-odb-0.56.1.sha256sum] = "46ae6da873de41c6c2b73570e82c571b69df5154dcd8f46dfafc6687767c33b1"
+SRC_URI[gix-pack-0.46.1.sha256sum] = "782b4d42790a14072d5c400deda9851f5765f50fe72bca6dece0da1cd6f05a9a"
+SRC_URI[gix-path-0.10.7.sha256sum] = "23623cf0f475691a6d943f898c4d0b89f5c1a2a64d0f92bce0e0322ee6528783"
+SRC_URI[gix-quote-0.4.12.sha256sum] = "cbff4f9b9ea3fa7a25a70ee62f545143abef624ac6aa5884344e70c8b0a1d9ff"
+SRC_URI[gix-ref-0.40.1.sha256sum] = "64d9bd1984638d8f3511a2fcbe84fcedb8a5b5d64df677353620572383f42649"
+SRC_URI[gix-refspec-0.21.1.sha256sum] = "be219df5092c1735abb2a53eccdf775e945eea6986ee1b6e7a5896dccc0be704"
+SRC_URI[gix-revision-0.25.1.sha256sum] = "aa78e1df3633bc937d4db15f8dca2abdb1300ca971c0fabcf9fa97e38cf4cd9f"
+SRC_URI[gix-revwalk-0.11.1.sha256sum] = "702de5fe5c2bbdde80219f3a8b9723eb927466e7ecd187cfd1b45d986408e45f"
+SRC_URI[gix-sec-0.10.6.sha256sum] = "fddc27984a643b20dd03e97790555804f98cf07404e0e552c0ad8133266a79a1"
+SRC_URI[gix-tempfile-12.0.1.sha256sum] = "a8ef376d718b1f5f119b458e21b00fbf576bc9d4e26f8f383d29f5ffe3ba3eaa"
+SRC_URI[gix-trace-0.1.9.sha256sum] = "f924267408915fddcd558e3f37295cc7d6a3e50f8bd8b606cee0808c3915157e"
+SRC_URI[gix-traverse-0.36.2.sha256sum] = "65109e445ba7a409b48f34f570a4d7db72eade1dc1bcff81990a490e86c07161"
+SRC_URI[gix-url-0.26.1.sha256sum] = "8f0f17cceb7552a231d1fec690bc2740c346554e3be6f5d2c41dfa809594dc44"
+SRC_URI[gix-utils-0.1.12.sha256sum] = "35192df7fd0fa112263bad8021e2df7167df4cc2a6e6d15892e1e55621d3d4dc"
+SRC_URI[gix-validate-0.8.5.sha256sum] = "82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf"
+SRC_URI[glob-match-0.2.1.sha256sum] = "9985c9503b412198aa4197559e9a318524ebc4519c229bfa05a535828c950b9d"
+SRC_URI[globset-0.4.14.sha256sum] = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+SRC_URI[globwalk-0.8.1.sha256sum] = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc"
+SRC_URI[h2-0.3.26.sha256sum] = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
+SRC_URI[hashbrown-0.12.3.sha256sum] = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+SRC_URI[hashbrown-0.14.5.sha256sum] = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+SRC_URI[heck-0.4.1.sha256sum] = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+SRC_URI[heck-0.5.0.sha256sum] = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+SRC_URI[hermit-abi-0.3.9.sha256sum] = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+SRC_URI[home-0.5.9.sha256sum] = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
+SRC_URI[http-0.2.12.sha256sum] = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
+SRC_URI[http-body-0.4.6.sha256sum] = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
+SRC_URI[httparse-1.8.0.sha256sum] = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+SRC_URI[httpdate-1.0.3.sha256sum] = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+SRC_URI[humantime-2.1.0.sha256sum] = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+SRC_URI[hyper-0.14.29.sha256sum] = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33"
+SRC_URI[hyper-timeout-0.4.1.sha256sum] = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+SRC_URI[iana-time-zone-0.1.60.sha256sum] = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+SRC_URI[iana-time-zone-haiku-0.1.2.sha256sum] = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+SRC_URI[idna-0.5.0.sha256sum] = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+SRC_URI[ignore-0.4.22.sha256sum] = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+SRC_URI[indexmap-1.9.3.sha256sum] = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+SRC_URI[indexmap-2.2.6.sha256sum] = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
+SRC_URI[inflections-1.1.1.sha256sum] = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
+SRC_URI[inventory-0.3.15.sha256sum] = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767"
+SRC_URI[is_terminal_polyfill-1.70.0.sha256sum] = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+SRC_URI[itertools-0.12.1.sha256sum] = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
+SRC_URI[itoa-1.0.11.sha256sum] = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+SRC_URI[jemalloc-sys-0.5.4+5.3.0-patched.sha256sum] = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2"
+SRC_URI[jemallocator-0.5.4.sha256sum] = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc"
+SRC_URI[js-sys-0.3.69.sha256sum] = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+SRC_URI[jsonwebtoken-9.3.0.sha256sum] = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f"
+SRC_URI[lazy-regex-3.1.0.sha256sum] = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c"
+SRC_URI[lazy-regex-proc_macros-3.1.0.sha256sum] = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b"
+SRC_URI[lazy_static-1.4.0.sha256sum] = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+SRC_URI[libc-0.2.155.sha256sum] = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
+SRC_URI[libredox-0.1.3.sha256sum] = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+SRC_URI[linefeed-0.6.0.sha256sum] = "28715d08e35c6c074f9ae6b2e6a2420bac75d050c66ecd669d7d5b98e2caa036"
+SRC_URI[linked-hash-map-0.5.6.sha256sum] = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+SRC_URI[linux-raw-sys-0.4.14.sha256sum] = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+SRC_URI[lock_api-0.4.12.sha256sum] = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+SRC_URI[log-0.4.21.sha256sum] = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
+SRC_URI[matchers-0.1.0.sha256sum] = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+SRC_URI[matchit-0.7.3.sha256sum] = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+SRC_URI[memchr-2.7.2.sha256sum] = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
+SRC_URI[memmap2-0.9.4.sha256sum] = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
+SRC_URI[mime-0.3.17.sha256sum] = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+SRC_URI[miniz_oxide-0.7.3.sha256sum] = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae"
+SRC_URI[mio-0.8.11.sha256sum] = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
+SRC_URI[mortal-0.2.4.sha256sum] = "2c624fa1b7aab6bd2aff6e9b18565cc0363b6d45cbcd7465c9ed5e3740ebf097"
+SRC_URI[multimap-0.10.0.sha256sum] = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
+SRC_URI[nix-0.26.4.sha256sum] = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
+SRC_URI[nom-7.1.3.sha256sum] = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+SRC_URI[nom_locate-4.2.0.sha256sum] = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3"
+SRC_URI[nu-ansi-term-0.46.0.sha256sum] = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+SRC_URI[num-bigint-0.4.5.sha256sum] = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7"
+SRC_URI[num-conv-0.1.0.sha256sum] = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+SRC_URI[num-integer-0.1.46.sha256sum] = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+SRC_URI[num-traits-0.2.19.sha256sum] = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+SRC_URI[num_cpus-1.16.0.sha256sum] = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+SRC_URI[num_threads-0.1.7.sha256sum] = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+SRC_URI[object-0.35.0.sha256sum] = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e"
+SRC_URI[once_cell-1.19.0.sha256sum] = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+SRC_URI[overload-0.1.1.sha256sum] = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+SRC_URI[parking_lot-0.12.3.sha256sum] = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+SRC_URI[parking_lot_core-0.9.10.sha256sum] = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+SRC_URI[peg-0.6.3.sha256sum] = "9f76678828272f177ac33b7e2ac2e3e73cc6c1cd1e3e387928aa69562fa51367"
+SRC_URI[peg-macros-0.6.3.sha256sum] = "636d60acf97633e48d266d7415a9355d4389cea327a193f87df395d88cd2b14d"
+SRC_URI[peg-runtime-0.6.3.sha256sum] = "9555b1514d2d99d78150d3c799d4c357a3e2c2a8062cd108e93a06d9057629c5"
+SRC_URI[pem-3.0.4.sha256sum] = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae"
+SRC_URI[percent-encoding-2.3.1.sha256sum] = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+SRC_URI[petgraph-0.6.5.sha256sum] = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
+SRC_URI[phf-0.11.2.sha256sum] = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+SRC_URI[phf_codegen-0.11.2.sha256sum] = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
+SRC_URI[phf_generator-0.11.2.sha256sum] = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
+SRC_URI[phf_shared-0.11.2.sha256sum] = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+SRC_URI[pin-project-1.1.5.sha256sum] = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
+SRC_URI[pin-project-internal-1.1.5.sha256sum] = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
+SRC_URI[pin-project-lite-0.2.14.sha256sum] = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+SRC_URI[pin-utils-0.1.0.sha256sum] = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+SRC_URI[powerfmt-0.2.0.sha256sum] = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+SRC_URI[ppv-lite86-0.2.17.sha256sum] = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+SRC_URI[prettyplease-0.2.20.sha256sum] = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
+SRC_URI[proc-macro2-1.0.85.sha256sum] = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
+SRC_URI[prodash-28.0.0.sha256sum] = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79"
+SRC_URI[prost-0.12.6.sha256sum] = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
+SRC_URI[prost-build-0.12.6.sha256sum] = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4"
+SRC_URI[prost-derive-0.12.6.sha256sum] = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
+SRC_URI[prost-types-0.12.6.sha256sum] = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0"
+SRC_URI[quote-1.0.36.sha256sum] = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
+SRC_URI[rand-0.8.5.sha256sum] = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+SRC_URI[rand_chacha-0.3.1.sha256sum] = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+SRC_URI[rand_core-0.6.4.sha256sum] = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+SRC_URI[redox_syscall-0.1.57.sha256sum] = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
+SRC_URI[redox_syscall-0.4.1.sha256sum] = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+SRC_URI[redox_syscall-0.5.1.sha256sum] = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
+SRC_URI[redox_users-0.3.5.sha256sum] = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
+SRC_URI[redox_users-0.4.5.sha256sum] = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
+SRC_URI[regex-1.10.4.sha256sum] = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+SRC_URI[regex-automata-0.1.10.sha256sum] = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+SRC_URI[regex-automata-0.4.6.sha256sum] = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
+SRC_URI[regex-syntax-0.6.29.sha256sum] = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+SRC_URI[regex-syntax-0.7.5.sha256sum] = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+SRC_URI[regex-syntax-0.8.3.sha256sum] = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
+SRC_URI[ring-0.17.8.sha256sum] = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
+SRC_URI[rust-argon2-0.8.3.sha256sum] = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb"
+SRC_URI[rustc-demangle-0.1.24.sha256sum] = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+SRC_URI[rustix-0.38.34.sha256sum] = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+SRC_URI[rustls-0.22.4.sha256sum] = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432"
+SRC_URI[rustls-pemfile-2.1.2.sha256sum] = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
+SRC_URI[rustls-pki-types-1.7.0.sha256sum] = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
+SRC_URI[rustls-webpki-0.102.4.sha256sum] = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e"
+SRC_URI[rustversion-1.0.17.sha256sum] = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
+SRC_URI[ryu-1.0.18.sha256sum] = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+SRC_URI[same-file-1.0.6.sha256sum] = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+SRC_URI[scopeguard-1.2.0.sha256sum] = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+SRC_URI[sd-notify-0.4.1.sha256sum] = "621e3680f3e07db4c9c2c3fb07c6223ab2fab2e54bd3c04c3ae037990f428c32"
+SRC_URI[sealed-0.5.0.sha256sum] = "f4a8caec23b7800fb97971a1c6ae365b6239aaeddfb934d6265f8505e795699d"
+SRC_URI[semver-1.0.23.sha256sum] = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
+SRC_URI[serde-1.0.203.sha256sum] = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
+SRC_URI[serde_derive-1.0.203.sha256sum] = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
+SRC_URI[serde_json-1.0.117.sha256sum] = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
+SRC_URI[serde_path_to_error-0.1.16.sha256sum] = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
+SRC_URI[serde_urlencoded-0.7.1.sha256sum] = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+SRC_URI[sha1-0.10.6.sha256sum] = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+SRC_URI[sha1_smol-1.0.0.sha256sum] = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
+SRC_URI[sharded-slab-0.1.7.sha256sum] = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+SRC_URI[signal-hook-0.3.17.sha256sum] = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+SRC_URI[signal-hook-registry-1.4.2.sha256sum] = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
+SRC_URI[simple_asn1-0.6.2.sha256sum] = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085"
+SRC_URI[siphasher-0.3.11.sha256sum] = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+SRC_URI[slab-0.4.9.sha256sum] = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+SRC_URI[smallstr-0.2.0.sha256sum] = "1e922794d168678729ffc7e07182721a14219c65814e66e91b839a272fe5ae4f"
+SRC_URI[smallvec-1.13.2.sha256sum] = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+SRC_URI[smart-default-0.7.1.sha256sum] = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1"
+SRC_URI[smawk-0.3.2.sha256sum] = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c"
+SRC_URI[socket2-0.5.7.sha256sum] = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
+SRC_URI[spin-0.9.8.sha256sum] = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+SRC_URI[sqlparser-0.16.0.sha256sum] = "7e9a527b68048eb95495a1508f6c8395c8defcff5ecdbe8ad4106d08a2ef2a3c"
+SRC_URI[strsim-0.11.1.sha256sum] = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+SRC_URI[subtle-2.5.0.sha256sum] = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+SRC_URI[syn-1.0.109.sha256sum] = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+SRC_URI[syn-2.0.66.sha256sum] = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
+SRC_URI[sync_wrapper-0.1.2.sha256sum] = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+SRC_URI[synthez-0.3.1.sha256sum] = "a3d2c2202510a1e186e63e596d9318c91a8cbe85cd1a56a7be0c333e5f59ec8d"
+SRC_URI[synthez-codegen-0.3.1.sha256sum] = "f724aa6d44b7162f3158a57bccd871a77b39a4aef737e01bcdff41f4772c7746"
+SRC_URI[synthez-core-0.3.1.sha256sum] = "78bfa6ec52465e2425fd43ce5bbbe0f0b623964f7c63feb6b10980e816c654ea"
+SRC_URI[tempfile-3.10.1.sha256sum] = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
+SRC_URI[terminal_size-0.3.0.sha256sum] = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
+SRC_URI[terminfo-0.8.0.sha256sum] = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f"
+SRC_URI[textwrap-0.16.1.sha256sum] = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9"
+SRC_URI[thiserror-1.0.61.sha256sum] = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
+SRC_URI[thiserror-impl-1.0.61.sha256sum] = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
+SRC_URI[thread_local-1.1.8.sha256sum] = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+SRC_URI[time-0.3.36.sha256sum] = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
+SRC_URI[time-core-0.1.2.sha256sum] = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+SRC_URI[time-macros-0.2.18.sha256sum] = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
+SRC_URI[tinyvec-1.6.0.sha256sum] = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+SRC_URI[tinyvec_macros-0.1.1.sha256sum] = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+SRC_URI[tokio-1.38.0.sha256sum] = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
+SRC_URI[tokio-io-timeout-1.2.0.sha256sum] = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
+SRC_URI[tokio-macros-2.3.0.sha256sum] = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
+SRC_URI[tokio-rustls-0.25.0.sha256sum] = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f"
+SRC_URI[tokio-stream-0.1.15.sha256sum] = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
+SRC_URI[tokio-tungstenite-0.20.1.sha256sum] = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c"
+SRC_URI[tokio-util-0.7.11.sha256sum] = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
+SRC_URI[tonic-0.11.0.sha256sum] = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13"
+SRC_URI[tonic-build-0.11.0.sha256sum] = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2"
+SRC_URI[tonic-mock-0.3.0.sha256sum] = "ea9163cf065e21bf30e5ad1789bf334f5ae67e4a25f0e8200a7e375466e755ea"
+SRC_URI[tower-0.4.13.sha256sum] = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+SRC_URI[tower-layer-0.3.2.sha256sum] = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+SRC_URI[tower-service-0.3.2.sha256sum] = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+SRC_URI[tracing-0.1.40.sha256sum] = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+SRC_URI[tracing-attributes-0.1.27.sha256sum] = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+SRC_URI[tracing-core-0.1.32.sha256sum] = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+SRC_URI[tracing-subscriber-0.3.18.sha256sum] = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+SRC_URI[try-lock-0.2.5.sha256sum] = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+SRC_URI[tungstenite-0.20.1.sha256sum] = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9"
+SRC_URI[typed-builder-0.15.2.sha256sum] = "7fe83c85a85875e8c4cb9ce4a890f05b23d38cd0d47647db7895d3d2a79566d2"
+SRC_URI[typed-builder-macro-0.15.2.sha256sum] = "29a3151c41d0b13e3d011f98adc24434560ef06673a155a6c7f66b9879eecce2"
+SRC_URI[typenum-1.17.0.sha256sum] = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+SRC_URI[unicode-bidi-0.3.15.sha256sum] = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
+SRC_URI[unicode-bom-2.0.3.sha256sum] = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217"
+SRC_URI[unicode-ident-1.0.12.sha256sum] = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+SRC_URI[unicode-linebreak-0.1.5.sha256sum] = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"
+SRC_URI[unicode-normalization-0.1.23.sha256sum] = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
+SRC_URI[unicode-width-0.1.13.sha256sum] = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
+SRC_URI[untrusted-0.9.0.sha256sum] = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+SRC_URI[url-2.5.0.sha256sum] = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+SRC_URI[utf-8-0.7.6.sha256sum] = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+SRC_URI[utf8parse-0.2.1.sha256sum] = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+SRC_URI[uuid-1.8.0.sha256sum] = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0"
+SRC_URI[vergen-8.3.1.sha256sum] = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525"
+SRC_URI[version_check-0.9.4.sha256sum] = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+SRC_URI[walkdir-2.5.0.sha256sum] = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+SRC_URI[want-0.3.1.sha256sum] = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+SRC_URI[wasi-0.9.0+wasi-snapshot-preview1.sha256sum] = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+SRC_URI[wasm-bindgen-0.2.92.sha256sum] = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+SRC_URI[wasm-bindgen-backend-0.2.92.sha256sum] = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+SRC_URI[wasm-bindgen-macro-0.2.92.sha256sum] = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+SRC_URI[wasm-bindgen-macro-support-0.2.92.sha256sum] = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+SRC_URI[wasm-bindgen-shared-0.2.92.sha256sum] = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+SRC_URI[winapi-util-0.1.8.sha256sum] = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
+SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+SRC_URI[windows-core-0.52.0.sha256sum] = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+SRC_URI[windows-sys-0.48.0.sha256sum] = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+SRC_URI[windows-sys-0.52.0.sha256sum] = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+SRC_URI[windows-targets-0.48.5.sha256sum] = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+SRC_URI[windows-targets-0.52.5.sha256sum] = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+SRC_URI[windows_aarch64_gnullvm-0.48.5.sha256sum] = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+SRC_URI[windows_aarch64_gnullvm-0.52.5.sha256sum] = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+SRC_URI[windows_aarch64_msvc-0.48.5.sha256sum] = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+SRC_URI[windows_aarch64_msvc-0.52.5.sha256sum] = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+SRC_URI[windows_i686_gnu-0.48.5.sha256sum] = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+SRC_URI[windows_i686_gnu-0.52.5.sha256sum] = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+SRC_URI[windows_i686_gnullvm-0.52.5.sha256sum] = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+SRC_URI[windows_i686_msvc-0.48.5.sha256sum] = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+SRC_URI[windows_i686_msvc-0.52.5.sha256sum] = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+SRC_URI[windows_x86_64_gnu-0.48.5.sha256sum] = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+SRC_URI[windows_x86_64_gnu-0.52.5.sha256sum] = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+SRC_URI[windows_x86_64_gnullvm-0.48.5.sha256sum] = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+SRC_URI[windows_x86_64_gnullvm-0.52.5.sha256sum] = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+SRC_URI[windows_x86_64_msvc-0.48.5.sha256sum] = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+SRC_URI[windows_x86_64_msvc-0.52.5.sha256sum] = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
+SRC_URI[winnow-0.5.40.sha256sum] = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+SRC_URI[zeroize-1.8.1.sha256sum] = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+# from lib/Cargo.lock
+SRC_URI += " \
+ crate://crates.io/addr2line/0.22.0 \
+ crate://crates.io/adler/1.0.2 \
+ crate://crates.io/aho-corasick/1.1.3 \
+ crate://crates.io/anyhow/1.0.86 \
+ crate://crates.io/async-stream/0.3.5 \
+ crate://crates.io/async-stream-impl/0.3.5 \
+ crate://crates.io/async-trait/0.1.80 \
+ crate://crates.io/autocfg/1.3.0 \
+ crate://crates.io/autotools/0.2.7 \
+ crate://crates.io/axum/0.6.20 \
+ crate://crates.io/axum-core/0.3.4 \
+ crate://crates.io/backtrace/0.3.72 \
+ crate://crates.io/base64/0.21.7 \
+ crate://crates.io/bitflags/1.3.2 \
+ crate://crates.io/bitflags/2.5.0 \
+ crate://crates.io/bytes/1.6.0 \
+ crate://crates.io/cc/1.0.98 \
+ crate://crates.io/cfg-if/1.0.0 \
+ crate://crates.io/either/1.12.0 \
+ crate://crates.io/equivalent/1.0.1 \
+ crate://crates.io/errno/0.3.9 \
+ crate://crates.io/fastrand/2.1.0 \
+ crate://crates.io/fixedbitset/0.4.2 \
+ crate://crates.io/fnv/1.0.7 \
+ crate://crates.io/futures-channel/0.3.30 \
+ crate://crates.io/futures-core/0.3.30 \
+ crate://crates.io/futures-sink/0.3.30 \
+ crate://crates.io/futures-task/0.3.30 \
+ crate://crates.io/futures-util/0.3.30 \
+ crate://crates.io/getrandom/0.2.15 \
+ crate://crates.io/gimli/0.29.0 \
+ crate://crates.io/h2/0.3.26 \
+ crate://crates.io/hashbrown/0.12.3 \
+ crate://crates.io/hashbrown/0.14.5 \
+ crate://crates.io/heck/0.5.0 \
+ crate://crates.io/http/0.2.12 \
+ crate://crates.io/http-body/0.4.6 \
+ crate://crates.io/httparse/1.8.0 \
+ crate://crates.io/httpdate/1.0.3 \
+ crate://crates.io/hyper/0.14.29 \
+ crate://crates.io/hyper-timeout/0.4.1 \
+ crate://crates.io/indexmap/1.9.3 \
+ crate://crates.io/indexmap/2.2.6 \
+ crate://crates.io/itertools/0.12.1 \
+ crate://crates.io/itoa/1.0.11 \
+ crate://crates.io/libc/0.2.155 \
+ crate://crates.io/linux-raw-sys/0.4.14 \
+ crate://crates.io/log/0.4.21 \
+ crate://crates.io/matchit/0.7.3 \
+ crate://crates.io/memchr/2.7.2 \
+ crate://crates.io/mime/0.3.17 \
+ crate://crates.io/miniz_oxide/0.7.3 \
+ crate://crates.io/mio/0.8.11 \
+ crate://crates.io/multimap/0.10.0 \
+ crate://crates.io/object/0.35.0 \
+ crate://crates.io/once_cell/1.19.0 \
+ crate://crates.io/percent-encoding/2.3.1 \
+ crate://crates.io/petgraph/0.6.5 \
+ crate://crates.io/pin-project/1.1.5 \
+ crate://crates.io/pin-project-internal/1.1.5 \
+ crate://crates.io/pin-project-lite/0.2.14 \
+ crate://crates.io/pin-utils/0.1.0 \
+ crate://crates.io/ppv-lite86/0.2.17 \
+ crate://crates.io/prettyplease/0.2.20 \
+ crate://crates.io/proc-macro2/1.0.85 \
+ crate://crates.io/prost/0.12.6 \
+ crate://crates.io/prost-build/0.12.6 \
+ crate://crates.io/prost-derive/0.12.6 \
+ crate://crates.io/prost-types/0.12.6 \
+ crate://crates.io/protobuf-src/1.1.0+21.5 \
+ crate://crates.io/quote/1.0.36 \
+ crate://crates.io/rand/0.8.5 \
+ crate://crates.io/rand_chacha/0.3.1 \
+ crate://crates.io/rand_core/0.6.4 \
+ crate://crates.io/regex/1.10.4 \
+ crate://crates.io/regex-automata/0.4.6 \
+ crate://crates.io/regex-syntax/0.8.3 \
+ crate://crates.io/ring/0.17.8 \
+ crate://crates.io/rustc-demangle/0.1.24 \
+ crate://crates.io/rustix/0.38.34 \
+ crate://crates.io/rustls/0.21.12 \
+ crate://crates.io/rustls-pemfile/1.0.4 \
+ crate://crates.io/rustls-webpki/0.101.7 \
+ crate://crates.io/rustversion/1.0.17 \
+ crate://crates.io/sct/0.7.1 \
+ crate://crates.io/serde/1.0.203 \
+ crate://crates.io/serde_derive/1.0.203 \
+ crate://crates.io/slab/0.4.9 \
+ crate://crates.io/socket2/0.5.7 \
+ crate://crates.io/spin/0.9.8 \
+ crate://crates.io/syn/2.0.66 \
+ crate://crates.io/sync_wrapper/0.1.2 \
+ crate://crates.io/tempfile/3.10.1 \
+ crate://crates.io/tokio/1.38.0 \
+ crate://crates.io/tokio-io-timeout/1.2.0 \
+ crate://crates.io/tokio-macros/2.3.0 \
+ crate://crates.io/tokio-rustls/0.24.1 \
+ crate://crates.io/tokio-stream/0.1.15 \
+ crate://crates.io/tokio-util/0.7.11 \
+ crate://crates.io/tonic/0.9.2 \
+ crate://crates.io/tonic/0.11.0 \
+ crate://crates.io/tonic-build/0.11.0 \
+ crate://crates.io/tower/0.4.13 \
+ crate://crates.io/tower-layer/0.3.2 \
+ crate://crates.io/tower-service/0.3.2 \
+ crate://crates.io/tracing/0.1.40 \
+ crate://crates.io/tracing-attributes/0.1.27 \
+ crate://crates.io/tracing-core/0.1.32 \
+ crate://crates.io/try-lock/0.2.5 \
+ crate://crates.io/unicode-ident/1.0.12 \
+ crate://crates.io/untrusted/0.9.0 \
+ crate://crates.io/want/0.3.1 \
+ crate://crates.io/wasi/0.11.0+wasi-snapshot-preview1 \
+ crate://crates.io/windows-sys/0.48.0 \
+ crate://crates.io/windows-sys/0.52.0 \
+ crate://crates.io/windows-targets/0.48.5 \
+ crate://crates.io/windows-targets/0.52.5 \
+ crate://crates.io/windows_aarch64_gnullvm/0.48.5 \
+ crate://crates.io/windows_aarch64_gnullvm/0.52.5 \
+ crate://crates.io/windows_aarch64_msvc/0.48.5 \
+ crate://crates.io/windows_aarch64_msvc/0.52.5 \
+ crate://crates.io/windows_i686_gnu/0.48.5 \
+ crate://crates.io/windows_i686_gnu/0.52.5 \
+ crate://crates.io/windows_i686_gnullvm/0.52.5 \
+ crate://crates.io/windows_i686_msvc/0.48.5 \
+ crate://crates.io/windows_i686_msvc/0.52.5 \
+ crate://crates.io/windows_x86_64_gnu/0.48.5 \
+ crate://crates.io/windows_x86_64_gnu/0.52.5 \
+ crate://crates.io/windows_x86_64_gnullvm/0.48.5 \
+ crate://crates.io/windows_x86_64_gnullvm/0.52.5 \
+ crate://crates.io/windows_x86_64_msvc/0.48.5 \
+ crate://crates.io/windows_x86_64_msvc/0.52.5 \
+"
+
+SRC_URI[addr2line-0.22.0.sha256sum] = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
+SRC_URI[adler-1.0.2.sha256sum] = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+SRC_URI[aho-corasick-1.1.3.sha256sum] = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+SRC_URI[anyhow-1.0.86.sha256sum] = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
+SRC_URI[async-stream-0.3.5.sha256sum] = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+SRC_URI[async-stream-impl-0.3.5.sha256sum] = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+SRC_URI[async-trait-0.1.80.sha256sum] = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
+SRC_URI[autocfg-1.3.0.sha256sum] = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+SRC_URI[autotools-0.2.7.sha256sum] = "ef941527c41b0fc0dd48511a8154cd5fc7e29200a0ff8b7203c5d777dbc795cf"
+SRC_URI[axum-0.6.20.sha256sum] = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+SRC_URI[axum-core-0.3.4.sha256sum] = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+SRC_URI[backtrace-0.3.72.sha256sum] = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11"
+SRC_URI[base64-0.21.7.sha256sum] = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+SRC_URI[bitflags-2.5.0.sha256sum] = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
+SRC_URI[bytes-1.6.0.sha256sum] = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
+SRC_URI[cc-1.0.98.sha256sum] = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f"
+SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+SRC_URI[either-1.12.0.sha256sum] = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
+SRC_URI[equivalent-1.0.1.sha256sum] = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+SRC_URI[errno-0.3.9.sha256sum] = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+SRC_URI[fastrand-2.1.0.sha256sum] = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
+SRC_URI[fixedbitset-0.4.2.sha256sum] = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+SRC_URI[fnv-1.0.7.sha256sum] = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+SRC_URI[futures-channel-0.3.30.sha256sum] = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
+SRC_URI[futures-core-0.3.30.sha256sum] = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+SRC_URI[futures-sink-0.3.30.sha256sum] = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
+SRC_URI[futures-task-0.3.30.sha256sum] = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+SRC_URI[futures-util-0.3.30.sha256sum] = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+SRC_URI[getrandom-0.2.15.sha256sum] = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+SRC_URI[gimli-0.29.0.sha256sum] = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
+SRC_URI[h2-0.3.26.sha256sum] = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
+SRC_URI[hashbrown-0.12.3.sha256sum] = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+SRC_URI[hashbrown-0.14.5.sha256sum] = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+SRC_URI[heck-0.5.0.sha256sum] = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+SRC_URI[http-0.2.12.sha256sum] = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
+SRC_URI[http-body-0.4.6.sha256sum] = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
+SRC_URI[httparse-1.8.0.sha256sum] = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+SRC_URI[httpdate-1.0.3.sha256sum] = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+SRC_URI[hyper-0.14.29.sha256sum] = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33"
+SRC_URI[hyper-timeout-0.4.1.sha256sum] = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+SRC_URI[indexmap-1.9.3.sha256sum] = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+SRC_URI[indexmap-2.2.6.sha256sum] = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
+SRC_URI[itertools-0.12.1.sha256sum] = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
+SRC_URI[itoa-1.0.11.sha256sum] = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+SRC_URI[libc-0.2.155.sha256sum] = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
+SRC_URI[linux-raw-sys-0.4.14.sha256sum] = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+SRC_URI[log-0.4.21.sha256sum] = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
+SRC_URI[matchit-0.7.3.sha256sum] = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+SRC_URI[memchr-2.7.2.sha256sum] = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
+SRC_URI[mime-0.3.17.sha256sum] = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+SRC_URI[miniz_oxide-0.7.3.sha256sum] = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae"
+SRC_URI[mio-0.8.11.sha256sum] = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
+SRC_URI[multimap-0.10.0.sha256sum] = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
+SRC_URI[object-0.35.0.sha256sum] = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e"
+SRC_URI[once_cell-1.19.0.sha256sum] = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+SRC_URI[percent-encoding-2.3.1.sha256sum] = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+SRC_URI[petgraph-0.6.5.sha256sum] = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
+SRC_URI[pin-project-1.1.5.sha256sum] = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
+SRC_URI[pin-project-internal-1.1.5.sha256sum] = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
+SRC_URI[pin-project-lite-0.2.14.sha256sum] = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+SRC_URI[pin-utils-0.1.0.sha256sum] = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+SRC_URI[ppv-lite86-0.2.17.sha256sum] = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+SRC_URI[prettyplease-0.2.20.sha256sum] = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
+SRC_URI[proc-macro2-1.0.85.sha256sum] = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
+SRC_URI[prost-0.12.6.sha256sum] = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
+SRC_URI[prost-build-0.12.6.sha256sum] = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4"
+SRC_URI[prost-derive-0.12.6.sha256sum] = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
+SRC_URI[prost-types-0.12.6.sha256sum] = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0"
+SRC_URI[protobuf-src-1.1.0+21.5.sha256sum] = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1"
+SRC_URI[quote-1.0.36.sha256sum] = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
+SRC_URI[rand-0.8.5.sha256sum] = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+SRC_URI[rand_chacha-0.3.1.sha256sum] = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+SRC_URI[rand_core-0.6.4.sha256sum] = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+SRC_URI[regex-1.10.4.sha256sum] = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+SRC_URI[regex-automata-0.4.6.sha256sum] = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
+SRC_URI[regex-syntax-0.8.3.sha256sum] = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
+SRC_URI[ring-0.17.8.sha256sum] = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
+SRC_URI[rustc-demangle-0.1.24.sha256sum] = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+SRC_URI[rustix-0.38.34.sha256sum] = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+SRC_URI[rustls-0.21.12.sha256sum] = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
+SRC_URI[rustls-pemfile-1.0.4.sha256sum] = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+SRC_URI[rustls-webpki-0.101.7.sha256sum] = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+SRC_URI[rustversion-1.0.17.sha256sum] = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
+SRC_URI[sct-0.7.1.sha256sum] = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
+SRC_URI[serde-1.0.203.sha256sum] = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
+SRC_URI[serde_derive-1.0.203.sha256sum] = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
+SRC_URI[slab-0.4.9.sha256sum] = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+SRC_URI[socket2-0.5.7.sha256sum] = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
+SRC_URI[spin-0.9.8.sha256sum] = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+SRC_URI[syn-2.0.66.sha256sum] = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
+SRC_URI[sync_wrapper-0.1.2.sha256sum] = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+SRC_URI[tempfile-3.10.1.sha256sum] = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
+SRC_URI[tokio-1.38.0.sha256sum] = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
+SRC_URI[tokio-io-timeout-1.2.0.sha256sum] = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
+SRC_URI[tokio-macros-2.3.0.sha256sum] = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
+SRC_URI[tokio-rustls-0.24.1.sha256sum] = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+SRC_URI[tokio-stream-0.1.15.sha256sum] = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
+SRC_URI[tokio-util-0.7.11.sha256sum] = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
+SRC_URI[tonic-0.9.2.sha256sum] = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a"
+SRC_URI[tonic-0.11.0.sha256sum] = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13"
+SRC_URI[tonic-build-0.11.0.sha256sum] = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2"
+SRC_URI[tower-0.4.13.sha256sum] = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+SRC_URI[tower-layer-0.3.2.sha256sum] = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+SRC_URI[tower-service-0.3.2.sha256sum] = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+SRC_URI[tracing-0.1.40.sha256sum] = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+SRC_URI[tracing-attributes-0.1.27.sha256sum] = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+SRC_URI[tracing-core-0.1.32.sha256sum] = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+SRC_URI[try-lock-0.2.5.sha256sum] = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+SRC_URI[unicode-ident-1.0.12.sha256sum] = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+SRC_URI[untrusted-0.9.0.sha256sum] = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+SRC_URI[want-0.3.1.sha256sum] = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+SRC_URI[wasi-0.11.0+wasi-snapshot-preview1.sha256sum] = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+SRC_URI[windows-sys-0.48.0.sha256sum] = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+SRC_URI[windows-sys-0.52.0.sha256sum] = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+SRC_URI[windows-targets-0.48.5.sha256sum] = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+SRC_URI[windows-targets-0.52.5.sha256sum] = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+SRC_URI[windows_aarch64_gnullvm-0.48.5.sha256sum] = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+SRC_URI[windows_aarch64_gnullvm-0.52.5.sha256sum] = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+SRC_URI[windows_aarch64_msvc-0.48.5.sha256sum] = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+SRC_URI[windows_aarch64_msvc-0.52.5.sha256sum] = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+SRC_URI[windows_i686_gnu-0.48.5.sha256sum] = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+SRC_URI[windows_i686_gnu-0.52.5.sha256sum] = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+SRC_URI[windows_i686_gnullvm-0.52.5.sha256sum] = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+SRC_URI[windows_i686_msvc-0.48.5.sha256sum] = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+SRC_URI[windows_i686_msvc-0.52.5.sha256sum] = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+SRC_URI[windows_x86_64_gnu-0.48.5.sha256sum] = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+SRC_URI[windows_x86_64_gnu-0.52.5.sha256sum] = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+SRC_URI[windows_x86_64_gnullvm-0.48.5.sha256sum] = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+SRC_URI[windows_x86_64_gnullvm-0.52.5.sha256sum] = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+SRC_URI[windows_x86_64_msvc-0.48.5.sha256sum] = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+SRC_URI[windows_x86_64_msvc-0.52.5.sha256sum] = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/0001-Remove-protobuf-src-usage.patch b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/0001-Remove-protobuf-src-usage.patch
new file mode 100644
index 000000000..c6c2381d6
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/0001-Remove-protobuf-src-usage.patch
@@ -0,0 +1,133 @@
+From 953c80a2acc2bbb882a2dcbbbf0eae7098cbd1fa Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Tue, 18 Jun 2024 15:53:46 -0400
+Subject: [PATCH] Remove protobuf-src usage
+
+The vendoring of a protoc and libprotobuf build that was added in
+commit 890703c9 by using protobuf-src is not really workable with
+OpenEmbedded / Yocto Project, and somewhat undesirable for any
+distribution package builds when it comes to transparency and
+reproducibility. Remove it so that building in OE/YP will work.
+
+Upstream-Status: Pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ Cargo.lock | 19 -------------------
+ databroker-proto/Cargo.toml | 1 -
+ databroker-proto/build.rs | 1 -
+ lib/Cargo.lock | 19 -------------------
+ 4 files changed, 40 deletions(-)
+
+diff --git a/Cargo.lock b/Cargo.lock
+index eb212b0..fdce813 100644
+--- a/Cargo.lock
++++ b/Cargo.lock
+@@ -162,15 +162,6 @@ version = "1.3.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+
+-[[package]]
+-name = "autotools"
+-version = "0.2.7"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "ef941527c41b0fc0dd48511a8154cd5fc7e29200a0ff8b7203c5d777dbc795cf"
+-dependencies = [
+- "cc",
+-]
+-
+ [[package]]
+ name = "axum"
+ version = "0.6.20"
+@@ -650,7 +641,6 @@ version = "0.4.5"
+ dependencies = [
+ "prost",
+ "prost-types",
+- "protobuf-src",
+ "tonic",
+ "tonic-build",
+ ]
+@@ -2322,15 +2312,6 @@ dependencies = [
+ "prost",
+ ]
+
+-[[package]]
+-name = "protobuf-src"
+-version = "1.1.0+21.5"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1"
+-dependencies = [
+- "autotools",
+-]
+-
+ [[package]]
+ name = "quote"
+ version = "1.0.36"
+diff --git a/databroker-proto/Cargo.toml b/databroker-proto/Cargo.toml
+index 9d548b2..2f4a7f1 100644
+--- a/databroker-proto/Cargo.toml
++++ b/databroker-proto/Cargo.toml
+@@ -25,4 +25,3 @@ prost-types = { workspace = true }
+
+ [build-dependencies]
+ tonic-build = { workspace = true, features = ["transport", "prost"] }
+-protobuf-src = "1.1.0"
+diff --git a/databroker-proto/build.rs b/databroker-proto/build.rs
+index d02a006..d3a70ac 100644
+--- a/databroker-proto/build.rs
++++ b/databroker-proto/build.rs
+@@ -12,7 +12,6 @@
+ ********************************************************************************/
+
+ fn main() -> Result<(), Box<dyn std::error::Error>> {
+- std::env::set_var("PROTOC", protobuf_src::protoc());
+ tonic_build::configure()
+ .compile_well_known_types(false)
+ .protoc_arg("--experimental_allow_proto3_optional")
+diff --git a/lib/Cargo.lock b/lib/Cargo.lock
+index 5ba0b78..7dc93f3 100644
+--- a/lib/Cargo.lock
++++ b/lib/Cargo.lock
+@@ -71,15 +71,6 @@ version = "1.3.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+
+-[[package]]
+-name = "autotools"
+-version = "0.2.7"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "ef941527c41b0fc0dd48511a8154cd5fc7e29200a0ff8b7203c5d777dbc795cf"
+-dependencies = [
+- "cc",
+-]
+-
+ [[package]]
+ name = "axum"
+ version = "0.6.20"
+@@ -182,7 +173,6 @@ version = "0.4.5"
+ dependencies = [
+ "prost",
+ "prost-types",
+- "protobuf-src",
+ "tonic 0.11.0",
+ "tonic-build",
+ ]
+@@ -663,15 +653,6 @@ dependencies = [
+ "prost",
+ ]
+
+-[[package]]
+-name = "protobuf-src"
+-version = "1.1.0+21.5"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1"
+-dependencies = [
+- "autotools",
+-]
+-
+ [[package]]
+ name = "quote"
+ version = "1.0.36"
+--
+2.44.0
+
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/kuksa-databroker.service b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/kuksa-databroker.service
new file mode 100644
index 000000000..04e819923
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker/kuksa-databroker.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Eclipse KUKSA.val databroker
+After=network.target
+
+[Service]
+User=kuksa
+EnvironmentFile=-/etc/default/kuksa-databroker
+ExecStart=/usr/bin/databroker $EXTRA_ARGS
+Restart=on-abort
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker_git.bb b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker_git.bb
new file mode 100644
index 000000000..376e6a663
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-connectivity/kuksa-val/kuksa-databroker_git.bb
@@ -0,0 +1,56 @@
+SUMMARY = "KUKSA.val databroker, the KUKSA Vehicle Abstraction Layer"
+#DESCRIPTION = "KUKSA.val provides a COVESA VSS data model describing data in a vehicle."
+HOMEPAGE = "https://github.com/eclipse/kuksa.val"
+BUGTRACKER = "https://github.com/eclipse/kuksa.val/issues"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327 \
+"
+
+DEPENDS = "protobuf-native grpc-native"
+
+PV = "0.4.5+git${SRCPV}"
+
+SRC_URI = "git://github.com/eclipse-kuksa/kuksa-databroker.git;protocol=https;branch=main \
+ file://0001-Remove-protobuf-src-usage.patch \
+ file://kuksa-databroker.service \
+"
+SRCREV = "8eb7d1a36ccdbec18f742bcecddf8691cb57df46"
+
+require ${BPN}-crates.inc
+
+S = "${WORKDIR}/git"
+
+inherit cargo cargo-update-recipe-crates systemd useradd
+
+# Enable optional VISS support for potential use by e.g. the web apps
+CARGO_BUILD_FLAGS += "--features viss"
+
+SYSTEMD_SERVICE:${PN} = "${BPN}.service"
+
+USERADD_PACKAGES = "${PN}"
+USERADDEXTENSION = "useradd-staticids"
+GROUPADD_PARAM:${PN} = "-g 900 kuksa ;"
+USERADD_PARAM:${PN} = "--system -g 900 -u 900 -o -d / --shell /bin/nologin kuksa ;"
+
+do_install:append() {
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/${BPN}.service ${D}${systemd_system_unitdir}
+ fi
+
+ # Install gRPC API protobuf files
+ install -d ${D}${includedir}
+ cp -dr ${S}/proto/* ${D}${includedir}/
+}
+
+PACKAGE_BEFORE_PN += "${PN}-cli"
+
+FILES:${PN} += "${systemd_system_unitdir} ${datadir}"
+
+FILES:${PN}-cli = "${bindir}/databroker-cli"
+
+# The upstream Cargo.toml builds optimized and stripped binaries, for
+# now disable the QA check as opposed to tweaking the configuration.
+INSANE_SKIP:${PN} = "already-stripped"
+INSANE_SKIP:${PN}-cli = "already-stripped"
diff --git a/meta-agl-kuksa-val/recipes-devtools/python/python3-anytree_2.8.0.bb b/meta-agl-kuksa-val/recipes-devtools/python/python3-anytree_2.8.0.bb
new file mode 100644
index 000000000..1b4628a9a
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-devtools/python/python3-anytree_2.8.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Powerful and Lightweight Python Tree Data Structure"
+HOMEPAGE = "https://github.com/c0fec0de/anytree"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e"
+
+PYPI_PACKAGE = "anytree"
+
+SRC_URI[sha256sum] = "3f0f93f355a91bc3e6245319bf4c1d50e3416cc7a35cc1133c1ff38306bbccab"
+
+inherit pypi setuptools3
+
+do_install:append () {
+ rm -f ${D}${prefix}/LICENSE
+}
+
+BBCLASSEXTEND += "native nativesdk"
diff --git a/meta-agl-kuksa-val/recipes-devtools/python/python3-can-j1939_2.0.6.bb b/meta-agl-kuksa-val/recipes-devtools/python/python3-can-j1939_2.0.6.bb
new file mode 100644
index 000000000..b479340a8
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-devtools/python/python3-can-j1939_2.0.6.bb
@@ -0,0 +1,13 @@
+SUMMARY = "An implementation of the CAN SAE J1939 standard for Python."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=32e7309a8200a5f4b7aec6efcfb8e77e"
+PYPI_PACKAGE = "can-j1939"
+
+SRC_URI[sha256sum] = "beda5bf2e2502c4a7d97a989075c56b98e33e49b619ef8054ed13aca911be3d3"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-can \
+ python3-numpy \
+"
diff --git a/meta-agl-kuksa-val/recipes-devtools/python/python3-deprecation_2.1.0.bb b/meta-agl-kuksa-val/recipes-devtools/python/python3-deprecation_2.1.0.bb
new file mode 100644
index 000000000..c4b3a1cfe
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-devtools/python/python3-deprecation_2.1.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A library to handle automated deprecations"
+HOMEPAGE = "https://github.com/briancurtin/deprecation"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e"
+
+PYPI_PACKAGE = "deprecation"
+
+SRC_URI[sha256sum] = "72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND += "native nativesdk"
diff --git a/meta-agl-kuksa-val/recipes-devtools/python/python3-graphql-core_3.2.3.bb b/meta-agl-kuksa-val/recipes-devtools/python/python3-graphql-core_3.2.3.bb
new file mode 100644
index 000000000..b12957a40
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-devtools/python/python3-graphql-core_3.2.3.bb
@@ -0,0 +1,12 @@
+SUMMARY = "GraphQL implementation for Python"
+HOMEPAGE = "https://github.com/graphql-python/graphql-core"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=73706fb002de2debc52328afd1688817"
+
+PYPI_PACKAGE = "graphql-core"
+
+SRC_URI[sha256sum] = "06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND += "native nativesdk"
diff --git a/meta-agl-kuksa-val/recipes-devtools/python/python3-jsonpath-ng_1.5.3.bb b/meta-agl-kuksa-val/recipes-devtools/python/python3-jsonpath-ng_1.5.3.bb
new file mode 100644
index 000000000..4c3dfaa94
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-devtools/python/python3-jsonpath-ng_1.5.3.bb
@@ -0,0 +1,15 @@
+SUMMARY = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming."
+HOMEPAGE = "https://github.com/h2non/jsonpath-ng"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+PYPI_PACKAGE = "jsonpath-ng"
+
+SRC_URI[sha256sum] = "a273b182a82c1256daab86a313b937059261b5c5f8c4fa3fc38b882b344dd567"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-ply \
+ python3-six \
+"
diff --git a/meta-agl-kuksa-val/recipes-devtools/python/python3-py-expression-eval_0.3.14.bb b/meta-agl-kuksa-val/recipes-devtools/python/python3-py-expression-eval_0.3.14.bb
new file mode 100644
index 000000000..15a295f10
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-devtools/python/python3-py-expression-eval_0.3.14.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Python Mathematical Expression Evaluator"
+HOMEPAGE = "https://github.com/AxiaCore/py-expression-eval"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5a9126e7f56a0cf3247050de7f10d0f4"
+
+# NOTE: Pulling from github.com instead of pypi.org as the tarfiles on
+# the latter do not include the LICENSE file.
+
+SRC_URI = "git://github.com/axiacore/py-expression-eval.git;protocol=https;branch=master"
+SRCREV = "e7cfbedb3cdb1c428ae3dfbc967fe43deffa5e64"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
diff --git a/meta-agl-kuksa-val/recipes-devtools/python/python3-setuptools-git-versioning_1.7.4.bb b/meta-agl-kuksa-val/recipes-devtools/python/python3-setuptools-git-versioning_1.7.4.bb
new file mode 100644
index 000000000..698a3bb62
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-devtools/python/python3-setuptools-git-versioning_1.7.4.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Use git repo data for building a version number according PEP-440"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=f22e7cb81b49604c2450680982bdc067"
+PYPI_PACKAGE = "setuptools-git-versioning"
+
+DEPENDS = "python3-six-native"
+
+SRC_URI[sha256sum] = "be2901afcb7c865e3b500a38183598657fd029a1a72c8d1dfc7fbffb5c227dac"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-setuptools \
+ python3-six \
+"
+
+BBCLASSEXTEND = "native"
diff --git a/meta-agl-kuksa-val/recipes-support/vss/vss-tools_4.2.bb b/meta-agl-kuksa-val/recipes-support/vss/vss-tools_4.2.bb
new file mode 100644
index 000000000..62f78f07e
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-support/vss/vss-tools_4.2.bb
@@ -0,0 +1,29 @@
+SUMMARY = "COVESA Vehicle Signal Specification tooling."
+HOMEPAGE = "https://github.com/COVESA/vss-tools"
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9741c346eef56131163e13b9db1241b3"
+
+SRC_URI = "git://github.com/COVESA/vss-tools.git;protocol=https;branch=release/4.2"
+SRCREV = "b350788d6dd16942e987fdb9e8b8b3b403fe23c6"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-core \
+ python3-ctypes \
+ python3-email \
+ python3-importlib-metadata \
+ python3-json \
+ python3-logging \
+ python3-netclient \
+ python3-pkg-resources \
+ python3-anytree \
+ python3-deprecation \
+ python3-graphql-core \
+ python3-pyyaml \
+ python3-six \
+"
+
+BBCLASSEXTEND += "native nativesdk"
diff --git a/meta-agl-kuksa-val/recipes-support/vss/vss.inc b/meta-agl-kuksa-val/recipes-support/vss/vss.inc
new file mode 100644
index 000000000..aab950bee
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-support/vss/vss.inc
@@ -0,0 +1,5 @@
+SRC_URI = "git://github.com/COVESA/vehicle_signal_specification.git;branch=release/4.2;protocol=https"
+# v4.2
+SRCREV = "6024c4b29065b37c074649a1a65396b9d4de9b55"
+
+S = "${WORKDIR}/git"
diff --git a/meta-agl-kuksa-val/recipes-support/vss/vss_4.2.bb b/meta-agl-kuksa-val/recipes-support/vss/vss_4.2.bb
new file mode 100644
index 000000000..053516629
--- /dev/null
+++ b/meta-agl-kuksa-val/recipes-support/vss/vss_4.2.bb
@@ -0,0 +1,43 @@
+SUMMARY = "Vehicle Signal Specification"
+LICENSE = "MPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=9741c346eef56131163e13b9db1241b3"
+
+DEPENDS = "vss-tools-native"
+
+inherit allarch update-alternatives
+
+require vss.inc
+
+UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>\d+(\.\d+)+)"
+
+S = "${WORKDIR}/git"
+
+do_configure[noexec] = "1"
+
+EXTRA_OEMAKE = "TOOLSDIR=${STAGING_BINDIR_NATIVE}"
+
+do_compile() {
+ oe_runmake json
+}
+
+do_install() {
+ # Cannot use the "install" target in the project Makefile, as it is
+ # intended for setting the repo up for builds.
+ # For now, just the generated JSON is installed. It is possible that
+ # installing the vspec files somewhere as a development package may
+ # be useful, but for now things will be kept simple.
+ install -d ${D}${datadir}/vss
+ install -m 0644 ${S}/vss_rel_${PV}.json ${D}${datadir}/vss/
+}
+
+# NOTE:
+# A virtual RPROVIDES is not used for now, as packages such as KUKSA.val
+# provide their own copies of the VSS JSON, so we can install this one
+# and any alternatives in parallel and point e.g. KUKSA.val at the desired
+# file with a configuration change. This may be worth revisiting down the
+# road.
+
+ALTERNATIVE_LINK_NAME[vss.json] = "${datadir}/vss/vss.json"
+
+ALTERNATIVE:${PN} = "vss.json"
+ALTERNATIVE_TARGET_${PN} = "${datadir}/vss/vss_rel_${PV}.json"
diff --git a/meta-agl.md b/meta-agl.md
index be4369656..e7d4fcb30 100755
--- a/meta-agl.md
+++ b/meta-agl.md
@@ -26,6 +26,7 @@ Following is a "tree" look at the layer:
|-- meta-agl-core-test
|-- meta-agl-ic
|-- meta-agl-ivi
+|-- meta-agl-kuksa-val
|-- meta-agl.md
|-- meta-netboot
|-- meta-pipewire
@@ -46,6 +47,7 @@ in `meta-agl`:
* `meta-agl-core-test`: recipes supporting qa images (separate layer due to external dependencies)
* `meta-agl-ic`: Instrument Cluster platform
* `meta-agl-ivi`: IVI platform
+* `meta-agl-kuksa-val`: Contains KUKSA.val databroker and VSS schema tooling recipes.
* `meta-netboot`: Contains recipes and configuration adjustments to allow network
boot through network block device (NBD) since network file system (NFS) does not
support security labels.
diff --git a/meta-netboot/recipes-core/initramfs-netboot/files/init.sh b/meta-netboot/recipes-core/initramfs-netboot/files/init.sh
index 87a1acb80..4a4af3180 100644
--- a/meta-netboot/recipes-core/initramfs-netboot/files/init.sh
+++ b/meta-netboot/recipes-core/initramfs-netboot/files/init.sh
@@ -144,12 +144,21 @@ pivot_root . boot/initramfs || bail_out "pivot_root failed."
if [[ -f /lib/systemd/system/connman.service ]]; then
newopts="-r -n"
iface=$(find_active_interface)
- [[ -n "$iface" ]] && newopts="$newopts -I $iface"
+ # beside discovered iface, also ignore known renames
+ [[ -n "$iface" ]] && newopts="$newopts -I ${iface},enp2s0,enp3s0,end0,enp0s2,enp0s1 "
log_info "Adjusting Connman command line. Will be: 'connmand $newopts'"
sed -i "s|connmand -n\$|connmand $newopts|g" /lib/systemd/system/connman.service
fi
+# workaround for systemd-network-generator bringing the interface up/down/up
+if [[ -f /usr/lib/systemd/system/systemd-network-generator.service ]] ; then
+ mkdir /etc/systemd/system/systemd-network-generator.service.d/
+ echo "[Unit]" > /etc/systemd/system/systemd-network-generator.service.d/10_disable_nbd.conf
+ echo "ConditionKernelCommandLine=!nbd.server" >> /etc/systemd/system/systemd-network-generator.service.d/10_disable_nbd.conf
+fi
+
+
# also use /proc/net/pnp to generate /etc/resolv.conf
rm -f /etc/resolv.conf
grep -v bootserver /proc/net/pnp | sed 's/^domain/search/g' >/etc/resolv.conf
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-systemd-Do-not-override-rootprefix.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-systemd-Do-not-override-rootprefix.patch
deleted file mode 100644
index 45d09e6b0..000000000
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-systemd-Do-not-override-rootprefix.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 2501972518a67b1710998452d164cd077a4370f1 Mon Sep 17 00:00:00 2001
-From: Scott Murray <scott.murray@konsulko.com>
-Date: Thu, 17 Mar 2022 10:44:00 -0400
-Subject: [PATCH] systemd: Do not override rootprefix
-
-Do not override rootprefix with the value of prefix when querying
-systemdsystemunitdir from the systemd pkgconfig, as doing so forces
-the assumption that the system is running with usrmerge, which may
-not be the case. Instead, rely on the systemd.pc correctly
-representing the desired install locations.
-
-Reworked version of change in:
-
-https://git.automotivelinux.org/AGL/meta-agl/tree/meta-pipewire/recipes-multimedia/pipewire/pipewire/0012-Miscellanous-changes-to-account-for-lower-version-of.patch
-
-Upstream-Status: Pending
-
-Signed-off-by: Scott Murray <scott.murray@konsulko.com>
----
- src/daemon/systemd/system/meson.build | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/daemon/systemd/system/meson.build b/src/daemon/systemd/system/meson.build
-index 84ca0b068..6956f2be3 100644
---- a/src/daemon/systemd/system/meson.build
-+++ b/src/daemon/systemd/system/meson.build
-@@ -1,4 +1,4 @@
--systemd_system_services_dir = systemd.get_variable('systemdsystemunitdir', pkgconfig_define : [ 'rootprefix', prefix])
-+systemd_system_services_dir = systemd.get_variable('systemdsystemunitdir')
- if get_option('systemd-system-unit-dir') != ''
- systemd_system_services_dir = get_option('systemd-system-unit-dir')
- endif
---
-2.35.1
-
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire_1.0.0.bbappend b/meta-pipewire/recipes-multimedia/pipewire/pipewire_1.%.bbappend
index beb7c0817..a25204093 100644
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire_1.0.0.bbappend
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire_1.%.bbappend
@@ -1,13 +1,9 @@
-SRC_URI += "\
- file://0001-systemd-Do-not-override-rootprefix.patch \
-"
-
-PACKAGECONFIG = "\
+PACKAGECONFIG:class-target = "\
${@bb.utils.contains('DISTRO_FEATURES', 'bluez5', 'bluez', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'alsa', 'alsa pipewire-alsa', '', d)} \
- ${@bb.utils.contains('DISTRO_FEATURES', 'agl-devel', 'sndfile', '', d)} \
- ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)} \
- gstreamer v4l2 \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'agl-devel', 'sndfile pw-cat readline', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd systemd-system-service', '', d)} \
+ gstreamer v4l2 wireplumber \
"
do_install:append() {
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire_1.0.0.bb b/meta-pipewire/recipes-multimedia/pipewire/pipewire_1.0.0.bb
deleted file mode 100644
index 6fa851caa..000000000
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire_1.0.0.bb
+++ /dev/null
@@ -1,329 +0,0 @@
-# This recipe was written by Carlos Rafael Giani <crg7475@mailbox.org>
-# for meta-oe
-#
-# The intention is to keep this synced with meta-oe and remove it when we
-# can depend on meta-oe to provide this recipe for us
-#
-# AGL-specific overrides and configuration should go in the .bbappend file
-#
-SUMMARY = "Multimedia processing server for Linux"
-DESCRIPTION = "Linux server for handling and routing audio and video streams between applications and multimedia I/O devices"
-HOMEPAGE = "https://pipewire.org/"
-BUGTRACKER = "https://gitlab.freedesktop.org/pipewire/pipewire/issues"
-LICENSE = "MIT & GPL-2.0-only & LGPL-2.1-or-later"
-
-LIC_FILES_CHKSUM = " \
- file://LICENSE;md5=2158739e172e58dc9ab1bdd2d6ec9c72 \
- file://COPYING;md5=97be96ca4fab23e9657ffa590b931c1a \
-"
-SECTION = "multimedia"
-
-DEPENDS = "dbus"
-
-# v1.0.0(El Presidente)
-SRCREV = "4debdcd40b055b3eaa83a8f4443aa990ea566bfe"
-SRC_URI = "git://gitlab.freedesktop.org/pipewire/pipewire.git;branch=master;protocol=https"
-
-S = "${WORKDIR}/git"
-
-inherit meson pkgconfig systemd manpages gettext useradd
-
-USERADD_PACKAGES = "${PN}"
-
-GROUPADD_PARAM:${PN} = "--system pipewire"
-
-USERADD_PARAM:${PN} = "--system --home / --no-create-home \
- --comment 'PipeWire multimedia daemon' \
- --gid pipewire --groups audio,video \
- pipewire"
-
-# For "EVL", look up https://evlproject.org/ . It involves
-# a specially prepared kernel, and is currently unavailable
-# in Yocto.
-#
-# FFmpeg and Vulkan aren't really supported - at the current
-# stage (version 0.3.22), these are just experiments, not
-# actual features.
-#
-# libcamera support currently does not build successfully.
-#
-# systemd user service files are disabled because per-user
-# PipeWire instances aren't really something that makes
-# much sense in an embedded environment. A system-wide
-# instance does.
-#
-# manpage generation requires xmltoman, which is not available.
-#
-# Dont build any session managers along with pipewire
-# wireplumber is the session manger used in AGL and it will
-# be build in a different recipe
-#
-EXTRA_OEMESON += " \
- -Daudiotestsrc=enabled \
- -Devl=disabled \
- -Dsystemd-user-service=disabled \
- -Dtests=disabled \
- -Dudevrulesdir=${nonarch_base_libdir}/udev/rules.d/ \
- -Dvideotestsrc=enabled \
- -Dffmpeg=disabled \
- -Dvulkan=disabled \
- -Dlibcamera=disabled \
- -Dman=disabled \
- -Dsession-managers=[] \
-"
-
-PACKAGECONFIG ??= "\
- ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \
- ${@bb.utils.filter('DISTRO_FEATURES', 'alsa systemd', d)} \
- gstreamer jack v4l2 \
-"
-
-# "jack" and "pipewire-jack" packageconfigs cannot be both enabled,
-# since "jack" imports libjack, and "pipewire-jack" generates
-# libjack.so* files, thus colliding with the libpack package. This
-# is why these two are marked in their respective packageconfigs
-# as being in conflict.
-
-PACKAGECONFIG[alsa] = "-Dalsa=enabled,-Dalsa=disabled,alsa-lib udev,,pipewire-alsa-card-profile"
-PACKAGECONFIG[bluez] = "-Dbluez5=enabled,-Dbluez5=disabled,bluez5 sbc"
-PACKAGECONFIG[docs] = "-Ddocs=enabled,-Ddocs=disabled,doxygen-native"
-PACKAGECONFIG[gstreamer] = "-Dgstreamer=enabled,-Dgstreamer=disabled,glib-2.0 gstreamer1.0 gstreamer1.0-plugins-base"
-PACKAGECONFIG[jack] = "-Djack=enabled,-Djack=disabled,jack,,,pipewire-jack"
-PACKAGECONFIG[sdl2] = "-Dsdl2=enabled,-Dsdl2=disabled,virtual/libsdl2"
-PACKAGECONFIG[sndfile] = "-Dsndfile=enabled,-Dsndfile=disabled,libsndfile1"
-PACKAGECONFIG[systemd] = "-Dsystemd=enabled -Dsystemd-system-service=enabled ,-Dsystemd=disabled -Dsystemd-system-service=disabled,systemd"
-PACKAGECONFIG[v4l2] = "-Dv4l2=enabled,-Dv4l2=disabled,udev"
-PACKAGECONFIG[pipewire-alsa] = "-Dpipewire-alsa=enabled,-Dpipewire-alsa=disabled,alsa-lib"
-PACKAGECONFIG[pipewire-jack] = "-Dpipewire-jack=enabled -Dlibjack-path=${libdir}/${PW_MODULE_SUBDIR}/jack,-Dpipewire-jack=disabled,jack,,,jack"
-PACKAGECONFIG[pipewire-v4l2] = "-Dpipewire-v4l2=enabled -Dpipewire-v4l2=${libdir}/${PW_MODULE_SUBDIR}/v4l2,-Dpipewire-v4l2=disabled,v4l2"
-
-PACKAGESPLITFUNCS:prepend = " split_dynamic_packages "
-PACKAGESPLITFUNCS:append = " set_dynamic_metapkg_rdepends "
-PACKAGESPLITFUNCS:append = " fixup_dynamic_pkg_licenses "
-
-SPA_SUBDIR = "spa-0.2"
-PW_MODULE_SUBDIR = "pipewire-0.3"
-
-remove_unused_installed_files() {
- # jack.conf is used by pipewire-jack (not the JACK SPA plugin).
- # Remove it if pipewire-jack is not built to avoid creating the
- # pipewire-jack package.
- if ${@bb.utils.contains('PACKAGECONFIG', 'pipewire-jack', 'false', 'true', d)}; then
- rm -f "${D}${datadir}/pipewire/jack.conf"
- fi
-}
-
-do_install[postfuncs] += "remove_unused_installed_files"
-
-python fixup_dynamic_pkg_licenses () {
- #dynamic packages inherit currently whatever is specified in LICENSE (thus multiple)
- packages = (d.getVar('PACKAGES') or "").split()
-
- for pkg in packages:
- # we manually assign the LICENSES here to cover all packages (even dynamically created ones)
- d.setVar("LICENSE:" + pkg ,"MIT")
-
- # next handle special cases
- # ==> LICENSE:${PN}-spa-plugins-alsa = "LGPL-2.1-or-later"
- if "pipewire-spa-plugins-alsa" in pkg:
- d.setVar("LICENSE:pipewire-spa-plugins-alsa", "LGPL-2.1-or-later")
- # ==> LICENSE:${PN}-alsa-card-profile = "LGPL-2.1-or-later"
- if "pipewire-alsa-card-profile" in pkg:
- d.setVar("LICENSE:pipewire-alsa-card-profile", "LGPL-2.1-or-later")
- # ==> LICENSE:${PN}-jack = "GPL-2.0-only"
- if "pipewire-jack" in pkg:
- d.setVar("LICENSE:pipewire-jack", "GPL-2.0-only")
-}
-
-python split_dynamic_packages () {
- # Create packages for each SPA plugin. These plugins are located
- # in individual subdirectories, so a recursive search is needed.
- spa_libdir = d.expand('${libdir}/${SPA_SUBDIR}')
- do_split_packages(d, spa_libdir, r'^libspa-(.*)\.so$', d.expand('${PN}-spa-plugins-%s'), 'PipeWire SPA plugin for %s', extra_depends='', recursive=True)
-
- # Create packages for each PipeWire module.
- pw_module_libdir = d.expand('${libdir}/${PW_MODULE_SUBDIR}')
- do_split_packages(d, pw_module_libdir, r'^libpipewire-module-(.*)\.so$', d.expand('${PN}-modules-%s'), 'PipeWire %s module', extra_depends='', recursive=False)
-}
-
-python set_dynamic_metapkg_rdepends () {
- import os
- import oe.utils
-
- # Go through all generated SPA plugin and PipeWire module packages
- # (excluding the main package and the -meta package itself) and
- # add them to the -meta package as RDEPENDS.
-
- base_pn = d.getVar('PN')
-
- spa_pn = base_pn + '-spa-plugins'
- spa_metapkg = spa_pn + '-meta'
-
- pw_module_pn = base_pn + '-modules'
- pw_module_metapkg = pw_module_pn + '-meta'
-
- d.setVar('ALLOW_EMPTY:' + spa_metapkg, "1")
- d.setVar('FILES:' + spa_metapkg, "")
-
- d.setVar('ALLOW_EMPTY:' + pw_module_metapkg, "1")
- d.setVar('FILES:' + pw_module_metapkg, "")
-
- blacklist = [ spa_pn, spa_metapkg, pw_module_pn, pw_module_metapkg ]
- spa_metapkg_rdepends = []
- pw_module_metapkg_rdepends = []
- pkgdest = d.getVar('PKGDEST')
-
- for pkg in oe.utils.packages_filter_out_system(d):
- if pkg in blacklist:
- continue
-
- is_spa_pkg = pkg.startswith(spa_pn)
- is_pw_module_pkg = pkg.startswith(pw_module_pn)
- if not is_spa_pkg and not is_pw_module_pkg:
- continue
-
- if pkg in spa_metapkg_rdepends or pkg in pw_module_metapkg_rdepends:
- continue
-
- # See if the package is empty by looking at the contents of its
- # PKGDEST subdirectory. If this subdirectory is empty, then then
- # package is empty as well. Empty packages do not get added to
- # the meta package's RDEPENDS.
- pkgdir = os.path.join(pkgdest, pkg)
- if os.path.exists(pkgdir):
- dir_contents = os.listdir(pkgdir) or []
- else:
- dir_contents = []
- is_empty = len(dir_contents) == 0
- if not is_empty:
- if is_spa_pkg:
- spa_metapkg_rdepends.append(pkg)
- if is_pw_module_pkg:
- pw_module_metapkg_rdepends.append(pkg)
-
- d.setVar('RDEPENDS:' + spa_metapkg, ' '.join(spa_metapkg_rdepends))
- d.setVar('DESCRIPTION:' + spa_metapkg, spa_pn + ' meta package')
-
- d.setVar('RDEPENDS:' + pw_module_metapkg, ' '.join(pw_module_metapkg_rdepends))
- d.setVar('DESCRIPTION:' + pw_module_metapkg, pw_module_pn + ' meta package')
-}
-
-PACKAGES =+ "\
- libpipewire \
- ${PN}-tools \
- ${PN}-pulse \
- ${PN}-alsa \
- ${PN}-jack \
- ${PN}-v4l2 \
- ${PN}-spa-plugins \
- ${PN}-spa-plugins-meta \
- ${PN}-spa-tools \
- ${PN}-modules \
- ${PN}-modules-meta \
- ${PN}-alsa-card-profile \
- gstreamer1.0-pipewire \
-"
-
-PACKAGES_DYNAMIC = "^${PN}-spa-plugins.* ^${PN}-modules.*"
-
-SYSTEMD_SERVICE:${PN} = "pipewire.service"
-CONFFILES:${PN} += "${datadir}/pipewire/pipewire.conf"
-FILES:${PN} = " \
- ${datadir}/pipewire/pipewire.conf \
- ${datadir}/pipewire/filter-chain.conf \
- ${datadir}/pipewire/filter-chain \
- ${systemd_user_unitdir}/pipewire.* \
- ${systemd_system_unitdir}/pipewire* \
- ${bindir}/pipewire \
- ${datadir}/pipewire/pipewire-avb.conf \
- ${bindir}/pipewire-avb \
- ${datadir}/pipewire/pipewire-aes67.conf \
- ${bindir}/pipewire-aes67 \
- ${datadir}/pipewire/pipewire.conf.avail \
- ${datadir}/pipewire/pipewire-pulse.conf.avail \
- ${datadir}/pipewire/client-rt.conf.avail \
- ${datadir}/pipewire/client.conf.avail \
- ${sysconfdir}/security/limits.d \
-"
-
-FILES:${PN}-dev += " \
- ${libdir}/${PW_MODULE_SUBDIR}/jack/libjack*.so \
-"
-
-CONFFILES:libpipewire += "${datadir}/pipewire/client.conf"
-FILES:libpipewire = " \
- ${datadir}/pipewire/client.conf \
- ${datadir}/pipewire/client-rt.conf \
- ${datadir}/pipewire/minimal.conf \
- ${libdir}/libpipewire-*.so.* \
-"
-# Add the bare minimum modules and plugins required to be able
-# to use libpipewire. Without these, it is essentially unusable.
-RDEPENDS:libpipewire += " \
- ${PN}-modules-client-node \
- ${PN}-modules-protocol-native \
- ${PN}-spa-plugins-support \
-"
-
-FILES:${PN}-tools = " \
- ${bindir}/pw-* \
-"
-
-# This is a shim daemon that is intended to be used as a
-# drop-in PulseAudio replacement, providing a pulseaudio-compatible
-# socket that can be used by applications that use libpulse.
-CONFFILES:${PN}-pulse += "${datadir}/pipewire/pipewire-pulse.conf"
-
-FILES:${PN}-pulse = " \
- ${datadir}/pipewire/pipewire-pulse.conf \
- ${systemd_user_unitdir}/pipewire-pulse.* \
- ${bindir}/pipewire-pulse \
-"
-RDEPENDS:${PN}-pulse += " \
- ${PN}-modules-protocol-pulse \
-"
-
-# alsa plugin to redirect audio to pipewire
-FILES:${PN}-alsa = "\
- ${libdir}/alsa-lib/* \
- ${datadir}/alsa/alsa.conf.d/* \
-"
-
-#lib to emulate v4l2 system calls on top of PipeWire
-FILES:${PN}-v4l2 = "\
- ${libdir}/${PW_MODULE_SUBDIR}/v4l2/libpw-v4l2.so \
-"
-
-# jack drop-in libraries to redirect audio to pipewire
-CONFFILES:${PN}-jack = "${datadir}/pipewire/jack.conf"
-FILES:${PN}-jack = "\
- ${datadir}/pipewire/jack.conf \
- ${libdir}/${PW_MODULE_SUBDIR}/jack/libjack*.so.* \
-"
-# Dynamic packages (see set_dynamic_metapkg_rdepends).
-FILES:${PN}-spa-plugins-bluez5 += " \
- ${datadir}/${SPA_SUBDIR}/bluez5/bluez-hardware.conf \
-"
-RRECOMMENDS:${PN}-spa-plugins += "${PN}-spa-plugins-meta"
-
-FILES:${PN}-spa-tools = " \
- ${bindir}/spa-* \
-"
-
-# Dynamic packages (see set_dynamic_metapkg_rdepends).
-FILES:${PN}-modules = ""
-RRECOMMENDS:${PN}-modules += "${PN}-modules-meta"
-
-CONFFILES:${PN}-modules-rtkit = "${datadir}/pipewire/client-rt.conf"
-FILES:${PN}-modules-rtkit += " \
- ${datadir}/pipewire/client-rt.conf \
- "
-
-FILES:${PN}-alsa-card-profile = " \
- ${datadir}/alsa-card-profile/* \
- ${nonarch_base_libdir}/udev/rules.d/90-pipewire-alsa.rules \
-"
-
-FILES:gstreamer1.0-pipewire = " \
- ${libdir}/gstreamer-1.0/* \
-"
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/00-functions.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/00-functions.lua
deleted file mode 100644
index 7e1794df0..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/00-functions.lua
+++ /dev/null
@@ -1,27 +0,0 @@
-components = {}
-
-function load_module(m)
- if not components[m] then
- components[m] = { "libwireplumber-module-" .. m, type = "module" }
- end
-end
-
-function load_pw_module(m)
- if not components[m] then
- components[m] = { "libpipewire-module-" .. m, type = "pw_module" }
- end
-end
-
-function load_script(s, a)
- if not components[s] then
- components[s] = { s, type = "script/lua", args = a }
- end
-end
-
-function load_monitor(s, a)
- load_script("monitors/" .. s .. ".lua", a)
-end
-
-function load_access(s, a)
- load_script("access/access-" .. s .. ".lua", a)
-end
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-log.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-log.conf
new file mode 100644
index 000000000..7dc8938fc
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-log.conf
@@ -0,0 +1,5 @@
+context.properties = {
+ # F=fatal, E=critical, W=warning, N=notice, I=info, D=debug, T=trace
+ # See https://pipewire.pages.freedesktop.org/wireplumber/daemon/logging.html
+ log.level = "N"
+}
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-profiles.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-profiles.conf
new file mode 100644
index 000000000..d029887df
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/20-AGL-profiles.conf
@@ -0,0 +1,29 @@
+# This configuration fragment sets up the split-instance profiles to include
+# the standard "embedded" configuration of running systemwide without
+# maintaining user state across reboots.
+# In addition, runtime settings support is disabled on the device monitor
+# instances, as it depends on the "sm-settings" metadata, which lives on the
+# policy instance. In containerized setups (such as the IC demo), the policy
+# instance runs in a container and the device monitors should not wait for it
+# or depend on it in any other way.
+
+wireplumber.profiles = {
+ policy = {
+ inherits = [ mixin.systemwide-session, mixin.stateless ]
+ }
+
+ audio = {
+ inherits = [ mixin.systemwide-session, mixin.stateless ]
+ support.settings = disabled
+ }
+
+ bluetooth = {
+ inherits = [ mixin.systemwide-session, mixin.stateless ]
+ support.settings = disabled
+ }
+
+ video-capture = {
+ inherits = [ mixin.systemwide-session, mixin.stateless ]
+ support.settings = disabled
+ }
+}
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-alsa.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-alsa.conf
new file mode 100644
index 000000000..9af95413b
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-alsa.conf
@@ -0,0 +1,111 @@
+# Default AGL WirePlumber ALSA monitor configuration
+
+monitor.alsa.rules = [
+ #
+ # Bump priority of well-known output devices
+ # Higher priority means it gets selected as the default if it's present
+ #
+
+ # USB output
+ {
+ matches = [
+ {
+ node.name = "~alsa_output.*"
+ api.alsa.card.driver = "USB-Audio"
+ }
+ ]
+ actions = {
+ update-props = {
+ priority.driver = 1300
+ priority.session = 1300
+ }
+ }
+ }
+
+ # USB input
+ {
+ matches = [
+ {
+ node.name = "~alsa_input.*"
+ api.alsa.card.driver = "USB-Audio"
+ }
+ ]
+ actions = {
+ update-props = {
+ priority.driver = 2300
+ priority.session = 2300
+ }
+ }
+ }
+
+ # well-known internal output devices
+ {
+ matches = [
+ # ak4613
+ {
+ node.name = "~alsa_output.*"
+ api.alsa.card.id = "ak4613"
+ api.alsa.pcm.device = "0"
+ }
+ # imx8mq
+ {
+ node.name = "~alsa_output.*"
+ api.alsa.card.id = "wm8524audio"
+ }
+ # rcarsound
+ {
+ node.name = "~alsa_output.*"
+ api.alsa.card.id = "rcarsound"
+ api.alsa.pcm.device = "0"
+ }
+ # rpi3
+ {
+ node.name = "~alsa_output.*"
+ api.alsa.pcm.name = "bcm2835 ALSA"
+ }
+ # nanopc-t6
+ {
+ node.name = "~alsa_output.*"
+ api.alsa.card.id = "realtekrt5616co"
+ }
+ ]
+ actions = {
+ update-props = {
+ priority.driver = 1100
+ priority.session = 1100
+ }
+ }
+ }
+
+ # well-known internal input devices
+ {
+ matches = [
+ # ak4613
+ {
+ node.name = "~alsa_input.*"
+ api.alsa.card.id = "ak4613"
+ }
+ # imx8mq
+ {
+ node.name = "~alsa_input.*"
+ api.alsa.card.id = "wm8524audio"
+ }
+ # rcarsound
+ {
+ node.name = "~alsa_input.*"
+ api.alsa.card.id = "rcarsound"
+ }
+ # nanopc-t6
+ {
+ node.name = "~alsa_input.*"
+ api.alsa.card.id = "realtekrt5616co"
+ }
+ ]
+ actions = {
+ update-props = {
+ priority.driver = 2100
+ priority.session = 2100
+ }
+ }
+ }
+]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-bluetooth.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-bluetooth.conf
new file mode 100644
index 000000000..db5b20dc2
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/30-AGL-bluetooth.conf
@@ -0,0 +1,41 @@
+# Default AGL WirePlumber Bluetooth monitor configuration
+
+monitor.bluez.properties = {
+ ## HFP/HSP backend (default: native).
+ ## Available values: any, none, hsphfpd, ofono, native
+ bluez5.hfphsp-backend = "ofono"
+}
+
+monitor.bluez.rules = [
+ {
+ matches = [
+ {
+ ## This matches all bluetooth devices.
+ device.name = "~bluez_card.*"
+ }
+ ]
+ actions = {
+ update-props = {
+ ## Auto-connect as headset/sink on start up or when only partial
+ ## profiles have connected.
+ bluez5.auto-connect = [ hfp_hf hsp_hs a2dp_sink ]
+ }
+ }
+ }
+
+ # Make output a2dp stream nodes go through the Multimedia sink
+ # We cannot match on "media.class" here because this property
+ # is not known before the node is created
+ {
+ matches = [
+ {
+ api.bluez5.profile = "a2dp-source"
+ }
+ ]
+ actions = {
+ update-props = {
+ media.role = "Multimedia"
+ }
+ }
+ }
+]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/50-AGL-pw-ic-ipc.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/50-AGL-pw-ic-ipc.conf
new file mode 100644
index 000000000..93687501c
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/50-AGL-pw-ic-ipc.conf
@@ -0,0 +1,15 @@
+wireplumber.profiles = {
+ # Run on the "audio" instance, which runs the ALSA monitor on the host
+ audio = {
+ agl.script.pipewire-ic-ipc.alsa-suspend = required
+ }
+}
+
+wireplumber.components = [
+ # Mutes ALSA sinks when requested by pipewire-ic-ipc
+ {
+ name = alsa-suspend.lua, type = script/lua
+ provides = agl.script.pipewire-ic-ipc.alsa-suspend
+ requires = [ api.mixer ]
+ }
+]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.conf
deleted file mode 100644
index 9077e3f45..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.conf
+++ /dev/null
@@ -1,74 +0,0 @@
-# WirePlumber daemon context configuration #
-
-context.properties = {
- ## Properties to configure the PipeWire context and some modules
-
- application.name = "WirePlumber Bluetooth"
- log.level = 2
- wireplumber.script-engine = lua-scripting
- wireplumber.export-core = true
-
- #mem.mlock-all = false
- #support.dbus = true
-}
-
-context.spa-libs = {
- #<factory-name regex> = <library-name>
- #
- # Used to find spa factory names. It maps an spa factory name
- # regular expression to a library name that should contain
- # that factory.
- #
- api.bluez5.* = bluez5/libspa-bluez5
- audio.convert.* = audioconvert/libspa-audioconvert
- support.* = support/libspa-support
-}
-
-context.modules = [
- #{ name = <module-name>
- # [ args = { <key> = <value> ... } ]
- # [ flags = [ [ ifexists ] [ nofail ] ]
- #}
- #
- # PipeWire modules to load.
- # If ifexists is given, the module is ignored when it is not found.
- # If nofail is given, module initialization failures are ignored.
- #
-
- # The native communication protocol.
- { name = libpipewire-module-protocol-native }
-
- # Allows creating nodes that run in the context of the
- # client. Is used by all clients that want to provide
- # data to PipeWire.
- { name = libpipewire-module-client-node }
-
- # Allows creating devices that run in the context of the
- # client. Is used by the session manager.
- { name = libpipewire-module-client-device }
-
- # Makes a factory for wrapping nodes in an adapter with a
- # converter and resampler.
- { name = libpipewire-module-adapter }
-
- # Allows applications to create metadata objects. It creates
- # a factory for Metadata objects.
- { name = libpipewire-module-metadata }
-
- # Provides factories to make session manager objects.
- { name = libpipewire-module-session-manager }
-]
-
-wireplumber.components = [
- #{ name = <component-name>, type = <component-type> }
- #
- # WirePlumber components to load
- #
-
- # The lua scripting engine
- { name = libwireplumber-module-lua-scripting, type = module }
-
- # The lua configuration file
- # Other components are loaded from there
- { name = bluetooth.lua, type = config/lua }
-]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.lua.d/30-bluez-monitor.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.lua.d/30-bluez-monitor.lua
deleted file mode 100644
index 530f4cc62..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/bluetooth.lua.d/30-bluez-monitor.lua
+++ /dev/null
@@ -1,110 +0,0 @@
--- Bluez monitor config file --
-
-bluez_monitor = {}
-
-bluez_monitor.properties = {
- -- These features do not work on all headsets, so they are enabled
- -- by default based on the hardware database. They can also be
- -- forced on/off for all devices by the following options:
-
- --["bluez5.enable-sbc-xq"] = true,
- --["bluez5.enable-msbc"] = true,
- --["bluez5.enable-hw-volume"] = true,
-
- -- See bluez-hardware.conf for the hardware database.
-
- -- Enabled headset roles (default: [ hsp_hs hfp_ag ]), this
- -- property only applies to native backend. Currently some headsets
- -- (Sony WH-1000XM3) are not working with both hsp_ag and hfp_ag
- -- enabled, disable either hsp_ag or hfp_ag to work around it.
- --
- -- Supported headset roles: hsp_hs (HSP Headset),
- -- hsp_ag (HSP Audio Gateway),
- -- hfp_hf (HFP Hands-Free),
- -- hfp_ag (HFP Audio Gateway)
- ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]",
-
- -- Enabled A2DP codecs (default: all).
- --["bluez5.codecs"] = "[ sbc sbc_xq aac ldac aptx aptx_hd aptx_ll aptx_ll_duplex faststream faststream_duplex ]",
-
- -- HFP/HSP backend (default: native).
- -- Available values: any, none, hsphfpd, ofono, native
- ["bluez5.hfphsp-backend"] = "ofono",
-
- -- Properties for the A2DP codec configuration
- --["bluez5.default.rate"] = 48000,
- --["bluez5.default.channels"] = 2,
-}
-
-bluez_monitor.rules = {
- -- An array of matches/actions to evaluate.
- {
- -- Rules for matching a device or node. It is an array of
- -- properties that all need to match the regexp. If any of the
- -- matches work, the actions are executed for the object.
- matches = {
- {
- -- This matches all cards.
- { "device.name", "matches", "bluez_card.*" },
- },
- },
- -- Apply properties on the matched object.
- apply_properties = {
- -- Auto-connect device profiles on start up or when only partial
- -- profiles have connected. Disabled by default if the property
- -- is not specified.
- --["bluez5.auto-connect"] = "[ hfp_hf hsp_hs a2dp_sink hfp_ag hsp_ag a2dp_source ]",
- ["bluez5.auto-connect"] = "[ hfp_hf hsp_hs a2dp_sink ]",
-
- -- Hardware volume control (default: [ hfp_ag hsp_ag a2dp_source ])
- --["bluez5.hw-volume"] = "[ hfp_hf hsp_hs a2dp_sink hfp_ag hsp_ag a2dp_source ]",
-
- -- LDAC encoding quality
- -- Available values: auto (Adaptive Bitrate, default)
- -- hq (High Quality, 990/909kbps)
- -- sq (Standard Quality, 660/606kbps)
- -- mq (Mobile use Quality, 330/303kbps)
- --["bluez5.a2dp.ldac.quality"] = "auto",
-
- -- AAC variable bitrate mode
- -- Available values: 0 (cbr, default), 1-5 (quality level)
- --["bluez5.a2dp.aac.bitratemode"] = 0,
-
- -- Profile connected first
- -- Available values: a2dp-sink (default), headset-head-unit
- --["device.profile"] = "a2dp-sink",
- },
- },
- {
- -- Make output hsp/hfp stream nodes go through the Communication endpoint
- -- Unfortunately we cannot match on "media.class" because this property
- -- is not known before the node is created
- matches = {
- {
- { "api.bluez5.profile", "equals", "headset-audio-gateway" },
- { "factory.name", "matches", "*source*" },
- },
- },
- apply_properties = {
- ["media.role"] = "Communication",
- },
- },
- {
- -- Make output a2dp stream nodes go through the Multimedia endpoint
- -- Unfortunately we cannot match on "media.class" because this property
- -- is not known before the node is created
- matches = {
- {
- { "api.bluez5.profile", "equals", "a2dp-source" },
- },
- },
- apply_properties = {
- ["media.role"] = "Multimedia",
- },
- },
-}
-
-load_monitor("bluez", {
- properties = bluez_monitor.properties,
- rules = bluez_monitor.rules,
-})
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-alsa-monitor.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-alsa-monitor.lua
deleted file mode 100644
index d07f7ab85..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-alsa-monitor.lua
+++ /dev/null
@@ -1,151 +0,0 @@
--- ALSA monitor config file --
-
-alsa_monitor = {}
-
-alsa_monitor.properties = {
- ["alsa.jack-device"] = false,
- ["alsa.reserve"] = false,
-}
-
-alsa_monitor.rules = {
- -- enable ACP (PulseAudio-like profiles)
- {
- matches = {
- {
- { "device.name", "matches", "alsa_card.*" },
- },
- },
- apply_properties = {
- ["api.alsa.use-acp"] = true,
- },
- },
-
- --
- -- Bump priority of well-known output devices
- -- Higher priority means it gets selected as the default if it's present
- --
-
- -- USB card
- {
- matches = {
- {
- { "node.name", "matches", "alsa_output.*" },
- { "api.alsa.card.driver", "=", "USB-Audio" },
- },
- },
- apply_properties = {
- ["priority.driver"] = 1300,
- ["priority.session"] = 1300,
- }
- },
-
- -- fiberdyne amp
- {
- matches = {
- {
- { "node.name", "matches", "alsa_output.*" },
- { "api.alsa.card.id", "=", "ep016ch" },
- },
- },
- apply_properties = {
- ["priority.driver"] = 1200,
- ["priority.session"] = 1200,
- }
- },
-
- -- well-known internal devices
- {
- matches = {
- {
- -- ak4613
- { "node.name", "matches", "alsa_output.*" },
- { "api.alsa.card.id", "=", "ak4613" },
- { "api.alsa.pcm.device", "=", "0" },
- },
- {
- -- imx8mq
- { "node.name", "matches", "alsa_output.*" },
- { "api.alsa.card.id", "=", "wm8524audio" },
- },
- {
- -- rcarsound
- { "node.name", "matches", "alsa_output.*" },
- { "api.alsa.card.id", "=", "rcarsound" },
- { "api.alsa.pcm.device", "=", "0" },
- },
- {
- -- rpi3
- { "node.name", "matches", "alsa_output.*" },
- { "api.alsa.pcm.name", "=", "bcm2835 ALSA" },
- },
- },
- apply_properties = {
- ["priority.driver"] = 1100,
- ["priority.session"] = 1100,
- }
- },
-
- --
- -- Same for input devices
- --
-
- -- USB card
- {
- matches = {
- {
- { "node.name", "matches", "alsa_input.*" },
- { "api.alsa.card.driver", "=", "USB-Audio" },
- },
- },
- apply_properties = {
- ["priority.driver"] = 2300,
- ["priority.session"] = 2300,
- }
- },
-
- -- microchip mic
- {
- matches = {
- {
- { "node.name", "matches", "alsa_input.*" },
- { "api.alsa.card.id", "=", "ep811ch" },
- },
- },
- apply_properties = {
- ["priority.driver"] = 2200,
- ["priority.session"] = 2200,
- }
- },
-
- -- well-known internal devices
- {
- matches = {
- {
- -- ak4613
- { "node.name", "matches", "alsa_input.*" },
- { "api.alsa.card.id", "=", "ak4613" },
- },
- {
- -- imx8mq
- { "node.name", "matches", "alsa_input.*" },
- { "api.alsa.card.id", "=", "wm8524audio" },
- },
- {
- -- rcarsound
- { "node.name", "matches", "alsa_input.*" },
- { "api.alsa.card.id", "=", "rcarsound" },
- },
- },
- apply_properties = {
- ["priority.driver"] = 2100,
- ["priority.session"] = 2100,
- }
- },
-}
-
-function alsa_monitor.enable()
- load_monitor("alsa", {
- properties = alsa_monitor.properties,
- rules = alsa_monitor.rules,
- })
-end
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-v4l2-monitor.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-v4l2-monitor.lua
deleted file mode 100644
index a4eb58ac8..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/30-v4l2-monitor.lua
+++ /dev/null
@@ -1,48 +0,0 @@
--- V4L2 monitor config file --
-
-v4l2_monitor = {}
-v4l2_monitor.properties = {}
-
-v4l2_monitor.rules = {
- -- An array of matches/actions to evaluate.
- {
- -- Rules for matching a device or node. It is an array of
- -- properties that all need to match the regexp. If any of the
- -- matches work, the actions are executed for the object.
- matches = {
- {
- -- This matches all cards.
- { "device.name", "matches", "v4l2_device.*" },
- },
- },
- -- Apply properties on the matched object.
- apply_properties = {
- -- ["device.nick"] = "My Device",
- },
- },
- {
- matches = {
- {
- -- Matches all sources.
- { "node.name", "matches", "v4l2_input.*" },
- },
- {
- -- Matches all sinks.
- { "node.name", "matches", "v4l2_output.*" },
- },
- },
- apply_properties = {
- --["node.nick"] = "My Node",
- --["priority.driver"] = 100,
- --["priority.session"] = 100,
- --["node.pause-on-idle"] = false,
- },
- },
-}
-
-function v4l2_monitor.enable()
- load_monitor("v4l2", {
- properties = v4l2_monitor.properties,
- rules = v4l2_monitor.rules,
- })
-end
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/40-device-defaults.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/40-device-defaults.lua
deleted file mode 100644
index e0d332422..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/40-device-defaults.lua
+++ /dev/null
@@ -1,26 +0,0 @@
-device_defaults = {}
-
-device_defaults.properties = {
- -- store preferences to the file system and restore them at startup;
- -- when set to false, default nodes and routes are selected based on
- -- their priorities and any runtime changes do not persist after restart
- ["use-persistent-storage"] = false,
-}
-
-function device_defaults.enable()
- -- Selects appropriate default nodes and enables saving and restoring them
- load_module("default-nodes", device_defaults.properties)
-
- -- Selects appropriate default routes ("ports" in pulseaudio terminology)
- -- and enables saving and restoring them together with
- -- their properties (per-route/port volume levels, channel maps, etc)
- load_script("policy-device-routes.lua", device_defaults.properties)
-
- if device_defaults.properties["use-persistent-storage"] then
- -- Enables functionality to save and restore default device profiles
- load_module("default-profile")
-
- -- Save and restore stream-specific properties
- load_script("restore-stream.lua")
- end
-end
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/90-enable-all.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/90-enable-all.lua
deleted file mode 100644
index ecb7da476..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/host.lua.d/90-enable-all.lua
+++ /dev/null
@@ -1,20 +0,0 @@
--- Provide the "default" pw_metadata, which stores
--- dynamic properties of pipewire objects in RAM
-load_module("metadata")
-
--- Load devices
-alsa_monitor.enable()
-v4l2_monitor.enable()
-
--- Track/store/restore user choices about devices
-device_defaults.enable()
-
--- Automatically suspends idle nodes after 3 seconds
-load_script("suspend-node.lua")
-
--- Automatically sets device profiles to 'On'
-load_script("policy-device-profile.lua")
-
--- Mute ALSA sinks when requested by pipewire-ic-ipc
-load_module("mixer-api")
-load_script("alsa-suspend.lua")
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/wireplumber.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/wireplumber.conf
deleted file mode 100644
index 46ad11302..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl/wireplumber.conf
+++ /dev/null
@@ -1,115 +0,0 @@
-# WirePlumber daemon context configuration #
-
-context.properties = {
- ## Properties to configure the PipeWire context and some modules
-
- # 1=error/critical/warning, 2=message, 3=info, 4=debug, 5=trace
- log.level = 2
-
- wireplumber.script-engine = lua-scripting
-}
-
-context.spa-libs = {
- #<factory-name regex> = <library-name>
- #
- # Used to find spa factory names. It maps an spa factory name
- # regular expression to a library name that should contain
- # that factory.
- #
- api.alsa.* = alsa/libspa-alsa
- api.bluez5.* = bluez5/libspa-bluez5
- api.v4l2.* = v4l2/libspa-v4l2
- api.libcamera.* = libcamera/libspa-libcamera
- audio.convert.* = audioconvert/libspa-audioconvert
- support.* = support/libspa-support
-}
-
-context.modules = [
- #{ name = <module-name>
- # [ args = { <key> = <value> ... } ]
- # [ flags = [ [ ifexists ] [ nofail ] ]
- #}
- #
- # PipeWire modules to load.
- # If ifexists is given, the module is ignored when it is not found.
- # If nofail is given, module initialization failures are ignored.
- #
-
- # The native communication protocol.
- { name = libpipewire-module-protocol-native }
-
- # Allows creating nodes that run in the context of the
- # client. Is used by all clients that want to provide
- # data to PipeWire.
- { name = libpipewire-module-client-node }
-
- # Allows creating devices that run in the context of the
- # client. Is used by the session manager.
- { name = libpipewire-module-client-device }
-
- # Makes a factory for wrapping nodes in an adapter with a
- # converter and resampler.
- { name = libpipewire-module-adapter }
-
- # Allows applications to create metadata objects. It creates
- # a factory for Metadata objects.
- { name = libpipewire-module-metadata }
-
- # Provides factories to make session manager objects.
- { name = libpipewire-module-session-manager }
-
- { name = libpipewire-module-filter-chain
- args = {
- node.description = "Equalizer Sink"
- media.name = "Equalizer Sink"
- filter.graph = {
- nodes = [
- {
- type = builtin
- name = bass
- label = bq_lowshelf
- # the cut off freq of the bass filter can be adjusted here.
- control = { "Freq" = 250.0 "Q" = 1.0 "Gain" = 0.0 }
- }
- {
- type = builtin
- name = treble
- label = bq_peaking
- # the cut off freq of the treble filter can be adjusted here.
- control = { "Freq" = 6000.0 "Q" = 1.0 "Gain" = 0.0 }
- }
- ]
- links = [
- { output = "bass:Out" input = "treble:In" }
- ]
- }
- audio.channels = 2
- audio.position = [ FL FR ]
- capture.props = {
- node.name = "eq-sink"
- media.class = Audio/Sink
- # select the endpoint to which the node is attached
- target.endpoint = "endpoint.multimedia"
- node.passive = true
- }
- playback.props = {
- node.name = "eq-output-stream"
- node.passive = true
- }
- }
- }
-]
-
-wireplumber.components = [
- #{ name = <component-name>, type = <component-type> }
- #
- # WirePlumber components to load
- #
-
- # The lua scripting engine
- { name = libwireplumber-module-lua-scripting, type = module }
-
- # The lua configuration file(s)
- # Other components are loaded from there
- { name = host.lua, type = config/lua }
-]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl_git.bb b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl_git.bb
index 22ffe5bf3..db2c67dcf 100644
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl_git.bb
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-config-agl_git.bb
@@ -6,12 +6,12 @@ SECTION = "multimedia"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "\
- file://bluetooth.lua.d/ \
- file://host.lua.d/ \
- file://00-functions.lua \
+ file://20-AGL-log.conf \
+ file://20-AGL-profiles.conf \
+ file://30-AGL-alsa.conf \
+ file://30-AGL-bluetooth.conf \
+ file://50-AGL-pw-ic-ipc.conf \
file://alsa-suspend.lua \
- file://bluetooth.conf \
- file://wireplumber.conf \
file://wireplumber-bluetooth.conf \
"
PACKAGE_ARCH = "${MACHINE_ARCH}"
@@ -19,27 +19,20 @@ PACKAGE_ARCH = "${MACHINE_ARCH}"
do_configure[noexec] = "1"
do_compile[noexec] = "1"
do_install:append() {
- config_dir="${D}${sysconfdir}/wireplumber/"
+ config_dir="${D}${sysconfdir}/wireplumber/wireplumber.conf.d/"
scripts_dir="${D}${datadir}/wireplumber/scripts/"
dbus_config_dir="${D}${sysconfdir}/dbus-1/system.d/"
systemd_dir="${D}${sysconfdir}/systemd/system/pipewire.service.wants/"
+ # install the configuration fragments
install -d ${config_dir}
- install -m 0644 ${WORKDIR}/00-functions.lua ${config_dir}
+ install -m 0644 ${WORKDIR}/20-AGL-log.conf ${config_dir}
+ install -m 0644 ${WORKDIR}/20-AGL-profiles.conf ${config_dir}
+ install -m 0644 ${WORKDIR}/30-AGL-alsa.conf ${config_dir}
+ install -m 0644 ${WORKDIR}/30-AGL-bluetooth.conf ${config_dir}
+ install -m 0644 ${WORKDIR}/50-AGL-pw-ic-ipc.conf ${config_dir}
- # config of the main (host) instance
- install -d ${config_dir}/host.lua.d/
- ln -s ../00-functions.lua ${config_dir}/host.lua.d/00-functions.lua
- install -m 0644 ${WORKDIR}/host.lua.d/*.lua ${config_dir}/host.lua.d/
- install -m 0644 ${WORKDIR}/wireplumber.conf ${config_dir}
-
- # config of the bluetooth instance
- install -d ${config_dir}/bluetooth.lua.d/
- ln -s ../00-functions.lua ${config_dir}/bluetooth.lua.d/00-functions.lua
- install -m 0644 ${WORKDIR}/bluetooth.lua.d/*.lua ${config_dir}/bluetooth.lua.d/
- install -m 0644 ${WORKDIR}/bluetooth.conf ${config_dir}
-
- # install the alsa-suspend script, loaded by the main instance
+ # install the alsa-suspend script, loaded by the audio instance
install -d ${scripts_dir}
install -m 0644 ${WORKDIR}/alsa-suspend.lua ${scripts_dir}
@@ -49,6 +42,8 @@ do_install:append() {
# enable additional systemd services
install -d ${systemd_dir}
+ ln -s ${systemd_system_unitdir}/wireplumber@.service ${systemd_dir}/wireplumber@audio.service
+ ln -s ${systemd_system_unitdir}/wireplumber@.service ${systemd_dir}/wireplumber@video-capture.service
ln -s ${systemd_system_unitdir}/wireplumber@.service ${systemd_dir}/wireplumber@bluetooth.service
}
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/00-functions.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/00-functions.lua
deleted file mode 100644
index 7e1794df0..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/00-functions.lua
+++ /dev/null
@@ -1,27 +0,0 @@
-components = {}
-
-function load_module(m)
- if not components[m] then
- components[m] = { "libwireplumber-module-" .. m, type = "module" }
- end
-end
-
-function load_pw_module(m)
- if not components[m] then
- components[m] = { "libpipewire-module-" .. m, type = "pw_module" }
- end
-end
-
-function load_script(s, a)
- if not components[s] then
- components[s] = { s, type = "script/lua", args = a }
- end
-end
-
-function load_monitor(s, a)
- load_script("monitors/" .. s .. ".lua", a)
-end
-
-function load_access(s, a)
- load_script("access/access-" .. s .. ".lua", a)
-end
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-equalizer.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-equalizer.conf
new file mode 100644
index 000000000..061eae96c
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-equalizer.conf
@@ -0,0 +1,75 @@
+wireplumber.profiles = {
+ policy = {
+ agl.filter.equalizer-sink = required
+ }
+}
+
+wireplumber.components = [
+ {
+ name = libpipewire-module-filter-chain, type = pw-module
+ arguments = {
+ node.description = "Equalizer Sink"
+ media.name = "Equalizer Sink"
+ filter.graph = {
+ nodes = [
+ {
+ type = builtin
+ name = bass
+ label = bq_lowshelf
+ # the cut off freq of the bass filter can be adjusted here.
+ control = { "Freq" = 250.0 "Q" = 1.0 "Gain" = 0.0 }
+ }
+ {
+ type = builtin
+ name = treble
+ label = bq_peaking
+ # the cut off freq of the treble filter can be adjusted here.
+ control = { "Freq" = 6000.0 "Q" = 1.0 "Gain" = 0.0 }
+ }
+ ]
+ links = [
+ { output = "bass:Out" input = "treble:In" }
+ ]
+ }
+ audio.channels = 2
+ audio.position = [ FL FR ]
+ capture.props = {
+ node.name = "eq-sink"
+
+ # this is a sink filter, so it will appear as a sink in wpctl/pactl/etc,
+ # it will target a sink and can be chained with other sink smart filters
+ media.class = Audio/Sink
+
+ # treat this as a smart filter
+ filter.smart = true
+
+ # the unique name of the filter
+ filter.smart.name = "agl.filter.equalizer-sink"
+
+ ## set this to always link the filter to a particular sink
+ ## or leave it unset in order to follow the default sink
+ #filter.smart.target = { node.name = "alsa_output.pci-0000_00_01.0.analog-stereo" }
+
+ ## here you can specify filter dependencies, using their names
+ ## (filter.smart.name) if you set up many of them to be linked in a chain
+ #filter.smart.before = []
+ #filter.smart.after = []
+ }
+ playback.props = {
+ node.name = "eq-output-stream"
+
+ # This must be set to ensure that the real audio sink is suspended
+ # when there is no active client stream linked
+ node.passive = true
+
+ # Set this to avoid linking the filter to role-based sinks when
+ # role-based sinks are defined and node.stream.default-media-role is
+ # configured in the settings
+ media.role = "DSP"
+ }
+ }
+ provides = agl.filter.equalizer-sink
+ requires = [ pw.node-factory.adapter ]
+ after = [ support.standard-event-source ]
+ }
+]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-media-role-nodes.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-media-role-nodes.conf
new file mode 100644
index 000000000..4e4f3323f
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/50-AGL-media-role-nodes.conf
@@ -0,0 +1,184 @@
+wireplumber.profiles = {
+ policy = {
+ agl.policy.linking.role-based.loopbacks = required
+ }
+}
+
+wireplumber.settings = {
+ # This sets a default media role to be applied to streams that don't have
+ # a role already set. This allows you to force all streams to go through
+ # the role loopbacks. If not set, then streams without a role will follow
+ # the standard desktop policy and will link to the default sink
+ node.stream.default-media-role = "Multimedia"
+
+ # The volume level that is applied when ducking
+ # Note that this is a raw linear volume, not cubic (0.2 is 58%)
+ linking.role-based.duck-level = 0.2
+
+ # Do not allow changing the targets of streams via `target.object` metadata
+ linking.allow-moving-streams = false
+}
+
+wireplumber.components.rules = [
+ # This encodes common arguments and dependencies of the role loopbacks so that
+ # we don't have to repeateadly write them on all instances below
+ {
+ matches = [
+ {
+ provides = "~loopback.sink.*"
+ }
+ ]
+ actions = {
+ merge = {
+ arguments = {
+ capture.props = {
+ # Explicitly mark all these sinks as valid role-based policy
+ # targets, meaning that any links between streams and these sinks
+ # will be managed by the role-based policy
+ policy.role-based.target = true
+
+ audio.position = [ FL, FR ]
+ media.class = Audio/Sink
+ }
+ playback.props = {
+ # This must be set to ensure that the real audio sink is suspended
+ # when there is no active client stream linked
+ node.passive = true
+ # Set this to an unused role to make sure that loopbacks don't
+ # accidentally chain-link on to one another, especially when
+ # node.stream.default-media-role is configured in the settings
+ media.role = "Loopback"
+ }
+ }
+ requires = [ pw.node-factory.adapter ]
+ after = [ support.standard-event-source ]
+ }
+ }
+ }
+]
+
+wireplumber.components = [
+ {
+ type = virtual, provides = agl.policy.linking.role-based.loopbacks
+ requires = [ loopback.sink.role.multimedia
+ loopback.sink.role.speech-low
+ loopback.sink.role.custom-low
+ loopback.sink.role.navigation
+ loopback.sink.role.speech-high
+ loopback.sink.role.custom-high
+ loopback.sink.role.communication
+ loopback.sink.role.emergency ]
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.multimedia"
+ node.description = "Multimedia"
+ capture.props = {
+ device.intended-roles = [ "Music", "Movie", "Game", "Multimedia" ]
+ policy.role-based.priority = 25
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "mix"
+ }
+ }
+ provides = loopback.sink.role.multimedia
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.speech-low"
+ node.description = "Speech (Low Priority)"
+ capture.props = {
+ device.intended-roles = [ "Speech-Low" ]
+ policy.role-based.priority = 30
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "cork"
+ }
+ }
+ provides = loopback.sink.role.speech-low
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.custom-low"
+ node.description = "Custom role (Low Priority)"
+ capture.props = {
+ device.intended-roles = [ "Custom-Low" ]
+ policy.role-based.priority = 35
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "cork"
+ }
+ }
+ provides = loopback.sink.role.custom-low
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.navigation"
+ node.description = "Navigation"
+ capture.props = {
+ device.intended-roles = [ "Navigation" ]
+ policy.role-based.priority = 50
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "duck"
+ }
+ }
+ provides = loopback.sink.role.navigation
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.speech-high"
+ node.description = "Speech (High Priority)"
+ capture.props = {
+ device.intended-roles = [ "Speech-High" ]
+ policy.role-based.priority = 60
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "cork"
+ }
+ }
+ provides = loopback.sink.role.speech-high
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.custom-high"
+ node.description = "Custom role (High Priority)"
+ capture.props = {
+ device.intended-roles = [ "Custom-High" ]
+ policy.role-based.priority = 65
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "cork"
+ }
+ }
+ provides = loopback.sink.role.custom-high
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.communication"
+ node.description = "Communication"
+ capture.props = {
+ device.intended-roles = [ "Communication" ]
+ policy.role-based.priority = 75
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "cork"
+ }
+ }
+ provides = loopback.sink.role.communication
+ }
+ {
+ name = libpipewire-module-loopback, type = pw-module
+ arguments = {
+ node.name = "loopback.sink.role.emergency"
+ node.description = "Emergency"
+ capture.props = {
+ device.intended-roles = [ "Emergency", "Alert" ]
+ policy.role-based.priority = 99
+ policy.role-based.action.same-priority = "mix"
+ policy.role-based.action.lower-priority = "cork"
+ }
+ }
+ provides = loopback.sink.role.emergency
+ }
+]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.conf b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.conf
deleted file mode 100644
index 42f714849..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.conf
+++ /dev/null
@@ -1,73 +0,0 @@
-# WirePlumber daemon context configuration #
-
-context.properties = {
- ## Properties to configure the PipeWire context and some modules
-
- application.name = "WirePlumber Policy"
- log.level = 2
- wireplumber.script-engine = lua-scripting
- wireplumber.export-core = false
-
- #mem.mlock-all = false
- #support.dbus = true
-}
-
-context.spa-libs = {
- #<factory-name regex> = <library-name>
- #
- # Used to find spa factory names. It maps an spa factory name
- # regular expression to a library name that should contain
- # that factory.
- #
- audio.convert.* = audioconvert/libspa-audioconvert
- support.* = support/libspa-support
-}
-
-context.modules = [
- #{ name = <module-name>
- # [ args = { <key> = <value> ... } ]
- # [ flags = [ [ ifexists ] [ nofail ] ]
- #}
- #
- # PipeWire modules to load.
- # If ifexists is given, the module is ignored when it is not found.
- # If nofail is given, module initialization failures are ignored.
- #
-
- # The native communication protocol.
- { name = libpipewire-module-protocol-native }
-
- # Allows creating nodes that run in the context of the
- # client. Is used by all clients that want to provide
- # data to PipeWire.
- { name = libpipewire-module-client-node }
-
- # Allows creating devices that run in the context of the
- # client. Is used by the session manager.
- { name = libpipewire-module-client-device }
-
- # Makes a factory for wrapping nodes in an adapter with a
- # converter and resampler.
- { name = libpipewire-module-adapter }
-
- # Allows applications to create metadata objects. It creates
- # a factory for Metadata objects.
- { name = libpipewire-module-metadata }
-
- # Provides factories to make session manager objects.
- { name = libpipewire-module-session-manager }
-]
-
-wireplumber.components = [
- #{ name = <component-name>, type = <component-type> }
- #
- # WirePlumber components to load
- #
-
- # The lua scripting engine
- { name = libwireplumber-module-lua-scripting, type = module }
-
- # The lua configuration file
- # Other components are loaded from there
- { name = policy.lua, type = config/lua }
-]
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.lua.d/10-default-policy.lua b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.lua.d/10-default-policy.lua
deleted file mode 100644
index 6814fce4d..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl/policy.lua.d/10-default-policy.lua
+++ /dev/null
@@ -1,137 +0,0 @@
--- Policy config file --
-
-policy_config = {}
-
-policy_config.endpoints = {
- -- [endpoint name] = { endpoint properties }
- ["endpoint.capture"] = {
- ["media.class"] = "Audio/Source",
- ["role"] = "Capture",
- },
- ["endpoint.multimedia"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Multimedia",
- },
- ["endpoint.speech_low"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Speech-Low",
- },
- ["endpoint.custom_low"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Custom-Low",
- },
- ["endpoint.navigation"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Navigation",
- },
- ["endpoint.speech_high"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Speech-High",
- },
- ["endpoint.custom_high"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Custom-High",
- },
- ["endpoint.communication"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Communication",
- },
- ["endpoint.emergency"] = {
- ["media.class"] = "Audio/Sink",
- ["role"] = "Emergency",
- },
-}
-
-policy_config.policy = {
- ["move"] = false, -- moves session items when metadata target.node changes
- ["follow"] = true, -- moves session items to the default device when it has changed
-
- -- Set to 'true' to disable channel splitting & merging on nodes and enable
- -- passthrough of audio in the same format as the format of the device.
- -- Note that this breaks JACK support; it is generally not recommended
- ["audio.no-dsp"] = false,
-
- -- how much to lower the volume of lower priority streams when ducking
- -- note that this is a linear volume modifier (not cubic as in pulseaudio)
- ["duck.level"] = 0.2,
-
- ["roles"] = {
- ["Capture"] = {
- ["alias"] = { "Multimedia", "Music", "Voice", "Capture" },
- ["priority"] = 25,
- ["action.default"] = "cork",
- ["action.Capture"] = "mix",
- ["media.class"] = "Audio/Source",
- },
- ["Multimedia"] = {
- ["alias"] = { "Movie", "Music", "Game" },
- ["priority"] = 25,
- ["action.default"] = "mix",
- },
- ["Speech-Low"] = {
- ["priority"] = 30,
- ["action.default"] = "cork",
- ["action.Speech-Low"] = "mix",
- },
- ["Custom-Low"] = {
- ["priority"] = 35,
- ["action.default"] = "cork",
- ["action.Custom-Low"] = "mix",
- },
- ["Navigation"] = {
- ["priority"] = 50,
- ["action.default"] = "duck",
- ["action.Navigation"] = "mix",
- },
- ["Speech-High"] = {
- ["priority"] = 60,
- ["action.default"] = "cork",
- ["action.Speech-High"] = "mix",
- },
- ["Custom-High"] = {
- ["priority"] = 65,
- ["action.default"] = "cork",
- ["action.Custom-High"] = "mix",
- },
- ["Communication"] = {
- ["priority"] = 75,
- ["action.default"] = "cork",
- ["action.Communication"] = "mix",
- },
- ["Emergency"] = {
- ["alias"] = { "Alert" },
- ["priority"] = 99,
- ["action.default"] = "cork",
- ["action.Emergency"] = "mix",
- },
- },
-}
-
--- Session item factories, building blocks for the session management graph
--- Do not disable these unless you really know what you are doing
-load_module("si-node")
-load_module("si-audio-adapter")
-load_module("si-standard-link")
-load_module("si-audio-endpoint")
-
--- API to access default nodes from scripts
-load_module("default-nodes-api")
-
--- API to access mixer controls, needed for volume ducking
-load_module("mixer-api")
-
--- Create endpoints statically at startup
-load_script("static-endpoints.lua", policy_config.endpoints)
-
--- Create session items for nodes that appear in the graph
-load_script("create-item.lua", policy_config.policy)
-
--- Link nodes to each other to make media flow in the graph
-load_script("policy-node.lua", policy_config.policy)
-
--- Link client nodes with endpoints to make media flow in the graph
-load_script("policy-endpoint-client.lua", policy_config.policy)
-load_script("policy-endpoint-client-links.lua", policy_config.policy)
-
--- Link endpoints with device nodes to make media flow in the graph
-load_script("policy-endpoint-device.lua", policy_config.policy)
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl_git.bb b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl_git.bb
index 1a031160e..7973a0a33 100644
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl_git.bb
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-policy-config-agl_git.bb
@@ -6,26 +6,20 @@ SECTION = "multimedia"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "\
- file://policy.lua.d \
- file://00-functions.lua \
- file://policy.conf \
+ file://50-AGL-equalizer.conf \
+ file://50-AGL-media-role-nodes.conf \
"
PACKAGE_ARCH = "${MACHINE_ARCH}"
do_configure[noexec] = "1"
do_compile[noexec] = "1"
do_install:append() {
- config_dir="${D}${sysconfdir}/wireplumber/"
+ config_dir="${D}${sysconfdir}/wireplumber/wireplumber.conf.d/"
systemd_dir="${D}${sysconfdir}/systemd/system/pipewire.service.wants"
install -d ${config_dir}
- install -m 0644 ${WORKDIR}/00-functions.lua ${config_dir}
-
- # config of the policy instance
- install -d ${config_dir}/policy.lua.d/
- ln -s ../00-functions.lua ${config_dir}/policy.lua.d/00-functions.lua
- install -m 0644 ${WORKDIR}/policy.lua.d/*.lua ${config_dir}/policy.lua.d/
- install -m 0644 ${WORKDIR}/policy.conf ${config_dir}
+ install -m 0644 ${WORKDIR}/50-AGL-equalizer.conf ${config_dir}
+ install -m 0644 ${WORKDIR}/50-AGL-media-role-nodes.conf ${config_dir}
# enable additional systemd services
install -d ${systemd_dir}
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_%.bbappend b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_%.bbappend
new file mode 100644
index 000000000..16d3817cd
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_%.bbappend
@@ -0,0 +1,9 @@
+do_install:append() {
+ systemd_dir="${D}${sysconfdir}/systemd/system/"
+
+ # mask the main service, to enable split-instance configuration
+ # accomodated by the services installed in wireplumber-config-agl
+ # and wireplumber-policy-config-agl
+ install -d ${systemd_dir}
+ ln -s /dev/null ${systemd_dir}/wireplumber.service
+}
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_0.5.6.bb b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_0.5.6.bb
new file mode 100644
index 000000000..d7fecd18b
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_0.5.6.bb
@@ -0,0 +1,138 @@
+SUMMARY = "Session / policy manager implementation for PipeWire"
+HOMEPAGE = "https://gitlab.freedesktop.org/pipewire/wireplumber"
+BUGTRACKER = "https://gitlab.freedesktop.org/pipewire/wireplumber/issues"
+SECTION = "multimedia"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=17d1fe479cdec331eecbc65d26bc7e77"
+
+DEPENDS = "glib-2.0 glib-2.0-native lua pipewire \
+ ${@bb.utils.contains("DISTRO_FEATURES", "gobject-introspection-data", "python3-native python3-lxml-native doxygen-native", "", d)} \
+"
+
+SRCREV = "141b2d5d3f793e20f94421c554d8d9c51143ce0d"
+SRC_URI = " \
+ git://gitlab.freedesktop.org/pipewire/wireplumber.git;branch=master;protocol=https \
+"
+
+S = "${WORKDIR}/git"
+
+inherit meson pkgconfig gobject-introspection systemd
+
+GIR_MESON_ENABLE_FLAG = 'enabled'
+GIR_MESON_DISABLE_FLAG = 'disabled'
+
+# Enable system-lua to let wireplumber use OE's lua.
+# Documentation needs python-sphinx, which is not in oe-core or meta-python2 for now.
+# elogind is not (yet) available in OE, so disable support.
+EXTRA_OEMESON += " \
+ -Ddoc=disabled \
+ -Dsystem-lua=true \
+ -Delogind=disabled \
+ -Dsystemd-system-unit-dir=${systemd_system_unitdir} \
+ -Dsystemd-user-unit-dir=${systemd_user_unitdir} \
+ -Dtests=false \
+"
+
+PACKAGECONFIG ??= " dbus \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd systemd-system-service systemd-user-service', '', d)} \
+"
+
+PACKAGECONFIG[systemd] = "-Dsystemd=enabled,-Dsystemd=disabled,systemd"
+PACKAGECONFIG[systemd-system-service] = "-Dsystemd-system-service=true,-Dsystemd-system-service=false,systemd"
+# "systemd-user-service" packageconfig will only install service
+# files to rootfs but not enable them as systemd.bbclass
+# currently lacks the feature of enabling user services.
+PACKAGECONFIG[systemd-user-service] = "-Dsystemd-user-service=true,-Dsystemd-user-service=false,systemd"
+PACKAGECONFIG[dbus] = ""
+
+PACKAGESPLITFUNCS:prepend = " split_dynamic_packages "
+PACKAGESPLITFUNCS:append = " set_dynamic_metapkg_rdepends "
+
+WP_MODULE_SUBDIR = "wireplumber-0.5"
+
+python split_dynamic_packages () {
+ # Create packages for each WirePlumber module.
+ wp_module_libdir = d.expand('${libdir}/${WP_MODULE_SUBDIR}')
+ do_split_packages(d, wp_module_libdir, r'^libwireplumber-module-(.*)\.so$', d.expand('${PN}-modules-%s'), 'WirePlumber %s module', extra_depends='', recursive=False)
+}
+
+python set_dynamic_metapkg_rdepends () {
+ import os
+ import oe.utils
+
+ # Go through all generated WirePlumber module packages
+ # (excluding the main package and the -meta package itself)
+ # and add them to the -meta package as RDEPENDS.
+
+ base_pn = d.getVar('PN')
+
+ wp_module_pn = base_pn + '-modules'
+ wp_module_metapkg = wp_module_pn + '-meta'
+
+ d.setVar('ALLOW_EMPTY:' + wp_module_metapkg, "1")
+ d.setVar('FILES:' + wp_module_metapkg, "")
+
+ blacklist = [ wp_module_pn, wp_module_metapkg ]
+ wp_module_metapkg_rdepends = []
+ pkgdest = d.getVar('PKGDEST')
+
+ for pkg in oe.utils.packages_filter_out_system(d):
+ if pkg in blacklist:
+ continue
+
+ is_wp_module_pkg = pkg.startswith(wp_module_pn)
+ if not is_wp_module_pkg:
+ continue
+
+ if pkg in wp_module_metapkg_rdepends:
+ continue
+
+ # See if the package is empty by looking at the contents of its
+ # PKGDEST subdirectory. If this subdirectory is empty, then then
+ # package is empty as well. Empty packages do not get added to
+ # the meta package's RDEPENDS.
+ pkgdir = os.path.join(pkgdest, pkg)
+ if os.path.exists(pkgdir):
+ dir_contents = os.listdir(pkgdir) or []
+ else:
+ dir_contents = []
+ is_empty = len(dir_contents) == 0
+ if not is_empty:
+ if is_wp_module_pkg:
+ wp_module_metapkg_rdepends.append(pkg)
+
+ d.setVar('RDEPENDS:' + wp_module_metapkg, ' '.join(wp_module_metapkg_rdepends))
+ d.setVar('DESCRIPTION:' + wp_module_metapkg, wp_module_pn + ' meta package')
+}
+
+PACKAGES =+ "\
+ libwireplumber \
+ ${PN}-default-config \
+ ${PN}-scripts \
+ ${PN}-modules \
+ ${PN}-modules-meta \
+"
+
+PACKAGES_DYNAMIC = "^${PN}-modules.*"
+
+CONFFILES:${PN} += " \
+ ${datadir}/wireplumber/wireplumber.conf \
+ ${datadir}/wireplumber/wireplumber.conf.d/*.conf \
+"
+# Add pipewire to RRECOMMENDS, since WirePlumber expects a PipeWire daemon to
+# be present. While in theory any application that uses libpipewire can configure
+# itself to become a daemon, in practice, the PipeWire daemon is used.
+RRECOMMENDS:${PN} += "pipewire ${PN}-scripts ${PN}-modules-meta"
+
+FILES:${PN} += "${systemd_user_unitdir} ${systemd_system_unitdir} ${datadir}/zsh"
+
+FILES:libwireplumber = " \
+ ${libdir}/libwireplumber-*.so.* \
+"
+
+FILES:${PN}-scripts += "${datadir}/wireplumber/scripts/*"
+
+# Dynamic packages (see set_dynamic_metapkg_rdepends).
+FILES:${PN}-modules = ""
+RRECOMMENDS:${PN}-modules += "${PN}-modules-meta"
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb
deleted file mode 100644
index a04f115c3..000000000
--- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb
+++ /dev/null
@@ -1,85 +0,0 @@
-SUMMARY = "Session / Policy Manager for PipeWire"
-HOMEPAGE = "https://gitlab.freedesktop.org/pipewire/wireplumber"
-BUGTRACKER = "https://gitlab.freedesktop.org/pipewire/wireplumber/issues"
-AUTHOR = "George Kiagiadakis <george.kiagiadakis@collabora.com>"
-SECTION = "multimedia"
-
-LICENSE = "MIT"
-LIC_FILES_CHKSUM = "file://LICENSE;beginline=3;md5=e8ad01a5182f2c1b3a2640e9ea268264"
-
-inherit meson pkgconfig systemd
-
-DEPENDS = "glib-2.0 glib-2.0-native pipewire lua"
-
-SRC_URI = "\
- git://gitlab.freedesktop.org/pipewire/wireplumber.git;protocol=https;branch=master \
-"
-# v0.4.17
-SRCREV = "d3eb77b292655cef333a8f4cab4e861415bc37c2"
-
-# patches to be able to compile with lower version of meson that is available in AGL.
-SRC_URI += "\
-"
-
-PV = "0.4.17"
-S = "${WORKDIR}/git"
-
-WPAPI="0.4"
-
-# use shared lua from the system instead of the static bundled one
-EXTRA_OEMESON += "-Dsystem-lua=true"
-
-# introspection in practice is only used for generating API docs
-# API docs are available on the website and we don't need to build them
-# (plus they depend on hotdoc which is not available here)
-EXTRA_OEMESON += "-Dintrospection=disabled -Ddoc=disabled"
-
-PACKAGECONFIG = "\
- ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)} \
-"
-
-PACKAGECONFIG[systemd] = "-Dsystemd=enabled -Dsystemd-system-service=true -Dsystemd-user-service=false,-Dsystemd=disabled -Dsystemd-system-service=false -Dsystemd-user-service=false,systemd"
-
-do_configure:prepend() {
- # relax meson version requirement
- # we only need 0.54 when building with -Dsystem-lua=false
- sed "s/meson_version : '>= 0.56.0'/meson_version : '>= 0.53.2'/" ${S}/meson.build > ${S}/tmp.build
- mv -f ${S}/tmp.build ${S}/meson.build
-}
-
-PACKAGES =+ "\
- lib${PN}-${WPAPI} \
- ${PN}-config \
-"
-
-SYSTEMD_SERVICE:${PN} = "wireplumber.service"
-FILES:${PN} = "\
- ${bindir}/wireplumber \
- ${bindir}/wpctl \
- ${bindir}/wpexec \
- ${libdir}/wireplumber-${WPAPI}/* \
- ${datadir}/wireplumber/scripts/* \
- ${datadir}/zsh/* \
- ${systemd_system_unitdir}/* \
-"
-
-FILES:lib${PN}-${WPAPI} = "\
- ${libdir}/libwireplumber-${WPAPI}.so.* \
-"
-
-FILES:${PN}-config += "\
- ${sysconfdir}/wireplumber/* \
- ${datadir}/wireplumber/*conf \
- ${datadir}/wireplumber/common/* \
- ${datadir}/wireplumber/main.lua.d/* \
- ${datadir}/wireplumber/bluetooth.lua.d/* \
- ${datadir}/wireplumber/policy.lua.d/* \
-"
-do_install:append() {
- rm -rf ${D}${sysconfdir}/wireplumber/
- rm -f ${D}${datadir}/wireplumber/*conf
- rm -rf ${D}${datadir}/wireplumber/common
- rm -rf ${D}${datadir}/wireplumber/main.lua.d
- rm -rf ${D}${datadir}/wireplumber/bluetooth.lua.d
- rm -rf ${D}${datadir}/wireplumber/policy.lua.d
-}
diff --git a/templates/feature/agl-ci/99_local.conf.inc b/templates/feature/agl-ci/99_local.conf.inc
index c12cd1717..b6337516d 100644
--- a/templates/feature/agl-ci/99_local.conf.inc
+++ b/templates/feature/agl-ci/99_local.conf.inc
@@ -15,19 +15,21 @@ https://.*/.* ${AGL_HOST_PREMIRROR}/AGL/mirror/ \n \
SSTATE_MIRRORS = " file://.* ${AGL_HOST_SSTATE_MIRROR}/sstate-mirror/master/${DEFAULTTUNE}/PATH;downloadfilename=PATH \n "
-#INHERIT += "packagefeed-stability"
+INHERIT += "cve-check"
INHERIT += "buildhistory"
INHERIT += "buildstats"
INHERIT += "buildstats-summary"
# setup for PRSERV and HASHSERV
-#AGL_HOST_PRSERV ?= "10.30.72.18"
-#AGL_HOST_HASHSERV ?= "10.30.72.18"
+AGL_HOST_PRSERV ?= "10.30.72.18"
+AGL_HOST_HASHSERV ?= "10.30.72.18"
-#BB_HASHSERVE = "${AGL_HOST_HASHSERV}:8383"
-#BB_SIGNATURE_HANDLER = "OEEquivHash"
+# r/w hashserv
+BB_HASHSERVE = "${AGL_HOST_HASHSERV}:8787"
+BB_SIGNATURE_HANDLER = "OEEquivHash"
-#PRSERV_HOST = "${AGL_HOST_PRSERV}:8181"
+# r/w prserv
+PRSERV_HOST = "${AGL_HOST_PRSERV}:8585"
IMAGE_INSTALL:append = " curl"
diff --git a/templates/feature/agl-flutter/50_bblayers.conf.inc b/templates/feature/agl-flutter/50_bblayers.conf.inc
new file mode 100644
index 000000000..10647b7a5
--- /dev/null
+++ b/templates/feature/agl-flutter/50_bblayers.conf.inc
@@ -0,0 +1,10 @@
+AGL_META_CLANG = " ${METADIR}/external/meta-clang "
+# Required for libcamera
+AGL_META_MULTIMEDIA = "${METADIR}/external/meta-openembedded/meta-multimedia"
+AGL_META_PYTHON = "${METADIR}/external/meta-openembedded/meta-python"
+
+BBLAYERS =+ " \
+ ${METADIR}/meta-agl/meta-agl-flutter \
+ ${METADIR}/external/meta-flutter \
+ ${METADIR}/external/meta-flutter/meta-flutter-apps \
+"
diff --git a/templates/feature/agl-flutter/50_local.conf.inc b/templates/feature/agl-flutter/50_local.conf.inc
new file mode 100644
index 000000000..6ca86b0c9
--- /dev/null
+++ b/templates/feature/agl-flutter/50_local.conf.inc
@@ -0,0 +1,5 @@
+# Include Flutter SDK in SDK
+TOOLCHAIN_HOST_TASK:append = " nativesdk-flutter-sdk"
+
+# Include agl-specific defaults
+require conf/include/agl-flutter.inc
diff --git a/templates/feature/agl-flutter/included.dep b/templates/feature/agl-flutter/included.dep
new file mode 100644
index 000000000..4f4e49ec1
--- /dev/null
+++ b/templates/feature/agl-flutter/included.dep
@@ -0,0 +1 @@
+agl-pipewire agl-app-framework
diff --git a/templates/feature/agl-pipewire/50_bblayers.conf.inc b/templates/feature/agl-pipewire/50_bblayers.conf.inc
index e05cd4090..613ed97b3 100644
--- a/templates/feature/agl-pipewire/50_bblayers.conf.inc
+++ b/templates/feature/agl-pipewire/50_bblayers.conf.inc
@@ -1,7 +1,7 @@
+# PipeWire recipe comes from meta-multimedia
+AGL_META_MULTIMEDIA = "${METADIR}/external/meta-openembedded/meta-multimedia"
+AGL_META_PYTHON = "${METADIR}/external/meta-openembedded/meta-python"
BBLAYERS =+ " \
- ${METADIR}/meta-agl/meta-pipewire \
- "
-
-# we ship our own pipewire
-BBMASK += "meta-openembedded/meta-oe/recipes-multimedia/pipewire/"
+ ${METADIR}/meta-agl/meta-pipewire \
+"
diff --git a/templates/feature/agl-prhash-public/99_local.conf.inc b/templates/feature/agl-prhash-public/99_local.conf.inc
new file mode 100644
index 000000000..e64c8e258
--- /dev/null
+++ b/templates/feature/agl-prhash-public/99_local.conf.inc
@@ -0,0 +1,13 @@
+# setup for PRSERV and HASHSERV
+AGL_HOST_PRSERV ?= "prserv.automotivelinux.org"
+AGL_HOST_HASHSERV ?= "prserv.automotivelinux.org"
+
+# r/o hashserv
+BB_HASHSERVE = "auto"
+BB_HASHSERVE_UPSTREAM = "${AGL_HOST_HASHSERV}:8888"
+BB_SIGNATURE_HANDLER = "OEEquivHash"
+
+# r/o prserv
+PRSERV_HOST = "${AGL_HOST_PRSERV}:8686"
+
+IMAGE_INSTALL:append = " curl"
diff --git a/templates/feature/agl-selinux/50_bblayers.conf.inc b/templates/feature/agl-selinux/50_bblayers.conf.inc
index b17e292e9..392b70099 100644
--- a/templates/feature/agl-selinux/50_bblayers.conf.inc
+++ b/templates/feature/agl-selinux/50_bblayers.conf.inc
@@ -1,5 +1,8 @@
AGL_META_PYTHON = "${METADIR}/external/meta-openembedded/meta-python"
+# Needed to satisfy uutils-coreutils DEPENDS when using SELinux
+AGL_META_CLANG = "${METADIR}/external/meta-clang"
+
BBLAYERS =+ " \
${METADIR}/external/meta-selinux \
"
diff --git a/templates/feature/agl-weston-remoting/included.dep b/templates/feature/agl-weston-remoting/included.dep
deleted file mode 100644
index 82639da07..000000000
--- a/templates/feature/agl-weston-remoting/included.dep
+++ /dev/null
@@ -1 +0,0 @@
-agl-demo
diff --git a/templates/machine/jetson-agx-orin-devkit/50_bblayers.conf.inc b/templates/machine/jetson-agx-orin-devkit/50_bblayers.conf.inc
new file mode 100644
index 000000000..6461f1c76
--- /dev/null
+++ b/templates/machine/jetson-agx-orin-devkit/50_bblayers.conf.inc
@@ -0,0 +1 @@
+BBLAYERS =+ "${METADIR}/bsp/meta-tegra"
diff --git a/templates/machine/jetson-agx-orin-devkit/50_local.conf.inc b/templates/machine/jetson-agx-orin-devkit/50_local.conf.inc
new file mode 100644
index 000000000..c04fcd76a
--- /dev/null
+++ b/templates/machine/jetson-agx-orin-devkit/50_local.conf.inc
@@ -0,0 +1,2 @@
+MACHINE = "jetson-agx-orin-devkit"
+require conf/include/agl_jetson-agx-orin-devkit.inc
diff --git a/templates/machine/nanopc-t6/50_bblayers.conf.inc b/templates/machine/nanopc-t6/50_bblayers.conf.inc
new file mode 100644
index 000000000..721a5dca0
--- /dev/null
+++ b/templates/machine/nanopc-t6/50_bblayers.conf.inc
@@ -0,0 +1,4 @@
+BBLAYERS =+ "\
+ ${METADIR}/bsp/meta-rockchip \
+ ${METADIR}/bsp/meta-rockchip-extra \
+ "
diff --git a/templates/machine/nanopc-t6/50_local.conf.inc b/templates/machine/nanopc-t6/50_local.conf.inc
new file mode 100644
index 000000000..aa95de143
--- /dev/null
+++ b/templates/machine/nanopc-t6/50_local.conf.inc
@@ -0,0 +1,3 @@
+MACHINE = "rockchip-rk3588-nanopc-t6"
+
+require conf/include/agl_rk3588.inc
diff --git a/templates/machine/nanopc-t6/README_machine_nanopc-t6.md b/templates/machine/nanopc-t6/README_machine_nanopc-t6.md
new file mode 100644
index 000000000..04d4dc44d
--- /dev/null
+++ b/templates/machine/nanopc-t6/README_machine_nanopc-t6.md
@@ -0,0 +1,9 @@
+---
+description: Machine NanoPC-T6
+authors: Naoto Yamaguchi <naoto.yamaguchi@automotivelinux.org>
+---
+
+### Machine nanopc-t6
+
+Rockchip RK3588 SBC. Manufactured by FriendlyElec.
+
diff --git a/templates/machine/raspberrypi5/50_bblayers.conf.inc b/templates/machine/raspberrypi5/50_bblayers.conf.inc
index 2e677dd8a..d225d627b 100644
--- a/templates/machine/raspberrypi5/50_bblayers.conf.inc
+++ b/templates/machine/raspberrypi5/50_bblayers.conf.inc
@@ -1 +1,4 @@
-BBLAYERS =+ "${METADIR}/bsp/meta-raspberrypi"
+BBLAYERS =+ " \
+ ${METADIR}/bsp/meta-raspberrypi \
+ ${METADIR}/bsp/meta-lts-mixins_u-boot \
+"
diff --git a/templates/machine/unmatched/50_bblayers.conf.inc b/templates/machine/unmatched/50_bblayers.conf.inc
index 03565bafd..bf78285b5 100644
--- a/templates/machine/unmatched/50_bblayers.conf.inc
+++ b/templates/machine/unmatched/50_bblayers.conf.inc
@@ -1,6 +1,2 @@
# This is the original place, but we need to tweak layer.conf
BBLAYERS =+ "${METADIR}/bsp/meta-sifive"
-
-# For now, tweak the layer's compatibility to allow using with kirkstone,
-# since we know it works without major issues.
-LAYERSERIES_COMPAT_meta-sifive:append = " kirkstone"