From 9f3336b19863ad04bf159253be379b66a34cece0 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 20 Jun 2022 14:38:52 -0300 Subject: [PATCH 001/163] raspberrypi4-64: Add machine conf Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 conf/machine/include/raspberrypi4-64.inc diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc new file mode 100644 index 00000000..6863dd8a --- /dev/null +++ b/conf/machine/include/raspberrypi4-64.inc @@ -0,0 +1,37 @@ + +WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" +WKS_FILE_sota_raspberrypi-64 = "torizon-sota.wks" + +hostname_pn-base-files = "${MACHINE}" +CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" + +# Raspberry Pi +PREFERRED_PROVIDER_virtual/bootloader_rpi = "u-boot-fio" +PREFERRED_PROVIDER_u-boot_rpi = "u-boot-fio" +SOTA_CLIENT_FEATURES_append_rpi = " ubootenv" +WKS_FILE_DEPENDS_BOOTLOADERS_rpi = "virtual/bootloader" +WKS_FILE_DEPENDS_append_rpi = " u-boot-default-script" +PREFERRED_PROVIDER_u-boot-default-script_rpi = "u-boot-ostree-scr" +PREFERRED_PROVIDER_u-boot-default-script_sota_rpi = "u-boot-ostree-scr-fit" + +#PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" +IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg" +IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt" +IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb" +KERNEL_CLASSES_rpi = " toradex-fitimage " +OSTREE_KERNEL_rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" +KERNEL_IMAGETYPE_rpi = "fitImage" + +## Mimic meta-raspberrypi behavior +KERNEL_SERIAL_rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" +KERNEL_SERIAL_raspberrypi-cm3 ?= "console=ttyAMA0,115200" +OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" +OSTREE_KERNEL_ARGS_raspberrypi3 ?= "vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" +OSTREE_KERNEL_ARGS_raspberrypi-cm3 ?= "vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" +OSTREE_KERNEL_ARGS_raspberrypi4 ?= "video=HDMI-A-1:1280x720@60 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" + +## U-Boot entrypoints for rpi +UBOOT_ENTRYPOINT_rpi = "0x00008000" +UBOOT_DTB_LOADADDRESS_rpi = "0x02600000" +UBOOT_DTBO_LOADADDRESS_rpi = "0x026d0000" + From b59d17aff29d9ea7bf228bb063b59f4e27abe1bf Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 20 Jun 2022 16:13:45 -0300 Subject: [PATCH 002/163] labs: Use lmp-device-tree as virtual/dtb provider Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 2 +- conf/template/bblayers.conf | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 6863dd8a..1d493e12 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -14,7 +14,7 @@ WKS_FILE_DEPENDS_append_rpi = " u-boot-default-script" PREFERRED_PROVIDER_u-boot-default-script_rpi = "u-boot-ostree-scr" PREFERRED_PROVIDER_u-boot-default-script_sota_rpi = "u-boot-ostree-scr-fit" -#PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" +PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg" IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt" IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb" diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index ff67798b..4f188594 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -45,5 +45,7 @@ BBLAYERS = " \ ${BASELAYERS} \ ${BSPLAYERS} \ ${EXTRALAYERS} \ + ${OEROOT}/layers/meta-lmp/meta-lmp-base \ + ${OEROOT}/layers/meta-lmp/meta-lmp-bsp \ ${OEROOT}/layers/openembedded-core/meta \ " From 9daec75253dbc132d892555a5469d95c4eef2a89 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 20 Jun 2022 23:04:45 -0300 Subject: [PATCH 003/163] raspberrypi4-64: Fix IMAGE_BOOT_FILES_rpi Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 1d493e12..d78838d2 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -1,6 +1,9 @@ WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" -WKS_FILE_sota_raspberrypi-64 = "torizon-sota.wks" +WKS_FILE_sota_rpi = "torizon-sota.wks" + +# PREFERRED_PROVIDER_u-boot-default-script = "" +# PREFERRED_PROVIDER_virtual/dtb = "" hostname_pn-base-files = "${MACHINE}" CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" @@ -15,7 +18,7 @@ PREFERRED_PROVIDER_u-boot-default-script_rpi = "u-boot-ostree-scr" PREFERRED_PROVIDER_u-boot-default-script_sota_rpi = "u-boot-ostree-scr-fit" PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" -IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg" +IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg teziimg wic.bz2 wic.bmap" IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt" IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb" KERNEL_CLASSES_rpi = " toradex-fitimage " From 5048d2b143ced6b286fb05fe507816a2fd1c3a71 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 21 Jun 2022 12:46:39 -0300 Subject: [PATCH 004/163] bblayers: Fix meta-lmp-bsp location Signed-off-by: Matheus Castello --- conf/template/bblayers.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index 4f188594..81807ef8 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -20,6 +20,8 @@ BASELAYERS ?= " \ # These layers hold machine specific content, aka Board Support Packages BSPLAYERS ?= " \ + ${OEROOT}/layers/meta-raspberrypi \ + ${OEROOT}/layers/meta-lmp/meta-lmp-bsp \ ${OEROOT}/layers/meta-toradex-nxp \ ${OEROOT}/layers/meta-freescale \ ${OEROOT}/layers/meta-freescale-3rdparty \ @@ -46,6 +48,5 @@ BBLAYERS = " \ ${BSPLAYERS} \ ${EXTRALAYERS} \ ${OEROOT}/layers/meta-lmp/meta-lmp-base \ - ${OEROOT}/layers/meta-lmp/meta-lmp-bsp \ ${OEROOT}/layers/openembedded-core/meta \ " From 0ff72bc04490ff775c4ac710ddac999abc673132 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 22:15:11 -0300 Subject: [PATCH 005/163] raspberrypi4-64: Use meta-lmp but maintain compatibility Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index d78838d2..88423d66 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -2,9 +2,6 @@ WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" WKS_FILE_sota_rpi = "torizon-sota.wks" -# PREFERRED_PROVIDER_u-boot-default-script = "" -# PREFERRED_PROVIDER_virtual/dtb = "" - hostname_pn-base-files = "${MACHINE}" CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" @@ -38,3 +35,16 @@ UBOOT_ENTRYPOINT_rpi = "0x00008000" UBOOT_DTB_LOADADDRESS_rpi = "0x02600000" UBOOT_DTBO_LOADADDRESS_rpi = "0x026d0000" +# Use meta-lmp but maintain compatibility +BBMASK += " \ + meta-lmp/meta-lmp-base/recipes-connectivity \ + meta-lmp/meta-lmp-base/recipes-containers \ + meta-lmp/meta-lmp-base/recipes-core \ + meta-lmp/meta-lmp-base/recipes-devtools \ + meta-lmp/meta-lmp-base/recipes-extended \ + meta-lmp/meta-lmp-base/recipes-samples \ + meta-lmp/meta-lmp-base/recipes-security \ + meta-lmp/meta-lmp-base/recipes-sota \ + meta-lmp/meta-lmp-base/recipes-support \ + meta-toradex-torizon/recipes-bsp/u-boot \ +" From 7cd2f385494e84a9a132a6ac5ddfad142830bada Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 22:18:18 -0300 Subject: [PATCH 006/163] raspberrypi4-64: Fix WKS_FILE_sota_rpi By default it will use sdimgage-sota.wks that is the correct to be used with rpi Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 88423d66..a9d66ab0 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -1,6 +1,5 @@ WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" -WKS_FILE_sota_rpi = "torizon-sota.wks" hostname_pn-base-files = "${MACHINE}" CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" From b85505717a965a16d38e9aa813138de8c0c13fab Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 22:42:54 -0300 Subject: [PATCH 007/163] raspberrypi4-64: Fix IMAGE_FSTYPES_REMOVE We need ota-ext4 and wic for rpi Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index a9d66ab0..38c0b8a2 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -14,7 +14,9 @@ PREFERRED_PROVIDER_u-boot-default-script_rpi = "u-boot-ostree-scr" PREFERRED_PROVIDER_u-boot-default-script_sota_rpi = "u-boot-ostree-scr-fit" PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" -IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg teziimg wic.bz2 wic.bmap" +IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg teziimg" +# We need ota-ext4 and wic for rpi +IMAGE_FSTYPES_REMOVE = "" IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt" IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb" KERNEL_CLASSES_rpi = " toradex-fitimage " From 470c100e168f68bce6a3350f1046e69b974595b8 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 22:47:52 -0300 Subject: [PATCH 008/163] raspberrypi4-64: set u-boot-fio as PREFERRED_PROVIDER_virtual/bootloader we have to make sure to set the u-boot-fio and use only it Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 38c0b8a2..20a25bf1 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -5,6 +5,8 @@ hostname_pn-base-files = "${MACHINE}" CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" # Raspberry Pi +PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" +PREFERRED_PROVIDER_virtual/bootloader_sota = "u-boot-fio" PREFERRED_PROVIDER_virtual/bootloader_rpi = "u-boot-fio" PREFERRED_PROVIDER_u-boot_rpi = "u-boot-fio" SOTA_CLIENT_FEATURES_append_rpi = " ubootenv" @@ -17,8 +19,8 @@ PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg teziimg" # We need ota-ext4 and wic for rpi IMAGE_FSTYPES_REMOVE = "" -IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt" -IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb" +IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " +IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " KERNEL_CLASSES_rpi = " toradex-fitimage " OSTREE_KERNEL_rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" KERNEL_IMAGETYPE_rpi = "fitImage" From cd5ea8654c85963953c2cb8d71fafbf06eeb656e Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 23:02:16 -0300 Subject: [PATCH 009/163] raspberrypi4-64: Use LINUX_VERSION_rpi 4.19 meta-lmp is applying some patches for rpi Kernel v4.19 Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 20a25bf1..e0f8a031 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -25,6 +25,16 @@ KERNEL_CLASSES_rpi = " toradex-fitimage " OSTREE_KERNEL_rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" KERNEL_IMAGETYPE_rpi = "fitImage" +## RPI: Use official raspberrypi downstream kernel +PREFERRED_PROVIDER_virtual/kernel_rpi ?= "linux-lmp-dev" +LINUX_VERSION_rpi ?= "4.19.y" +KERNEL_REPO_rpi ?= "git://github.com/raspberrypi/linux.git" +KERNEL_BRANCH_rpi ?= "rpi-4.19.y" +KERNEL_COMMIT_rpi ?= "f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7" +KERNEL_META_BRANCH_rpi ?= "linux-v4.19.y" +KERNEL_META_COMMIT_rpi ?= "1e97ab775c4c499b995e7013ffc221d71844ba87" +MACHINE_FEATURES_append_raspberrypi4 = " armstub" + ## Mimic meta-raspberrypi behavior KERNEL_SERIAL_rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" KERNEL_SERIAL_raspberrypi-cm3 ?= "console=ttyAMA0,115200" From 7fda3972272871c8558b7059143c27eb0a239436 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 23:06:21 -0300 Subject: [PATCH 010/163] raspberrypi4-64: Add ENABLE_UART = 1 Setting uart enabled as default Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index e0f8a031..c8d8af59 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -36,6 +36,7 @@ KERNEL_META_COMMIT_rpi ?= "1e97ab775c4c499b995e7013ffc221d71844ba87" MACHINE_FEATURES_append_raspberrypi4 = " armstub" ## Mimic meta-raspberrypi behavior +ENABLE_UART = "1" KERNEL_SERIAL_rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" KERNEL_SERIAL_raspberrypi-cm3 ?= "console=ttyAMA0,115200" OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" From 7694967706813d1662bb32bb7d94d0185413f123 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 23:08:09 -0300 Subject: [PATCH 011/163] raspberrypi4-64: Add vc4 overlays Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index c8d8af59..07fc58f6 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -43,6 +43,8 @@ OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 OSTREE_KERNEL_ARGS_raspberrypi3 ?= "vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" OSTREE_KERNEL_ARGS_raspberrypi-cm3 ?= "vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" OSTREE_KERNEL_ARGS_raspberrypi4 ?= "video=HDMI-A-1:1280x720@60 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" +KERNEL_DEVICETREE_raspberrypi4-64_sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d.dtbo" +SOTA_DT_OVERLAYS_raspberrypi4-64 ?= "vc4-fkms-v3d.dtbo" ## U-Boot entrypoints for rpi UBOOT_ENTRYPOINT_rpi = "0x00008000" From 77387b562982d453679df71a3fab5611ec18050c Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 23:12:24 -0300 Subject: [PATCH 012/163] raspberrypi4-64: Append bootarg_root to OSTREE_KERNEL_ARGS Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 07fc58f6..bca6b147 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -45,6 +45,8 @@ OSTREE_KERNEL_ARGS_raspberrypi-cm3 ?= "vc_mem.mem_base=0x3ec00000 vc_mem.mem_siz OSTREE_KERNEL_ARGS_raspberrypi4 ?= "video=HDMI-A-1:1280x720@60 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" KERNEL_DEVICETREE_raspberrypi4-64_sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d.dtbo" SOTA_DT_OVERLAYS_raspberrypi4-64 ?= "vc4-fkms-v3d.dtbo" +# This boot arguments are the same from torizon.bbclass +OSTREE_KERNEL_ARGS_sota_append_rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 " ## U-Boot entrypoints for rpi UBOOT_ENTRYPOINT_rpi = "0x00008000" From 644999849e2e86d900b4902bd26d425c279a5f64 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 23 Jun 2022 23:18:17 -0300 Subject: [PATCH 013/163] raspberrypi4-64: Cleanup Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index bca6b147..3cdd6fc3 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -33,16 +33,11 @@ KERNEL_BRANCH_rpi ?= "rpi-4.19.y" KERNEL_COMMIT_rpi ?= "f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7" KERNEL_META_BRANCH_rpi ?= "linux-v4.19.y" KERNEL_META_COMMIT_rpi ?= "1e97ab775c4c499b995e7013ffc221d71844ba87" -MACHINE_FEATURES_append_raspberrypi4 = " armstub" ## Mimic meta-raspberrypi behavior ENABLE_UART = "1" KERNEL_SERIAL_rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" -KERNEL_SERIAL_raspberrypi-cm3 ?= "console=ttyAMA0,115200" OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" -OSTREE_KERNEL_ARGS_raspberrypi3 ?= "vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" -OSTREE_KERNEL_ARGS_raspberrypi-cm3 ?= "vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" -OSTREE_KERNEL_ARGS_raspberrypi4 ?= "video=HDMI-A-1:1280x720@60 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 ${OSTREE_KERNEL_ARGS_COMMON_RPI}" KERNEL_DEVICETREE_raspberrypi4-64_sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d.dtbo" SOTA_DT_OVERLAYS_raspberrypi4-64 ?= "vc4-fkms-v3d.dtbo" # This boot arguments are the same from torizon.bbclass From 66ed149ec3782763e6a683e60aca3f5b1f74f3ea Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 27 Jun 2022 13:27:44 -0300 Subject: [PATCH 014/163] recipes-kernel: linux-lmp: Add fragment to enable rpi DRM Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-lmp%.bbappend | 6 ++++++ recipes-kernel/linux/linux-lmp-dev/fragment.cfg | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 recipes-kernel/linux/linux-lmp%.bbappend create mode 100644 recipes-kernel/linux/linux-lmp-dev/fragment.cfg diff --git a/recipes-kernel/linux/linux-lmp%.bbappend b/recipes-kernel/linux/linux-lmp%.bbappend new file mode 100644 index 00000000..00006e4d --- /dev/null +++ b/recipes-kernel/linux/linux-lmp%.bbappend @@ -0,0 +1,6 @@ + +FILESEXTRAPATHS_prepend := "${THISDIR}/linux-lmp-dev:" + +SRC_URI_append = " \ + file://fragment.cfg \ +" diff --git a/recipes-kernel/linux/linux-lmp-dev/fragment.cfg b/recipes-kernel/linux/linux-lmp-dev/fragment.cfg new file mode 100644 index 00000000..151781df --- /dev/null +++ b/recipes-kernel/linux/linux-lmp-dev/fragment.cfg @@ -0,0 +1,16 @@ +CONFIG_I2C_ALGOBIT=y +CONFIG_CEC_CORE=y +CONFIG_DRM=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_V3D=y +CONFIG_DRM_VC4=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_SYS_FOPS=y From 91bcb4171ef9b8539059583a256281eddb305e74 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 27 Jun 2022 13:29:03 -0300 Subject: [PATCH 015/163] plymouth: Change torizonlogo Changing torizonlogo to add the "Powered by Toradex", since the hardware is not by Toradex but the software is Signed-off-by: Matheus Castello --- recipes-core/plymouth/files/spinner.plymouth | 2 +- .../plymouth/files/torizonlogo-white.png | Bin 16442 -> 34590 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-core/plymouth/files/spinner.plymouth b/recipes-core/plymouth/files/spinner.plymouth index 17f0eae3..8b5e3b10 100644 --- a/recipes-core/plymouth/files/spinner.plymouth +++ b/recipes-core/plymouth/files/spinner.plymouth @@ -12,7 +12,7 @@ DialogVerticalAlignment=.382 TitleHorizontalAlignment=.5 TitleVerticalAlignment=.382 HorizontalAlignment=.5 -VerticalAlignment=.7 +VerticalAlignment=.9 WatermarkHorizontalAlignment=.5 WatermarkVerticalAlignment=.45 Transition=none diff --git a/recipes-core/plymouth/files/torizonlogo-white.png b/recipes-core/plymouth/files/torizonlogo-white.png index c9cda4845ae7d50d54dfa9d1403db53b8b6a78ea..e44dd0380acbe057312bbd807aefa0babff830c6 100644 GIT binary patch literal 34590 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 i4fp@jqp-M{-gBdI88%2&&RKKviaFbrt` literal 16442 zcmX}T2Rz%~_dkvlZPY3;TPj+ru@$97ty-mu#4Kv>6?;{*)E>3Bsu{7x9?=%5*&@`Y zM(kPIs_}dIyubhd!y_Jfyk2>|?!9N+bI$WVPo%b%3N@GwOhQ6Jt){A^LqbAk0DMop zN&)=m(?^UCM8n}@57y_5BAPd_*7+t$AJHY6mzQx$2>@9&gRhhGr+ z0x;<=>|bGpaN>r3c*hC+Dnk9mFkntu`MbHYxmkZY&^@h-9PCs=ZUyEB)@k`E-2Z z)lF_cqvqlqMCMJHv7q6|SMgom09mPn)wTm@k5R!rq7EW)0?TED;a7WKG{>D+U{PzW zng~}=+TdP+rJfp1m~K`)Ht@3zC)=@DJecS`^Z^AEAKKpaxRTXFb#hA4lpL+tVW0dj z?G?%UVM>?nl!f7?&BH(t;z@P;$m1XRC4X}*8cyFBA3#HdE8T++VVfPLDa;!89VJ7* zl3gjYwQnXC7TFEK`$%r{9ze0r=*chmKD6D?zu)LY^lHf+cup z46qV^K6>G}Tt^%nD8 z_}j%)?|~-bvi+ylRfZpWpHg9I^)5V5nM+q_$NH$s9%*%IFQGSb*2I-NWJd*UZX+Bh z+}p1{S@RIl;GQrN^kA;DB8S&2By3yMArE+cZetQP9{r_i<;0&!xX?DAKbq;=z5Ux{ z?VJ{$!n@2n6O5Yb&}uS`XoveEGp`(ptd8KJxjHtSju~T%miX*R{n^=gm3l+udP8a+ zM^i$wG@`x>{PklMTM^Mnr+RO6QhAbBAu~zsfzsW{+Hn`A5-!13shvS@#I-egFGp$F z7OJwxO*zHzyfIah1A%`uf>=XHo>&I{=nEvMphc~%@0WA;%{4FY{<_A{K<9g6xxM4# z;y%`L>OcC%OFiqH-K8{tOI1k|D49Kz8{&i$LXOpV12@cj2Z@SXf4UY;xv2(09k_h3 zra;|0*$P+fXJj(`LgYU`C5dVqkn(-cxU;IbfwM*b;&VtBFQfK~zGiM*UL|1r9(T85 z7#pSVs2`ZFuQ}L({Jiy_bSNM2LmL+inuC4Xs?t;kq{- zS2Pe-b@?QRI@NCZpM~&U^#A=EO^RCdKPKf$9Bd$nZ;Z4LD{#Z-8<)54)N+Oy5a%|X z@ai1yf6Kc2+4Lo3-Z;80>eFUQI%KUC(Xi2Eu$!)kX#FPMZvK4g(z^L%ga?mVB3}R{ z&*nSCF83^NvrsEgIoeyY1ZT84W4@0g{oZF~W-n@;e4jR)vz4bQVK*`LBvYl@$1=xZ z!KFpo)Z(e35l6p>)eoIuQn#mi0&Uv2LKaBv&7*Q2oi+W^&2HKiW%7KWI$C+{X2#F{ zyb+ca0R|cwTs_G$BS}CK1?rPlZmI7Vb!}#5E`=kpLwT||6Je3flZ4Tn?5&-bl?y64 zN`caYOu?i5Hg`|rr4u~LORus^)r+RbIt%d2h+9;t)F`|v51n7HvHLru(dS$mSQrCF(L$c}b3%B6l4q=mq*XJH}+;!yTJA{xC&>S9HO#Vn-wVK;sjq~XG!MiyI)XrB@S1p zZ>vO+pSpj?>U++ndCl!Hi5b@YH5?(4CTMG%Ls-nMHhEiWGpf*>pMJt&P|=24v}gE5 zoB{@1V@FYH$DK#*b6c-&Iz(;bv6Q;>^9}7-o$v1_L>5kr_YL@ugum^4T8gaAC#+BK zc^YxF+*d|zDBoK2H>LH`(0N!?sr`KoR_aatg|?tKH2J4U|AB&w3z5zubCvw2f8usN zidVvEnMv77^|80BGhTZmDw^c(j**5D!*G}4y_CkcORXzo1`nWx^*Hn8>0H0fl6fOy z2a!ic@3R=QFvPt?<8DD_>f(9prwjgok6Cl>E^N_s2RWWHj=JmRo&Bt3OirTrYWicO z*1`nWY=0iNjYa;kr)w<1xw;jxAUpd{xlJt4Oeo!_9>>HBGQ6WYFwYW-anWNuj0E{V#_u!)k^Zvt zdot;){~&n{nFaEH6ZlAx>xd#JOee03ptByi&PmdAcrd_jwRP3hMinlhI1922?Gnx$ zQg!u~Go99V_oq4`$(~^gqC27U@?aA?HFO)@XwKsDE!Lg-L|K$Qe29O<;D5LsWn=$OUZV?nh{wPA)s#J?fN%Lm>7S!Bh}`^d3&t?S)Ftb zsb=G#9#qh#w%lS3LVEo}dhxu;D#?ON`JX%IMgC?Q zz9^ym%F{Sz%z2K+A$>b-ls2y=vm%*THSrYq9 z_yNVkhgY6bCAaS&cPo#Z&!$JS=V_w{J!;IKiHra#8ij?1iW14iFx^HQ^P~C0b!Srg_BXc!i4%sQAm0@k!fV?3D@afv+JS zL$D!PsNt}fX`{|QDPlH~<_q|lgh(1(9%)Xbkdu|Nx;eYB`v|x(B(O-1$Vo>EyGi6f zcwF+akZ-w|ekT9sx15uKe%Sel6kk%(`XdSRGox>s#6bQhP4pn1q;6*vMeQi(Z?zoOMp>#RNU zugMYLGy-nCfpj4;rFllVO2$deYTFQ;0$2i(V(M8FC6bX10D~T zGXr6qt&N+mE<1CL+E$p0i4bRTJ|TS6!COn-my&X~F{i?$A6hO9A}Yfg5OpLDADueP zS9&6Frd&&+upiF`44MAituCiO8jZMA%tKK(a>Rh2nEgW}WQX$jI_qm}sEDo10uhHm zFg=7>9j~4sEQS_wWeAs;Y1FJj5BGm-I};NIp0kF0<0K0(n7p9{HVgozSq{+`wj0K3 z8OYLX(Tlp+@6|PY$@W5-fwBxIna<7de_9|Oz@R3tuPdP-$Ybu|7>h-10gb+I)x_0;+`TJ6o_5l zxVYFO5p=g#oot^lZE0}@afZ;9Q z^f~YT3vc`%*Z&N4XTu&?h#~ziHUHCLEcM{kNmc8hVvC_+HBj-t{avZ+PT$upH7|WC zWul(|dE!$dr~K}f6$JJ@F1-#ukU`s)czzb3MYY zzht+E7^AE!oZ`3GkQ@#Fn_;=BBn5{gM3kdU{8!t}bo-Tn1%4L)=lG{g#$6IyfYapT zBR;r4hrfOr|GK0%@{Q6mA8eV22HwtSM{H>@P&&pc3^o5eIbw;v+=LoZHs34b92I-8 zi0YRjL^$pUQQ5mg%PQ2Mz<@&Mf^WL4@RW%wFTeQTJK!)~24$;DEkY(XRo-g6jX^#^ zP*m2|LjED}SK+{B!L>wTF0&AiXi$mERq7_>`nm%ua0$_C2!$Xe$PsV(Bq7cLbjUf< zK+3h%oUu;T&l#?Dp*c}foRnJC9xpw3_req0J0aOu^}K@8Z(da1+Jj)!di1NaH#_41 z!>$u>6VPB*dG|I(EUT^XL;CX!vd^7Yj_Ygh4$v6BgWaqnIw?=hAJWy?ocBk8zGSnb zwlOBkPeZsBdh{z6ls=$Q56HfD-ZnZUb9}!~*57;%dudKsJqn`ElxR4G;mZ|^ky)p0 zAJXgC?FAP-5DnDvpscqsy%=-dI^w{U^PZ7i!Zk&=Q#>YPm1iU!$!ISQGnk~Ap{ljV z*H`SzF@&K_Kbvz1vOF*~*Az81mzsE81P0vEV`|><7kwhUL&Eujcj^oWqC*B#waxX3 zi;xB0w+b8rONa#>XMYIWQ(oW}u*ec|Tzx4J+@UnkO#Wl455kCgqtNplaCYp_i6dEm z=;Irrx0p)?^{{#IuX@>qs(Dz2F6HwHaLDExKPLNPMQ9BkSv__n-|Wtg4QUOrM>GtX zu=vXZCSurCY%@Gb*VG$DFzLf&ILnM9p_7-vW?dyowXh=*Z%*(8ZMOq^PIVL+RC-04bu}^6$>}-YQ`B?@Vh<1<14f^ z>WC)bEtl>d7E;rGV5FRg7^zN>sqKo9uQk5uI~aQdSqbvCJFp}-9ov5O!@6{1BZQf% z+ZQGN)fcs5a)E^dp+t^UsLsRLKdN46V;)g$I$+42uDGPN?i1p~DVj6CV7r|mW6L~( z#)~5A!{o#qZH#wy2PVmyX8U5@uU+4s|2p#}9eLZ0W*fWKBw@8>73Qx7=d^t*VgY%p|W)=vgoy-5=oW)Z(Ob@VX-i@lFk8u(22`I(BJcv5ALA{1#(S`OYlayn^;V3-ffbj^LAs=yE=b;LHRbn1cXg1a-K z}}fOKhSC#(G|YBJK14>XvItW6-I-Zcudg=km;M=wpND~QtgLnbBa zXnj7r&sO=%sf;JXJM@mc|ClQ)ed0V2(oNilVL%)z30Y#dYF)SGvXq1AK>*1`eX?ep z$C&lh3}j9s+!>IvpupPWv_{Y_4XY&9S4~62)_NplyPzB~sI>5rYl$77#bON)oMTDWCDE%V>`sGr}*S~H_je3p`9L%nwd>3m& zW&Z^&(7~ob^U+dylnpej&eWg1-&9Fx2mE5WSbP0+#C}K_2c>6CPRaqv!%OyG@4|1- z;%SoRgvgnqRM&O8woApAo!>>_mk^~4*x#0SVUqbAoMQ}4*xz0h>pl*@?wtOdx}Z*y z&3btz!)}F^&Z##L3oA0#6o6uNGv~J*C&m)?qtj^zLlRp*?8f_tqcjzJW)amPwC|7m z>Ir&S6~V3gCbB1aXCiw%uyI94Qd$v%U96+-cBssin^arWP7^1PNc8!evBKZwxb{M- ze@}w>;F|D~gs8F$5*m=V<5^VUc=3jQA^XgH;>ioRR4#h9r#5ap?0xiz1F*+)^45BB*i~Tm)7Xi{Z={~#pkkMC1 zsbK%TLh1=LMyiT*itYCZ`TW(4Nw>PTN#qdeoK3g?LJDA;-_x^Rh!8oS=pQ4!o~BY| z9G?}8X)@R+wW2v_0%;6T$I_>b1%;b^`Y3LgAR9$E+J!p%nv<6JE-Ma;`v5&iLo9k< zSO53|F2m^?ox*P3AE`QDX^lRS(4jY7u@$476M#Nv`|Bj{hdyN+ zb?6h&k~ru&+^qMHVC9JdTwk9cHzAuv)IPHn1Lc+mNyNJxg~}JBUuzS(3)_1~*D+0@ zzfM+A(|TS&l(uZg9kj{SC#=_TEv*z5HMl$?E7qiD{cYT(K9K3R`>TGyKO0i>zxyA?6VKkNJo z(6SY1UgJgi59o;r+32eLfPmf-kZbwuR`U6Ewz{j8%tw;AhsTk}?}Y(R|B! zg!bs%hyD7?^o*`QQ<^@9IKM_cY7InT^9_+&cOg zB^4{{`I>BwQFQfz?^hj*q2fZJcWFkGG&ea!ZHzxeIy`1H$TZ?VMM*p#`_%n~|rYb1B*;`eM0X!hrQjn^VFjC_iQ`($Xc)fPJFT z;IhF_71t51MbXMuuCOcQV9W~<+eZtwxG5kpq32raN0g?dBboNh5S6Qx!oPA8Vi_I7 zgafpAx!>%N9ovi#bOKVb80rt{R|8^E;6tmxitgdGwGoGLuR;aCN=P=Iq8+D05Ksku z?tSw-3V#hzn&rTJxS|GgJj?8rb`V<-8j&xL4rVk!pD-;1!X$_EOwG$ScyPC3;#Eq` z=n_qL3@K6rIV4HWRi)((n-J@@)5>4kw35#`Zy`I#+vX$AIIM^X_Um&uu)Rt8M$J5P zEVUMz8rH|z)(@y{CFa{Q=@*bdl;eZ_P#=(r^c<_dg+$#_4EM`^w8~F4qe{H>kGrgC zb8UY|Nd!-h*xnz%i*UhZb3PB)zEiSkf*6 zWZQA$PkRcx@I;jA^WK574KR+u)0H6r!U0JXHzt>ENdQVLRT!HP+u=uB6m59SuG|HD zJF=Od)}JEBRk)qQYB*ti6ye5KN4!Z9m^f}3utWbt!FJH(8+24>VBM-{@oM@BHbFol zfSS;P;nZwyE#5S@oA?9^W%!ZL1W1emo%5DtJ+Vu{-19k*C|+P%{FaZPBZsja=o7NF zzF#P!>cpq+LS3~{`}UGeCi=;S?&0b2cVwG+g%#|#f=WCi-*=S0fjH&Yl9g*n%6`ln zEKxJILfk%UMVw8ZzKL*h4MP{856e8POn=Y7pqkTi@Pk*SL4KVj$7w!qG3|nNgI}^I zK%H0*@>_JGQF707Wr%|2Ng}T$$#$*A2S#{5Sjbv~ujgI6>0~`!{Q_^d>8UvI7xryu zb&?#H6*_FV0Uv?v@=%JSc%5<*PDV)x0ev)wfxzcJvj1GDvJ?=7 z4}{IcpmP-*@eu5;4M&V%gx)qiLo z|$%7vpU`x-9@?I<&YW~K&vELe{m-kx(XN_P%+;)MZ4`E5nfw0 z*mvWE%Es;Ub5K6|pJF7hiAI))H@0&ZsF>b`n=i}y%jvobR%_v;ZUV(A3=hid)m=;$B-13~mw#PmlTPLs##Th=?KhP;w&BR&?G)guPjbA_l;clNZwh@Ni?&4HN1wdt zgXquS-9Fn;cPH17&EkC#EW2x>8E*#rfPQ40!Nb8l8{wsA()IrLvN0~Y!ik{@PAHnv zk3{d>mvQ-}zo`=}vvT29eoRuWi2qXp;fJmU#(2Kdo)ogUCK-+yV|L?1x5$P>Jo~~u zt#SPm7(uDAkr82H7ltmh*Bk!KIDfIPMK9G4#+Dx!3CI7;vKwYhRK$GCzgNvByojjQ z!{#t4#5(aot)F|!#iO4_?QZ|Aj;JRPtM8**?%T&3eAi9oWKJAGo;l%LQrM%%YHOYC98&&@G8C*`j`KLokRCM{g zc3YFbN>wzBM2(kTg{Z=`FQs|5Bn`JIs&VXw@EZ=^7*RWcHoysYv4eEgdFT#wH&x4r zTH6`O#;^3_8zMxL{E1zA7-`evBc{!`srP^Gbzoxx(AxAd zXyF=qx}@UCqX*Ok0sn+m3wqXiskll~c+jIgL)Zk43+hn;anRou`R)SLr}2@h-{%MW zBJkA_7}fpIpRI^|YUL_5WUHY`YzRT{_ayV!wqbD0eqp^7a^NTpy`!=J zlXYQFFi=pik<9W`K}oAdLFPadCfw73HuBfXN4r>B0|0@4bFWYOPo&yKYXjs}S#gM* z4x#*hO9GZr^!$b>qG*P)z=1hDCPlI5764LlE!`eTn3bnTO}u*slQ|;INB5U+_~EMf zIy!q&w5P>hSTU`UMVZ}cd8$-NHdO85#rUTb;-CyKA-!;1*|^u^Vd4i-YRY4web*^rSihvx?DPXNMfDZ(rT11=yB)f zfn$h@qYvmMv*?`shVi~DY?}On=P0HRW6sKD8L&W?x^sJ)HZ3e>{St6BNJj5y`MbQ% zPw`4QNdaCMrc*8S3=mqY-Ro}M5X*{$4{Pc1qe{zCu;mkt(Z$F|eCJ~eI`mR~;1oB( z?qb$9J*AVgTQ!XIe;?YvS8Sz$6KW+V@*2pza+wmjPdo)4eF4XOug0-?C8EzORLTu~ z-o{{2RY^N+0bI1Kj*X)Ubqrif0}1r13|#@vveo){-*yPUI$U3yu*rA6H3R>MuRX~t z>V6n2`)B|>rc2Q3QHNwipCm^lPu|=1SB2}}xiu=Z;ZHv~3QqY&0n;YFqHpd6AE|wx zzo0cj)#!O`UAOF)LgX7OEo((N_dmRDq(3FZRbk^b)zBfpwRC~PDEK_jA0$Um8@i@h zDfUPd%BZ&=Y$ntM;_q|vM-}_|9I{|EPm{unCtvGUn8fOA&wWyl#6Qpf_VKSyyp&^B zT=e4xDFV3ZT!+9~*j}f6X58{X+hnvW396VX*+_N-JykIrecq) zV)zq%N?sN7q=bD=MD;y5HTvW>;W~r&O3*ZT%&-1=|GIKu7w|3Us|vkxCW|0r;&TJ8 z2_I{Y`KK+dRXe?i{2>dq3Jr?M63mmFG$2z$*u_AX-t1t>W_h4y^`e$r(^@FhGilM3JyI2vcepq z&@(JQe#ND_*6aK#hE;T^@lt5FEQYvoSuv#~oDovA-EC)&(i5nKXjoO=ALEl{yiaNp zYE1Cp3)W1%qklND02rwrMmUsUF0Bq_ZmK?dsFFz$p1BA%9xcFy>g0I7k5uU%c9XQCxs1!tWNCk zKS+NJ_mNSC#W(|~ApPE5rk71oBww;QK@+6PJtP?F)0(xtwFLJ7e7aW65}KAoOcAlR zQy_qD=|ImZex>dX*)?0wg=*}X)sTS-RpT=nTrC`;oC@1V0Q=V_B-y<_wrv+sDr9yJ znR6uH(3=V@+!IWb{Hf7*4$sU9JzZnvt zC3=ruSi$<6n*Y)#h7|@4IKLo3OT2hnSQSa2wU2VPWqhO2f_j9?VM_2M{!>B?XElQx z+j_KBUP6t}WIIA6&DwG(J|s^!kj{x4MyCHI+qE}Py_NFX(?>H^l-WNPdS84q_C z*PxkVjtiR;1_W#KG^+gSaHKy z;Q&JikC`a*3t*^137jKkTvGX!J^net$eE&t^#V8p}I3&t5 zOGwnDK~=0*^kvseW;+KO=z=8LABz^87M-OOvGw`Z{HwT$?IiBygJzt=35Bxbi4a8CK)$Z(C>#df4;eC0vD)b zLjbt??KR!&PbCiozS};v&}yWJlZ{8usnx`Ov6Q(!K$rOZ@@NjGt}FSgp+P%lpMN$Z z?mP9%`Meoh>!_t`{ruG=cVd};T=_BB*RW>+zl9*g8+8e;A0hvG2abY0)#1P41Z7X} zmZjVDe)8M+O7=i__SgXuURQ*xTBXd)8@{K?8 ziPDN9w%o8QW%wJ3^NA9_Ub?Jgv5<8XqT}uMyApEH7L~6EEr{(2t*dh?(iW{_ufoYH zd0w`GbCx6h)@6+Kp2omtH>dULXLF>7B!%PkCmQden!=PW&pp_qel=`( z_nx|2M?63mIYVzKFMD}5$OlrJ=N{YndP1u}mDM^jzo-(nE3{eBCvt^C%g{HdUjL5~ zTl~E6fEf}URXh3Tt7`>rmY{!^IV4(66agm#)T~wHb9UCPPV{>l2{q60 z^&`=5(3M5@Bc~;N-UlD&!f<`i0}a@ZFD3h}>3swaRQ>GJCvd9ShtweroUfu)dH>1J zlDr^{@}1veR68V(#%y>SPltt}cU-M0o+bXx15Ia^afXNFSeRB4QzG~=w+Qn&9$5@r z6}2-J=#o$GE1O<2hz4KNE!L?-y(}3Du@_V5Il9aTWa$4$cJmI#8(rVxhGs-0Z$%6n zhqUu~$IM}OEnwOuW&yXTbO~vO8PcY0&*{+qjBXJrj^;k}emL-vLE;CziXjSsLpOo@ zpP>i!kj!V{s`2kT*pM9#VOhXQO%&b(*NAbVdgsVCaR7$>C`+KGeHZg4MCP6_r~*Vw zTJ`KDkr^^cXRkxhgddSE*ukbh#VcE7MtF|UUohtLit+K*>>8n@m(~USc!5NX0=7T_ z)D`bMkQ%>lB+6&A`lUij#c~m8K0w6SsV7U)Jc|sc?FJYjw(pAV-$dM`*m`pRUY`N= zpLTTcb9ig;6x8aJ$7&$IwcOD5T?~+cvsakEK>L%er?ueq4*Zd*S*2wGM0G~`VQsn? z?Zc72mbh6b@{O31AOq!KpL28a8FO7i&^_-u;f;2vMPhKOr8FA-u}x<=WcFVy2rL|cLfXa0*_itqqzd|^Z8(fz(#3@)qk=IsglW|wN1 zRfnsD#2ZgC1w*0b1g&r;CLxoj7DHbPxyIUM>7@-JhR!(!=$z|ryVu}BT#V9QQ%R&9 zm5=m}ijx0{opP$luu{Sc4O+udX50FN6u$Aybrpnpt$l;K=j}D5h)`!TAN1Y(6Wi1N zz6Q4}v}t}jE63Ttgc`70ON#hCHwQcr=^xvLMSmOfU!2BOB=3?xpiSq4x;9*9A_Cut zPgzs~uJMFUJ^c+e)8gDY&g}u;v?bq&#CsunsEen(+6JzD6N=}QoL^~}E5T_SE``Axf}yB) zFm@Bd|4MLIkA4QA2_@+J-E8f#M=#8yB9dLsS&=Sxyu5tgd|2zQdPf~J{Sm!MvRm)r zbuIu+X_R!Ig~KYD5{`c}?UUq)tM8=68=^$cC&0fli}_&hjGO(TKhLVzSfDcF4ii0> z#e!51SVGs4yqe4{kKTF33EocS|6Njp2vn!`ftf!wxhy{dIPuRSR(Lz>+VYoyk2o;& zAZ6-2Wu`%uyBs9Nh94+w zQrlgQk|F|=EZV2$%F)h}liP^}ymNBqtXq4sf#B(1UMSuk%*LHLuvt4Oa#6NcR$&zjDA53?ca*7v=4g(Hy&&e zx0>M)6{vev#|O_TMoW^KmHaUcd!bJzw6@%TZ}lbvGTEYTaU0y!l=VqcaE!k3+!ftuRKvU`deD9P7^nk<26=uJ@I~&Yq`GOD+qBLq2 zp-J&2mC#5;N-ZySBMC?4%eLNIaGB6w)`qKv z%WI-1^3dAy2u8oG{3~Ui5Rh~0xRQe7uviS#-DLs$$PwuFWQ#6wm5oy$1QR!lZD@ zq*cz8bw%=O`aNd2z=*{MqTZ3gi0TLE8<)*NN&qXCj8H8*W)`u1la3Txku~`k3=zF! zb@~I`Qu(7B{Ggg^uMnN;(mo;xf2j<2Md`FJYB43gHs+FK(L1`mz>cUyfs~iy8TR^H z);_wGiWA2lXqA@hd9iB#TaNm*%jOjq!8qF~v;MeBQ_&e>;W(1rB0A0^eosbZRabrc z?u|s4vX%0h9m8K+J+BUQs(^Wm0$fsu@DDW%1Oou7Ur{a`YYIz$_W_`XwQKKu7qpM> z>flkT@8g0_U((>Kzf1TczX* zw!ECaMdIc7=2-kaImd_fjy42?CFY-PXc&6t-7HM>NQn>0iZF6PM@tbwMUadCo`IZ25!l=u}Az;OY909oNsi;*_ zz*0>yPsaAKyZ;lV@kWK5%X3SN*e}VDVGRc>qfE3QRU6ZvuoUM-DSE?kFjf(Mp=<;Z zj#M?1WYt%LPrsy&f{M<9u?1xl@Qm1@iG-HJv=;i^#8G9dnoGp1^V(@+isPa&&K7p! z)DeF0u8%}dDeBj-6B@UB4|fb5`7IAvkI2Fum_9PmPd-v=ldO@n+z60m2%js}q}w`~ z3j8%m+iV{;A7=yAv0*}}=y`dK>=CsDtvZ&;sIBxdOVD>Pw^@=}u&ZEfgllt-l~7rxhRF*VOX->a6mq8>ZX zMwy!Q-dK2}Y$KL&m-peg7>*0K8)7?s>LdulsQ6$1QJQ8+&yAyi9?-&m#F2G=6xO2R zKOFiXQSFOOM}k-M&E~FurUb(8B}CXnPybg49>iIu&8NF{%`FXW$_=fm`2_#wxpmC@ z#Kzj#;E6+vzNgsX4G~*$mf*J*Isba4xvkpz!OiFNiOfKupJ_mfSGiDt6O#}LuCLbT z^QhJSQI^lW?Ffc`0bwe)Jfw)aOKF z3SBjkZ;t);5n3IL2Ya37?NPXsJ0_!L$uO^0D85B21AJILrNq!t{p!Ab2Oj!Ad+Ez2RKC&J`bG{4;E=yG>k=MmY~eFansTCg&k{QSUCKUJ!^5@f?qe(E()} zVmK{;t?Z*A&1K-PXgSavUXQBZvP9V z=1gO1zjCs62(3j$Bs;rp%{1MC*73>3VVFCvVFaMo|6WK-->ZHa7Q>0cC`nIh_dHn8 z5FxInrv*p|K;xtE^NDYkX$(#5Vrt95-|`5+8)9PW)f->apNC z@)R$+Lt@G(I#eI(a!QxTuBQAtgF|`t;P##<{of{tr%S<&M7cyGy};hS<8KT&MIg@oRhWj4+`Iht3XN#)C}34{6~#|bd!L304`$!XFrY_85`Zm zL7&j=Ij72Yz4(#>fNTdrm%Lv;xiwu+@5kpdT$a%Zi@ZuaKskySdHeR(+69jI*+G)w z?0kOFWS+o5?98jrBw!Wwolo9IVD3XF4CE(r)d6)w%P$yhu75Y=t{d*omJ+dLfc=Pw z;HOKRRnzV2*RnQaehBeZhwthVG~h=H@UvL-ImqCdk$_R_%0=30ILh#SxR{(x7<;6Y zP@I%xQs%c5F9`mC>!T-%*aL72>ou z$ymq*VJuccAcZPt`~LE9p}VtJjhLeG9f(qh=I6*^9;|1EU9DCn!I~hOWyT%klQJbe z`bpT0VUL>rFAB251V5uLvwm+aZ7*N2o3$+-%i>SFzFfBwUI{UX7Bo>T-o7a9$<{#4 zRs>QFlL^rpt}{g2u{r!h_PIW(`h>(y1Lhvson9wfR({?GXcv~SVn!?hy_A8!nWNsoU!J{S>3_tI z2Uf{0bZ9g?De`~B+lsEdR`^Zv&e2#i4X%} zV=)mk+)%PWLZA0q8m^uux_mU`-90lCY7qPXIK)Fo2ws?4QFmaU9*Zo^!@0f&VY028 zqLtXt!P1TUIFMeeq~jIeL?GoKV?|2bxmB{eoVc+reDqC=qwJFRSD6j4z&~0DI)Pf=B18gh`%|WT>u5_e<`wrDZ$-W`e1gl_l$ri-T1w*=lT=E81NR14y#&C!+AsWXny%DVDDnHN zZD|h}fEw3%u{r_bzdQlQ!po6r703M@7b;;fLPq~<4LMSo6#A1JCDlk`Y~0LrPIJ(g zU|-hN2amX9-9xG~fT!cREdQ^K<9x&Z4(AJ zdjF?gO8-lS_)sjZjF5yh1X)SqUE?9}maRDqK5dWv? z|9+iCM?PMfUdQStvIhn5nqhewnhaTIa!bL{C&Q%Yqrmfb_NEft%m1&JMfd}-&x#OL z7Z_o-4{0B=FH3TbDj&&3NVS4?N#^GEQnvpo;2#eCCx^g{1ac;R0G-e{4VuA^ z!}%L+e!T9GyzX^*FHz0Vyz6}`jgLX|dq&?NeACQ-Z8kqyed?~3-w@q-`(a(Xt)_I5 zf+ch3KUMi@P5~Mfu~jTBwEjc`^bq{lUJ>a$QfW@0V*L%AN_ALSXZ<0?gH25?ZGa|_ zeACY%piYp?#>jA?3fFoG(fzOKCaG5sCOjE|ai6F^;|x+8n9O`&=|*YZ-hw~F4dR{$ hbzk=JAY)Ho4`fAU40Ghefle|KHDxWON(J-K{|CQ?<~INU From 73448539f5bb68cf93c0b7f5e5cb8a5e4c4ab5a4 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 27 Jun 2022 21:35:56 -0300 Subject: [PATCH 016/163] resize-helper: Resize root filesystem to fit available space Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 1 + .../resize-helper/resize-helper/resize-helper | 62 +++++++++++++++++++ .../resize-helper/resize-helper.service | 13 ++++ .../resize-helper/resize-helper_0.1.bb | 27 ++++++++ 4 files changed, 103 insertions(+) create mode 100644 recipes-support/resize-helper/resize-helper/resize-helper create mode 100644 recipes-support/resize-helper/resize-helper/resize-helper.service create mode 100644 recipes-support/resize-helper/resize-helper_0.1.bb diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 3cdd6fc3..79e5c2d3 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -2,6 +2,7 @@ WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" hostname_pn-base-files = "${MACHINE}" +CORE_IMAGE_BASE_INSTALL_append = "resize-helper" CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" # Raspberry Pi diff --git a/recipes-support/resize-helper/resize-helper/resize-helper b/recipes-support/resize-helper/resize-helper/resize-helper new file mode 100644 index 00000000..3f1d2d42 --- /dev/null +++ b/recipes-support/resize-helper/resize-helper/resize-helper @@ -0,0 +1,62 @@ +#!/bin/sh +# Copyright (c) Fathi Boudra +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +# we must be root +[ $(whoami) = "root" ] || { echo "E: You must be root" && exit 1; } + +# we must have few tools +SGDISK=$(which sgdisk) || { echo "E: You must have sgdisk" && exit 1; } +PARTED=$(which parted) || { echo "E: You must have parted" && exit 1; } +PARTPROBE=$(which partprobe) || { echo "E: You must have partprobe" && exit 1; } +RESIZE2FS=$(which resize2fs) || { echo "E: You must have resize2fs" && exit 1; } + +# find root device +ROOT_DEVICE=$(findmnt --noheadings --output=SOURCE / | cut -d'[' -f1) +# prune root device (for example UUID) +ROOT_DEVICE=$(realpath ${ROOT_DEVICE}) +# get the partition number and type +PART_ENTRY_NUMBER=$(udevadm info --query=property --name=${ROOT_DEVICE} | grep '^ID_PART_ENTRY_NUMBER=' | cut -d'=' -f2) + +# in case the root device is not on a partitioned media +if [ "x$PART_ENTRY_NUMBER" = "x" ]; then + ${RESIZE2FS} "${ROOT_DEVICE}" + exit 0 +fi + +PART_TABLE_TYPE=$(udevadm info --query=property --name=${ROOT_DEVICE} | grep '^ID_PART_TABLE_TYPE=' | cut -d'=' -f2) +# find the block device +DEVICE=$(udevadm info --query=path --name=${ROOT_DEVICE} | awk -F'/' '{print $(NF-1)}') +DEVICE="/dev/${DEVICE}" + +if [ "$PART_TABLE_TYPE" = "gpt" ]; then + ${SGDISK} -e ${DEVICE} + ${PARTPROBE} +fi + +# 'Yes' is required when partition is already mounted +echo -e 'Yes\n100%' | ${PARTED} ---pretend-input-tty ${DEVICE} resizepart ${PART_ENTRY_NUMBER} || + echo -e '100%' | ${PARTED} ---pretend-input-tty ${DEVICE} resizepart ${PART_ENTRY_NUMBER} +${PARTPROBE} +${RESIZE2FS} "${ROOT_DEVICE}" diff --git a/recipes-support/resize-helper/resize-helper/resize-helper.service b/recipes-support/resize-helper/resize-helper/resize-helper.service new file mode 100644 index 00000000..e3a0f8e4 --- /dev/null +++ b/recipes-support/resize-helper/resize-helper/resize-helper.service @@ -0,0 +1,13 @@ +[Unit] +Description=Resize root filesystem to fit available disk space +Wants=systemd-udevd.service systemd-udev-trigger.service +After=systemd-remount-fs.service systemd-udevd.service + +[Service] +Type=oneshot +ExecStartPre=-/bin/udevadm settle +ExecStart=-/usr/sbin/resize-helper +ExecStartPost=/bin/systemctl disable resize-helper.service + +[Install] +WantedBy=basic.target diff --git a/recipes-support/resize-helper/resize-helper_0.1.bb b/recipes-support/resize-helper/resize-helper_0.1.bb new file mode 100644 index 00000000..61fbfba5 --- /dev/null +++ b/recipes-support/resize-helper/resize-helper_0.1.bb @@ -0,0 +1,27 @@ +SUMMARY = "Rootfs disk resize-helper" +SECTION = "devel" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/BSD-2-Clause;md5=cb641bc04cda31daea161b1bc15da69f" + +inherit allarch systemd + +RDEPENDS_${PN} += "e2fsprogs-resize2fs gptfdisk parted util-linux-findmnt" + +SRC_URI = "file://resize-helper \ + file://resize-helper.service \ +" + +S = "${WORKDIR}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +do_install () { + install -d ${D}${sbindir} + install -m 0755 ${S}/resize-helper ${D}${sbindir} + + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${S}/resize-helper.service ${D}${systemd_system_unitdir} +} + +SYSTEMD_SERVICE_${PN} = "resize-helper.service" +SYSTEMD_AUTO_ENABLE_${PN} = "enable" From 896f09afbf15345f1695eb4d5e7d9491877f8726 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 27 Jun 2022 22:45:08 -0300 Subject: [PATCH 017/163] raspberrypi4-64: Change the LINUX_VERSION_EXTENSION Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 79e5c2d3..92683ae9 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -28,6 +28,7 @@ KERNEL_IMAGETYPE_rpi = "fitImage" ## RPI: Use official raspberrypi downstream kernel PREFERRED_PROVIDER_virtual/kernel_rpi ?= "linux-lmp-dev" +LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" LINUX_VERSION_rpi ?= "4.19.y" KERNEL_REPO_rpi ?= "git://github.com/raspberrypi/linux.git" KERNEL_BRANCH_rpi ?= "rpi-4.19.y" From 5431c11e2be0250923606d66189b8d477e168737 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 27 Jun 2022 22:45:50 -0300 Subject: [PATCH 018/163] base-files: motd: Add a motd warning about labs Signed-off-by: Matheus Castello --- recipes-core/base-files/base-files/motd | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 recipes-core/base-files/base-files/motd diff --git a/recipes-core/base-files/base-files/motd b/recipes-core/base-files/base-files/motd new file mode 100644 index 00000000..daa4ba3b --- /dev/null +++ b/recipes-core/base-files/base-files/motd @@ -0,0 +1,2 @@ +This is a Experimental Toradex Labs Project +https://labs.toradex.com/projects  From 26baa9d1168877b9beaf108896c51fa3732096d6 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 29 Jun 2022 01:19:17 -0300 Subject: [PATCH 019/163] raspberrypi3-64: Add Raspberry Pi 3B 64bit support Signed-off-by: Matheus Castello --- classes/image_type_torizon.bbclass | 4 +- conf/machine/include/raspberrypi3-64.inc | 63 ++++++++++++++++++++++++ scripts/setup-environment-internal | 2 +- 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 conf/machine/include/raspberrypi3-64.inc diff --git a/classes/image_type_torizon.bbclass b/classes/image_type_torizon.bbclass index 054b24af..03b89336 100644 --- a/classes/image_type_torizon.bbclass +++ b/classes/image_type_torizon.bbclass @@ -28,7 +28,9 @@ EXTRA_IMAGECMD:ota-ext4:qemuarm64 = "-O ^64bit,^metadata_csum -L otaroot -i 4096 IMAGE_CMD:ota:prepend() { if [ "${OSTREE_BOOTLOADER}" = "u-boot" ]; then - cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr + if [ "${MACHINE}" = *"raspberrypi"* ]; then + cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr + fi fi } do_image_ota[depends] += "${@'u-boot-default-script:do_deploy' if d.getVar('OSTREE_BOOTLOADER') == 'u-boot' else ''}" diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc new file mode 100644 index 00000000..bb46deeb --- /dev/null +++ b/conf/machine/include/raspberrypi3-64.inc @@ -0,0 +1,63 @@ + +WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" + +hostname_pn-base-files = "${MACHINE}" +CORE_IMAGE_BASE_INSTALL_append = "resize-helper" +CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" + +# Raspberry Pi +PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" +PREFERRED_PROVIDER_virtual/bootloader_sota = "u-boot-fio" +PREFERRED_PROVIDER_virtual/bootloader_rpi = "u-boot-fio" +PREFERRED_PROVIDER_u-boot_rpi = "u-boot-fio" +SOTA_CLIENT_FEATURES_append_rpi = " ubootenv" +WKS_FILE_DEPENDS_BOOTLOADERS_rpi = "virtual/bootloader" +WKS_FILE_DEPENDS_append_rpi = " u-boot-default-script" +PREFERRED_PROVIDER_u-boot-default-script_rpi = "u-boot-ostree-scr" +PREFERRED_PROVIDER_u-boot-default-script_sota_rpi = "u-boot-ostree-scr-fit" + +PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" +IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg teziimg" +# We need ota-ext4 and wic for rpi +IMAGE_FSTYPES_REMOVE = "" +IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " +IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " +KERNEL_CLASSES_rpi = " toradex-fitimage " +OSTREE_KERNEL_rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" +KERNEL_IMAGETYPE_rpi = "fitImage" + +## RPI: Use official raspberrypi downstream kernel +PREFERRED_PROVIDER_virtual/kernel_rpi ?= "linux-lmp-dev" +LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" +LINUX_VERSION_rpi ?= "4.19.y" +KERNEL_REPO_rpi ?= "git://github.com/raspberrypi/linux.git" +KERNEL_BRANCH_rpi ?= "rpi-4.19.y" +KERNEL_COMMIT_rpi ?= "f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7" +KERNEL_META_BRANCH_rpi ?= "linux-v4.19.y" +KERNEL_META_COMMIT_rpi ?= "1e97ab775c4c499b995e7013ffc221d71844ba87" + +## Mimic meta-raspberrypi behavior +ENABLE_UART = "1" +KERNEL_SERIAL_rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" +OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" +# This boot arguments are the same from torizon.bbclass +OSTREE_KERNEL_ARGS_sota_append_rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " + +## U-Boot entrypoints for rpi +UBOOT_ENTRYPOINT_rpi = "0x00008000" +UBOOT_DTB_LOADADDRESS_rpi = "0x02600000" +UBOOT_DTBO_LOADADDRESS_rpi = "0x026d0000" + +# Use meta-lmp but maintain compatibility +BBMASK += " \ + meta-lmp/meta-lmp-base/recipes-connectivity \ + meta-lmp/meta-lmp-base/recipes-containers \ + meta-lmp/meta-lmp-base/recipes-core \ + meta-lmp/meta-lmp-base/recipes-devtools \ + meta-lmp/meta-lmp-base/recipes-extended \ + meta-lmp/meta-lmp-base/recipes-samples \ + meta-lmp/meta-lmp-base/recipes-security \ + meta-lmp/meta-lmp-base/recipes-sota \ + meta-lmp/meta-lmp-base/recipes-support \ + meta-toradex-torizon/recipes-bsp/u-boot \ +" diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 36d47567..59e7b788 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From 5c7bd79761c7c13f7e63b46da1b86a79ae7ae813 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 11 Jul 2022 10:26:13 -0300 Subject: [PATCH 020/163] labs: raspberrypi3: raspberrypi4: Add serial number to hostname Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 2 -- conf/machine/include/raspberrypi4-64.inc | 2 -- 2 files changed, 4 deletions(-) diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index bb46deeb..732ef905 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -1,9 +1,7 @@ WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" -hostname_pn-base-files = "${MACHINE}" CORE_IMAGE_BASE_INSTALL_append = "resize-helper" -CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" # Raspberry Pi PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 92683ae9..0cc9c85c 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -1,9 +1,7 @@ WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" -hostname_pn-base-files = "${MACHINE}" CORE_IMAGE_BASE_INSTALL_append = "resize-helper" -CORE_IMAGE_BASE_INSTALL_remove = "set-hostname" # Raspberry Pi PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" From f57eea94c225629225834fd941857ba7d8c49131 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 16 Jul 2022 13:39:44 -0300 Subject: [PATCH 021/163] recipes-kernel: linux-lmp-dev: fragment: Add MIPI DSI support Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-lmp-dev/fragment.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes-kernel/linux/linux-lmp-dev/fragment.cfg b/recipes-kernel/linux/linux-lmp-dev/fragment.cfg index 151781df..2e4447af 100644 --- a/recipes-kernel/linux/linux-lmp-dev/fragment.cfg +++ b/recipes-kernel/linux/linux-lmp-dev/fragment.cfg @@ -14,3 +14,5 @@ CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y CONFIG_FB_SYS_FOPS=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y From 38a97ffafc32c71bef37b69bd41a26ef1777beed Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 17 Jul 2022 13:33:16 -0300 Subject: [PATCH 022/163] recipes-bsp: uboot: rpi: Add tdxargs support This is mainly for debug purposes, we need to add support also to torizoncore-builder to add custom kernel args in production images. Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 6 +++++- conf/machine/include/raspberrypi4-64.inc | 6 +++++- .../u-boot/u-boot-ostree-scr-fit.bbappend | 5 +++++ .../u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd | 20 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend create mode 100644 recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 732ef905..3856fdc9 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -57,5 +57,9 @@ BBMASK += " \ meta-lmp/meta-lmp-base/recipes-security \ meta-lmp/meta-lmp-base/recipes-sota \ meta-lmp/meta-lmp-base/recipes-support \ - meta-toradex-torizon/recipes-bsp/u-boot \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ + meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 0cc9c85c..9731e344 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -59,5 +59,9 @@ BBMASK += " \ meta-lmp/meta-lmp-base/recipes-security \ meta-lmp/meta-lmp-base/recipes-sota \ meta-lmp/meta-lmp-base/recipes-support \ - meta-toradex-torizon/recipes-bsp/u-boot \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ + meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend b/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend new file mode 100644 index 00000000..ed5e3eac --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend @@ -0,0 +1,5 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI_append = " \ + file://boot.cmd \ +" diff --git a/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd b/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd new file mode 100644 index 00000000..1a8b96c1 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd @@ -0,0 +1,20 @@ +# Default boot type and device +setenv bootlimit 3 +setenv devtype mmc +setenv devnum 0 + +setenv bootcmd_resetvars 'setenv kernel_image; setenv bootargs; setenv kernel_image2; setenv bootargs2' +setenv bootcmd_otenv 'run bootcmd_resetvars; ext4load ${devtype} ${devnum}:2 ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize}' +setenv bootcmd_load_f 'ext4load ${devtype} ${devnum}:2 ${ramdisk_addr_r} "/boot"${kernel_image}' +setenv bootcmd_run 'bootm ${ramdisk_addr_r}:kernel@@FIT_NODE_SEPARATOR@@1 ${ramdisk_addr_r}:ramdisk@@FIT_NODE_SEPARATOR@@1 ${fdt_addr}' +setenv bootcmd_rollbackenv 'setenv kernel_image ${kernel_image2}; setenv bootargs ${bootargs2}' +setenv bootcmd_set_rollback 'if test ! "${rollback}" = "1"; then setenv rollback 1; setenv upgrade_available 0; saveenv; fi' +setenv bootostree 'run bootcmd_load_f; run bootcmd_run' +setenv altbootcmd 'run bootcmd_otenv; run bootcmd_set_rollback; if test -n "${kernel_image2}"; then run bootcmd_rollbackenv; fi; run bootostree; reset' +setenv bootcmd_tdx 'setenv bootargs "${bootargs} ${tdxargs}"' + +if test ! -e ${devtype} ${devnum}:1 uboot.env; then saveenv; fi + +if test "${rollback}" = "1"; then run altbootcmd; else run bootcmd_otenv; run bootcmd_tdx; run bootostree; if test ! "${upgrade_available}" = "1"; then setenv upgrade_available 1; saveenv; fi; reset; fi + +reset From 57b97615dd0650edb58c6dd9fb1c7e8e379e1331 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 19 Jul 2022 23:29:19 -0300 Subject: [PATCH 023/163] recipes-core: plymouth: Change powered by to just by Signed-off-by: Matheus Castello --- .../plymouth/files/torizonlogo-white.png | Bin 34590 -> 28869 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/recipes-core/plymouth/files/torizonlogo-white.png b/recipes-core/plymouth/files/torizonlogo-white.png index e44dd0380acbe057312bbd807aefa0babff830c6..009204bd6e10f15d62a8c6cea680bb1b67d61c22 100644 GIT binary patch literal 28869 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 literal 34590 zcmeFYbx>VTvo?ymyUWJiJ-E9&B-qB?3GQwQ?k*b%!6AffEI7g4J-7uA+@1X1bIyC} zepRC)8h`P|NQhWbZq{_pGCt>qkG7vktC*A72-8^0Fmz_zb+v zi;I7I`hDJk^VMmUVZc{Qq2LqKzzk6+DYf-cOIJ#N*n4@5-)g_l&`MF zKEJ9Sl3gC@Sj2-K*^Kv|^I8fU)4w%k1);h>T>eh}^u;WAVg&WKy3fR^eD?EI=Z1Me z!C~9sx6O^UGh?0_q7JO1tCp&By6!?>%AZ4>ULJ3ZF4JEVlxOcMuPZg@;lbqt9>LEp0XCD*h8Xb&pub0P~e`E747P$qGi;J zyTXlE&9}J3yt0OD)5s^!CKg8b3^-+(hyA39=YhnGx_c5! z^iT_Y-1})L9d?>+`!sxAZF2ElC%)vIG`Mnuy6!VGRE9#NzqCC{ zqoU|Wt@Ub+nw(3^KE$VM*<&*%<=A`A*;lu;E+5-g?^)M1FB=^@-7Ml3*?qlPHa-tT zI}>WZ+MEd&NZ{I0;ZgT!8WUbQ@n9XX*#p+pb}k<|oV3p%hSr$ z&Zvp+XxR&NOGX`dFz>X20zH=38vI zfyfjUiJ&fTkCa+?Ma?9lbDUFe#k{rkK!}G3-yb@^Z%=wF^$eNG$s@I~eY6&2F;Aa4 z!}tor?@Q%(?yYuIQ(#uxJ%Jr_QIxk(fuhBwej{z`e5crE;*M-MXBLyxg5V@!z@X|n z!k&3#xnx-p)78X(dNS>k?4@@_5S!hRZ(o|D&E|j6%KrnUk3ZJj$)ZEID!UoQi_3ly zc&o{ZK_D4y)8dt{*QR{2cl$iLJqmc^;LSzH=Z)Bzn0u;h+9s%8q;;+cl&>pHZfi$W zpY{-8_t8Z=-3;q`FUcFQ<-Vj#*>F&TP#>ZCTSkU4sNcQM@`2UHyC^F=+E&#MQ4zwJ(O)Fo%B@A(VM`^^nVurq^mb)I6B>((WH!f$hO37g9wth|76*0URM*E55j~JS zpWE9^)y;KW6%mt@*r3x53oH!y!8g6%xf)?l2CB?^K*P9NZCvJ@T7^0*I`0QDCMmhR zmvr1722vvhAWqIJOERW!M!Qotx0%QK$Tc$HYIvr|GNp+K4 z%GlWiPq{2xiGhMjssQ+o8~OvgQIJIAZgrl>&)Cv=Bk);L^R83a@c7RDPLYbms)oR+ z;|rCT9&|kNND4pPdk4xQ5)))q9jR${?TJIBmmc`&-7iyGM+7A(-zbb@WZ=PFw9Ze zESYlXQ`dK_S2rXXiv$Uj9M{;-v_2bYyl~zc`sZwEKT1LX4qFdKEl5HoXeEUp*-s9# z#;y+DZ(|aLK1UD$=q8P!4j&E5xXz^GYn+Cdd57mF_S|ewZ21bwaku#G;42@u+Iabp znP|7DDx@lsCj6O$18ZzBsVqZX;X+xrdBbVPO`9}nIEAN^1#q!$NQ!jK-i^2s!m-8) zNgWhFh4|)_ype%}sYf1nV%5PjK^AioqcqK)Cv|11w&%;^;;%?sgn@y}vX3IF{)m3k zLrmJ*N%w)|3Keg_5c345o`%|^o(u8fU6H|0t;@UOppOlxfR8N_3ToToz4nL02!y=q zrrP@Um45m18n}CKBHEGu3f)q{6hLG?FWh#9YT5+;58U1sZXaCjzfSaN#?*Y0HVJVV zB0|FJQ1?HOL0vT#@CuwY6-;7XEN^^+63O|Pjcz9OvB(IhtnUs|SKyMGLJI8fFYuSV zwPgp$B$@+!Z+dp%a%0uPtWg?BoW&26`bw77JS5PdT-DLuh#^JwmN6SwSkoF{c@g)8 zZq|v-#N;=(h4WG@>6GZ$b3PVBzvL>x_0#0zXlCBfCB-cx2eyh~Fp~|*Fi}~(mugEM zbP%=v&=zwMmf-Jh94~{hgQn71m2wQ1tfuW$CskiOfcA!l9+fz>@M>>8eH-_6l4x{i zK^Pn6eaaM%E^Hq*@8-d5vfU?yh~%F)=M0ck{d3he;zD$bp@%y&g&@)dcX z?p+#3MR74JVNjx&fkscdc?6o~gDm?e5B+vLjeVZ}E)#Q?Zxdom)Ph%VP2a8(Zf zR$co>{}bD)i{&pO;3|vWUGJqtlkjd*n;@+aU%I0UtcT7R_Lq4o1sO0&SXZ>5=ynOx z)>Wm-wmb&L^XRy(N}}L`c10-NK-KXi3}V!H66^5$f?|7V7ue#$iIAL1L`=PTL_$YA zRHaV99-rTOd=uO4h=Q1^8o&Z6;WRl2aW*}u>P7zf}&FEPEo(9AH zMRm|Sq#yZooNx;;fx9&$D0zGH$i1-HS7l91E)+@KV>-J8&%&2*?Bv&(&<2>2lk))> zibz48A5t2Sp@rxoGrP$4FVYOKsI>5#b6tM6hg=j6x!=U}Dt}Z9E*&J6R;z+(Y&1h; zMCuRWVxQ^>rXfyw88uV>5W3*r1teu}9EvYW7c+p@z6?rEt!FGxJW44Spz}U0=(TUB zRDC;qcJn?y1ikx8ucrgltRX#QrV5XO4qscVR=iqHEWRZ1$uy=6p`SfQQXDRA-9*Bv z&q5K;y)-1mYE2&HtMlfLSn1F5n*N`1s39wdG_^=vSIHD&Rr#W>exiKY4=MtMA>bIb(W+Djgvj`rsaxa$rr&9H*Yv{V%rwL{ zX0Pb!miz&8CBNU+c{jH{E-ALB1alGz1U8_dKsBa?Wwj$yd+hORUnRsrrE;JvSbx!w z-tU&_4KkgBqw$POe_w4IkTyyd0h`V0ps;r-uq9R`<7U>~6EGdgA^YSmj{@hlHMx*% zc2DRZBER#y-4Tlj<$gfCy?uS_P?871d{>IL2>f<^=B9Q6Y`$(LxA`D1*J(1<=TW|)hxj{bV>x?i>l#Z5?8H{ z9Z8%vVkBn9tb%p4YErFetXE|pZC&vYs7i;awuvXCSpd+a+{!fOCIozI1Pp zxygF&E@=pt90t{H!NAi8keG+oCr3CWn1Gt846 z8p_e zTc3<#czENkp!_ak)Ua}(gz~0xf5gH`CRg+zb6hayyE9Z7T7>~Cy?pJbn^>vgCaDlx zH!#-UTmEQU)t9wpV@2*-EwP9CjIF||w|~$E>-|+E2&KoN)xaDe|CnPWv=E`6x`(cQ z4|ugY!We2V`I(-@+xLDBe-n8Prd~F8O8FXpmvZ-Rx;AVb-0;!;y@iA)vXPAc;H<_a zvE3K*_i@*;zIV~18f(|0zB5sotCZC5M9hd>C3N0l@t+ZGE~O6U3$E=PeYdU@7T0T! z9CpdsN}d{2(6`UtZ#9_IJrCuaD#MQqzLOP<3>m|t&F?(sp11~g(hVMsb z^b1OF36q3NK*Pz-C=(GB?)YlvCRfFsiBYyu_Mfq}F~PlU%vvN7B#s2(%7?k1I+I zhb@fTXO=*eh~aHl^rul!9^>HN?eAg=EJLx~P^4f%p7NCHndF;vxm?zE?IOmTRzST> z4+%!{a2{E7w8yJlg9WrMEc#o$DW=k;ae1yJ?}!7h*~=%|Duv13DERdosVUgf!idt` zS7Nc!_@}U%ig3Zo9CIs~bi=^Fk^)+)%P;#S-vES5##oBn70)=2pQEeIoPJgt!a0mq z*_;AIX()ITw^Hv!)tdMkkhn6M-By92#zk+VHv{c3$@Y!4W(B$Jw=~#Ax~(5?jQJDr z*-53G!mJWMU4&R!SABt&i2UGun8Scc04)>F%hbCe5%4gU=pW)e_*H_9`nQDm8ptj{ z3i|x&_TEYiKj}dj2`++&_qI3PVfr?^{+GhfGlAPJU{2!vyjP4KZTIrS1U?`4gdU;E zndA0WXvPOYvJVG98pNjx*j1ewvrv4haKb9+zGkY+ZLBBgUd9*ntV{3RO}S%W;$w(G z51LU7;S;UH;XDyS00%J|UGaqWT2m~Ogd_dqI*}0%6h^-s`j>zIpFp{3o0gJU4C=Ili;SC zL|hI(ts><9l3d|q3Kr_=K#R_aBYB>|!V6r7;#cw(PjBEC=q=G6a6h7`K~(ZATbe4k zmI;FC@c)Xz-<($4{42h8Y8G+$TXVEN_Pk;V8ldNavP8VaF4}W|-0P?Ph(m2G zn;!upDyOQCW73e4W_W_FBr91(`Dya_W~nzVZWJn0mt0~}n%2PVo0x<_2a%5GDhg4Csahbuy zGqg8VSkx9aG&9xvE#Sp+^o(jdp+tWxx*K?{(Px5F{$@kn=3r5gMS_~rvzW8qUX2`L zY0)kUa^|55=-z2EoR-LOC*kqtrqu!~C8>-+QCy5E=ow2)olmugX5;pR0B(NHOadp6 zAN5U2m2|{ot|*@Cbj~*O#wg7Kyrf(K!WV=pU8f3#$`BY%%J*zRGOm*dH95&q((yLsn<2>vJ}m?TK}%mk2q_wS`eoej@mm%0l^-I7yCebnYTEZdrbxYAV}t z{jv)?&Q5X~$v)Q+h4y4g*!ewMR3ohO(Rn#LWU&T=%r3W!?{v;=$H-H-Iuvyy;Bk@!M-6>v);Ni%eclnjFjXjSfo@Y#YkG@pQjn$;N{D!M|e)) zO2)r*kr+CR!lTU*6T}f~V*9(9;WBbjKZeD?9qk~w=177S`3<$0KeFgxohf+|qL?)o zXUmq&%u05K#7Nkc5VRmOegSmE^Pw%TUAx2(b6ZP35tV^)V5Z{@Fl2pg1M-1I@>2>J zE+8Hfoj_RGk~gB|)0zmwR_r}ht1zM=oeZnO(L`WL)jY3;$?$*_F8h8g8j~U#F079+ z3#E0K*@jFAh;bekbk~FEIWY`&SgpuQ+0W5hbm=zPRTYz_tZ-sd^8k zs&U3b6%&3-x90ak(U42}c?^1T9Wastb$$iZR(&2bYegx6!V-?|2)@kL`w#0kD6LmV zzuyo;Rq{x&(-ja1lP*inWt@R*sUJW_v7+3w$DX*r6PjS@c!HW6gjgO4iN0)|``ECt zx0ZxNguT0NPBdtr@g1lye*meM4e`HT-M;0`9Q?JDSv3~5GIqBs^YI1t*w|-tT7!27|ypUl9Du|`$c z&_Ced79z&-CVJo{__)TV7^HTpR93|!+`a?N-s|=TzRc1yhHE;m70wTeWW1EIN*PG$ zgq)aWGU6sfzR8rc*DYb6n^9QxoHSolYz2j7{4`DwlW}VujiF5OXo5?9_`Oaxc3MjF zOCw*)WNI5mU`u(z_c=!V=SXC+_5)aqyQ3lI9CTZ_ zDeRoy9&k?FI7oVlm-%EM1$kP z0(BBkD1V09zUB3b&nzL@m6#rvjf-cXF@B*NFm!Q)Lc7&OVG`RTc9B^UzGFwz9AV;8 zp{vcF!>1~Y>ZB|%qfWxX%87lYQb1(4@y*^|*2quSxAye$+r;nJpHBx;Er(=Kv?@n^ zvk0&$a_e5x=mHT|7$1K8cItv+T6DliR!Xy2#ZKSIYc*AtRw5&>)EKaLK=doD363V{ zVcc~|@%t3QQYaplJqUtAzlVAKqLY3Y z6v3M63N?$IIH~bg6QBQ=cx4_J=p{4l*Tk<)_K!&!qF)&J`{X2P-J9!d{o$Lcu2ZP& z=TmCD?-M}P$5}8vd*9F84DNYDE58^ zXUpOsNgI(jAz7IOL8F2GljWfq7s0nwk!UlXj7a$&AKG_Nh&HOw^9Zk5823=YIXwt4 znZ6Vx&;)O0^xTHfuxhLdT z_)+tUT94%`=vP$k9zpJFzguBf`onf80f7-G^C^+8KW+PZ^Gc#U190J^n#tg*ifU%v zOwBl^#CV?)>$I^NQy1k<;}7X9OpWBT=4t^u;q@^_! zrKSJltQT^^n-`cWs?aAvHtlw<;(_PCm73Vb*$mbv4=Nj>6|0s#wz;w8V!|l>;op zb>qr>hYkDbP!f(h0YJ;8t!_=wctQ5=?&9(n`}d}4|y%^2~5yM!xs?qH~tjb=KO4MWY!UGxTFzV8B-bu((F$0 zFx=`IFsz$3I4*dO>=hUd4%+d)pOMfe=Al^3zr(|zR4V1)YS)^E#D)?$jE z+FA~=IUCSTOxpPTFxyw50qUJr3Q4<_OnC9&C*nYD3Zyldz#3*h?B-T37C?4iCs)Yf zJQUO$abH(+O9!AQl?Bko&RG<2{^c8h%Fap@pwFkusp={Xw6#-s?+(;{ucl-9-oaAH z3Lq|q^2S#f0^kJnG^g@)a&-0(_7w&E#TACM|8#QzsQ!w0I*0-cR5hriUEG0GyzIQ} zoNThbcHZ0oF%+sd?pD^qS~7C~f`D9!0&G1!U4=O~e0+S^eR$Yi+-*3xgoK1RIJr5v zx!E8RY#x5jp60%6&K@*>ApXIS0eV=v+qrt$xj0k(!8EsU@$wV}03hR3|6!k#tE%dM z!aIBXivgeG(wdFeoQI!Hh)+O(P0*5CP>9EZpO;IB``@4xojp9woh^ZXpdjGv zb`Tt(g(bg*0FaYS&_W2v#w*BU0fDd(WV7Nn7ZlG4}*QKsmX&g*o|!xp{RU4Q?)B9$q$1 z9%0UZlXtPQv-bP{lK!)NsNVb&bOk#P$ozhPyZ%{I+CaB|uKu}nwEMf5sHpxf3t@B1 ze_Ze|_XhqGE(q2?LzcGY&Ne_u{rFeH{zt#v{~;MH1gwDqJp5d2+&qFjY`i>>Fq(6j zTd?t4nwy&oT5$&kn zBM?L5Gl=d*^+G{WK`F{e>i907EzB?L~3=<9ZE#ic`$$D!J7g`@DS}9LIsHmmkLr)P!gC?nX;dy(WZHpCAlsQop za&6cEzCUam)UxCnV?*Q4RsCERq}!Z`zF`?(j~mMKO@l&$t-iE(^Ui)w9RfN8t&cNw z4p9637Ta^aFeF}!wkd4qs@se1??~rY@YUA@*oR?>R{-r@!cJqX7sKBHDDE|F6F2Hz z(m2|BDE?bflECErI%VQNCQQ{?Hv}Zpg|>wR(RGa>CXHUrxBRvGY1-+}h(n0FGHX3l z#&@LLCp=mu*eQ|CrZ_Y5E>v^sXJ-w^M2x z#Y}Y)VPl8(*#7TafrlS>42n%_6hpLSm)?)M8IE`6{qff`u=5Ztqd*e~QPAD6^g4F` zBW?~;qepC9{_r^ck5m>Iq$qF3(#IpP$^RQrc3@zjQGt31mXM18HgCM&y zVb;Vpm_fo6x$%Ku=rO6rqt@Xsx5%~jg!;))G^j}LD|W6j)n-Un!<2FH}FFra1u{QWN4xDxUj={GYtg<#qESY;cI9MadaQ`Q(M;sXlrz<&m52RDwR#^xSGzIW zozQXeOvQPxzo`eO2OTDj5c-0+*a$aVc+egxWO6H-M7NkbH;+787{W%LDWHW^6B+sn zJzB~5<5h_Lwe`&5pL7<+As4}EZ=1r|w-as%-MMl;co-H;p+vmC$LN}KTVenTy(VvG z$K5BHS^j32PyE+(GOj~Zllr0MBfd*3)I1|@*Fm8rwuXayeQA4SFpo@}MR0pU!?)J| zkj?u1`8Rz28O)td!%4g_`@2j%iFsi0gUMz)cbbjj;GW0v^xq^zhtD_%9#M-U6B)qo z1!Fgo3OTduKf80|Whwa8?Y;Zi{yf#$@;57KLihZqDLt8Wecp4;%(z`A4zMs_VhLu| z%LsXZBA`4+&|4Gj)S+ zy;9BA0U)NP4zk+Tb+xKg1CnFs2mXMRKF_9KTO^H^O%@$!gJYN(UsY3tCf%;bWfdI4 znH@KJ)~b1Gj(+c*&G7XW0Jz6N#m0$|@}W{^4va7fX>D~w}Xc%XpP5}m^}ldFH^EVc0#bO;^%sC+=@CDy{a1dN9hUU%g@#Fl)H_7{#)cOc&ic z@U5sW9J4tBBX_p(v`r%S{E!Xce4CV(Z~L8T>*aFVxgm~#VoSy$OMevlH}#W|NfToC zU^iG-f@!0yo56MB*}Ix$?oJS2uu014QLG_x=L#r*tsgIS$LN6Kh)|Pj&SMZY1rG;V zJqQ<4EN;9bZXH~2g_l@&DPZI>it;SU1oqGdvyf}BPR<{arf9l38l2z4&$DV9?}u8F zXU2b-lJ2K=4Yk5V!ZnCOX6-v9fnm8>@Ih{NSiGW1`9-c@*^lR#i+fLZq8)Md8;SGpp+F)zH%RtfqBUra+0KM+ zC5@hBEf}HPLscbXJE2$+xUL3hZyOQwm@971z(|Xa9AeX;vi{fyTguvhX)6x$8gv?A zAk?pg?V3G0HZBelhg|DARO-&vg}g3b@Pz`iz}yKrga+M%^eM~2_k2mCJ(n^PKhStr z5l-GpT;!7za_C|Vs`%n90<3G_G%%IQzcDs56@z|emt|k@HhHV6t+KHrYxec_><8GQ z+&e1&qK6BQ^RwAMrnhiFwgaD#^f=FPJGiHkpcp2kC|F$E6|F~qs$;?W2_@=Ue)=r@ zpXnuz=iKl6mEbdMWX%G`ZYV>?)a;(=A1VBy+O)D_lL*N&(Q8h6E^*h!LO_rxLTLBo zf~+($jOUNO%AS$#l{*ByEcnC8AE94;H&=%iR)pCxD@TU2kUv2?;8mL>f`bw$+~g1T zhG(T;D8bnIaO2PpLe9dZ#@&OyW&>GM*03v(qNmp*z2jx(McVqAm>%%4mPExY8^R7V zmI2*z+FA}19DnZHBnG^r#+2i1`|r$HdQY&HAq8}dE2M@7JOb|{yx$gJV4|DAFZGcN zWG?0>pSxMGXy!!NkY^^cJWn3VH;@^ln;@T^oH;DbP z{d(=kI7g@;l+A?jjN~Ohk!O;R>K$_7HlnEG1UCiYs9E2{g!Lz$UkYq;Y!&W=!jfe! zK&odb97d}?tCnHFCeh#?w|~e_bZ`(n!mE)CLCZ=aWa|~cgM_yP3=1B?9~ose!yMe} z`S2Dv7C{pdoY~>X0sV#ZeZS9MXVLj3;ie0n(u-ZnDY?E)4wxH~d{O4jG!1dh5jw0C z@Jr=~nCD!$1PIR2an8$Pp;I*MjGr5f^1yigG2CefW`lbqxCZnMe@d6%@I3{gUTQnc zBF;@bAikzA^b-r@mSDnWEJB@#$2=7$w&ojjVWy%9w8^P|7iFCA-z~-nj-Vj`f4{~z zH*`=%5Wl@SZiF9(5fpMGnsFss!Rhm=CuE3mzj`MKj{5kg+QQ9Z=asDB4C!fhQ!qCc zRSTQ5SkliPA7ZQ8;am>h5_sNvfvcDqXIi=km%#Q(qj&txoe0I!rx}*dY_Csnl|s28 z^w`73s^i)=zfwEhdkL3J4Bnye#wmEjUUN2276GobiH|HL68R6*=ib8z)Gid57upLU zZ;-u=Mp`y?kS6z0z$8JE zb(14wMJo&jEI$V)g?WA=bOBX^yspZfP9#Z&Qw6U#MyX0AZ-wiKBxTIOcAd=cT6R2? zXy_H~A_gqoe3VsK6U;7{-OeLaO~xucI?m!IrBJuDP1lVcunzWRe0HTDMMU?YOQ;Qt zj(Db!b0vbnM;`0mI`CWFNz8djp6SP@rkr2mHz@q_^7^^cE}YA*qQAUb4~mAhf&R@n z)*Bo>9C?=>AG#CAN&>2$(1Ue`(__@ihwg$RV+BwWPzURp+v@0^LwVP1Rh-cPnphTp z+@i?(at&4>l2HM)zYG~Xle)t6IDRgxEi?op0It-yuK3l%h1h?D-axOj+x&)#&(tx2 zPN4WK(4YhV)PpZdWz6b^-)MnI(F9V{ zo(un?@l~`6gbpT!JL`+nwUKf~I)K&9uLBAAgmylfCdSt&&8=wY1`3enwq=+(c7lIw zEx!32b^H@w*NJ}7e>MDug#qRUeqC=4LHBD*6$}fOq40{EVY(TpZk7!77bM1+K)ci_ z8nI(+m8Jr%??EYudKNb^eI)Y9j7PJzJKW^lqDU1oEaPJujDmXsVJpAR1j;9(WSq?Kw-SO(9B|ak?R9x0TlE{Un<*mg$ z6;2+bq|bi!pb3q+Ylo_W?~#^nY)WlDU5E|(_l+NY(Y&|gHQtB6eHYf2;u4}tmZ|=c ze$#&p^EuWG;e>y1Z_NNXA^ULs~fkBn;=9HuB`22S-K+c&$$L?#>-K^$2(;qo<0avUf3)OSLv-Rvpen z>ia6K4s)#EUdw}&@#_<4`g1$1t3de%&mzGF3~B6;jV!J~YV@5Pm}Vh`(FtmsuJLVvs;V4#Kvq3Qux+{IDd|9LXo_{mn;X1Upn+ZK0R&d9~R)Y$%$TDO@ zChBBrp=yxAMg63)8JmML3FpWJP}etHd5d`RZYw+DL8k2UJX{9oEjrn3WYqg%NV6NM zRzI<=O@s7=74Q~*uox@L&^P{wyX~eS#?e?O6yMMH6Y?r1S~B*j!QdVxlkA`>m=Xmo zh{p=Ub2Z?NHj*WMnH%v9bOT$dd_X}-0t>V{_Lx!2;8fBm9ejm;+)^!}bn%-=XO$LI zR$bFnFyy@Mf)HD%srPiLvFDc`^FeY;p||3A=!^aHMl4lurh5<{T$~T*Pi#dqs4G6;#Sc@UNE9eCm}t|i z^IhezJk(=f%B9h7lT|KRkgYuAP4Z@y9kmKHzpIHDE7jUMxTdUa@jQC_%sl}_V6b&H zPs68I-WE3`hVS^}Aw(UC|3&Z0I>?sm7Mx~mR(%8j>zle(5$Zyk%RL^SD|{to_*t)g zPY|C~yoe=S#;vfkztO_51o(0gP1v%|A5|`aQi=zbOLh?=^@43Wq(Yj?oU zx4{_;fZR6HqcH6&Kfu(;aEP&4dLZ-=WCxiW#*6a5!%p=Y5u~@#RLS%!-{HYF1ku9O z%=JBiFMiySwQ;gEk(ad*U-+i7SlA5Gy}ZB5LZ*ZoZJhu#P?pL+Gx!lV84j%>otQ>6 zvhB48=$Wkr!QplKwL&lQov{`n*Nz~u>aLMkoQXT;R>P_FeL|=|w&l>cpA>{zOf$0+ zIc*$t05s|muW0s0YZs;|j>81ea%Nw}#B?q7@GZdH!rdatDvmB+I}L28~rta zQ`Cff>)$#Vznx=5Oaq9{ggl(0Zr~y|r{%hT^DrS$qH3I{HK@SbycBlLl}{d`<6vOX z4zR2j5Oy{fLx#L(K<5AD(;uHSia=j(FAWJk3f7FyaMvzU#&`L+p<29$_7HG@QcmuJ zDxmRQ_OctwDP<1R?*4DlhUl0#nE=ccsNXWXNq~$|xOo$3(d?wVmev70Y+|jlH)Z+M z_)DSMN|&>;|!9Kt7SWu1Pjj%y$(szTpg*JlWrZj15Dl51$=K)#C| zQj@L!*!%6!iQPzEjFt3L7OT;Wv zYv~JeruB4|_s{I_I+6^2PXe^wKU$(aeM}l9Ng9P8z|v<}yLt|z?-{wp5)vqG ze?)9>WlBVjQ+O+b0h^(m)xSUoY6?Z}Psdp-srlsX27JDPNwbRYE0OK&t~%mE9+=~U z^Zypae!2K2dH2PyGGg@8fc>XL9J$|I0oeYP3SRE;4Zgj!{JL{~WBRcmXDw&x;NtWv zH=X$h_hZtB_erB|vg`-QTclESHYo4BR%I|Z%V2?14NcwyG%Iy3oA~)XN?herjxQPAMc3_L$ zQ8xCAFUu_1U{yP#GHz%|wmrxtOd8SUtcE z9`e<><{jAs#ZJg|)id{rQMY{QIex2^0h}7GV2gQL0WE2be1@?}WY`l!*o^zk4oa@; z_iBTadYB3RE>oSjY4nnant zzE^lSJ_akVEV+*a)TyImc3K5G&gf9Bnd+7;w4mGdUqz@jmIZo*RKl!S(0%zF3&Mbr z!zFshr}RW+7RiWKKvfhj)EZdW9{Hvf7T-6y?&!?+cuS_)3eYU=11est+I&ChL209WR+UZ(~vGv^N?PqTNE zYd~$Vuce)9B%bBb!)DtLFiu5{6Y<9JwKk!o+jzu+^uYW%*w;8eRgqdv(j9Xls^P}F zNC0=mkl#;eR`P4;ZV&v#ab$_rKwXBi_T5{qzIS9|KSp#ZnE`EB?YZ%N{B`gIV3*M0 ztrdx3H2bMh2~ztx{{a_FTIJ~wK@jV>TSZ$(xX~e2uh-PS?5L$gwifb*+3x8xHW0nbPsK3@Jg zu8Z+^bI+3IO!}SSCbb^E39(SP=0u#llHy*4_+pE42z{Y>@NrHH(skHA_PvC zJ_7ki%l#Yq6wEZCol@c2t6w7ry6x6rKWFUUsTW-%fnri`Ejt z!^AA;cWdmD!cQI_jIlZW9fI?X5odX}hW2i7xE?f*&zc? z{vbZ%M!elVEU@rIA%9OX-Yp+~KHxEZ(*EYG9Vu}KtEH}Cow4p&}(<|p* zpMdS{-ol37+9Sl(>zv`r1W3Z}lf!;!@@fJx3}4l$+uhBr;nO&J*mjoX2(ig6rt7r4 z8@t(Q$9$|skvWLuDm~FSG;(u+8LhKPFQrNv<)eZPwIHf_MkYFJf2NCUAldaFqc-?H zhSQ$jF>rU!RsR!q5GYcFM==c9VT=NGVBEZLdZr#DIhh~k-(vP>>wS7Ol*5h{IW64P z+1TRhU3UP5$g2{AL+f+eT%KX`&MW z%0Xw{Y9})d%axp5TC&<>y0p4*swKi@Z;1Na7`ThJOVjpGlr3)wMLG`Mcfxs?%3 zlEFRbl!wqv3mJdhtPQsgn#cyDA9q=BCt4v{g1vY56L%=V;clxYO*`&nJrvnxgKFxo zCXa&7C;Y6ta^B>eAK`)k4rWJR^p+rT;BcriaT{x?C2yj9rI))vxaKjK+de}0F#gPH z6op&t(2ulYAU#JRuTg8*OL%Edoaq+Ow$B63N9Jg*1gYuG{Zcjs49*QFjlKsbMeah5 zG1lC6NWVIgh$u)w-oRe~um;h=uAAfS6Q$&tmr2T)+vNJcNr<-E@zw#$lWS7Uk#=A;w&w#=d$bumlU27ygq~Q^$#@L&wnto#3=}kL6PIpoMe%J9^1B& zma^Ht%D`lnK#p9dF2{hwc2=0YmG3{!p`^*%7@t~=Fyl5rN6Gy@bU1s$*oLLc3Hx5f z(JFbr^@9%YK4tid$t?;hW4po4`ySirE}Z)y)+=Foy~FPKrs9WZ<{H{_4dAZ+p0m|W zWS-gdRwPqJrkVm1jb@$w!S4q8A_BBt5BjRa(d^sfCe-h?wBh!#kn=*+8!jI{t(S0z zI%V{MBDbG)Wf%+tM~dbG(+Vj~ZYDv@SBb@Hx*Vt*tI@P7`z$aH{fNu1%uJ#d5&3V! z_u_XPeGC#B+>-Xx8=UoYx9tNJngMQ(+2jm^eh=BE;i}j+1g@&b9Uj?(X69A3!KENV zSa~`X4<9p3-L;Y&b*1|PG?=f+z6=Q;u5=ncDa#4f6Yzq`GGoiGFK3s=9i+EK(45DC z0QU&=(nhSo7j0?u434Ch2f+#84v`1s*urowre+KITwNe$NE~#(S4m)Vzj3&|$3pDH z{w{WC3IOQ8mcLQHxp*Da`6Z-#Y8tp5$0kvkrfAY~;Xi5Etv~P3>a}xJ2f8cA)8Bvz zS259L8|TY9NZ#?>Au>l5%i#cgtUK0;Y(IhxkbhGc1l1NT#$J=1ZTh@7Vcj4Mc{@Nl z@u6RYd@2V$)DYBZPZLA6EgbwZb%G)|Hft4C5YXw55 z?Bk3JNIpu}h)5tz{aTB_qP7kyk_g3*t99serL1h9Z~_@=mPU6EQWVWpVL0rvl=576 z4-UDTYUpk-tjlfBtH8aF8~Vxbh}Os0Bg(AYD5})Nl<1S7HCYocu%mK3%msOy)re<6 zu=r-6g+PBU4@99|-1t(8a{PM5z1r-pF-Je0f3~PCLx7ZgLNcemK{Dn+=C8ZYROAp> zL)*07^#62smQigrQNPEnxVLz4C{o;^xYGi`B@`>}8nj4p2o$$s1%kU32&GtYTA(-- zclQ7{?eo5$?w9-du9cOnm7L_{%xJ~D4*U+YI6MKpsSBTuz( zZ2)}(VFqXsI_`iuB0hI016i3}aWm6uptX-`U#@ydKA00y*Hx)yjCib#a?YsGuBbUG z4ZqJ9p_&EHfNu5Th-OCEJtfW5Zr<^llVvbPTcS1i;5BPdFX(wxa*lKQ>Lrl8mJcAh zrP&pV8pl-UNk8A=-R?%st1fI0CbY`^8+VN)*yuwffpeoAnE-VO@OxSZZAm?!4q`W2 zK$A#VlWJToosrLuSlM21luH2}%JwK(@aKWX2mM$cX}3j^z;}}VW}!{sZV4mQ_p5JUhOs@awOy)*e~|Tr$3SCCSt|PNR<3QT%ObU-Aapt{u0^vfPo-Dn?70 zO20=AIP*#+V@=T6Sa&FkCyyqQU@lfdLK{#qz1Zs#$+Z80d!EitMAj1_L zfco-JE4%;``Agq4ANImYO@T(geIILHTco)C=PC^1ae<$?Gri*E23!ZoVguL7TGlax zJ!n__U0RUt7U1O(pJ-yxoZE9Wll*3LlyoufSP||O(zf2&^1W1;F;fe=01YJrpo66= z#kVqQY)D5AjNOj1rg$wvP+FwcSz3pcL)?IG)|mIE;SZEzNHZjl5fEH)R#y%yc~y8| zg4$p(Fi;uxWW>Xx4tfB%1|$yXjM!+9LeN7!RGejlDL~E8>bD6vZYKCxD`hE;Guc=d z?j{K@dq(ZhKafNr96o@+gc*P;zwuN4o4sQ&c8*>)O(Bju!s8o4gL!6lC@pFlwrULB zfOK7peVYtKq9uwke(pH~mN$<396Zw320V#8wMatGY#W3$3XZf`cx#2k70k?ardx(j z6^~j2j#@7;ABh>~u@i<-5{%&*=g>Re6Xz@@EXRK8ECJ*dOF2(}+TYWW8VW0)x*78( zC&9p`>KDU>P~q=!?(vr)S)}^UQHp-J-LK68>P-=|v*>qz+CU{yJzL`Dxsq2!CKi&C znK1h`m6i1((%hO?5_YYDG4N{K4WQStyKcg|JIf&9XT}Ef{Ll+m6K=NGtaRm2RS7wl zDp8EV80B~C`CS7QXnITWd-O-6$CdV+Ay96t0}93;1OUFVtS**5AZpL!vcaDi&&XuX zKI~V$PZc-|m2|GYBikKw-S$c#jX0u5;Vz|yV>fM_f=l|IFFQQi8~5bE2l@kC=H~1Y z9qRPZ#=xw16a&`m1Hf*yT(}qgXmsX~j5N`$ZL2hWbnX1Y^?Qt&xP=j+M%BA70TQP+ zb((LcOQ4mMHGR0jpPB+R&II4&(=SIAUsvHIjt)oLRvgj;O{;&z5M6)2Cz=^upfGT& z0@#Ln1SAq@dw$CV)T8n8DJ-YsX-z$}QIl=9E>e%#RAE%&^1oW*o6gJCBb*SO*Zx|U^o{ICz$ zg;(nQ>t^VSwEXbHhb{VW;RvO6OIeI2HFtAzX(R3JpK#oL>Nd@ z13gbSv)Uyc*yI|p{<^+*0q{BS2L|HZ2oL4*OQXI_+OpUH=WKx4P6K)sMCT)chRdIP zSn|e|7?z~E-d&!1VB^C3EyNv8vq0JkpW(O~#RzC#NG@M?T5%i6TS227HCEp-@2d2Yg+{N9c96R$4nz_R zGqExof0?`{g=olIy-Sw3p_L0roDK2NCfyVo&~V!N#+K8%Op&HN-GayuX)$#TgtD{4 z-@Qn++kU3p?BXek2s0``*G4kdFi~8}p*jUZ;!>~kwvlFy5|3p-$Rgaq1eo&L(&n5< z`L||g9~+`1)Lo}eng!lz0a?TQ5A4?z1x$b|$WxTz0cbmnfat2pd)fgK5n@eC982K= zYZoeQ>p&eTq8lNb#?; zJ_IB|yO5(DdvkdJ(gq~6ajo+ttuJ5yl9b;V<-Vz1=6juk9&#+_BU|EJW40#MmO>)m z4V0H^HZ%VWi@~bu#1?XA&4tovf<9lEtPHcvt1$t_qm+Y{o1)<^P%$;2KJ*KY{&Wc< zgSL7=IwS!A1S&8=I?z`<_|__?ZIc}B(m{zm_zA;8LU9~-U*PPgiILBG)*@Jemr_6) zy}~Xjj<1Q8Y4mq3Yq+^@ss7kMg!60$WGHxIvq7w z9rB$Fwh}8K6s#t8F3kbR#SbKu;?a%iJK5yh_ zy3G9k2z~AC71PAToZIcm+B}tkNC0Gx$>~){D1Z+UKzoN$ae?B1fH}Cue%&)IeVBwM zm@#)r_RNf+DI#kjH9Vuv?hH}DN<+TZ@OzM`4UY=2MyWsme!JOnJGH)1$8N7<=F&|W zS{jb)5OAPbGMfAb0n}faO*c785?Sia^tQrAi?uy2!^z~v7v(RZu$|==6_OLlNEv71 z)0fvRTNne@!EsOpdGc6Bw)q0ORfW5gmmi*Q2pe7IGh<&7kb_C?3j2ulBi|}mdT;?B z(yY9DjCQEh_27I$*yiD8ATw}87`6>GMpDR!EvVWG-oE8g#qQLHUNWW-uiy>X3C>wZ}#brhs< zCWM_)gHhq-Ms!<0=!JlSa^qaGd-jqFM?eaD_V0dd+m`$`kk6}nLl^NPwLCgyjKw0Fp7kM2qv$wQ_3)x-%KZ}{lXeYJ}x2DZwQH)isD?cL|w7e zRCV*>n`$YIuE??!>5=NlnnZ<#yo=@REo*;{2eE+t6ihp`j^(Oue-@n0Fa6XzAt4iA9Nup;#>C<3sr zG_WZQJ7TYXqFU*_mP}BYG<0FkaHmO^JuoeY*03}cRzSU=cLFE86RZ|eT@1fvGJX@c zAHVv6SkXHs6>2Doa?AC0`Y1ZB3~HgxRR4LI#|2P}8l-mMD$0%@eZ}OXq=(Oq85ui> z>rjP*RT(wWPGW`BGZe}63zg!Qw&vcfzR8X#^Ce&(RlJn#N0yA`4&P_Ox6Er#9|;}h zwHio$K1aO-0L+<4^rlv>eQ{dzK#W$z%c$fYCeDo(lO@g@HIao+%^W{wgkh=xcW6`6 zWcBg}`k>2d8!uhPPnV?8$~S89U&dLvn01OerM9%nJBOJYv&nxOMHeWP$@B13FS?5`&MYER0w)NBCvh^BB0xV>W+ zBcOt$GW?Uysygx*_Q00m46%aqtTyuj*b#5>HAtV8eL$3(f;qYj3IIT%1Sum8;BsG_ z-$wE;bbcLnCE2sP2)Wj->rL0c)hK`tAZ1f<@XA}QaJ=kAS~WuPdEO_qpM+`#IAQe- zMj!U&{oqa!}nz*Yhp_xhjZr|b|F*Z_EA%N8FvG~1|EB?sG(p)G&)To4}=Td@K zQ{Jp$o-eLGVRRGACQtvflXNE!(sAtIx}LGA2}mJ)W)oJxUegh`e&!aF&_>Ezpsp~6 zT2VYVu@A<@>;mM<{bKzlhxLy%{uHV%%CprN#ss`*|K8gAy)O`} zOpCp`8ly{%q1qir%uVCgQfTa8MJ~*z5F;-_VMFexHLh@$%HEfpD$3>6U zKwZ8|#Z3C8iffM4X!73W8z0v!X5c?I%3c{XN=D2_x04N%Wlw&--CCK?LI?H7c@xJ7 zr9ftlQReo`J;CaEbyp0>t=wwOFc<#&wVebMP5?&&U@6&@u{Lqt-3JHK#Ct+r>-%9x z8pR=MP@jDd##~z^NUtE7bJSXHgZ>Xs-QhstB&B?YOk1lLW0mK&s7pTjc3Ljl_UpL; z(XG;t`cgsbQ|#I{!*{}eFN?(BFgl)5#Wn$HRe4}@iWI;pw|W@h0?HNo5Qln%@tE0f zo^o8r>PoV!iIsQIn&V(P_aCwB1&}DF*m(*ONJ}-xKt#)eRI}-Trb(dl_Nc*Y1vYc@ z3GomoZKiXf+URw@>Grz+=D=3k4hN1j^8sz&ny@Po5qd^L@gtn zS%&qVmi5*WoNlW7*Nr@8$eL`1NUEFs{N@Y48a9ic!A$h6MqHIY>~>5w|Ax2s8>27RR-Mjle+m)6I*gyHfT z=6_v_rk9G%m4-=+L9PZFL8S+aSC8$${j~}FIZy6MXR~n}_gcSNFHQc}LBNIyG5l6~ zYrYoLmJo@p*7;u?4_qOEp@G_F>(m3Ar2CQo%iPP)$in1c916^$UI16}q^b`GY_47F?#W(~|MSn+0h~IRx3i(CoEh=h1s!?$RSW-v z!gDh<-k`b)?#2c8mps2oS$8k@`e)S$xsw_(g8(=AO!kzD$Khj|4I`kk|IUMm-#GZK zb`mq!z-$tRb!Phhjl6rvZZ*1($?`{af+!b*MiR3R>I5YE|Jd$8q6!p*mk%$@P&XKN z^Bc1N$J4h9Kd(SRP%DU)H@9lW_fh(X|EwSqSt#t1^INCkH8LX()+14E_d4I0{l9{O zIP$$p93ytk%;T`TTo#@~aHZm^rK=i_Y#S^vL$!~qJSEjuRUQO~bq zd6&^DRC;;&^w9rV2cj?qw`lL}blAo0hOSpLG^hxAU9tBTIzMYajA#r5%1gQ1Z_EQ? z0D)KEfj&T;?SYnv8k4571`gi1E==Ct(RVkpUx%_ey^e37Uq|ubZnHT4O&j@@6{FxNm{~>^{T0T3j7?4sq>*;ybb)lt5gc zwcI()@)8`rQUeM*vo2lt@*jnOsB@ff}5(YjsgMaK%h3&-sj`if|$Z>a44S{8Pt`A5;FPG&J+AT;D=IAU0ni(qj@J_yW9 z9K0#?M~d*#+qiY347%4uBSb-D*^B`?_B4H}|MQKmHD6 z5`!L}KwYnJ=utJ4Kq)A{3R)rm$C>)}uuZet!+`0a335yj6%ediA=26F0EHe^KrI<> zca}o2Oc>4{ju0On&<6`gSlBez9q*hfzwq%+QiM8`?=4SS!|?yO=*fqA0WsGK8| z<6KmWU}SOm`NF(5?UWf$ZA#bHhwN_Mm`-ME| zF%dEz2FO2-jyreyhUtaz{uSzp@(t{XmXaczYS=Q zQjd|S?6y53ULSN__ZjBBUcSsoNL}YXwtL%W9v)=mzjx4PDRNOh!0vYG@ zA@;5s+%B&Ej%H94CbU0pQdBP;qr7j}lx8i9`I|lGt)t;gXD7)kgy#6`CFj>>2Dih+ zu{(r45PLnitY4>De?x|e$;9@#Ysm`$`nxQSUQUz4+DA-{s1_942^0}Kt^c`G23HL* z=3np0+&K0xKA0h0vY&ko#_T>MSGk|_o_F+){f!rK1QWXZH#K{XUX}tpkF`WuW3G&e1vlU?!QiK{0-yy zEJbY2DWLd5aObW==ueY1rbA|i)0F~ehZ$81k zhYAY5OWeAdMl$mQ|T)Ey(cl!_@`vE13361q~u_{Y}m#vy`TB&mAgP1bs zf-0y2%5BH^cRu9}P1OcP?EWg><1Ucf82?rRI|h2?K=TZuUX4t|tADBz#{%mzndpG= zKO6V$7C?h>(SKeSNO#l8Jq5Kyrv1AALS|rBO%~l9v_o4~!p-{8IT{~dVU!kf<^s_L zMFiKBLlL=^?X{*a;j=Hu1i9y5`%@^KoqdSs_$O`RE&!74>b_CaQGewarJ{eRmzx!j zesBfRe;<4Pv3CRJlHpXo(qsH*1C&GZ(}ip7lX$w9y@PgR5tZJ5{c107GIr%@6+WW? zbni-!|9_4|pLqt|tJw2_?v?LB^*H}~_y6hnty2^*)WVZTcZI|thzC?o%=Aklrrz2DL6l3Vz(c$of)V5{qB0YwXuI#QG%UO#lsG@X z!}iyb`sQ8i!htP@8YDs(X~-BzKSPA~`NHzO>gA3pU-@oqQ@worXu_51l%PrWvFn-b zU@N^bGAF7WR@!rE;KlQ4xasrB7KJ^k6cfgDmpz7LL$xH+*Fn!-;$I+r3F*R?nEK>$ z;-1+b-D#DixGvWGxmMnn2mX3e7~PN37wP7$ynyqvZd0kfb0AYg1w9o~ zEb=9cX%%mEjruVVPeUhoZy)z(>mRQ#(r^7|2&i-V=E#5J8=xA5fTFKB70l%?Y31{V zm2EV|{Y z0uo{i^avid+RIB|Fyo7HW_Nut=%0($-2$QWIc7f>L>+OytFE?PLJ@!FPF!om>K2T| zjrowSY-1nlH_Xu^Y7QFSJUbi-52-D4&OJPRICzRJ29o;{G+(oPEN6+sdfu z)0|ZCKkRxHV5^jqL4!8_Pp3&ud0jPG=xNYuyhV9lDt)#FnQ=SNd|Rj0o9guogw;MC z!(PeMXl{(%i=I(Ut1M|*Ec>HSAY&qH#=+x<%e&1@zYMU_pl3mK8c-=uv{nf}WHx>f zcz(jMic00pQmgBsCbO0HhLo(mvlr9Z5wr(E{IVryU2`%0IMTC^<_}oy@yc7%&3&dv zAO?@;9=0|8$i~rwo>X&)n(AR*j{c^a!`hbo`?YyWf>pn8WtN|ovvRZkM-Y2b18Cbc z!?_4A8-TV8xgTX5X$3hD+a|#q|H&uF&%3B}(@vsP(|>b8v%3yI=UHeGz+4!GhvemU zr%Eka8&)m$P8A@NLe>q4X@Y)07cDMMigk^A94Tw10^$c5gWl^_ZrUyLagMb(ZC0sd z`~QM;^5rx+6d?P)QV$Nuczg%B_}HYA>V)%h8V;aOY$C3aMj=2>M9u&B&DIZux!NLg ztc>F$^z*BErwCq^{EXg*MH1|LvxLP+FKyu_V5=9JA0P42{Z}C;$f(Hi+@KIb(?!00 z>!<_!jJirJG-4iOYTwi$8senwL%$f1vP>yYxpaBH_N|n zX_0M=4C=ceE1`}zHw|!h6-HlWXiwb^jwp)`|2`t__KdAJfdts!k-qXE=ld(hrb zr_mpqXBx3KOkn@kboPZznD!-2S@%a!H<=9W#nsoX$7D!iH=*Hc<4yLTDaceICL@a_ zKd5(h8?spPmu8=*KuvPH=L8Zb^83<>cVJk4 zuWBcS)hcy%$pS;J>b)v{l7+Doxm{}JZ8<4yL|>&zG-Te@z!xuiboHnrmH3-cuVX%0Cl)RyPT3=X{t+}k#XdKsWBynk!4|ACfb#+=~w zBblA~C;0BqjG)AL$A1e*vJ#hvsr?F}D$}^ePg@$teu2N{r?s1rFX-?Oh8O2fz-ZjD zW66!+bI8Gh>f`$@=L|E--^a7U<#&N05#OY#LZzpzbF{?Ox(jYOkwwGX?w4#r6Nn)$ z;<4Fer3InoO5q>kY6FzY?7RIInc-1R5D_wJYc%HRlD%fq{rplg;eEubuS{i=(#Irf56L)CyNdcqr8W#Odr8_|l1Ux4L+j)@gf3 z0)`u%;AP?X(|d58UZXo>+!{0ezE^!zhQzrP{m*q$o}bNAJqhfW=))HYd<3>j6CJ^k z1>2mlc#C$2(v^PK$7GAv9}im0Ol@GsRUbMlY7@S3chq>TIA6{oZg_ENX=b*N$tmkO z*{+_rjozj-xQPF?GArMfPRpaqjVQ?$?K$V*A$`r(*{E>|S7~9k!Xx}^v}nyhvTYCX z>>;Ek?MO%3T%Ml0+lt;XXf1Cn4ShS=l#r6>5u$%~9rdfPk)4GHiHqON3(dO{XKq_bk<*H4t^g;hq*%I{BwW=>)f1Id0j zhVeB{bg({jX|2dv8?KhjtVCiMx@b@1g@zT0X${fkK@O;d+VTFzgLLDxzAWlvdNym> zXQe!c_taomeOb95y?w6pEfZ4CpDp#6%68KW9SCNwm-S5iiQ!b-{VuS}4~dYrCEaTt zi(eqNK_qFb>>+7zJD)`Ih?&HT@R03AliPH@pO*N58w<@6@A1zb^|u|u%HF0DB(TK|BNYslEM^0%x zzccCLm(HG775d3&XIZg%)g#Z&4QLXVi$1jt>qkud-m|XvS^O%v)2LqI9z8+^JpcV^ zPvN-u9a~n-450SXy^MU#T>Qwx#)h;L={H>e4oCD=O`BxaB?DOEPa+rq;&UO2WxQ~$;v})yV${u>UKEnzI`@W`u)_% zEWxc!|AQA%s5=f}u4HD(Mxsx>n!HWh1puWtU;cZKc|-C8yR}=&UYRc+b=_F`qKbG%h18e zpUDlcuhG2KZjTGhV>!uo_*GGaMYz7gO!!|sXYf!-E75Bpa;A*1KuF@ZC|4$%TiGtb z;1z;TkyU3|3x?C?CGjBfXD{8?slZY*za`$fi+LDF%&d98|Dh3h^g~}LNV%!JyzX|` zDWrw;*7~aWmGEgvo>y-WtCbI$KgV5ElAmbSpum^zIW4eD8pNMsrzi_7Yt`SNz_#ZB z(_Gsw0Z#?ntrm%3v$dy;nA+VpvrC^ZylV_C%*W=-gvH59KCLWg4h+2og5h9iuWLsY z76x&KB>G4h`6Q(JA2uN}yoAUQ%s&Z(f3|NYx6j@dvSCRn1j;gn)I-@~53(8PnF!Hj zWxk~men%RzqT%Du%shhLgM)PicQe&lNGMUV?jHiS_@}3V+j(Ns)0g{Tmt0gO0qE(Y zMrIUuW30u3&!w5Ho3ngDu9u`qKAI5w&mh6edz4g#EC16duu7K$<(g=ylt|sOH*Un`6I-hfLjNc z=FqYkGu&*fFdb~u&4mdRMpa5T#ptdwY_wkzQVDkDY2Z$uMV$!BF!ZV+(@zsfZft=r z_O|G$vWTZ=PZqOO6kT;hil=)q($1omW*D-aP-A(@Q37z$maXq*15WT8zI|J+vpI)) z$k}`~PZ(XNfFSOT>EWLT52s~UAp7|I2xsQ9SeVM&&*fH6pYkA7%}{vzeQWQ7(Uju$ zJ3;8Aj4fp5a$k}D&b-cV_a{zB##rEVZmnfltRDs2ou%&fbTdgv@0vw60t4$S~AU z`dXAwnHsl|vF#cGkx~lvzR$UEfp^cNdYq=1f)uC~jUSS&^5n@HaUK062yn%ZYOKMz^aQ!Z4203Xa$BfS}y z0aLiU((6?WqFkh>3Z~7WLHHcfZds^fm|eNd7E2Saa7W$-a`86&Ip)Ns@qler?kO48 z|K`&tH3X|DL2R9{Pbqe88h3pv%B3YtmO^EOr9aAHp@jO-*>!0I!-u6Isw1yRsf!x%}jz&FJFfBH3O|&r@UQbAO4d z`Ia)s62u+t5?VyW2f-d-v}6@4NI~qLEf&K_e#~BDi(MdFWU!0OfhQ$E{V*Lv_J~{T z%a#E?{6nLU%X9hyvED0;F_f#S-&Y!|tw&pWD)SVrWR$u@4W%KmG7UXOQ^y{77~&{5 zVl>;{l3bpx{If~X68lOkKXI?KW1P0IG(5Ln2(R`!!^}AY45%vtyT4YLQCFYH&|_7~ ztV*u;2M5&IE9^IHt2{ainTVBg&X1gJJIx-4JY!Ah{M;xSu%sKBx)dUvzI^gCt}OM@ z7EqXVd2WPklAn|VX;_4EJ9b%yrp`UbHqkI@Y^x8{y8Bf)4nGPoTc*#w7IK$E;cTKy z4B2_HnuPEFvV@2YvX#H**o}Nsn7K3=W|@IxGOZ%=I_rl8nccBo@C;pM1~YtUtWbY; z?u-QH{LVD5szer3+=IvSI82)CpdN?e0gHEXWG0+bf^bLq?`RMr88~!T=tzI^mU?l; zF7}0RCm|g}_gKnLw>#0aw(a}0_$tR5D@yM0rY@@7?xzfX5+U0VsfEp8W7A~6Lj%)9zPqd7E@r#=Noq6Nxicc9!Mq=;JryebCFX$>2{f{o|# zM9Se}45HGuZT&v(j>(GHxi-Ix)iZus)w!@9V*Bgftn>*;nABF0sN`ez+kmAP#(p?d zIGteVNc!G7;fdpAC}+u4ICdK}6PVzQFXd0aTa_KvzUsp8x?hp$(M83pd$(i!aGY-`t zYjC}%p+*o@x9G!;k$hKXP2tL$&(ds|GrDIL>Ewk~M*c+)Tkqtmxutz64T7i4zL0Az z5DyflEsG@>^vy@XU8k1W2r8Y~xs2yac^iM3N{sfG2bj3brjMl@fX^4v5Dto-5bOW( zW%VJhxFA{a>uk{XuEq}ivuPh!>Ide)8jlBAyDmTG{4`GkEhpv}CDl8d!grV5r+!r_ zjXFNo{{NlCGnju#^Q=YruC%z6>97g={!xA^wR2-&rT!}alYstIDfp#*z$ueTFc{Ox zg>zR>1+~NX_yvN%>zT<*&Kp*}b|kEM*OV?TH$`H2U^~#&`T)KbJwaD#JD|i*{k2%u z4|R<|Ls?3BhOjY|{T1D9Dp#)G_NxX{5^5E~J>Na2aF05BD5r=e8tP}C7Qa8NR4tS5 zKeP^@M+GSu&7ORO$re;G4!3j*=Z7&7Tv4rF7o!(#C$qfail|`v*Lhfu0Eg#hWf3&5 zpPaVxIBKrXEb*wUZLW)jK{U9ZMjZ8uUR34X^@iB0INy64#K!#p-KV~*?Bu*l)gX@D(3g?M5fvPN2j*)K`}0g3 zl1{+wxDa%*FXmp^h}%w|r@OOwfLZcjQ;DfdKq#9N$Z7{IwoAs@)mWliR8f9;t}3-G zSJ0w6RgwG%!H#|?xn-P=s%aKe!802Q%6ucDs%^<4_C>YbB$=7xatNNe7s#hNl`KE>xl;dtBANS2 z>N%^OSD`QB4p+0nLYTvxZQ4`gLWCb1m?h^;9NC_Y*d+&La!Iq_>NIS+CZf#c4VIzympZjYYI^k`Rhq#U|TZ*W|fMG%1#-+fKIw6pp ztd($qpVuv!%9Ve@#2DAGL!nTc ze||&iD(K2ni)mo>d-R)&WozJT)CgKvy;8?6e48!A05C@gda-`jC!G{3skc+7FgqCO z>cZtOI-stbY7b7Ivx%XdO^p}B*LLuO-oP8yH4sWV2bM#v=h@>vsD(;TwWUrS)ePH^wWQTXmr!X>^V|fCbpM8*O*XO z%e}qIN@Y+jLR*)|WhEKc#w6M>c29!y8nanMmOzi5aHoAi8CvcO#1kl$BrADd4tqDA zar3rU68ix4ilKMQ`v5sqDx#pSVMlSI4kiK$$z-RLC(bVqzd-G@ZrzSdsw0*;Xx@JBvZ6Chlrod{7h;_YE<*6>j9~g)dp_$?#oQB zyHwSBVeW1muSF+^8WQ}xad%|8JXKX}w)gsYyefa%2@3N_llFTEn?8>`oGR--lj=a` zk=G;hAt@Z=aKL1*9#6YQ12=ICx8kwA7E}7cIhSymm()nR!a1KDDU8G;z;O;H-PI{m zh9+Mit1u+$txD%jgpnZx()Td4N4s7OBqb~jWY;uf+zaFv=V>nXTvb7JVza@dZyaM+ z0?JdAIT4AXbUwER!uc1>OGpyP^Hjcdf@aft*;FE!A|$OP&&@@fdx2U!c*2XfM;_MMz)n`7KO}XH8$WNJvFb+myb^f8s**vNo zB{0JiLMy}EEZ8NRycYV{0h|KDykWf)0R$JB>#o6{;JqLczI+wwqnJZWS4!sO&)36QyvQ4AEG=@^r_d$^%^uxWUl#D! zUlN4ou5DsIZx-I2DCC?n;h3;RKe6U9NB!DPWKl5>pHWare|{A_=Ou z_kbYbjTSRJ2H_>C_Ikw7F5cFD=j`Hfzx6|^GI9c5h-**0Fcjb?qkANgIT%?=?OY}) z6Fgv8R2M_+mHH>~qdpw&u71pnl0 zlibFsQRSL`0|xLa?_4#Oex%B66H);ezvIuuoMDP$jI|N2V9+04Wyi2o{)pou+(4Fm z7vp)>rXLX701u6HCT*tSU7paene>+{G7BoUP(qP=tp>EsXp%xD)>BJ|m==3!@cmKpy2l-JjHZpszT7c^ zuy)8x{92v8wz8N42}R6Qx3cFfzp;pV==TRavOICy%(p+&+jEOCxco9Ck8Ht!#j@lWMA8f_nC^)hvh4Kq|JY!C6 i4fp@jqp-M{-gBdI88%2&&RKKviaFbrt` From 57cca1351f4742752c076fbc83953c5810baa515 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 22 Jul 2022 15:13:41 -0300 Subject: [PATCH 024/163] labs: rpi: Use new override sintax Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 58 ++++++++++-------------- conf/machine/include/raspberrypi4-64.inc | 55 ++++++++++------------ 2 files changed, 48 insertions(+), 65 deletions(-) diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 3856fdc9..e2fa969c 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -1,50 +1,42 @@ -WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" -CORE_IMAGE_BASE_INSTALL_append = "resize-helper" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" # Raspberry Pi PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader_sota = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader_rpi = "u-boot-fio" -PREFERRED_PROVIDER_u-boot_rpi = "u-boot-fio" -SOTA_CLIENT_FEATURES_append_rpi = " ubootenv" -WKS_FILE_DEPENDS_BOOTLOADERS_rpi = "virtual/bootloader" -WKS_FILE_DEPENDS_append_rpi = " u-boot-default-script" -PREFERRED_PROVIDER_u-boot-default-script_rpi = "u-boot-ostree-scr" -PREFERRED_PROVIDER_u-boot-default-script_sota_rpi = "u-boot-ostree-scr-fit" - -PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" -IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg teziimg" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" +PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" +PREFERRED_PROVIDER_u-boot:rpi = "u-boot-fio" +SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" +WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" +WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" +PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-ostree-scr" +PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-ostree-scr-fit" + +PREFERRED_PROVIDER_virtual/dtb:rpi ?= "lmp-device-tree" +IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" # We need ota-ext4 and wic for rpi IMAGE_FSTYPES_REMOVE = "" -IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " -IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " -KERNEL_CLASSES_rpi = " toradex-fitimage " -OSTREE_KERNEL_rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" -KERNEL_IMAGETYPE_rpi = "fitImage" - -## RPI: Use official raspberrypi downstream kernel -PREFERRED_PROVIDER_virtual/kernel_rpi ?= "linux-lmp-dev" +IMAGE_BOOT_FILES:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " +IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " +KERNEL_CLASSES:rpi = " toradex-fitimage " +OSTREE_KERNEL:rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" +KERNEL_IMAGETYPE:rpi = "fitImage" +PREFERRED_PROVIDER_virtual/kernel:rpi ?= "linux-lmp-rpi" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" -LINUX_VERSION_rpi ?= "4.19.y" -KERNEL_REPO_rpi ?= "git://github.com/raspberrypi/linux.git" -KERNEL_BRANCH_rpi ?= "rpi-4.19.y" -KERNEL_COMMIT_rpi ?= "f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7" -KERNEL_META_BRANCH_rpi ?= "linux-v4.19.y" -KERNEL_META_COMMIT_rpi ?= "1e97ab775c4c499b995e7013ffc221d71844ba87" ## Mimic meta-raspberrypi behavior -ENABLE_UART = "1" -KERNEL_SERIAL_rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" +ENABLE_UART:rpi = "1" +KERNEL_SERIAL:rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" # This boot arguments are the same from torizon.bbclass -OSTREE_KERNEL_ARGS_sota_append_rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " +OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " ## U-Boot entrypoints for rpi -UBOOT_ENTRYPOINT_rpi = "0x00008000" -UBOOT_DTB_LOADADDRESS_rpi = "0x02600000" -UBOOT_DTBO_LOADADDRESS_rpi = "0x026d0000" +UBOOT_ENTRYPOINT:rpi = "0x00008000" +UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" +UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" # Use meta-lmp but maintain compatibility BBMASK += " \ diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 9731e344..d12516c9 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -1,52 +1,43 @@ -WKS_FILE_DEPENDS_remove = "tezi-metadata virtual/dtb" +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" -CORE_IMAGE_BASE_INSTALL_append = "resize-helper" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" # Raspberry Pi +KERNEL_BUILTIN_WIREGUARD:rpi = "1" PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader_sota = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader_rpi = "u-boot-fio" -PREFERRED_PROVIDER_u-boot_rpi = "u-boot-fio" -SOTA_CLIENT_FEATURES_append_rpi = " ubootenv" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" +PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" +PREFERRED_PROVIDER_u-boot:rpi = "u-boot-fio" +SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" WKS_FILE_DEPENDS_BOOTLOADERS_rpi = "virtual/bootloader" WKS_FILE_DEPENDS_append_rpi = " u-boot-default-script" -PREFERRED_PROVIDER_u-boot-default-script_rpi = "u-boot-ostree-scr" -PREFERRED_PROVIDER_u-boot-default-script_sota_rpi = "u-boot-ostree-scr-fit" +PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-ostree-scr" +PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-ostree-scr-fit" -PREFERRED_PROVIDER_virtual/dtb_rpi ?= "lmp-device-tree" -IMAGE_FSTYPES_remove_rpi = "ext3 rpi-sdimg teziimg" +PREFERRED_PROVIDER_virtual/dtb:rpi ?= "lmp-device-tree" +IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" # We need ota-ext4 and wic for rpi IMAGE_FSTYPES_REMOVE = "" -IMAGE_BOOT_FILES_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " -IMAGE_BOOT_FILES_sota_rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " -KERNEL_CLASSES_rpi = " toradex-fitimage " -OSTREE_KERNEL_rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" -KERNEL_IMAGETYPE_rpi = "fitImage" - -## RPI: Use official raspberrypi downstream kernel -PREFERRED_PROVIDER_virtual/kernel_rpi ?= "linux-lmp-dev" +IMAGE_BOOT_FILES:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " +IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " +KERNEL_CLASSES:rpi = " toradex-fitimage " +OSTREE_KERNEL:rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" +KERNEL_IMAGETYPE:rpi = "fitImage" +PREFERRED_PROVIDER_virtual/kernel:rpi ?= "linux-lmp-rpi" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" -LINUX_VERSION_rpi ?= "4.19.y" -KERNEL_REPO_rpi ?= "git://github.com/raspberrypi/linux.git" -KERNEL_BRANCH_rpi ?= "rpi-4.19.y" -KERNEL_COMMIT_rpi ?= "f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7" -KERNEL_META_BRANCH_rpi ?= "linux-v4.19.y" -KERNEL_META_COMMIT_rpi ?= "1e97ab775c4c499b995e7013ffc221d71844ba87" ## Mimic meta-raspberrypi behavior -ENABLE_UART = "1" -KERNEL_SERIAL_rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" +ENABLE_UART:rpi = "1" +KERNEL_SERIAL:rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" -KERNEL_DEVICETREE_raspberrypi4-64_sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d.dtbo" -SOTA_DT_OVERLAYS_raspberrypi4-64 ?= "vc4-fkms-v3d.dtbo" # This boot arguments are the same from torizon.bbclass -OSTREE_KERNEL_ARGS_sota_append_rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 " +OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 " ## U-Boot entrypoints for rpi -UBOOT_ENTRYPOINT_rpi = "0x00008000" -UBOOT_DTB_LOADADDRESS_rpi = "0x02600000" -UBOOT_DTBO_LOADADDRESS_rpi = "0x026d0000" +UBOOT_ENTRYPOINT:rpi = "0x00008000" +UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" +UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" # Use meta-lmp but maintain compatibility BBMASK += " \ From b823ab9bc22e269be953cf12160eaa4578abed5c Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 22 Jul 2022 15:24:29 -0300 Subject: [PATCH 025/163] labs: rpi: resize-helper: Update recipe Signed-off-by: Matheus Castello --- .../resize-helper/resize-helper/resize-helper | 37 ++++++++++++++----- .../resize-helper/resize-helper.service | 2 +- .../resize-helper/resize-helper_0.1.bb | 6 +-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/recipes-support/resize-helper/resize-helper/resize-helper b/recipes-support/resize-helper/resize-helper/resize-helper index 3f1d2d42..4616b5a9 100644 --- a/recipes-support/resize-helper/resize-helper/resize-helper +++ b/recipes-support/resize-helper/resize-helper/resize-helper @@ -23,13 +23,17 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. +# must exit on error +set -e +set -o pipefail + # we must be root [ $(whoami) = "root" ] || { echo "E: You must be root" && exit 1; } # we must have few tools SGDISK=$(which sgdisk) || { echo "E: You must have sgdisk" && exit 1; } -PARTED=$(which parted) || { echo "E: You must have parted" && exit 1; } -PARTPROBE=$(which partprobe) || { echo "E: You must have partprobe" && exit 1; } +FDISK=$(which fdisk) || { echo "E: You must have fdisk" && exit 1; } +PARTX=$(which partx) || { echo "E: You must have partx" && exit 1; } RESIZE2FS=$(which resize2fs) || { echo "E: You must have resize2fs" && exit 1; } # find root device @@ -37,7 +41,9 @@ ROOT_DEVICE=$(findmnt --noheadings --output=SOURCE / | cut -d'[' -f1) # prune root device (for example UUID) ROOT_DEVICE=$(realpath ${ROOT_DEVICE}) # get the partition number and type -PART_ENTRY_NUMBER=$(udevadm info --query=property --name=${ROOT_DEVICE} | grep '^ID_PART_ENTRY_NUMBER=' | cut -d'=' -f2) +INFO=$(udevadm info --query=property --name=${ROOT_DEVICE}) +PART_ENTRY_NUMBER=$(echo "${INFO}" | grep '^ID_PART_ENTRY_NUMBER=' | cut -d'=' -f2) +PART_ENTRY_NAME=$(echo "${INFO}" | grep '^ID_PART_ENTRY_NAME=' || true | cut -d'=' -f2) # in case the root device is not on a partitioned media if [ "x$PART_ENTRY_NUMBER" = "x" ]; then @@ -45,18 +51,31 @@ if [ "x$PART_ENTRY_NUMBER" = "x" ]; then exit 0 fi -PART_TABLE_TYPE=$(udevadm info --query=property --name=${ROOT_DEVICE} | grep '^ID_PART_TABLE_TYPE=' | cut -d'=' -f2) +PART_TABLE_TYPE=$(echo "${INFO}" | grep '^ID_PART_TABLE_TYPE=' | cut -d'=' -f2) # find the block device DEVICE=$(udevadm info --query=path --name=${ROOT_DEVICE} | awk -F'/' '{print $(NF-1)}') DEVICE="/dev/${DEVICE}" +SIZE=$(blockdev --getsz ${DEVICE}) +TYPE="p\n" if [ "$PART_TABLE_TYPE" = "gpt" ]; then ${SGDISK} -e ${DEVICE} - ${PARTPROBE} + SIZE=$(($SIZE - 33)) # the GPT end of disk is 34 sectors + TYPE="" +fi + +# Use fdisk to repartition +# fdisk uses a ram image of the parition table until a write is performed +# so the sequence is to delete the partition and recreate it at the same +# starting point but making it the size of the available disk. +# +END=$((${SIZE} - 1)) +PARTOF=$(echo "${INFO}" | grep '^ID_PART_ENTRY_OFFSET=' | cut -d'=' -f2) +echo -e "d\n${PART_ENTRY_NUMBER}\nn\n${TYPE}${PART_ENTRY_NUMBER}\n${PARTOF}\n${END}\nw\n" | ${FDISK} ${DEVICE} + +if [ -n "${PART_ENTRY_NAME}" ]; then + ${SGDISK} --change-name=${PART_ENTRY_NUMBER}:"${PART_ENTRY_NAME}" ${DEVICE} fi -# 'Yes' is required when partition is already mounted -echo -e 'Yes\n100%' | ${PARTED} ---pretend-input-tty ${DEVICE} resizepart ${PART_ENTRY_NUMBER} || - echo -e '100%' | ${PARTED} ---pretend-input-tty ${DEVICE} resizepart ${PART_ENTRY_NUMBER} -${PARTPROBE} +${PARTX} -u ${DEVICE} ${RESIZE2FS} "${ROOT_DEVICE}" diff --git a/recipes-support/resize-helper/resize-helper/resize-helper.service b/recipes-support/resize-helper/resize-helper/resize-helper.service index e3a0f8e4..e2262bea 100644 --- a/recipes-support/resize-helper/resize-helper/resize-helper.service +++ b/recipes-support/resize-helper/resize-helper/resize-helper.service @@ -6,7 +6,7 @@ After=systemd-remount-fs.service systemd-udevd.service [Service] Type=oneshot ExecStartPre=-/bin/udevadm settle -ExecStart=-/usr/sbin/resize-helper +ExecStart=/usr/sbin/resize-helper ExecStartPost=/bin/systemctl disable resize-helper.service [Install] diff --git a/recipes-support/resize-helper/resize-helper_0.1.bb b/recipes-support/resize-helper/resize-helper_0.1.bb index 61fbfba5..34feb23c 100644 --- a/recipes-support/resize-helper/resize-helper_0.1.bb +++ b/recipes-support/resize-helper/resize-helper_0.1.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/BSD-2-Clause;md5=cb641bc04cda31 inherit allarch systemd -RDEPENDS_${PN} += "e2fsprogs-resize2fs gptfdisk parted util-linux-findmnt" +RDEPENDS:${PN} += "e2fsprogs-resize2fs gptfdisk util-linux-fdisk util-linux-blockdev util-linux-partx util-linux-findmnt" SRC_URI = "file://resize-helper \ file://resize-helper.service \ @@ -23,5 +23,5 @@ do_install () { install -m 0644 ${S}/resize-helper.service ${D}${systemd_system_unitdir} } -SYSTEMD_SERVICE_${PN} = "resize-helper.service" -SYSTEMD_AUTO_ENABLE_${PN} = "enable" +SYSTEMD_SERVICE:${PN} = "resize-helper.service" +SYSTEMD_AUTO_ENABLE:${PN} = "enable" From e6753b9b57ebaba5416f89cce41324dd9db9e710 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 22 Jul 2022 16:37:19 -0300 Subject: [PATCH 026/163] labs: rpi: Fix old override sintax Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 4 ++-- recipes-kernel/linux/linux-lmp%.bbappend | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index d12516c9..fc5b16fb 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -10,8 +10,8 @@ PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" PREFERRED_PROVIDER_u-boot:rpi = "u-boot-fio" SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" -WKS_FILE_DEPENDS_BOOTLOADERS_rpi = "virtual/bootloader" -WKS_FILE_DEPENDS_append_rpi = " u-boot-default-script" +WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" +WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-ostree-scr" PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-ostree-scr-fit" diff --git a/recipes-kernel/linux/linux-lmp%.bbappend b/recipes-kernel/linux/linux-lmp%.bbappend index 00006e4d..f0c51410 100644 --- a/recipes-kernel/linux/linux-lmp%.bbappend +++ b/recipes-kernel/linux/linux-lmp%.bbappend @@ -1,6 +1,6 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/linux-lmp-dev:" +FILESEXTRAPATHS:prepend := "${THISDIR}/linux-lmp-dev:" -SRC_URI_append = " \ +SRC_URI:append = " \ file://fragment.cfg \ " From 139d7e598a5ca4db53769deb5587d665bb7e05d6 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 22 Jul 2022 16:59:14 -0300 Subject: [PATCH 027/163] labs: rpi: Fix old override sintax 2 Ooops, some cherry pick mess up with ostree Signed-off-by: Matheus Castello --- recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend | 4 ++-- recipes-extended/ostree/ostree-torizon.inc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend b/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend index ed5e3eac..0dcff78d 100644 --- a/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend +++ b/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend @@ -1,5 +1,5 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" -SRC_URI_append = " \ +SRC_URI:append = " \ file://boot.cmd \ " diff --git a/recipes-extended/ostree/ostree-torizon.inc b/recipes-extended/ostree/ostree-torizon.inc index d30fdd4f..cd62e601 100644 --- a/recipes-extended/ostree/ostree-torizon.inc +++ b/recipes-extended/ostree/ostree-torizon.inc @@ -43,7 +43,7 @@ def get_rdeps(d): if is_ti(d): # TI return 'ostree-uboot-env' if d.getVar('PREFERRED_PROVIDER_u-boot') else '' else: # NXP/x86 generic/QEMU - return 'ostree-uboot-env' if d.getVar('PREFERRED_PROVIDER_u-boot-default-script') else '' + return 'ostree-uboot-env' if d.getVar('PREFERRED_PROVIDER_u-boot-default-script') and ('raspberrypi' not in d.getVar('MACHINE')) else '' DEPENDS:append:class-target = " ${@get_deps(d)}" RDEPENDS:${PN}:append:class-target = " ${@get_rdeps(d)}" From 6e1d2c0e7b486416674d348b8e33d15724cd576d Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 23 Jul 2022 02:06:03 -0300 Subject: [PATCH 028/163] labs: rpi: Fix wireguard builtin and linux-firmware-nxp89xx Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 2 ++ conf/machine/include/raspberrypi4-64.inc | 1 + 2 files changed, 3 insertions(+) diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index e2fa969c..80c47953 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -4,6 +4,7 @@ WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" CORE_IMAGE_BASE_INSTALL:append = "resize-helper" # Raspberry Pi +KERNEL_BUILTIN_WIREGUARD:rpi = "1" PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" @@ -49,6 +50,7 @@ BBMASK += " \ meta-lmp/meta-lmp-base/recipes-security \ meta-lmp/meta-lmp-base/recipes-sota \ meta-lmp/meta-lmp-base/recipes-support \ + meta-lmp/meta-lmp-bsp/recipes-kernel/linux-firmware \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index fc5b16fb..2972e2bb 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -50,6 +50,7 @@ BBMASK += " \ meta-lmp/meta-lmp-base/recipes-security \ meta-lmp/meta-lmp-base/recipes-sota \ meta-lmp/meta-lmp-base/recipes-support \ + meta-lmp/meta-lmp-bsp/recipes-kernel/linux-firmware \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ From 2053b2fe7f4f7f6aba2eac2fd531e5bfcbe532c2 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 23 Jul 2022 02:09:59 -0300 Subject: [PATCH 029/163] labs: rpi: Bump Torizon major version Using kirkstone Torizon 6.0.0 Signed-off-by: Matheus Castello --- conf/distro/include/torizon.inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/distro/include/torizon.inc b/conf/distro/include/torizon.inc index 839e1f36..cc42a843 100644 --- a/conf/distro/include/torizon.inc +++ b/conf/distro/include/torizon.inc @@ -12,6 +12,9 @@ IMAGE_CLASSES:remove = "image_type_tezi image_types_fsl" IMAGE_BASENAME_SUFFIX ?= "" +# execute order 66 +TDX_MAJOR = "6" + IMX_DEFAULT_BSP = "nxp" IMX_DEFAULT_BSP:upstream = "mainline" From d021ce1c3cd33c64c8b2653cfb4250d680f5fb39 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 23 Jul 2022 02:40:50 -0300 Subject: [PATCH 030/163] labs: rpi: Fix remove uart0-rpi4.dtbo Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 2972e2bb..cf8c47a7 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -10,6 +10,7 @@ PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" PREFERRED_PROVIDER_u-boot:rpi = "u-boot-fio" SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" +SOTA_DT_OVERLAYS:raspberrypi4-64 ?= "vc4-fkms-v3d.dtbo" WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-ostree-scr" @@ -24,6 +25,7 @@ IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIM KERNEL_CLASSES:rpi = " toradex-fitimage " OSTREE_KERNEL:rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" KERNEL_IMAGETYPE:rpi = "fitImage" +KERNEL_DEVICETREE:raspberrypi4-64:sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d.dtbo" PREFERRED_PROVIDER_virtual/kernel:rpi ?= "linux-lmp-rpi" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" From b5d9fe0d066ae0ad3894f11c7da54726792484b3 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 25 Jul 2022 12:25:23 -0300 Subject: [PATCH 031/163] labs: linux-lmp-dev: Add BACKLIGHT_CLASS_DEVICES Is needed for DRM_PANEL Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-lmp-dev/fragment.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes-kernel/linux/linux-lmp-dev/fragment.cfg b/recipes-kernel/linux/linux-lmp-dev/fragment.cfg index 2e4447af..9ced1328 100644 --- a/recipes-kernel/linux/linux-lmp-dev/fragment.cfg +++ b/recipes-kernel/linux/linux-lmp-dev/fragment.cfg @@ -14,5 +14,6 @@ CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y CONFIG_FB_SYS_FOPS=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y From 328052845e0769f746448a8509b2822956bbe360 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 25 Jul 2022 14:07:56 -0300 Subject: [PATCH 032/163] labs: raspberrypi4-64: Add support for raspberrypi drm touchscreen Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index cf8c47a7..c6d6aea0 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -10,7 +10,7 @@ PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" PREFERRED_PROVIDER_u-boot:rpi = "u-boot-fio" SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" -SOTA_DT_OVERLAYS:raspberrypi4-64 ?= "vc4-fkms-v3d.dtbo" +SOTA_DT_OVERLAYS:raspberrypi4-64 ?= "vc4-fkms-v3d-pi4.dtbo rpi-ft5406.dtbo" WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-ostree-scr" @@ -25,7 +25,8 @@ IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIM KERNEL_CLASSES:rpi = " toradex-fitimage " OSTREE_KERNEL:rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" KERNEL_IMAGETYPE:rpi = "fitImage" -KERNEL_DEVICETREE:raspberrypi4-64:sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d.dtbo" +VC4DTBO ?= "vc4-fkms-v3d-pi4" +KERNEL_DEVICETREE:raspberrypi4-64:sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d-pi4.dtbo overlays/rpi-ft5406.dtbo" PREFERRED_PROVIDER_virtual/kernel:rpi ?= "linux-lmp-rpi" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" From 48e3239d8164d5d4e23cbbb1ad05c0694d194ac2 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 13 Aug 2022 22:30:30 -0300 Subject: [PATCH 033/163] labs: x86: Add support for Torizon x86 using meta-intel BSP Signed-off-by: Matheus Castello --- conf/machine/include/intel-corei7-64.inc | 29 ++ conf/template/bblayers.conf | 1 + recipes-sota/config/aktualizr-default-sec.bb | 1 + scripts/lib/wic/canned-wks/efiimage-sota.wks | 8 + .../lib/wic/plugins/source/bootimg-efi-tmp.py | 415 ++++++++++++++++++ scripts/setup-environment-internal | 2 +- 6 files changed, 455 insertions(+), 1 deletion(-) create mode 100644 conf/machine/include/intel-corei7-64.inc create mode 100644 scripts/lib/wic/canned-wks/efiimage-sota.wks create mode 100644 scripts/lib/wic/plugins/source/bootimg-efi-tmp.py diff --git a/conf/machine/include/intel-corei7-64.inc b/conf/machine/include/intel-corei7-64.inc new file mode 100644 index 00000000..f9ad18aa --- /dev/null +++ b/conf/machine/include/intel-corei7-64.inc @@ -0,0 +1,29 @@ + +WKS_FILE:intel-corei7-64:sota = "efiimage-sota.wks" +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" + +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" + +OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64 = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " +OSTREE_BOOTLOADER:intel-corei7-64 = "grub" +OSTREE_DEPLOY_DEVICETREE:intel-corei7-64 = "0" +EFI_PROVIDER:intel-corei7-64 = "grub-efi" +SOTA_CLIENT_FEATURES:remove = "ubootenv" + +IMAGE_FSTYPES_REMOVE = "hddimg teziimg" +IMAGE_FSTYPES:append = " wic.vmdk wic.vdi" + +hostname:pn-base-files = "torizon-x86" +CORE_IMAGE_BASE_INSTALL:remove = "set-hostname" + +PREFERRED_PROVIDER_u-boot-default-script = "" +PREFERRED_PROVIDER_virtual/dtb = "" + +IMAGE_INSTALL:remove = " minnowboard-efi-startup" +LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" + +# Use meta-lmp but maintain compatibility +BBMASK += " \ + meta-lmp/meta-lmp-base \ + meta-lmp/meta-lmp-bsp \ +" diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index 81807ef8..c0db5f76 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -33,6 +33,7 @@ BSPLAYERS ?= " \ ${OEROOT}/layers/meta-arm/meta-arm \ ${OEROOT}/layers/meta-ti/meta-ti-bsp \ ${OEROOT}/layers/meta-ti/meta-ti-extras \ + ${OEROOT}/layers/meta-intel \ " # Add your overlay location to EXTRALAYERS diff --git a/recipes-sota/config/aktualizr-default-sec.bb b/recipes-sota/config/aktualizr-default-sec.bb index ff4f1d81..cd7bdc0e 100644 --- a/recipes-sota/config/aktualizr-default-sec.bb +++ b/recipes-sota/config/aktualizr-default-sec.bb @@ -14,6 +14,7 @@ SRC_URI = " \ RDEPENDS:${PN} += "bash coreutils jq util-linux mmc-utils sed u-boot-fw-utils" RDEPENDS:${PN}:remove:genericx86-64 = "u-boot-fw-utils" +RDEPENDS:${PN}:remove:intel-corei7-64 = "u-boot-fw-utils" do_install:append () { install -m 0700 -d ${D}${libdir}/sota/conf.d diff --git a/scripts/lib/wic/canned-wks/efiimage-sota.wks b/scripts/lib/wic/canned-wks/efiimage-sota.wks new file mode 100644 index 00000000..21b2f84d --- /dev/null +++ b/scripts/lib/wic/canned-wks/efiimage-sota.wks @@ -0,0 +1,8 @@ +# short-description: Create an OTA-enabled EFI disk image +# long-description: Creates an OTA-enabled EFI disk image that the user +# can directly dd to boot media. + +part /boot --source bootimg-efi-tmp --sourceparams="loader=grub-efi" --ondisk hda --label efi --active --align 1024 +part / --source otaimage --ondisk hda --fstype=ext4 --align 1024 --use-uuid + +bootloader --ptable gpt --timeout=0 --append="rootfstype=ext4 console=ttyS0,115200 console=tty0" --configfile="grub-ota.cfg" diff --git a/scripts/lib/wic/plugins/source/bootimg-efi-tmp.py b/scripts/lib/wic/plugins/source/bootimg-efi-tmp.py new file mode 100644 index 00000000..dd5217ba --- /dev/null +++ b/scripts/lib/wic/plugins/source/bootimg-efi-tmp.py @@ -0,0 +1,415 @@ +# +# Copyright (c) 2014, Intel Corporation. +# +# SPDX-License-Identifier: GPL-2.0-only +# +# DESCRIPTION +# This implements the 'bootimg-efi' source plugin class for 'wic' +# +# AUTHORS +# Tom Zanussi +# + +import logging +import os +import tempfile +import shutil +import re + +from glob import glob + +from wic import WicError +from wic.engine import get_custom_config +from wic.pluginbase import SourcePlugin +from wic.misc import (exec_cmd, exec_native_cmd, + get_bitbake_var, BOOTDD_EXTRA_SPACE) + +logger = logging.getLogger('wic') + +class BootimgEFIPlugin(SourcePlugin): + """ + Create EFI boot partition. + This plugin supports GRUB 2 and systemd-boot bootloaders. + """ + + name = 'bootimg-efi-tmp' + + @classmethod + def do_configure_grubefi(cls, hdddir, creator, cr_workdir, source_params): + """ + Create loader-specific (grub-efi) config + """ + configfile = creator.ks.bootloader.configfile + custom_cfg = None + if configfile: + custom_cfg = get_custom_config(configfile) + if custom_cfg: + # Use a custom configuration for grub + grubefi_conf = custom_cfg + logger.debug("Using custom configuration file " + "%s for grub.cfg", configfile) + else: + raise WicError("configfile is specified but failed to " + "get it from %s." % configfile) + + initrd = source_params.get('initrd') + + if initrd: + bootimg_dir = get_bitbake_var("DEPLOY_DIR_IMAGE") + if not bootimg_dir: + raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting") + + initrds = initrd.split(';') + for rd in initrds: + cp_cmd = "cp %s/%s %s" % (bootimg_dir, rd, hdddir) + exec_cmd(cp_cmd, True) + else: + logger.debug("Ignoring missing initrd") + + if not custom_cfg: + # Create grub configuration using parameters from wks file + bootloader = creator.ks.bootloader + title = source_params.get('title') + + grubefi_conf = "" + grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n" + grubefi_conf += "default=boot\n" + grubefi_conf += "timeout=%s\n" % bootloader.timeout + grubefi_conf += "menuentry '%s'{\n" % (title if title else "boot") + + kernel = get_bitbake_var("KERNEL_IMAGETYPE") + if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1": + if get_bitbake_var("INITRAMFS_IMAGE"): + kernel = "%s-%s.bin" % \ + (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME")) + + label = source_params.get('label') + label_conf = "root=%s" % creator.rootdev + if label: + label_conf = "LABEL=%s" % label + + grubefi_conf += "linux /%s %s rootwait %s\n" \ + % (kernel, label_conf, bootloader.append) + + if initrd: + initrds = initrd.split(';') + grubefi_conf += "initrd" + for rd in initrds: + grubefi_conf += " /%s" % rd + grubefi_conf += "\n" + + grubefi_conf += "}\n" + + logger.debug("Writing grubefi config %s/hdd/boot/EFI/BOOT/grub.cfg", + cr_workdir) + cfg = open("%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir, "w") + cfg.write(grubefi_conf) + cfg.close() + + @classmethod + def do_configure_systemdboot(cls, hdddir, creator, cr_workdir, source_params): + """ + Create loader-specific systemd-boot/gummiboot config + """ + install_cmd = "install -d %s/loader" % hdddir + exec_cmd(install_cmd) + + install_cmd = "install -d %s/loader/entries" % hdddir + exec_cmd(install_cmd) + + bootloader = creator.ks.bootloader + + loader_conf = "" + if source_params.get('create-unified-kernel-image') != "true": + loader_conf += "default boot\n" + loader_conf += "timeout %d\n" % bootloader.timeout + + initrd = source_params.get('initrd') + + if initrd and source_params.get('create-unified-kernel-image') != "true": + # obviously we need to have a common common deploy var + bootimg_dir = get_bitbake_var("DEPLOY_DIR_IMAGE") + if not bootimg_dir: + raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting") + + initrds = initrd.split(';') + for rd in initrds: + cp_cmd = "cp %s/%s %s" % (bootimg_dir, rd, hdddir) + exec_cmd(cp_cmd, True) + else: + logger.debug("Ignoring missing initrd") + + logger.debug("Writing systemd-boot config " + "%s/hdd/boot/loader/loader.conf", cr_workdir) + cfg = open("%s/hdd/boot/loader/loader.conf" % cr_workdir, "w") + cfg.write(loader_conf) + cfg.close() + + configfile = creator.ks.bootloader.configfile + custom_cfg = None + if configfile: + custom_cfg = get_custom_config(configfile) + if custom_cfg: + # Use a custom configuration for systemd-boot + boot_conf = custom_cfg + logger.debug("Using custom configuration file " + "%s for systemd-boots's boot.conf", configfile) + else: + raise WicError("configfile is specified but failed to " + "get it from %s.", configfile) + + if not custom_cfg: + # Create systemd-boot configuration using parameters from wks file + kernel = get_bitbake_var("KERNEL_IMAGETYPE") + if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1": + if get_bitbake_var("INITRAMFS_IMAGE"): + kernel = "%s-%s.bin" % \ + (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME")) + + title = source_params.get('title') + + boot_conf = "" + boot_conf += "title %s\n" % (title if title else "boot") + boot_conf += "linux /%s\n" % kernel + + label = source_params.get('label') + label_conf = "LABEL=Boot root=%s" % creator.rootdev + if label: + label_conf = "LABEL=%s" % label + + boot_conf += "options %s %s\n" % \ + (label_conf, bootloader.append) + + if initrd: + initrds = initrd.split(';') + for rd in initrds: + boot_conf += "initrd /%s\n" % rd + + if source_params.get('create-unified-kernel-image') != "true": + logger.debug("Writing systemd-boot config " + "%s/hdd/boot/loader/entries/boot.conf", cr_workdir) + cfg = open("%s/hdd/boot/loader/entries/boot.conf" % cr_workdir, "w") + cfg.write(boot_conf) + cfg.close() + + + @classmethod + def do_configure_partition(cls, part, source_params, creator, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + native_sysroot): + """ + Called before do_prepare_partition(), creates loader-specific config + """ + hdddir = "%s/hdd/boot" % cr_workdir + + install_cmd = "install -d %s/EFI/BOOT" % hdddir + exec_cmd(install_cmd) + + try: + if source_params['loader'] == 'grub-efi': + cls.do_configure_grubefi(hdddir, creator, cr_workdir, source_params) + elif source_params['loader'] == 'systemd-boot': + cls.do_configure_systemdboot(hdddir, creator, cr_workdir, source_params) + else: + raise WicError("unrecognized bootimg-efi loader: %s" % source_params['loader']) + except KeyError: + raise WicError("bootimg-efi requires a loader, none specified") + + if get_bitbake_var("IMAGE_EFI_BOOT_FILES") is None: + logger.debug('No boot files defined in IMAGE_EFI_BOOT_FILES') + else: + boot_files = None + for (fmt, id) in (("_uuid-%s", part.uuid), ("_label-%s", part.label), (None, None)): + if fmt: + var = fmt % id + else: + var = "" + + boot_files = get_bitbake_var("IMAGE_EFI_BOOT_FILES" + var) + if boot_files: + break + + logger.debug('Boot files: %s', boot_files) + + # list of tuples (src_name, dst_name) + deploy_files = [] + for src_entry in re.findall(r'[\w;\-\./\*]+', boot_files): + if ';' in src_entry: + dst_entry = tuple(src_entry.split(';')) + if not dst_entry[0] or not dst_entry[1]: + raise WicError('Malformed boot file entry: %s' % src_entry) + else: + dst_entry = (src_entry, src_entry) + + logger.debug('Destination entry: %r', dst_entry) + deploy_files.append(dst_entry) + + cls.install_task = []; + for deploy_entry in deploy_files: + src, dst = deploy_entry + if '*' in src: + # by default install files under their basename + entry_name_fn = os.path.basename + if dst != src: + # unless a target name was given, then treat name + # as a directory and append a basename + entry_name_fn = lambda name: \ + os.path.join(dst, + os.path.basename(name)) + + srcs = glob(os.path.join(kernel_dir, src)) + + logger.debug('Globbed sources: %s', ', '.join(srcs)) + for entry in srcs: + src = os.path.relpath(entry, kernel_dir) + entry_dst_name = entry_name_fn(entry) + cls.install_task.append((src, entry_dst_name)) + else: + cls.install_task.append((src, dst)) + + @classmethod + def do_prepare_partition(cls, part, source_params, creator, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + rootfs_dir, native_sysroot): + """ + Called to do the actual content population for a partition i.e. it + 'prepares' the partition to be incorporated into the image. + In this case, prepare content for an EFI (grub) boot partition. + """ + if not kernel_dir: + kernel_dir = get_bitbake_var("DEPLOY_DIR_IMAGE") + if not kernel_dir: + raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting") + + staging_kernel_dir = kernel_dir + + hdddir = "%s/hdd/boot" % cr_workdir + + kernel = get_bitbake_var("KERNEL_IMAGETYPE") + if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1": + if get_bitbake_var("INITRAMFS_IMAGE"): + kernel = "%s-%s.bin" % \ + (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME")) + + if source_params.get('create-unified-kernel-image') == "true": + initrd = source_params.get('initrd') + if not initrd: + raise WicError("initrd= must be specified when create-unified-kernel-image=true, exiting") + + deploy_dir = get_bitbake_var("DEPLOY_DIR_IMAGE") + efi_stub = glob("%s/%s" % (deploy_dir, "linux*.efi.stub")) + if len(efi_stub) == 0: + raise WicError("Unified Kernel Image EFI stub not found, exiting") + efi_stub = efi_stub[0] + + with tempfile.TemporaryDirectory() as tmp_dir: + label = source_params.get('label') + label_conf = "root=%s" % creator.rootdev + if label: + label_conf = "LABEL=%s" % label + + bootloader = creator.ks.bootloader + cmdline = open("%s/cmdline" % tmp_dir, "w") + cmdline.write("%s %s" % (label_conf, bootloader.append)) + cmdline.close() + + initrds = initrd.split(';') + initrd = open("%s/initrd" % tmp_dir, "wb") + for f in initrds: + with open("%s/%s" % (deploy_dir, f), 'rb') as in_file: + shutil.copyfileobj(in_file, initrd) + initrd.close() + + # Searched by systemd-boot: + # https://systemd.io/BOOT_LOADER_SPECIFICATION/#type-2-efi-unified-kernel-images + install_cmd = "install -d %s/EFI/Linux" % hdddir + exec_cmd(install_cmd) + + staging_dir_host = get_bitbake_var("STAGING_DIR_HOST") + + # https://www.freedesktop.org/software/systemd/man/systemd-stub.html + objcopy_cmd = "objcopy \ + --add-section .osrel=%s --change-section-vma .osrel=0x20000 \ + --add-section .cmdline=%s --change-section-vma .cmdline=0x30000 \ + --add-section .linux=%s --change-section-vma .linux=0x2000000 \ + --add-section .initrd=%s --change-section-vma .initrd=0x3000000 \ + %s %s" % \ + ("%s/usr/lib/os-release" % staging_dir_host, + cmdline.name, + "%s/%s" % (staging_kernel_dir, kernel), + initrd.name, + efi_stub, + "%s/EFI/Linux/linux.efi" % hdddir) + exec_cmd(objcopy_cmd) + else: + install_cmd = "install -m 0644 %s/%s %s/%s" % \ + (staging_kernel_dir, kernel, hdddir, kernel) + exec_cmd(install_cmd) + + if get_bitbake_var("IMAGE_EFI_BOOT_FILES"): + for src_path, dst_path in cls.install_task: + install_cmd = "install -m 0644 -D %s %s" \ + % (os.path.join(kernel_dir, src_path), + os.path.join(hdddir, dst_path)) + exec_cmd(install_cmd) + + try: + if source_params['loader'] == 'grub-efi': + shutil.copyfile("%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir, + "%s/grub.cfg" % cr_workdir) + for mod in [x for x in os.listdir(kernel_dir) if x.startswith("grub-efi-")]: + cp_cmd = "cp %s/%s %s/EFI/BOOT/%s" % (kernel_dir, mod, hdddir, mod[9:]) + exec_cmd(cp_cmd, True) + shutil.move("%s/grub.cfg" % cr_workdir, + "%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir) + elif source_params['loader'] == 'systemd-boot': + for mod in [x for x in os.listdir(kernel_dir) if x.startswith("systemd-")]: + cp_cmd = "cp %s/%s %s/EFI/BOOT/%s" % (kernel_dir, mod, hdddir, mod[8:]) + exec_cmd(cp_cmd, True) + else: + raise WicError("unrecognized bootimg-efi loader: %s" % + source_params['loader']) + except KeyError: + raise WicError("bootimg-efi requires a loader, none specified") + + startup = os.path.join(kernel_dir, "startup.nsh") + if os.path.exists(startup): + cp_cmd = "cp %s %s/" % (startup, hdddir) + exec_cmd(cp_cmd, True) + + du_cmd = "du -bks %s" % hdddir + out = exec_cmd(du_cmd) + blocks = int(out.split()[0]) + + extra_blocks = part.get_extra_block_count(blocks) + + if extra_blocks < BOOTDD_EXTRA_SPACE: + extra_blocks = BOOTDD_EXTRA_SPACE + + blocks += extra_blocks + + logger.debug("Added %d extra blocks to %s to get to %d total blocks", + extra_blocks, part.mountpoint, blocks) + + # dosfs image, created by mkdosfs + bootimg = "%s/boot.img" % cr_workdir + + label = part.label if part.label else "ESP" + + dosfs_cmd = "mkdosfs -n %s -i %s -C %s %d" % \ + (label, part.fsuuid, bootimg, blocks) + exec_native_cmd(dosfs_cmd, native_sysroot) + + # TODO: upstream it - maintain properties and dates + mcopy_cmd = "mcopy -i %s -s %s/* ::/ -p -m" % (bootimg, hdddir) + exec_native_cmd(mcopy_cmd, native_sysroot) + + chmod_cmd = "chmod 644 %s" % bootimg + exec_cmd(chmod_cmd) + + du_cmd = "du -Lbks %s" % bootimg + out = exec_cmd(du_cmd) + bootimg_size = out.split()[0] + + part.size = int(bootimg_size) + part.source_file = bootimg diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 59e7b788..95f55f63 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From 3513a530aab2e634d1e95f453846de8c1c63a911 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 00:35:00 -0300 Subject: [PATCH 034/163] labs: x86: Remove grub menu during the boot Signed-off-by: Matheus Castello --- .../ostree-2021.6/0001-update-default-grub-cfg-header.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-extended/ostree/ostree-2021.6/0001-update-default-grub-cfg-header.patch b/recipes-extended/ostree/ostree-2021.6/0001-update-default-grub-cfg-header.patch index ab8850f9..f03c9df6 100644 --- a/recipes-extended/ostree/ostree-2021.6/0001-update-default-grub-cfg-header.patch +++ b/recipes-extended/ostree/ostree-2021.6/0001-update-default-grub-cfg-header.patch @@ -9,7 +9,7 @@ index 97ef4d69..b418c2fb 100644 -default=boot -timeout=10 +default=0 -+timeout=1 ++timeout=0 EOF } From f8e9612983d8d8dda2548a90dcb1126f98124551 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 00:40:00 -0300 Subject: [PATCH 035/163] labs: x86: kernel: linux-intel: Add configs for DRM Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-intel%.bbappend | 6 ++++++ recipes-kernel/linux/linux-intel/fragment.cfg | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 recipes-kernel/linux/linux-intel%.bbappend create mode 100644 recipes-kernel/linux/linux-intel/fragment.cfg diff --git a/recipes-kernel/linux/linux-intel%.bbappend b/recipes-kernel/linux/linux-intel%.bbappend new file mode 100644 index 00000000..e8a0b2c6 --- /dev/null +++ b/recipes-kernel/linux/linux-intel%.bbappend @@ -0,0 +1,6 @@ + +FILESEXTRAPATHS:prepend := "${THISDIR}/linux-intel:" + +SRC_URI:append = " \ + file://fragment.cfg \ +" diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg new file mode 100644 index 00000000..92fc7508 --- /dev/null +++ b/recipes-kernel/linux/linux-intel/fragment.cfg @@ -0,0 +1,16 @@ +CONFIG_I2C_ALGOBIT=y +CONFIG_CEC_CORE=y +CONFIG_DRM=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_DRM_PANEL_SIMPLE=y From 3e654acffb463f60ab7487b928b93fd637f7e16b Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 00:42:20 -0300 Subject: [PATCH 036/163] labs: x86: kernel: linux-intel: Add configs from check-config for docker Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-intel/fragment.cfg | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg index 92fc7508..1b68f48f 100644 --- a/recipes-kernel/linux/linux-intel/fragment.cfg +++ b/recipes-kernel/linux/linux-intel/fragment.cfg @@ -14,3 +14,19 @@ CONFIG_FB_SYS_IMAGEBLIT=y CONFIG_FB_SYS_FOPS=y CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_DRM_PANEL_SIMPLE=y +# CHECK CONFIG +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_CGROUP_SCHED=y +CONFIG_BLK_CGROUP=y +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_IP_VS=m +CONFIG_IP_VS_NFCT=y +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_RR=m +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_APPARMOR=y +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_IPVLAN=m +CONFIG_AUFS_FS=m From 2b0f4e2a8476f67067e46777f38a14076ba3ef0b Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 00:43:11 -0300 Subject: [PATCH 037/163] labs: x86: kernel: linux-intel: Add support for i915 drm Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-intel/fragment.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg index 1b68f48f..c4ff11b8 100644 --- a/recipes-kernel/linux/linux-intel/fragment.cfg +++ b/recipes-kernel/linux/linux-intel/fragment.cfg @@ -30,3 +30,5 @@ CONFIG_SECURITY_APPARMOR=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_IPVLAN=m CONFIG_AUFS_FS=m +# INTEL +CONFIG_DRM_I915=y From 4d080ba7dd2cb0c459b5d89a40d0facee5772573 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 00:45:32 -0300 Subject: [PATCH 038/163] labs: x86: kernel: linux-intel: Add support for amdgpu drm Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-intel/fragment.cfg | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg index c4ff11b8..70498e13 100644 --- a/recipes-kernel/linux/linux-intel/fragment.cfg +++ b/recipes-kernel/linux/linux-intel/fragment.cfg @@ -32,3 +32,14 @@ CONFIG_IPVLAN=m CONFIG_AUFS_FS=m # INTEL CONFIG_DRM_I915=y +# AMD +CONFIG_DRM_AMDGPU=y +CONFIG_DRM_AMDGPU_SI=y +CONFIG_DRM_AMDGPU_CIK=y +CONFIG_DRM_AMDGPU_USERPTR=y +CONFIG_DRM_AMD_ACP=y +CONFIG_DRM_AMD_DC=y +CONFIG_DRM_AMD_DC_DCN=y +CONFIG_DRM_AMD_DC_HDCP=y +CONFIG_DRM_AMD_DC_SI=y +CONFIG_DRM_AMD_SECURE_DISPLAY=y From 1996670c5ba22bf71a9ff9c9a403554da2b28d3c Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 00:46:19 -0300 Subject: [PATCH 039/163] labs: x86: kernel: linux-intel: Add support for vmware drm Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-intel/fragment.cfg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg index 70498e13..2d2f7436 100644 --- a/recipes-kernel/linux/linux-intel/fragment.cfg +++ b/recipes-kernel/linux/linux-intel/fragment.cfg @@ -43,3 +43,6 @@ CONFIG_DRM_AMD_DC_DCN=y CONFIG_DRM_AMD_DC_HDCP=y CONFIG_DRM_AMD_DC_SI=y CONFIG_DRM_AMD_SECURE_DISPLAY=y +# VMWARE +CONFIG_DRM_VMWGFX=y +CONFIG_DRM_VMWGFX_FBCON=y From 18c1cbc4958f620b513814a4ac55ae31d6f6a12b Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 00:47:10 -0300 Subject: [PATCH 040/163] labs: x86: kernel: linux-intel: Add support for Virtual box drm Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-intel/fragment.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg index 2d2f7436..85b4baeb 100644 --- a/recipes-kernel/linux/linux-intel/fragment.cfg +++ b/recipes-kernel/linux/linux-intel/fragment.cfg @@ -46,3 +46,7 @@ CONFIG_DRM_AMD_SECURE_DISPLAY=y # VMWARE CONFIG_DRM_VMWGFX=y CONFIG_DRM_VMWGFX_FBCON=y +# VIRTUAL BOX +CONFIG_DRM_VBOXVIDEO=y +CONFIG_VBOXGUEST=m +CONFIG_VBOXSF_FS=m From 6740f9ed53e0885d60fecc2932530c72a60fb867 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 14 Aug 2022 01:34:37 -0300 Subject: [PATCH 041/163] labs: x86: kernel: linux-intel: Add support for cirrus drm Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-intel/fragment.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg index 85b4baeb..10a55a34 100644 --- a/recipes-kernel/linux/linux-intel/fragment.cfg +++ b/recipes-kernel/linux/linux-intel/fragment.cfg @@ -50,3 +50,5 @@ CONFIG_DRM_VMWGFX_FBCON=y CONFIG_DRM_VBOXVIDEO=y CONFIG_VBOXGUEST=m CONFIG_VBOXSF_FS=m +# QEMU +CONFIG_DRM_CIRRUS_QEMU=y From 18cf3ba1fc160b1f0d99debe0c79048f99f40d49 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 22 Aug 2022 16:22:28 -0300 Subject: [PATCH 042/163] labs: raspberrypi4: Fix fbcon map Reported-by: Felipe Madureira Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index c6d6aea0..90d98e61 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -35,7 +35,7 @@ ENABLE_UART:rpi = "1" KERNEL_SERIAL:rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" # This boot arguments are the same from torizon.bbclass -OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 " +OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " ## U-Boot entrypoints for rpi UBOOT_ENTRYPOINT:rpi = "0x00008000" From 56445716e703c760e80a21280a676d9475eab193 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 7 Sep 2022 23:34:43 -0300 Subject: [PATCH 043/163] labs: rv: Add initial risc-v tests Signed-off-by: Matheus Castello --- conf/machine/include/nezha-allwinner-d1.inc | 18 ++++++++++++++++++ scripts/setup-environment-internal | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 conf/machine/include/nezha-allwinner-d1.inc diff --git a/conf/machine/include/nezha-allwinner-d1.inc b/conf/machine/include/nezha-allwinner-d1.inc new file mode 100644 index 00000000..ee1b217a --- /dev/null +++ b/conf/machine/include/nezha-allwinner-d1.inc @@ -0,0 +1,18 @@ + +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" + +OSTREE_KERNEL_ARGS:sota:append:nezha-allwinner-d1 = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " +SOTA_CLIENT_FEATURES:append:nezha-allwinner-d1 = " ubootenv" +WKS_FILE_DEPENDS_BOOTLOADERS:nezha-allwinner-d1 = "virtual/bootloader" +WKS_FILE_DEPENDS:append:nezha-allwinner-d1 = " u-boot-default-script" +PREFERRED_PROVIDER_u-boot-default-script:nezha-allwinner-d1 = "u-boot-ostree-scr" +PREFERRED_PROVIDER_u-boot-default-script:sota:nezha-allwinner-d1 = "u-boot-ostree-scr-fit" + +LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" + +# Use meta-lmp but maintain compatibility +BBMASK += " \ + meta-lmp/meta-lmp-base \ + meta-lmp/meta-lmp-bsp \ +" diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 95f55f63..fd7e1298 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From 9a454544260aa39c06ebe937623c11909caf675a Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 7 Sep 2022 23:57:14 -0300 Subject: [PATCH 044/163] labs: rv: Add the bsp layers Signed-off-by: Matheus Castello --- conf/template/bblayers.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index c0db5f76..f4f93b98 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -34,6 +34,7 @@ BSPLAYERS ?= " \ ${OEROOT}/layers/meta-ti/meta-ti-bsp \ ${OEROOT}/layers/meta-ti/meta-ti-extras \ ${OEROOT}/layers/meta-intel \ + ${OEROOT}/layers/meta-riscv \ " # Add your overlay location to EXTRALAYERS From 64a1d5bb3788f1d47be12fd7260564be5af9f069 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 16 Sep 2022 15:49:39 -0300 Subject: [PATCH 045/163] labs: nezha: Add nezha sota wks Signed-off-by: Matheus Castello --- scripts/lib/wic/canned-wks/nezha-sota.wks | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 scripts/lib/wic/canned-wks/nezha-sota.wks diff --git a/scripts/lib/wic/canned-wks/nezha-sota.wks b/scripts/lib/wic/canned-wks/nezha-sota.wks new file mode 100644 index 00000000..7aa39479 --- /dev/null +++ b/scripts/lib/wic/canned-wks/nezha-sota.wks @@ -0,0 +1,9 @@ +# short-description: Create SD card image for Nezha Allwinner D1 development board + +part boot0 --source rawcopy --sourceparams="file=boot0_sdcard_sun20iw1p1.bin" --offset 16s --ondisk mmcblk0 --no-table + +part u-boot --source rawcopy --sourceparams="file=u-boot.toc1" --offset 32800s --ondisk mmcblk0 --no-table + +part /boot --source bootimg-partition --ondisk mmcblk0 --fstype=vfat --label boot --align 4096 --fixed-size 64 --active + +part / --source otaimage --ondisk mmcblk0 --fstype=ext4 --align 4096 From 7f26c0ec14824e03410bad36d60fc76c5883f4f2 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 16 Sep 2022 15:53:10 -0300 Subject: [PATCH 046/163] labs: nezha: docker: Add specific riscv64 changes to build GO Signed-off-by: Matheus Castello --- .../0003-dynbinary-use-go-cross-compiler.patch | 13 +++++++++++++ .../0004-libnetwork-use-GO-instead-of-go.patch | 13 +++++++++++++ recipes-containers/docker/docker-ce_git.bbappend | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 recipes-containers/docker/docker-ce/0003-dynbinary-use-go-cross-compiler.patch create mode 100644 recipes-containers/docker/docker-ce/0004-libnetwork-use-GO-instead-of-go.patch diff --git a/recipes-containers/docker/docker-ce/0003-dynbinary-use-go-cross-compiler.patch b/recipes-containers/docker/docker-ce/0003-dynbinary-use-go-cross-compiler.patch new file mode 100644 index 00000000..c32bb87e --- /dev/null +++ b/recipes-containers/docker/docker-ce/0003-dynbinary-use-go-cross-compiler.patch @@ -0,0 +1,13 @@ +--- a/src/import/hack/make/.binary 2022-09-08 02:43:54.569047202 -0300 ++++ b/src/import/hack/make/.binary 2022-09-08 02:46:11.612879337 -0300 +@@ -67,6 +67,10 @@ + export CC="${CC:-x86_64-linux-gnu-gcc}" + export CGO_ENABLED=1 + ;; ++ linux/riscv64) ++ export CC="${CC:-riscv64-linux-gnu-gcc}" ++ export CGO_ENABLED=1 ++ ;; + esac + fi + diff --git a/recipes-containers/docker/docker-ce/0004-libnetwork-use-GO-instead-of-go.patch b/recipes-containers/docker/docker-ce/0004-libnetwork-use-GO-instead-of-go.patch new file mode 100644 index 00000000..9141eb5d --- /dev/null +++ b/recipes-containers/docker/docker-ce/0004-libnetwork-use-GO-instead-of-go.patch @@ -0,0 +1,13 @@ +--- git.orig/libnetwork/Makefile 2022-09-08 02:50:43.820948164 -0300 ++++ git/libnetwork/Makefile 2022-09-08 03:04:06.522681472 -0300 +@@ -82,8 +82,8 @@ + + cross-local: + @echo "🐳 $@" +- @$(GO) build -linkshared $(GOBUILDFLAGS) -o "bin/docker-proxy-$$GOOS-$$GOARCH" ./cmd/proxy +- @$(GO) build -linkshared $(GOBUILDFLAGS) -o "bin/dnet-$$GOOS-$$GOARCH" ./cmd/dnet ++ @$(GO) build $(GOBUILDFLAGS) -o "bin/docker-proxy-$$GOOS-$$GOARCH" ./cmd/proxy ++ @$(GO) build $(GOBUILDFLAGS) -o "bin/dnet-$$GOOS-$$GOARCH" ./cmd/dnet + + # Rebuild protocol buffers. + # These may need to be rebuilt after vendoring updates, so .proto files are declared .PHONY so they are always rebuilt. diff --git a/recipes-containers/docker/docker-ce_git.bbappend b/recipes-containers/docker/docker-ce_git.bbappend index 6383ccbc..3406f26d 100644 --- a/recipes-containers/docker/docker-ce_git.bbappend +++ b/recipes-containers/docker/docker-ce_git.bbappend @@ -3,6 +3,8 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" SRC_URI:append = " \ file://0001-dockerd-daemon-use-default-system-config-when-none-i.patch \ file://0002-cli-config-support-default-system-config.patch \ + file://0003-dynbinary-use-go-cross-compiler.patch \ + file://0004-libnetwork-use-GO-instead-of-go.patch \ " require docker-torizon.inc From f4318321f37f8dd473a18ca26e4d2551433dcd67 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 16 Sep 2022 16:05:54 -0300 Subject: [PATCH 047/163] labs: nezha: fluent-bit: Fix longjmp issue fluent-bit appears to be not ready for risc-v yet Signed-off-by: Matheus Castello --- recipes-extended/fluent-bit/fluent-bit_git.bb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/recipes-extended/fluent-bit/fluent-bit_git.bb b/recipes-extended/fluent-bit/fluent-bit_git.bb index 798302c8..9d4cc810 100644 --- a/recipes-extended/fluent-bit/fluent-bit_git.bb +++ b/recipes-extended/fluent-bit/fluent-bit_git.bb @@ -54,6 +54,10 @@ EXTRA_OECMAKE += "-DFLB_OUT_KAFKA=On -DWITH_CURL=Off " inherit cmake systemd pkgconfig +# for risc-v +TARGET_CC_ARCH:append:nezha-allwinner-d1 = " ${SELECTED_OPTIMIZATION}" +TARGET_CC_ARCH:remove:nezha-allwinner-d1 = "-D_FORTIFY_SOURCE=2" + SYSTEMD_SERVICE:${PN} = "fluent-bit.service" do_install:append() { From 9f732546c1c455a5532b15e810fb292dac25fa66 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 16 Sep 2022 16:08:53 -0300 Subject: [PATCH 048/163] labs: nezha: Update conf for nezha-allwinner-d1 Signed-off-by: Matheus Castello --- conf/machine/include/nezha-allwinner-d1.inc | 42 +++++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/conf/machine/include/nezha-allwinner-d1.inc b/conf/machine/include/nezha-allwinner-d1.inc index ee1b217a..7325aa1b 100644 --- a/conf/machine/include/nezha-allwinner-d1.inc +++ b/conf/machine/include/nezha-allwinner-d1.inc @@ -1,18 +1,52 @@ +WKS_FILE:nezha-allwinner-d1 = "nezha.wks" +WIC_CREATE_EXTRA_ARGS = "" +WKS_FILE:sota:nezha-allwinner-d1 = "nezha-sota.wks" WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" CORE_IMAGE_BASE_INSTALL:append = "resize-helper" -OSTREE_KERNEL_ARGS:sota:append:nezha-allwinner-d1 = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " +OSTREE_KERNEL_ARGS:sota:append:nezha-allwinner-d1 = " earlycon=sbi clk_ignore_unused initcall_debug=0 console=ttyS0,115200 loglevel=8 root=LABEL=otaroot rootfstype=ext4 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash " SOTA_CLIENT_FEATURES:append:nezha-allwinner-d1 = " ubootenv" WKS_FILE_DEPENDS_BOOTLOADERS:nezha-allwinner-d1 = "virtual/bootloader" WKS_FILE_DEPENDS:append:nezha-allwinner-d1 = " u-boot-default-script" PREFERRED_PROVIDER_u-boot-default-script:nezha-allwinner-d1 = "u-boot-ostree-scr" PREFERRED_PROVIDER_u-boot-default-script:sota:nezha-allwinner-d1 = "u-boot-ostree-scr-fit" -LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" +OSTREE_DEPLOY_DEVICETREE:nezha-allwinner-d1 = "0" + +PREFERRED_PROVIDER_virtual/dtb = "" + +KERNEL_BUILTIN_WIREGUARD:nezha-allwinner-d1 = "1" +KERNEL_CLASSES:nezha-allwinner-d1 = " toradex-fitimage " +KERNEL_IMAGETYPE:nezha-allwinner-d1 = "fitImage" +OSTREE_KERNEL:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" +#KERNEL_DEVICETREE:nezha-allwinner-d1:sota ?= " allwinner/sun20i-d1-nezha.dtb" + +LINUX_VERSION_EXTENSION = "-torizon-${LINUX_KERNEL_TYPE}" + +IMAGE_FSTYPES_REMOVE = "hddimg teziimg" + +CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" +IMAGE_BOOT_FILES:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE} sun20i-d1-nezha.dtb boot.scr.uimg" +IMAGE_BOOT_FILES:sota:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE} sun20i-d1-nezha.dtb boot.scr.uimg" + +hostname:pn-base-files = "torizon-nezha" +CORE_IMAGE_BASE_INSTALL:remove = "set-hostname" # Use meta-lmp but maintain compatibility BBMASK += " \ - meta-lmp/meta-lmp-base \ - meta-lmp/meta-lmp-bsp \ + meta-lmp/meta-lmp-base/recipes-connectivity \ + meta-lmp/meta-lmp-base/recipes-containers \ + meta-lmp/meta-lmp-base/recipes-core \ + meta-lmp/meta-lmp-base/recipes-devtools \ + meta-lmp/meta-lmp-base/recipes-extended \ + meta-lmp/meta-lmp-base/recipes-samples \ + meta-lmp/meta-lmp-base/recipes-security \ + meta-lmp/meta-lmp-base/recipes-sota \ + meta-lmp/meta-lmp-bsp/recipes-kernel/linux-firmware \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ + meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " From 880c844bbf49794cd2de162f2aa365afb54bd7bb Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 20 Sep 2022 01:30:11 -0300 Subject: [PATCH 049/163] labs: classes: Override the toradex-fitimage.bbclass Signed-off-by: Matheus Castello --- classes/toradex-fitimage.bbclass | 163 +++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 classes/toradex-fitimage.bbclass diff --git a/classes/toradex-fitimage.bbclass b/classes/toradex-fitimage.bbclass new file mode 100644 index 00000000..310ef9af --- /dev/null +++ b/classes/toradex-fitimage.bbclass @@ -0,0 +1,163 @@ +# Toradex kernel-fitimage.bbclass extension +# +# This bbclass extends OE's kernel-fitimage.bbclass by overridding +# some functions according to Toradex specific requirements. +# +# Copyright 2021 (C) Toradex AG + +inherit kernel-fitimage + +FIT_SUPPORTED_INITRAMFS_FSTYPES:append = " squashfs" + +# +# Override fitimage_assemble in kernel-fitimage.bbclass +# +# To support devicetree overlays, we need handle both +# ${KERNEL_DEVICETREE} and ${EXTERNAL_KERNEL_DEVICETREE} at +# meanwhile. +# +# Assemble fitImage +# +# $1 ... .its filename +# $2 ... fitImage name +# $3 ... include ramdisk +fitimage_assemble() { + kernelcount=1 + dtbcount="" + DTBS="" + ramdiskcount=${3} + setupcount="" + rm -f ${1} arch/${ARCH}/boot/${2} + + fitimage_emit_fit_header ${1} + + # + # Step 1: Prepare a kernel image section. + # + fitimage_emit_section_maint ${1} imagestart + + uboot_prep_kimage + fitimage_emit_section_kernel ${1} "${kernelcount}" linux.bin "${linux_comp}" + if [ "x${UBOOT_KERNEL_TYPE}" = "xkernel_noload" ]; then + sed 's/\(^\s*type.*\kernel\)\"/\1_noload\"/' -i ${1} + fi + + # + # Step 2: Prepare a DTB image section + # + + if [ -n "${KERNEL_DEVICETREE}" ]; then + dtbcount=1 + for DTB in ${KERNEL_DEVICETREE}; do + if echo ${DTB} | grep -q '/dts/'; then + bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used." + DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'` + fi + DTB_PATH="arch/${ARCH}/boot/dts/${DTB}" + if [ ! -e "${DTB_PATH}" ]; then + DTB_PATH="arch/${ARCH}/boot/${DTB}" + fi + + DTB=$(echo "$(basename ${DTB})" | tr '/' '_') + DTBS="${DTBS} ${DTB}" + fitimage_emit_section_dtb ${1} ${DTB} ${DTB_PATH} + done + fi + + if [ -n "${EXTERNAL_KERNEL_DEVICETREE}" ]; then + dtbcount=1 + for DTB in $(find "${EXTERNAL_KERNEL_DEVICETREE}" \( -name '*.dtb' -o -name '*.dtbo' \) -printf '%P\n' | sort); do + DTB=$(echo "${DTB}" | tr '/' '_') + DTBS="${DTBS} ${DTB}" + fitimage_emit_section_dtb ${1} ${DTB} "${EXTERNAL_KERNEL_DEVICETREE}/${DTB}" + done + fi + + # + # Step 3: Prepare a setup section. (For x86) + # + if [ -e arch/${ARCH}/boot/setup.bin ]; then + setupcount=1 + fitimage_emit_section_setup ${1} "${setupcount}" arch/${ARCH}/boot/setup.bin + fi + + # + # Step 4: Prepare a ramdisk section. + # + if [ "x${ramdiskcount}" = "x1" ] ; then + # Find and use the first initramfs image archive type we find + found= + for img in ${FIT_SUPPORTED_INITRAMFS_FSTYPES}; do + initramfs_path="${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.${img}" + echo "Using $initramfs_path" + if [ -e "${initramfs_path}" ]; then + found=true + fitimage_emit_section_ramdisk ${1} "${ramdiskcount}" "${initramfs_path}" + break + fi + done + + if [ -z "$found" ]; then + bbfatal "Could not find a valid initramfs type for ${INITRAMFS_IMAGE_NAME}, the supported types are: ${FIT_SUPPORTED_INITRAMFS_FSTYPES}" + fi + fi + + fitimage_emit_section_maint ${1} sectend + + # Force the first Kernel and DTB in the default config + kernelcount=1 + if [ -n "${dtbcount}" ]; then + dtbcount=1 + fi + + # + # Step 5: Prepare a configurations section + # + fitimage_emit_section_maint ${1} confstart + + if [ -n "${DTBS}" ]; then + i=1 + for DTB in ${DTBS}; do + dtb_ext=${DTB##*.} + if [ "${dtb_ext}" = "dtbo" ]; then + fitimage_emit_section_config ${1} "" "${DTB}" "" "" "`expr ${i} = ${dtbcount}`" + else + fitimage_emit_section_config ${1} "${kernelcount}" "${DTB}" "${ramdiskcount}" "${setupcount}" "`expr ${i} = ${dtbcount}`" + fi + i=`expr ${i} + 1` + done + else + defaultconfigcount=1 + fitimage_emit_section_config $1 $kernelcount "" "$ramdiskcount" "$bootscr_id" "$setupcount" $defaultconfigcount + fi + + fitimage_emit_section_maint ${1} sectend + + fitimage_emit_section_maint ${1} fitend + + # + # Step 6: Assemble the image + # + uboot-mkimage \ + ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \ + -f ${1} \ + arch/${ARCH}/boot/${2} + + # + # Step 7: Sign the image and add public key to U-Boot dtb + # + if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then + add_key_to_u_boot="" + if [ -n "${UBOOT_DTB_BINARY}" ]; then + # The u-boot.dtb is a symlink to UBOOT_DTB_IMAGE, so we need copy + # both of them, and don't dereference the symlink. + cp -P ${STAGING_DATADIR}/u-boot*.dtb ${B} + add_key_to_u_boot="-K ${B}/${UBOOT_DTB_BINARY}" + fi + uboot-mkimage \ + ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \ + -F -k "${UBOOT_SIGN_KEYDIR}" \ + $add_key_to_u_boot \ + -r arch/${ARCH}/boot/${2} + fi +} From 10bf5a3f3dfca7ca2ccf1e57f8f23d67bb7a1465 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 27 Oct 2022 23:21:01 -0300 Subject: [PATCH 050/163] labs: raspberrypi: Does not use the fw_env.config from Toradex We need to remove the libubootenv configuration from meta-toradex-common for the rpi targets, since we are using the correct map for the env from u-boot-fio Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 1 + conf/machine/include/raspberrypi4-64.inc | 1 + 2 files changed, 2 insertions(+) diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 80c47953..65d64c5f 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -55,5 +55,6 @@ BBMASK += " \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ + meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 90d98e61..b49a8da2 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -58,5 +58,6 @@ BBMASK += " \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ + meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " From 3120d2407c2c39136c1c4524309b43816c2b90c8 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 30 Oct 2022 21:46:42 -0300 Subject: [PATCH 051/163] labs: raspberrypi: Fix fw_env.config does not present on rootfs Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 2 +- conf/machine/include/raspberrypi4-64.inc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 65d64c5f..ab95c6c4 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -1,7 +1,7 @@ WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" -CORE_IMAGE_BASE_INSTALL:append = "resize-helper" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper u-boot-fio" # Raspberry Pi KERNEL_BUILTIN_WIREGUARD:rpi = "1" diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index b49a8da2..5b5f8622 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -1,7 +1,7 @@ WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" -CORE_IMAGE_BASE_INSTALL:append = "resize-helper" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper u-boot-fio" # Raspberry Pi KERNEL_BUILTIN_WIREGUARD:rpi = "1" From e3165337438fc226e0125ca361a8a9d5b8ceb666 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 20 Jan 2023 01:21:36 -0300 Subject: [PATCH 052/163] labs: torizon: Bump to 6.1 Signed-off-by: Matheus Castello --- conf/distro/include/torizon.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/distro/include/torizon.inc b/conf/distro/include/torizon.inc index cc42a843..b272e623 100644 --- a/conf/distro/include/torizon.inc +++ b/conf/distro/include/torizon.inc @@ -14,6 +14,7 @@ IMAGE_BASENAME_SUFFIX ?= "" # execute order 66 TDX_MAJOR = "6" +TDX_MINOR = "1" IMX_DEFAULT_BSP = "nxp" IMX_DEFAULT_BSP:upstream = "mainline" From 8eb5e3a4c9530262dcaf40ad0c848cefa6f2b085 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 20 Jan 2023 22:02:26 -0300 Subject: [PATCH 053/163] labs: machine: Add UBOOT_BINARY_OTA_IGNORE=1 The experimental ones does not support bootloader over the air updates Signed-off-by: Matheus Castello --- conf/machine/include/intel-corei7-64.inc | 1 + conf/machine/include/nezha-allwinner-d1.inc | 1 + conf/machine/include/raspberrypi3-64.inc | 1 + conf/machine/include/raspberrypi4-64.inc | 1 + 4 files changed, 4 insertions(+) diff --git a/conf/machine/include/intel-corei7-64.inc b/conf/machine/include/intel-corei7-64.inc index f9ad18aa..5ab23f18 100644 --- a/conf/machine/include/intel-corei7-64.inc +++ b/conf/machine/include/intel-corei7-64.inc @@ -9,6 +9,7 @@ OSTREE_BOOTLOADER:intel-corei7-64 = "grub" OSTREE_DEPLOY_DEVICETREE:intel-corei7-64 = "0" EFI_PROVIDER:intel-corei7-64 = "grub-efi" SOTA_CLIENT_FEATURES:remove = "ubootenv" +UBOOT_BINARY_OTA_IGNORE:intel-corei7-64 = "1" IMAGE_FSTYPES_REMOVE = "hddimg teziimg" IMAGE_FSTYPES:append = " wic.vmdk wic.vdi" diff --git a/conf/machine/include/nezha-allwinner-d1.inc b/conf/machine/include/nezha-allwinner-d1.inc index 7325aa1b..e2fd80f8 100644 --- a/conf/machine/include/nezha-allwinner-d1.inc +++ b/conf/machine/include/nezha-allwinner-d1.inc @@ -21,6 +21,7 @@ KERNEL_CLASSES:nezha-allwinner-d1 = " toradex-fitimage " KERNEL_IMAGETYPE:nezha-allwinner-d1 = "fitImage" OSTREE_KERNEL:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" #KERNEL_DEVICETREE:nezha-allwinner-d1:sota ?= " allwinner/sun20i-d1-nezha.dtb" +UBOOT_BINARY_OTA_IGNORE:nezha-allwinner-d1 = "1" LINUX_VERSION_EXTENSION = "-torizon-${LINUX_KERNEL_TYPE}" diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index ab95c6c4..8828a507 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -38,6 +38,7 @@ OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet UBOOT_ENTRYPOINT:rpi = "0x00008000" UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" +UBOOT_BINARY_OTA_IGNORE:rpi = "1" # Use meta-lmp but maintain compatibility BBMASK += " \ diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 5b5f8622..a6b8cdcd 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -41,6 +41,7 @@ OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet UBOOT_ENTRYPOINT:rpi = "0x00008000" UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" +UBOOT_BINARY_OTA_IGNORE:raspberrypi4-64 = "1" # Use meta-lmp but maintain compatibility BBMASK += " \ From 48d7ef591fcf73cf624045848b6476f8cee9ef6a Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 7 Feb 2023 11:55:40 -0300 Subject: [PATCH 054/163] local.conf: add common.inc to exclude meta-lmp for imx machines Signed-off-by: Matheus Castello --- conf/machine/include/common.inc | 9 +++++++++ conf/template/local.conf | 1 + 2 files changed, 10 insertions(+) create mode 100644 conf/machine/include/common.inc diff --git a/conf/machine/include/common.inc b/conf/machine/include/common.inc new file mode 100644 index 00000000..90117514 --- /dev/null +++ b/conf/machine/include/common.inc @@ -0,0 +1,9 @@ + +def check_machine(d): + """Check if the MACHINE should uses meta-lmp or not""" + if 'imx' in d.getVar('MACHINE'): + return 'meta-lmp' + else: + return '' + +BBMASK += " ${@check_machine(d)} " diff --git a/conf/template/local.conf b/conf/template/local.conf index a3cb8a45..5795078c 100644 --- a/conf/template/local.conf +++ b/conf/template/local.conf @@ -106,3 +106,4 @@ PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}" #TORIZON_PROV_ONLINE_DATA ?= "${ONLINE_PROV_DATA}" include conf/machine/include/${MACHINE}.inc +include conf/machine/include/common.inc From ec3cfc4ff687a228570fde9505b2ef7afcc68467 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 13 Feb 2023 13:37:29 -0300 Subject: [PATCH 055/163] labs: Fix boot.scr copy for Torizon We need to also check when not do it for Raspberry Pi, but this as we have now does not make any sense Signed-off-by: Matheus Castello --- classes/image_type_torizon.bbclass | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/classes/image_type_torizon.bbclass b/classes/image_type_torizon.bbclass index 03b89336..f650cd5b 100644 --- a/classes/image_type_torizon.bbclass +++ b/classes/image_type_torizon.bbclass @@ -28,9 +28,7 @@ EXTRA_IMAGECMD:ota-ext4:qemuarm64 = "-O ^64bit,^metadata_csum -L otaroot -i 4096 IMAGE_CMD:ota:prepend() { if [ "${OSTREE_BOOTLOADER}" = "u-boot" ]; then - if [ "${MACHINE}" = *"raspberrypi"* ]; then - cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr - fi + cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr fi } do_image_ota[depends] += "${@'u-boot-default-script:do_deploy' if d.getVar('OSTREE_BOOTLOADER') == 'u-boot' else ''}" From 60f29afbe1385b13b8064b24ab3e03fc73fe59b4 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 13 Feb 2023 13:40:27 -0300 Subject: [PATCH 056/163] labs: scripts: setup-environment-internal: remove welcome message This is useless and mess up with the vs code bitbake language server Signed-off-by: Matheus Castello --- scripts/setup-environment-internal | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index fd7e1298..2434e733 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -357,29 +357,29 @@ EOF fi fi -cat <' +# You can now run 'bitbake ' -Some of common targets are: +# Some of common targets are: torizon-core-docker torizon-minimal torizon-core-podman -EOF +# EOF if [ "${MACHINE}" = "qemuarm64" ]; then cat < Date: Mon, 13 Feb 2023 13:41:49 -0300 Subject: [PATCH 057/163] labs: recipes-kernel: linux: Use custom kernel for labs Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-toradex%.bbappend | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/recipes-kernel/linux/linux-toradex%.bbappend b/recipes-kernel/linux/linux-toradex%.bbappend index 5ee21a22..b8c950e8 100644 --- a/recipes-kernel/linux/linux-toradex%.bbappend +++ b/recipes-kernel/linux/linux-toradex%.bbappend @@ -1,2 +1,12 @@ + +SRC_URI = " \ + git://github.com/microhobby/linux-toradex.git;protocol=https;branch=toradex_5.15-2.1.x-imx;name=machine \ +" + +# Make sure to override LOCALVERSION in linux-imx.inc +LOCALVERSION = "-${TDX_VERSION}-labs" + + require linux-torizon.inc require linux-toradex-kmeta.inc +require common.inc From 26160c27deab68de9579396fbcf3f4a64983b1d4 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 13 Feb 2023 13:44:36 -0300 Subject: [PATCH 058/163] labs: recipes-kernel: linux: add common.inc for custom kernel fragments This will also add the debug ones in case we are using the TDX_DEBUG=1 variable. Signed-off-by: Matheus Castello --- recipes-kernel/linux/common.inc | 19 +++++++++++++++++++ recipes-kernel/linux/files/debug.cfg | 20 ++++++++++++++++++++ recipes-kernel/linux/files/verdin-imx8mm.cfg | 15 +++++++++++++++ recipes-kernel/linux/linux-intel%.bbappend | 2 ++ recipes-kernel/linux/linux-lmp%.bbappend | 2 ++ 5 files changed, 58 insertions(+) create mode 100644 recipes-kernel/linux/common.inc create mode 100644 recipes-kernel/linux/files/debug.cfg create mode 100644 recipes-kernel/linux/files/verdin-imx8mm.cfg diff --git a/recipes-kernel/linux/common.inc b/recipes-kernel/linux/common.inc new file mode 100644 index 00000000..0c4b38a5 --- /dev/null +++ b/recipes-kernel/linux/common.inc @@ -0,0 +1,19 @@ + +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +SRC_URI:append = " \ + file://debug.cfg \ + file://${MACHINE}.cfg \ +" + +do_configure:append() { + # machine fragment + if [ -f ${WORKDIR}/${MACHINE}.cfg ]; then + cat ${WORKDIR}/${MACHINE}.cfg >> ${B}/.config + fi + + # debug fragment + if [ "${TDX_DEBUG}" = "1" ]; then + cat ${WORKDIR}/debug.cfg >> ${B}/.config + fi +} diff --git a/recipes-kernel/linux/files/debug.cfg b/recipes-kernel/linux/files/debug.cfg new file mode 100644 index 00000000..19e08b93 --- /dev/null +++ b/recipes-kernel/linux/files/debug.cfg @@ -0,0 +1,20 @@ +# kgdb +# CONFIG_STRICT_KERNEL_RWX is not set +# CONFIG_DEBUG_INFO_NONE is not set +# CONFIG_DEBUG_INFO_REDUCED is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_EXPERT=y +CONFIG_DEBUG_INFO=y +CONFIG_FRAME_POINTER=y +CONFIG_STACK_TRACER=y +CONFIG_KGDB=y +CONFIG_KGDB_SERIAL_CONSOLE=y +CONFIG_GDB_SCRIPTS=y +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y +# CONFIG_RANDOMIZE_BASE is not set + +# kdump +CONFIG_KEXEC_FILE=y +CONFIG_KEXEC=y +CONFIG_CRASH_DUMP=y +CONFIG_PROC_VMCORE=y diff --git a/recipes-kernel/linux/files/verdin-imx8mm.cfg b/recipes-kernel/linux/files/verdin-imx8mm.cfg new file mode 100644 index 00000000..331e8544 --- /dev/null +++ b/recipes-kernel/linux/files/verdin-imx8mm.cfg @@ -0,0 +1,15 @@ +# splash screen +CONFIG_DRM=y +CONFIG_DRM_DISPLAY_CONNECTOR=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_MIPI_DSI=y +CONFIG_REGMAP_I2C=y +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_DRM_LONTIUM_LT8912B=y +CONFIG_DRM_SEC_MIPI_DSIM=y +CONFIG_DRM_IMX_SEC_DSIM=y +CONFIG_DRM_TI_SN65DSI83=y +CONFIG_DRM_TI_SN65DSI86=y +# end of the kernel hack diff --git a/recipes-kernel/linux/linux-intel%.bbappend b/recipes-kernel/linux/linux-intel%.bbappend index e8a0b2c6..605159e6 100644 --- a/recipes-kernel/linux/linux-intel%.bbappend +++ b/recipes-kernel/linux/linux-intel%.bbappend @@ -4,3 +4,5 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/linux-intel:" SRC_URI:append = " \ file://fragment.cfg \ " + +require common.inc diff --git a/recipes-kernel/linux/linux-lmp%.bbappend b/recipes-kernel/linux/linux-lmp%.bbappend index f0c51410..52d231d6 100644 --- a/recipes-kernel/linux/linux-lmp%.bbappend +++ b/recipes-kernel/linux/linux-lmp%.bbappend @@ -4,3 +4,5 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/linux-lmp-dev:" SRC_URI:append = " \ file://fragment.cfg \ " + +require common.inc From 856e8767e427de83e9a86adb15e4c36c1e094000 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 16 Feb 2023 22:31:24 -0300 Subject: [PATCH 059/163] labs: verdin-imx8mm: remove SN65DSI86 DRM driver This is not needed Signed-off-by: Matheus Castello --- recipes-kernel/linux/files/verdin-imx8mm.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes-kernel/linux/files/verdin-imx8mm.cfg b/recipes-kernel/linux/files/verdin-imx8mm.cfg index 331e8544..c9f9b1c6 100644 --- a/recipes-kernel/linux/files/verdin-imx8mm.cfg +++ b/recipes-kernel/linux/files/verdin-imx8mm.cfg @@ -11,5 +11,4 @@ CONFIG_DRM_LONTIUM_LT8912B=y CONFIG_DRM_SEC_MIPI_DSIM=y CONFIG_DRM_IMX_SEC_DSIM=y CONFIG_DRM_TI_SN65DSI83=y -CONFIG_DRM_TI_SN65DSI86=y # end of the kernel hack From 28e5f4d643ba7a0f77e56efad3d2ca81e1b0ac14 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 16 Feb 2023 23:03:41 -0300 Subject: [PATCH 060/163] labs: image_type_torizon: do not copy boot.scr for rpi Signed-off-by: Matheus Castello --- classes/image_type_torizon.bbclass | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/classes/image_type_torizon.bbclass b/classes/image_type_torizon.bbclass index f650cd5b..7c169541 100644 --- a/classes/image_type_torizon.bbclass +++ b/classes/image_type_torizon.bbclass @@ -28,7 +28,9 @@ EXTRA_IMAGECMD:ota-ext4:qemuarm64 = "-O ^64bit,^metadata_csum -L otaroot -i 4096 IMAGE_CMD:ota:prepend() { if [ "${OSTREE_BOOTLOADER}" = "u-boot" ]; then - cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr + if [[ "${MACHINE}" != *"raspberrypi"* ]]; then + cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr + fi fi } do_image_ota[depends] += "${@'u-boot-default-script:do_deploy' if d.getVar('OSTREE_BOOTLOADER') == 'u-boot' else ''}" From e7aa1fb2f9879a62d28b92e2c0c06c9e55ebe3e9 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 17 Mar 2023 11:31:41 -0300 Subject: [PATCH 061/163] labs: distro: torizon: remove TDX_MAJOR and TDX_MINOR Now this was being handled by the toradex meta layer Signed-off-by: Matheus Castello --- conf/distro/include/torizon.inc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/distro/include/torizon.inc b/conf/distro/include/torizon.inc index b272e623..839e1f36 100644 --- a/conf/distro/include/torizon.inc +++ b/conf/distro/include/torizon.inc @@ -12,10 +12,6 @@ IMAGE_CLASSES:remove = "image_type_tezi image_types_fsl" IMAGE_BASENAME_SUFFIX ?= "" -# execute order 66 -TDX_MAJOR = "6" -TDX_MINOR = "1" - IMX_DEFAULT_BSP = "nxp" IMX_DEFAULT_BSP:upstream = "mainline" From 7b3824742837cb5427c877a2c7c1784411e49375 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 17 Mar 2023 11:47:04 -0300 Subject: [PATCH 062/163] labs: local.conf: add TDX_DEBUG to enable TorizonCore debug features Signed-off-by: Matheus Castello --- conf/template/local.conf | 3 +++ .../plymouth/files/torizonlogo-labs.png | Bin 0 -> 27349 bytes recipes-core/plymouth/plymouth_%.bbappend | 9 ++++++++- .../images/torizon-core-docker-dev.bb | 12 +++++++++++- 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 recipes-core/plymouth/files/torizonlogo-labs.png diff --git a/conf/template/local.conf b/conf/template/local.conf index 5795078c..807a7d06 100644 --- a/conf/template/local.conf +++ b/conf/template/local.conf @@ -105,5 +105,8 @@ PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}" #TORIZON_PROV_SHARED_DATA ?= "${WORKDIR}/prov/shared-data.tar.gz" #TORIZON_PROV_ONLINE_DATA ?= "${ONLINE_PROV_DATA}" +# to enable TorizonCore custom debug features set it to 1 +#TDX_DEBUG ?= "0" + include conf/machine/include/${MACHINE}.inc include conf/machine/include/common.inc diff --git a/recipes-core/plymouth/files/torizonlogo-labs.png b/recipes-core/plymouth/files/torizonlogo-labs.png new file mode 100644 index 0000000000000000000000000000000000000000..84d07beb07bca7097ce0e79d17eac6f9852f58f9 GIT binary patch literal 27349 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

GtVW%CSd6`J;H5LL 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 tOOcPDt$?qCFM0vE_N>*^0|5F{{dbxEXx1@ literal 0 HcmV?d00001 diff --git a/recipes-core/plymouth/plymouth_%.bbappend b/recipes-core/plymouth/plymouth_%.bbappend index 5ecaa47f..99c296fd 100644 --- a/recipes-core/plymouth/plymouth_%.bbappend +++ b/recipes-core/plymouth/plymouth_%.bbappend @@ -4,6 +4,7 @@ SRC_URI += " \ file://0001-disable-boot-splash-later.patch \ file://0001-themes-only-install-spinner.patch \ file://torizonlogo-white.png \ + file://torizonlogo-labs.png \ file://spinner.plymouth \ " @@ -12,6 +13,12 @@ PACKAGECONFIG = "drm" EXTRA_OECONF += "--with-udev --with-runtimedir=/run" do_install:append () { - install -m 0644 ${WORKDIR}/torizonlogo-white.png ${D}${datadir}/plymouth/themes/spinner/watermark.png + # use the labs logo if we are building the engineering image + if [ "${TDX_DEBUG}" = "1" ]; then + install -m 0644 ${WORKDIR}/torizonlogo-labs.png ${D}${datadir}/plymouth/themes/spinner/watermark.png + else + install -m 0644 ${WORKDIR}/torizonlogo-white.png ${D}${datadir}/plymouth/themes/spinner/watermark.png + fi + install -m 0644 ${WORKDIR}/spinner.plymouth ${D}${datadir}/plymouth/themes/spinner/spinner.plymouth } diff --git a/recipes-images/images/torizon-core-docker-dev.bb b/recipes-images/images/torizon-core-docker-dev.bb index 672e3705..16b01e9d 100644 --- a/recipes-images/images/torizon-core-docker-dev.bb +++ b/recipes-images/images/torizon-core-docker-dev.bb @@ -1,3 +1,13 @@ require torizon-core-docker.bb require torizon-core-dev.inc -DESCRIPTION = "TorizonCore Linux with no containers pre-provisioned (with debugging tools)." + +DESCRIPTION = "TorizonCore Linux engineering image" + +python() { + tdx_debug = d.getVar("TDX_DEBUG", "0") + + if tdx_debug == "1": + bb.warn(f"You are building a engineering image with TDX_DEBUG={tdx_debug}") + else: + bb.fatal(f"You are trying to build a engineering image with TDX_DEBUG={tdx_debug}") +} From 6cb9f81b69d742b9618397a6c34a0218690d5b1e Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 17 Mar 2023 11:49:52 -0300 Subject: [PATCH 063/163] labs: u-boot: Add kgdb arguments to kernel cmdline The user can now toggle debug variable and these will be added to the kernel cmdline through tdxargs variable. Signed-off-by: Matheus Castello --- recipes-bsp/u-boot/u-boot-distro-boot/boot.cmd.in | 6 ++++++ recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/boot.cmd.in index 710a9e25..7658e7e7 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/boot.cmd.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/boot.cmd.in @@ -29,4 +29,10 @@ else ext4load ${devtype} ${devnum}:1 ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize} fi +if test "${debug}" = "1" +then + echo "Enabling kernel debug" + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttymxc0,115200" +fi + run bootcmd_run diff --git a/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd b/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd index 1a8b96c1..6f1d0295 100644 --- a/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd +++ b/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd @@ -13,6 +13,15 @@ setenv bootostree 'run bootcmd_load_f; run bootcmd_run' setenv altbootcmd 'run bootcmd_otenv; run bootcmd_set_rollback; if test -n "${kernel_image2}"; then run bootcmd_rollbackenv; fi; run bootostree; reset' setenv bootcmd_tdx 'setenv bootargs "${bootargs} ${tdxargs}"' +if test "${debug}" = "1" +then + echo "Enabling kernel debug" + # TODO: this is the command that should be the working one + #env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttySO,115200" + # but for some unknown reason the kdgboc option is not working when setting it via cmdline + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1" +fi + if test ! -e ${devtype} ${devnum}:1 uboot.env; then saveenv; fi if test "${rollback}" = "1"; then run altbootcmd; else run bootcmd_otenv; run bootcmd_tdx; run bootostree; if test ! "${upgrade_available}" = "1"; then setenv upgrade_available 1; saveenv; fi; reset; fi From 6f24bc2337c77bf13c481f426321133d15f209d9 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 17 Mar 2023 11:53:52 -0300 Subject: [PATCH 064/163] labs: linux: Fix some kernel configs for kgdb Signed-off-by: Matheus Castello --- recipes-kernel/linux/files/debug.cfg | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/recipes-kernel/linux/files/debug.cfg b/recipes-kernel/linux/files/debug.cfg index 19e08b93..6cf2baba 100644 --- a/recipes-kernel/linux/files/debug.cfg +++ b/recipes-kernel/linux/files/debug.cfg @@ -9,9 +9,17 @@ CONFIG_FRAME_POINTER=y CONFIG_STACK_TRACER=y CONFIG_KGDB=y CONFIG_KGDB_SERIAL_CONSOLE=y +# CONFIG_KGDB_KDB is not set +# CONFIG_KDB_KEYBOARD is not set CONFIG_GDB_SCRIPTS=y CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_RANDOMIZE_BASE is not set +# for toradex the watchdog and the imx2+ wdt need to be disable +# to be possible to use kgdb +# CONFIG_WATCHDOG is not set +# CONFIG_IMX2_WDT is not set +# for toradex we need to enable all sysrq keys +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 # kdump CONFIG_KEXEC_FILE=y From 055002c850d7562db1e1307d9e139ff0b608e22b Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 17 Mar 2023 12:09:21 -0300 Subject: [PATCH 065/163] labs: raspberrypi4-64: Detach the debug configs from prod Signed-off-by: Matheus Castello --- recipes-bsp/u-boot/u-boot-ota/debug.cfg | 3 +++ .../linux/files/raspberrypi4-64.cfg | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 recipes-bsp/u-boot/u-boot-ota/debug.cfg create mode 100644 recipes-kernel/linux/files/raspberrypi4-64.cfg diff --git a/recipes-bsp/u-boot/u-boot-ota/debug.cfg b/recipes-bsp/u-boot/u-boot-ota/debug.cfg new file mode 100644 index 00000000..2153634a --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-ota/debug.cfg @@ -0,0 +1,3 @@ +# CONFIG_SPL_WATCHDOG is not set +# CONFIG_IMX_WATCHDOG is not set +# CONFIG_SYSRESET_WATCHDOG is not set diff --git a/recipes-kernel/linux/files/raspberrypi4-64.cfg b/recipes-kernel/linux/files/raspberrypi4-64.cfg new file mode 100644 index 00000000..9ced1328 --- /dev/null +++ b/recipes-kernel/linux/files/raspberrypi4-64.cfg @@ -0,0 +1,19 @@ +CONFIG_I2C_ALGOBIT=y +CONFIG_CEC_CORE=y +CONFIG_DRM=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_V3D=y +CONFIG_DRM_VC4=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y From dc069657e3d1dd73f024f679bdf0b2d0101eefce Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 17 Mar 2023 12:34:22 -0300 Subject: [PATCH 066/163] labs: procps: enable break to debug by kernel.sysrq when in debug mode let's make sure that the kernel.sysrq is enabled with all the options that we need to debug the system. Signed-off-by: Matheus Castello --- recipes-extended/procps/procps_%.bbappend | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 recipes-extended/procps/procps_%.bbappend diff --git a/recipes-extended/procps/procps_%.bbappend b/recipes-extended/procps/procps_%.bbappend new file mode 100644 index 00000000..2fcae046 --- /dev/null +++ b/recipes-extended/procps/procps_%.bbappend @@ -0,0 +1,13 @@ +# in the engineering build, we need to enable break to debug by kernel.sysrq +do_install:append() { + if [ "${TDX_DEBUG}" = "1" ]; then + for keyword in \ + kernel.sysrq \ + ; do + # enabled + sed -i 's,'"$keyword"'=.*,'"$keyword"'=1,' ${D}${sysconfdir}/sysctl.conf + # uncomment + sed -i '/kernel.sysrq/s/^#//' ${D}${sysconfdir}/sysctl.conf + done + fi +} From 3fdffd09ac10f7c1cb4d8b74ca8591b388f77c6d Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 17 Mar 2023 12:45:28 -0300 Subject: [PATCH 067/163] labs: verdin-imx8mm: add machine include Signed-off-by: Matheus Castello --- conf/machine/include/verdin-imx8mm.inc | 1 + 1 file changed, 1 insertion(+) create mode 100644 conf/machine/include/verdin-imx8mm.inc diff --git a/conf/machine/include/verdin-imx8mm.inc b/conf/machine/include/verdin-imx8mm.inc new file mode 100644 index 00000000..4088b587 --- /dev/null +++ b/conf/machine/include/verdin-imx8mm.inc @@ -0,0 +1 @@ +# to add custom configs From 6e5a8e01bb5805dca6fa55772fd666966e0daebd Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 22 Mar 2023 15:44:15 -0300 Subject: [PATCH 068/163] labs: torizon: Remove the need of the linux-lmp Signed-off-by: Matheus Castello --- classes/image_type_torizon.bbclass | 4 +- classes/toradex-fitimage.bbclass | 163 ----------------------- conf/template/bblayers.conf | 2 - recipes-kernel/linux/linux-lmp%.bbappend | 8 -- 4 files changed, 1 insertion(+), 176 deletions(-) delete mode 100644 classes/toradex-fitimage.bbclass delete mode 100644 recipes-kernel/linux/linux-lmp%.bbappend diff --git a/classes/image_type_torizon.bbclass b/classes/image_type_torizon.bbclass index 7c169541..f650cd5b 100644 --- a/classes/image_type_torizon.bbclass +++ b/classes/image_type_torizon.bbclass @@ -28,9 +28,7 @@ EXTRA_IMAGECMD:ota-ext4:qemuarm64 = "-O ^64bit,^metadata_csum -L otaroot -i 4096 IMAGE_CMD:ota:prepend() { if [ "${OSTREE_BOOTLOADER}" = "u-boot" ]; then - if [[ "${MACHINE}" != *"raspberrypi"* ]]; then - cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr - fi + cp -a ${DEPLOY_DIR_IMAGE}/boot.scr-${MACHINE} ${OTA_SYSROOT}/boot.scr fi } do_image_ota[depends] += "${@'u-boot-default-script:do_deploy' if d.getVar('OSTREE_BOOTLOADER') == 'u-boot' else ''}" diff --git a/classes/toradex-fitimage.bbclass b/classes/toradex-fitimage.bbclass deleted file mode 100644 index 310ef9af..00000000 --- a/classes/toradex-fitimage.bbclass +++ /dev/null @@ -1,163 +0,0 @@ -# Toradex kernel-fitimage.bbclass extension -# -# This bbclass extends OE's kernel-fitimage.bbclass by overridding -# some functions according to Toradex specific requirements. -# -# Copyright 2021 (C) Toradex AG - -inherit kernel-fitimage - -FIT_SUPPORTED_INITRAMFS_FSTYPES:append = " squashfs" - -# -# Override fitimage_assemble in kernel-fitimage.bbclass -# -# To support devicetree overlays, we need handle both -# ${KERNEL_DEVICETREE} and ${EXTERNAL_KERNEL_DEVICETREE} at -# meanwhile. -# -# Assemble fitImage -# -# $1 ... .its filename -# $2 ... fitImage name -# $3 ... include ramdisk -fitimage_assemble() { - kernelcount=1 - dtbcount="" - DTBS="" - ramdiskcount=${3} - setupcount="" - rm -f ${1} arch/${ARCH}/boot/${2} - - fitimage_emit_fit_header ${1} - - # - # Step 1: Prepare a kernel image section. - # - fitimage_emit_section_maint ${1} imagestart - - uboot_prep_kimage - fitimage_emit_section_kernel ${1} "${kernelcount}" linux.bin "${linux_comp}" - if [ "x${UBOOT_KERNEL_TYPE}" = "xkernel_noload" ]; then - sed 's/\(^\s*type.*\kernel\)\"/\1_noload\"/' -i ${1} - fi - - # - # Step 2: Prepare a DTB image section - # - - if [ -n "${KERNEL_DEVICETREE}" ]; then - dtbcount=1 - for DTB in ${KERNEL_DEVICETREE}; do - if echo ${DTB} | grep -q '/dts/'; then - bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used." - DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'` - fi - DTB_PATH="arch/${ARCH}/boot/dts/${DTB}" - if [ ! -e "${DTB_PATH}" ]; then - DTB_PATH="arch/${ARCH}/boot/${DTB}" - fi - - DTB=$(echo "$(basename ${DTB})" | tr '/' '_') - DTBS="${DTBS} ${DTB}" - fitimage_emit_section_dtb ${1} ${DTB} ${DTB_PATH} - done - fi - - if [ -n "${EXTERNAL_KERNEL_DEVICETREE}" ]; then - dtbcount=1 - for DTB in $(find "${EXTERNAL_KERNEL_DEVICETREE}" \( -name '*.dtb' -o -name '*.dtbo' \) -printf '%P\n' | sort); do - DTB=$(echo "${DTB}" | tr '/' '_') - DTBS="${DTBS} ${DTB}" - fitimage_emit_section_dtb ${1} ${DTB} "${EXTERNAL_KERNEL_DEVICETREE}/${DTB}" - done - fi - - # - # Step 3: Prepare a setup section. (For x86) - # - if [ -e arch/${ARCH}/boot/setup.bin ]; then - setupcount=1 - fitimage_emit_section_setup ${1} "${setupcount}" arch/${ARCH}/boot/setup.bin - fi - - # - # Step 4: Prepare a ramdisk section. - # - if [ "x${ramdiskcount}" = "x1" ] ; then - # Find and use the first initramfs image archive type we find - found= - for img in ${FIT_SUPPORTED_INITRAMFS_FSTYPES}; do - initramfs_path="${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.${img}" - echo "Using $initramfs_path" - if [ -e "${initramfs_path}" ]; then - found=true - fitimage_emit_section_ramdisk ${1} "${ramdiskcount}" "${initramfs_path}" - break - fi - done - - if [ -z "$found" ]; then - bbfatal "Could not find a valid initramfs type for ${INITRAMFS_IMAGE_NAME}, the supported types are: ${FIT_SUPPORTED_INITRAMFS_FSTYPES}" - fi - fi - - fitimage_emit_section_maint ${1} sectend - - # Force the first Kernel and DTB in the default config - kernelcount=1 - if [ -n "${dtbcount}" ]; then - dtbcount=1 - fi - - # - # Step 5: Prepare a configurations section - # - fitimage_emit_section_maint ${1} confstart - - if [ -n "${DTBS}" ]; then - i=1 - for DTB in ${DTBS}; do - dtb_ext=${DTB##*.} - if [ "${dtb_ext}" = "dtbo" ]; then - fitimage_emit_section_config ${1} "" "${DTB}" "" "" "`expr ${i} = ${dtbcount}`" - else - fitimage_emit_section_config ${1} "${kernelcount}" "${DTB}" "${ramdiskcount}" "${setupcount}" "`expr ${i} = ${dtbcount}`" - fi - i=`expr ${i} + 1` - done - else - defaultconfigcount=1 - fitimage_emit_section_config $1 $kernelcount "" "$ramdiskcount" "$bootscr_id" "$setupcount" $defaultconfigcount - fi - - fitimage_emit_section_maint ${1} sectend - - fitimage_emit_section_maint ${1} fitend - - # - # Step 6: Assemble the image - # - uboot-mkimage \ - ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \ - -f ${1} \ - arch/${ARCH}/boot/${2} - - # - # Step 7: Sign the image and add public key to U-Boot dtb - # - if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then - add_key_to_u_boot="" - if [ -n "${UBOOT_DTB_BINARY}" ]; then - # The u-boot.dtb is a symlink to UBOOT_DTB_IMAGE, so we need copy - # both of them, and don't dereference the symlink. - cp -P ${STAGING_DATADIR}/u-boot*.dtb ${B} - add_key_to_u_boot="-K ${B}/${UBOOT_DTB_BINARY}" - fi - uboot-mkimage \ - ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \ - -F -k "${UBOOT_SIGN_KEYDIR}" \ - $add_key_to_u_boot \ - -r arch/${ARCH}/boot/${2} - fi -} diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index f4f93b98..432c6b97 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -21,7 +21,6 @@ BASELAYERS ?= " \ # These layers hold machine specific content, aka Board Support Packages BSPLAYERS ?= " \ ${OEROOT}/layers/meta-raspberrypi \ - ${OEROOT}/layers/meta-lmp/meta-lmp-bsp \ ${OEROOT}/layers/meta-toradex-nxp \ ${OEROOT}/layers/meta-freescale \ ${OEROOT}/layers/meta-freescale-3rdparty \ @@ -49,6 +48,5 @@ BBLAYERS = " \ ${BASELAYERS} \ ${BSPLAYERS} \ ${EXTRALAYERS} \ - ${OEROOT}/layers/meta-lmp/meta-lmp-base \ ${OEROOT}/layers/openembedded-core/meta \ " diff --git a/recipes-kernel/linux/linux-lmp%.bbappend b/recipes-kernel/linux/linux-lmp%.bbappend deleted file mode 100644 index 52d231d6..00000000 --- a/recipes-kernel/linux/linux-lmp%.bbappend +++ /dev/null @@ -1,8 +0,0 @@ - -FILESEXTRAPATHS:prepend := "${THISDIR}/linux-lmp-dev:" - -SRC_URI:append = " \ - file://fragment.cfg \ -" - -require common.inc From 9b87d05ad821974fe241c5a0264b8e56a5333762 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 22 Mar 2023 15:46:44 -0300 Subject: [PATCH 069/163] labs: raspberrypi4-64: Rework to not depend on linux-lmp Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 55 ++++++++----------- .../raspberrypi4-64/boot.cmd.in | 50 +++++++++++++++++ .../raspberrypi4-64/uEnv.txt.in | 6 ++ .../u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd | 29 ---------- .../linux/linux-lmp-dev/fragment.cfg | 19 ------- .../linux/linux-raspberrypi%.bbappend | 2 + 6 files changed, 81 insertions(+), 80 deletions(-) create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in delete mode 100644 recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd delete mode 100644 recipes-kernel/linux/linux-lmp-dev/fragment.cfg create mode 100644 recipes-kernel/linux/linux-raspberrypi%.bbappend diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index a6b8cdcd..2b9b8178 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -1,63 +1,54 @@ WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" -CORE_IMAGE_BASE_INSTALL:append = "resize-helper u-boot-fio" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" # Raspberry Pi KERNEL_BUILTIN_WIREGUARD:rpi = "1" -PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" -PREFERRED_PROVIDER_u-boot:rpi = "u-boot-fio" +CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot" +PREFERRED_PROVIDER_u-boot:rpi = "u-boot" +PREFERRED_PROVIDER_virtual/dtb = "" SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" SOTA_DT_OVERLAYS:raspberrypi4-64 ?= "vc4-fkms-v3d-pi4.dtbo rpi-ft5406.dtbo" WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" -PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-ostree-scr" -PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-ostree-scr-fit" +PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-distro-boot" -PREFERRED_PROVIDER_virtual/dtb:rpi ?= "lmp-device-tree" IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" + # We need ota-ext4 and wic for rpi IMAGE_FSTYPES_REMOVE = "" IMAGE_BOOT_FILES:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " -IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " -KERNEL_CLASSES:rpi = " toradex-fitimage " -OSTREE_KERNEL:rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" -KERNEL_IMAGETYPE:rpi = "fitImage" +IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} " +IMAGE_BOOT_FILES_REMOVE:sota:remove = "boot.scr-${MACHINE};boot.scr" +IMAGE_BOOT_FILES:append = " boot.scr-${MACHINE};boot.scr " + +OSTREE_KERNEL:rpi = "Image" +OSTREE_DEPLOY_DEVICETREE:rpi = "0" +KERNEL_IMAGETYPE:rpi = "Image" +KERNEL_IMAGETYPE:sota:rpi = "Image" VC4DTBO ?= "vc4-fkms-v3d-pi4" KERNEL_DEVICETREE:raspberrypi4-64:sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d-pi4.dtbo overlays/rpi-ft5406.dtbo" -PREFERRED_PROVIDER_virtual/kernel:rpi ?= "linux-lmp-rpi" +KERNEL_BOOTCMD = "booti" + LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" ## Mimic meta-raspberrypi behavior ENABLE_UART:rpi = "1" -KERNEL_SERIAL:rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" -OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" +SERIAL_CONSOLES = "115200;ttyAMA0" +KERNEL_SERIAL:rpi = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyAMA0,115200", "", d)}" +OSTREE_KERNEL_ARGS_COMMON_RPI = "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" # This boot arguments are the same from torizon.bbclass OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " -## U-Boot entrypoints for rpi -UBOOT_ENTRYPOINT:rpi = "0x00008000" -UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" -UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" UBOOT_BINARY_OTA_IGNORE:raspberrypi4-64 = "1" -# Use meta-lmp but maintain compatibility BBMASK += " \ - meta-lmp/meta-lmp-base/recipes-connectivity \ - meta-lmp/meta-lmp-base/recipes-containers \ - meta-lmp/meta-lmp-base/recipes-core \ - meta-lmp/meta-lmp-base/recipes-devtools \ - meta-lmp/meta-lmp-base/recipes-extended \ - meta-lmp/meta-lmp-base/recipes-samples \ - meta-lmp/meta-lmp-base/recipes-security \ - meta-lmp/meta-lmp-base/recipes-sota \ - meta-lmp/meta-lmp-base/recipes-support \ - meta-lmp/meta-lmp-bsp/recipes-kernel/linux-firmware \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in new file mode 100644 index 00000000..f6dc595a --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: GPL-2.0+ OR MIT +# +# Copyright 2023 MicroHobby +# +# TorizonCore boot script. + +setenv bootlimit 3 +setenv devtype mmc +setenv devnum 0 +setenv otaroot 2 + +if test -z "${altbootcmd}" +then + env set altbootcmd 'env set rollback 1; run bootcmd' + env save +fi + +if test "${rollback}" = "1" && test "${upgrade_available}" = "1" +then + # Make sure to reset upgrade_available to avoid unnecessary wear + # Note this also makes rollback permanent. aktualizr will reset rollback + # when a new (hopefully better) update comes in. + env set upgrade_available 0 + env save +fi + +# save default U-Boot devicetree file to use in a rollback situation +env set fdtfile2 "${fdtfile}" + +if test -n "${loadaddr}" +then + ext4load ${devtype} ${devnum}:${otaroot} ${loadaddr} /boot/loader/uEnv.txt; env import -t ${loadaddr} ${filesize} +else + ext4load ${devtype} ${devnum}:${otaroot} ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize} +fi + +if test "${debug}" = "1" +then + echo "Enabling kernel debug" + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttymxc0,115200" +fi + +# now that we have all the environment variables, we can set the bootcmd +setenv bootargs "${defargs} ${bootargs} ${tdxargs}" + +ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} +ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image} +env set ramdisk_size ${filesize} + +@@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr} diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in new file mode 100644 index 00000000..ccbe6963 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in @@ -0,0 +1,6 @@ +kernel_image_type=@@KERNEL_IMAGETYPE@@ +overlays_file="overlays.txt" +bootlimit=3 +devtype=mmc +devnum=0 +otaroot=2 diff --git a/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd b/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd deleted file mode 100644 index 6f1d0295..00000000 --- a/recipes-bsp/u-boot/u-boot-ostree-scr-fit/rpi/boot.cmd +++ /dev/null @@ -1,29 +0,0 @@ -# Default boot type and device -setenv bootlimit 3 -setenv devtype mmc -setenv devnum 0 - -setenv bootcmd_resetvars 'setenv kernel_image; setenv bootargs; setenv kernel_image2; setenv bootargs2' -setenv bootcmd_otenv 'run bootcmd_resetvars; ext4load ${devtype} ${devnum}:2 ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize}' -setenv bootcmd_load_f 'ext4load ${devtype} ${devnum}:2 ${ramdisk_addr_r} "/boot"${kernel_image}' -setenv bootcmd_run 'bootm ${ramdisk_addr_r}:kernel@@FIT_NODE_SEPARATOR@@1 ${ramdisk_addr_r}:ramdisk@@FIT_NODE_SEPARATOR@@1 ${fdt_addr}' -setenv bootcmd_rollbackenv 'setenv kernel_image ${kernel_image2}; setenv bootargs ${bootargs2}' -setenv bootcmd_set_rollback 'if test ! "${rollback}" = "1"; then setenv rollback 1; setenv upgrade_available 0; saveenv; fi' -setenv bootostree 'run bootcmd_load_f; run bootcmd_run' -setenv altbootcmd 'run bootcmd_otenv; run bootcmd_set_rollback; if test -n "${kernel_image2}"; then run bootcmd_rollbackenv; fi; run bootostree; reset' -setenv bootcmd_tdx 'setenv bootargs "${bootargs} ${tdxargs}"' - -if test "${debug}" = "1" -then - echo "Enabling kernel debug" - # TODO: this is the command that should be the working one - #env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttySO,115200" - # but for some unknown reason the kdgboc option is not working when setting it via cmdline - env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1" -fi - -if test ! -e ${devtype} ${devnum}:1 uboot.env; then saveenv; fi - -if test "${rollback}" = "1"; then run altbootcmd; else run bootcmd_otenv; run bootcmd_tdx; run bootostree; if test ! "${upgrade_available}" = "1"; then setenv upgrade_available 1; saveenv; fi; reset; fi - -reset diff --git a/recipes-kernel/linux/linux-lmp-dev/fragment.cfg b/recipes-kernel/linux/linux-lmp-dev/fragment.cfg deleted file mode 100644 index 9ced1328..00000000 --- a/recipes-kernel/linux/linux-lmp-dev/fragment.cfg +++ /dev/null @@ -1,19 +0,0 @@ -CONFIG_I2C_ALGOBIT=y -CONFIG_CEC_CORE=y -CONFIG_DRM=y -# CONFIG_DRM_DEBUG_MM is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_SCHED=y -CONFIG_DRM_V3D=y -CONFIG_DRM_VC4=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_DRM_PANEL_SIMPLE=y -CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y diff --git a/recipes-kernel/linux/linux-raspberrypi%.bbappend b/recipes-kernel/linux/linux-raspberrypi%.bbappend new file mode 100644 index 00000000..57ce0433 --- /dev/null +++ b/recipes-kernel/linux/linux-raspberrypi%.bbappend @@ -0,0 +1,2 @@ + +require common.inc From 85d666a8b83b533e47b1f9a0c0d6da0f660beb53 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 22 Mar 2023 15:48:10 -0300 Subject: [PATCH 070/163] labs: recipes-kernel: bbfatal when no machine config fragment is found Signed-off-by: Matheus Castello --- recipes-kernel/linux/common.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes-kernel/linux/common.inc b/recipes-kernel/linux/common.inc index 0c4b38a5..af610a77 100644 --- a/recipes-kernel/linux/common.inc +++ b/recipes-kernel/linux/common.inc @@ -10,6 +10,8 @@ do_configure:append() { # machine fragment if [ -f ${WORKDIR}/${MACHINE}.cfg ]; then cat ${WORKDIR}/${MACHINE}.cfg >> ${B}/.config + else + bbfatal "No machine specific config fragment found for ${MACHINE}" fi # debug fragment From 6e2f022a55262321b0d54306d77aa199f872a727 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 26 Mar 2023 21:51:07 -0300 Subject: [PATCH 071/163] labs: riscv: remove ltrace and valgrind from torizon-core-dev These tools are not available for riscv64, so remove them from dev image. Signed-off-by: Matheus Castello --- recipes-images/images/torizon-core-dev.inc | 2 -- 1 file changed, 2 deletions(-) diff --git a/recipes-images/images/torizon-core-dev.inc b/recipes-images/images/torizon-core-dev.inc index 2eb63dac..2dda2daa 100644 --- a/recipes-images/images/torizon-core-dev.inc +++ b/recipes-images/images/torizon-core-dev.inc @@ -1,9 +1,7 @@ CORE_IMAGE_BASE_INSTALL:append = "\ strace \ - ltrace \ tcpdump \ gdbserver \ - valgrind \ perf \ trace-cmd \ " From 150a91b8c4a15adf3049f2d78e85083d954d9821 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 26 Mar 2023 21:53:15 -0300 Subject: [PATCH 072/163] labs: riscv: go: Fix use of the go cross compiler panic Signed-off-by: Matheus Castello --- ...ent-based-hash-generation-less-pedan.patch | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch b/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch index 9a255103..b736469a 100644 --- a/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch +++ b/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch @@ -37,7 +37,7 @@ index 66ef5ce..fb7448a 100644 @@ -183,7 +183,7 @@ func ExtraEnvVarsCostly() []cfg.EnvVar { } }() - + - cppflags, cflags, cxxflags, fflags, ldflags, err := b.CFlags(&load.Package{}) + cppflags, cflags, cxxflags, fflags, ldflags, err := b.CFlags(&load.Package{}, false) if err != nil { @@ -50,7 +50,7 @@ index 67d1193..62e1774 100644 @@ -223,6 +223,8 @@ func (b *Builder) Do(ctx context.Context, root *Action) { writeActionGraph() } - + +var omitGopath = os.Getenv("GOPATH_OMIT_IN_ACTIONID") != "" + // buildActionID computes the action ID for a build action. @@ -71,7 +71,7 @@ index 67d1193..62e1774 100644 fmt.Fprintf(h, "cgo %q\n", b.toolID("cgo")) - cppflags, cflags, cxxflags, fflags, ldflags, _ := b.CFlags(p) + cppflags, cflags, cxxflags, fflags, ldflags, _ := b.CFlags(p, true) - + - ccExe := b.ccExe() + ccExe := filterCompilerFlags(b.ccExe(), true) fmt.Fprintf(h, "CC=%q %q %q %q\n", ccExe, cppflags, cflags, ldflags) @@ -101,24 +101,24 @@ index 67d1193..62e1774 100644 - fmt.Fprintf(h, "modinfo %q\n", p.Internal.BuildInfo) + //fmt.Fprintf(h, "modinfo %q\n", p.Internal.BuildInfo) } - + // Configuration specific to compiler toolchain. @@ -2989,8 +2991,25 @@ func envList(key, def string) []string { return args } - + +var filterFlags = os.Getenv("CGO_PEDANTIC") == "" + +func filterCompilerFlags(flags []string, keepfirst bool) []string { + var newflags []string -+ var realkeepfirst bool = keepfirst ++ var realkeepfirst bool = keepfirst + if !filterFlags { + return flags + } + for _, flag := range flags { + if strings.HasPrefix(flag, "-m") || realkeepfirst { + newflags = append(newflags, flag) -+ realkeepfirst = false ++ realkeepfirst = false + } + } + return newflags @@ -141,11 +141,11 @@ index 67d1193..62e1774 100644 + fflags = filterCompilerFlags(fflags, false) + ldflags = filterCompilerFlags(ldflags, false) + } - + return } @@ -3021,7 +3047,7 @@ var cgoRe = lazyregexp.New(`[/\\:]`) - + func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgofiles, gccfiles, gxxfiles, mfiles, ffiles []string) (outGo, outObj []string, err error) { p := a.Package - cgoCPPFLAGS, cgoCFLAGS, cgoCXXFLAGS, cgoFFLAGS, cgoLDFLAGS, err := b.CFlags(p) @@ -154,7 +154,7 @@ index 67d1193..62e1774 100644 return nil, nil, err } @@ -3577,7 +3603,7 @@ func (b *Builder) swigIntSize(objdir string) (intsize string, err error) { - + // Run SWIG on one SWIG input file. func (b *Builder) swigOne(a *Action, p *load.Package, file, objdir string, pcCFLAGS []string, cxx bool, intgosize string) (outGo, outC string, err error) { - cgoCPPFLAGS, cgoCFLAGS, cgoCXXFLAGS, _, _, err := b.CFlags(p) @@ -162,6 +162,6 @@ index 67d1193..62e1774 100644 if err != nil { return "", "", err } --- +-- 2.30.2 From 66959b6d441f2216a2322424a8fa46d3a4868bf8 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 26 Mar 2023 21:54:16 -0300 Subject: [PATCH 073/163] labs: riscv: lswh: Add riscv64 to COMPATIBLE_HOST Signed-off-by: Matheus Castello --- recipes-devtools/lshw/lshw_%.bbappend | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes-devtools/lshw/lshw_%.bbappend b/recipes-devtools/lshw/lshw_%.bbappend index a271958e..ddaeaee8 100644 --- a/recipes-devtools/lshw/lshw_%.bbappend +++ b/recipes-devtools/lshw/lshw_%.bbappend @@ -1,5 +1,7 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" +COMPATIBLE_HOST = "(i.86|x86_64|arm|aarch64|riscv64).*-linux" + SRC_URI += "\ file://0001-code-clean-up-for-read-3.patch \ " From 86011a6adb3b703bf2091a9c8d196c2b7bf5ef7b Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 26 Mar 2023 21:55:32 -0300 Subject: [PATCH 074/163] labs: docker-ce: Remove 0004-libnetwork-use-GO-instead-of-go.patch Signed-off-by: Matheus Castello --- recipes-containers/docker/docker-ce_git.bbappend | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes-containers/docker/docker-ce_git.bbappend b/recipes-containers/docker/docker-ce_git.bbappend index 3406f26d..2aae930c 100644 --- a/recipes-containers/docker/docker-ce_git.bbappend +++ b/recipes-containers/docker/docker-ce_git.bbappend @@ -4,7 +4,6 @@ SRC_URI:append = " \ file://0001-dockerd-daemon-use-default-system-config-when-none-i.patch \ file://0002-cli-config-support-default-system-config.patch \ file://0003-dynbinary-use-go-cross-compiler.patch \ - file://0004-libnetwork-use-GO-instead-of-go.patch \ " require docker-torizon.inc From 2365647969e5dc25f5ca6d8f6ed3a8d12f3a751b Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 26 Mar 2023 22:00:09 -0300 Subject: [PATCH 075/163] labs: nezha-allwinner-d1: Update support removing meta-lmp Signed-off-by: Matheus Castello --- conf/machine/include/nezha-allwinner-d1.inc | 25 +++------ .../nezha-allwinner-d1/boot.cmd.in | 51 +++++++++++++++++++ .../nezha-allwinner-d1/uEnv.txt.in | 6 +++ .../linux/files/nezha-allwinner-d1.cfg | 0 recipes-kernel/linux/linux-nezha-%.bbappend | 2 + 5 files changed, 67 insertions(+), 17 deletions(-) create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/boot.cmd.in create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/uEnv.txt.in create mode 100644 recipes-kernel/linux/files/nezha-allwinner-d1.cfg create mode 100644 recipes-kernel/linux/linux-nezha-%.bbappend diff --git a/conf/machine/include/nezha-allwinner-d1.inc b/conf/machine/include/nezha-allwinner-d1.inc index e2fd80f8..fd13aaf9 100644 --- a/conf/machine/include/nezha-allwinner-d1.inc +++ b/conf/machine/include/nezha-allwinner-d1.inc @@ -9,19 +9,20 @@ OSTREE_KERNEL_ARGS:sota:append:nezha-allwinner-d1 = " earlycon=sbi clk_ignore_un SOTA_CLIENT_FEATURES:append:nezha-allwinner-d1 = " ubootenv" WKS_FILE_DEPENDS_BOOTLOADERS:nezha-allwinner-d1 = "virtual/bootloader" WKS_FILE_DEPENDS:append:nezha-allwinner-d1 = " u-boot-default-script" -PREFERRED_PROVIDER_u-boot-default-script:nezha-allwinner-d1 = "u-boot-ostree-scr" -PREFERRED_PROVIDER_u-boot-default-script:sota:nezha-allwinner-d1 = "u-boot-ostree-scr-fit" +PREFERRED_PROVIDER_u-boot-default-script:nezha-allwinner-d1 = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-default-script:sota:nezha-allwinner-d1 = "u-boot-distro-boot" OSTREE_DEPLOY_DEVICETREE:nezha-allwinner-d1 = "0" PREFERRED_PROVIDER_virtual/dtb = "" KERNEL_BUILTIN_WIREGUARD:nezha-allwinner-d1 = "1" -KERNEL_CLASSES:nezha-allwinner-d1 = " toradex-fitimage " -KERNEL_IMAGETYPE:nezha-allwinner-d1 = "fitImage" -OSTREE_KERNEL:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" +KERNEL_IMAGETYPE:nezha-allwinner-d1 = "Image" +KERNEL_IMAGETYPE:sota:nezha-allwinner-d1 = "Image" +OSTREE_KERNEL:nezha-allwinner-d1 = "Image" #KERNEL_DEVICETREE:nezha-allwinner-d1:sota ?= " allwinner/sun20i-d1-nezha.dtb" UBOOT_BINARY_OTA_IGNORE:nezha-allwinner-d1 = "1" +KERNEL_BOOTCMD = "booti" LINUX_VERSION_EXTENSION = "-torizon-${LINUX_KERNEL_TYPE}" @@ -29,25 +30,15 @@ IMAGE_FSTYPES_REMOVE = "hddimg teziimg" CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" IMAGE_BOOT_FILES:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE} sun20i-d1-nezha.dtb boot.scr.uimg" -IMAGE_BOOT_FILES:sota:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE} sun20i-d1-nezha.dtb boot.scr.uimg" +IMAGE_BOOT_FILES:sota:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE} sun20i-d1-nezha.dtb boot.scr-${MACHINE};boot.scr.uimg" hostname:pn-base-files = "torizon-nezha" CORE_IMAGE_BASE_INSTALL:remove = "set-hostname" # Use meta-lmp but maintain compatibility BBMASK += " \ - meta-lmp/meta-lmp-base/recipes-connectivity \ - meta-lmp/meta-lmp-base/recipes-containers \ - meta-lmp/meta-lmp-base/recipes-core \ - meta-lmp/meta-lmp-base/recipes-devtools \ - meta-lmp/meta-lmp-base/recipes-extended \ - meta-lmp/meta-lmp-base/recipes-samples \ - meta-lmp/meta-lmp-base/recipes-security \ - meta-lmp/meta-lmp-base/recipes-sota \ - meta-lmp/meta-lmp-bsp/recipes-kernel/linux-firmware \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ + meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/boot.cmd.in new file mode 100644 index 00000000..80daf54b --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/boot.cmd.in @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: GPL-2.0+ OR MIT +# +# Copyright 2023 MicroHobby +# +# TorizonCore boot script. + +setenv bootlimit 3 +setenv devtype mmc +setenv devnum 0 +setenv bootdevice 0 +setenv otaroot 2 + +if test -z "${altbootcmd}" +then + env set altbootcmd 'env set rollback 1; run bootcmd' + env save +fi + +if test "${rollback}" = "1" && test "${upgrade_available}" = "1" +then + # Make sure to reset upgrade_available to avoid unnecessary wear + # Note this also makes rollback permanent. aktualizr will reset rollback + # when a new (hopefully better) update comes in. + env set upgrade_available 0 + env save +fi + +# save default U-Boot devicetree file to use in a rollback situation +env set fdtfile2 "${fdtfile}" + +if test -n "${loadaddr}" +then + ext4load ${devtype} ${devnum}:${otaroot} ${loadaddr} /boot/loader/uEnv.txt; env import -t ${loadaddr} ${filesize} +else + ext4load ${devtype} ${devnum}:${otaroot} ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize} +fi + +if test "${debug}" = "1" +then + echo "Enabling kernel debug" + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttymxc0,115200" +fi + +# now that we have all the environment variables, we can set the bootcmd +setenv bootargs "${defargs} ${bootargs} ${tdxargs}" + +ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} +ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image} +env set ramdisk_size ${filesize} + +@@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdtcontroladdr} diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/uEnv.txt.in new file mode 100644 index 00000000..ccbe6963 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/nezha-allwinner-d1/uEnv.txt.in @@ -0,0 +1,6 @@ +kernel_image_type=@@KERNEL_IMAGETYPE@@ +overlays_file="overlays.txt" +bootlimit=3 +devtype=mmc +devnum=0 +otaroot=2 diff --git a/recipes-kernel/linux/files/nezha-allwinner-d1.cfg b/recipes-kernel/linux/files/nezha-allwinner-d1.cfg new file mode 100644 index 00000000..e69de29b diff --git a/recipes-kernel/linux/linux-nezha-%.bbappend b/recipes-kernel/linux/linux-nezha-%.bbappend new file mode 100644 index 00000000..57ce0433 --- /dev/null +++ b/recipes-kernel/linux/linux-nezha-%.bbappend @@ -0,0 +1,2 @@ + +require common.inc From d1b16e715b36b7f5994aa797b9fc2371ead5f7f3 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 27 Mar 2023 13:48:53 -0300 Subject: [PATCH 076/163] labs: intel-corei7-64: Remove meta-lmp Signed-off-by: Matheus Castello --- conf/machine/include/intel-corei7-64.inc | 6 ------ recipes-kernel/linux/files/intel-corei7-64.cfg | 0 2 files changed, 6 deletions(-) create mode 100644 recipes-kernel/linux/files/intel-corei7-64.cfg diff --git a/conf/machine/include/intel-corei7-64.inc b/conf/machine/include/intel-corei7-64.inc index 5ab23f18..b7165e5b 100644 --- a/conf/machine/include/intel-corei7-64.inc +++ b/conf/machine/include/intel-corei7-64.inc @@ -22,9 +22,3 @@ PREFERRED_PROVIDER_virtual/dtb = "" IMAGE_INSTALL:remove = " minnowboard-efi-startup" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" - -# Use meta-lmp but maintain compatibility -BBMASK += " \ - meta-lmp/meta-lmp-base \ - meta-lmp/meta-lmp-bsp \ -" diff --git a/recipes-kernel/linux/files/intel-corei7-64.cfg b/recipes-kernel/linux/files/intel-corei7-64.cfg new file mode 100644 index 00000000..e69de29b From 5e9ed189fe4b2a35c14cc1c1d38604c98a3bf424 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 27 Mar 2023 15:22:02 -0300 Subject: [PATCH 077/163] labs: Fix garage-push for ostree Torizon Platform Signed-off-by: Matheus Castello --- classes/image_types_ostree.bbclass | 290 +++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 classes/image_types_ostree.bbclass diff --git a/classes/image_types_ostree.bbclass b/classes/image_types_ostree.bbclass new file mode 100644 index 00000000..18311dff --- /dev/null +++ b/classes/image_types_ostree.bbclass @@ -0,0 +1,290 @@ +# OSTree deployment +inherit features_check + +REQUIRED_DISTRO_FEATURES = "usrmerge" + +OSTREE_ROOTFS ??= "${WORKDIR}/ostree-rootfs" +OSTREE_COMMIT_SUBJECT ??= "Commit-id: ${IMAGE_NAME}" +OSTREE_COMMIT_BODY ??= "" +OSTREE_COMMIT_VERSION ??= "${DISTRO_VERSION}" +OSTREE_UPDATE_SUMMARY ??= "0" + +BUILD_OSTREE_TARBALL ??= "1" + +GARAGE_PUSH_RETRIES ??= "3" +GARAGE_PUSH_RETRIES_SLEEP ??= "0" + +SYSTEMD_USED = "${@oe.utils.ifelse(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'systemd', 'true', '')}" + +IMAGE_CMD_TAR = "tar --xattrs --xattrs-include=*" +CONVERSION_CMD:tar = "touch ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${type}; ${IMAGE_CMD_TAR} --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${type}.tar -C ${TAR_IMAGE_ROOTFS} . || [ $? -eq 1 ]" +CONVERSIONTYPES:append = " tar" + +TAR_IMAGE_ROOTFS:task-image-ostree = "${OSTREE_ROOTFS}" + +do_image_ostree[dirs] = "${OSTREE_ROOTFS}" +do_image_ostree[cleandirs] = "${OSTREE_ROOTFS}" +do_image_ostree[depends] = "coreutils-native:do_populate_sysroot virtual/kernel:do_deploy ${INITRAMFS_IMAGE}:do_image_complete" +IMAGE_CMD:ostree () { + # Copy required as we change permissions on some files. + tar --xattrs --xattrs-include='*' -cf - -S -C ${IMAGE_ROOTFS} -p . | tar --xattrs --xattrs-include='*' -xf - -C ${OSTREE_ROOTFS} + + for d in var/*; do + if [ "${d}" != "var/local" ]; then + rm -rf ${d} + fi + done + + # Create sysroot directory to which physical sysroot will be mounted + mkdir sysroot + ln -sf sysroot/ostree ostree + + mkdir -p usr/rootdirs + + mv etc usr/ + + if [ -n "${SYSTEMD_USED}" ]; then + mkdir -p usr/etc/tmpfiles.d + tmpfiles_conf=usr/etc/tmpfiles.d/00ostree-tmpfiles.conf + echo "d /var/rootdirs 0755 root root -" >>${tmpfiles_conf} + else + mkdir -p usr/etc/init.d + tmpfiles_conf=usr/etc/init.d/tmpfiles.sh + echo '#!/bin/sh' > ${tmpfiles_conf} + echo "mkdir -p /var/rootdirs; chmod 755 /var/rootdirs" >> ${tmpfiles_conf} + + ln -s ../init.d/tmpfiles.sh usr/etc/rcS.d/S20tmpfiles.sh + fi + + # Preserve OSTREE_BRANCHNAME for future information + mkdir -p usr/share/sota/ + echo -n "${OSTREE_BRANCHNAME}" > usr/share/sota/branchname + + # home directories get copied from the OE root later to the final sysroot + # Create a symlink to var/rootdirs/home to make sure the OSTree deployment + # redirects /home to /var/rootdirs/home. + rm -rf home/ + ln -sf var/rootdirs/home home + + # Move persistent directories to /var + dirs="opt mnt media srv" + + for dir in ${dirs}; do + if [ -d ${dir} ] && [ ! -L ${dir} ]; then + if [ "$(ls -A $dir)" ]; then + bbwarn "Data in /$dir directory is not preserved by OSTree. Consider moving it under /usr" + fi + rm -rf ${dir} + fi + + if [ -n "${SYSTEMD_USED}" ]; then + echo "d /var/rootdirs/${dir} 0755 root root -" >>${tmpfiles_conf} + else + echo "mkdir -p /var/rootdirs/${dir}; chmod 755 /var/rootdirs/${dir}" >>${tmpfiles_conf} + fi + ln -sf var/rootdirs/${dir} ${dir} + done + + if [ -d root ] && [ ! -L root ]; then + if [ "$(ls -A root)" ]; then + bbfatal "Data in /root directory is not preserved by OSTree." + fi + + if [ -n "${SYSTEMD_USED}" ]; then + echo "d /var/roothome 0700 root root -" >>${tmpfiles_conf} + else + echo "mkdir -p /var/roothome; chmod 700 /var/roothome" >>${tmpfiles_conf} + fi + + rm -rf root + ln -sf var/roothome root + fi + + if [ -d usr/local ] && [ ! -L usr/local ]; then + if [ "$(ls -A usr/local)" ]; then + bbfatal "Data in /usr/local directory is not preserved by OSTree." + fi + rm -rf usr/local + fi + + if [ -n "${SYSTEMD_USED}" ]; then + echo "d /var/usrlocal 0755 root root -" >>${tmpfiles_conf} + else + echo "mkdir -p /var/usrlocal; chmod 755 /var/usrlocal" >>${tmpfiles_conf} + fi + + dirs="bin etc games include lib man sbin share src" + + for dir in ${dirs}; do + if [ -n "${SYSTEMD_USED}" ]; then + echo "d /var/usrlocal/${dir} 0755 root root -" >>${tmpfiles_conf} + else + echo "mkdir -p /var/usrlocal/${dir}; chmod 755 /var/usrlocal/${dir}" >>${tmpfiles_conf} + fi + done + + ln -sf ../var/usrlocal usr/local + + # Copy image manifest + cat ${IMAGE_MANIFEST} | cut -d " " -f1,3 > usr/package.manifest +} + +IMAGE_TYPEDEP:ostreecommit = "ostree" +do_image_ostreecommit[depends] += "ostree-native:do_populate_sysroot" +do_image_ostreecommit[lockfiles] += "${OSTREE_REPO}/ostree.lock" +IMAGE_CMD:ostreecommit () { + if ! ostree --repo=${OSTREE_REPO} refs 2>&1 > /dev/null; then + ostree --repo=${OSTREE_REPO} init --mode=archive-z2 + fi + + # Commit the result + ostree_target_hash=$(ostree --repo=${OSTREE_REPO} commit \ + --tree=dir=${OSTREE_ROOTFS} \ + --skip-if-unchanged \ + --branch=${OSTREE_BRANCHNAME} \ + --subject="${OSTREE_COMMIT_SUBJECT}" \ + --body="${OSTREE_COMMIT_BODY}" \ + --add-metadata-string=version="${OSTREE_COMMIT_VERSION}" \ + ${EXTRA_OSTREE_COMMIT}) + + echo $ostree_target_hash > ${WORKDIR}/ostree_manifest + + if [ ${@ oe.types.boolean('${OSTREE_UPDATE_SUMMARY}')} = True ]; then + ostree --repo=${OSTREE_REPO} summary -u + fi +} + +IMAGE_TYPEDEP:ostreepush = "ostreecommit" +do_image_ostreepush[depends] += "aktualizr-native:do_populate_sysroot ca-certificates-native:do_populate_sysroot" +do_image_ostreepush[lockfiles] += "${OSTREE_REPO}/ostree.lock" +do_image_ostreepush[network] = "1" +IMAGE_CMD:ostreepush () { + + if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then + if [ -e ${SOTA_PACKED_CREDENTIALS} ]; then + garage-push --loglevel 0 --repo=${OSTREE_REPO} \ + --ref=${OSTREE_BRANCHNAME} \ + --credentials=${SOTA_PACKED_CREDENTIALS} \ + --cacert=${STAGING_ETCDIR_NATIVE}/ssl/certs/ca-certificates.crt + else + bbwarn "Torizon SOTA_PACKED_CREDENTIALS file does not exist." + fi + else + bbwarn "Torizon SOTA_PACKED_CREDENTIALS not set. Please add SOTA_PACKED_CREDENTIALS." + fi +} + +IMAGE_TYPEDEP:garagesign = "ostreepush" +do_image_garagesign[depends] += "unzip-native:do_populate_sysroot" +# This lock solves OTA-1866, which is that removing GARAGE_SIGN_REPO while using +# garage-sign simultaneously for two images often causes problems. +do_image_garagesign[lockfiles] += "${DEPLOY_DIR_IMAGE}/garagesign.lock" +do_image_garagesign[network] = "1" +IMAGE_CMD:garagesign () { + if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then + # if credentials are issued by a server that doesn't support offline signing, exit silently + unzip -p ${SOTA_PACKED_CREDENTIALS} root.json targets.pub targets.sec tufrepo.url 2>&1 >/dev/null || exit 0 + + java_version=$( java -version 2>&1 | awk -F '"' '/version/ {print $2}' ) + if [ "${java_version}" = "" ]; then + bbfatal "Java is required for synchronization with update backend, but is not installed on the host machine" + elif [ "${java_version}" \< "1.8" ]; then + bbfatal "Java version >= 8 is required for synchronization with update backend" + fi + + rm -rf ${GARAGE_SIGN_REPO} + garage-sign init --repo tufrepo \ + --home-dir ${GARAGE_SIGN_REPO} \ + --credentials ${SOTA_PACKED_CREDENTIALS} + + ostree_target_hash=$(cat ${WORKDIR}/ostree_manifest) + + # Use OSTree target hash as version if none was provided by the user + target_version=${ostree_target_hash} + if [ -n "${GARAGE_TARGET_VERSION}" ]; then + target_version=${GARAGE_TARGET_VERSION} + bbwarn "Target version is overriden with GARAGE_TARGET_VERSION variable. This is a dangerous operation! See https://docs.ota.here.com/ota-client/latest/build-configuration.html#_overriding_target_version" + elif [ -e "${STAGING_DATADIR_NATIVE}/target_version" ]; then + target_version=$(cat "${STAGING_DATADIR_NATIVE}/target_version") + bbwarn "Target version is overriden with target_version file. This is a dangerous operation! See https://docs.ota.here.com/ota-client/latest/build-configuration.html#_overriding_target_version" + fi + + # Push may fail due to race condition when multiple build machines try to push simultaneously + # in which case targets.json should be pulled again and the whole procedure repeated + push_success=0 + target_url="" + if [ -n "${GARAGE_TARGET_URL}" ]; then + target_url="--url ${GARAGE_TARGET_URL}" + fi + target_expiry="" + if [ -n "${GARAGE_TARGET_EXPIRES}" ] && [ -n "${GARAGE_TARGET_EXPIRE_AFTER}" ]; then + bbfatal "Both GARAGE_TARGET_EXPIRES and GARAGE_TARGET_EXPIRE_AFTER are set. Only one can be set at a time." + elif [ -n "${GARAGE_TARGET_EXPIRES}" ]; then + target_expiry="--expires ${GARAGE_TARGET_EXPIRES}" + elif [ -n "${GARAGE_TARGET_EXPIRE_AFTER}" ]; then + target_expiry="--expire-after ${GARAGE_TARGET_EXPIRE_AFTER}" + else + target_expiry="--expire-after 1M" + fi + + for push_retries in $( seq ${GARAGE_PUSH_RETRIES} ); do + garage-sign targets pull --repo tufrepo \ + --home-dir ${GARAGE_SIGN_REPO} + garage-sign targets add --repo tufrepo \ + --home-dir ${GARAGE_SIGN_REPO} \ + --name ${GARAGE_TARGET_NAME} \ + --format OSTREE \ + --version ${target_version} \ + --length 0 \ + ${target_url} \ + --sha256 ${ostree_target_hash} \ + --hardwareids ${SOTA_HARDWARE_ID} + if [ -n "${GARAGE_CUSTOMIZE_TARGET}" ]; then + bbplain "Running command(${GARAGE_CUSTOMIZE_TARGET}) to customize target" + ${GARAGE_CUSTOMIZE_TARGET} \ + ${GARAGE_SIGN_REPO}/tufrepo/roles/unsigned/targets.json \ + ${GARAGE_TARGET_NAME}-${target_version} + fi + garage-sign targets sign --repo tufrepo \ + --home-dir ${GARAGE_SIGN_REPO} \ + ${target_expiry} \ + --key-name=targets + errcode=0 + garage-sign targets push --repo tufrepo \ + --home-dir ${GARAGE_SIGN_REPO} || errcode=$? + if [ "$errcode" -eq "0" ]; then + push_success=1 + break + else + bbwarn "Push to garage repository has failed with errcode ${errcode}, retrying ${push_retries}/${GARAGE_PUSH_RETRIES}" + if [ "${GARAGE_PUSH_RETRIES_SLEEP}" -ne "0" ]; then + ramdom="$(date +%s%N | cut -b10-19)" + sleep="$(expr ${ramdom} % ${GARAGE_PUSH_RETRIES_SLEEP} + 1)" + bbdebug 1 "Push to garage repository in ${sleep} seconds" + sleep ${sleep} + fi + fi + done + rm -rf ${GARAGE_SIGN_REPO} + + if [ "$push_success" -ne "1" ]; then + bbfatal_log "Couldn't push to garage repository" + fi + fi +} + +IMAGE_TYPEDEP:garagecheck = "garagesign" +do_image_garagecheck[network] = "1" +IMAGE_CMD:garagecheck () { + if [ -n "${SOTA_PACKED_CREDENTIALS}" ]; then + # if credentials are issued by a server that doesn't support offline signing, exit silently + unzip -p ${SOTA_PACKED_CREDENTIALS} root.json targets.pub targets.sec tufrepo.url 2>&1 >/dev/null || exit 0 + + ostree_target_hash=$(cat ${WORKDIR}/ostree_manifest) + + garage-check --ref=${ostree_target_hash} \ + --credentials=${SOTA_PACKED_CREDENTIALS} \ + --cacert=${STAGING_ETCDIR_NATIVE}/ssl/certs/ca-certificates.crt + fi +} +# vim:set ts=4 sw=4 sts=4 expandtab: From 07987f5e199a3a79130284584569a19ef1e7937a Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 3 Apr 2023 00:16:57 -0300 Subject: [PATCH 078/163] labs: recipes-kernel: rpi: Use v5.15.92 from microhobby Signed-off-by: Matheus Castello --- recipes-kernel/linux/files/debug.cfg | 4 ++++ recipes-kernel/linux/files/raspberrypi4-64.cfg | 3 +++ recipes-kernel/linux/linux-raspberrypi%.bbappend | 2 -- .../linux/linux-raspberrypi_5.15.bbappend | 14 ++++++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) delete mode 100644 recipes-kernel/linux/linux-raspberrypi%.bbappend create mode 100644 recipes-kernel/linux/linux-raspberrypi_5.15.bbappend diff --git a/recipes-kernel/linux/files/debug.cfg b/recipes-kernel/linux/files/debug.cfg index 6cf2baba..23b5053d 100644 --- a/recipes-kernel/linux/files/debug.cfg +++ b/recipes-kernel/linux/files/debug.cfg @@ -21,6 +21,10 @@ CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # for toradex we need to enable all sysrq keys CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +# make sure to have config.gz +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y + # kdump CONFIG_KEXEC_FILE=y CONFIG_KEXEC=y diff --git a/recipes-kernel/linux/files/raspberrypi4-64.cfg b/recipes-kernel/linux/files/raspberrypi4-64.cfg index 9ced1328..fada48e3 100644 --- a/recipes-kernel/linux/files/raspberrypi4-64.cfg +++ b/recipes-kernel/linux/files/raspberrypi4-64.cfg @@ -5,6 +5,9 @@ CONFIG_DRM=y CONFIG_DRM_KMS_HELPER=y CONFIG_DRM_SCHED=y CONFIG_DRM_V3D=y +CONFIG_SND=y +CONFIG_SND_SOC=y +CONFIG_SND_BCM2835=y CONFIG_DRM_VC4=y CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y CONFIG_FB_CFB_FILLRECT=y diff --git a/recipes-kernel/linux/linux-raspberrypi%.bbappend b/recipes-kernel/linux/linux-raspberrypi%.bbappend deleted file mode 100644 index 57ce0433..00000000 --- a/recipes-kernel/linux/linux-raspberrypi%.bbappend +++ /dev/null @@ -1,2 +0,0 @@ - -require common.inc diff --git a/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend b/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend new file mode 100644 index 00000000..53237e9c --- /dev/null +++ b/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend @@ -0,0 +1,14 @@ + +LINUX_VERSION = "5.15.92" + +# use microhobby kernel Disable bt and use PL011 as console +SRCREV_machine = "361db6f664a26ca785fedf55f4d021a3fbdfd6dd" + +SRC_URI = " \ + git://github.com/microhobby/linus-tree.git;name=machine;branch=${LINUX_RPI_BRANCH};protocol=https \ + git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=${LINUX_RPI_KMETA_BRANCH};destsuffix=${KMETA} \ + file://powersave.cfg \ + file://android-drivers.cfg \ +" + +require common.inc From e0542b232d7a5d42f587643bf939d486d5b1d787 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 3 Apr 2023 00:30:43 -0300 Subject: [PATCH 079/163] labs: u-boot: raspberrypi4-64: Fix use ttyAMA0 as kgdboc Signed-off-by: Matheus Castello --- .../u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in index f6dc595a..bc556402 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in @@ -37,7 +37,7 @@ fi if test "${debug}" = "1" then echo "Enabling kernel debug" - env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttymxc0,115200" + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttyAMA0,115200" fi # now that we have all the environment variables, we can set the bootcmd From eb5de2dd08477f3f1cc80b4d40bdcd98ac035669 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 3 Apr 2023 00:31:36 -0300 Subject: [PATCH 080/163] labs: raspberrypi4-64: Use preferred version for linux-raspberrypi Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi4-64.inc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 2b9b8178..0426df92 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -36,12 +36,13 @@ KERNEL_DEVICETREE:raspberrypi4-64:sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlay KERNEL_BOOTCMD = "booti" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" +PREFERRED_VERSION_linux-raspberrypi = "5.15.%" ## Mimic meta-raspberrypi behavior ENABLE_UART:rpi = "1" SERIAL_CONSOLES = "115200;ttyAMA0" -KERNEL_SERIAL:rpi = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyAMA0,115200", "", d)}" -OSTREE_KERNEL_ARGS_COMMON_RPI = "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" +KERNEL_SERIAL:sota:rpi = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyAMA0,115200", "", d)}" +OSTREE_KERNEL_ARGS:sota = " 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=614 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 ${KERNEL_SERIAL} usbhid.mousepoll=0 " # This boot arguments are the same from torizon.bbclass OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " From 4b44b951723827f32639c9bf86a56334801004ef Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 6 May 2023 21:48:54 -0300 Subject: [PATCH 081/163] labs: raspberrypi3-64: Add support for 64-bit Raspberry Pi 3 This is the changes needed to support 64-bit Raspberry Pi 3 without meta-lmp for TorizonCore version 6.2 Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 50 ++++++++----------- .../raspberrypi3-64/boot.cmd.in | 50 +++++++++++++++++++ .../raspberrypi3-64/uEnv.txt.in | 6 +++ .../linux/files/raspberrypi3-64.cfg | 22 ++++++++ 4 files changed, 100 insertions(+), 28 deletions(-) create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in create mode 100644 recipes-kernel/linux/files/raspberrypi3-64.cfg diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 8828a507..0972bda2 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -1,36 +1,43 @@ WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" -CORE_IMAGE_BASE_INSTALL:append = "resize-helper u-boot-fio" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" # Raspberry Pi KERNEL_BUILTIN_WIREGUARD:rpi = "1" -PREFERRED_PROVIDER_virtual/bootloader = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-fio" -PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot-fio" -PREFERRED_PROVIDER_u-boot:rpi = "u-boot-fio" +CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot" +PREFERRED_PROVIDER_u-boot:rpi = "u-boot" +PREFERRED_PROVIDER_virtual/dtb = "" SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" -PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-ostree-scr" -PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-ostree-scr-fit" +PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-distro-boot" -PREFERRED_PROVIDER_virtual/dtb:rpi ?= "lmp-device-tree" IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" + # We need ota-ext4 and wic for rpi IMAGE_FSTYPES_REMOVE = "" IMAGE_BOOT_FILES:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " -IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.itb " -KERNEL_CLASSES:rpi = " toradex-fitimage " -OSTREE_KERNEL:rpi = "${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}" -KERNEL_IMAGETYPE:rpi = "fitImage" -PREFERRED_PROVIDER_virtual/kernel:rpi ?= "linux-lmp-rpi" +IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} " +IMAGE_BOOT_FILES_REMOVE:sota:remove = "boot.scr-${MACHINE};boot.scr" +IMAGE_BOOT_FILES:append = " boot.scr-${MACHINE};boot.scr " + +OSTREE_KERNEL:rpi = "Image" +OSTREE_DEPLOY_DEVICETREE:rpi = "0" +KERNEL_IMAGETYPE:rpi = "Image" +KERNEL_IMAGETYPE:sota:rpi = "Image" + LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" ## Mimic meta-raspberrypi behavior ENABLE_UART:rpi = "1" -KERNEL_SERIAL:rpi ?= "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" -OSTREE_KERNEL_ARGS_COMMON_RPI ?= "coherent_pool=1M 8250.nr_uarts=1 console=tty1 ${KERNEL_SERIAL} ${OSTREE_KERNEL_ARGS_COMMON}" +SERIAL_CONSOLES = "115200;ttyAMA0" +KERNEL_SERIAL:sota:rpi = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" +OSTREE_KERNEL_ARGS:sota = " 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=614 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 ${KERNEL_SERIAL} usbhid.mousepoll=0 " # This boot arguments are the same from torizon.bbclass OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " @@ -40,21 +47,8 @@ UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" UBOOT_BINARY_OTA_IGNORE:rpi = "1" -# Use meta-lmp but maintain compatibility BBMASK += " \ - meta-lmp/meta-lmp-base/recipes-connectivity \ - meta-lmp/meta-lmp-base/recipes-containers \ - meta-lmp/meta-lmp-base/recipes-core \ - meta-lmp/meta-lmp-base/recipes-devtools \ - meta-lmp/meta-lmp-base/recipes-extended \ - meta-lmp/meta-lmp-base/recipes-samples \ - meta-lmp/meta-lmp-base/recipes-security \ - meta-lmp/meta-lmp-base/recipes-sota \ - meta-lmp/meta-lmp-base/recipes-support \ - meta-lmp/meta-lmp-bsp/recipes-kernel/linux-firmware \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-distro-boot.bbappend \ meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in new file mode 100644 index 00000000..bc556402 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: GPL-2.0+ OR MIT +# +# Copyright 2023 MicroHobby +# +# TorizonCore boot script. + +setenv bootlimit 3 +setenv devtype mmc +setenv devnum 0 +setenv otaroot 2 + +if test -z "${altbootcmd}" +then + env set altbootcmd 'env set rollback 1; run bootcmd' + env save +fi + +if test "${rollback}" = "1" && test "${upgrade_available}" = "1" +then + # Make sure to reset upgrade_available to avoid unnecessary wear + # Note this also makes rollback permanent. aktualizr will reset rollback + # when a new (hopefully better) update comes in. + env set upgrade_available 0 + env save +fi + +# save default U-Boot devicetree file to use in a rollback situation +env set fdtfile2 "${fdtfile}" + +if test -n "${loadaddr}" +then + ext4load ${devtype} ${devnum}:${otaroot} ${loadaddr} /boot/loader/uEnv.txt; env import -t ${loadaddr} ${filesize} +else + ext4load ${devtype} ${devnum}:${otaroot} ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize} +fi + +if test "${debug}" = "1" +then + echo "Enabling kernel debug" + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttyAMA0,115200" +fi + +# now that we have all the environment variables, we can set the bootcmd +setenv bootargs "${defargs} ${bootargs} ${tdxargs}" + +ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} +ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image} +env set ramdisk_size ${filesize} + +@@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr} diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in new file mode 100644 index 00000000..ccbe6963 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in @@ -0,0 +1,6 @@ +kernel_image_type=@@KERNEL_IMAGETYPE@@ +overlays_file="overlays.txt" +bootlimit=3 +devtype=mmc +devnum=0 +otaroot=2 diff --git a/recipes-kernel/linux/files/raspberrypi3-64.cfg b/recipes-kernel/linux/files/raspberrypi3-64.cfg new file mode 100644 index 00000000..fada48e3 --- /dev/null +++ b/recipes-kernel/linux/files/raspberrypi3-64.cfg @@ -0,0 +1,22 @@ +CONFIG_I2C_ALGOBIT=y +CONFIG_CEC_CORE=y +CONFIG_DRM=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_V3D=y +CONFIG_SND=y +CONFIG_SND_SOC=y +CONFIG_SND_BCM2835=y +CONFIG_DRM_VC4=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y From 7464578e92d2474aca67dd111a7c64d4e0d64ebc Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 12 May 2023 01:19:52 -0300 Subject: [PATCH 082/163] raspberrypi: Fix fw_env.config not been deployed Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi3-64.inc | 7 +-- conf/machine/include/raspberrypi4-64.inc | 7 +-- recipes-bsp/u-boot/libubootenv/fw_env.config | 1 + ...r-with-firmware-provided-FDT-address.patch | 50 +++++++++++++++++++ recipes-bsp/u-boot/u-boot_%.bbappend | 6 +++ 5 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 recipes-bsp/u-boot/libubootenv/fw_env.config create mode 100644 recipes-bsp/u-boot/u-boot/0001-rpi-always-set-fdt_addr-with-firmware-provided-FDT-address.patch diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 0972bda2..24302a03 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -11,12 +11,14 @@ PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot" PREFERRED_PROVIDER_u-boot:rpi = "u-boot" PREFERRED_PROVIDER_virtual/dtb = "" -SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-distro-boot" PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-fw-utils = "libubootenv" +PREFERRED_RPROVIDER_u-boot-fw-utils = "libubootenv" + IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" # We need ota-ext4 and wic for rpi @@ -49,7 +51,6 @@ UBOOT_BINARY_OTA_IGNORE:rpi = "1" BBMASK += " \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ - meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ + meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 0426df92..dd38c74e 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -11,13 +11,15 @@ PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot" PREFERRED_PROVIDER_u-boot:rpi = "u-boot" PREFERRED_PROVIDER_virtual/dtb = "" -SOTA_CLIENT_FEATURES:append:rpi = " ubootenv" SOTA_DT_OVERLAYS:raspberrypi4-64 ?= "vc4-fkms-v3d-pi4.dtbo rpi-ft5406.dtbo" WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-distro-boot" PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-fw-utils = "libubootenv" +PREFERRED_RPROVIDER_u-boot-fw-utils = "libubootenv" + IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" # We need ota-ext4 and wic for rpi @@ -50,7 +52,6 @@ UBOOT_BINARY_OTA_IGNORE:raspberrypi4-64 = "1" BBMASK += " \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ - meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ + meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/recipes-bsp/u-boot/libubootenv/fw_env.config b/recipes-bsp/u-boot/libubootenv/fw_env.config new file mode 100644 index 00000000..49d312e2 --- /dev/null +++ b/recipes-bsp/u-boot/libubootenv/fw_env.config @@ -0,0 +1 @@ +/var/rootdirs/media/boot/uboot.env 0x0000 0x4000 diff --git a/recipes-bsp/u-boot/u-boot/0001-rpi-always-set-fdt_addr-with-firmware-provided-FDT-address.patch b/recipes-bsp/u-boot/u-boot/0001-rpi-always-set-fdt_addr-with-firmware-provided-FDT-address.patch new file mode 100644 index 00000000..c375c406 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot/0001-rpi-always-set-fdt_addr-with-firmware-provided-FDT-address.patch @@ -0,0 +1,50 @@ +From: Mauro Salvini +To: u-boot@lists.denx.de +Subject: [PATCH] rpi: always set fdt_addr with firmware-provided FDT address +Date: Wed, 12 May 2021 14:39:45 +0200 [thread overview] +Message-ID: <20210512123945.25649-1-m.salvini@koansoftware.com> (raw) + +Raspberry firmware prepares the FDT blob in memory at an address +that depends on both the memory size and the blob size [1]. +After commit ade243a211d6 ("rpi: passthrough of the firmware provided FDT +blob") this FDT is passed to kernel through fdt_addr environment variable, +handled in set_fdt_addr() function in board file. + +When u-boot environment is persistently saved, if a change happens +in loaded FDT (e.g. for a new overlay applied), firmware produces a FDT +address different from the saved one, but u-boot still use the saved +one because set_fdt_addr() function does not overwrite the fdt_addr +variable. So, for example, if there is a script that uses fdt commands for +e.g. manipulate the bootargs, boot hangs with error + +libfdt fdt_check_header(): FDT_ERR_BADMAGIC + +Removing the fdt_addr variable in saved environment allows to boot. + +With this patch set_fdt_addr() function always overwrite fdt_addr value. + +[1] https://www.raspberrypi.org/forums//viewtopic.php?f=107&t=134018 + +Signed-off-by: Mauro Salvini +Cc: C?dric Schieli +Cc: Matthias Brugger +--- + board/raspberrypi/rpi/rpi.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index df52a4689f..611013471e 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -318,9 +318,6 @@ static void set_fdtfile(void) + */ + static void set_fdt_addr(void) + { +- if (env_get("fdt_addr")) +- return; +- + if (fdt_magic(fw_dtb_pointer) != FDT_MAGIC) + return; + +-- +2.17.1 \ No newline at end of file diff --git a/recipes-bsp/u-boot/u-boot_%.bbappend b/recipes-bsp/u-boot/u-boot_%.bbappend index e1d71732..95182aa0 100644 --- a/recipes-bsp/u-boot/u-boot_%.bbappend +++ b/recipes-bsp/u-boot/u-boot_%.bbappend @@ -1 +1,7 @@ require u-boot-ota.inc + +FILESEXTRAPATHS:prepend := "${THISDIR}/u-boot:" + +SRC_URI:append:rpi = " file://0001-rpi-always-set-fdt_addr-with-firmware-provided-FDT-address.patch" + +DEPENDS:append:rpi = " u-boot-default-script" From ae312819687e7779b5c1b27e06007c83a6474ced Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 29 May 2023 21:31:46 -0300 Subject: [PATCH 083/163] labs: beaglebone-yocto: Add support for Beaglebone Black Signed-off-by: Matheus Castello --- conf/machine/include/beaglebone-yocto.inc | 69 +++++++++ .../beaglebone-yocto/boot.cmd.in | 53 +++++++ .../beaglebone-yocto/uEnv.txt.in | 6 + .../linux/files/beaglebone-yocto.cfg | 11 ++ .../am335x-boneblack-hdmi.dtsi | 141 ++++++++++++++++++ recipes-kernel/linux/linux-yocto%.bbappend | 3 + recipes-kernel/linux/specific.inc | 10 ++ scripts/setup-environment-internal | 2 +- 8 files changed, 294 insertions(+), 1 deletion(-) create mode 100644 conf/machine/include/beaglebone-yocto.inc create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/boot.cmd.in create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/uEnv.txt.in create mode 100644 recipes-kernel/linux/files/beaglebone-yocto.cfg create mode 100644 recipes-kernel/linux/files/beaglebone-yocto/am335x-boneblack-hdmi.dtsi create mode 100644 recipes-kernel/linux/specific.inc diff --git a/conf/machine/include/beaglebone-yocto.inc b/conf/machine/include/beaglebone-yocto.inc new file mode 100644 index 00000000..00442414 --- /dev/null +++ b/conf/machine/include/beaglebone-yocto.inc @@ -0,0 +1,69 @@ +# taken from meta-freescale/conf/machine/include/utilities.inc +def make_dtb_boot_files(d): + # Generate IMAGE_BOOT_FILES entries for device tree files listed in + # KERNEL_DEVICETREE. + # Use only the basename for dtb files: + alldtbs = d.getVar('KERNEL_DEVICETREE') + + + # DTBs may be built out of kernel with devicetree.bbclass + if not alldtbs: + return '' + + def transform(dtb): + if not (dtb.endswith('dtb') or dtb.endswith('dtbo')): + # eg: whatever/bcm2708-rpi-b.dtb has: + # DEPLOYDIR file: bcm2708-rpi-b.dtb + # destination: bcm2708-rpi-b.dtb + bb.error("KERNEL_DEVICETREE entry %s is not a .dtb or .dtbo file." % (dtb) ) + return os.path.basename(dtb) + + return ' '.join([transform(dtb) for dtb in alldtbs.split() if dtb]) + +WKS_FILE = "beaglebone-yocto.wks" +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" + +# beaglebone +KERNEL_BUILTIN_WIREGUARD:beaglebone-yocto = "1" +CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:beaglebone-yocto = "u-boot" +PREFERRED_PROVIDER_u-boot:beaglebone-yocto = "u-boot" +PREFERRED_PROVIDER_virtual/dtb = "" +WKS_FILE_DEPENDS_BOOTLOADERS:beaglebone-yocto = "virtual/bootloader" +WKS_FILE_DEPENDS:append:beaglebone-yocto = " u-boot-default-script" +PREFERRED_PROVIDER_u-boot-default-script:beaglebone-yocto = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-default-script:sota:beaglebone-yocto = "u-boot-distro-boot" + +PREFERRED_PROVIDER_u-boot-fw-utils = "libubootenv" +PREFERRED_RPROVIDER_u-boot-fw-utils = "libubootenv" + +IMAGE_FSTYPES:remove:beaglebone-yocto = "ext3 jffs2 teziimg" + +# We need ota-ext4 and wic for beagle +IMAGE_FSTYPES_REMOVE = "" +IMAGE_BOOT_FILES:beaglebone-yocto = "u-boot.img MLO ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " +IMAGE_BOOT_FILES:sota:beaglebone-yocto = "u-boot.img MLO ${@make_dtb_boot_files(d)} " +IMAGE_BOOT_FILES_REMOVE:sota:remove = "boot.scr-${MACHINE};boot.scr" +IMAGE_BOOT_FILES:append = " boot.scr-${MACHINE};boot.scr " + +OSTREE_KERNEL:beaglebone-yocto = "zImage" +OSTREE_DEPLOY_DEVICETREE:beaglebone-yocto = "0" +KERNEL_IMAGETYPE:beaglebone-yocto = "zImage" +KERNEL_IMAGETYPE:sota:beaglebone-yocto = "zImage" + +LINUX_VERSION_EXTENSION = "-torizon-${LINUX_KERNEL_TYPE}" + +## same bahavior +# This boot arguments are the same from torizon.bbclass +OSTREE_KERNEL_ARGS:sota:append:beaglebone-yocto = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash " + +UBOOT_BINARY_OTA_IGNORE:beaglebone-yocto = "1" + +BBMASK += " \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ + meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ +" diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/boot.cmd.in new file mode 100644 index 00000000..c8aabfbb --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/boot.cmd.in @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: GPL-2.0+ OR MIT +# +# Copyright 2023 MicroHobby +# +# TorizonCore boot script. + +setenv bootlimit 3 +setenv devtype mmc +setenv devnum 0 +setenv bootdevice 0 +setenv otaroot 2 + +if test -z "${altbootcmd}" +then + env set altbootcmd 'env set rollback 1; run bootcmd' + env save +fi + +if test "${rollback}" = "1" && test "${upgrade_available}" = "1" +then + # Make sure to reset upgrade_available to avoid unnecessary wear + # Note this also makes rollback permanent. aktualizr will reset rollback + # when a new (hopefully better) update comes in. + env set upgrade_available 0 + env save +fi + +# save default U-Boot devicetree file to use in a rollback situation +env set fdtfile2 "${fdtfile}" +env set fdtfile "am335x-boneblack.dtb" + +if test -n "${loadaddr}" +then + ext4load ${devtype} ${devnum}:${otaroot} ${loadaddr} /boot/loader/uEnv.txt; env import -t ${loadaddr} ${filesize} +else + ext4load ${devtype} ${devnum}:${otaroot} ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize} +fi + +if test "${debug}" = "1" +then + echo "Enabling kernel debug" + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttymxc0,115200" +fi + +# now that we have all the environment variables, we can set the bootcmd +setenv bootargs "${defargs} ${bootargs} ${tdxargs}" + +ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} +ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image} +env set ramdisk_size ${filesize} +load ${devtype} ${devnum}:1 ${fdt_addr_r} ${fdtfile} + +@@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr_r} diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/uEnv.txt.in new file mode 100644 index 00000000..ccbe6963 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/beaglebone-yocto/uEnv.txt.in @@ -0,0 +1,6 @@ +kernel_image_type=@@KERNEL_IMAGETYPE@@ +overlays_file="overlays.txt" +bootlimit=3 +devtype=mmc +devnum=0 +otaroot=2 diff --git a/recipes-kernel/linux/files/beaglebone-yocto.cfg b/recipes-kernel/linux/files/beaglebone-yocto.cfg new file mode 100644 index 00000000..a1fb79a8 --- /dev/null +++ b/recipes-kernel/linux/files/beaglebone-yocto.cfg @@ -0,0 +1,11 @@ +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_PCM=y +CONFIG_SND_SOC=y +CONFIG_SND_SIMPLE_CARD_UTILS=y +CONFIG_SND_SIMPLE_CARD=y +CONFIG_SND_SOC_DAVINCI_MCASP=y +CONFIG_SND_SOC_TI_EDMA_PCM=y +CONFIG_SND_SOC_TI_SDMA_PCM=y +CONFIG_SND_SOC_TI_UDMA_PCM=y +CONFIG_SND_SOC_HDMI_CODEC=y diff --git a/recipes-kernel/linux/files/beaglebone-yocto/am335x-boneblack-hdmi.dtsi b/recipes-kernel/linux/files/beaglebone-yocto/am335x-boneblack-hdmi.dtsi new file mode 100644 index 00000000..ee6c799a --- /dev/null +++ b/recipes-kernel/linux/files/beaglebone-yocto/am335x-boneblack-hdmi.dtsi @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/ + */ + +#include +#include + +&am33xx_pinmux { + nxp_hdmi_bonelt_pins: nxp_hdmi_bonelt_pins { + pinctrl-single,pins = < + AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA0, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA1, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA2, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA3, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA4, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA5, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA6, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA7, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA8, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA9, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA10, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA11, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA12, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA13, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA14, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_DATA15, PIN_OUTPUT, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_HSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_PCLK, PIN_OUTPUT_PULLDOWN, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0) + >; + }; + + nxp_hdmi_bonelt_off_pins: nxp_hdmi_bonelt_off_pins { + pinctrl-single,pins = < + AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3) + >; + }; + + mcasp0_pins: mcasp0_pins { + pinctrl-single,pins = < + AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKX, PIN_INPUT_PULLUP, MUX_MODE0) /* mcasp0_ahcklx.mcasp0_ahclkx */ + AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2*/ + AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLUP, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE0) + AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* gpmc_a11.GPIO1_27 */ + >; + }; +}; + +&lcdc { + status = "okay"; + + /* If you want to get 24 bit RGB and 16 BGR mode instead of + * current 16 bit RGB and 24 BGR modes, set the propety + * below to "crossed" and uncomment the video-ports -property + * in tda19988 node. + */ + blue-and-red-wiring = "crossed"; + + port { + lcdc_0: endpoint@0 { + remote-endpoint = <&hdmi_0>; + }; + }; +}; + +&i2c0 { + tda19988: tda19988@70 { + compatible = "nxp,tda998x"; + reg = <0x70>; + nxp,calib-gpios = <&gpio1 25 0>; + interrupts-extended = <&gpio1 25 IRQ_TYPE_LEVEL_LOW>; + + pinctrl-names = "default", "off"; + pinctrl-0 = <&nxp_hdmi_bonelt_pins>; + pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>; + + /* Convert 24bit BGR to RGB, e.g. cross red and blue wiring */ + video-ports = <0x234501>; + + #sound-dai-cells = <0>; + audio-ports = < TDA998x_I2S 0x03>; + + ports { + port@0 { + hdmi_0: endpoint@0 { + remote-endpoint = <&lcdc_0>; + }; + }; + }; + }; +}; + +&mcasp0 { + #sound-dai-cells = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&mcasp0_pins>; + status = "okay"; + op-mode = <0>; /* MCASP_IIS_MODE */ + tdm-slots = <2>; + serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */ + 0 0 1 0 + >; + tx-num-evt = <32>; + rx-num-evt = <32>; +}; + +/ { + clk_mcasp0_fixed: clk_mcasp0_fixed { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <24576000>; + }; + + clk_mcasp0: clk_mcasp0 { + #clock-cells = <0>; + compatible = "gpio-gate-clock"; + clocks = <&clk_mcasp0_fixed>; + enable-gpios = <&gpio1 27 0>; /* BeagleBone Black Clk enable on GPIO1_27 */ + }; + + sound { + compatible = "simple-audio-card"; + simple-audio-card,name = "TI BeagleBone Black"; + simple-audio-card,format = "i2s"; + simple-audio-card,bitclock-master = <&dailink0_master>; + simple-audio-card,frame-master = <&dailink0_master>; + + dailink0_master: simple-audio-card,cpu { + sound-dai = <&mcasp0>; + clocks = <&clk_mcasp0>; + }; + + simple-audio-card,codec { + sound-dai = <&tda19988>; + }; + }; +}; diff --git a/recipes-kernel/linux/linux-yocto%.bbappend b/recipes-kernel/linux/linux-yocto%.bbappend index 3f86f152..c6697ed2 100644 --- a/recipes-kernel/linux/linux-yocto%.bbappend +++ b/recipes-kernel/linux/linux-yocto%.bbappend @@ -7,3 +7,6 @@ SRC_URI += "\ " inherit toradex-kernel-localversion + +require common.inc +require specific.inc diff --git a/recipes-kernel/linux/specific.inc b/recipes-kernel/linux/specific.inc new file mode 100644 index 00000000..95aeb781 --- /dev/null +++ b/recipes-kernel/linux/specific.inc @@ -0,0 +1,10 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +SRC_URI:append = " \ + file://${MACHINE}/ \ +" + +# prepend custom device trees +do_configure:prepend:beaglebone-yocto() { + cp ${WORKDIR}/${MACHINE}/*.dts* ${S}/arch/arm/boot/dts +} diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 2434e733..6d00c16e 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From 8c73a1e3d8e73cf9b429a3af9cfee2c359e92b90 Mon Sep 17 00:00:00 2001 From: Stefano Viola Date: Mon, 19 Jun 2023 01:46:44 +0200 Subject: [PATCH 084/163] labs: Fix boot sequence and rollback for Rpi3 and Rpi4 (#1) Signed-off-by Stefano Viola --- .../raspberrypi3-64/boot.cmd.in | 9 +------- .../raspberrypi3-64/uEnv.txt.in | 22 +++++++++++++++++++ .../raspberrypi4-64/boot.cmd.in | 9 +------- .../raspberrypi4-64/uEnv.txt.in | 22 +++++++++++++++++++ 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in index bc556402..1bd30253 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in @@ -40,11 +40,4 @@ then env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttyAMA0,115200" fi -# now that we have all the environment variables, we can set the bootcmd -setenv bootargs "${defargs} ${bootargs} ${tdxargs}" - -ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} -ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image} -env set ramdisk_size ${filesize} - -@@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr} +run bootcmd_run diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in index ccbe6963..cfd115c1 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in @@ -4,3 +4,25 @@ bootlimit=3 devtype=mmc devnum=0 otaroot=2 + +set_bootargs=env set bootargs "${defargs} ${bootargs} ${tdxargs}" + +bootcmd_load_k=ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} + +bootcmd_load_r=ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image}; env set ramdisk_size ${filesize} + +# check kernel_image2 to avoid booting from other then default emmc in case of +# bootlimit is reached and there is no other deployed image +check_rollback_needed=if test -n "${kernel_image2}" && test "${rollback}" = "1"; then \ + echo "Rollback enabled. Booting previously deployed version."; \ + env set kernel_image ${kernel_image2}; \ + env set ramdisk_image ${ramdisk_image2}; \ + env set bootargs "${bootargs2}"; \ +fi || true + +bootcmd_boot=if test ${bootscript_debug} != 1; then \ + @@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr}; \ + fi || true + +bootcmd_run=run check_rollback_needed && run set_bootargs && \ + run bootcmd_load_k && run bootcmd_load_r && run bootcmd_boot diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in index bc556402..1bd30253 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in @@ -40,11 +40,4 @@ then env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttyAMA0,115200" fi -# now that we have all the environment variables, we can set the bootcmd -setenv bootargs "${defargs} ${bootargs} ${tdxargs}" - -ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} -ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image} -env set ramdisk_size ${filesize} - -@@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr} +run bootcmd_run diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in index ccbe6963..cfd115c1 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in @@ -4,3 +4,25 @@ bootlimit=3 devtype=mmc devnum=0 otaroot=2 + +set_bootargs=env set bootargs "${defargs} ${bootargs} ${tdxargs}" + +bootcmd_load_k=ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} + +bootcmd_load_r=ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image}; env set ramdisk_size ${filesize} + +# check kernel_image2 to avoid booting from other then default emmc in case of +# bootlimit is reached and there is no other deployed image +check_rollback_needed=if test -n "${kernel_image2}" && test "${rollback}" = "1"; then \ + echo "Rollback enabled. Booting previously deployed version."; \ + env set kernel_image ${kernel_image2}; \ + env set ramdisk_image ${ramdisk_image2}; \ + env set bootargs "${bootargs2}"; \ +fi || true + +bootcmd_boot=if test ${bootscript_debug} != 1; then \ + @@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr}; \ + fi || true + +bootcmd_run=run check_rollback_needed && run set_bootargs && \ + run bootcmd_load_k && run bootcmd_load_r && run bootcmd_boot From 486b8c27bc9281ca7f0d971851e8f5d03bfa76aa Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 19 Jun 2023 14:26:41 -0300 Subject: [PATCH 085/163] common: Fix README and LICENSE Signed-off-by: Matheus Castello --- COPYING.MIT => LICENSE | 14 +++++++++---- README | 25 ----------------------- README.md | 46 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 29 deletions(-) rename COPYING.MIT => LICENSE (83%) delete mode 100644 README create mode 100644 README.md diff --git a/COPYING.MIT b/LICENSE similarity index 83% rename from COPYING.MIT rename to LICENSE index 89de3547..52f1e28f 100644 --- a/COPYING.MIT +++ b/LICENSE @@ -1,3 +1,9 @@ +The MIT License (MIT) + +Copyright (c) Common Horizon Community and Contributors + +All rights reserved. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights @@ -5,13 +11,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README b/README deleted file mode 100644 index a5ad7e23..00000000 --- a/README +++ /dev/null @@ -1,25 +0,0 @@ -OpenEmbedded/Yocto DISTRO Layer for TorizonCore -=============================================== - -TorizonCore is an embedded Linux distribution for the Torizon platform. It -features, among other essential services, a container runtime and components -for secure remote over-the-air (OTA) updates. - -This layer provides the necessary metadata to build the TorizonCore Linux -distribution on top of Toradex's BSP Linux reference image. - -Building -======== - -To build TorizonCore, see the following article: - -https://developer.toradex.com/knowledge-base/build-torizoncore - -License -======= - -All metadata is MIT licensed unless otherwise stated. Source code and -binaries included in tree for individual recipes is under the LICENSE -stated in each recipe (.bb file) unless otherwise stated. - -This README document is Copyright (C) 2019 Toradex AG. diff --git a/README.md b/README.md new file mode 100644 index 00000000..7f2782f9 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# Common TorizonCore + +![Common Torizon cover image](https://github.com/commontorizon/Documentation/blob/main/assets/img/commonTorizonCore800.png?raw=true) + +Common TorizonCore is an embedded Linux distribution for the Torizon platform. It +features, among other essential services, a container runtime and components +for secure remote over-the-air (OTA) updates. + +This layer provides the necessary metadata to build the Common TorizonCore Linux +distribution. + +> ⚠️ **DISCLAIMER:** this is a derivative work from TorizonCore open source project. Torizon™ is a registered trademark of Toradex Group AG. This derivative work have not been reviewed or approved by Toradex. Common Torizon community does not talk on behalf of Toradex. +> +>⚠️ **This software is provided experimentally as-is.** + +## Building + +General documentation for the community can be found here: + +## Feature Support + +Our goal is to have Common TorizonCore in feature parity with TorizonCore. The table below shows the current status of each key feature: + +| Feature | Toradex SoM | Rpi3 | Rpi4 | Nezha D1 | x86-64 | Beagle Bone Black | +| ---------------------------- | ----------- | ---- | ---- | -------- | ------ | ----------------- | +| OTA Update OS Image | ✅ | | ✅ | | | | +| OTA Update Container App | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| OTA Update Bootloader | ✅ | | | | | | +| Device Monitoring | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| LTS Hardware & BSP | ✅ | | | | | | +| Free Technical Support | ✅ | | | | | | +| Prebuilt TorizonCore Image | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| QA Approved Releases | ✅ | | | | | | +| Provisioning with TEZI* | ✅ | | | | | | +| Image Customizing with TCB** | ✅ | | | | | | +| VS Code extension 2 support | ✅ | ✅ | ✅ | ⚠️*** | ⚠️*** | ✅ | + +> ⚠️* **TEZI**: Toradex Easy Installer +⚠️** **TCB**: TorizonCore Builder +⚠️*** **VS Code Extension**: are not all the templates that support RISC-V and x86-64 architectures + +## License + +All metadata is [MIT licensed](./LICENSE) unless otherwise stated. Source code and +binaries included in tree for individual recipes is under the LICENSE +stated in each recipe unless otherwise stated. From 5feee4bfb1afc24a837317d340b4f67a3ae958fc Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 21 Jun 2023 13:27:33 -0300 Subject: [PATCH 086/163] common: Replace all meta-toradex-torizon to meta-common-torizon Signed-off-by: Matheus Castello --- conf/layer.conf | 10 +++++----- conf/machine/include/beaglebone-yocto.inc | 4 ++-- conf/machine/include/nezha-allwinner-d1.inc | 6 +++--- conf/machine/include/raspberrypi3-64.inc | 4 ++-- conf/machine/include/raspberrypi4-64.inc | 4 ++-- conf/template/bblayers.conf | 2 +- scripts/setup-environment | 2 +- scripts/setup-environment-internal | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/conf/layer.conf b/conf/layer.conf index 4cde3346..b1c8bb96 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -4,9 +4,9 @@ BBPATH .= ":${LAYERDIR}" # We have a recipes directory, add to BBFILES BBFILES += "${LAYERDIR}/recipes*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend" -BBFILE_COLLECTIONS += "meta-toradex-torizon" -BBFILE_PATTERN_meta-toradex-torizon := "^${LAYERDIR}/" -BBFILE_PRIORITY_meta-toradex-torizon = "90" +BBFILE_COLLECTIONS += "meta-common-torizon" +BBFILE_PATTERN_meta-common-torizon := "^${LAYERDIR}/" +BBFILE_PRIORITY_meta-common-torizon = "90" -LAYERDEPENDS_meta-toradex-torizon = "freescale-layer toradex-bsp-common-layer meta-toradex-distro sota meta-toradex-security" -LAYERSERIES_COMPAT_meta-toradex-torizon = "kirkstone" +LAYERDEPENDS_meta-common-torizon = "freescale-layer toradex-bsp-common-layer meta-toradex-distro sota meta-toradex-security" +LAYERSERIES_COMPAT_meta-common-torizon = "kirkstone" diff --git a/conf/machine/include/beaglebone-yocto.inc b/conf/machine/include/beaglebone-yocto.inc index 00442414..be26c6fc 100644 --- a/conf/machine/include/beaglebone-yocto.inc +++ b/conf/machine/include/beaglebone-yocto.inc @@ -63,7 +63,7 @@ OSTREE_KERNEL_ARGS:sota:append:beaglebone-yocto = "console=ttyS0,115200 root=LAB UBOOT_BINARY_OTA_IGNORE:beaglebone-yocto = "1" BBMASK += " \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/conf/machine/include/nezha-allwinner-d1.inc b/conf/machine/include/nezha-allwinner-d1.inc index fd13aaf9..cda0ede5 100644 --- a/conf/machine/include/nezha-allwinner-d1.inc +++ b/conf/machine/include/nezha-allwinner-d1.inc @@ -37,8 +37,8 @@ CORE_IMAGE_BASE_INSTALL:remove = "set-hostname" # Use meta-lmp but maintain compatibility BBMASK += " \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-toradex-torizon/recipes-bsp/u-boot/libubootenv_* \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-common-torizon/recipes-bsp/u-boot/libubootenv_* \ meta-toradex-bsp-common/recipes-bsp/u-boot/libubootenv_* \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 24302a03..88750675 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -50,7 +50,7 @@ UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" UBOOT_BINARY_OTA_IGNORE:rpi = "1" BBMASK += " \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index dd38c74e..0cf7fd86 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -51,7 +51,7 @@ OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet UBOOT_BINARY_OTA_IGNORE:raspberrypi4-64 = "1" BBMASK += " \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ - meta-toradex-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ " diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index 432c6b97..44b424ec 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -41,7 +41,7 @@ BSPLAYERS ?= " \ EXTRALAYERS ?= "" BBLAYERS = " \ - ${OEROOT}/layers/meta-toradex-torizon \ + ${OEROOT}/layers/meta-common-torizon \ ${OEROOT}/layers/meta-toradex-security \ ${OEROOT}/layers/meta-toradex-distro \ ${OEROOT}/layers/meta-toradex-bsp-common \ diff --git a/scripts/setup-environment b/scripts/setup-environment index eac85b79..ec31a234 100755 --- a/scripts/setup-environment +++ b/scripts/setup-environment @@ -18,4 +18,4 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # -. layers/meta-toradex-torizon/scripts/setup-environment-internal $@ +. layers/meta-common-torizon/scripts/setup-environment-internal $@ diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 6d00c16e..271cfab7 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -129,7 +129,7 @@ DISTRO_DEFAULT="torizon-upstream" && echo "$MACHINE" | grep -E -q '(imx8|am62|qe DISTRO=${DISTRO:-$DISTRO_DEFAULT} # Create a common list of "()" supported by TorizonCore, sorted by -DISTLAYERS=$(find layers/meta-toradex-torizon -print | grep "conf/distro/.*\.conf" | +DISTLAYERS=$(find layers/meta-common-torizon -print | grep "conf/distro/.*\.conf" | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/distro/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) @@ -144,7 +144,7 @@ if [ -z "${SDKMACHINE}" ]; then fi MANIFESTS="${OEROOT}"/.repo/manifests -SCRIPTS="${OEROOT}"/layers/meta-toradex-torizon/scripts +SCRIPTS="${OEROOT}"/layers/meta-common-torizon/scripts # We can be called with only 1 parameter max (build folder) BUILDDIR=${1:-build-$DISTRO} From 0ade6d2c2fa75b4a8220f76f0e260207c712fa39 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 22 Jun 2023 20:40:49 -0300 Subject: [PATCH 087/163] common: torizon: Add SRC and SRCREV to the forked tdx-info We opened a MR with the changes proposed to the upstream here: https://github.com/toradex/tdx-info/pull/2 Signed-off-by: Matheus Castello --- recipes-support/tdx-info/tdx-info_%.bbappend | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 recipes-support/tdx-info/tdx-info_%.bbappend diff --git a/recipes-support/tdx-info/tdx-info_%.bbappend b/recipes-support/tdx-info/tdx-info_%.bbappend new file mode 100644 index 00000000..58ec1a00 --- /dev/null +++ b/recipes-support/tdx-info/tdx-info_%.bbappend @@ -0,0 +1,3 @@ + +SRC_URI = "git://github.com/commontorizon/tdx-info;protocol=https;branch=kirkstone" +SRCREV = "74704032f3ab1460c12ed1a4a3810dbc14eb0e73" From e273e160147cab0273bc4908cd39500d40eeea57 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 22 Jun 2023 20:46:15 -0300 Subject: [PATCH 088/163] common: torizon: u-boot: Add the uboot,version to the device tree This is a cherry-pick on top of the default sha from the openembedded u-boot recipe. Signed-off-by: Matheus Castello --- .../u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in | 8 ++++++++ .../u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in | 8 ++++++++ recipes-bsp/u-boot/u-boot_%.bbappend | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in index cfd115c1..cf78662b 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in @@ -11,6 +11,13 @@ bootcmd_load_k=ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${ bootcmd_load_r=ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image}; env set ramdisk_size ${filesize} +# for rpi we need to overlay some u-boot info into the device tree +# this device tree was loaded by the Broadcom bootloader +uboot_info_overlay= \ + fdt addr ${fdt_addr} ; \ + fdt resize ; \ + fdt chosen + # check kernel_image2 to avoid booting from other then default emmc in case of # bootlimit is reached and there is no other deployed image check_rollback_needed=if test -n "${kernel_image2}" && test "${rollback}" = "1"; then \ @@ -25,4 +32,5 @@ bootcmd_boot=if test ${bootscript_debug} != 1; then \ fi || true bootcmd_run=run check_rollback_needed && run set_bootargs && \ + run uboot_info_overlay && \ run bootcmd_load_k && run bootcmd_load_r && run bootcmd_boot diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in index cfd115c1..cf78662b 100644 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in +++ b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/uEnv.txt.in @@ -11,6 +11,13 @@ bootcmd_load_k=ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${ bootcmd_load_r=ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image}; env set ramdisk_size ${filesize} +# for rpi we need to overlay some u-boot info into the device tree +# this device tree was loaded by the Broadcom bootloader +uboot_info_overlay= \ + fdt addr ${fdt_addr} ; \ + fdt resize ; \ + fdt chosen + # check kernel_image2 to avoid booting from other then default emmc in case of # bootlimit is reached and there is no other deployed image check_rollback_needed=if test -n "${kernel_image2}" && test "${rollback}" = "1"; then \ @@ -25,4 +32,5 @@ bootcmd_boot=if test ${bootscript_debug} != 1; then \ fi || true bootcmd_run=run check_rollback_needed && run set_bootargs && \ + run uboot_info_overlay && \ run bootcmd_load_k && run bootcmd_load_r && run bootcmd_boot diff --git a/recipes-bsp/u-boot/u-boot_%.bbappend b/recipes-bsp/u-boot/u-boot_%.bbappend index 95182aa0..265e8fa5 100644 --- a/recipes-bsp/u-boot/u-boot_%.bbappend +++ b/recipes-bsp/u-boot/u-boot_%.bbappend @@ -1,5 +1,9 @@ require u-boot-ota.inc +SRCREV = "f9a043e55c78d894db01006ce442387b758e53ad" + +SRC_URI = "git://github.com/commontorizon/u-boot.git;protocol=https;branch=kirkstone" + FILESEXTRAPATHS:prepend := "${THISDIR}/u-boot:" SRC_URI:append:rpi = " file://0001-rpi-always-set-fdt_addr-with-firmware-provided-FDT-address.patch" From 618dae40c67f64cea3a06b492d4d25f175061318 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 23 Jun 2023 21:58:48 -0300 Subject: [PATCH 089/163] common: torizon: plymouth: Change the logo to the new one We have a logo for the default image and another one for the engineering image. Signed-off-by: Matheus Castello --- .../plymouth/files/commontorizonlogo-dev.png | Bin 0 -> 31698 bytes .../plymouth/files/commontorizonlogo.png | Bin 0 -> 29631 bytes .../plymouth/files/torizonlogo-labs.png | Bin 27349 -> 0 bytes .../plymouth/files/torizonlogo-white.png | Bin 28869 -> 0 bytes recipes-core/plymouth/plymouth_%.bbappend | 6 ++++-- 5 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 recipes-core/plymouth/files/commontorizonlogo-dev.png create mode 100644 recipes-core/plymouth/files/commontorizonlogo.png delete mode 100644 recipes-core/plymouth/files/torizonlogo-labs.png delete mode 100644 recipes-core/plymouth/files/torizonlogo-white.png diff --git a/recipes-core/plymouth/files/commontorizonlogo-dev.png b/recipes-core/plymouth/files/commontorizonlogo-dev.png new file mode 100644 index 0000000000000000000000000000000000000000..b649db63ea0f9a2299c0e8a67b33d0447e0cd41b GIT binary patch literal 31698 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%0Dl?>n&eQclwzlKj(Wo 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 literal 0 HcmV?d00001 diff --git a/recipes-core/plymouth/files/commontorizonlogo.png b/recipes-core/plymouth/files/commontorizonlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..2517c6ed13baca6ba55e3f71a31769c708b98ce6 GIT binary patch literal 29631 zcmeEubyQqU(?;M@?Iyl3!aHoC zDC?M{#mpX7q|xp=LF(mfMg+Uz9xPtO$~P>EHsu5ajhjjmh+;i_cAehSh(Vv;rMXY* z8&Kux2;XQyZ(L5CR(@GqX|RYpf9&FT?TO`c_3Xs+Qz=#W6wVH1*UwOVgs*Kuwen5A zfEiHmB?71JMwQ>WVpBb#&xcSRr3jm(YNGZ!Vs|T*i5PMY2J6&uY~k5#%h^wUKH@0~ z8W>}*E@Ro6QE~l=biSD3Uo4*w!ok4@SxZQ$$Vo{2%^r-YRG(;J*{>@2LCWg2RLodf zI8JD4X?xjJQF&of6)Lmnr2>h~zhtaNKjk*?p_d_}`Vkgmu?&3?Xh46rj2%)O9-AE= z=WeWKg}WBibHjI-{?+ROUOcB$qnZ(=Fd3MO=fwWm7#Fd8tAj%P2%uq_pFY53zM^Y< zF)rguw6448ULiG`o( zXrLlmaTxbQ=r=Xg{ucv%!Ec2W$y7BWPl8hW(KnfgZ1TGGE`G8;C9GM0I%OS65g_#{ z`W@PHZo5nb4Aog~HHF-5p@Wr|ZnyN#y+3E+sC$H_YckH9Ma+LEtlWg-V|e+oX7t1)DI_vzng3S=Bgii;otwlWJ~Vz)86RY znm|)rchMZjK19U&H%m~#`bmDJm;OwHHrptCd`R8$aV;Ci2a7|EcXMOOOW1A=&V_@> zRv0inbhC!(n~tJ_fSIE`3&7mb6v*Ok4}vKo9GsA-I|yKA3v{6{1zK7=2vZ$4wNX)6 zn+sEEb1Skbf+T=e*0P??Ky^7Mj z7?HmQ^gp%$Yrv*0s~QmO=;~|+lyU<)xKRHq33Ic5vU~ z|67+ba*8VdXz>REOKW@3Ln|2A|5nq*+Tx#J{oC07Jb7T}Uk3tf{tvqUR{L+>A1cFY zDJlv`I-0ru8J?V^Fx8*_1hOTwJ^yX68KH%x3&%X3Sjtd_2s2rW|I>JnUQm zPIF#1b3QKae<7jlYz@;&fZe~2>JKS%7%4Muc0M3Crx`OF8!v#Fi=B&&*_4};kC~I7 zjf;yPz{kc0cqCh5mZ;bPTr6M> zU~|CQ!Q2r7{^uhNYkQ!&3*Zl)>^ywDT)h13+`MeOe4M;I|E#11bOyt8@efsYHWp5< zhbMmoBLHIu1})%^rosq3l*70YkZ=Y9TpXP>93Ab1ss0R#;!n$eJXVBFD06@dKoZ~r zgb`)q;1pov5#Zp^;9wVE=MdoJWoCnw{7ZdDb88Ea|6A=p(}zOnQRuSPU|9bi4@Hl2 zN*(C*c=vc~XZ=@Yvdvndb188a^zznM9Z!;H<0+w|Y5gB>kgAOL5em?aEH7*;R^ zeZY!>?k`c%|9gFi74VN7V30Ah@i6}jWK^twG0XbLV*Jgm5bOVehtNZXe=#wzc8_H+ z(*?7Htp6~Df8q7V==^{D`AZJ}AA5k2{%%VaQM+p2!mH(?<|Ap&6Lf}8D z{9o<*e+C!&KZ7Zt1Iz=0z(OT*SEG7Zn1y00FCz)}`_FG?OF=BG6w`2@-COWTO?9n3ycyPOD}WXZn46#^ zy&#@v*g+t9G;uWr}T$5nn1N5jn(M+4w}AsVIXqm)ae z(G;N>UKdJ6`L-#3+3}iR^OIzf?JdbBgC?Oh zBjeBS^|w}Nl#-v&DVwW>-AKRaV+*c%%f-iX9kcLum1Gbx!z(tBG7em(chJPYL;aPg zBS;_~LO~#Y$yjMYNv;3vrTTh5`b%nVsEXob0#^W99`N2D-1r=$wvX`}yJ{NxBWZ~% z=3G4s?B$3!KGi_O`5*UC6`xjrxjUDaePIS`ZmII~4Q&GN52nW+2M&o_{1(x5Rl{IB z(baKK<7p8tFAI&_i93xG{2WqIk=S`!*(33Q*94gn>^gFji`2kz+@~{h5P= zYhMtz)``#Xz*twyx0*twN9^iUg_p82-%F@>_)T_ErWavta2ZvTXrBYY=@l`*ljI$& zQsk6{@F)WT9)qEVIO4=gMUjLAQIqH|Ne^(4O;8%8-)f%YuJgq`Ic5rckVc(c!j{-& zW4sW}+oG?xP-+DFmB!EO4)ZyhM&Xu}foyi={FNBuXkSY=n`+)-zf@a4tm!ORAl{zz zE`D!eJRm6+m!9hJBf@V2yyfO zjk8kL$2Hk}wdv)UZ9^cUgP+RUxhX{q^f;O*((sok2l@iK=QWO64jd+<_*h85!H@i@ zdEn}yH?5_{p%38$c%6{G37?t{8Blj~%egCj^w|ZiEYc|8teFRnsl{J-HhN6ZQl~6^f!~xxRe7qrJMNP-azHCt4M@T3q@9?-vO?U&r zlKhl3Zk5m2mt2k13#(0OK)67Q33z6Vu|>YE53V;yNOU_BSU->T5KZYx1@&9R&WZalx{O z%n`Jw&ozhCSE$kK8$%1DpHciubZWEQ0L<$pb%gQ$HaN(QS%H)DmJ71ZRscy1>|`n6 z<4o#pI0S^-4z<-P+LobDREMxX5!vnYfO@O&RPIMoe&_DLC2#2D2=^v3vgYT5sy}il z=DBa7rXSy;kyzTN5b$CEcWM4i0Uf1ZxEg6aMq>?-c05_U<4MS_6*L^`oQ011$%-a+ z(4#N1_-R=wZF+1kqIOnEYV;Y0F!>V?Kabp!`erDMO5o_l@!OYBi)@P$z~X z_*6^H%c#lAJhG|zz2@|w2)uPL)SwU<)ziVwt9p(;&OvAeR3sR#jxoHe`nTP9YO;Wt zJKh%%r=>V9*4n62Em- z8tAdrD42gs&b4-u?4;iFGy(hkUW@sSp8j)cnx0}%0^x1sW~=fVcT3tC4~9ch4|szi z$hIkMQ-+LmqUaG8X)Tt_JZh(O+IzA1Q2kN5>LQ{{PZ?*SW4(hF)6yf+u$&Y@*ZRtX zpc)Eq3i@g;ry8`iV9z;qcs|>~22R1#`77&Pm&qPgyiVhKVm&f(cSB7%Dzev*PT8Ol1k{ZfQ}ChL9l|WPlSP(6`m@(-5&i2w9KF^=WUN*bshq5z-G7`l?f#~U z_eWOZa3*I0UjiB%e<}sK(qlT#=;6s`&wXj=32Ka2nA%vB$ytZx7e_FS9mm2e|a)BfiS6AK9Fh!-}+hx*bhc(d% z!pIyy(DSX4jYcHkNBW1%DF{P*ngi#7>t;-L(A-&JM>)6Wnbv6Hzz59Mm^f-&X{@Q) zGR(Py?%^u1D$OZ%nwTS*=Hm+U)sn1!g1Q@P|}8g zR<8F6T0uVg4fgs(aHKsiXZk=AsboX`ccDDaY!ZTpX&|_`vrDfxdl`bhSqKW$A~vI8 z-5j_WOzQDGaJ(~xEjM+a2(__r6Z4RJ?1XX~l8BxwF8{FYeqk}7+EC2V(tD-?e!1Ju zM;5L8&i_W4?qq*p_JUcnWbq2$Xhnh{HLp_vS9+F^DS63iu8H~7hj%0XsQTQD_jh0C zqrTMWW$S1Q#{`}ftJIAh2qVz z*_g{WY8JK~ss|B1;Nrl@;HTx4F@g&XuShTI2JM`g$5Vl86h7o5U{!uJE8tgzQVqD# z$n~2_@8=u!P8}kQOI2wYg*C6vl{=YK^Fuin?UtVhklNoc4Bz6cag>9M*Aq7wtQNwj zS)RnwIN2~HezGk&8HmiQ&IEcHjY?!kTRsd|pSg{sDAN43s?y}UYN_c#R4a_kGal5u z=O5ue>-1*NclX<89Ns9l6~`V+ndY~9Bv1FGp`*~Dot;TK7$|kr&UW{2AJIgRgPzQ^D2R70qzNpQG2=Tbq^b@#gsRv&r6{012=_g?a~mq7A2k z{NRa3Ihms>G7-?FE`)PJ1K5T{WMdkJw$_~952qE+?SOhe@s`|5m_-RQ7)OjDuwtV3 zbi1Ofr)Jq8P#HbK%9D94qgcJzx!2xdpje|pnfBr?zpX4bL7e|h&wF`;_OQ%o>EicE9(uB8Z|xGm?fEo>-*KrvBB_WuZ8>B^;KY~m>=AP_Sq(AX=^hjrFg0(aDO7Pq_0u$hLXXIDn=dr3Fkt_mj_lhxkr65*5^{nK0mJy`q^U1R{Xeg&?earL!z% zlQM~$$wz(Vhz2bysWtMo>TG_yS|Gqb33D4^&>j&1c&ULH`>SLueKSOqsv6s<7;#iJ37U#SZJwBTkTs@j^_3E0q(x|B+4Y}LGiB=LaMf5eB6;Py#!^n^PH6Yd?-m@1mL zNi!nPyLWPEr-0HrGG_Co7$1GvMV@FUHLH!H7ee zQbC(8Cxorr#=mqJ351cnd5ZYRh`*`0jNrpF!x@W}`Miv7jJwh{s5sPzitHx*Fk*Lu zWMvP<#&4HcZ%}?A8lgHGiR04_qV^w2nAs!vS>(&$WY2Stxyb=JfRd9+e3JMR1-R?S zgj$ z@6DLePvtZHH)KMas;N!9%b9(`}RBu*%pv=d35j)zJ|V z)WU(K`nXLLf%fYCl_ff0Jg~n0C6I+*J_rW%o=V9~aCd4W!n{tjd;*1m5$%CvMiuhs z-Ki5ijWNGhQ{IQ*G zg28#WyNgff!`Kz(wg+Pb&6_Gez_RfACkp zgrHtQbyZRi6Vd1j0T$k-xZ>XXn0}*!!EPyL;aer;?8(i@O_9lW+hQTcva0;(ry~vA zONpmvS1cvp`kKC<59_pkWNm9I+Q_QSi}-p8*O|`OKYyusreoyQ?`tUe4bVo#PMTN* zbBOCp1Zq_YYzSzUc-N>Dg+AqXGqpa1d-tY&O6Yj!gewM$3V48?*2Q0>jvEJ^r;Xj> zsg1y1y!{?*gP^K8*;;ZpWl-`fC0qazs@R)|vOR7I{Ex;ykcp-o_7DS z_QoPQ>@FFqGywx|U9O}V{n%D_=|sqQ&b8frtSOLic&|M4RFhvk&hU&JsD^Pfu4#w7V= zFwV~uzIn7XOr+QfnGYG5$hnfRwyi@BbJbMOo%v+qw_~Pf`UZ)y(%RFsnZd>AU>lk? z`!rn6iwCWo-uX4}FU#l^0;)rMoy#C-hW2igWH`ymjHfkee$gn#fod?vB|5LjW~q={2Amp$93JBd|>=iPGd|gBsCyEDYvh| z(+^HxhNUfhI$pLl1$+Z9$Pdv@C(qZ`kK;BG z@dJDx2;xZ?A0on*CF+rWFQg%LU>IF2O7)K~POiy~l}wgp2_)J?c)BbZdzPddLIQ+g z%9P&d1<2J+xQ%H~CW!bQmTOhceHeheABsQ$3>nhIBYOs&Q&W|K#eFe?{^7A8$K>Fr1pNIpmNsHA*UT)h1l-ZRgyNGH{A}l98EL3%!YZGp>JjFG# z9yHIrM}JWcm|M}tuxYzW>{JJqunS3kT?9LbvvO>3V((O@zRsWaWqm&hw)U%{efR$7FzGXsGJ5y&YenV!e`brQKb+tu{=HpbHe{s#JGN(BG(>RIJh1;_XVd z_7Sz_`uX%Bw?o(H1#N5Wuh8HnDJZf)zcqZjw<`^#BUNdoNp1J!^o=+bZCcjO$yX&E zxSLUw)dgY)u*$C55!69m8W7m{!&z+z?RE=+9ZD?H6OttAz2*()ePlB8p{zZ)FFPk0 zg9$%WMBXcZYC1HtSo?4twNFIXou#*up|;wRP&CaJSmGD2Rjoi zAQc+duCWXzRf5Ni=LnGKEDE8xoI8_`_UGXp%|wX$A=cr?pvOP|cD5RG=@S4_@ibvu z)}Abgt=~9LfJR@3uXeY}+HGvI~Ynb!88gBdvU#c<& z&_k+Nf$}N3Y#RC69WB`;^`H>E$(%|vZmgCj_zW;=r~t5J#W$k}McC_ZIYGFqUj($F zwjwBm!CbLFIhiARsh=(FzcFrEm)~%b#z1A0`xp*a^z+#J-?pxG+R|g%^Qj_hKD|`e zUHg3z0}e;8|0v)9deMrJHOKMW;QT0K-a`j34{MCkz--Po!Q+SL<;MeW`4r-!F-tTq zTgb&Q99Zh7Xvp_6wgy*I%D{SUCLU}6>H5KExJ};H(#D&w?KJJCnm(?DhC}m=M`y{Wj`m}Vo@a9=CC0L~F??tZYy@QML&Pt$$Gk}~ zpBt^v)Hi^SzqsB428d9J?nw%O5V#>ECA{bb((?X;0|F7^7ua143NziHFxXPwfM6l6oh||YIaQuYPwPO z2mje3fW<6qPY3p%;qtd-WY(hSAb4Y3epAsbxaFyt{OSd2jeExVs`7pO-BaeWk3qc_ zOw|LmSW8z|jvn{1zlYnW5ZzdFRe*k)N<=G2auE;-NjBc}ih*^6)7X>O+Xc~<%EBRo zl6;03B3qFOScr1yuRNV2jT^zhL7h?d_nP`gsgZCZ7z59uKT2e1UpF@WPV|)8Ip&*v zh!=>jDO@W<4A|N~0wI3*msp_EkY)-hiBWu$J8@}(P-@M@yuK_x%~MfrFCIPRnn@1% zh06qs19}Ud`t-v3*vfVV#ndw7mq!ZUNH5w}Y(ycjM5zqR0N$lF&}NB%MgOg;#p3I} z=h>;5otLc}$PNuu!;zl{8p{R@){;KVeI%XNbcw80IYb$Pi^7XeLvg=zg&3oy7C_6p zMjqY#AE-s;Vc-2WBW-Q3J++N6ZbQ21YqOwA>$acL-OlOJmE=Olq!NEdtx|-JzD;Q4 z9F9kxpl_ZY@Nv8QlwFm8sK_TuAIr_oa^WOU=5$83Aq1eAf?+e$ak?*a-m(ELj%8=? zR*FAWZxPU3;L8m4$N%+{q^-TNq2Ol}E~hT%_f1)n;bHc6JKQTY73-6$>o%#Mqte3_ zkI5b!)FQ)x-?UU?{;GrXT?-j-Wyoc?(VM|GT?!Wn(r-I@@KSS_o0m9eI3S5&pynkc zNdQD(voI(NWfKcZf~FSD-Xa`pj2Ejr+|IA8{=8KvID6r%<@<4ba?m&O2$IbZYanZC z4lx34>T$N_5F`-vn7sG)WoY+pw=;o;*e!M0mNnfJw_~>dR+%7Llf{0p^X~8BR9;d# zKLbUD>^)I*MK<0&xIi#QJ8cj_d@xFJF~`=8noyq z1#W9HluXWIpu6Bn%1C0sCX3K6cNusyEIX)ReXI4o3gmT;3YL85jNA;PC3#1q(AS01 zG2JHQ;X%G-y5-_XBV%U8`I3zTYy=|s`of()zP?8#yMHr*;EmRxA}N9yVZUKmF^OE#J(F zVm1AGNv435ui8d+=)+Y>80JZ^^SOOJlA`vlrf}5OqkGN~zyObmSnc0S#Sy&0K*g$J zEa*ybG!4=&n1ocROI^OBgPE@Mgb$YOAhkD@sf}|H{a%qY)Rq+vAr~IVmnPJ2xSNay z7w&*N6YY$eXIXrn4}eX3B1|BeFr3w@ALbnTN|Ek5U1T6?hkd{BpOBbfSizh-H`B{ zt1DS0rCn3lG%{uLY2gl|#ku{m2t@RQ=V7)J;(Upeq{zy_q1%N-K={JlaaQZ?BIk?t z8`+48*`r{(LhUc}Z{pJG?v}=>>j!N@_IU#17|~cZBjpFpaQ+Y$)PFksf*aT}_tL>k0PyJpkAbfZH_j%wM~cfG(tLBK!o2Evovm_w+JCZXt!?a_@3WpDRdtwYIoI;> z;`g0$*n=>J7Fq@uu;E#7qLmS-Q+kaK?(sn{j_jA8YrbIPDLXW83*(qcn}d#duti-y zdMi5i?7v?QT^pwR=AJFQD{g;Ott%!njzOez5(zY&ixmkCY2sTk_kxrw}BMpl>N z*N(@Ak8ci|D8jVOp4Um^6y>_?wpnitRVUU!v(w0O%UUeAO$gZ&$Ft3v_jz%Iw`{un z8Y*C-uGR*>&74?Ba6bYN4a9(|dvHaa|22ljxc=N__uX}p_r*XOY|UZfhS}AF-h~U~ zA*3jx=ocyO%pjAzCRUU(lmk-ejs|SHZ39IiLkfKga(i6UJL9{EF`U@R$M)}2jC6bD zn^O53@^maFQOK~o1yxM{7@1KY&1~nDky<~u?-K(fEuC?tECzoD z?~G5h*Ge?HLF?jhwVWm2roQe2tl~HJ#)8VRWrJNU=J&ee<4M|L)==wJnkxOy;aZVW zf7lVAZ@FFMjVlK&jwukJ!?GT7RH;;*)_MSARoKF7h*nK48&u&M{%wQOuK#ICZVWn> zt7Un1w@eceJF6x6LE_9sQHiwv`&x@SB=_$NZE&enRDvVFSGQkLp~C(CwjgR}0WQ=o zsB1`j14OsIOJO>AG5m7;@*S;`BC=po)}nHz8nWCkz25g01E=rw_3}?fGu;Z3LS#QQ zy%cM4?E-M|F6P1H$%0A<-2o2@8C`hKs&&Y`awxsQX~>qo`}VUN@h-yBIu&0koUORNYV&D zn$r5`Ow*@m7BXlkh9*D$7RbwNOi5LxV?h_tP35!^pR`mzL^iKS2VtG}Vcpryw15*F znWrDtJh&HL=2-UC+$RV5`JtA&R>U$C*sS6Q2+zxrO0VG)G;4*2{pD!se|jgHu_~^k zo50l3K)jx{!-ZnBwO4k~N)18*C5P<60@v!vFE<|p{NR1_poS91H^OK3E~~_D45^%I zt1bbCWcbC7@n|gxS80NOau%}|6*d(gffi=|%815z(QR2*4CB=8WG24V1^iwKKg2eu zlP_=LE)#F`C02LE&@HqJq+n+y{_I_UkC$)Y(`?L~?~<#Pc7;xHd=xOS0Lk}j7+G;> z)F6I<+YJBy+REXloP)uJA5Fy@$#gPk*_N=pHPI%H)6hiMhXrEhP7I6r1Ge&#W7!+0 z_hsTV5K;eY@6NTNVMe=+u;$MJbA{SjzDol|gRsOf)-(nmJIxTzwDlUpcy}0s(e8>& zI$r@0UAg<8&WmF%15tuca}aN`sz3$p=lPxPX0=PHn_mG$Ca|5;Sby~*?SgZA=jt!> zcS`cPRA3Czd%cg6p$JRygXolsb(c<&!+Dw~ztz$aX%!sl{q2`mrYkAE)od;6#L_yy z%P&F5ZV<%Q-C&3#4L351SwnG%H?h#%u`L)Pj2>2X6rUNu`B_kiEp`tZld9y&WYrRh zL@;*t;yoZZ#BQoo86= z2S8&X6zmlF*&ygxZT&Kz#6xTT&e0#kKSwGzNvx&ern-GF^37Qdv~^#?ofL)vTq}aN zl4Lhe^>({6qz$V*VQ0`3l&9ny{RbA#R7-82Kj8%fUoe zm2hgI2iIf;OC1BYpBodnhSQqcNsc9D{NA7U>4~dlBq^lHN%f=CaL98mO?Hmz{i1Sa z0d2|ioJMv|!-IR0^3)iL##sAv6F@sRmax37k znFqkOnY`wCd_wPnd0lWnNh+5ebAISYUr|aEIKuhaot#tIUO8SYJZN;K1-@8PDOXyU z97xU?oJBoj7-t!uav6LUExg^Pe}e);hI6NY;!tJc3}!?R#c8AYq=RPkD%va=9DeDl z+0^70uE#7b8$^xinrrntsRlh-i{c*>a@KYP0~)Hf=V6RDB=J?syzdsG-;fTvzV;hk zC`T^Ci!Ml>A#4j8*I&y?=97=7r;4bXmn7(O?~Oq(e@3wKK5Q;xC+m(dpf(}*?%!~xs3S@ucCCAA_q5i37C zkq5Wx3dqlW1lp5jJ$Pnz>w72+!1xQ>j-+fdMz*rvGr?h9iz19uXWoxBX>3Q=Y0?Ep z7hDK~p;R298v;RX2)Az}S-=;lJeFuxFh3?EcQJVd?~NB8FXO_U97)=AQF#yvTe~Y{ zG$HW4>X3Zj3YuBTUcsn#2CCIT^A^aErLnI5!w2bf{FcWQ*mV9c7V}ivDDg|dQf<{_ z-Ttu@d0$o#JAngzltWp6T~Z{92>fkJhh_@}Q8jzve(a3VkOWipat)6J& zhtv#DACdaD>$zg*6`i`qOzV=;+*uep3se07)v$MUzdPvHKz=aAYlt5a8%82MRTIxu za&_N=pJa>PFPsVk$uE*!q&c<%{&MXdkvOhwXSFJbDBR1ckT&!NT=&YNV-|Vhm2Mfy zE9bY~ooUeyiUye0Lb05@O`va{?lyZ|&SU`(5@<$rVKt3tAE9TL4}6ad^*Ixaksh>WBy1-|e?$iEP%3$gEoH6$11Tk^y> z3$U~imI{3HmhWJ`pbRAA<1Yp;n~qRuDt!gmPm|7H18&F@>}%Q$%)hO1ee3f2!6dJ| z=<$mjPY1ljg(YHxU)9w+``4w7?0gwDHpcI>x}kewyUUkZ%Be4%smt-7619yR({!@Z9%J>O+tt_$rf>0>ed0H zztnh7)2*~5iXG<a&^>J>;EV7o0}2iA%{Ce7G~7>B=w{ALER z9|>#v)FzRx>st?VM`^7KsfsX(%OAY3m1lm8N2?sqS2cz?x%Et(eXxQvnPoPw$^8N7!qBETNi>D|*w;e{U|);4#_u`C7l6Sr94NURz_201{1@p3$50rgc)G3b^bYM8W>s97C)(R!oF-9-<9=7 zrVXQvm;9ZbL3-q_?XHK#PoiYkq&G3Bb=t+K@T#?!e(@!ttHrti&Kv|K~_CKs289q=grxx z8c-fc)PCh#qF4iGrBOhu1`D6VLdf3yHnV{FLk>H4`3{Ja+!JZulz8f^#JCpL9RcY@ z=W~fQl?{s=7foP-p?A5>Q1w4p{n`As5+62&qPpVPeA;$E{%XdLCN zcRj0e8|YO;hN4%ztl(uMr}KAMrdbBydc2iHd8*P1H^{6|5re0}U#l8K(g01^swHV- z-$YkrV#%-Ii1L5zfv`8NCa&{?Mp9m%d4TGj;mnkd@lU?t&6sZ+1N#SnnXTC1wkor< zn#2>zKnx9j1Y*wRI);NGXWp{Wpe;A{fcOKevyMS`00m7 zQj7}BnKbmMF?`BFIg-zpx^T=PfW~;2WUv%u<08irYhl9CgK|INk`CkxJ)-B8KAS2s ztT77WSW|XzAu%wbcQ^Q3Si}y#!fJJ#gqwVFsd;^3d_`^Fwjvokg5!Dw#%t7|Jkyahg3()F*@gjA6*-28-Fg9J zD<8BI+k{5LRDP|a;_O`gg0@;samUxmX;B)W!1ldd@26R_1D^oA>Al_Y2L{I0>)XVK z&mMT4W^iRSH(*IRNA)>sbheCvdx`9|}?$`JW46+n- z5z5XXm?@3rSExPmyA2qd(pir829TarR zeT+*qTauyfRF293*8_+6OwDiMBp}6qb*L}(D!L;tZhlH2_Q0L?uidxYGu~*mRYN^c zFs%|k05WWXSfcjKLs$i~A+xB`ePO_zjZ`}cltYsMA;Z)Bt1m%HmBE5MwG~+tE$ES4 z#N_?868D*D9RMG*gu#}{bu-L{x9wAG@874<59t^;sHxGM@4~L&uUXV;l1x+`SS4rBP2;8*E5eD`A|YP6*4}dP`r+q<)+3i&;y% ztHi(S(@r?#4a$qqbzV_<8{oytHai71!f{ve`#Enm@h!QmjqFtZaZmr) zluf$SVM@DAm1T-$s_}Ub6o8ZS!Q}RzHRz83aTZOk26IP3(L>)V%Jp{GxXV*rj2CKl zt1ya?GGqQvuRi?mW$uT}FA zsUV}kGSQ{CQ{aPiAX(P~TXubUA89pSQ=)atn&4-KD8Pkv_XJA&&m7fqiT8F*eI3bY zLm|efvH#_BBkec!#L8!E$zzTdK}|m+i~eaaqG5C8%O*#vhzbAn$ks!Y6KT=kC(=t7 z2#h4Z7soD>yQj(>Ty8L7X-FU7nx-$mIJQz``YJ)|HOt2Wx<9ek(^CF^y*Ee&1d=$= zNYF@?YGKi`2)raNEzi9#>~nJ|9r7G80tMQB9_h7ov?M;Q*Zj7{CLw^RP952F; zLTNgZxyy?eMcUD7)JXQ10=NZb;?uL@IxymOBU3Lk?f{MO392ES2KkgPe;?OpWs#UIZbR+Ftx*Ndcx_JmzzALTC!bC$@!{dlL|=Pm zy&%bWty)g9|Hg;?H29-i-R;{_9Pw!b?wta{rlNA}U7Nu2&!l3u63d<_7wc%l)XiOc zEmPmhFkt(6U>4t3s<~R9w05+;BC~x->`_e$x~H1dMT6>W*KP`lgK!pmwN#C#&X|t4 zj>wM44p_5Kgod0mNiSHsn)o3Zi_<{d+)lxn)E=2tktfk|krXx56&Mv@YPLvQ?+6s> zZY&JSK;QUrqM33lZ{H`E>eQgSC+_eUpK<*{!51DhZrVsi6}8D14JPHRP;&TIqVMVL zM(yP7O(ZXK0^Y9WgqTqT;sgs@O_03Y4G={b<`NN&y5WfHaq=L5NU#k>BA>##KT5iB zCp}mb>sBwPZ7If0aI^K^Q}Bs)gT0_+-=nufP-5v{Kmy}`OAo8=-Kf!8|Bcjl*hX?P zhovs^=N6n9B6kQi)4qfc?!{KO4AU$YWgw&u)2DG#rR~|VwaN1%x+A((Y<921_{tP2 z**n)SdzCzr(rRscer?@7H~x2|Sw$p*^no~?a7IYJ*thWRIPQs_G`5)8wuvn=8kJPC zEr|Q}{;BF8O?E~`{iZaqu@Q0cO>XfTkq>WH#4LG{ z-cK<31?!jDEq#5}&=Q~H3{LtWbWL^ed~yr$h&c^ zohslHWzF$L%oDL?lV!Laf_$wV&HU*@K=p4G46=^r^k;`ME3#{uHqqDm_tV)T&+JVr zqoQXe!il}`7vMCI&WqzBy_n>-XFL@?#hm{_;6hNLKBgPv|kuK=f3sf{% zXD-I=gZInu6z!@nC(7o0R={yId==dL#&P~;$ZDD{r1YZ8_G%b;&Bzg`NPfC`c&cN= z110bBCUZFZT{jwN+3%^MZx(6^#)vvnu;(IYQQ zoT|{`H;KL+@Oxp=qeo6F-sAU8DpYA~4A0Zq#3UGi@+xPGYIVq8R|G{P;wJeGvW6u4 z>X-7c1N3XCq^l+p(OB5?aYF!(s+e@4 zSKl}&H7&}FxRIlY;8{`bLzneTQ0mf)b`sYFl9F~ztOtz<^F0&O`?hhdS%>z!8(X+? z^{hb)3JR|5obi-2!XbN|a<7%nKP70XjY_4}P)}3*pkr;Bl~vm9-BJ*${dvoj2|r=s zwmG_YVLe-|`0G;6{8rMrQFrf*+wMER7I0@Kz1YmKEP7&QTT8H5wg2T&sO!rk?d9QL zx#_FfL3N9Lff~35O$?EJ3Z1Km>+R3mLjx%qy0`K_;2_oV-Vb!CY6mY*0sYX=Q@5N4 zAW1`VF^b#;99|>_bq*GukgvBc!(G7|%BMeFWS|}Ua!tR~UDZdGfAKWzZ==*V0o0)O zF`1LT5zx$jUN_h6uCl24)Vuu|Gu!G$k4A-qPXp0&`&Q z*f}3X$8crd(y^MQOb%SDh&zj=(csn>Jw6+i0!(i^bxZ^+5E?KW@PHUZOpBJ{eSES) zrRgCj%1Gg3)~b?<)e+AZeN&dzfy(&eF9L&N4exv%KW^&fu+0+q)k&_@TvTH+<0)Ai zXp1&E^u$@$>hGke3DR=sPx4IU-3tUEI>EojMR>*g%`6+(28dHgs8DQ+tN{8s+QkZb z-kqMiY(!1Z?Y^!*+|nIiNV1>xG2VN_2xXb(_*-(Fn;L$) z3D$w2x6qd-Vq*Gc1z&{2GKJfDGVvy~0vE(y^-dOu7AI5NC7+<(mn1v1Y#*7acEBse z(YFH_$QU}FTmJ^}f}iY;j~>ec5+uJ8Gykf`*+kPntH(8+wbz(t=p!+q?j#HDZV~u_V?sL_?O<**LTXRD_GaohdrGmd_R2f zFKIw{6;Y=|mc=V8#r4?+EjEPTMX8(N-TCYIZcRM1&k8uB*lx1(4nzD7!>I@FRA23* zd{M!C_x;=HCIQjT8*Peqe1hbFqGyP&7zaM%@HMj1F55A3el0|=QZ+w&;lsYiBQsJf zAGgr%psRF@kyCESiR(?BZrzR~nfzpO`w3G28PYp$JAn=X9{R9~&|?FM+l=FZfV20i zDhmocH^eVRoae)!JI~Z$mLhkQRhsW}#fG&KL0Ip;>g8ToLiUT}LoJOt+!?}Q*Jo78 zkhLv@sX>nqpGzsX&`JEI7|19=NF4=}@7xta(=_n#D=Zh-B5djcUAoMS_l9{8cDeV& z^_lzds!~tvZCfnzBy!1>5vg1Qw|kz5nQ!BNvPNQ@cIm8HtKmCJ5lh@JtjnWHL$b^g zg>Q*E{WxtaZo}j}m~3%Wj&Oz6A>5(!x*>u8s5;i<#Vohi(8ROJ^OCU160AnjkqE?aHp zH`YxmeIb{OgtA%8m3c$~Aq@)69TwBry-qU=ZbGdHv8T)vWkIx+Wl}i{l%3^LdqV z6dfRtMfdRrRZw(!zbtKyHjTMCft=y)KQ?~FTGrY#7vW^VWF6Wn^{m*LW5j5(hL?JO z;Z%9nHbQ$s? zmBcBYo?~yUx=~L@8{bvp+pZeWOE>h95B(fh>tO-BR{Xb!>iUkx4uZi zHrqk1@jj=vIK+6+o-)bMlQq&Sx{LRNVf4J#?EsVh`vnY&U#hbiVdf!zbbn=~5w}QT z*AP5wGeF0DgmQdj&8y2emHm>4TE?HYZs!#NH zSXDlSv_FqD4|PdShz?qPY}r@E+kxkEh3|+u{_ydgjmW2LZY`-}>iCS?1I^t(0U-0pS&k`j}7}+!?UCFw=Pe9A6JhaX5jhChK5zD<>Js|?-0{gIZiI&E{VJ{hNyXd6aO3E??vaxJKwB*ME2e2RnA&! z0kzR>fcX>BE7IcCO1?zn_HY1f!%Dz<$d48_ccl3S1ZEZtY;A; z{fqo;Sk)AAIB;}p_}oX{dudCz!RA-Yx`C4bbdTDyR*S>BG(hOMck-F$!3|M4m(kJ8 z6b7DvgY^e7+SGeJ>;v`f+AihcbZ9hnjhce#nC}Nj_RhTRIjtGBA&Q->fiweBvF0gZ z-0LntA<6DWt0VPYTJslKl`7NCH*q-%Rk_sC=0y<>SsKhV=I$Lw)8cpQJJiDECdFB@ z=jfFci`vOULW?|vU#L?4swwKG@atB$i;~IptIca%zrsc0LmE-nI4*K)@nJMexN*Y^ z#P{g$MG92N(kNb<7M%%F*6G#X>cL`c_b#Gnsux+z+Nc|@yf2E7X1n*Kp@MbIYBJI{ z3AGlp6l=XuE!mc;YtnMVGecw3RQ(2eBBm?&!)psWwpyLG>5ua~A8#FHH?*^0O0Z82++^+C&xpR;ckVedK}j_1)~c8Fpv_V(9THTp=jR3fl_~YXZ^-L<<|yA5S22s?D^5GvMVl9>?`P-uf9iMysebNB2){wsuFVWKk;IF20v=O-G+P z-i?+zFlqpXi`kf-FDFhQ)ltiUyAb^4$X8owNgnt8kJxdIs6A@TTxC*m z8D79TZhq+-TS9Mnp^j(5B^F3hWx=2G;TRz{CE%CDp@b`5(~DWtCLeD!v@%B1t6oph zwg_Nu9Fw7r)OBu&>2D|d$)aG=#TQhy$@O|}E);tukC?>=wa(3896d6$ zG^Z=|{Q8OXCo7H==+%d9F(Th-c0Or+VMuZl$hxg=GL{1MicmTUyFDh@k;d+Q?AJY@ z<-?w0BQ3!L1pK9i#imiz^B5S@%Z5KX=o_31|Bx;#RQryRCOr9GB~+cimvHdhElA_K zQ6=O@^qj50M{!zbVc%}>0)SmqfVZ^D3}M54aXMD1WY<*!iKc|q#9PwlkDWg? z0WDx7(iOIBfHQ~|{25a7D$dy=i_SR^e+jNX(^{4RyaUJSy+*rl)YnkzBsN>ee&p|H zk!Q8Oneswu*!gRh<06X>yND%)fljg`abnLHJCMIQpS)z6;U^W20#J8>A6IMBOqu$> zhN?Qk3aEOR~sEL(a7rN+D3cS24eo^*~zc3V`y($WZe^|cTb?z)@}UDt!>R@n%TZi$rF&q z(neFgGb4c=XGayDBp>~xX07-V`GtiGac$;(a){~Qa9-cHh#t-wC~DGWa6mnjGPlH;cX8ZgA^!FA^`wO5G!^ZslnXRp^Y zhc@V&)aF`kJF#{ne}6ug@$8bs;lYr6#F;wK&bs8{3}fnvwv8%(-ZIsMl8C|eo4ax{ z;$GT(_7iqsHd|^K#EkpVNbGW1TE{leiE!IpCGRC%g)P^i=1@BptLbqM7N=Q7lsB(z zOgaGGY{>i_cxWUmuu0OTRmMwOA_{5xCHh3}CXhc|& zQ`F7GY4Y&#vlADB_o`Y}4l&h<^DzX;>ZILzlRXaU7>OpA0s<7orHo|9lU=-CUbjn= zXB2$)+d9l(pgC~_IA9x>-?&A`Z1%vE%=0}WESpg-xHXg&t4;l{lgqjRyajW++Q?5^ zZUmWQ_=j)LninTt<`t;~>7kP9fZ(UO0lruzB->>c?t$xEPfN`l$u_0A&lY;jCOBa**5-VTyYeXf0@SQ6b6} z=Ic9mJ*CSub>UVdoEdpw=_gP|=Xx6=Z4RsFvo4PFkICY#)t)D*<+aX~VXW0x)N*5+ zybHzXeH91w+@!0B2rLdUN_s6Zx@N-bNFxqD_JRN9ZQy$kKR^KWTalk2XppN4n@AS?{jB`%fiD-O-b2_?$bJGyY(4@vJQQ0l`Jpc+f@_xF? zKhYSjlI$U*X)QYs94=ifmpFw`2SwuYe0mX2nUGu~@*l;)B6uFfC>zqXv{507@vZv_ z3HewcVkkvqhOYEP;dL4iPzY|BqPr~)B=P4p76Dy^z8}PbML)&qc=t2!;LooB%Ibia z1v=LvAQ5~SjBjY=kW9ME`8*hJe1I`-S`a5%{2E{wj8ECe6h7^Az7hBT(3F@H3t3Ik z3V`xWIa}DD<<9#xV6N6O4Il<)I4&a8l{|~$#jd{ zgqCQAsZfnh_30+b_J#5C6k%?KU_A@+ z3(RegvCk?pn@_t9&xrh`g=vw&_!s%DF(ET(+p-hX_QYS_>eebNO=k$fdoV>~MOl%$ z6iRl92qhXNQE2F0>&!$Rs;A5l$GB!MN&$g9i~uw{%sbwLilJWZV2X9sJ}_bBmjSh3 z4-8hpy6x@_ZDtB8n?00OQ&p5T=AOF?%^y4jf_J+OVTaiz|1IgB#eqNAWth0?fIrXe zA+))BR+oVKzyU3=IXN{{y>8q?sQi@ac8AO-px`vHX8pPQ5TTuJmqS(TcAXT}*UEFu zDTTYvM)0e$gB+gpV=~~p8GN5kEh4`NJZ0V@ zY|!?tiB39y3WYl~iAe*>TEL|pAjKcC=>VL^5hB(Y*X`uj%+Pkd1pGF}m_uXkVdkph zo0~3c_Ty{5bYb#_H>#6xi|u{CTY;-^L|LAPG0w&3KcFXRJs&;2?2@DfqmKTt(Jm zqYz;)M>n`YOt)bN%XMHXHpL1@3OFO&G-{dY884~^w)_Z}i#a`!6x@3Z3C^eQjI;j{ zfMSdM87cdx>FC-6X5V7O*0Ssdw8-`bm!<$Ca71JoG)Lu!}FD@W%ABy)=!J5o(aLHa1N|yl1^||lti2})|ovcXHAz<$As=+`sq6$a%BeXbu7res9W(a z>^gsWRe&f33+YdpSlOrvy2aQKaVgmHDeAPBP+H8*hNFP)h62ic!y}3mVKhhUjFdVP zOp{PQ`Rz5y%)n$sm`cT*I1gZ<1y4iR8?RXwM#&k$BDiK$uFsGs*pr-vQVeVU9yyQ% z>h3IsPeXT`B(1$Pw z2PK1|cNhHyNg8hcae=3RGVfBKk3_D%v-#AY=M?<3%#Y&266kHtTM>bB?_i7vg(?~# zxR#jed_7ZMsG~XBD!D|vP!OtmfSITnkW^(m;!6eX_cA6v;qR~=K>dns$_;c_Y`^A4 z;oo8xa>x~^fYa<0uFod zB&>hrv6NwYz@^GiDlU9yP|1Yq&JM+yxzqXWlHW?Z&t@=mVJ5%~>-JM~*zyKngEGjB zOd;F0a`E;BX&AlG_qMP1a7%m* zJW8^M40SA`gnky&E!`fjAg_YGeiq~@C3{e~A0wnq;c(UND*M@>`XPj7^_JFh3+mQz zIR$Ll3Dbv^iWu8s`+1pRJ z=$Pf^dv4b>J%%}r1-oP>lxKqRg7mu!#|zvG7XMx}5+V}7_bb(69@nk8_`6kwG#_Sh zo^JBJ48m73yk&^5T0c}G1QpHZ|H7QwfG0XCGt`(<_E$&mEDnn3aeXUzK;taNMjOJ^7o{05>ZREd6X8^?~VUfg1V2nv9EwU<7pH@ zVbzia$Qo~}UY|n^mz9xgXUt9Qy~Lj{kclc^zwy<3pGo9#8g0j6FshnGM|0}CK7%i@ zhXUwGw>f}iSZ+zWch6tIVZFET(Z}WwBDBG^%r(?@^8^+f%!b9mFSXDC{WV&Qwg4J_Sv^?S|vS- zuZg?Q8f}M(1dsHaEJ{A_#faOli(MRqdQsiLK@gy94(t1q*KG`Irih4;{8|w941#3g zfB7^QIEYiq92NEN8^4acG)D#C$sQ&7at6IY^n{3yusg>CHf*o7H#DbQHoGGo-&tdb zP$oB6^bR30fYmoDApg~Sd>9u2E(G1s@4<7%-03L$F!u=(v>*~ZE}gVnqCgR3T(Bn` z$<1aWI<4cd5z>NCGI2SL;5d3%5cRy1N_r%c&E~2Mk5++RCX7``VKfTyLVndY&%aZ$ zveF+hF>m*qkdf1{3a&3JmG-TnVoS^V;F7k2X>v)$4edhj>jD^dFv=gTF^HkiUP6n6 zo(R64XSw&Rm44K#iJyNWKi#g^;w=$X82cmf)mT5iCszjwhWK^jq|@( z-oDHWGXic={%x#C7z$-pX{nEX@{5LVQ}i^5t~S)ymVv#v_04+JY2-&IWXgm1@;C|B z*zdZ_*u|iJFv7LRgPa^c`EL&ZT%`wz1BsZA+F-tkwFkmaNjQJl#Kis~4|wEQ<77KS zs;l_vjX7G1Qpb2|zRCfo2%HQY8xB;<$D|6zN&HxUp$8M?ohx*b-DY34UzMA9{SIYL zvuecUZscI7!@dMEcU_y!6@M-72ox5u?qMpmmS52+rNA>0XH5f7dh?=0?zVmV845bu zdLVSBUZA~Ey@2g9_O|m_0V1sE`_bFa9VO05lO7)u`3~}lAnt0?il0CsY z1Qz#jUx~=}4aq_DG>jIQ7)f z7?H4?uZb@{6O~RvI{R_Z<(uGk^dQH|U%x>uU|gJ9B@L7v>C2CqY=H9^L@QvL?O}1? zxJP%rUwkseY^f+S!9B`!K3bNCdfJjCCf3v>jGTYnezl`o zy}oX`ALjAag=>l@xx}V3u{s9w=Us-;Su2>_ z8#wG3_w1OOzZ#ai+-6poywO4F@(#p2<-Z1=aK~6jlJ7|1&y_~Xo3O1*xUNZF?5Qi! z+uU0Xkiqy>#1J}osz=tg6dc#i^sg6wkAE8d;HYtPQkrPmKZ7B%zJUX4tK_<*@P6~B zRWXuf2Q#P~rPA-E%;V=y*Qx$;`t0;1G`jlV&N-=gLC?D@A8ob$ZPH2}a?JFVr;|kV z&h6TnARlc1#B?Ds7CU$V^F-&kFg17pG>l3$b5{9m^4Hqj+-g0nT6YhgN2w*2+eLZR zl@)G127m^Exw`@HLD8l>FeD_>_;adFsr!dRc9h*--eoQr(J=fokhleop}crFeG~rI z87g+pS%bQj+mX_iX}s4FShZ#aIB6G%RXhB~!`na2mcC;&)tD_0d|KdDA2@zK_?poLdlvB4 z74C5TRl_YR=kCL#V!x{&G`F0l72s^h&INXKwj#;$LMHmh>41Zov#k zuNLo~Mr64?rCG#4bnsllLj|(ehUBVNSd|IF!|y=xBmOoGU_`eq$L_nKWK=x+EPQef zwV9#i`c@hRJh$3vLBAzzEWNn+P!^dIiigYC)|z5YDRIJd9J@5pmt~3h{-JfVg%T#i z!TA2$P>-E|?7~#`9D8UvAy+!rsx!vf{MEDY@lLx3y0-n}sA~$RM~VJhKEhKy(XCoQ znhd=GR8Cg<+3Hfm0-S0g)A!`l4Nj-lZBg7{@c8B3EeolFhvO+ESYx^H7o&FnZOMP) z+7sO3y%lm;3l&xi_~e)k^)|{aODJ}{ox%sI4*A})5pKHP0L}y7R$i#ofV^AJhC<1s!9*LD@56Zm%90KN%@IR1B$(-G^bxJvBwh? ziW8k{nm4XcfBnI#%HduN%97}QqcNhm2Acj~)5q}U5;Ks@~mPqNewgf^cRwfZEH)tF&t=${(Og-dR; z0|ET$1PSQwic+S`@@0qUn{G( z2B@mb8Ig>zuLIetJ;79D3SxnT1B=IMlXH_r@IVQxYyVChY9FHFlvXb_0j#B)YXlN; zc5j0Ek?M9Ca0*%arnC~C07g`0u@TP(c%iD}QolDLNHhy;*=f{-?Kc%+#~%-b2h|K9 z$jiHy1_?tyOCxog3-EmMF~*&pT(fz;Ti1c`HStwKO=OtM3J-3N6^eJX zaf4rYLOQt~>vXt@H8u?#cX4)1*}jMXhf~r)hdWTQN4P;hBCV3&cEO*I1^bxuLh%$v z!~SC-KyRQpPdTWXL_o%jAI4)&rKpXjC~LO&XjD{oH*=1~_Hrdl!mb9{43JcaDs+Yw z6E2J?(gUTo*>{bXFnSasspnI>iop3*-yD{m>ELE{0Iunm)cz5+4DTUWk$7G0z+R1l z^VDkUU6&p2EN~9#dx$x`WI`JA=k?EqUJ9<-S4=%25=4QZg@zITIT+-)4$L@{22XbQ zDodeLASg@9t$%bzto2bxxUj`7lI;>6;L1JW#34Qvesb(0h#RSZ-6n{tf1ML#u??j)1<%wMJrOr{WjA^qRdf{o zRIkrF-^G6c0v?ebD`)}){)Hv(*h3`dbmID3A^f>^jj5dl`g?(Yy*_}YxA5y)8bNW> z8W`7rec8hk{zN$O@VS1Cgx^5}kpNgBC|nTB76-l1-FD}&9#wMImVenRy-Y_W&U(FX zYXNjSLT6Q66+5pq&|w5qS?}e36KL>D=nh^4Jh9wW6cnYZ15e(_<;&UItMA@4_Syhu zJH0K$J64b+B;+#xy%B(xqFH1d_S`1xs{=CyVy$&_Cd|PQONv1YB2So;56lG!rskIp z4(bxvQjptk{MY@_iFXO(#B5+kRoLI`3ONwP zSy`gBfpa_h9@e0q(f0A`^>~_yhzA{oPyznjFzPfVlx5YiQei$IPcNZ4V}Xg zKGbU5-+9-28G(+ISU?E2_Xnl|kAr{sQYjOH|mU^8K;w)u^U# z30O8=Or7P}%DEH}PVa0RSY_FL&$kjRK(-zQXLUxq_1jd|tXBip82D>NHg2-Gc`kp{ zNAN^)b>TH6%wsEILw%D-wAVZ%f*^B5M>a>hL;XZQ#D1tH+Z|-KXFGEM8vMuWM9f2E zK7A%g;*?P?(f;Ea4_@eH-7UKD1 zYHvJF{$!pWm{TonY|Aa&)MICH&}M3qf0ct}L=nJ=%u{c$M%05uU7;;qs0$B$T5bd~ z3@T0Y#{AtD6ttJLRVu~~qkJ^pXE@(Z+lO{(0>)P`S9<8>t~?fP3}21Rm=$dxzc4Am zw$$^y?~Dq%(sB2&kQ|+mc0*}@>SOQ}T4Knf-Sk-8qQI>muDf#H2o``KQPWbSF@h86 zHzpk0eyxM_2uM&lJ~


KSXeXL(&Kkgk$c_m<=jtMUwS5q3bwH*S_Ou$=x;wRutL z+i`(X)tbKj>$XO}pv~Cm=Wo_dWQ!5ITM(ouWUY;Z!++%=^Us&Xix&4!3O1OKc`LXq yVf>5!i=LvCPZvESC;lIag82VaD}8-@slEN?z1q!a2I9jTB)VEguzC%r=>Gv<%Wqx) literal 0 HcmV?d00001 diff --git a/recipes-core/plymouth/files/torizonlogo-labs.png b/recipes-core/plymouth/files/torizonlogo-labs.png deleted file mode 100644 index 84d07beb07bca7097ce0e79d17eac6f9852f58f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27349 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

GtVW%CSd6`J;H5LL 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 tOOcPDt$?qCFM0vE_N>*^0|5F{{dbxEXx1@ diff --git a/recipes-core/plymouth/files/torizonlogo-white.png b/recipes-core/plymouth/files/torizonlogo-white.png deleted file mode 100644 index 009204bd6e10f15d62a8c6cea680bb1b67d61c22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28869 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 diff --git a/recipes-core/plymouth/plymouth_%.bbappend b/recipes-core/plymouth/plymouth_%.bbappend index 99c296fd..e2217849 100644 --- a/recipes-core/plymouth/plymouth_%.bbappend +++ b/recipes-core/plymouth/plymouth_%.bbappend @@ -2,6 +2,8 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI += " \ file://0001-disable-boot-splash-later.patch \ + file://commontorizonlogo.png \ + file://commontorizonlogo-dev.png \ file://0001-themes-only-install-spinner.patch \ file://torizonlogo-white.png \ file://torizonlogo-labs.png \ @@ -15,9 +17,9 @@ EXTRA_OECONF += "--with-udev --with-runtimedir=/run" do_install:append () { # use the labs logo if we are building the engineering image if [ "${TDX_DEBUG}" = "1" ]; then - install -m 0644 ${WORKDIR}/torizonlogo-labs.png ${D}${datadir}/plymouth/themes/spinner/watermark.png + install -m 0644 ${WORKDIR}/commontorizonlogo-dev.png ${D}${datadir}/plymouth/themes/spinner/watermark.png else - install -m 0644 ${WORKDIR}/torizonlogo-white.png ${D}${datadir}/plymouth/themes/spinner/watermark.png + install -m 0644 ${WORKDIR}/commontorizonlogo.png ${D}${datadir}/plymouth/themes/spinner/watermark.png fi install -m 0644 ${WORKDIR}/spinner.plymouth ${D}${datadir}/plymouth/themes/spinner/spinner.plymouth From d241c7d922371b7dc1e97f569e8fa12968d124aa Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 24 Jun 2023 19:10:32 -0300 Subject: [PATCH 090/163] commontorizon: tdx-info: Bump to add variant to sofware summary MR for upstream: https://github.com/toradex/tdx-info/pull/3 Signed-off-by: Matheus Castello --- recipes-support/tdx-info/tdx-info_%.bbappend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-support/tdx-info/tdx-info_%.bbappend b/recipes-support/tdx-info/tdx-info_%.bbappend index 58ec1a00..2009db54 100644 --- a/recipes-support/tdx-info/tdx-info_%.bbappend +++ b/recipes-support/tdx-info/tdx-info_%.bbappend @@ -1,3 +1,3 @@ SRC_URI = "git://github.com/commontorizon/tdx-info;protocol=https;branch=kirkstone" -SRCREV = "74704032f3ab1460c12ed1a4a3810dbc14eb0e73" +SRCREV = "7cc86b8bb8c2591c9f41846f7d4aabdc2f32dbec" From b525725299b234955ed698b502abc6b082d4dad0 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 24 Jun 2023 19:29:10 -0300 Subject: [PATCH 091/163] commontorizon: Add torizon-core-common-docker and -dev These are the default torizon core common and torizon core common development images. Signed-off-by: Matheus Castello --- conf/common/sanity.inc | 11 ++++++++++ conf/template/local.conf | 4 ++++ .../images/torizon-core-common-docker-dev.bb | 5 +++++ .../images/torizon-core-common-docker.bb | 21 +++++++++++++++++++ .../images/torizon-core-docker-dev.bb | 9 -------- 5 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 conf/common/sanity.inc create mode 100644 recipes-images/images/torizon-core-common-docker-dev.bb create mode 100644 recipes-images/images/torizon-core-common-docker.bb diff --git a/conf/common/sanity.inc b/conf/common/sanity.inc new file mode 100644 index 00000000..1ddbfc5a --- /dev/null +++ b/conf/common/sanity.inc @@ -0,0 +1,11 @@ + +python() { + tdx_debug = d.getVar("TDX_DEBUG", "0") + tdx_image = d.getVar("TDX_IMAGE", "torizon-core-common-docker") + + if tdx_image == "torizon-core-common-docker-dev": + if tdx_debug == "1": + bb.warn(f"You are building a development image with TDX_DEBUG={tdx_debug}") + else: + bb.fatal(f"You are trying to build a development image with TDX_DEBUG={tdx_debug}") +} diff --git a/conf/template/local.conf b/conf/template/local.conf index 807a7d06..bee64ae5 100644 --- a/conf/template/local.conf +++ b/conf/template/local.conf @@ -108,5 +108,9 @@ PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}" # to enable TorizonCore custom debug features set it to 1 #TDX_DEBUG ?= "0" +# store the image name in a variable +TDX_IMAGE = "torizon-core-common-docker" + include conf/machine/include/${MACHINE}.inc include conf/machine/include/common.inc +include conf/common/sanity.inc diff --git a/recipes-images/images/torizon-core-common-docker-dev.bb b/recipes-images/images/torizon-core-common-docker-dev.bb new file mode 100644 index 00000000..38291f14 --- /dev/null +++ b/recipes-images/images/torizon-core-common-docker-dev.bb @@ -0,0 +1,5 @@ +require torizon-core-docker.bb +require torizon-core-dev.inc + +DESCRIPTION = "TorizonCore Linux development image" +IMAGE_VARIANT = "Common Docker Development" diff --git a/recipes-images/images/torizon-core-common-docker.bb b/recipes-images/images/torizon-core-common-docker.bb new file mode 100644 index 00000000..c406433a --- /dev/null +++ b/recipes-images/images/torizon-core-common-docker.bb @@ -0,0 +1,21 @@ +SUMMARY = "TorizonCore" +DESCRIPTION = "TorizonCore Linux with no containers pre-provisioned." + +require torizon-core-container.inc + +CORE_IMAGE_BASE_INSTALL:append = " \ + docker-ce \ + docker-compose \ + docker-compose-up \ + docker-integrity-checker \ + docker-watchdog \ + docker-auto-prune \ +" + +IMAGE_VARIANT = "Common Docker" + +inherit extrausers + +EXTRA_USERS_PARAMS += "\ +usermod -a -G docker torizon; \ +" diff --git a/recipes-images/images/torizon-core-docker-dev.bb b/recipes-images/images/torizon-core-docker-dev.bb index 16b01e9d..6da1693e 100644 --- a/recipes-images/images/torizon-core-docker-dev.bb +++ b/recipes-images/images/torizon-core-docker-dev.bb @@ -2,12 +2,3 @@ require torizon-core-docker.bb require torizon-core-dev.inc DESCRIPTION = "TorizonCore Linux engineering image" - -python() { - tdx_debug = d.getVar("TDX_DEBUG", "0") - - if tdx_debug == "1": - bb.warn(f"You are building a engineering image with TDX_DEBUG={tdx_debug}") - else: - bb.fatal(f"You are trying to build a engineering image with TDX_DEBUG={tdx_debug}") -} From fc2ba0f49e7e59d858424a909342f7dcb2d7e289 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 27 Jun 2023 19:00:14 -0300 Subject: [PATCH 092/163] torizon-common: sanity: remove warning about TDX_DEBUG This is annoying when building a development image, let's only show the fatal error when TDX_DEBUG is not set to 1. Signed-off-by: Matheus Castello --- conf/common/sanity.inc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conf/common/sanity.inc b/conf/common/sanity.inc index 1ddbfc5a..4a36a69e 100644 --- a/conf/common/sanity.inc +++ b/conf/common/sanity.inc @@ -4,8 +4,6 @@ python() { tdx_image = d.getVar("TDX_IMAGE", "torizon-core-common-docker") if tdx_image == "torizon-core-common-docker-dev": - if tdx_debug == "1": - bb.warn(f"You are building a development image with TDX_DEBUG={tdx_debug}") - else: + if tdx_debug != "1": bb.fatal(f"You are trying to build a development image with TDX_DEBUG={tdx_debug}") } From 2069fc5a9848154383741d6b0ea786126d6d33f8 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 27 Jun 2023 19:06:30 -0300 Subject: [PATCH 093/163] torizon-common: Add beagleplay initial support Signed-off-by: Matheus Castello --- conf/distro/include/torizon.inc | 9 ++- conf/machine/include/beagleplay.inc | 74 +++++++++++++++++++ .../u-boot-distro-boot/beagleplay/boot.cmd.in | 52 +++++++++++++ .../u-boot-distro-boot/beagleplay/uEnv.txt.in | 6 ++ .../python/python3-cryptography_%.bbappend | 5 ++ recipes-kernel/linux/files/beagleplay.cfg | 5 ++ recipes-kernel/linux/linux-bb.org_%.bbappend | 2 + scripts/setup-environment-internal | 2 +- 8 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 conf/machine/include/beagleplay.inc create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/boot.cmd.in create mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/uEnv.txt.in create mode 100644 recipes-devtools/python/python3-cryptography_%.bbappend create mode 100644 recipes-kernel/linux/files/beagleplay.cfg create mode 100644 recipes-kernel/linux/linux-bb.org_%.bbappend diff --git a/conf/distro/include/torizon.inc b/conf/distro/include/torizon.inc index 839e1f36..0bd6bf3b 100644 --- a/conf/distro/include/torizon.inc +++ b/conf/distro/include/torizon.inc @@ -51,12 +51,15 @@ IMAGE_BOOT_FILES_REMOVE:sota = "boot.scr-${MACHINE};boot.scr overlays.txt overla IMAGE_BOOT_FILES_REMOVE:append:apalis-imx8 = " hdmitxfw.bin dpfw.bin" DISTRO_FEATURES:append = " virtualization stateless-system" +# FIXME: We need the opengl for beagleplay, but this can be an issue for +# upstream, so I'm comenting here to not forget in the next rebase DISTRO_FEATURES:remove = "3g alsa irda pcmcia nfc ldconfig pulseaudio wayland x11 ptest multiarch vulkan" -DISTRO_FEATURES:imx-generic-bsp:remove = "opengl" +# FIXME: This can be an issue for the upstream, so we are only commenting +# instead of removing it. # No need for x11 even for native -DISTRO_FEATURES_NATIVE:imx-generic-bsp:remove = "x11" -DISTRO_FEATURES_NATIVESDK:imx-generic-bsp:remove = "x11" +# DISTRO_FEATURES_NATIVE:remove = "x11" +# DISTRO_FEATURES_NATIVESDK:remove = "x11" # Note, enable or disable the useradd-staticids in a configured system, # the TMPDIR/DEPLOY_DIR/SSTATE_DIR may contain incorrect uid/gid values. diff --git a/conf/machine/include/beagleplay.inc b/conf/machine/include/beagleplay.inc new file mode 100644 index 00000000..fdce6b6d --- /dev/null +++ b/conf/machine/include/beagleplay.inc @@ -0,0 +1,74 @@ +# taken from meta-freescale/conf/machine/include/utilities.inc +def make_dtb_boot_files(d): + # Generate IMAGE_BOOT_FILES entries for device tree files listed in + # KERNEL_DEVICETREE. + # Use only the basename for dtb files: + alldtbs = d.getVar('KERNEL_DEVICETREE') + + + # DTBs may be built out of kernel with devicetree.bbclass + if not alldtbs: + return '' + + def transform(dtb): + if not (dtb.endswith('dtb') or dtb.endswith('dtbo')): + # eg: whatever/bcm2708-rpi-b.dtb has: + # DEPLOYDIR file: bcm2708-rpi-b.dtb + # destination: bcm2708-rpi-b.dtb + bb.error("KERNEL_DEVICETREE entry %s is not a .dtb or .dtbo file." % (dtb) ) + return os.path.basename(dtb) + + return ' '.join([transform(dtb) for dtb in alldtbs.split() if dtb]) + +WKS_FILE = "sdimage-2part.wks" +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" + +KERNEL_BUILTIN_WIREGUARD:beagleplay = "1" +CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot-bb.org" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-bb.org" +PREFERRED_PROVIDER_virtual/bootloader:beagleplay = "u-boot-bb.org" +PREFERRED_PROVIDER_u-boot:beagleplay = "u-boot-bb.org" +PREFERRED_PROVIDER_virtual/dtb = "" +WKS_FILE_DEPENDS_BOOTLOADERS:beagleplay = "virtual/bootloader" +WKS_FILE_DEPENDS:append:beagleplay = " u-boot-default-script" +PREFERRED_PROVIDER_u-boot-default-script:beagleplay = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-default-script:sota:beagleplay = "u-boot-distro-boot" + +PREFERRED_PROVIDER_u-boot-fw-utils = "libubootenv" +PREFERRED_RPROVIDER_u-boot-fw-utils = "libubootenv" + +IMAGE_FSTYPES:remove:beagleplay = "ext3 jffs2 teziimg" + +# We need ota-ext4 and wic for beagle +IMAGE_FSTYPES_REMOVE = "" +IMAGE_BOOT_FILES:beagleplay = "u-boot.img tispl.bin tiboot3.bin ${@make_dtb_boot_files(d)} " +IMAGE_BOOT_FILES:sota:beaglebone-yocto = "u-boot.img tispl.bin tiboot3.bin ${@make_dtb_boot_files(d)} " +IMAGE_BOOT_FILES_REMOVE:sota:remove = "boot.scr-${MACHINE};boot.scr" +IMAGE_BOOT_FILES:append = " boot.scr-${MACHINE};boot.scr " + +LINUX_VERSION_EXTENSION = "-torizon-${LINUX_KERNEL_TYPE}" + +## same bahavior +# This boot arguments are the same from torizon.bbclass +OSTREE_KERNEL_ARGS:sota:append:beagleplay = "console=ttyS2,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash " + +UBOOT_BINARY_OTA_IGNORE:beagleplay = "1" + +PREFERRED_PROVIDER_virtual/mesa = "mesa-pvr" +PREFERRED_PROVIDER_virtual/egl = "mesa-pvr" +PREFERRED_PROVIDER_virtual/libgles1 = "mesa-pvr" +PREFERRED_PROVIDER_virtual/libgles2 = "mesa-pvr" +PREFERRED_PROVIDER_virtual/libgles3 = "mesa-pvr" +PREFERRED_PROVIDER_virtual/libgbm = "mesa-pvr" +PREFERRED_PROVIDER_virtual/libglx = "mesa-pvr" +PREFERRED_PROVIDER_virtual/libgl = "mesa-pvr" + +INITRAMFS_MAXSIZE = "315400" + +BBMASK += " \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ +" diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/boot.cmd.in new file mode 100644 index 00000000..76a14ca5 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/boot.cmd.in @@ -0,0 +1,52 @@ +# SPDX-License-Identifier: GPL-2.0+ OR MIT +# +# Copyright 2023 MicroHobby +# +# TorizonCore boot script. + +setenv bootlimit 3 +setenv devtype mmc +setenv devnum 1 +setenv bootdevice 0 +setenv otaroot 2 + +if test -z "${altbootcmd}" +then + env set altbootcmd 'env set rollback 1; run bootcmd' + env save +fi + +if test "${rollback}" = "1" && test "${upgrade_available}" = "1" +then + # Make sure to reset upgrade_available to avoid unnecessary wear + # Note this also makes rollback permanent. aktualizr will reset rollback + # when a new (hopefully better) update comes in. + env set upgrade_available 0 + env save +fi + +# save default U-Boot devicetree file to use in a rollback situation +env set fdtfile "k3-am625-beagleplay.dtb" + +if test -n "${loadaddr}" +then + ext4load ${devtype} ${devnum}:${otaroot} ${loadaddr} /boot/loader/uEnv.txt; env import -t ${loadaddr} ${filesize} +else + ext4load ${devtype} ${devnum}:${otaroot} ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize} +fi + +if test "${debug}" = "1" +then + echo "Enabling kernel debug" + env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttymxc0,115200" +fi + +# now that we have all the environment variables, we can set the bootcmd +setenv bootargs "${defargs} ${bootargs} ${tdxargs}" + +ext4load ${devtype} ${devnum}:${otaroot} ${kernel_addr_r} /boot${kernel_image} +ext4load ${devtype} ${devnum}:${otaroot} ${ramdisk_addr_r} /boot${ramdisk_image} +env set ramdisk_size ${filesize} +load ${devtype} ${devnum}:1 ${fdt_addr_r} ${fdtfile} + +@@KERNEL_BOOTCMD@@ ${kernel_addr_r} ${ramdisk_addr_r}:${ramdisk_size} ${fdt_addr_r} diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/uEnv.txt.in new file mode 100644 index 00000000..5d66f6eb --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-distro-boot/beagleplay/uEnv.txt.in @@ -0,0 +1,6 @@ +kernel_image_type=@@KERNEL_IMAGETYPE@@ +overlays_file="overlays.txt" +bootlimit=3 +devtype=mmc +devnum=1 +otaroot=2 diff --git a/recipes-devtools/python/python3-cryptography_%.bbappend b/recipes-devtools/python/python3-cryptography_%.bbappend new file mode 100644 index 00000000..febaf394 --- /dev/null +++ b/recipes-devtools/python/python3-cryptography_%.bbappend @@ -0,0 +1,5 @@ + +# fix the wrong triple +do_compile:prepend() { + export CARGO_BUILD_TARGET="${RUST_HOST_SYS}" +} diff --git a/recipes-kernel/linux/files/beagleplay.cfg b/recipes-kernel/linux/files/beagleplay.cfg new file mode 100644 index 00000000..683252d8 --- /dev/null +++ b/recipes-kernel/linux/files/beagleplay.cfg @@ -0,0 +1,5 @@ +# CONFIG_REMOTEPROC is not set +# CONFIG_PRU_REMOTEPROC is not set +# CONFIG_TI_K3_DSP_REMOTEPROC is not set +# CONFIG_TI_K3_R5_REMOTEPROC is not set +# CONFIG_TI_K3_M4_REMOTEPROC is not set diff --git a/recipes-kernel/linux/linux-bb.org_%.bbappend b/recipes-kernel/linux/linux-bb.org_%.bbappend new file mode 100644 index 00000000..57ce0433 --- /dev/null +++ b/recipes-kernel/linux/linux-bb.org_%.bbappend @@ -0,0 +1,2 @@ + +require common.inc diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 271cfab7..dcfe0ef1 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf|beagleplay\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From 872920c66b32a8f0e764abf8bd5b37b96d870f8a Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 23 Jun 2023 20:36:27 -0400 Subject: [PATCH 094/163] Consolidate common rpi metadata. Move bits that are identical across rpi boards into a single location that applies for all variants. Signed-off-by: Drew Moseley --- .../raspberrypi4-64/boot.cmd.in | 43 ------------------- .../{raspberrypi3-64 => rpi}/boot.cmd.in | 0 .../{raspberrypi3-64 => rpi}/uEnv.txt.in | 0 3 files changed, 43 deletions(-) delete mode 100644 recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in rename recipes-bsp/u-boot/u-boot-distro-boot/{raspberrypi3-64 => rpi}/boot.cmd.in (100%) rename recipes-bsp/u-boot/u-boot-distro-boot/{raspberrypi3-64 => rpi}/uEnv.txt.in (100%) diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in deleted file mode 100644 index 1bd30253..00000000 --- a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi4-64/boot.cmd.in +++ /dev/null @@ -1,43 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0+ OR MIT -# -# Copyright 2023 MicroHobby -# -# TorizonCore boot script. - -setenv bootlimit 3 -setenv devtype mmc -setenv devnum 0 -setenv otaroot 2 - -if test -z "${altbootcmd}" -then - env set altbootcmd 'env set rollback 1; run bootcmd' - env save -fi - -if test "${rollback}" = "1" && test "${upgrade_available}" = "1" -then - # Make sure to reset upgrade_available to avoid unnecessary wear - # Note this also makes rollback permanent. aktualizr will reset rollback - # when a new (hopefully better) update comes in. - env set upgrade_available 0 - env save -fi - -# save default U-Boot devicetree file to use in a rollback situation -env set fdtfile2 "${fdtfile}" - -if test -n "${loadaddr}" -then - ext4load ${devtype} ${devnum}:${otaroot} ${loadaddr} /boot/loader/uEnv.txt; env import -t ${loadaddr} ${filesize} -else - ext4load ${devtype} ${devnum}:${otaroot} ${scriptaddr} /boot/loader/uEnv.txt; env import -t ${scriptaddr} ${filesize} -fi - -if test "${debug}" = "1" -then - echo "Enabling kernel debug" - env set tdxargs "${tdxargs} rodata=off nokaslr maxcpus=1 kgdboc=ttyAMA0,115200" -fi - -run bootcmd_run diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in b/recipes-bsp/u-boot/u-boot-distro-boot/rpi/boot.cmd.in similarity index 100% rename from recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/boot.cmd.in rename to recipes-bsp/u-boot/u-boot-distro-boot/rpi/boot.cmd.in diff --git a/recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in b/recipes-bsp/u-boot/u-boot-distro-boot/rpi/uEnv.txt.in similarity index 100% rename from recipes-bsp/u-boot/u-boot-distro-boot/raspberrypi3-64/uEnv.txt.in rename to recipes-bsp/u-boot/u-boot-distro-boot/rpi/uEnv.txt.in From 9055f5a80f70c074dbba8bba98cab7074fe9cf55 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 23 Jun 2023 20:37:02 -0400 Subject: [PATCH 095/163] Add support for raspberrypi0-2w-64 Signed-off-by: Drew Moseley --- conf/machine/include/raspberrypi0-2w-64.inc | 3 +++ .../linux/files/raspberrypi0-2w-64.cfg | 22 +++++++++++++++++++ scripts/setup-environment-internal | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 conf/machine/include/raspberrypi0-2w-64.inc create mode 100644 recipes-kernel/linux/files/raspberrypi0-2w-64.cfg diff --git a/conf/machine/include/raspberrypi0-2w-64.inc b/conf/machine/include/raspberrypi0-2w-64.inc new file mode 100644 index 00000000..07cd4933 --- /dev/null +++ b/conf/machine/include/raspberrypi0-2w-64.inc @@ -0,0 +1,3 @@ +require raspberrypi3-64.inc + +KERNEL_DEVICETREE:raspberrypi0-2w-64:sota ?= " broadcom/bcm2710-rpi-zero-2.dtb overlays/vc4-fkms-v3d.dtbo overlays/rpi-ft5406.dtbo" diff --git a/recipes-kernel/linux/files/raspberrypi0-2w-64.cfg b/recipes-kernel/linux/files/raspberrypi0-2w-64.cfg new file mode 100644 index 00000000..fada48e3 --- /dev/null +++ b/recipes-kernel/linux/files/raspberrypi0-2w-64.cfg @@ -0,0 +1,22 @@ +CONFIG_I2C_ALGOBIT=y +CONFIG_CEC_CORE=y +CONFIG_DRM=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_V3D=y +CONFIG_SND=y +CONFIG_SND_SOC=y +CONFIG_SND_BCM2835=y +CONFIG_DRM_VC4=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index dcfe0ef1..5f575886 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf|beagleplay\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|raspberrypi0-2w-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf|beagleplay\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From dc9810a12ad3f9fb7578c37446675d6d3c6581ff Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 6 Jul 2023 00:15:37 -0300 Subject: [PATCH 096/163] commontorizon: bump tdx-info to have json output MR from upstream: https://github.com/toradex/tdx-info/pull/4 Signed-off-by: Matheus Castello --- recipes-support/tdx-info/tdx-info_%.bbappend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-support/tdx-info/tdx-info_%.bbappend b/recipes-support/tdx-info/tdx-info_%.bbappend index 2009db54..55c2546a 100644 --- a/recipes-support/tdx-info/tdx-info_%.bbappend +++ b/recipes-support/tdx-info/tdx-info_%.bbappend @@ -1,3 +1,3 @@ SRC_URI = "git://github.com/commontorizon/tdx-info;protocol=https;branch=kirkstone" -SRCREV = "7cc86b8bb8c2591c9f41846f7d4aabdc2f32dbec" +SRCREV = "2a8bfb7fc5da705c76d87cb647c93a34e0f31cb8" From f9c6c585d408aa06af302d4d0589dbdd1797691e Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 6 Jul 2023 14:58:10 -0300 Subject: [PATCH 097/163] commontorizon: Remove custom github url for Toradex kernel and bsp Now that the manifest should be bumped, we can remove the custom github url for the kernel and bsp. Signed-off-by: Matheus Castello --- recipes-kernel/linux/linux-toradex%.bbappend | 4 ---- 1 file changed, 4 deletions(-) diff --git a/recipes-kernel/linux/linux-toradex%.bbappend b/recipes-kernel/linux/linux-toradex%.bbappend index b8c950e8..caa6b4fc 100644 --- a/recipes-kernel/linux/linux-toradex%.bbappend +++ b/recipes-kernel/linux/linux-toradex%.bbappend @@ -1,8 +1,4 @@ -SRC_URI = " \ - git://github.com/microhobby/linux-toradex.git;protocol=https;branch=toradex_5.15-2.1.x-imx;name=machine \ -" - # Make sure to override LOCALVERSION in linux-imx.inc LOCALVERSION = "-${TDX_VERSION}-labs" From a1dc181bf2e5e6929c40cb8304b347476fe54b88 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 6 Jul 2023 15:10:39 -0300 Subject: [PATCH 098/163] commontorizon: Add support to verdin-imx8mp Signed-off-by: Matheus Castello --- conf/machine/include/verdin-imx8mp.inc | 1 + recipes-kernel/linux/files/verdin-imx8mp.cfg | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 conf/machine/include/verdin-imx8mp.inc create mode 100644 recipes-kernel/linux/files/verdin-imx8mp.cfg diff --git a/conf/machine/include/verdin-imx8mp.inc b/conf/machine/include/verdin-imx8mp.inc new file mode 100644 index 00000000..4088b587 --- /dev/null +++ b/conf/machine/include/verdin-imx8mp.inc @@ -0,0 +1 @@ +# to add custom configs diff --git a/recipes-kernel/linux/files/verdin-imx8mp.cfg b/recipes-kernel/linux/files/verdin-imx8mp.cfg new file mode 100644 index 00000000..c9f9b1c6 --- /dev/null +++ b/recipes-kernel/linux/files/verdin-imx8mp.cfg @@ -0,0 +1,14 @@ +# splash screen +CONFIG_DRM=y +CONFIG_DRM_DISPLAY_CONNECTOR=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_MIPI_DSI=y +CONFIG_REGMAP_I2C=y +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_DRM_LONTIUM_LT8912B=y +CONFIG_DRM_SEC_MIPI_DSIM=y +CONFIG_DRM_IMX_SEC_DSIM=y +CONFIG_DRM_TI_SN65DSI83=y +# end of the kernel hack From e029cea8f3f863865f1604e8acde9a411f680f58 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Wed, 12 Jul 2023 21:25:29 -0300 Subject: [PATCH 099/163] commontorizon: Add telemetry recipe This is a community driven project, maintainers are volunteers. But for now we do not have much "horse power" to maintain this project. We need to know where put our efforts, so, we need to know how the project is being used. This recipe add a service that will send, ANONIMOUSLY DATA, to a server that will collect: - Board model - Board arch - OS release - Region - dmesg (only the emerg, alert, crit, err, warning levels) This is enabled by default, and only in the Common Torizon development image. Also is opt-out, so, if you do not want to send the data, just remove the recipe from the image or disable the service. Signed-off-by: Matheus Castello --- .../images/torizon-core-common-docker-dev.bb | 4 ++ recipes-support/telemetry/telemetry/telemetry | 60 +++++++++++++++++++ .../telemetry/telemetry/telemetry.service | 11 ++++ recipes-support/telemetry/telemetry_0.1.bb | 28 +++++++++ 4 files changed, 103 insertions(+) create mode 100644 recipes-support/telemetry/telemetry/telemetry create mode 100644 recipes-support/telemetry/telemetry/telemetry.service create mode 100644 recipes-support/telemetry/telemetry_0.1.bb diff --git a/recipes-images/images/torizon-core-common-docker-dev.bb b/recipes-images/images/torizon-core-common-docker-dev.bb index 38291f14..e7fc5cdc 100644 --- a/recipes-images/images/torizon-core-common-docker-dev.bb +++ b/recipes-images/images/torizon-core-common-docker-dev.bb @@ -1,5 +1,9 @@ require torizon-core-docker.bb require torizon-core-dev.inc +CORE_IMAGE_BASE_INSTALL:append = " \ + telemetry \ +" + DESCRIPTION = "TorizonCore Linux development image" IMAGE_VARIANT = "Common Docker Development" diff --git a/recipes-support/telemetry/telemetry/telemetry b/recipes-support/telemetry/telemetry/telemetry new file mode 100644 index 00000000..5f83e070 --- /dev/null +++ b/recipes-support/telemetry/telemetry/telemetry @@ -0,0 +1,60 @@ +#!/usr/bin/bash +# +# Copyright (c) MicroHobby 2023 +# All rights reserved. +# + +# check if we have an internet connection +# retry 3x +for i in {1..3} +do + if ping -c 1 google.com + then + break + # else we are in the last iteration exit + elif [ $i -eq 3 ] + then + echo "E: No internet connection" + # exit with success to avoid taint the systemd status + exit 0 + fi + + sleep 3 +done + +export JSON_OUTPUT=1 + +# create the info in json format +tdx-info > /tmp/tdx-info.json + +# get the data +BOARDMODEL=$(cat /tmp/tdx-info.json | jq '."hardware-info"."hw-model"') +BOARDARCH=$(cat /tmp/tdx-info.json | jq '."hardware-info"."processor-arch"') +OSRELEASE=$(cat /tmp/tdx-info.json | jq '."software-summary"."distro-version"') +DATETIME=$(date +%Y-%m-%d) + +# get emerg, alert, crit, err, warning dmesg levels +DMESG=$(dmesg -r --level=emerg,alert,crit,err,warn) + +# query the region +REGION=$(curl -s https://ipapi.co/city) + +# debug +echo "REGION: $REGION" +echo "BOARDMODEL: $BOARDMODEL" +echo "BOARDARCH: $BOARDARCH" +echo "OSRELEASE: $OSRELEASE" +echo "DATETIME: $DATETIME" +echo "DMESG: $DMESG" + +# do it +curl --request POST \ + --url http://castello.dev.br/api/telemetry/add \ + --data-urlencode "region=$REGION" \ + --data-urlencode "dateTime=$DATETIME" \ + --data-urlencode "boardarch=$BOARDARCH" \ + --data-urlencode "boardmodel=$BOARDMODEL" \ + --data-urlencode "osrelease=$OSRELEASE" \ + --data-urlencode "dmesg=\"$DMESG\"" + +exit 0 diff --git a/recipes-support/telemetry/telemetry/telemetry.service b/recipes-support/telemetry/telemetry/telemetry.service new file mode 100644 index 00000000..ba6294f2 --- /dev/null +++ b/recipes-support/telemetry/telemetry/telemetry.service @@ -0,0 +1,11 @@ +[Unit] +Description=Send Telemetry about the Common TorizonCore usage +Requires=set-hostname.service network-online.target +After=set-hostname.service network-online.target + +[Service] +Type=oneshot +ExecStart=/usr/sbin/telemetry + +[Install] +WantedBy=multi-user.target diff --git a/recipes-support/telemetry/telemetry_0.1.bb b/recipes-support/telemetry/telemetry_0.1.bb new file mode 100644 index 00000000..a3ef5001 --- /dev/null +++ b/recipes-support/telemetry/telemetry_0.1.bb @@ -0,0 +1,28 @@ +SUMMARY = "Common Torizon anonymous Telemetry" +DESCRIPTION = "Script to ping the Common Torizon server and collect information about the hardware that is booting Common Torizon" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +inherit allarch systemd + +RDEPENDS:${PN} += "curl bash tdx-info" + +SRC_URI = " \ + file://telemetry \ + file://telemetry.service \ +" + +S = "${WORKDIR}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +do_install () { + install -d ${D}${sbindir} + install -m 0755 ${S}/telemetry ${D}${sbindir} + + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${S}/telemetry.service ${D}${systemd_system_unitdir} +} + +SYSTEMD_SERVICE:${PN} = "telemetry.service" +SYSTEMD_AUTO_ENABLE:${PN} = "enable" From 2ecfe053c15ddd267efefebfab1d1ad451c60c86 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 13 Jul 2023 14:24:12 -0300 Subject: [PATCH 100/163] commontorizon: Back to the Torizon splash screen In a internal meeting Toradex appears to be ok to grant a license to use the Torizon TM and logo in the splash screen. Signed-off-by: Matheus Castello --- .../plymouth/files/torizon-splash-dev.png | Bin 0 -> 28052 bytes recipes-core/plymouth/files/torizon-splash.png | Bin 0 -> 26425 bytes recipes-core/plymouth/plymouth_%.bbappend | 6 ++++-- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 recipes-core/plymouth/files/torizon-splash-dev.png create mode 100644 recipes-core/plymouth/files/torizon-splash.png diff --git a/recipes-core/plymouth/files/torizon-splash-dev.png b/recipes-core/plymouth/files/torizon-splash-dev.png new file mode 100644 index 0000000000000000000000000000000000000000..51d5e4396f5c84f1442f5928cfdf43c20133434b GIT binary patch literal 28052 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 z z`TdDuv(XAiIrEta_UYC~y>|)2PaU<~2ib~O8w_>xjJ+x$!njj`(`qyi9`ebscv*!2 zd@0WbJ?TA1Dw|)n1|rL4gBs!`RD-9hFG5{~7V7(#V_Gt^$pq%3V~PH!Frg_XPll6` zvN_}mGv+M-Z5JQVe)sq1W-F+$)wodV zuobNA+P6La$E*e5g4*c9UjO>{aE3%yG7LlcBY-dY9O*Pr6R0p}T|s6tJV6NKJ-pA? zOEhDJ%L+=utHK*Ow1~p$)?Lcpb!DV&>5Pu(I~Z?udlWEC7nbrdhIrD5K%StD=zX+W zbgsZkn}Xrmn5&RQO#N3G3TcKWobvV-Cf^Q3Y*s0Xs9v^m5tTJv)%g`GeW@r6e}Mxw zBs7YR#jcHh(S~WO=>Bx9AIF~Hd$RX9kAaK7>sW6N%up+tce}T+^wMV7xMuVuegnFP zBW0aVXc20KL#6vr67sC=uE!45#qbgQ4LE%iM{VcU=LYm)%Zr{I zpTxv0LYIB(2(&k7Ke6`X=7e^cTvi*lT=|jz+6baK+LUEJr$<&hBYI`)5s$q&kvL71 zO(dD&aE5At`{4Tb4ZjwVe?YxU6KQYq4lcOWYznp+Jz$wqN%pq>4MFDf8CY1U_7CAj z+o&zUZ`>{=JUI^4(DG=pOyO~Zn`vQX-7J`dsbCy$<$z)J=WTe^u~$bTZQm{6d@_>4 z;D1WhQ*tA30iuUEwznu z)#F6O;}a%m)^;!UpJ9#)W^1B$Ie3xs?wK-HO595a4263jj*d249UZ7=HHv{)hMN6l zXhf68?!5iRg7_f-E$Yf2>|#V14?n(f`99rTdm8QXCUdPzvmy`u6%~TT8=IK3p6!7V zKrnfQ(_kj+vgwCmI9sm|Q4%V!+$iID5AQ~6kcql=$lQBh3 z|I$Th!AY(JIonCr6+b!$8JGlyywID<@DV2^4Tl}DL-duAE4||dNA8U0qb4s`YlVbl zttk<*L+^fDqq`p2Zn!_|q4@qdb5Ce@<7X+qrX^lhwX` z#_v5XG=RCls_CB;QXG$w$Rhe6LsBL!p#4YDkq6_sRFshOPZhiwJlAY-pOI6-d>Xp1 zdW!VFX43*`%EhwD=grc}a+hYQu_#ZKJtR(mrB<5TR>(%{?xihd(Ns;kXx*~>6)f10 z;7WF~*9=1VC#m)y1X6%#p_?lR5l1S`Eg!sGnr@DFJ6ak~`hg*I;AsYFEAPGF9L0hO zrP#DQm9|TVQMPN^6y*ny9n!-02X9aE&Lq}=ecLzbx||Z>k5t0pPZ+A@AEW$s0^NH0 zsP>i`Y;zkv@kl|~sD};<*w_Tj09q|sodjP9I^hiFCla7cxsda^kF5+zSD_UGTZm&E zgB0bu6I-n$GZY)6ZbL|YClczqOgr8u!`F+A>=9BK_cbTb=C+ahb-B=KERd%+#j z9?(MH8U$_|`KMh9Y?NgN6MZ%P{jds$VgNsEkyZ-3g%5ZW#JN5!&Sb(4F`MGEkck*&R`}-KQS9f`aUQAZ Ks8*@K!v7DmA2-tg literal 0 HcmV?d00001 diff --git a/recipes-core/plymouth/files/torizon-splash.png b/recipes-core/plymouth/files/torizon-splash.png new file mode 100644 index 0000000000000000000000000000000000000000..4b025959036fa6fdf804332c05bf63e76e8cdcde GIT binary patch literal 26425 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 Date: Thu, 13 Jul 2023 14:30:23 -0300 Subject: [PATCH 101/163] commontorizon: tdx-info: Bump to get x86_64 support MR from upstream https://github.com/toradex/tdx-info/pull/5 Signed-off-by: Matheus Castello --- recipes-support/tdx-info/tdx-info_%.bbappend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-support/tdx-info/tdx-info_%.bbappend b/recipes-support/tdx-info/tdx-info_%.bbappend index 55c2546a..a4b86206 100644 --- a/recipes-support/tdx-info/tdx-info_%.bbappend +++ b/recipes-support/tdx-info/tdx-info_%.bbappend @@ -1,3 +1,3 @@ SRC_URI = "git://github.com/commontorizon/tdx-info;protocol=https;branch=kirkstone" -SRCREV = "2a8bfb7fc5da705c76d87cb647c93a34e0f31cb8" +SRCREV = "ca1ac11abc90cf0aa934d5f39c90839298a9faab" From 906d8869b941387e4c1d6a59017a59777ac04f08 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 13 Jul 2023 14:59:27 -0300 Subject: [PATCH 102/163] commontorizon: motd: Remove the mention to Toradex Labs We are under the Common Torizon, then let's update the motd to mention that and link to the documentation. Signed-off-by: Matheus Castello --- recipes-core/base-files/base-files/motd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/recipes-core/base-files/base-files/motd b/recipes-core/base-files/base-files/motd index daa4ba3b..3c08c59c 100644 --- a/recipes-core/base-files/base-files/motd +++ b/recipes-core/base-files/base-files/motd @@ -1,2 +1,3 @@ -This is a Experimental Toradex Labs Project -https://labs.toradex.com/projects  +This is an Experimental Common Torizon Image +Check for more info: +https://github.com/commontorizon/Documentation/blob/main/PRE-BUILT-DEV.md  From 4de8ade4927c4733d27961a53697f9755a96dff5 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 13 Jul 2023 20:30:35 -0300 Subject: [PATCH 103/163] commontorizon: telemetry: Fix null region and wrong date Signed-off-by: Matheus Castello --- recipes-support/telemetry/telemetry/telemetry | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/recipes-support/telemetry/telemetry/telemetry b/recipes-support/telemetry/telemetry/telemetry index 5f83e070..0b1347f8 100644 --- a/recipes-support/telemetry/telemetry/telemetry +++ b/recipes-support/telemetry/telemetry/telemetry @@ -31,13 +31,34 @@ tdx-info > /tmp/tdx-info.json BOARDMODEL=$(cat /tmp/tdx-info.json | jq '."hardware-info"."hw-model"') BOARDARCH=$(cat /tmp/tdx-info.json | jq '."hardware-info"."processor-arch"') OSRELEASE=$(cat /tmp/tdx-info.json | jq '."software-summary"."distro-version"') -DATETIME=$(date +%Y-%m-%d) # get emerg, alert, crit, err, warning dmesg levels DMESG=$(dmesg -r --level=emerg,alert,crit,err,warn) # query the region -REGION=$(curl -s https://ipapi.co/city) +# if the region is null try 3x +for i in {1..3} +do + REGION=$(curl -s https://ipapi.co/city) + # try to set the date and time + dateFromServer=$(curl -v --silent https://google.com/ 2>&1 \ + | grep Date | sed -e 's/< Date: //'); date +"%d%m%Y%H%M%S" -d "$dateFromServer" + + if [ ! -z "$REGION" ] + then + break + # else we are in the last iteration exit + elif [ $i -eq 3 ] + then + echo "E: Region was undefined" + REGION="Undefined" + fi + + sleep 3 +done + +# we should have a date now +DATETIME=$(date +%Y-%m-%d) # debug echo "REGION: $REGION" From 3ca5264f8f4f703c919009aff2373707f25242d3 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 14 Jul 2023 21:34:27 -0300 Subject: [PATCH 104/163] commontorizon: nezha: Temporary remove RAC For risc-v targets there is not support for RAC yet, so remove it from the image. Upstream issue: https://github.com/toradex/torizon-rac/issues/4 Signed-off-by: Matheus Castello --- classes/rust-target-config.bbclass | 7 +++++++ conf/machine/include/nezha-allwinner-d1.inc | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/classes/rust-target-config.bbclass b/classes/rust-target-config.bbclass index 21a56ede..e564b54a 100644 --- a/classes/rust-target-config.bbclass +++ b/classes/rust-target-config.bbclass @@ -245,6 +245,13 @@ TARGET_POINTER_WIDTH[riscv64gc] = "64" TARGET_C_INT_WIDTH[riscv64gc] = "64" MAX_ATOMIC_WIDTH[riscv64gc] = "64" +## riscv64-unknown-linux-{gnu, musl} +DATA_LAYOUT[riscv64] = "e-m:e-p:64:64-i64:64-i128:128-n64-S128" +TARGET_ENDIAN[riscv64] = "little" +TARGET_POINTER_WIDTH[riscv64] = "64" +TARGET_C_INT_WIDTH[riscv64] = "64" +MAX_ATOMIC_WIDTH[riscv64] = "64" + ## loongarch64-unknown-linux-{gnu, musl} DATA_LAYOUT[loongarch64] = "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128" TARGET_ENDIAN[loongarch64] = "little" diff --git a/conf/machine/include/nezha-allwinner-d1.inc b/conf/machine/include/nezha-allwinner-d1.inc index cda0ede5..450d2a26 100644 --- a/conf/machine/include/nezha-allwinner-d1.inc +++ b/conf/machine/include/nezha-allwinner-d1.inc @@ -33,7 +33,8 @@ IMAGE_BOOT_FILES:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE} sun20i-d1-nezha.dtb b IMAGE_BOOT_FILES:sota:nezha-allwinner-d1 = "${KERNEL_IMAGETYPE} sun20i-d1-nezha.dtb boot.scr-${MACHINE};boot.scr.uimg" hostname:pn-base-files = "torizon-nezha" -CORE_IMAGE_BASE_INSTALL:remove = "set-hostname" +# FIXME: rac does not compile for riscv64, https://github.com/briansmith/ring/issues/1182 +CORE_IMAGE_BASE_INSTALL:remove = "set-hostname rac" # Use meta-lmp but maintain compatibility BBMASK += " \ From 6a30ec187b14421f91dda8a727a1304013516890 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 14 Jul 2023 21:37:01 -0300 Subject: [PATCH 105/163] commontorizon: telemetry: Increase sleep time between retries Signed-off-by: Matheus Castello --- recipes-support/telemetry/telemetry/telemetry | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes-support/telemetry/telemetry/telemetry b/recipes-support/telemetry/telemetry/telemetry index 0b1347f8..e6f3bd39 100644 --- a/recipes-support/telemetry/telemetry/telemetry +++ b/recipes-support/telemetry/telemetry/telemetry @@ -19,7 +19,7 @@ do exit 0 fi - sleep 3 + sleep 60 done export JSON_OUTPUT=1 @@ -54,7 +54,7 @@ do REGION="Undefined" fi - sleep 3 + sleep 60 done # we should have a date now From f8e64cfb7900417d9f9d9c2d3747eadd86478fc2 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 16 Jul 2023 23:32:47 -0300 Subject: [PATCH 106/163] commontorizon: apalis-imx8: Fix splash screen on HDMI Signed-off-by: Matheus Castello --- conf/machine/include/apalis-imx8.inc | 4 ++++ .../images/initramfs-ostree-torizon-image.bb | 4 ++++ .../initramfs-framework_1.0.bbappend | 6 ++++++ recipes-kernel/linux/files/apalis-imx8.cfg | 14 ++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 conf/machine/include/apalis-imx8.inc create mode 100644 recipes-kernel/linux/files/apalis-imx8.cfg diff --git a/conf/machine/include/apalis-imx8.inc b/conf/machine/include/apalis-imx8.inc new file mode 100644 index 00000000..f745c04d --- /dev/null +++ b/conf/machine/include/apalis-imx8.inc @@ -0,0 +1,4 @@ +# to add custom configs + +# let's try to not use their old and jurassic RS232 +OSTREE_KERNEL_ARGS_EXTRA:append = " console=ttyLP0,115200n8 " diff --git a/recipes-core/images/initramfs-ostree-torizon-image.bb b/recipes-core/images/initramfs-ostree-torizon-image.bb index 2dd7cba7..1e9b8a52 100644 --- a/recipes-core/images/initramfs-ostree-torizon-image.bb +++ b/recipes-core/images/initramfs-ostree-torizon-image.bb @@ -9,6 +9,10 @@ PACKAGE_INSTALL:append:cfs-support = "\ initramfs-module-composefs \ " +PACKAGE_INSTALL:append:apalis-imx8 = "\ + firmware-imx-hdmi \ +" + SYSTEMD_DEFAULT_TARGET = "initrd.target" # Do not pollute the initrd image with rootfs features diff --git a/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend b/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend index e8a4ce93..c0f54e6b 100644 --- a/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend +++ b/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend @@ -45,6 +45,12 @@ FILES:initramfs-module-kmod = "\ /etc/modules-load.d/* \ " +SUMMARY:initramfs-module-firmware = "initramfs support for HDMI firmware" +RDEPENDS:initramfs-module-firmware = "${PN}-base firmware-imx-hdmi" +FILES:initramfs-module-firmware = "\ + /usr/lib/firmware/* \ +" + do_install:append() { install -m 0755 ${WORKDIR}/plymouth ${D}/init.d/02-plymouth install -m 0755 ${WORKDIR}/ostree ${D}/init.d/95-ostree diff --git a/recipes-kernel/linux/files/apalis-imx8.cfg b/recipes-kernel/linux/files/apalis-imx8.cfg new file mode 100644 index 00000000..78c2834e --- /dev/null +++ b/recipes-kernel/linux/files/apalis-imx8.cfg @@ -0,0 +1,14 @@ +# splash screen +CONFIG_DRM_DISPLAY_CONNECTOR=y +CONFIG_DRM_IMX_CDNS_MHDP=m +CONFIG_DRM_SEC_MIPI_DSIM=y +CONFIG_DRM_IMX_SEC_DSIM=y +CONFIG_SND_SOC_IMX_HDMI=y +CONFIG_SND_SOC_IMX_SGTL5000=y +CONFIG_DRM_CDNS_MHDP=y +CONFIG_DRM_CDNS_HDMI=y +CONFIG_DRM_CDNS_DP=y +CONFIG_DRM_CDNS_AUDIO=y +CONFIG_DRM_CDNS_HDCP=y +CONFIG_DRM_CDNS_HDMI_CEC=y +# end of the kernel hack From a37fd0078c6fa44f2bd344c65fec426286de15ae Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 18 Jul 2023 21:16:40 -0300 Subject: [PATCH 107/163] commontorizon: Fix raspberrypi reboot issue Signed-off-by: Matheus Castello --- recipes-kernel/linux/files/debug.cfg | 3 --- 1 file changed, 3 deletions(-) diff --git a/recipes-kernel/linux/files/debug.cfg b/recipes-kernel/linux/files/debug.cfg index 23b5053d..dcdef4e2 100644 --- a/recipes-kernel/linux/files/debug.cfg +++ b/recipes-kernel/linux/files/debug.cfg @@ -3,7 +3,6 @@ # CONFIG_DEBUG_INFO_NONE is not set # CONFIG_DEBUG_INFO_REDUCED is not set CONFIG_DEBUG_KERNEL=y -CONFIG_EXPERT=y CONFIG_DEBUG_INFO=y CONFIG_FRAME_POINTER=y CONFIG_STACK_TRACER=y @@ -12,11 +11,9 @@ CONFIG_KGDB_SERIAL_CONSOLE=y # CONFIG_KGDB_KDB is not set # CONFIG_KDB_KEYBOARD is not set CONFIG_GDB_SCRIPTS=y -CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_RANDOMIZE_BASE is not set # for toradex the watchdog and the imx2+ wdt need to be disable # to be possible to use kgdb -# CONFIG_WATCHDOG is not set # CONFIG_IMX2_WDT is not set # for toradex we need to enable all sysrq keys CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 From 6293bcc6f1a32179edbb4db126446a1ca2dd5bab Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 18 Jul 2023 21:22:24 -0300 Subject: [PATCH 108/163] commontorizon: beagleplay: Fix OSTREE_DEPLOY_DEVICETREE Signed-off-by: Matheus Castello --- conf/machine/include/beagleplay.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/machine/include/beagleplay.inc b/conf/machine/include/beagleplay.inc index fdce6b6d..791f9d30 100644 --- a/conf/machine/include/beagleplay.inc +++ b/conf/machine/include/beagleplay.inc @@ -55,6 +55,7 @@ LINUX_VERSION_EXTENSION = "-torizon-${LINUX_KERNEL_TYPE}" OSTREE_KERNEL_ARGS:sota:append:beagleplay = "console=ttyS2,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash " UBOOT_BINARY_OTA_IGNORE:beagleplay = "1" +OSTREE_DEPLOY_DEVICETREE:beagleplay = "0" PREFERRED_PROVIDER_virtual/mesa = "mesa-pvr" PREFERRED_PROVIDER_virtual/egl = "mesa-pvr" From dfdbe88c3daf096de14f3623f8cfeeeb3a665456 Mon Sep 17 00:00:00 2001 From: Leonardo Held Date: Sun, 23 Jul 2023 21:16:43 -0300 Subject: [PATCH 109/163] docker-compose: wait until Plymouth finishes In common occasions detected in iMX8MP SoMs, graphical applications were unable to open the drm file descriptor during boot due to a race condition between seatd (the seat daemon used in the weston containers) and Plymouth, resulting in a "device busy" error. Postponing the docker-compose service fixes the intermittent error. Signed-off-by: Leonardo Held Signed-off-by: Matheus Castello --- .../docker-compose-up/files/docker-compose.service | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/recipes-containers/docker-compose-up/files/docker-compose.service b/recipes-containers/docker-compose-up/files/docker-compose.service index 7c33b72d..8a153fa8 100644 --- a/recipes-containers/docker-compose-up/files/docker-compose.service +++ b/recipes-containers/docker-compose-up/files/docker-compose.service @@ -1,7 +1,8 @@ [Unit] Description=Docker Compose service with docker compose Requires=docker.service -After=docker.service +After=docker.service plymouth-quit.service +Wants=plymouth-quit.service ConditionPathExists=/var/sota/storage/docker-compose/docker-compose.yml ConditionPathExists=!/var/sota/storage/docker-compose/docker-compose.yml.tmp OnFailure=docker-integrity-checker.service From 8ea228f41a3dfc9f78a139d07c0dd6d187012021 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 27 Jul 2023 04:19:54 -0300 Subject: [PATCH 110/163] commontorizon: intel-corei7-64: Add docker-binfmt service Signed-off-by: Matheus Castello --- conf/machine/include/intel-corei7-64.inc | 2 +- .../docker-binfmt/docker-binfmt/docker-binfmt | 7 +++++ .../docker-binfmt/docker-binfmt.service | 12 ++++++++ .../docker-binfmt/docker-binfmt_0.1.bb | 28 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 recipes-support/docker-binfmt/docker-binfmt/docker-binfmt create mode 100644 recipes-support/docker-binfmt/docker-binfmt/docker-binfmt.service create mode 100644 recipes-support/docker-binfmt/docker-binfmt_0.1.bb diff --git a/conf/machine/include/intel-corei7-64.inc b/conf/machine/include/intel-corei7-64.inc index b7165e5b..738abf2f 100644 --- a/conf/machine/include/intel-corei7-64.inc +++ b/conf/machine/include/intel-corei7-64.inc @@ -2,7 +2,7 @@ WKS_FILE:intel-corei7-64:sota = "efiimage-sota.wks" WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" -CORE_IMAGE_BASE_INSTALL:append = "resize-helper" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper docker-binfmt" OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64 = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " OSTREE_BOOTLOADER:intel-corei7-64 = "grub" diff --git a/recipes-support/docker-binfmt/docker-binfmt/docker-binfmt b/recipes-support/docker-binfmt/docker-binfmt/docker-binfmt new file mode 100644 index 00000000..a8ce1447 --- /dev/null +++ b/recipes-support/docker-binfmt/docker-binfmt/docker-binfmt @@ -0,0 +1,7 @@ +#!/usr/bin/bash +# +# Copyright (c) MicroHobby 2023 +# All rights reserved. +# + +docker run --rm --privileged torizon/binfmt diff --git a/recipes-support/docker-binfmt/docker-binfmt/docker-binfmt.service b/recipes-support/docker-binfmt/docker-binfmt/docker-binfmt.service new file mode 100644 index 00000000..394aa92d --- /dev/null +++ b/recipes-support/docker-binfmt/docker-binfmt/docker-binfmt.service @@ -0,0 +1,12 @@ +[Unit] +Description=Start binfmt-support from Docker torizon/binfmt +Requires=docker.service +After=docker.service +Wants=docker.service + +[Service] +Type=oneshot +ExecStart=/usr/sbin/docker-binfmt + +[Install] +WantedBy=multi-user.target diff --git a/recipes-support/docker-binfmt/docker-binfmt_0.1.bb b/recipes-support/docker-binfmt/docker-binfmt_0.1.bb new file mode 100644 index 00000000..e110cb4d --- /dev/null +++ b/recipes-support/docker-binfmt/docker-binfmt_0.1.bb @@ -0,0 +1,28 @@ +SUMMARY = "Start binfmt-support from Docker torizon/binfmt" +DESCRIPTION = "Start binfmt-support from Docker torizon/binfmt" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +inherit allarch systemd + +RDEPENDS:${PN} += " bash docker" + +SRC_URI = " \ + file://docker-binfmt \ + file://docker-binfmt.service \ +" + +S = "${WORKDIR}" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +do_install () { + install -d ${D}${sbindir} + install -m 0755 ${S}/docker-binfmt ${D}${sbindir} + + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${S}/docker-binfmt.service ${D}${systemd_system_unitdir} +} + +SYSTEMD_SERVICE:${PN} = "docker-binfmt.service" +SYSTEMD_AUTO_ENABLE:${PN} = "enable" From 3aed3704c028a0162c75f0327a19db4ed6c343d8 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 28 Jul 2023 00:08:30 -0300 Subject: [PATCH 111/163] commontorizon: kernel: beagleplay: Disable watchdog This is a temporary fix to the reboot loop issue Signed-off-by: Matheus Castello --- recipes-kernel/linux/files/beagleplay.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes-kernel/linux/files/beagleplay.cfg b/recipes-kernel/linux/files/beagleplay.cfg index 683252d8..d99548d7 100644 --- a/recipes-kernel/linux/files/beagleplay.cfg +++ b/recipes-kernel/linux/files/beagleplay.cfg @@ -3,3 +3,4 @@ # CONFIG_TI_K3_DSP_REMOTEPROC is not set # CONFIG_TI_K3_R5_REMOTEPROC is not set # CONFIG_TI_K3_M4_REMOTEPROC is not set +# CONFIG_WATCHDOG is not set From 92cfe1b1020be634f56cdef102633e9a2984aa51 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 31 Jul 2023 22:21:18 -0300 Subject: [PATCH 112/163] commontorizon: qemuarm64: Add DRM support Signed-off-by: Matheus Castello --- conf/machine/include/qemuarm64.inc | 2 ++ recipes-kernel/linux/files/qemuarm64.cfg | 41 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 recipes-kernel/linux/files/qemuarm64.cfg diff --git a/conf/machine/include/qemuarm64.inc b/conf/machine/include/qemuarm64.inc index 75b21cb6..cd6c36c5 100644 --- a/conf/machine/include/qemuarm64.inc +++ b/conf/machine/include/qemuarm64.inc @@ -29,3 +29,5 @@ PREFERRED_PROVIDER_virtual/kernel:qemuarm64 = "linux-yocto" PREFERRED_PROVIDER_virtual/kernel:qemuarm64:preempt-rt = "linux-yocto-rt" PREFERRED_PROVIDER_u-boot-default-script:qemuarm64 = "u-boot-distro-boot" + +OSTREE_KERNEL_ARGS:sota:append:qemuarm64 = "console=ttyAMA0 root=LABEL=otaroot rootfstype=ext4 logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " diff --git a/recipes-kernel/linux/files/qemuarm64.cfg b/recipes-kernel/linux/files/qemuarm64.cfg new file mode 100644 index 00000000..258bf88f --- /dev/null +++ b/recipes-kernel/linux/files/qemuarm64.cfg @@ -0,0 +1,41 @@ +# enable qemuarm drm +CONFIG_DRM=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_CIRRUS_QEMU=y +CONFIG_DRM_VBOXVIDEO=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_DDC=m +CONFIG_FB_BOOT_VESA_SUPPORT=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_HECUBA=m +CONFIG_FB_SVGALIB=m +CONFIG_FB_BACKLIGHT=m +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_CIRRUS=y +CONFIG_FB_ARC=y +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=y +CONFIG_FB_UVESA=y +CONFIG_FB_VESA=y +CONFIG_FB_SIMPLE=y +CONFIG_DRM_VMWGFX=m +CONFIG_DRM_VMWGFX_FBCON=y +CONFIG_USB_SERIAL=y +CONFIG_USB_SERIAL_CONSOLE=y +CONFIG_USB_SERIAL_CP210X=y From ce20ec42c9f763d932200cc2abd4e3d51c82c2f1 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 18 Aug 2023 10:30:29 -0400 Subject: [PATCH 113/163] rpi: Refactor common settings into an include file. Signed-off-by: Drew Moseley --- conf/machine/include/raspberrypi-common.inc | 56 +++++++++++++++++++ conf/machine/include/raspberrypi0-2w-64.inc | 2 +- conf/machine/include/raspberrypi3-64.inc | 57 +------------------- conf/machine/include/raspberrypi4-64.inc | 59 ++------------------- 4 files changed, 63 insertions(+), 111 deletions(-) create mode 100644 conf/machine/include/raspberrypi-common.inc diff --git a/conf/machine/include/raspberrypi-common.inc b/conf/machine/include/raspberrypi-common.inc new file mode 100644 index 00000000..88750675 --- /dev/null +++ b/conf/machine/include/raspberrypi-common.inc @@ -0,0 +1,56 @@ + +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" + +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" + +# Raspberry Pi +KERNEL_BUILTIN_WIREGUARD:rpi = "1" +CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" +PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot" +PREFERRED_PROVIDER_u-boot:rpi = "u-boot" +PREFERRED_PROVIDER_virtual/dtb = "" +WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" +WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" +PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-distro-boot" +PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-distro-boot" + +PREFERRED_PROVIDER_u-boot-fw-utils = "libubootenv" +PREFERRED_RPROVIDER_u-boot-fw-utils = "libubootenv" + +IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" + +# We need ota-ext4 and wic for rpi +IMAGE_FSTYPES_REMOVE = "" +IMAGE_BOOT_FILES:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " +IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} " +IMAGE_BOOT_FILES_REMOVE:sota:remove = "boot.scr-${MACHINE};boot.scr" +IMAGE_BOOT_FILES:append = " boot.scr-${MACHINE};boot.scr " + +OSTREE_KERNEL:rpi = "Image" +OSTREE_DEPLOY_DEVICETREE:rpi = "0" +KERNEL_IMAGETYPE:rpi = "Image" +KERNEL_IMAGETYPE:sota:rpi = "Image" + +LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" + +## Mimic meta-raspberrypi behavior +ENABLE_UART:rpi = "1" +SERIAL_CONSOLES = "115200;ttyAMA0" +KERNEL_SERIAL:sota:rpi = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" +OSTREE_KERNEL_ARGS:sota = " 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=614 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 ${KERNEL_SERIAL} usbhid.mousepoll=0 " +# This boot arguments are the same from torizon.bbclass +OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " + +## U-Boot entrypoints for rpi +UBOOT_ENTRYPOINT:rpi = "0x00008000" +UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" +UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" +UBOOT_BINARY_OTA_IGNORE:rpi = "1" + +BBMASK += " \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ + meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ + meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ +" diff --git a/conf/machine/include/raspberrypi0-2w-64.inc b/conf/machine/include/raspberrypi0-2w-64.inc index 07cd4933..cfc4f971 100644 --- a/conf/machine/include/raspberrypi0-2w-64.inc +++ b/conf/machine/include/raspberrypi0-2w-64.inc @@ -1,3 +1,3 @@ -require raspberrypi3-64.inc +require raspberrypi-common.inc KERNEL_DEVICETREE:raspberrypi0-2w-64:sota ?= " broadcom/bcm2710-rpi-zero-2.dtb overlays/vc4-fkms-v3d.dtbo overlays/rpi-ft5406.dtbo" diff --git a/conf/machine/include/raspberrypi3-64.inc b/conf/machine/include/raspberrypi3-64.inc index 88750675..82d1fd67 100644 --- a/conf/machine/include/raspberrypi3-64.inc +++ b/conf/machine/include/raspberrypi3-64.inc @@ -1,56 +1 @@ - -WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" - -CORE_IMAGE_BASE_INSTALL:append = "resize-helper" - -# Raspberry Pi -KERNEL_BUILTIN_WIREGUARD:rpi = "1" -CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" -PREFERRED_PROVIDER_virtual/bootloader = "u-boot" -PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" -PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot" -PREFERRED_PROVIDER_u-boot:rpi = "u-boot" -PREFERRED_PROVIDER_virtual/dtb = "" -WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" -WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" -PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-distro-boot" -PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-distro-boot" - -PREFERRED_PROVIDER_u-boot-fw-utils = "libubootenv" -PREFERRED_RPROVIDER_u-boot-fw-utils = "libubootenv" - -IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" - -# We need ota-ext4 and wic for rpi -IMAGE_FSTYPES_REMOVE = "" -IMAGE_BOOT_FILES:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " -IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} " -IMAGE_BOOT_FILES_REMOVE:sota:remove = "boot.scr-${MACHINE};boot.scr" -IMAGE_BOOT_FILES:append = " boot.scr-${MACHINE};boot.scr " - -OSTREE_KERNEL:rpi = "Image" -OSTREE_DEPLOY_DEVICETREE:rpi = "0" -KERNEL_IMAGETYPE:rpi = "Image" -KERNEL_IMAGETYPE:sota:rpi = "Image" - -LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" - -## Mimic meta-raspberrypi behavior -ENABLE_UART:rpi = "1" -SERIAL_CONSOLES = "115200;ttyAMA0" -KERNEL_SERIAL:sota:rpi = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyS0,115200", "", d)}" -OSTREE_KERNEL_ARGS:sota = " 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=614 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 ${KERNEL_SERIAL} usbhid.mousepoll=0 " -# This boot arguments are the same from torizon.bbclass -OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " - -## U-Boot entrypoints for rpi -UBOOT_ENTRYPOINT:rpi = "0x00008000" -UBOOT_DTB_LOADADDRESS:rpi = "0x02600000" -UBOOT_DTBO_LOADADDRESS:rpi = "0x026d0000" -UBOOT_BINARY_OTA_IGNORE:rpi = "1" - -BBMASK += " \ - meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ - meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ -" +require raspberrypi-common.inc \ No newline at end of file diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 0cf7fd86..1b3ca5a3 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -1,57 +1,8 @@ +require raspberrypi-common.inc -WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" - -CORE_IMAGE_BASE_INSTALL:append = "resize-helper" - -# Raspberry Pi -KERNEL_BUILTIN_WIREGUARD:rpi = "1" -CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" -PREFERRED_PROVIDER_virtual/bootloader = "u-boot" -PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot" -PREFERRED_PROVIDER_virtual/bootloader:rpi = "u-boot" -PREFERRED_PROVIDER_u-boot:rpi = "u-boot" -PREFERRED_PROVIDER_virtual/dtb = "" SOTA_DT_OVERLAYS:raspberrypi4-64 ?= "vc4-fkms-v3d-pi4.dtbo rpi-ft5406.dtbo" -WKS_FILE_DEPENDS_BOOTLOADERS:rpi = "virtual/bootloader" -WKS_FILE_DEPENDS:append:rpi = " u-boot-default-script" -PREFERRED_PROVIDER_u-boot-default-script:rpi = "u-boot-distro-boot" -PREFERRED_PROVIDER_u-boot-default-script:sota:rpi = "u-boot-distro-boot" - -PREFERRED_PROVIDER_u-boot-fw-utils = "libubootenv" -PREFERRED_RPROVIDER_u-boot-fw-utils = "libubootenv" - -IMAGE_FSTYPES:remove:rpi = "ext3 rpi-sdimg teziimg" - -# We need ota-ext4 and wic for rpi -IMAGE_FSTYPES_REMOVE = "" -IMAGE_BOOT_FILES:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} boot.scr uEnv.txt " -IMAGE_BOOT_FILES:sota:rpi = "${BOOTFILES_DIR_NAME}/* u-boot.bin;${SDIMG_KERNELIMAGE} ${@make_dtb_boot_files(d)} " -IMAGE_BOOT_FILES_REMOVE:sota:remove = "boot.scr-${MACHINE};boot.scr" -IMAGE_BOOT_FILES:append = " boot.scr-${MACHINE};boot.scr " - -OSTREE_KERNEL:rpi = "Image" -OSTREE_DEPLOY_DEVICETREE:rpi = "0" -KERNEL_IMAGETYPE:rpi = "Image" -KERNEL_IMAGETYPE:sota:rpi = "Image" -VC4DTBO ?= "vc4-fkms-v3d-pi4" +VC4DTBO:raspberrypi4-64 ?= "vc4-fkms-v3d-pi4" KERNEL_DEVICETREE:raspberrypi4-64:sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d-pi4.dtbo overlays/rpi-ft5406.dtbo" -KERNEL_BOOTCMD = "booti" - -LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" -PREFERRED_VERSION_linux-raspberrypi = "5.15.%" - -## Mimic meta-raspberrypi behavior -ENABLE_UART:rpi = "1" -SERIAL_CONSOLES = "115200;ttyAMA0" -KERNEL_SERIAL:sota:rpi = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyAMA0,115200", "", d)}" -OSTREE_KERNEL_ARGS:sota = " 8250.nr_uarts=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=614 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 ${KERNEL_SERIAL} usbhid.mousepoll=0 " -# This boot arguments are the same from torizon.bbclass -OSTREE_KERNEL_ARGS:sota:append:rpi = " root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " - -UBOOT_BINARY_OTA_IGNORE:raspberrypi4-64 = "1" - -BBMASK += " \ - meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex \ - meta-raspberrypi/recipes-bsp/u-boot/u-boot_%.bbappend \ - meta-common-torizon/recipes-bsp/u-boot/u-boot-toradex_%.bbappend \ -" +KERNEL_BOOTCMD:raspberrypi4-64 = "booti" +PREFERRED_VERSION_linux-raspberrypi:raspberrypi4-64 = "5.15.%" +KERNEL_SERIAL:sota:raspberrypi4-64 = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyAMA0,115200", "", d)}" From c7d2187ee74c34b0b9ddbf0dafed23457b00b4b9 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 18 Aug 2023 10:31:15 -0400 Subject: [PATCH 114/163] rpi4: Remove unnecessary PREFERRED_VERSION_linux-raspberrypi setting. This is already the default in kirkstone currently. Signed-off-by: Drew Moseley --- conf/machine/include/raspberrypi4-64.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/machine/include/raspberrypi4-64.inc b/conf/machine/include/raspberrypi4-64.inc index 1b3ca5a3..218b6755 100644 --- a/conf/machine/include/raspberrypi4-64.inc +++ b/conf/machine/include/raspberrypi4-64.inc @@ -4,5 +4,4 @@ SOTA_DT_OVERLAYS:raspberrypi4-64 ?= "vc4-fkms-v3d-pi4.dtbo rpi-ft5406.dtbo" VC4DTBO:raspberrypi4-64 ?= "vc4-fkms-v3d-pi4" KERNEL_DEVICETREE:raspberrypi4-64:sota ?= " broadcom/bcm2711-rpi-4-b.dtb overlays/vc4-fkms-v3d-pi4.dtbo overlays/rpi-ft5406.dtbo" KERNEL_BOOTCMD:raspberrypi4-64 = "booti" -PREFERRED_VERSION_linux-raspberrypi:raspberrypi4-64 = "5.15.%" KERNEL_SERIAL:sota:raspberrypi4-64 = "${@oe.utils.conditional("ENABLE_UART", "1", "console=ttyAMA0,115200", "", d)}" From 2bee90c5e6b20c01a1ce57a20ad42eebda783def Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Sat, 19 Aug 2023 12:51:00 -0400 Subject: [PATCH 115/163] Add support for Raspberrypi 0 Wifi Signed-off-by: Drew Moseley --- conf/machine/include/raspberrypi0-wifi.inc | 7 ++++++ .../linux/files/raspberrypi0-wifi.cfg | 22 +++++++++++++++++++ scripts/setup-environment-internal | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 conf/machine/include/raspberrypi0-wifi.inc create mode 100644 recipes-kernel/linux/files/raspberrypi0-wifi.cfg diff --git a/conf/machine/include/raspberrypi0-wifi.inc b/conf/machine/include/raspberrypi0-wifi.inc new file mode 100644 index 00000000..b8d9c6fa --- /dev/null +++ b/conf/machine/include/raspberrypi0-wifi.inc @@ -0,0 +1,7 @@ +require raspberrypi-common.inc + +KERNEL_DEVICETREE:raspberrypi0-wifi:sota ?= " bcm2708-rpi-zero-w.dtb overlays/vc4-fkms-v3d.dtbo overlays/rpi-ft5406.dtbo" +OSTREE_KERNEL:raspberrypi0-wifi = "zImage" +KERNEL_IMAGETYPE:raspberrypi0-wifi = "zImage" +KERNEL_IMAGETYPE:sota:raspberrypi0-wifi = "zImage" +KERNEL_BOOTCMD:raspberrypi0-wifi = "bootz" \ No newline at end of file diff --git a/recipes-kernel/linux/files/raspberrypi0-wifi.cfg b/recipes-kernel/linux/files/raspberrypi0-wifi.cfg new file mode 100644 index 00000000..fada48e3 --- /dev/null +++ b/recipes-kernel/linux/files/raspberrypi0-wifi.cfg @@ -0,0 +1,22 @@ +CONFIG_I2C_ALGOBIT=y +CONFIG_CEC_CORE=y +CONFIG_DRM=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_V3D=y +CONFIG_SND=y +CONFIG_SND_SOC=y +CONFIG_SND_BCM2835=y +CONFIG_DRM_VC4=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 5f575886..af16dd2b 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|raspberrypi0-2w-64\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf|beagleplay\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|raspberrypi0-2w-64\.conf|raspberrypi0-wifi\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf|beagleplay\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From c5f293f90ed96fd6077fd055846c65c36844f30a Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Thu, 31 Aug 2023 17:09:29 -0400 Subject: [PATCH 116/163] provision-device: Add device provisioning script to Torizon image. Signed-off-by: Drew Moseley --- recipes-images/images/torizon-core-common.inc | 1 + .../provision-device/provision-device | 189 ++++++++++++++++++ .../provision-device/provision-device_1.0.bb | 20 ++ 3 files changed, 210 insertions(+) create mode 100644 recipes-sota/provision-device/provision-device/provision-device create mode 100644 recipes-sota/provision-device/provision-device_1.0.bb diff --git a/recipes-images/images/torizon-core-common.inc b/recipes-images/images/torizon-core-common.inc index 3c5a4629..4ef32fc1 100644 --- a/recipes-images/images/torizon-core-common.inc +++ b/recipes-images/images/torizon-core-common.inc @@ -71,6 +71,7 @@ CORE_IMAGE_BASE_INSTALL:append:tdx = " \ CORE_IMAGE_BASE_INSTALL:append:sota = " \ auto-provisioning \ rac \ + provision-device \ " CORE_IMAGE_BASE_INSTALL:append:mx8-nxp-bsp = " \ diff --git a/recipes-sota/provision-device/provision-device/provision-device b/recipes-sota/provision-device/provision-device/provision-device new file mode 100644 index 00000000..48af1178 --- /dev/null +++ b/recipes-sota/provision-device/provision-device/provision-device @@ -0,0 +1,189 @@ +#!/usr/bin/env bash + +function GetDeviceID() { + cat "${SYSROOT_PATH_PREFIX}"/etc/hostname +} + +function RegisterDevice() { + + echo "== Registering device (deviceID: ${DEVICE_ID}) in system, and downloading credentials." + cd "$(mktemp -d)" || exit 1 + http_code=$(curl -s -w '%{http_code}' --max-time 30 -X POST -H "Authorization: Bearer $PROVISIONING_TOKEN" "$AUTOPROV_URL" -d "{\"device_id\": \"${DEVICE_ID}\", \"device_name\": \"${DEVICE_NAME}\"}" -o device.zip) + + if [[ ! $http_code -eq 200 ]]; then + # if we failed, device.zip will be a text file with the errors + echo -e "${RED}" + echo "Failed to download token :(" + echo "HTTP ERROR ${http_code}" + cat device.zip + echo -e "${NC}" + exit 1 + fi +} + +function BackupOldCredentials() { + echo "== Backing up any existing ota device creds" + ### move/backup any existing ota device creds + #BACKUP_DIR=$SOTA_DIR/backup/$(date +"%Y-%m-%d_%Hh%Mm%Ss") + BACKUP_DIR="$SOTA_DIR"/backup/$(jq -r .deviceUuid "$SOTA_DIR"/import/info.json)-$(jq -r .registeredName "$SOTA_DIR"/import/info.json) + mkdir -p "$BACKUP_DIR" + + ### If it doesn't already exist + mkdir -p "$SOTA_DIR"/import + + # WE don't care about failures here since there might not be any data + mv "$SOTA_DIR"/import/* "$BACKUP_DIR"/ &> /dev/null + mv "$SOTA_DIR"/sql.db "$BACKUP_DIR"/ &> /dev/null +} + +function WriteCredentials() { + echo "== Extracing device credentials from archive" + unzip device.zip -d "$SOTA_DIR"/import/ || { + echo "Failed to extract zip file" + exit 1 + } + + # Delete the sql.db in case aktualizr re-created it? + rm "$SOTA_DIR"/sql.db &> /dev/null && sync && sleep 3 + + ### WriteOut gateway.url + echo "== Creating new gateway.url ($GW_URL)" + echo "$GW_URL" > "$SOTA_DIR"/import/gateway.url || { + echo "Failed to create gateway.url" + exit 1 + } + + echo "" + echo "== Success!" + echo "Device has been registered with the system and credentials are in place!" + echo -e "${GREEN}" + jq . "$SOTA_DIR"/import/info.json + echo -e "${NC}" + +} + +function EnableDeviceMetrics() { + if [ -d "/som_sysroot" ]; then + # if we're in a container, we can't actually run aktualizr, so instead we just run strings. Ugly, but it works. + strings "${SYSROOT_PATH_PREFIX}"/usr/bin/aktualizr-torizon | grep -q "enable-data-proxy" || DISABLE_DEVICE_METRICS=1 + else + aktualizr-torizon --help | grep -q "enable-data-proxy" || DISABLE_DEVICE_METRICS=1 + fi + + ### Create (or delete) fluent-bit enabling file + if [ -z "$DISABLE_DEVICE_METRICS" ]; then + touch "${SYSROOT_PATH_PREFIX}"/etc/fluent-bit/enabled + else + rm "${SYSROOT_PATH_PREFIX}"/etc/fluent-bit/enabled &> /dev/null + fi + +} + +function StartServices() { + echo "== Restarting services..." + + echo "Restarting aktualizr..." + systemctl restart aktualizr + + if [ -z "$DISABLE_DEVICE_METRICS" ]; then + echo "Restarting fluent-bit..." + systemctl restart fluent-bit + else + echo "" + echo "Skipping fluent-bit because device metrics are disabled..." + fi +} + + +function usage { + cat < -g -t -d -n + + Optional arguments: + -u URL of provisioning endpoint + -g URL of device gateway + -d A device ID to use. If not set, will be generated based on /etc/hostname + -p Opt out of sending device metrics + -n A device Name to use. If not set, it will be autogenerated on the server side + + Required arguments: + -t Your secret token, provided by the OTA server + + Prerequisites: curl, jq, unzip +EOF +} + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' + +NC='\033[0m' # No Color + +# check if we're running in the provisioning container with the SOM sysroot mounted at the expected location +if [ -d "/som_sysroot" ]; then + SYSROOT_PATH_PREFIX=/som_sysroot +fi + +# set default values unless environment variables are set +[ -z "$AUTOPROV_URL" ] && AUTOPROV_URL=https://app.torizon.io/api/accounts/devices +[ -z "$GW_URL" ] && GW_URL=https://ota-ce.torizon.io +[ -z "$DEVICE_ID" ] && DEVICE_ID=$(GetDeviceID) +[ -z "$DEVICE_NAME" ] && DEVICE_NAME='' + +SOTA_DIR="${SYSROOT_PATH_PREFIX}"/var/sota + +while getopts ":hpu:g:t:d:n:" opt; do + case $opt in + h) + usage + exit 0 + ;; + p) + DISABLE_DEVICE_METRICS=1 + ;; + u) + AUTOPROV_URL=$OPTARG + ;; + g) + GW_URL=$OPTARG + ;; + t) + PROVISIONING_TOKEN=$OPTARG + ;; + d) + DEVICE_ID=$OPTARG + ;; + n) + DEVICE_NAME=$OPTARG + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit 1 + ;; + :) + echo "Option -$OPTARG requires an argument." >&2 + exit 1 + ;; + esac +done + +if [ -z "$PROVISIONING_TOKEN" ]; then + echo "Error: provisioning token not provided" >&2 + echo "" + usage + exit 1 +fi + +RegisterDevice +BackupOldCredentials +WriteCredentials +EnableDeviceMetrics +if [ -d "/som_sysroot" ]; then + echo "Running in a container, not restarting services..." +else + StartServices +fi + +echo "" +echo -e " Aktualizr should automatically connect with the server. For logs run: ${YELLOW}sudo journalctl -f -u aktualizr*${NC}" +echo "" \ No newline at end of file diff --git a/recipes-sota/provision-device/provision-device_1.0.bb b/recipes-sota/provision-device/provision-device_1.0.bb new file mode 100644 index 00000000..b18f1af5 --- /dev/null +++ b/recipes-sota/provision-device/provision-device_1.0.bb @@ -0,0 +1,20 @@ +SUMMARY = "Provision-device is a service to manually provision \ +the device to the Platform Services" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = " \ + file://provision-device \ +" + +S = "${WORKDIR}" + +RDEPENDS:${PN} = "bash jq curl unzip" + +inherit allarch + +do_install() { + install -d ${D}${sbindir} + install -m 0755 ${WORKDIR}/provision-device ${D}${sbindir} +} From e5666030cc02d8f37cdf19cc5f80f63cf3e98b6e Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 2 Oct 2023 22:05:05 -0300 Subject: [PATCH 117/163] common: qemuarm64: add resize-helper to base image This helps to use all the available space on the storage device. Signed-off-by: Matheus Castello --- conf/machine/include/qemuarm64.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/machine/include/qemuarm64.inc b/conf/machine/include/qemuarm64.inc index cd6c36c5..ef8acc5d 100644 --- a/conf/machine/include/qemuarm64.inc +++ b/conf/machine/include/qemuarm64.inc @@ -4,6 +4,8 @@ UBOOT_ENTRYPOINT = "0x40080000" WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" WKS_FILE:sota:qemuarm64 = "torizon-sota.wks" +CORE_IMAGE_BASE_INSTALL:append = "resize-helper" + OSTREE_KERNEL_ARGS:qemuarm64 = "quiet logo.nologo plymouth.ignore-serial-consoles splash console=ttyAMA0 root=LABEL=otaroot rootfstype=ext4" OSTREE_DEPLOY_DEVICETREE:qemuarm64 = "0" From c61d68abffb18a556482ca9bb9b50d396c96d30c Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 3 Oct 2023 13:25:57 -0300 Subject: [PATCH 118/163] Revert "labs: riscv: go: Fix use of the go cross compiler panic" This reverts commit b4e69b457b521e25f0f8df8d24242766e8b01b00. --- ...cmd-go-make-content-based-hash-generation-less-pedan.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch b/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch index b736469a..b27f52a6 100644 --- a/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch +++ b/recipes-devtools/go/go/0001-cmd-go-make-content-based-hash-generation-less-pedan.patch @@ -111,14 +111,14 @@ index 67d1193..62e1774 100644 + +func filterCompilerFlags(flags []string, keepfirst bool) []string { + var newflags []string -+ var realkeepfirst bool = keepfirst ++ var realkeepfirst bool = keepfirst + if !filterFlags { + return flags + } + for _, flag := range flags { + if strings.HasPrefix(flag, "-m") || realkeepfirst { + newflags = append(newflags, flag) -+ realkeepfirst = false ++ realkeepfirst = false + } + } + return newflags From d2e87a1a5beef5da3e162327d67733ea85ad5d7d Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 3 Oct 2023 23:16:03 -0300 Subject: [PATCH 119/163] common: Allow only development images for common Torizon OS Signed-off-by: Matheus Castello --- conf/common/sanity.inc | 8 ++++++++ conf/machine/include/common.inc | 9 --------- conf/template/local.conf | 2 -- recipes-images/images/torizon-core-common.inc | 2 ++ 4 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 conf/machine/include/common.inc diff --git a/conf/common/sanity.inc b/conf/common/sanity.inc index 4a36a69e..877bba10 100644 --- a/conf/common/sanity.inc +++ b/conf/common/sanity.inc @@ -2,8 +2,16 @@ python() { tdx_debug = d.getVar("TDX_DEBUG", "0") tdx_image = d.getVar("TDX_IMAGE", "torizon-core-common-docker") + machine = d.getVar("MACHINE", "undefined") if tdx_image == "torizon-core-common-docker-dev": if tdx_debug != "1": bb.fatal(f"You are trying to build a development image with TDX_DEBUG={tdx_debug}") + elif tdx: + # for common Torizon OS we are only allowing to build development images + bb.fatal( + f"\n\nYou are trying to build {machine} with TDX_IMAGE={tdx_image}" \ + "\nPlease build with TDX_IMAGE=torizon-core-common-docker-dev" \ + "\nhttps://github.com/commontorizon/Documentation/blob/main/BUILDING.md\n\n" + ) } diff --git a/conf/machine/include/common.inc b/conf/machine/include/common.inc deleted file mode 100644 index 90117514..00000000 --- a/conf/machine/include/common.inc +++ /dev/null @@ -1,9 +0,0 @@ - -def check_machine(d): - """Check if the MACHINE should uses meta-lmp or not""" - if 'imx' in d.getVar('MACHINE'): - return 'meta-lmp' - else: - return '' - -BBMASK += " ${@check_machine(d)} " diff --git a/conf/template/local.conf b/conf/template/local.conf index bee64ae5..d93e2954 100644 --- a/conf/template/local.conf +++ b/conf/template/local.conf @@ -112,5 +112,3 @@ PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}" TDX_IMAGE = "torizon-core-common-docker" include conf/machine/include/${MACHINE}.inc -include conf/machine/include/common.inc -include conf/common/sanity.inc diff --git a/recipes-images/images/torizon-core-common.inc b/recipes-images/images/torizon-core-common.inc index 4ef32fc1..2419dea3 100644 --- a/recipes-images/images/torizon-core-common.inc +++ b/recipes-images/images/torizon-core-common.inc @@ -1,3 +1,5 @@ +require ../../conf/common/sanity.inc + LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" From 095ed32fa7dd211fb4ee844e55028e05ecd2f3e8 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 5 Oct 2023 15:34:58 -0300 Subject: [PATCH 120/163] commontorizon: qemux86_64: Add support for qemux86-64 machine Signed-off-by: Matheus Castello --- conf/machine/include/qemux86-64.inc | 23 +++++++++++++ recipes-kernel/linux/files/qemux86-64.cfg | 41 +++++++++++++++++++++++ scripts/setup-environment-internal | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 conf/machine/include/qemux86-64.inc create mode 100644 recipes-kernel/linux/files/qemux86-64.cfg diff --git a/conf/machine/include/qemux86-64.inc b/conf/machine/include/qemux86-64.inc new file mode 100644 index 00000000..5f011163 --- /dev/null +++ b/conf/machine/include/qemux86-64.inc @@ -0,0 +1,23 @@ + +WKS_FILE:qemux86-64:sota = "efiimage-sota.wks" +WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" + +CORE_IMAGE_BASE_INSTALL:append = "resize-helper docker-binfmt" + +OSTREE_KERNEL_ARGS:qemux86-64 = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 quiet " +OSTREE_BOOTLOADER:qemux86-64 = "grub" +OSTREE_DEPLOY_DEVICETREE:qemux86-64 = "0" +EFI_PROVIDER:qemux86-64 = "grub-efi" +SOTA_CLIENT_FEATURES:remove = "ubootenv" +UBOOT_BINARY_OTA_IGNORE:qemux86-64 = "1" + +IMAGE_FSTYPES_REMOVE = "hddimg teziimg" +IMAGE_FSTYPES:append = " wic" + +hostname:pn-base-files = "${MACHINE}" +CORE_IMAGE_BASE_INSTALL:remove = "set-hostname" + +PREFERRED_PROVIDER_u-boot-default-script = "" +PREFERRED_PROVIDER_virtual/dtb = "" + +LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" diff --git a/recipes-kernel/linux/files/qemux86-64.cfg b/recipes-kernel/linux/files/qemux86-64.cfg new file mode 100644 index 00000000..258bf88f --- /dev/null +++ b/recipes-kernel/linux/files/qemux86-64.cfg @@ -0,0 +1,41 @@ +# enable qemuarm drm +CONFIG_DRM=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_CIRRUS_QEMU=y +CONFIG_DRM_VBOXVIDEO=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_DDC=m +CONFIG_FB_BOOT_VESA_SUPPORT=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_HECUBA=m +CONFIG_FB_SVGALIB=m +CONFIG_FB_BACKLIGHT=m +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_CIRRUS=y +CONFIG_FB_ARC=y +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=y +CONFIG_FB_UVESA=y +CONFIG_FB_VESA=y +CONFIG_FB_SIMPLE=y +CONFIG_DRM_VMWGFX=m +CONFIG_DRM_VMWGFX_FBCON=y +CONFIG_USB_SERIAL=y +CONFIG_USB_SERIAL_CONSOLE=y +CONFIG_USB_SERIAL_CP210X=y diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index af16dd2b..8684c74b 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -112,7 +112,7 @@ fi # Create a common list of "()", sorted by # Blacklist unsupported machines of TorizonCore MACHLAYERS=$(find layers/ -print | grep "conf/machine/.*\.conf" | - grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|raspberrypi0-2w-64\.conf|raspberrypi0-wifi\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf|beagleplay\.conf)' | + grep -E '(apalis.*\.conf|colibri.*\.conf|verdin.*\.conf|qemuarm64\.conf|genericx86-64\.conf|raspberrypi4-64\.conf|raspberrypi3-64\.conf|raspberrypi0-2w-64\.conf|raspberrypi0-wifi\.conf|intel-corei7-64\.conf|nezha-allwinner-d1\.conf|beaglebone-yocto\.conf|beagleplay\.conf|qemux86-64\.conf)' | grep -E -v '(imx7-nand|colibri-vf|tk1|colibri-imx7|colibri-imx6ull|verdin-am62-k3r5)\.conf' | sed -e 's/\.conf//g' -e 's/layers\///' | awk -F'/conf/machine/' '{print $NF "(" $1 ")"}' | LC_ALL=C sort) From 3566dbfd75e848c8578977c9453271e71a846efc Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 6 Oct 2023 17:03:49 -0400 Subject: [PATCH 121/163] Remove missing variable --- conf/common/sanity.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/common/sanity.inc b/conf/common/sanity.inc index 877bba10..f9e20b53 100644 --- a/conf/common/sanity.inc +++ b/conf/common/sanity.inc @@ -7,7 +7,7 @@ python() { if tdx_image == "torizon-core-common-docker-dev": if tdx_debug != "1": bb.fatal(f"You are trying to build a development image with TDX_DEBUG={tdx_debug}") - elif tdx: + else: # for common Torizon OS we are only allowing to build development images bb.fatal( f"\n\nYou are trying to build {machine} with TDX_IMAGE={tdx_image}" \ From d06e7c6ae09925bd48953ed3313c4b600d320a2f Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 6 Oct 2023 17:38:38 -0400 Subject: [PATCH 122/163] commontorizon: Convert sanity check to an event handler. This ensures it is only run once rather than any time it is included. Signed-off-by: Drew Moseley --- conf/common/sanity.inc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/common/sanity.inc b/conf/common/sanity.inc index f9e20b53..80cee704 100644 --- a/conf/common/sanity.inc +++ b/conf/common/sanity.inc @@ -1,12 +1,14 @@ +addhandler common_torizon_sanity_handler +common_torizon_sanity_handler[eventmask] = "bb.event.ParseCompleted" -python() { +python common_torizon_sanity_handler() { tdx_debug = d.getVar("TDX_DEBUG", "0") tdx_image = d.getVar("TDX_IMAGE", "torizon-core-common-docker") machine = d.getVar("MACHINE", "undefined") if tdx_image == "torizon-core-common-docker-dev": if tdx_debug != "1": - bb.fatal(f"You are trying to build a development image with TDX_DEBUG={tdx_debug}") + bb.fatal(f"You are trying to build a development image with TDX_DEBUG={tdx_debug}\n\n") else: # for common Torizon OS we are only allowing to build development images bb.fatal( From b7d617a20124e1123e144d19f053d0feac112ec0 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sun, 15 Oct 2023 18:38:55 -0300 Subject: [PATCH 123/163] common: torizon: Fix i915 hwmon for linux-intel 5.10 Signed-off-by: Matheus Castello --- conf/machine/include/intel-corei7-64.inc | 3 ++ .../files/0001-i915-hwmon-dgfx-check.patch | 30 +++++++++++ .../linux/files/intel-corei7-64.cfg | 54 +++++++++++++++++++ recipes-kernel/linux/linux-intel%.bbappend | 10 ++-- recipes-kernel/linux/linux-intel/fragment.cfg | 54 ------------------- 5 files changed, 92 insertions(+), 59 deletions(-) create mode 100644 recipes-kernel/linux/files/0001-i915-hwmon-dgfx-check.patch delete mode 100644 recipes-kernel/linux/linux-intel/fragment.cfg diff --git a/conf/machine/include/intel-corei7-64.inc b/conf/machine/include/intel-corei7-64.inc index 738abf2f..d17871ce 100644 --- a/conf/machine/include/intel-corei7-64.inc +++ b/conf/machine/include/intel-corei7-64.inc @@ -20,5 +20,8 @@ CORE_IMAGE_BASE_INSTALL:remove = "set-hostname" PREFERRED_PROVIDER_u-boot-default-script = "" PREFERRED_PROVIDER_virtual/dtb = "" +PREFERRED_PROVIDER_virtual/kernel = "linux-intel" +PREFERRED_VERSION_linux-intel = "5.10.%" + IMAGE_INSTALL:remove = " minnowboard-efi-startup" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" diff --git a/recipes-kernel/linux/files/0001-i915-hwmon-dgfx-check.patch b/recipes-kernel/linux/files/0001-i915-hwmon-dgfx-check.patch new file mode 100644 index 00000000..6fff5e07 --- /dev/null +++ b/recipes-kernel/linux/files/0001-i915-hwmon-dgfx-check.patch @@ -0,0 +1,30 @@ +From 73f7adae5b49685c7e18f811039c8de543cdf0ac Mon Sep 17 00:00:00 2001 +From: Matheus Castello +Date: Sun, 15 Oct 2023 17:39:14 -0300 +Subject: [PATCH] i915: hwmon: Add check for the dGfx platform + +The hwmon should be available only for dGfx platform + +Signed-off-by: Matheus Castello +--- + drivers/gpu/drm/i915/i915_hwmon.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/gpu/drm/i915/i915_hwmon.c b/drivers/gpu/drm/i915/i915_hwmon.c +index 6e0944af3131..d0ee493f1e7c 100644 +--- a/drivers/gpu/drm/i915/i915_hwmon.c ++++ b/drivers/gpu/drm/i915/i915_hwmon.c +@@ -500,6 +500,10 @@ void i915_hwmon_register(struct drm_i915_private *i915) + struct device *hwmon_dev; + struct i915_hwmon_drvdata *ddat; + ++ /* hwmon is available only for dGfx */ ++ if (!IS_DGFX(i915)) ++ return; ++ + hwmon = kzalloc(sizeof(*hwmon), GFP_KERNEL); + if (!hwmon) + return; +-- +2.42.0 + diff --git a/recipes-kernel/linux/files/intel-corei7-64.cfg b/recipes-kernel/linux/files/intel-corei7-64.cfg index e69de29b..10a55a34 100644 --- a/recipes-kernel/linux/files/intel-corei7-64.cfg +++ b/recipes-kernel/linux/files/intel-corei7-64.cfg @@ -0,0 +1,54 @@ +CONFIG_I2C_ALGOBIT=y +CONFIG_CEC_CORE=y +CONFIG_DRM=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +CONFIG_FB_SYS_FOPS=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_DRM_PANEL_SIMPLE=y +# CHECK CONFIG +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_CGROUP_SCHED=y +CONFIG_BLK_CGROUP=y +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_IP_VS=m +CONFIG_IP_VS_NFCT=y +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_RR=m +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_APPARMOR=y +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_IPVLAN=m +CONFIG_AUFS_FS=m +# INTEL +CONFIG_DRM_I915=y +# AMD +CONFIG_DRM_AMDGPU=y +CONFIG_DRM_AMDGPU_SI=y +CONFIG_DRM_AMDGPU_CIK=y +CONFIG_DRM_AMDGPU_USERPTR=y +CONFIG_DRM_AMD_ACP=y +CONFIG_DRM_AMD_DC=y +CONFIG_DRM_AMD_DC_DCN=y +CONFIG_DRM_AMD_DC_HDCP=y +CONFIG_DRM_AMD_DC_SI=y +CONFIG_DRM_AMD_SECURE_DISPLAY=y +# VMWARE +CONFIG_DRM_VMWGFX=y +CONFIG_DRM_VMWGFX_FBCON=y +# VIRTUAL BOX +CONFIG_DRM_VBOXVIDEO=y +CONFIG_VBOXGUEST=m +CONFIG_VBOXSF_FS=m +# QEMU +CONFIG_DRM_CIRRUS_QEMU=y diff --git a/recipes-kernel/linux/linux-intel%.bbappend b/recipes-kernel/linux/linux-intel%.bbappend index 605159e6..b062f8bc 100644 --- a/recipes-kernel/linux/linux-intel%.bbappend +++ b/recipes-kernel/linux/linux-intel%.bbappend @@ -1,8 +1,8 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/linux-intel:" +require common.inc -SRC_URI:append = " \ - file://fragment.cfg \ -" +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" -require common.inc +SRC_URI:append = "\ + file://0001-i915-hwmon-dgfx-check.patch \ +" diff --git a/recipes-kernel/linux/linux-intel/fragment.cfg b/recipes-kernel/linux/linux-intel/fragment.cfg deleted file mode 100644 index 10a55a34..00000000 --- a/recipes-kernel/linux/linux-intel/fragment.cfg +++ /dev/null @@ -1,54 +0,0 @@ -CONFIG_I2C_ALGOBIT=y -CONFIG_CEC_CORE=y -CONFIG_DRM=y -# CONFIG_DRM_DEBUG_MM is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_SCHED=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_DRM_PANEL_SIMPLE=y -# CHECK CONFIG -CONFIG_NETFILTER_XT_MATCH_IPVS=m -CONFIG_CGROUP_SCHED=y -CONFIG_BLK_CGROUP=y -CONFIG_BLK_DEV_THROTTLING=y -CONFIG_CFS_BANDWIDTH=y -CONFIG_IP_VS=m -CONFIG_IP_VS_NFCT=y -CONFIG_IP_VS_PROTO_TCP=y -CONFIG_IP_VS_PROTO_UDP=y -CONFIG_IP_VS_RR=m -CONFIG_SECURITY_SELINUX=y -CONFIG_SECURITY_APPARMOR=y -CONFIG_BRIDGE_VLAN_FILTERING=y -CONFIG_IPVLAN=m -CONFIG_AUFS_FS=m -# INTEL -CONFIG_DRM_I915=y -# AMD -CONFIG_DRM_AMDGPU=y -CONFIG_DRM_AMDGPU_SI=y -CONFIG_DRM_AMDGPU_CIK=y -CONFIG_DRM_AMDGPU_USERPTR=y -CONFIG_DRM_AMD_ACP=y -CONFIG_DRM_AMD_DC=y -CONFIG_DRM_AMD_DC_DCN=y -CONFIG_DRM_AMD_DC_HDCP=y -CONFIG_DRM_AMD_DC_SI=y -CONFIG_DRM_AMD_SECURE_DISPLAY=y -# VMWARE -CONFIG_DRM_VMWGFX=y -CONFIG_DRM_VMWGFX_FBCON=y -# VIRTUAL BOX -CONFIG_DRM_VBOXVIDEO=y -CONFIG_VBOXGUEST=m -CONFIG_VBOXSF_FS=m -# QEMU -CONFIG_DRM_CIRRUS_QEMU=y From dd860aa20e8620e0f4fa4ceaf599124afc27d332 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 16 Oct 2023 23:18:05 -0300 Subject: [PATCH 124/163] common: torizon: All the machines use ostree-uboot-env MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was an regression from the rebase 😔. Signed-off-by: Matheus Castello --- recipes-extended/ostree/ostree-torizon.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-extended/ostree/ostree-torizon.inc b/recipes-extended/ostree/ostree-torizon.inc index cd62e601..d30fdd4f 100644 --- a/recipes-extended/ostree/ostree-torizon.inc +++ b/recipes-extended/ostree/ostree-torizon.inc @@ -43,7 +43,7 @@ def get_rdeps(d): if is_ti(d): # TI return 'ostree-uboot-env' if d.getVar('PREFERRED_PROVIDER_u-boot') else '' else: # NXP/x86 generic/QEMU - return 'ostree-uboot-env' if d.getVar('PREFERRED_PROVIDER_u-boot-default-script') and ('raspberrypi' not in d.getVar('MACHINE')) else '' + return 'ostree-uboot-env' if d.getVar('PREFERRED_PROVIDER_u-boot-default-script') else '' DEPENDS:append:class-target = " ${@get_deps(d)}" RDEPENDS:${PN}:append:class-target = " ${@get_rdeps(d)}" From df517cfa16b7f7d47150737f9e4d0d9c954c23ed Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 17 Oct 2023 21:03:32 -0300 Subject: [PATCH 125/163] beagleplay: Update virtual/bootloader to u-boot-ti-staging Signed-off-by: Matheus Castello --- conf/machine/include/beagleplay.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/machine/include/beagleplay.inc b/conf/machine/include/beagleplay.inc index 791f9d30..63fa78b7 100644 --- a/conf/machine/include/beagleplay.inc +++ b/conf/machine/include/beagleplay.inc @@ -26,10 +26,10 @@ CORE_IMAGE_BASE_INSTALL:append = "resize-helper" KERNEL_BUILTIN_WIREGUARD:beagleplay = "1" CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" -PREFERRED_PROVIDER_virtual/bootloader = "u-boot-bb.org" -PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-bb.org" -PREFERRED_PROVIDER_virtual/bootloader:beagleplay = "u-boot-bb.org" -PREFERRED_PROVIDER_u-boot:beagleplay = "u-boot-bb.org" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot-ti-staging" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-ti-staging" +PREFERRED_PROVIDER_virtual/bootloader:beagleplay = "u-boot-ti-staging" +PREFERRED_PROVIDER_u-boot:beagleplay = "u-boot-ti-staging" PREFERRED_PROVIDER_virtual/dtb = "" WKS_FILE_DEPENDS_BOOTLOADERS:beagleplay = "virtual/bootloader" WKS_FILE_DEPENDS:append:beagleplay = " u-boot-default-script" From 0f05a0f56b84d2e72c2e215ab04a845dacd14037 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 17 Oct 2023 21:15:39 -0300 Subject: [PATCH 126/163] beagleplay: ostree: beagleplay is TI but does not use the Toradex BSP Signed-off-by: Matheus Castello --- recipes-extended/ostree/ostree-torizon.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/recipes-extended/ostree/ostree-torizon.inc b/recipes-extended/ostree/ostree-torizon.inc index d30fdd4f..e1f650f5 100644 --- a/recipes-extended/ostree/ostree-torizon.inc +++ b/recipes-extended/ostree/ostree-torizon.inc @@ -34,7 +34,8 @@ def is_ti(d): return False def get_deps(d): - if is_ti(d): # TI + # NOTE: beagleplay is TI but does not use the Toradex BSP + if is_ti(d) and ('beagleplay' not in d.getVar('MACHINE')) : # TI return 'u-boot-toradex-ti' if d.getVar('PREFERRED_PROVIDER_u-boot') else '' else: # NXP/x86 generic/QEMU return 'u-boot-default-script' if d.getVar('PREFERRED_PROVIDER_u-boot-default-script') else '' From 7acd301a4bcf9cd4d1cc5bbd834d5907187f50fd Mon Sep 17 00:00:00 2001 From: Common Torizon Date: Fri, 27 Oct 2023 11:20:24 +0000 Subject: [PATCH 127/163] Revert "beagleplay: Update virtual/bootloader to u-boot-ti-staging" This reverts commit 473f1377d412ef58a201a32bba58620e242be032. --- conf/machine/include/beagleplay.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/machine/include/beagleplay.inc b/conf/machine/include/beagleplay.inc index 63fa78b7..791f9d30 100644 --- a/conf/machine/include/beagleplay.inc +++ b/conf/machine/include/beagleplay.inc @@ -26,10 +26,10 @@ CORE_IMAGE_BASE_INSTALL:append = "resize-helper" KERNEL_BUILTIN_WIREGUARD:beagleplay = "1" CORE_IMAGE_BASE_INSTALL:remove = "kernel-module-wireguard wireguard-tools" -PREFERRED_PROVIDER_virtual/bootloader = "u-boot-ti-staging" -PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-ti-staging" -PREFERRED_PROVIDER_virtual/bootloader:beagleplay = "u-boot-ti-staging" -PREFERRED_PROVIDER_u-boot:beagleplay = "u-boot-ti-staging" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot-bb.org" +PREFERRED_PROVIDER_virtual/bootloader:sota = "u-boot-bb.org" +PREFERRED_PROVIDER_virtual/bootloader:beagleplay = "u-boot-bb.org" +PREFERRED_PROVIDER_u-boot:beagleplay = "u-boot-bb.org" PREFERRED_PROVIDER_virtual/dtb = "" WKS_FILE_DEPENDS_BOOTLOADERS:beagleplay = "virtual/bootloader" WKS_FILE_DEPENDS:append:beagleplay = " u-boot-default-script" From 63068d64aa2cfd4605c9ccd920edda9b1450a113 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 10 Nov 2023 13:46:05 -0500 Subject: [PATCH 128/163] testapps: Remove connman utilities. For TorizonCommon we use NetworkManager by default. The -dev image includes testapps and they bring in connman which then breaks NetworkManager. Signed-off-by: Drew Moseley --- .../packagegroups/packagegroup-core-tools-testapps.bbappend | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend diff --git a/recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend b/recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend new file mode 100644 index 00000000..61534e30 --- /dev/null +++ b/recipes-core/packagegroups/packagegroup-core-tools-testapps.bbappend @@ -0,0 +1,5 @@ +RDEPENDS:${PN}:remove = "\ + connman-tools \ + connman-tests \ + connman-client \ + " From 5ed54b450f9d91dd3fac0484810e87aee93632e0 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Tue, 7 Nov 2023 12:13:55 -0500 Subject: [PATCH 129/163] u-boot-ostree-scr-fit: Remove bbappend for missing recipe. This seems to be something from meta-lmp that is not present in the common-torizon layers. Signed-off-by: Drew Moseley --- recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend diff --git a/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend b/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend deleted file mode 100644 index 0dcff78d..00000000 --- a/recipes-bsp/u-boot/u-boot-ostree-scr-fit.bbappend +++ /dev/null @@ -1,5 +0,0 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" - -SRC_URI:append = " \ - file://boot.cmd \ -" From 58590fefef83ab61ebb9f38132a1d0a9a66ac63e Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Tue, 7 Nov 2023 12:28:49 -0500 Subject: [PATCH 130/163] linux-yocto: Remove unavailable config option DEBUG_INFO_NONE. This does not exist on the kernel version in use with kirkstone. It seems to be added in 5.18. Signed-off-by: Drew Moseley --- recipes-kernel/linux/files/debug.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes-kernel/linux/files/debug.cfg b/recipes-kernel/linux/files/debug.cfg index dcdef4e2..46b1d58e 100644 --- a/recipes-kernel/linux/files/debug.cfg +++ b/recipes-kernel/linux/files/debug.cfg @@ -1,6 +1,5 @@ # kgdb # CONFIG_STRICT_KERNEL_RWX is not set -# CONFIG_DEBUG_INFO_NONE is not set # CONFIG_DEBUG_INFO_REDUCED is not set CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_INFO=y From d328af65da4b7dc165e2b5d1d24406cf3ac310d8 Mon Sep 17 00:00:00 2001 From: Leonardo Held Date: Fri, 15 Dec 2023 11:34:36 -0300 Subject: [PATCH 131/163] images: update include ff4746b refactored the include files to accomodate for the reference minimal image (previously 'lite'). Signed-off-by: Leonardo Held --- recipes-images/images/torizon-core-common-docker.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-images/images/torizon-core-common-docker.bb b/recipes-images/images/torizon-core-common-docker.bb index c406433a..b0072ace 100644 --- a/recipes-images/images/torizon-core-common-docker.bb +++ b/recipes-images/images/torizon-core-common-docker.bb @@ -1,7 +1,7 @@ SUMMARY = "TorizonCore" DESCRIPTION = "TorizonCore Linux with no containers pre-provisioned." -require torizon-core-container.inc +require torizon-core-common.inc CORE_IMAGE_BASE_INSTALL:append = " \ docker-ce \ From 803bc4222283b33b8349cfd1fbeef3c8d8a91fd9 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 22 Dec 2023 00:28:34 -0300 Subject: [PATCH 132/163] common: intel-corei7-64: Add igc driver The Seeed Studio Odyssey board has a Intel I225-LM network chip, so to support it we need to add the igc driver to the kernel. Signed-off-by: Matheus Castello --- recipes-kernel/linux/files/intel-corei7-64.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes-kernel/linux/files/intel-corei7-64.cfg b/recipes-kernel/linux/files/intel-corei7-64.cfg index 10a55a34..8e627c7e 100644 --- a/recipes-kernel/linux/files/intel-corei7-64.cfg +++ b/recipes-kernel/linux/files/intel-corei7-64.cfg @@ -32,6 +32,8 @@ CONFIG_IPVLAN=m CONFIG_AUFS_FS=m # INTEL CONFIG_DRM_I915=y +# INTEL NETWORK +CONFIG_IGC=m # AMD CONFIG_DRM_AMDGPU=y CONFIG_DRM_AMDGPU_SI=y From 1930f69fc40db1269b7aad295767a24255ce0bc8 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 2 Jan 2024 20:07:17 -0300 Subject: [PATCH 133/163] common: setup-environment-internal: remove useless message Signed-off-by: Matheus Castello --- scripts/setup-environment-internal | 49 ------------------------------ 1 file changed, 49 deletions(-) diff --git a/scripts/setup-environment-internal b/scripts/setup-environment-internal index 8684c74b..efe4d623 100755 --- a/scripts/setup-environment-internal +++ b/scripts/setup-environment-internal @@ -356,52 +356,3 @@ EOF done fi fi - -# cat <' - -# Some of common targets are: - - torizon-core-docker - torizon-minimal - torizon-core-podman - -# EOF - -if [ "${MACHINE}" = "qemuarm64" ]; then - cat < System -> Extended Features -> Enable EFI - Start the machine - -EOF -fi From 93912f450c295f2cc629b496fff0febb26e69aa2 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 11 Jan 2024 20:48:07 -0300 Subject: [PATCH 134/163] common: plymouth: update splash screen for Torizon OS Signed-off-by: Matheus Castello --- .../plymouth/files/torizon-splash-dev-new.png | Bin 0 -> 30777 bytes .../plymouth/files/torizon-splash-new.png | Bin 0 -> 29096 bytes recipes-core/plymouth/plymouth_%.bbappend | 6 ++++-- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 recipes-core/plymouth/files/torizon-splash-dev-new.png create mode 100644 recipes-core/plymouth/files/torizon-splash-new.png diff --git a/recipes-core/plymouth/files/torizon-splash-dev-new.png b/recipes-core/plymouth/files/torizon-splash-dev-new.png new file mode 100644 index 0000000000000000000000000000000000000000..c0d8cdadcfa30ed0bba51407a7845619dc98c8e2 GIT binary patch literal 30777 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

C zHSw*m$j)}a>(}i_Pa8_7p8MQX*>=?Nw=QSmjy6V6>Txz+MuOhcU2{maaYoS(A@bh);Aj_ z+f{@3Ry^q#@%T!%E#zMR5<+LMy}02ZUcpQC$ElLn=H1bb0-@O6MXS~E<>j1IZHVekqTyt*kdK5-0A@%K zWLAaICgj|bwKFA(w?w(h2rCO#M^XV6p*$pD0Lb|128kGzPw8$l zcv%p>J}HMZM50ab7?N!G1)S_HNfO|49xrdg&Ke3R1f116(6~pL)2YxC%_&X+n``73 z#neP?V8Fsiq4mCgmMWS#X1r6qz%|f9!AyImSDBizMGn^C{6H5}$O?_s*Ez6EFzit_)GZ#%h)?OQJ4> zrSe;)RMkVo_lSpas7Ln}D{^KPTs4z4M>jOFKXkTd=qA~Z?^fj?)Q8bc&qC$xsq$p^ z3#r9I+3XSft;Nak9~{C{MYQJM8WXNy?^kr{tFc1leIzM%pzS|kbg!e!&1g0fv0q6% zrmu5-j*IwVHyg9yxf0F+i)9`yoOXIWGbEEL%xf*RcPQqxbtoG2dc3H_NOy(7UaOfz zvC=ej(vZ#rH?n++C4l{AklU@%r`OEYrXAxgWi_ic>KHzBI5eVrh5oi>sy(>g=j(!> zg0c;4?AZRdX=$%uK=qwQWOc}5c$M>K^uP!~oRrl>ieGipirx!|1AbVFAiVj!ar`Ly zsOV^TVV~y7i<`5Tg{$0ix^$BlT-`j+}5=Bdr8?Joi^J_ z(Ui$9W*|songz%uz0ZJN|2f*$55=J)#QePLe<%bdmO~#!#{fewlY`F3gD#IqCP?Y` zT|xp|-VHz5ha8 zeg9MK0CEK!vv1$Tz6@0#LUETaaAuJRkn}LyEIw*EzGyb1hW5wAJlZOZpaS%e8XIYF zKCBCKd32~I^f%%sI*QEN&4otzd&4}^HTt6zpt`}Umefy!+T9FsreAXXWc8N59&YlL z+cWOxA@Rejw{lnT?GzV1C|hCWKY2kB0tKF4REK^?y)K6@<#B_61msCZ^a+Vy#LID_ z_aexbQu0NC9P)O45v2Z$mS>eE%58E~iz8_C(_0IAy8pns<<>=v1^=yquc^x-fA8;@ z*sF)Cb2WuKm&X;~+!4vE`;AS3sJBAhc!l3|zO<(_j4dpDw_d8t^AlzSJVTs?4s1YE ztY=s|<992+f=mBi=-;;__Y}S!hgTzQVo}J3d)m{H%IWZ6NN=MFEYgVfI%r046Y<>~ zlPq`u9i^WCQEiL+Dul<6x60)7=pmL(!`24PM;*(zj)-k}>iV~b4p2#k>fOxDca*8R zi%6KSPvr8kHJ9L5U*3#TNvem>hT&?01@Dd*MTfnlR?%`$nQIlQ61~&%pFBTx1kWQD z@k#-gluLF6)v;G1LCg46ef4 zNmTIocG=oQ)X6(ib*d0;@z%5o9Q^}2v41NUN)PYDSbaa=;gi)xdmZ`bhj~-eSa>7F zUF&qdWB^vvc<4=F}x=o?uR&oNJ)R;9|e?L1!nz9l9RH1DtPka{4DkBnjy zjmu&vPwM%tNVf%Nk*FM^%oMBe^`rKG@-@v8syy1(7{nML7DRN|GCCFdzpM_Wjd+TG z;)=RPG@14L5#L2^W)zVLF5{LBge~J0LK@3Ud7CM4KU$uA@J_eN@`yB?CY$!WAnxok z1F@x9*T($`|HAt8c0{gVtR8h-Wy{$F6vHI?CLcEaWvJzhQ(Cy`j1uU%^CH7FjB8t3 z8vF!vn-~>necfHzSIciQrjA|yGb_{VKS;g!vk=$g>&Bw?f+h5>yP0PF;%{31kN4vnA)B)jE%NWt6UJ&*~U?0_BIg#*F_mdU_jJ_H<86$@Mel!y&lo zmDter&aiIFyqkDatd&c{=XdLfA+$dE1@p0rB;EE?tX}A)t~*8cpONN3>IjanB=S_p z+!BqYo*>@i>!FvLEkhrT81Q0uZx5562s!9{DGG%AL~(D$5|T z>^_w*1iH3NT#`IyDm{d}P7mAjI_<()xz9YL?!aYD)t+AdTj5rxW2!F-;V&a+yL_6{ zR9(oth-EzTkcVu%{^;1w;ml(S2MP}U`w8b?i;~l?OKlazu+A`-`_~I4pHHE;2I?O8 ze6q#x5zY*;Dh}nF3)&UFPpO~rkAlPjt_Lhk(zYPnRBC#wDpNWzXjCnwp_n33??{8X zS)B}TGgY54#TVMnFqz<1T)OTunlKvPIA}fLuKK1kzA?tMXLCf=OS?|uA_dj=(EaK2I|0i(^a804*;MDAF9$|dFFpw(#jaF!gen;OF`+|lx$6uzUd2VLP7cWe_(f$g zdcL54b_oZS8Cw^>0cND@f32$LsG_Pq)$v^BEa+t|5E}vumuWQ#OOmy){HiRI!KP;* z&PI_pJDd7mbjD-6(S!^Z@^@buXog4R;slvTZHaXOdI0Z-Ekk(x3o|8G{YyCY#5Mh+ zZ9Yjrp`?v3SyiBASCKjE199yym)9KlP&-7cKqcLNO^2!iUupUA3J_~-r6G=35U}4E z0Qm{OY|kp<^<3|uU&x7x;V;;gZ?7y&g=gGE6D0G51HlgWx8Op*>k9)!5WlA~4<8J7 z)Hih)Z|J$+O5^jhkOlOhQk%~rfa^1Dz|sXV;KY`cgN|LX?9MGp4c~jFwW~g5 z3l%{Pg-Y9ZCB|Dz8lOb8wDAfh`=r@gjcZB3HF00F2BdognLb)Xy1RIv=89gaK0$y= z&FkKb!lZH{`dSDX;X4!RfmE!UyYQRz=2nI7_0D)_eNA_k9MNdm&QAJ%@-DNIYv2N< zxPm)JPsJ;?X!8)km>@1?mxtpaK_R!==~PDJQX3ja2vJR0pPOWJY;X*Yx2;N5dax)- z4PxV+%ah;>^|nAASox~DO_S@YxEBWk^t4%Nv|p%z){Q6 z9DG&+;mFkjP1Hg54kLOM3l2Vm=Bq>lbsW1oMzl&i-9=pzWfgMrr$0QBEo*AgZZHq^ zq@OX#f37lXJn7Ycj^IZ>so-h%*$k4bU=rKCBOz$v^3j65BIGfBKD$mzyx_RJj%IXDz z51dEj2l1FZTZ(#IaAyS>nDJ^7kFR9>_*71BXvrxr3n9*(zwQr5Fa)!P>Rm<(zZoAe zVo)Ph7(+*W?G^c_KJC=@AS7P=1LAkJXOYa{V2HbvD6zJpt|V^BvPcGHITOX6MwRF| zOAt2^!!>Y8UL>)6;{M{bVa=nG@^HLRXaz#&R>9Y~1lv{M!OtK2eqHp{6?qb7!lu;? zu92_OrT)Cx`CocjPfT?NM^P?w|A3cER21*%np6=HFP{x#dRBYQ4~Z#xYbpFB-{+e)Ws4o^qdcIWs3n@q*49nH5ihO zkEAa5j@17%A1jm@_ZKo;lvw9=r~wHeT}0PHj=M^eOASl${im z^hu=b5%J~nMA+#X!W_?gG%7UnuoNpE{_RGHWy~tz5;h)>?lQkc{Ypa52u7j>ZCzM~ zBx4cC>2@iQB^*z!gm@@VI_P&qZ_1#z2HWxLVRYP&?QHp-WHQA!^${1%v6>yf`vRMV zSF3ro&Y{iHp+=;hDm>-zdT#46jY64u)1|q@)Ue2Pnu>ID&p$Cbb zd)rDb;8QwyZd?i_EM0dAT zVZrgBE)?eoR7@LUcBH>tz|%8neVZA@HSo5$(Gz{6ci}gWDI`iqOms_{+KOfgJ;0+K zz0R`j{?(08P?Q>p(bC@>KhO#@?+1v7sPY|FvVSE|nbd?EBnNwRn4w!P+k9X#zhZ1B~x zICE+3dHHvf36v$8;AIcWqX+;}cM%<#%7G1=h%APyC^^^ML-AQTB!!}puh|poOpFpL zs|fq&|NVIEPrq_pH&4|~AI_6G^>v{7#NO<+%_C>&DA1B|w&3UQkKb0MPmvP6ZiUxw zUAIXgpH^Zcc;BQa1|@9izbJlwxO|V8e7r<$444GP$ODSVE>k;9+zEe^NW__BSyd^j z%8l6hA_na4wKzTr4&3Tup&ZiN`j}Lt0g!LO!OCKM4KDjj3o zzrwY80@sXR=cMG!z|X%C!@r2z=N2nW4iod!Eq*hBZoD_{Hz%C4Y=fQXZ0f{!!^FrV zv*APR4$bY%P~0rRC1v1WZXnm|VV%YpqqLQ|VwU(`A=&RE|7Yy@j#xI0!sq1eUI8 z3RSVe{9)24FGKnX10B$9IL*2Iu*dnApfVhqz)PH@MSVFNUkzmel)yuF$nVk1l^rRe zPw7*6_zqile#{lXq948R{;jW89cjVk`Z8V8Lwp)`f~9piMaa>mT{!|DMkdXV6ELe% zibD`n&jO|!$21Z=VZA7^^~G8RKGnD%z_{rkX>icJGjr<4hysZa1L~QARAc=wU~WH~ zmbtVRnrEx){tCm|*N44dzR75v><3E`rz+!jW0*oEc5qx(z>?hxc2EfNRN{FU&-kBt z;dZFYp)Fg_5My}?f)U-uqZ=iTj^Y?Tm1k>WZK4Tlo=$C&;dM51$QvNfi(Gn}5vY=e zpHJ%in{HO?$YY$gcUNiMtbvp*eTw-eJj(nulQVtlQVBaQ^W)i-X{K~CC?gx>y|41; ztNktyFwU&&o>k#ek8e(X7$1wi1jI3~zkW|;ay0o&(XaWVl|r-s;jVkAu0-v^8Lc|2 zxn*4@s89ywQHssjd8l#sy1ov+w)C;0(;2HIjcSypp&J>$i~i$P9>z- zJPLO{yx$$a`RJ3n#nXfS6=Ft_nBv%H-_6UyGhvxRG1SMQ4i4S$PNxJ9%Z60aA;so) z*5YRNfFygoqPPz+$`0`qVmZ9iq8exK%fxJj|4|$iUboX3)|VAsnKe~q3ZTzGm&Fv4odEx2S1Dq6cXJN47JeyevZ918wD9>sMB;UR(=@{%B z5TvIN&i26P&A+4`<7)nhf@Xe4A34#ZL6N4zbCa{+JdN)R6(+Zn$Y`-YjWr-YU&u|` zrHMASqr)$EMQ2Y`4E0>Vc_e|d&t)~QmIgQ;GP-p;_vdl)us_fe>b!;eo7$C#283+x z%2_U}O*VvEA);v0pMGk%rSoUgN*L8tI?S1_av$S+PhYGBY$yCRUv@J}zcO(~B@}b> zbv4e-BYmdG(`!)vFU&|Si>cuKT(`HO7;Y2e=4RN-c7?U?BkjBL16lMb56Q*L`>H#u zE$rJpJ#lz2kI#%lZ@{He_4#z-r!fm_4jCLrB8mEMhmFNCLh$UvFUz$+-nGWeEsyV? z-F4a)dga*~HtcXd#4}oa!VP(>S$njgRS_4}_TuV-yZ||A%fm|P#v}$$#K2$DmYE|j-nG?Sxb1MYp2K^R%eBaMFu#j>#N;`c-BV*M)YX$A$X?{Or*Hq>a2EC z;X`_XbEyQTXup-G2XSrF(TTytQ2GYOzmIy{gN9+iJd# zRkj3PjJ!z9p@zIM@AhsD-pO$+d%cimjCAljBz`rZ=IR>(lgfZ5%1Mezo~C@ZcaQ;8 zu1fI>ANSzoCs|u_MJjDw=qzU!v@wPonJrR%GvN(tTIb>^@~3 zB6?_-0TV^8Z6G2$-Q=@;Q#uwnvGZbAJC0Xsk06VY^j5#q-CTZ@xkoDtY&QFxKtX<3|ZjE@_g4n-|6+vqCdHStIKJ2=R zI7yVZhnGKA2pf`j7Vhvsf0XAfqwuQ2HtTQGwjX~53-(xv^>I{H;J~&odUp5!3GmpD ziQjFWIm?jOjBh#{0T&wa*U7`O(sf%Uf0M*-ybBy-a^w~u6(>!aA4dZ-dY~LoZ|Fzp z>ya`q#`pCf?$^R@+~_}JKa2&YZD>^A@*^3p35{5un~pw<7Ko0BNo{R6@t;jVdzUUl z9uZ3~=3S6(ST~{)I3o$VXcijzurbH%zpTg~on@<@#Q96paw|M@WYuyK&1cnm51kKh zS;3cefPtb&sDnE8C(;Xh@@G@$bT1t1lIJuSNfZ@c6V4+Ll0rjTf=nS-FhiPLfum^> zg%DlNd4-KY(nE6#KA-4fi|C5vaU73V%l{|1!{7z_O7_R&kUz=hHDxek3gqb;9_9Qk zS+%TW;r7=h-mbta{%i-$ijGF|-0^tsL$*QgwE|!F&vr9*1OdXX9bfn3^P?H2z3|4m z636hYSlQ|y0G&d2q=vP}v+#@KEHYa>>_Z))pdagu*e^s$I`nxpZG%*BFnU&ip&24m zqld7jlS5v8iwpC7x!HpS55OcpsJ_wi_3*NI8gHhe$hAk|usbk?G;j?=p%| z!sg`huBEeM&?nG1SG}C0xt0sgNLGNiOqGD4@=k$|T!a`!*B7MugWNy6nHlP%M0n64 z>aekHf+&rV#wFc0jl)T+V|fRY7V#f0;!m7eG?$7f_A_K3MaQA6j28Ja8Cp)!O#y4) z(*$zbiOEM@U~y_nN}qpT{|PF?7&pLmZRj)mJ%75p^qoYDQM?AC_noYRR@1cJZ94x>lj2*NyNXwJ8Qyv06KSK+xVZ!8uKk5MhoLVd4f{W zsBEPzfJ4JpLg(L4rl#4nn?jtTq?XY`Y`<(&8Sttpol_YrAwE>yWIadQl8NS(;ZN)@ zY4&JepM_noEJ_lM=@o6go)ZVf6#Z^dC782V1HZ~&J$JifA^+nb=1dy6K3-%Lc3Y=T zqJdGXsFLbJC2;L~DA=D`mfRjgd_*4W68YG=86uxcl zsu{AN&b$Q18-K?*+$jEsMdxUKpyvoXb{#+Wp(CAaC}WDObkAWn0*rl>v32XLz&ixJrj)WqXu zTC!wu9Gu?*A$NyAD5Sa#f2TWUMo-ku0u(44aYRFxRPY(CS9gpjAqK>EC1{$KzjmiC zoo?N^ax^|1$ZWR*OVQVXAT!>GbICWq#@zY*JWj#7)Xw5e1=esYEu2cSxoxF#8VMU< ztKc@Q;F(Ax$&qPzML3YQHy`?FG$I(cCuES?7DcBExX^UaT`e_^-mFlL1Wrd8W1X=% z`yeEC|A0HAV_C}+yDsuCAK4&XD;L_H;Wl;qQM^Sd@BOD`G27cLe%_~G=r`Rk`t9Tl z(RExPTD#23rv1Yv_g%{c?P-|9WVrZp$y&*k3Xf#_Ho*it2=w;?R1za-4H=Y`U4j(1 zEnjk10>p9H9N!=wre}8T#xbT-IY#znx;SqDo`l;kZ0D~af}gL(CF=gwR&35J8kSnv zg1Q`&leTKftjvdh1EmKrduyzhtOV#e(yj|n*3r6&*3Zg5anG9Gx3m%;v`QPa@*)o4 zg$gb{l`t^7cHDF8m)7T2$Wj{hpvj|8LsNISMvX}9=)RABjTXGx5dVMdT93P=-`3Jr WG_d5cBYyOUBM literal 0 HcmV?d00001 diff --git a/recipes-core/plymouth/files/torizon-splash-new.png b/recipes-core/plymouth/files/torizon-splash-new.png new file mode 100644 index 0000000000000000000000000000000000000000..14df6f6046cd7218f27dcb4d7d8ac58165e2b19a GIT binary patch literal 29096 zcmeFYWl&sQ(>98GfMFnz;Dh_%Hb8*Ef(LgUB-r3i@L)j#K@vP6xCQqKE&)Oafgr(M zhv0hV&T~KV*7>SVy;bM?_fSyGtkr#W_qBTU-n;kSv055R4+tI;prN5XP*H|HLqo%e zLqkIc;o+c0LMDH|M*W)z&^7dWX64HO_i(dwbcQi_`NLrhFh55-G&H|i7i||ZIYzvj zLkWKCXteeVhbGvvR!qq0g12lG?uz^V%dYQ-xJy zQiEoKB{wsInB;d%_>Q#9s`k-I3pE%0s}r)=-)|jOa!<=sb{UBjA`T}?6qst*JcPFH zxXaX=#@Vt-jMamS&b6#IrM0{NpaaB0O1?I}$ z(uXY&%dZS_<6ggIr1V(Z=FzX<(61E&Q+u)KWp!Fcn5=wp@X&@ZKcT46~3` zQxC(XEJmhxxopIM_#)o)w#+vV-uR`9Rg^qlClt@17&FP9dY;p8IAlS^?ZEY@YVxrX zhN?0M8z8V#l21Sgm=%7e_F)@xuuSiL!{ITsRu-CKgDzZ>Oe1qaf0J8jl%3_18t$Hd z-q$F@8j9fk`h4c>yw;^j1MOZAUgUk#zzRNB33&fLDk-$UWof1L{ZJrcofv%lK{a|! zImB457Oy>TLUcWB*(CqPXpYG>O)<%nbi0NiOd1-DRF+}$b3b2;^ZC1d$MHklq9TvB zbHjHHs3i1pL?xS{x|)QIn+va%t(!HB*Utrx%0e_Wh>RcH%Ek%i#b6DycXX8k9kz9W z7#wY-KnB9*fOM;`%@Gywy|!`4pX8C3Ca2-G(z zkb{>OT!N3!*VmWVSCH4u!=8^{TwI(FEWjrqz=M+D@$`4~vhw3`^gxZ3clG?61r#5AepYZkeqJ!2iwoa>YIu4n z_@F@kcIf}8;i-$-vwY8Bo^IYAHZTPrn5!4le?r*W{7WD1?cw|<99tVcm@~`;CF+T? z%Ktx1DygVz{Y&F73hW(S;D5AGWd9FIFGst7ll4D*`)lS;IREJgO8sBB|3mtpvHuZ9 zNvW$#K;3M-|8h?SDh2w>zJ#rtjiar^pO1FdHezC65i1^RQEMR{Av-%TkF}tP9S=<0 zj^9?;#zsIuRNz0LR9rp1tXyqie?g(Zc^y$W0s{P2!eT-KJYdwq@(7983hYxP&Aq5%GkqoR?J_kdY>xq0Zixj9RL{(@lmOY>jT>ZlE6YvpAH zweo_YK*0h+5@3D_etum6u!OLXgs?CVSWp7|AM$Rtj&}b4U($bV9|p)j7G2rV6J_83 z&(J^iln%`OAK(7*)!FgSW@2FYvn?d7Z2l2~rU5U()-64s&t_$A>Y4B;op3reEq-q^Y=RZ-!#F%@LwbUD}Mh=*MI5yUor5%68>*? z{gmR}N4k z_;6(-Pc$?_;9q~}Xm7KrP=mN$D(VWjTj+$8A`)?PmS50N3Mx=pUBB7A9N%oczMlhK z<1Mg^kA~LO%T?C#j{}op7tjJJorG9@em3+!e#MhMO%@B{CVR#5)GB&6$>Y4cxX*i_U7%X>Bu|EW>43-wxb{!dg;qdsq^eCaZkGt!QbRyqMrZ$q8Ko= z12~0;9*F!PO`6nBM1P2Gb4&Anm&7`^A<>E|+KP&mJVV}tqu0PkzW~#4z3cAg4PvbG z*w_sCe4+0z0u$Ep-TbR=3VrlX-*lB8o%h8+Lpuq^XHZ`G;5o##AC1-ZFX!_6T>+`G~!>(N%3TBeH1#bW3ewBY<+ zli-iT6W;0&OS8d0iwBJB$UN{NE37Bm1Eo*$);(Cx_G6l?S7g!neUI5hQz$&eb1`uY*29Lmr1wk~Z5!kNwp(E&z~Q5t ziFHzW{9Xo-v|!z{RbTZ-Q_;=d=+*mX6%tgeQ^=oRTHpLll@mq51HZ?Ey2w(;rAEWo zKD+w=#L~8Y_2pIHjC`aOBAXN9(TJ$Jpm8%B{=* zI#ED3(kU$3gB&w+r>FK*CAY!V_U~xvKDNC=2SJpUDvlRn_vFhjk&4o$-wr)}$xd@-_0VqSO%gdmX|%G`Q9Qnat9m{bx7tW<8#43W+Sa*xB8UrxW=%@aP-ZGiwMI^ zZ0PKVYx;1z4sw;DpY}rGz#4_YLN!^(L{a3kOnTU?p=MMqA|%L(@~Vn6qqlCJ-$i|Gu4mfsOHr>)B=N;;lQ5OmTvA5*gC(*nyjB0Wq{hx0rbca20w<|) zeB^qL{*_GAnxx>O8UmNCks`!5*J}t z5Oku7CxLdPRSBXVvEF)r;!c+=$ka%|cpSJi!8ee4Q{xaujde$dO@n_@{vn+eUV>Uq zfxgy?KL(}>A9_fgAG(Z>ewbkeu1YQS62$jb_uYuFkAKj~b~5|%C#RoJtV+gZiRc?F z^IO(&;u~Pw72dG_(ly=d_KH&q>j=zm5lXiTrRfg;HM^`Uj6;-9x%tS~HY|p_yQD)p zb5f6ejeC<{73%TBIC=teUPvljll)W)+J67GE0{qk58WuyJou-_MSJZe(@q~!IF9sl zDqbfMw2q6x@8a7lwz^R6WceXR+oM})IB@M+x27D8Smjau=ExB3RimzUwHVG)}WN4MGm9yu|EsGs$)g)O9es1Q4l zrkqza5WSc1jHuUG#7>cV(uDbA#EtzsdhOwthL#&hXEFnzpQ}WJaYu8l_toaf@NiOy zWOT1@-(-Zg&!AI2`V))%+&;H_*s;qI1(+lgvpr5ARxAk~v=R@~U=PvxO}@)zich2H z?@LMHr?%8?_&P(i^XILyL{E|e75+^=fqETYGXd2jO@V4k5}XY5E+dV8Xn-A;`Dl_9Z>VDX%~rZcC)yH&dYTT0iL@CP-4Z*s2yaN;Ah(bz&C zGcH#0NsdG`*Awa`nu{FKwUL_u7dTLj z5LBAkV{8IxD)o1T>ZsQqEZGZ@1QaXn$}|dw51U~Xpsh-2h5uy0oq#xaBoX$hQB#+J z;}FCy?&pWP&Fq`Mr#pKxT%DToBb4Vi*$8Yxp)uA$IN1dCeW{GlA2Zvh`IH6OcojD} zU22%T`Mh)ewGosi8wwm({$DX}(h*gK7qLWiWMYE3Yy04?5h+BdbF?~h_Z+gI!5vyz zR*tEO{$S*1jf30-ib(Fogc}AqvvVX~7i*2=9>+s;AmETjG3fr5j&z6`-33ddO-kW0 zm7?d$G9553es-G@DQ+4?%^pOwi`j&k(VrUi`>_-Ct-xpfeSWO|9M#Thu&k6u74>ih z{CSrXTbeeaQ8f$Fk6|#GeF2Xh$?(C6KgPAB?4C0U!7!!M6p;A-x-=&QgDu}Q*X{Zz zLZOyjbcFPqlo+E@*c_g@ATIFuhRhrlxgozbdzn?J2Qv#MiB5*wE;tRS2pn*R&sUr$Nk3xGuw2XFR(yO&pxI# zQdklMdjxu%^jqkia7=eR)6BaQ44n$}7?c-F2gJ_Bb;zpZ_7UoQ_bqN_Emz}`W5(#! zYf(y5*~X8W^6?TgTS-CV9pYMZTci6*YRufIu}G34N-EA6S$~i;7~!x6=vTM!jHOT& z=+_a!CUE&3LQF$bX|o9iX%7JPnun8)-O`<@TUdvkw3Etp%XgQnIuGLD(XZa34sj## z%6mH`0rVi>?={L;Gr3VIyvA*3r87X|wyVkFdsQiJGTD}P@)WAUT#!mr9pSJZmh1ld zlIK#lp@nOD@X*87X30LBLg(TmMKc{S6X|}h$}l)U*6z)--s2ac@fWsVD@{4$7ivem zmP*Inv8=3q+`0lWd{rZV+sI#P;)QL&toP7O37vt371eQYMWIokhce8U(mO2RWS!w@ z{SJrTtP0XWF_yVB2Wb(FS>|b82e&zQ}Y1v+H5XII3>;7%^8V!ap^uyFDfj z)p5{B;ONrI4k6fjkmlp@4rhZ5Yeqj@4IYedt=h`ot{nu~I$_yPjl=Kr!o`G&o4om5 zs#cQ9fv~D25*+4rFm796Xp3mn`Sm?ev*60p_;I=e^SfNcb7=D;n3H89yZyl1Zv1q$ zIEpY&iZQO%-}nY);|<>GUyOeAbLic&$*NTqJs>QOXA_+%aixmZu4-xUWJ=Cp=V7TP z!%Dgfw*=Y|44UNU6$ns{Cq)F2ylHsiizdQ&ly5#{B*v2!AM>Rp8`#8?wBZnJ?{Z{E z>T2N4c*H-bg9p^kk@H-M=rb30oqf7iD1+9BvB1GMX7Hs+LC8Thm{eW#+b5&O?>muX z)C(?q%-w#LE}Xl+I-e}ZwKCu9bSB<}yckTtJu6K{+>$kCZuFk2I(PYCZ2#xHTgjUTjTpFId|tH<%G%aFzu)*+#ol?Mv=&%$ zuWD%kS;$CzJp5Ymhss{jTx_8!E)B^^ss26Ck8{&q>$WDD?#tqOf2liY0*IH$Vo+YM zkA9c9wVmML_nt;n&9??e+5kgI>(`8`H2fU`yOuc*RU1$zHr@Dzj$HC<^oR|Go2x~v zSm9X*jkE(XpVjZ3(854csFEXd`>PKmvvQt2>M+u{YRSeSqO?^<6^QwdbC2I`{E7D= z9}|qf$X3jcKlv2&beyXAjwN?3rZ7Z&L!G3wjaux(>|5-DSU~Jqp&O}fiFhc3!=(fT z_pVyxDmh)X6SFE`KdO*YDKaCa`M&vN4@bNjz33r6({#8Eb&H+YlK4ZQq$~_$PtAeyMXc zVYaSJf_+?PPZ^=iQr(3x!=`SFnIK*lpE2wTqE?Vo>%rv#TU1LRwsfOLE1%kE1=Prd zF&LuWo?B`` zIrAo0?hY^04t&l?*Uu3@C^#oEEGrPOT4sy%Qk_HWc{FF^ZI*{ec-^H5%3c(Ksa|o@ z$Eo%W{vx>*RZn<+W9d#Rjh8(h%BTiV$t9#E}y9h?a{(wr6>R|NIz5a^g)Z@zocFLtSvh9Q0qK4y^K7H-+m!{Ovs)&LigIAe;q z9Vd&(g)m8cpRwT~14JqNc`Tc!lP1juq}N2St0x5B;+FI+3?3cxr9`-(qzoegOQU*u z{G+v;c5tQA40bd2O#YXqJi=_k8@&%ASntcuWPbviNjS&62B^>DWB8_W!a~<(B7keQV@rNo&>QAdIB1s zh`n7hEPTyPx=sn0X%vm`eM?^T)4#CnB~v>##1K72Ii$cxuv=G8N}jURK=Ab3+XZsS zA2~)4(`#A4MKttcQg{Yk3|q{tGQ%a*=!MC-M}eRlami1 z`LBMjrfY+y@LTQHSM(osAi2m(0m0;!ZE|0}9rpYc&3Qzz zIFeHiQ}!|9*>A`gR^mr-B-2~mj>D_>3baJ1P6+Ba&R193=eBtM=qc;3!JOPr6yPv8 zPD_;m5D8b`^mx%RSSB@p6doU-puP$ChsMH_#+lRp~qja_{y`@omVMnb;6 zDMlyny#2(3k-Ur5gE`CZwG*iiRxTl*zq&4x_-1=0YpHNC2f_o(x-fzYhhq$Bhx}fPf`@s?h_P~6Y6i;Ah!JCWNhLe( zWyS`lt=Fx@)JIrwiW<8p`g40gi*E18)XcR7?geg5x5xKQDZK@1TM4)W$;mZsXt7>{ zg5GYq?&clQ-eUTqSBXY&)Mr1)hfcb;qAn$LoqH;l#Ot3zuQ5}klfK*9yQpwKap-sP zR3&X;@4eP$lPb8|>Da#JoqNvrYf$J_9hYp)h*y~T2~l@6l9@@qw2pkYY(Qvfhb1U8 zICM^G`KR-{2wH2;72!0OCod@ExW|+pC9a))6knzhP^M?Dq7yAY(!6t%UXezOrf|F2 z9@xC;JL||RL^W-c3Z28h>aUas4DQ-#nE^$I&`+L^|D1ity%}GY$T(9fR8k_>0og$s+S-&I&iJL4G1n zEY0WxQ3mG+s-qoym`$P1PgPe!6rJ}@09%;K5(+jS--&7^nujAO@@1L4KI)j(e-KcL zJ}SDPiH0+TZ8}lep{tBeP)U8cjah{MGK+bC>x!dM_-Vl9z{!M)7*g`K@`5=2DuAJT zF}W-<6bT>(qX3+KPILE+w z*LW_*F486}4@mR5J=DXsJ$5|%kUv*hq(6z=l{v_AygKW{a27JaJQb6mg3fsHRl%Jj zo;{$q{pu}m@<`0U;Yzc2j!dXC_3l-76job>70$$_uDG!Ic)Tj7XX`6H(kh%pUIsM* z#6k;u@#&*(nslpx;awxjQYG3|JjhPZG2n>xt4a;^IepsYCB7SW`24SkuvfnqpZL9` zT6fevPmO8Hm)q|Y{mlE^P*#G(PwM{gf#u^c(Or!2uj1t!ySJF(eVcZdwB>aQwzl}| zm6_9?zchG%MC5%QMvPwG^FT$vvV%w{rxJ}`0hbBFXIic5EP~WX*H>sQpG!wC&EFU{ zV#pSTefH;XeAFi%u8x6X{3mR0zwmS7x>Z3}cm5b3I(@+xrNR8~Ohkj{zboA9GQjbhw>G%GZPL!m!BCL) znZhGY_u7@t4bal;#WNc9R<=(KYkr~kU6W-9Q|eTHmt?=%&edNrR&q zj1fOU0{qZh5LQ++FSZDC_WNG>3!>B*+u_-b&O6fOzGRyr=Otgn6zE`CTK87(2`c1T zmb28dKJ5yR`y_N<;2v{ZLTqvT;1*e~Z%9Z2@#JAK2I_jLD=O&6XH;h}KRNy&Fsw&` z+2Er{CrvYhZH}ZY2?g>Oy!oC3;TC!rb@7p$N_XOJc2-!J&yMhf<7dK#>}0@H@5HP( zA3V9|F{8>zez&8)i6jY@KLWYkHks`=9BJ(ia(@v{GqC#x*+_7s3JIa3?w?DH2#--_ zmyACNu8@nw_y7DXF(*nCJ28&sa{Ae<6U!20Dcfy_)3jLH;D<00djww!L>^2V4R?$2 zy#>QXzPwPi4Ye?px(!I)4>fTYFr$-Jc zvXqgSVF3bVq#srEgw47C4#oDva6p$(h%>1usrE)};57mFz-@`wqE8MCK-xUD!Mpg` zU^B}5ag2dNHHz_Ix*>a>Sxh+>AqeA&mk>>^`(dRL?>QZ|`tuWjE^$7~M4R*CfR}61 z;BSri#0}_j8p5WnkbRPNps$79e&Tg=QTn^V@}h2A2}8b|6_KSo0aP1P0V%TcTTY@c zDoX^1{6-cprDXN!8;1s{d+su+-E=_n9S0;&ga1=oFmiwo$!yV^n$0zAnXeM{8L2pC zo(r{3Qv1^Bnj*^S>pyLgPlHPYOc9Nvh?VU+c^EsWW9#v5-Iw092V$0ACc~4;9!t8; z$JjX;sNG1Gl4y*d+)i}blUZi|fM)$7b=UF^#?pR0g^v;27SqcY2JouOh-ufWP{tzF zZ0$?U7_@C-tcmq%$v|U!V%tPE*PP2h9UBiHDKH%}*kc5_y#&Nw`rC)aK$I<8w5{N@JcD+G>{30s?aNqK9@S`cCnRYuUh_GH#I#?mHw%%u9bY^?* z$8%upDx!wqNFmdvPz!@Usu+$2r+$O~v|a4iaS(Al@#g7koMfc3#Bem|CS|yIJHR4} zspAd;oGZVf8`;_2Ss7yM@ae8tNi2NMOYp0w89Q$ugP1gBj9@D8#S-uQ-nZ6Jb=9nz z-{Ut%cUe*W$=q-j&kYL@*MqN*x7kL%BwGI}zh%adJdjImA%S4MB}WPL{2=FUkqQ!KY681?ZFObqpm*GJH z94~se*z@)3k`!>J@)?M~3lm9N!{sU&kB@PUc*a`ojW362<`#N^ZEDN~a(}dDsFZ>S z&Z6l-Ws3iqFL|ul+6@mE3mG~yXdKf72=!uzN_CgAKn^4ZTK3+0#P;4acm`TwR z32ozjp=Mr%V~))>`8c@7;DuU9RqE2ods3^y>I7{6@=WnuhSjeQ((mrDE6tL=&3coG zs#`P^zhz4>mZEEx3+4%AFw(nwOMg`6*d|0M#^r;jK;J+RWVkNyV$QZ(3D%-5v0A$0 zikIpx*m9N5$qU*y~md8rB`kWI;L5Y(9Y3X3kQXnFozF>T9~+%8q&{aF_g59 z$er_~S;TC<5z+UjIsAG^AtuxXFV*NeUvo?YveQ6Xa@}a}x*?yZ;%~kY{BY-WWkbgV z;AGSmSFY8we?gv`-^w;Px1;s;UHj3V2eNLYj_k>iUR4f6tgxq920~^Id;x0_VD7Eo-g;%qe`e z?>TK{a9E9r+3V|J@Xy{@1ts8Ghv~>ii((OKJkvw?b{=%?=kp9rsN%Ana&YTat1F=V zy(cXzF}+x+DWgil{WNY9Lk-YN1#khVsq+)4BTAC)Uw$hSHz-r~i{0^{pU2PR*{0LX zWH}~HRf`<-qrvhVuU8s9BbbCeLrz`mV$GJgSSaZ0br<)GPdy6D&kl10{D^b+FoTSv zF@7)+VX}sX49;x3B!u`r==aitE|z1sf#xg9U{W5hL?)s>J?d7`O4(zqgHzQg z|MOV@05L_<{;G;JU;LoU%5BUyhNprDzl!_5mDL!vr@RJMmRDbsVztv+>A0~s`j9@& z`&!rL$lJ&t4)+3_{~B0+>&fN#t}#2l_Z8l=^%gMD%NLMk620lFvYad=_{1cj(CmYG zkR>0xSXK2Ci*qvtvwSWsG5br?@cE6Yr57|+;tU+(Q{Mu%VhAY z1SGD~=+AWRFO!1ZFkWy@Y7F^akKK`ZS*BTn1FFl3#^1C* z;Sd^IWL-HmG*$pyl4UG-Eeq*+ds-7gVFib`-f262C7hZPrVX9XeToF6CRhfLnu>j&L6o6oX%lRhX-C+Q(mGw6PS+fOv-#{*d;P9t~NdR$T9Wajw$@RnP~ZQ zqX#^@Z~cTt;)7Xc%(z+Tmed#?X&%=ZGL0?sw$2$9wB@8ua+oU@H%l#y<$FEf##Dq1 zIn@%$>pF5w4%Cre*i@v9TED6vVeBK+(tB05BaJ9ev>v#4;j&fzWcj<9c-nQ~r)*H+ znpjr15N|U&6XS9hwS36l(tj%DZ=f8_z6^zQM z)7Bs@_@01Kj-LA4r8!Q$P2qgdjJ7k&2l-)h-#Zc;>m#-*6Tt*i&H*K?=w`TqblOCQ zqwZ{IeFcmE=7(=HgpdXgV%86;kX?rS@>SK{IQMHhZ{H@Dj*SDZk@z~?gb$3N(dt#% zEvHqOXVDl#kTln(hir2>5#h*K)kRCkpIgF~)Ve+xoXaN-yce2FutO_n10%?iSyW+s zUH@|gmR^T}-ZY$coR8yr&#=p4wF|foyyBfc7`r7(*Suez=BKkClrzi0u*mW6LF;O}k0TS&4wL8;vz>39%l z_;*w`DouZHQ4zRX{N3ag3ts9NT z5}_KkPiDxh+`q#w7Kw{2kE+mJS85DY?!jmGL||G*VbV#u*<$@ce! zo-iut!j4>!p*KbFO(K?=$@|)O%PyRv%(a zjS4)R&6W;-TZZg^kR<BmeR*c14ZB2S#>7I(4PO4*jVRn7C=Zb}Hpw?0D*GJFfw{_DTUgV~@8jjqezRep< zyP);i`LC0JkX^q^DfUhM4>W{APnVs^b)e7L6yC>t>0ybF9ccYANkA~>OH*Z>!9R(^ zjp@BGxm>oBX-^9he~W8I*!sAJ<+I|#cd~&Lfi=c8vN}oztHr&ZEgmfvqBdoi4SxPMt;Y{1ui#uNxs~^D57rrAfA(g|22-U!wO#Kix^6>WS*|AhrcOTQ{7Tc(0?;A{vIfd=&gBQ?WYliyV_jRE_)3s3Yr(H&I#^6_YFimkWj(g4DxdHwFrEwQ-4$*?cV+MJu0 zJcSU?hjNh!IcXM_p?6BNNu>{CUC=P|jbp`6WF_YLy+1A6A_-jme4x8Lqcg$$d*@vy zOJF+balZjy-m`s*C4%q;M#_hzy$W;hl|Hebm=pZO8Lj#(Kq=80vy|S{0?#+%8LjeZ z$xE%{ENkTf_ak%K6UN7(IJ&Nsa~aaahaC?o@pvU=ZY!rL-X3MWO2vFhGgH2sHB#}? z`=R5O)HcjFhzLLLf?<)H& z&^EK%8W~jLOQrtphr&~a?lUYa7gIUoFIZgHTfvqZy@oj?6$i~;`oAX0z9l%~8c@N;n7&SxJ%6Za zH-l$5AMhSA_LOIKn|u~Akt%MN>%g_mHl5L_$8RwJZ9v!?zeOli`DV}DsB7Y|D$WG2jH6yC=vgYNk)-wn#;(!Uwbz}wT>$M! z)iTYrHluAiS>*sA`%>Q_EJ*x>BC}`l{2o#j$8$1040gbIsCT{Kn5__KbnnBe4qKl_bA~~8j%nZ&bQ$))? z0-)cB76o+t`AH6{K4k0eflncdTL29EMjGN zd>EWkQB`)1o{E13tPifRXa^aJ*8 zE1uTO9e%nNCV^2R*QV&$cYb5vb-pS4F{RZOl7zUiFTJLZ(ILZM{f^^J&fp%IclIes zi_|@(l4WID;!vTd++q3$)tyU_Alpb5pZjh|?_6XN#;nEFD? zBUE!&Ge)!c$bBWv&t(#FJB_PLCQ3A{_D;CigLW{$sWGCJ8@t~{1!B926SRZ&DK{Fe zoXJUkgXXgxeML*m_Q77oC=!IzDDsNxe14!B;ZS(URA48I(TOMQ{_W zkhcF^=@mS)M~`GS(#RzxGd}c&BHPCzXo(xpQjQxBiS1?-Ypg0@^+6(BnsTYa_1X?c z2Xwi6-}>DtbQEgv^Py)i3%!oZ{Tv%1AZ$_mUi8b#3L6=+(}1HOraPrfO}*)5yexaJ z8V*iDLci3;I9eoep_;zMNUL0mD$)}`%&P2e@Eqi7u^eFezI7R*eZ^eJhFOi-_VVKA zmmssZy}(UUmiU9!Kz5*lKUR~F>xg93Vzrpdt$}&M#beo-k>&TD3+7G~i>f~6Sf>YQ zfAuqp(L~RW!dEc~=4y#63+$vz5R0CO#Y)lWrR331c!?b5>xTV42ilXTm$!lLy7vht z-;*`kTY%}6lshkHY1r+WTzS$0zj55X)mVNUhzGbdg@{KnnB|t|s1wc5F2nSsRJ_f9 zI#XT~u~2IYh`)seFX6z)Np5M)Wq&sD4n0EJI(|;q^9JheqbV*wya0wD5qIH+Fn~0h zXF(rzz8C2v9D&+%^J=(rGpTh7ET5L|>v^Zr@s-xlMePG+NHw`-JcVOVx=5GtUb<<7 z?P|LoAZabufdrd3w1wjP?)GA*-jv~cx>5b3FHG!-7D%2Y{&=3~T z7)W?hF`Quo#^t&!mf&_>wGq`m(lp_@>aW4Xj=Go}N!_p1M|PCtqMPpdUDAR)KKgxI z9WWzHA%goCG>AUS3Yui3RPN#xi{{jfiz#|Xq^i2YluSswIVh}kOKl@zP*y5Y??YhI znus+ocgcPT-2UBW{yS0s@G*3G@-sIhlUZ78YJDO5dD*dZ0ESZ(mEXg-K_pfqv!EQr zO>@b6%lB!^oM`%*O4z7gOFQBvc=UXxuqs98nuw35BBrb=jpUWPPK<8~W(c7(OD<&n zrUL1=?K7smEDRTWEtD<) zD+pc`Y8gY8kDm7T@IZ1meuRhLnrmw`(HT{co-3hG(k>1*#>^Y(teG1^4%o zW0AVQyh9wbB!Uv;Bp*(Ou@Rb547hC8-lW1LbZ`^Anos-(AaH_A|RQqAl=mWLW2UP$y^mO;?>_864!BeYApHjZwY*t4hoGp_nTqI{J{M@I9}Wm=@#S^2NP0@}Bd{#m$aYjiG}j zoDP$r9s!Cz9w6Acuzxm40;>1P!JG%kF^8aE5x(tOTyXjoe+&$NRV;Ty zJG?MAl` z@C3~i(jp9R2%0}RAA-w~?K6@j=d@64bEeb18Mr zP|Uq&C)<2MC>U0M?JlHy!AdU{yAk~hm>lf9+0RZQo~YL3X)V{&;hLcy#~iOKMwTrV zh}{fLGpOSz4*j$U6OyG{1uqkd^sdrI^1q#sZVeMuC+1D{805k+{(Mgs zXwJx=`rt>^ZrA^^YnJEaa5 zVNTzf}84!N1a^?3w@MH%f*Ccd{zp)9tdoN04FD=qo&NsZn&?7s}Ek_eFstfs?FtCE=E2$ruY|)=251?_sK_dQ$QvMeK0d+6i>Yw!0`nooVk& z4AeoVq|kQ(^*T<4wCK7)#+VGIg!Loh40*ZOKB^kNWCF&An9JA$v4g#wA-!CrGgteM zk9#huk5mDd+}{HoY+g{fGMTFN^69A%Kq%Y_DO>KQ)3t8Ku0t>lr?qp(<-|0hu3XDm z0E~APljsIYRopc#F=|}LS*+v>2e&1w-RPFhG4-dzZllv;-D}~Cb4@`B9@35n$pOgt zAUmn8N{c3hk=EINpSJthP)8ObMt5L8ZecH`o|_8P!0mU4x|$;`8!Q z{h*hd`$Pd$H9DO#-!qPG477X-Sde-XzEo32N@>1N2=))Wfiyq)uq3q2F@h5B+p)Mm6f)>XSGjEci!p^F9noM5gOOLC|shg8%?4JtVSOShQ?^tA?EIg3AamIn$&EVT;OYSP9 zIi!4h6J<}$<(SVNeexjWoKVN<&f5W|XJ{*jvLlA}jZ0e3Z5JZF< zf)QEkavg^_`<(^awU?WCV`Skf?CS9(>)4^0}6CA{);4!b9oB~Stb_;|%LWbHHWzyvFAg^(w zE`DyZGii0HgHlYhWab~>?J-72O$0n4SYHDx32ft*qzcLFIbiEQ;7}fqWoyZRrR9>v zUD_Yw%~N}TuHW+EulRH-F5OD7$;=Ql*LYr|*XX5iZHOakiw;b)P|w*nUtC@7hTqUC zlOun(AnLGM_GJd|eP5)7;q3x@XBML2#mb8v=U~9468>#(q_sos_bjXy^l4yvE=&AZ z4UHE=Lk|d_woYz2I;|*}6N&D$u1^oYVyRXCUqnX5BJA3xYF5LAOflSSEXmHB{% z0aTDsPN`u_Apof$8%{M1Yg<*Z4+Oo>q{tZbENhhlSH@7B5+Fh@U#v6Z5~U!ne}Fl^ z9(IuEdV`NRYm5f-s+(s*EUwP_OoJNJV#HnaayFvLZ6xy)*ZnPf9`ia9PXUBP=bxpw z`KM4j=`!0rd6^C(D>xw!xqmqbH`jrY!o8_-IGzquvKHx#<$hLX{>B6938Tlfg5daK z*_Aw3RRQrAJ7FYYHoXjR9EPz|M*(6NT%g}LLV!cahmmBl_W-NIOpmlzmU@7A`T}RH z?{W#<=b=36%#Zc9&RcH8Zi*kXk9i`_SjhsD0T1%XCPwjBaEhI3BKZoPl~l8!*1IQ_ zp_ooJxpiS?4z7L$wzQ@Pucw5OsCx(gWHZ_wG=(&Q7@Ea%jzc%Xx{ncTcn~6`<=m|R zVaximJ9S~x$4~V3i_7en_?cwH0vIJW!?@S1k!zmQn?-Cjm00F!U4089L5yI|4dksM zQ|gCU8bxnbbxrAy?=ZD__X}hN9?WAngFtSx)cj@45A6$Rl#&^X*aSwnv0O3EfGNIv zuTH>hB0&nCE6>t$@ISqq!pKA0ENG?XiOm?9zWf=1_+Fqth)#P!glgo;iMtx|&&3(O zRzWh$d?6Gw&@4PGNcbUPzUN9<+r} z^8CWLuCb#}5q`&+C!QlTsoVLQzSQ=sNJtHdE3N=RQ0RCSlDT*Y%w6K4srL5tH9(V> zv8EsxyA1R_*pjuTI);Xxm9p6?%`qhnkdl%g5vKA)_!*QF`~b!Wcr>B<|5W$gfownV z-ywF@tWmqFD76|Rs8OY*R$H^JJ)%~v+Jcm-QB-|vmnyYu){K#wMbMfJiKIqU5nB-9 ziTk-?OASJ;l+w$8z=o^2rTEG4AlFR+? zjyqJ65U7RMN3Q}uABuJTIx7t63svT~z_C4i!g1ZaS@%!@Hesh^9qrFP)c;l^#f)F7 zIUelX^GZ=75~vvcoOXx4BK(sg=leSkG4Xg^)P%XEOt`^;-Cwd~DZ5L9Z(z_vheSkn zT`?)TD9OCcnI8A#Wk{UkclM>me8ace5gTmF#i(GtdzO>*Y!tJ6X?%#yl;HfYoYNg z(!Q+>SDlk-ch@3GMU=!;=JhC9UzXctY4_8C`Bw(U#H2>;?p`p{)%azAGeM6>LPvO{ z(72VB`mrrn3EzX8a?b*0SyNpicLeeZ;w^{djJV;WqVh(k0$H%}ly~pqBRsx5)+LRN z=_Q023Wxvwo*4hc^F8$2SGl)h@#tEQPAsc+w@s})cEt_oL$$GlZ#H}poo#W$5DgA= z75#Zd+br_*sp?q`_EF@1;G4dhfj%o(_~764yx9kEmESb+>e6ER@9Tnvty75wgI%gQGi(h_b!q zWBd}+4<0II0B!HzxitugeyNxB1UN(o>3GDT)Xoa9mMbv~JL_{Q5ciGGG zPOSb;crB{`LhoennC(dD5J*YWs(+hznrpEryrZZ5xa!6TQ>SjJL)`z& ztM*`&!?Z1L7<74X^s~YHN=6=VM9IOgjQ^7hAf%Jj4Gm1b@ipy#PMy0xlB9mdU-!mW z;5K1aey|-2G}(Rs`fskzQu09{F!mvhve0KbfdVQUS0!*6)QA*ny{m83)J-D~~v z)}Njs?qV=U7_HIEsw8<3@&>%N7E4@Hs`(H)q&gM=2|8#lRaO8v-*~UY8nr%}9r%IQ zne-@#zjGx*MrVTfo9n;6*N8OvGscGFdeVsE{D_+Bisi?s&#+qco;CX2I?ZZPQPFWn zU|$WezwSlwq5y8dTs~Dqo&^kl{@}>)xNkq_HNcH6Zj}f0`TcE!kn17 z)qlU~mf}17{k%Q7!H_H>mGAi-&ZvWw6A^Cc~yOvg9$$OLv z#Xao4|PL`l_2v$>y#cvgrd0p>LK&1Yq+m6$GNtvWi z+I7iDenVl9EOpQq+*bkLR~FlIvoVLo3xMsQ3Vu&j#P3@U6HF##fkQ#n>MHdt)bU}$ zzpj+=&Sm-7_h!taG;Nl?e@PboIPsOw$G4Y_^+0Dr(;@?{2vaG^E`cqh>cl&0g62n( zUKHN5(yjhwzoX)zF1ppf(M<1Z7Xl;!9=g&;=S zB$it)z788Ae0$p*?Cfc-kEeDbW0YcA$C8B*S<0h-?>KbL(j8d6m84KJ3|!M!nUhc1 z47XPO94sxa&T|Od8g9Fd{BiI8Kaj{)ep|4%+>$ztZV+BJowP+Nf=(-gL`?q{iJe!^ ztw;&#X^hFXP%qe|f&(@i<+H_c5&m8!BIg*(u$oTu>HIBZ8MyKyFFo4CHDCE>^28eb z&R0#%f2{CRRf)Qx?q~z>GW@NSD;OfYI6EuAlO;aN{g20jlGg3~Am=F?PKj&<25T%X zAXwa*%L=}0juG*fx=#7#|6bCr-JV#C|L)&|X{MGnQ10-8NL0G$>OLvCt0y8loK}qh zaK*&yua!Mwr(l5sJiYVg9)3J$j40EkbCK1BeLDZ=#&y2^8=}J+!NPz%U0!w!R~FMP zsyt_iS^8od_2SLaGkFd1bOP^3w|e)t+0YV>fAaa7s!&B`9wWCs9tRl@x!w>JlGYvu z*&SCGp)_B=PLl}gxCMNt7za7%Fc+)&{h8Y2y!&&pp1)T2ST)K>Ia(mI_-7;HNaMoN z{v&abjf!Ax3P~;~rb`3=h1$%xoMk;48KcelFi^I4PHaYpcAZMlUudsy8$rB z$`|wF^T7;Tems1X;C#;|MKBF@W>Oao;&kaOddHKt{2u@CQra?V!N?*Y7{8C;6+56A z=j$CdM~c?BkKanHM+OkN-eqQ-7zw{>;tDhGd+i#D7oO5<`mE)7lT@+T^w-5caHlNE z9Z#GQBYA+vc2{Tm13VTxrntXLcVy&*L>T+quhwNm2wT6)a2>6@e>zw-^xxC4=Y^YD z707UN+rI@?ptbt{w4SI?xnp~aq78ScoEQ4JBOq=Pasjj~?nA;)a9RCGzf}bx;ntmcTZ6IkYq6cI@3C?AjKt4&)RFl6S_&w>*Rx;Z=G(so0)1-rgynQQ zrF#U+C>S);)%}CaB5Yyin*$7we^t_d{Vl%5DLtgJ_un*Ow71_;PoP7trMvQEnbj?w zyg8qvdM}#9t4_PyS=7S^9cIq}hG{PvR#L3olg{yH4_mTS$Xb8=I}~+|99N-u-i{c* z@42|nR=GV>zcH9rx_l3#0 z+LplJ&YrfMP|l#M%S87ExG+%;QMR~tPRIY_k~C~iBT9`U>?3Bq^F~MzW&6(HNW zQLBPT?a4KPeTRbN_t{D}3fnss8}5?16Df)!EofnBknrgG*RFozu>A&csy5q}#m z8e199MoP6-Fq$tDvO392^!IpMmqp|i9poGswgerZAJqsX<`DKnkZ(gav^^_yikhA( z1||p#Oqh7tN_v4)#cATWL8N+pK4^3g3hseSF!jn0}Rjy7PG zK(JC9X%1nAD2N^yLGplV2#7QU#dH|h85`I&zaJXLR5C)JTA3(!IY7GPcKMWPOvb!A zdyqm?%`f#yg`t=9GAyGH5t{o`m80Nc%JngZmrL6TzB{#%=|Xlxuz4~faDThns6_LF!OJ`YXp_W+)uVK!+ zAdt?g!}D9up(R^G5V#icQTZD(NcL(CJHk&JdO5TMkmm$3bilmq_5JC@@`Kut8ZDh#v^>=bH+DUCo3#P z=}+juwAST$+CMSPA`$o}?`B#R9EjAb`4>*4%;=!VbqvRhKX9wZWkO;*kGQuX@=5z) z@g4qsqqF3)A!B*#qP}lAM^Cg=B>P4Dn0?J5Gq-S89GsYCJz&O8v;3DB z5J56mMZN$D^asfGdl% zb~_$OpN+ET_M>DfzfRYd^I_T&+2a1e@Zzds?k4+iS=J|tDIxKNuTP{v> zx8uo`R;&QlXS^m8roEks*u0tRLo=$_5XHlIBT74~-tCLa3>+~HQEt$+D}oh3UcNPi zohdYo4Yf3r8KB$~oBadP1=*-Iz0u168SC zDXdeQFYn8}gd-sgw8rQym=%mbM%qE%wr~^Foe-F#W zbo>fl=gJn@rv2zsC!&A{jUZX5A|L*q^L;F?A94BD5VD_(i6gz8<*K50>BtCA3#p$r z>BJ8en-V{enRxOZ1)&-Rxrmp}^(Li5H+)7a-wPW&rK zkcFy54vK`J(&k&bm>gqNf7`B;)y3oR6P<-i>KKhr6qSh)Nj9Tp`f+T+cdWj$k0H#J z9istnk$8aR1B;>d7;8WMy1X+H$^6RH)3Gn=i^=?RpsAZXax)DX(NaAC8E!dKZ^X zmZr;H4W9O+Wx>GkSD#7bqLjF7Je7RC>fJScZR+@%IlehHvDz0#F~_;u6GwsWa= zOy<+V@mrbBp3YbqudB~v;@*Q_h(C7&ujBErsnU}Kh=r{mT%N<7G%xK&Sy(KyNUS(IuVPlzmnrv?)Z(a|MN4Z)ENtum6-+AyPXzFn>25zW=nhumSBo;7FE; zB)<;W+l3O4N|Ty@@T&rm6CF}Bn}-_(q%fwmBse5Pnzp?+t)et z{bLf>TifhwbN8P2Egik#E-v_@K=N0pR#JzKsk~c3g)%>FZweF`w5KVY)c$m$Da4Mp=T8s$SOu-Nj6`=e%YT{Y!cROxj*tmWAMoOatL~i5xQbWcQ*(1#!~8~fucRiISLmgZQP4d=gjzTnDia_MEya8 z@@|+t&Q!)|4SwyQ<93+^GK%HEpU4OD^t!D{e~E#{%#2|KcXV2z!6;q#^|3GaN_@Lo z!%+y%uKU?m;9}DUhN}~=*K&1=p%WaDqK4ng5}R&IBWJ}m?luKYD@h8Wpv6-6MW)1TUi!h)|;3D(zi4U8UmapDkUA1AN6T=-9wkcBa89aPzbUnQ98Bnh z@Y5tTA_OTmO!eJh--s8-g|ng;AK*SEKJ@>@eO^KR7D*gG)8zE7HE%Ba+#pepU)vfD zA{M&R33~!qe?-W3K1Hs-S8kh5de%8RsEu3jf2kL|Ny%N>opMa1{Ty`-*_bsW*rHYa z%EqLX8E9gnJW}*MQAGi4IFm}CL$49AH$XMN38z6jAsEbztnVLvhs>pY3B)&uvRr^h zk-O%Z6OTg`yr$}ZYaqM8zzMm>?ME~`CqD!ELv_v)(r0(cIjCVp`=w>=ByC`@7fOOz4Dyi1XK8mQx{gy8)m41r2vYMVjgDUJ!3z z+o5R9W@@YP_PHN5NU!?|?Q!gu(Svg=At(&1BsUG5^n{=p_hYH+_D+lJoPaR!>}yFa zBX|-yFYTwXIwZpnRIzvzE-h-f6>g&^Qty%+)?_aSib}*+Ld^eGPnGP0UHd;6Jl z_Y^LkFbq!$W}}o?Lt^FME}7|I8|`AhiJ%y3-KgQ0hTZ%~l8|w=2W>1Yhj?2L}$n8@p?$P2@rLy&C(;?vRzF z6N#+{C#tzW@;dIMwRaMHvWnq?g;>W@mtA*=vOoJwgXV=Aw0}l6*#yh>&jo3(%%2P5 z%&FLP{B2M>eE4Nw+A=)2BR%u(+h6ar74prDv+`H|rVjWYAjh*gY zz3Q+l%Qh4}a>qJO9$P;}v+fCDUE|j&CO?>H`2NWEBxuaEyxJYzkCqjqWM}Q#W0EXt zXSSgdXI}2K2{NatlU0MrNS1Zuqv7chDp|Uw>s(?@Kle}bYwdQOxoFIqIdX=Ct3(QT zU@{CNgUcy&QB=GRkgG!%Ih^fk*gUl4Bqs40i=hrGAa!X@vFW~#@)tSm=_AbvN|c}i z;q%UT3L%W?c-?tLclIZ-IZ@kXwe6(*1AJ<7L<{X`f8m=!r)o80$iVOG0r1_HNX|2- zIJu3rK;q_jJKg%|eZ1WphMr zKEK7$4;SepD9gv5R-|B}Tt;I~4>z3*cg&|&h_c(|mihNoDh+b8-~w4~sDMik$M?#T zFPjGE%LD({Qk>ix{sF#8Adp%}voheQSUAzMZ|(5}hU6lIEt5|Mp~ zJcw8+W#r?^s$7H1+ebsSg0UkQE05BG!bpOq4rL#I<7slDwyx9(u#3?VijzeQXuCNS zF{NL=Zw(4{lD3_GfD^!xUFNRDzSmP54{zY`1hDW5907%U-o|RNhHycjE$JIN1 zn7Gf4(|7+RqwWf^4y0EKyylTRHDtQsVzp;tw)amMFy!iu%4W6N!t4(I=9-@-vVIJ{ zLbY}$%xJclC;yi7hSQ!ShL0@FccfppkVG6ZvNiJB?Iw`bDK+6#>ba;*3>nbZ%$aNpodIpq?U@wtfdY>1@Z90{ zDa=BVm8Sli&9MQ4$T>ETCke!@N9ax~^fWEy)*$*2M)39L@O~u4lzJdiVG4-t*lTB} zZ)raFz(~mTjXfnt<3GUY_h>Q?q9=C0Bv_%L5(5>)g>V0IW>||z9g_Radv;khqjnN! zfrvyDjCfT<3hK>TzCWLkJ>D&iU@ftR4i#U^o#R^$#qgDx8=BO=G&HqhYV#EknApIW zQh;YK!eOk19K)+vRnI#^TI2mS*?%HTB`aPf4Hfqd^Iva{E*Jpp?1k8L8U%AVmVax8 z(PKJHZ@JO<%5Dj5nK|T&b(lpP!dRW7n+!R=3NoPCH^cAX9tPJ05!G-BS)*Mr&!P4) z4cN+#rwI?k{a|1|4P@XZbO;li0w)5i-+Z%y-Y6n1?0$(JaMDK8f`wZyWHIhh=LZqF z((8XI4l0w>8ZAx)md=h^7+RE1o#okDlo)%36I_Y1zR+7if@CSmR>D^h!ETw5*%m&E z@d+mS^ly+c&5*cEh&%=wNn>n0IS?F}ApW)|;0-Z>S< z6E?+3osk=qfbRuqU9Lo`XD=hYz=hnkT3aCk zW%8Gw0h;K70Qpq?K=syeCE6T&=LP}@agm@2o))@Yb~KB{$ORDzu6DDEI$A9!&O!BZ zSTC~c$&uZO>eXG1!?^5`#4&r3$&cOuuM5Z^;wGF#g!uq+0T`GM2mMGdDO83|Q5vu& zK@teLHt6}(AvtSa8+Soxc2{{je$t3!qem3q>*2q6>o*|~62wD^ke|<+9RGNKa{y_lFJwH}X_MWoq!pUas_4mJ zTw6JS3rTI+)a2gV&9@avenb*ceC3m0e8jc|L2H(NS50E7Z!&thQDu_-VukHk8?WS& zLcBTbF66ir?zts8qoKvwoA{mM)3+O<_25%>;HwDX#t8d*CB~~yN~v?H;2g)w+)Usu z>d`==Cj%7N1-#_}N#!`+u)X_djkv|pQV^KFqOmxZx&W<$Kn4_(JkaW#9y?+Ei-2kB z)4OE}xm-kJg99jcK^HyR1Jdj=j*bW41WPr`&D$c*09t_O*K4Dm;7`MPy=7!do6}d0 zAZsNNTdRad#hO=M<*d$ z(+gU35^dq7)#pp7 z1`=w`b$HcLXT=s4GqT>pTh-1IVe%|UoH4?(Ff@5#1#tp)SmcRi|2js!l8f?;6-N!m z9`Vi4j*2V#99-FBMdld(kv`Pl0gDhwZ)isKiS zNPqosc-(`lVLb9^Sfj$%X+oq(Mcz4^=<`(%~v)bp1G z&)*0b&?ZZEGwh`jJ literal 0 HcmV?d00001 diff --git a/recipes-core/plymouth/plymouth_%.bbappend b/recipes-core/plymouth/plymouth_%.bbappend index cdfb9778..a2dfab02 100644 --- a/recipes-core/plymouth/plymouth_%.bbappend +++ b/recipes-core/plymouth/plymouth_%.bbappend @@ -3,6 +3,8 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI += " \ file://0001-disable-boot-splash-later.patch \ file://torizon-splash.png \ + file://torizon-splash-new.png \ + file://torizon-splash-dev-new.png \ file://torizon-splash-dev.png \ file://commontorizonlogo.png \ file://commontorizonlogo-dev.png \ @@ -19,9 +21,9 @@ EXTRA_OECONF += "--with-udev --with-runtimedir=/run" do_install:append () { # use the labs logo if we are building the engineering image if [ "${TDX_DEBUG}" = "1" ]; then - install -m 0644 ${WORKDIR}/torizon-splash-dev.png ${D}${datadir}/plymouth/themes/spinner/watermark.png + install -m 0644 ${WORKDIR}/torizon-splash-dev-new.png ${D}${datadir}/plymouth/themes/spinner/watermark.png else - install -m 0644 ${WORKDIR}/torizon-splash.png ${D}${datadir}/plymouth/themes/spinner/watermark.png + install -m 0644 ${WORKDIR}/torizon-splash-new.png ${D}${datadir}/plymouth/themes/spinner/watermark.png fi install -m 0644 ${WORKDIR}/spinner.plymouth ${D}${datadir}/plymouth/themes/spinner/spinner.plymouth From 8ec0c448eb7f09758e5c644b215428a1264b0e0b Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 11 Jan 2024 21:39:16 -0300 Subject: [PATCH 135/163] common: classes: image_type_torizon: Not depend on BSP versioning Signed-off-by: Matheus Castello --- recipes-images/images/torizon-core-common-docker-dev.bb | 3 +++ recipes-images/images/torizon-core-common-docker.bb | 4 ++++ recipes-images/images/torizon-os-version.inc | 6 ++++++ 3 files changed, 13 insertions(+) create mode 100644 recipes-images/images/torizon-os-version.inc diff --git a/recipes-images/images/torizon-core-common-docker-dev.bb b/recipes-images/images/torizon-core-common-docker-dev.bb index e7fc5cdc..328f9720 100644 --- a/recipes-images/images/torizon-core-common-docker-dev.bb +++ b/recipes-images/images/torizon-core-common-docker-dev.bb @@ -1,3 +1,6 @@ +TDX_COMMON = "1" + +require torizon-os-version.inc require torizon-core-docker.bb require torizon-core-dev.inc diff --git a/recipes-images/images/torizon-core-common-docker.bb b/recipes-images/images/torizon-core-common-docker.bb index b0072ace..349b7e41 100644 --- a/recipes-images/images/torizon-core-common-docker.bb +++ b/recipes-images/images/torizon-core-common-docker.bb @@ -1,3 +1,7 @@ +TDX_COMMON = "1" + +require torizon-os-version.inc + SUMMARY = "TorizonCore" DESCRIPTION = "TorizonCore Linux with no containers pre-provisioned." diff --git a/recipes-images/images/torizon-os-version.inc b/recipes-images/images/torizon-os-version.inc new file mode 100644 index 00000000..73d1aee8 --- /dev/null +++ b/recipes-images/images/torizon-os-version.inc @@ -0,0 +1,6 @@ + +TDX_MAJOR = "6" +TDX_MINOR = "6" +TDX_PATCH = "0" + +TDX_RELEASE = "${TDX_MAJOR}.${TDX_MINOR}.${TDX_PATCH}-common" From 0dc08df977fbab2cb724d24a1aa6db9f6324bfa5 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Thu, 11 Jan 2024 23:26:11 -0300 Subject: [PATCH 136/163] common: classes: image_type_torizon: Fix platform package name The package name and version are a bit weird in the platform UI. So, let's use only the RELEASE-MACHINE format, and the version will be the actual release version instead of the hash. Fixes: #2 Signed-off-by: Matheus Castello --- classes/image_type_torizon.bbclass | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/classes/image_type_torizon.bbclass b/classes/image_type_torizon.bbclass index f650cd5b..e88dd28a 100644 --- a/classes/image_type_torizon.bbclass +++ b/classes/image_type_torizon.bbclass @@ -39,7 +39,8 @@ def get_tdx_ostree_purpose(purpose): TDX_OSTREE_PURPOSE ?= "${@get_tdx_ostree_purpose(d.getVar('TDX_PURPOSE'))}" # Use new branch naming -OSTREE_BRANCHNAME = "${TDX_MAJOR}/${MACHINE}/${DISTRO}/${IMAGE_BASENAME}/${TDX_OSTREE_PURPOSE}" +OSTREE_BRANCHNAME = "${TDX_RELEASE}-${MACHINE}" +GARAGE_TARGET_VERSION = "${TDX_RELEASE}" # Force ostree summary to be updated OSTREE_UPDATE_SUMMARY = "1" @@ -479,7 +480,7 @@ get_torizon_prov_data2() { # but may have different permissions; make sure they are correct. chmod 0750 "${destdir}/import/repo" || true chmod 0750 "${destdir}/import/director" || true - + if [ "${TORIZON_SOTA_PROV_MODE}" = "online" ]; then tmp="${destdir}/tmp/provision.json" dst="${destdir}/auto-provisioning.json" From 8f36c7acc8779560909288d4bbfb8fd35a225db1 Mon Sep 17 00:00:00 2001 From: Eduardo Ferreira Date: Mon, 15 Jan 2024 14:13:20 -0300 Subject: [PATCH 137/163] ostree: extend grub generator script to allow custom logic Extending ostree-grub-generator script, so that it also checks under '/etc/ostree.d' for bootloader logic to append to grub.cfg script. Also create the '/etc/ostree.d' folder in order to store the files to be appended. Related-to: TOR-3299 Signed-off-by: Eduardo Ferreira --- ...rator-allow-adding-custom-scripts-to.patch | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 recipes-extended/ostree/files/0001-ostree-grub-generator-allow-adding-custom-scripts-to.patch diff --git a/recipes-extended/ostree/files/0001-ostree-grub-generator-allow-adding-custom-scripts-to.patch b/recipes-extended/ostree/files/0001-ostree-grub-generator-allow-adding-custom-scripts-to.patch new file mode 100644 index 00000000..8b3fd52e --- /dev/null +++ b/recipes-extended/ostree/files/0001-ostree-grub-generator-allow-adding-custom-scripts-to.patch @@ -0,0 +1,56 @@ +From 9db2364ceb4febc3f5d2d13ad798c372920a5e06 Mon Sep 17 00:00:00 2001 +From: Eduardo Ferreira +Date: Thu, 21 Dec 2023 10:04:54 -0300 +Subject: [PATCH] ostree-grub-generator: allow adding custom scripts to + grub.cfg + +This changes allow us to customize grub.cfg without manually editing it. + +Now, whatever files found under /etc/ostree.d are added (in alphabetical +order) between the cfg header and its menuentries. + +Upstream-Status: Pending + +Signed-off-by: Eduardo Ferreira +--- + src/boot/grub2/ostree-grub-generator | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/src/boot/grub2/ostree-grub-generator b/src/boot/grub2/ostree-grub-generator +index d1436b65..f644fd8a 100644 +--- a/src/boot/grub2/ostree-grub-generator ++++ b/src/boot/grub2/ostree-grub-generator +@@ -25,6 +25,7 @@ script=$(basename ${0}) + # Atomically safe location where to generete grub.cfg when executing system upgrade. + new_grub2_cfg=${2} + entries_path=$(dirname $new_grub2_cfg)/entries ++custom_scripts="/etc/ostree.d" + + read_config() + { +@@ -105,10 +106,22 @@ timeout=10 + EOF + } + ++populate_custom_section() ++{ ++if [ -d "$custom_scripts" ]; then ++ for script in $(ls -v $custom_scripts/*); do ++ echo -e "\n### BEGIN ${script} ###" >> ${new_grub2_cfg} ++ cat ${script} >> ${new_grub2_cfg} ++ echo -e "\n### END ${script} ###\n" >> ${new_grub2_cfg} ++ done ++fi ++} ++ + generate_grub2_cfg() + { + populate_warning + populate_header ++ populate_custom_section + populate_menu + } + +-- +2.34.1 + From dc1e458e85c9c516722379c9645077fe186b3f93 Mon Sep 17 00:00:00 2001 From: Eduardo Ferreira Date: Mon, 15 Jan 2024 14:18:05 -0300 Subject: [PATCH 138/163] grub-efi: add regexp module to grub Related-to: TOR-3299 Signed-off-by: Eduardo Ferreira --- recipes-bsp/grub/grub-efi_%.bbappend | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/recipes-bsp/grub/grub-efi_%.bbappend b/recipes-bsp/grub/grub-efi_%.bbappend index f7b5ecc6..4fa00d3f 100644 --- a/recipes-bsp/grub/grub-efi_%.bbappend +++ b/recipes-bsp/grub/grub-efi_%.bbappend @@ -1,16 +1,2 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/files:" - -SRC_URI:append = " \ - file://0001-fs-fat-Don-t-error-when-mtime-is-0.patch \ -" - -RDEPENDS:${PN}:class-target:remove:sota = "virtual-grub-bootconf" - -GRUB_BUILDIN += "reboot" - -# Create startup.nsh so it can be consumed by wic -do_deploy:append:class-target() { - DEST_IMAGE=$(echo ${GRUB_IMAGE} | sed -e 's/^grub-efi-//') - echo 'fs0:\\EFI\\BOOT\\'${DEST_IMAGE} > startup.nsh - install -m 755 ${B}/startup.nsh ${DEPLOYDIR} -} +# Add regexp command to GRUB +GRUB_BUILDIN += "regexp" From 4c7edf72851d9cb8afd4ea68794dfac2bd181b6f Mon Sep 17 00:00:00 2001 From: Eduardo Ferreira Date: Mon, 15 Jan 2024 14:19:54 -0300 Subject: [PATCH 139/163] grub-ota-fallback: create recipe to add fallback logic to Grub after OTA This recipe uses the OSTree change that enables to add custom logic to grub.cfg. It adds the '99_fallback_logic' to '/etc/ostree.d', so after an update, if it goes wrong, grub can perform a fallback. Adds the 'grubenv-create' service, a oneshot service that the idea is to only run in the first boot ever, since it check the BOOT partition for the grubenv environment file, and if it's not present, it will create one with the variables used during fallback with their default values. Adds an entry into fstab, so that the BOOT partition is mounted and ready for both Greenboot and grubenv-create.service to operate on Grub environment file. And also adds 2 aliases for 'grubenv-edit' tool, for 'fw_printenv' and 'fw_setenv', so that both Aktualizr and Greenboot become compatible with Grub. Related-to: TOR-3299 Signed-off-by: Eduardo Ferreira --- recipes-core/base-files/base-files/fstab | 1 + recipes-images/images/torizon-core-common.inc | 5 ++ .../grub-ota-fallback/99_fallback_logic | 53 +++++++++++++++++++ .../grub-ota-fallback/fw_printenv | 8 +++ .../grub-ota-fallback/fw_setenv | 6 +++ .../grub-ota-fallback/grubenv-create.service | 13 +++++ .../grub-ota-fallback_1.0.bb | 37 +++++++++++++ 7 files changed, 123 insertions(+) create mode 100644 recipes-sota/grub-ota-fallback/grub-ota-fallback/99_fallback_logic create mode 100644 recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_printenv create mode 100644 recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_setenv create mode 100644 recipes-sota/grub-ota-fallback/grub-ota-fallback/grubenv-create.service create mode 100644 recipes-sota/grub-ota-fallback/grub-ota-fallback_1.0.bb diff --git a/recipes-core/base-files/base-files/fstab b/recipes-core/base-files/base-files/fstab index 70e400f5..fae8050b 100644 --- a/recipes-core/base-files/base-files/fstab +++ b/recipes-core/base-files/base-files/fstab @@ -1,6 +1,7 @@ # stock fstab - you probably want to override this with a machine specific one /dev/root / auto defaults 1 1 +/dev/sda1 /var/rootdirs/media/efi vfat defaults 0 2 proc /proc proc defaults 0 0 devpts /dev/pts devpts mode=0620,ptmxmode=0666,gid=5 0 0 tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0 diff --git a/recipes-images/images/torizon-core-common.inc b/recipes-images/images/torizon-core-common.inc index 2419dea3..b2581221 100644 --- a/recipes-images/images/torizon-core-common.inc +++ b/recipes-images/images/torizon-core-common.inc @@ -76,6 +76,11 @@ CORE_IMAGE_BASE_INSTALL:append:sota = " \ provision-device \ " +# Update fallback for GRUB (for now only on x86 machines) +CORE_IMAGE_BASE_INSTALL:append:x86-64 = " \ + grub-ota-fallback \ +" + CORE_IMAGE_BASE_INSTALL:append:mx8-nxp-bsp = " \ kernel-module-imx-gpu-viv \ " diff --git a/recipes-sota/grub-ota-fallback/grub-ota-fallback/99_fallback_logic b/recipes-sota/grub-ota-fallback/grub-ota-fallback/99_fallback_logic new file mode 100644 index 00000000..cb029058 --- /dev/null +++ b/recipes-sota/grub-ota-fallback/grub-ota-fallback/99_fallback_logic @@ -0,0 +1,53 @@ +# GRUB can't add, so we hack an increment +set inc_range="0,1 1,2 2,3" +function inc_bootcount { + set incr="" + regexp --set=1:incr "${bootcount},([0-9]+)" "${inc_range}" + set bootcount=$incr +} + +function inc_default { + set incr="" + regexp --set=1:incr "${default},([0-9]+)" "${inc_range}" + set default=$incr +} + +# Load all the variables needed +load_env + +if [ "${rollback}" == "0" -a "${upgrade_available}" = "1" ]; then + # Make sure to reset default whenever we already performed a rollback + # and deployed a new image. This way we'll be able to boot this new image + # and test it. If all fails we can still fallback. + set default=0 + save_env default +fi + +if [ "${rollback}" == "1" -a "${upgrade_available}" = "1" ]; then + # Make sure to reset upgrade_available to avoid unnecessary wear + # Note this also makes rollback permanent. aktualizr will reset rollback + # when a new (hopefully better) update comes in. + set upgrade_available=0 + save_env upgrade_available +fi + +if [ "${bootcount}" == "${bootlimit}" ]; then + # We've reached our retry limit, marking for OS rollback + set rollback=1 + save_env rollback +else + inc_bootcount + save_env bootcount +fi + +if [ "${upgrade_available}" == "1" ]; then + if [ "${rollback}" == 1 ]; then + # We need to rollback, so we reset 'bootcount' and increase default value. + # Since entries are ordered from newest to oldest, increasing default is + # rolling back to the last entry. + inc_default + set bootcount=0 + save_env default + save_env bootcount + fi +fi diff --git a/recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_printenv b/recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_printenv new file mode 100644 index 00000000..b5569a9b --- /dev/null +++ b/recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_printenv @@ -0,0 +1,8 @@ +#!/bin/bash + +# Aliasing grub-editenv to U-Boot's fw_setenv +if [[ $# -ne 1 ]]; then + grub-editenv /var/rootdirs/media/efi/EFI/BOOT/grubenv list +else + grub-editenv /var/rootdirs/media/efi/EFI/BOOT/grubenv list | grep "^$1=" || echo "$1=" +fi \ No newline at end of file diff --git a/recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_setenv b/recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_setenv new file mode 100644 index 00000000..f01651ee --- /dev/null +++ b/recipes-sota/grub-ota-fallback/grub-ota-fallback/fw_setenv @@ -0,0 +1,6 @@ +#!/bin/bash + +# Aliasing grub-editenv to U-Boot's fw_setenv +if [[ $# -eq 2 ]]; then + grub-editenv /var/rootdirs/media/efi/EFI/BOOT/grubenv set "$1"="$2" +fi \ No newline at end of file diff --git a/recipes-sota/grub-ota-fallback/grub-ota-fallback/grubenv-create.service b/recipes-sota/grub-ota-fallback/grub-ota-fallback/grubenv-create.service new file mode 100644 index 00000000..c99ed932 --- /dev/null +++ b/recipes-sota/grub-ota-fallback/grub-ota-fallback/grubenv-create.service @@ -0,0 +1,13 @@ +[Unit] +Description=Check and create grubenv if not present +After=boot-complete.target +Requires=boot-complete.target +ConditionPathExists=|!/var/rootdirs/media/efi/EFI/BOOT/grubenv + +[Service] +Type=oneshot +WorkingDirectory=/var/rootdirs/media/efi/EFI/BOOT/ +ExecStart=/usr/bin/grub-editenv ./grubenv create ; /usr/bin/grub-editenv ./grubenv set bootcount=0 bootlimit=3 rollback=0 upgrade_available=0 + +[Install] +WantedBy=multi-user.target diff --git a/recipes-sota/grub-ota-fallback/grub-ota-fallback_1.0.bb b/recipes-sota/grub-ota-fallback/grub-ota-fallback_1.0.bb new file mode 100644 index 00000000..85018939 --- /dev/null +++ b/recipes-sota/grub-ota-fallback/grub-ota-fallback_1.0.bb @@ -0,0 +1,37 @@ +SUMMARY = "Adds fallback logic to GRUB boot script" + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = "\ + file://99_fallback_logic \ + file://grubenv-create.service \ + file://fw_printenv \ + file://fw_setenv \ +" + +S = "${WORKDIR}" + +inherit systemd + +RDEPENDS:${PN} = "bash" + +SYSTEMD_SERVICE:${PN} = "grubenv-create.service" + +do_install() { + install -d ${D}${bindir} + install -m 0755 ${WORKDIR}/fw_printenv ${D}${bindir}/fw_printenv + install -m 0755 ${WORKDIR}/fw_setenv ${D}${bindir}/fw_setenv + + install -d ${D}${sysconfdir}/ostree.d + install -m 0755 ${WORKDIR}/99_fallback_logic ${D}${sysconfdir}/ostree.d/99_fallback_logic + + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/grubenv-create.service ${D}${systemd_unitdir}/system/grubenv-create.service +} + +FILES:${PN} += "\ + ${systemd_unitdir}/system/grubenv-create.service \ + ${bindir}/fw_printenv \ + ${bindir}/fw_setenv \ +" \ No newline at end of file From d67a6049e360d38cd9d3daed99297b992d93e4d3 Mon Sep 17 00:00:00 2001 From: Eduardo Ferreira Date: Fri, 19 Jan 2024 08:55:05 -0300 Subject: [PATCH 140/163] aktualizr-default-sec: remove u-boot-fw-utils from x86 QEMU image Since we're now aliasing 'grub-editenv' to 'fw_setenv' and 'fw_printenv', we need to remove 'u-boot-fw-utils' from the x86 QEMU image in order do avoid collision. Related-to: TOR-3299 Signed-off-by: Eduardo Ferreira --- recipes-sota/config/aktualizr-default-sec.bb | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes-sota/config/aktualizr-default-sec.bb b/recipes-sota/config/aktualizr-default-sec.bb index cd7bdc0e..0de1178b 100644 --- a/recipes-sota/config/aktualizr-default-sec.bb +++ b/recipes-sota/config/aktualizr-default-sec.bb @@ -14,6 +14,7 @@ SRC_URI = " \ RDEPENDS:${PN} += "bash coreutils jq util-linux mmc-utils sed u-boot-fw-utils" RDEPENDS:${PN}:remove:genericx86-64 = "u-boot-fw-utils" +RDEPENDS:${PN}:remove:qemux86-64 = "u-boot-fw-utils" RDEPENDS:${PN}:remove:intel-corei7-64 = "u-boot-fw-utils" do_install:append () { From ae4cff132de9755404d0350bd2915e87472dc213 Mon Sep 17 00:00:00 2001 From: Eduardo Ferreira Date: Mon, 22 Jan 2024 14:48:10 -0300 Subject: [PATCH 141/163] config: x86: enable support for USB GSM or CDMA modem Signed-off-by: Eduardo Ferreira --- recipes-kernel/linux/files/intel-corei7-64.cfg | 3 +++ recipes-kernel/linux/files/qemux86-64.cfg | 2 ++ 2 files changed, 5 insertions(+) diff --git a/recipes-kernel/linux/files/intel-corei7-64.cfg b/recipes-kernel/linux/files/intel-corei7-64.cfg index 8e627c7e..a55cf936 100644 --- a/recipes-kernel/linux/files/intel-corei7-64.cfg +++ b/recipes-kernel/linux/files/intel-corei7-64.cfg @@ -54,3 +54,6 @@ CONFIG_VBOXGUEST=m CONFIG_VBOXSF_FS=m # QEMU CONFIG_DRM_CIRRUS_QEMU=y +# USB +CONFIG_USB_SERIAL_WWAN=m +CONFIG_USB_SERIAL_OPTION=m \ No newline at end of file diff --git a/recipes-kernel/linux/files/qemux86-64.cfg b/recipes-kernel/linux/files/qemux86-64.cfg index 258bf88f..72ad6e77 100644 --- a/recipes-kernel/linux/files/qemux86-64.cfg +++ b/recipes-kernel/linux/files/qemux86-64.cfg @@ -39,3 +39,5 @@ CONFIG_DRM_VMWGFX_FBCON=y CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_CP210X=y +CONFIG_USB_SERIAL_WWAN=m +CONFIG_USB_SERIAL_OPTION=m From 836ae2cb3dde250f70e29c4b0151c2f5d48e0724 Mon Sep 17 00:00:00 2001 From: Stefano Viola Date: Sat, 27 Jan 2024 15:41:04 +0100 Subject: [PATCH 142/163] Fix the names Change TorizonCore to Torizon OS and Torizon Platform to Torizon Cloud Signed-off-by: Stefano Viola --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7f2782f9..ce4c589f 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -# Common TorizonCore +# Common Torizon OS ![Common Torizon cover image](https://github.com/commontorizon/Documentation/blob/main/assets/img/commonTorizonCore800.png?raw=true) -Common TorizonCore is an embedded Linux distribution for the Torizon platform. It +Common Torizon OS is an embedded Linux distribution for the [Torizon Cloud](https://app.torizon.io/). It features, among other essential services, a container runtime and components for secure remote over-the-air (OTA) updates. -This layer provides the necessary metadata to build the Common TorizonCore Linux +This layer provides the necessary metadata to build the Common Torizon OS Linux distribution. -> ⚠️ **DISCLAIMER:** this is a derivative work from TorizonCore open source project. Torizon™ is a registered trademark of Toradex Group AG. This derivative work have not been reviewed or approved by Toradex. Common Torizon community does not talk on behalf of Toradex. +> ⚠️ **DISCLAIMER:** this is a derivative work from Torizon OS open source project. Torizon™ is a registered trademark of Toradex Group AG. This derivative work have not been reviewed or approved by Toradex. Common Torizon community does not talk on behalf of Toradex. > >⚠️ **This software is provided experimentally as-is.** @@ -19,7 +19,7 @@ General documentation for the community can be found here: Date: Fri, 23 Feb 2024 00:48:20 -0300 Subject: [PATCH 143/163] common: torizon.inc: Add the connman to the BBMASK Signed-off-by: Matheus Castello --- conf/distro/include/torizon.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/distro/include/torizon.inc b/conf/distro/include/torizon.inc index 0bd6bf3b..1dc01621 100644 --- a/conf/distro/include/torizon.inc +++ b/conf/distro/include/torizon.inc @@ -75,6 +75,7 @@ BBMASK += " \ /meta-freescale/recipes-graphics/cairo \ /openembedded-core/meta/recipes-devtools/cargo \ /openembedded-core/meta/recipes-devtools/rust \ + /openembedded-core/meta/recipes-connectivity/connman \ " # machines where TorizonCore is experimental From 63d02f4ca0441d27304fb79828eb989a6ad3df18 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Fri, 23 Feb 2024 10:29:21 -0300 Subject: [PATCH 144/163] common: recipes-core: Fix fstab The entry for the /dev/sda1 partition make sense only for x86, for the other machines this is causing a boot wait for the /dev/sda1 device that does not exist. Signed-off-by: Matheus Castello --- recipes-core/base-files/base-files/fstab | 1 - recipes-core/base-files/base-files/x86/fstab | 12 ++++++++++++ recipes-core/base-files/base-files_%.bbappend | 9 +++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 recipes-core/base-files/base-files/x86/fstab diff --git a/recipes-core/base-files/base-files/fstab b/recipes-core/base-files/base-files/fstab index fae8050b..70e400f5 100644 --- a/recipes-core/base-files/base-files/fstab +++ b/recipes-core/base-files/base-files/fstab @@ -1,7 +1,6 @@ # stock fstab - you probably want to override this with a machine specific one /dev/root / auto defaults 1 1 -/dev/sda1 /var/rootdirs/media/efi vfat defaults 0 2 proc /proc proc defaults 0 0 devpts /dev/pts devpts mode=0620,ptmxmode=0666,gid=5 0 0 tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0 diff --git a/recipes-core/base-files/base-files/x86/fstab b/recipes-core/base-files/base-files/x86/fstab new file mode 100644 index 00000000..fae8050b --- /dev/null +++ b/recipes-core/base-files/base-files/x86/fstab @@ -0,0 +1,12 @@ +# stock fstab - you probably want to override this with a machine specific one + +/dev/root / auto defaults 1 1 +/dev/sda1 /var/rootdirs/media/efi vfat defaults 0 2 +proc /proc proc defaults 0 0 +devpts /dev/pts devpts mode=0620,ptmxmode=0666,gid=5 0 0 +tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0 +tmpfs /var/volatile tmpfs defaults 0 0 + +# uncomment this if your device has a SD/MMC/Transflash slot +#/dev/mmcblk0p1 /media/card auto defaults,sync,noauto 0 0 + diff --git a/recipes-core/base-files/base-files_%.bbappend b/recipes-core/base-files/base-files_%.bbappend index f9b65cb9..308ba85e 100644 --- a/recipes-core/base-files/base-files_%.bbappend +++ b/recipes-core/base-files/base-files_%.bbappend @@ -2,6 +2,10 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" hostname = "" +SRC_URI += " \ + file://x86/fstab \ +" + # This deviates a bit from what OE-core is doing. Especially we want the full # distro version (with date) in /etc/issue. From what I understand the filtering # has been mainly done to avoid inconsistency, but since we anyway rebuild @@ -14,6 +18,11 @@ do_install_basefilesissue () { printf "%s %%h\n\n" "${DISTRO_VERSION}" >> ${D}${sysconfdir}/issue.net } +# This is needed because we are adding the env file on the x86 +do_install:append:x86-64() { + install -m 0644 ${WORKDIR}/x86/fstab ${D}${sysconfdir}/fstab +} + do_install:append:cfs-support () { # Get rid of the /dev/root entry in fstab to avoid errors from # systemd-remount-fs. From 1f1811fc672cb435ac7ee68f5d5a75951eb0ca9b Mon Sep 17 00:00:00 2001 From: Leonardo Graboski Veiga Date: Wed, 13 Mar 2024 08:28:49 -0300 Subject: [PATCH 145/163] readme: sync feature table with 6.6.0 Update the feature support table according to the 6.6.0 release table available on https://github.com/commontorizon/meta-common-torizon/releases/tag/v6.6.0-common Signed-off-by: Leonardo Graboski Veiga --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index ce4c589f..9ddfd0ec 100644 --- a/README.md +++ b/README.md @@ -21,19 +21,19 @@ General documentation for the community can be found here: ⚠️* **TEZI**: Toradex Easy Installer ⚠️** **TCB**: TorizonCore Builder From 8fed4ef62fcc0b6644ceb503fa12df4c8c466685 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Mon, 18 Mar 2024 23:58:25 -0300 Subject: [PATCH 146/163] common: plymouth: remove references to the old splash screen Signed-off-by: Matheus Castello --- recipes-core/plymouth/plymouth_%.bbappend | 2 -- 1 file changed, 2 deletions(-) diff --git a/recipes-core/plymouth/plymouth_%.bbappend b/recipes-core/plymouth/plymouth_%.bbappend index a2dfab02..adb84e3c 100644 --- a/recipes-core/plymouth/plymouth_%.bbappend +++ b/recipes-core/plymouth/plymouth_%.bbappend @@ -9,8 +9,6 @@ SRC_URI += " \ file://commontorizonlogo.png \ file://commontorizonlogo-dev.png \ file://0001-themes-only-install-spinner.patch \ - file://torizonlogo-white.png \ - file://torizonlogo-labs.png \ file://spinner.plymouth \ " From 206f06b40510f7993dc9fc7156248dfb1f9ab5aa Mon Sep 17 00:00:00 2001 From: Leonardo Graboski Veiga Date: Mon, 18 Mar 2024 11:24:26 -0300 Subject: [PATCH 147/163] xenomai: Add distro and recipe for Xenomai 4 on x86 Add a distro named "torizon-xenomai" that select the Xenomai kernel and set the corresponding kernel command-line args. Add a recipe that build the "linux-evl" Xenomai 4 kernel fork, which include the EVL co-processor implementation. Use the active SLTS kernel 5.10.y branch from Xenomai, because it's the same version as "linux-intel-lts" for kirkstone in meta-common-torizon. Set minimal kernel config for Xenomai to work. Further optimization may be possible, but is not covered. Signed-off-by: Leonardo Graboski Veiga --- conf/distro/torizon-xenomai.conf | 11 +++++ conf/machine/include/intel-corei7-64.inc | 8 ++++ recipes-kernel/linux/files/xenomai.cfg | 53 ++++++++++++++++++++++ recipes-kernel/linux/linux-xenomai.inc | 28 ++++++++++++ recipes-kernel/linux/linux-xenomai_5.10.bb | 26 +++++++++++ 5 files changed, 126 insertions(+) create mode 100644 conf/distro/torizon-xenomai.conf create mode 100644 recipes-kernel/linux/files/xenomai.cfg create mode 100644 recipes-kernel/linux/linux-xenomai.inc create mode 100644 recipes-kernel/linux/linux-xenomai_5.10.bb diff --git a/conf/distro/torizon-xenomai.conf b/conf/distro/torizon-xenomai.conf new file mode 100644 index 00000000..e2238039 --- /dev/null +++ b/conf/distro/torizon-xenomai.conf @@ -0,0 +1,11 @@ +require conf/distro/torizon.conf + +DISTRO = "torizon-xenomai" +DISTRO_NAME = "TorizonCore with Xenomai" + +DISTRO_FLAVOUR = " (XENOMAI)" +DISTRO_FLAVOUR:experimental = " (XENOMAI EXPERIMENTAL)" + +DISTROOVERRIDES .= ":xenomai" + +IMAGE_BASENAME_SUFFIX = "-xenomai" diff --git a/conf/machine/include/intel-corei7-64.inc b/conf/machine/include/intel-corei7-64.inc index d17871ce..23387462 100644 --- a/conf/machine/include/intel-corei7-64.inc +++ b/conf/machine/include/intel-corei7-64.inc @@ -5,6 +5,10 @@ WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" CORE_IMAGE_BASE_INSTALL:append = "resize-helper docker-binfmt" OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64 = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " +OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64:xenomai = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash \ + fbcon=map:10 audit=0 hpet=disable clocksource=tsc tsc=reliable intel_pstate=disable intel_idle.max_cstate=0 intel.max_cstate=0 processor.max_cstate=0 processor_idle.max_cstate=0 \ + rcupdate.rcu_cpu_stall_suppress=1 mce=off nmi_watchdog=0 nosoftlockup noht numa_balancing=disable hugepages=1024 rcu_nocb_poll=1024 irqaffinity=0 isolcpus=1,3 rcu_nocbs=1,3 nohz_full=1,3 \ + i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0 " OSTREE_BOOTLOADER:intel-corei7-64 = "grub" OSTREE_DEPLOY_DEVICETREE:intel-corei7-64 = "0" EFI_PROVIDER:intel-corei7-64 = "grub-efi" @@ -23,5 +27,9 @@ PREFERRED_PROVIDER_virtual/dtb = "" PREFERRED_PROVIDER_virtual/kernel = "linux-intel" PREFERRED_VERSION_linux-intel = "5.10.%" +PREFERRED_PROVIDER_virtual/kernel:xenomai = "linux-xenomai" +PREFERRED_VERSION_linux-xenomai = "5.10.%" + IMAGE_INSTALL:remove = " minnowboard-efi-startup" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" +LINUX_VERSION_EXTENSION:xenomai ?= "-torizon-${LINUX_KERNEL_TYPE}-xenomai" diff --git a/recipes-kernel/linux/files/xenomai.cfg b/recipes-kernel/linux/files/xenomai.cfg new file mode 100644 index 00000000..a34696b7 --- /dev/null +++ b/recipes-kernel/linux/files/xenomai.cfg @@ -0,0 +1,53 @@ +# +# IRQ subsystem +# +CONFIG_IRQ_PIPELINE=y + +# +# Processor type and features +# +CONFIG_EVL=y +# CONFIG_EVL_SCHED_QUOTA is not set +# CONFIG_EVL_SCHED_TP is not set +# CONFIG_EVL_HIGH_PERCPU_CONCURRENCY is not set +CONFIG_EVL_RUNSTATS=y +# CONFIG_EVL_NET is not set + +# +# Fixed sizes and limits +# +CONFIG_EVL_COREMEM_SIZE=2048 +CONFIG_EVL_NR_THREADS=256 +CONFIG_EVL_NR_MONITORS=512 +CONFIG_EVL_NR_CLOCKS=8 +CONFIG_EVL_NR_XBUFS=128 +CONFIG_EVL_NR_PROXIES=64 +CONFIG_EVL_NR_OBSERVABLES=64 +# end of Fixed sizes and limits + +# +# Pre-calibrated latency +# +CONFIG_EVL_LATENCY_USER=0 +CONFIG_EVL_LATENCY_KERNEL=0 +CONFIG_EVL_LATENCY_IRQ=0 +# end of Pre-calibrated latency + +# CONFIG_EVL_DEBUG is not set +CONFIG_DOVETAIL=y +CONFIG_DOVETAIL_LEGACY_SYSCALL_RANGE=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ_STAT=n +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=n +CONFIG_CPU_FREQ_GOV_ONDEMAND=n + +# +# Out-of-band device drivers +# +CONFIG_EVL_LATMUS=y +CONFIG_EVL_HECTIC=y +# end of Out-of-band device drivers diff --git a/recipes-kernel/linux/linux-xenomai.inc b/recipes-kernel/linux/linux-xenomai.inc new file mode 100644 index 00000000..8f4ec2eb --- /dev/null +++ b/recipes-kernel/linux/linux-xenomai.inc @@ -0,0 +1,28 @@ +# from meta-intel +require recipes-kernel/linux/linux-yocto.inc +require recipes-kernel/linux/meta-intel-compat-kernel.inc + +# from common-torizon +require common.inc + +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +KERNEL_CONFIG_URI ?= "git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=${KMETA_BRANCH};destsuffix=${KMETA}" + +SRC_URI = " \ + git://source.denx.de/Xenomai/xenomai4/linux-evl.git;protocol=https;branch=${KBRANCH};name=machine; \ + ${KERNEL_CONFIG_URI} \ + file://xenomai.cfg \ + " + +LINUX_VERSION_EXTENSION ??= "-intel-pk-${LINUX_KERNEL_TYPE}" + +PV = "${LINUX_VERSION}+git${SRCPV}" + +KMETA = "kernel-meta" +KCONF_BSP_AUDIT_LEVEL = "2" + +COMPATIBLE_MACHINE ?= "(intel-corei7-64|intel-core2-32)" + +KERNEL_FEATURES:append = " ${KERNEL_EXTRA_FEATURES}" +KERNEL_FEATURES:append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}" diff --git a/recipes-kernel/linux/linux-xenomai_5.10.bb b/recipes-kernel/linux/linux-xenomai_5.10.bb new file mode 100644 index 00000000..d08fec82 --- /dev/null +++ b/recipes-kernel/linux/linux-xenomai_5.10.bb @@ -0,0 +1,26 @@ +require linux-xenomai.inc + +SUMMARY = "Linux kernel with Xenomai patches" + +# Skip processing of this recipe if it is not explicitly specified as the +# PREFERRED_PROVIDER for virtual/kernel. This avoids errors when trying +# to build multiple virtual/kernel providers, e.g. as dependency of +# core-image-rt-sdk, core-image-rt. +python () { + if d.getVar("KERNEL_PACKAGE_NAME", True) == "kernel" and d.getVar("PREFERRED_PROVIDER_virtual/kernel") != "linux-xenomai": + raise bb.parse.SkipPackage("Set PREFERRED_PROVIDER_virtual/kernel to linux-xenomai to enable it") +} + +KBRANCH = "v5.10.y-evl-rebase" +KMETA_BRANCH = "yocto-5.10" + +LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" + +DEPENDS += "elfutils-native openssl-native util-linux-native" + +LINUX_VERSION ?= "5.10.209" +SRCREV_machine ?= "a48a4304d51f6d106e9b6e95ff63e95d3e502b03" +SRCREV_meta ?= "603507f09e4a22a650e37fb9dcfbcb69ceb36841" + +# Functionality flags +KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/security/security.scc" From 5d5ee07361d3f80a90cbd2b893e1c71a12742e68 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Tue, 19 Mar 2024 21:24:33 -0300 Subject: [PATCH 148/163] common: x6: fstab: Fix boot in maintenance mode Use LABEL=efi instead of /dev/sda1 to mount the EFI partition. This fix the boot issue under devices that does not create the /dev/sda1 device node, for example device that uses eMMC storage or other storage devices. Signed-off-by: Matheus Castello --- recipes-core/base-files/base-files/x86/fstab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-core/base-files/base-files/x86/fstab b/recipes-core/base-files/base-files/x86/fstab index fae8050b..ce8b86bb 100644 --- a/recipes-core/base-files/base-files/x86/fstab +++ b/recipes-core/base-files/base-files/x86/fstab @@ -1,7 +1,7 @@ # stock fstab - you probably want to override this with a machine specific one /dev/root / auto defaults 1 1 -/dev/sda1 /var/rootdirs/media/efi vfat defaults 0 2 +LABEL=efi /var/rootdirs/media/efi vfat defaults 0 2 proc /proc proc defaults 0 0 devpts /dev/pts devpts mode=0620,ptmxmode=0666,gid=5 0 0 tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0 From d59a43e25217c44be727d2c32c61340d1b2cd820 Mon Sep 17 00:00:00 2001 From: Leonardo Graboski Veiga Date: Thu, 21 Mar 2024 08:14:22 -0300 Subject: [PATCH 149/163] xenomai: tune kernel config for low latency In the Xenomai docs and also on Intel ECI docs, there are comments on kernel config that help with low latency, which improves the real-time reliability and performance. From https://v4.xenomai.org/dovetail/rulesofthumb/: * CONFIG_DEBUG_IRQ_PIPELINE and CONFIG_DEBUG_DOVETAIL are helpful to keep the development process sane. * CONFIG_RAW_PRINTK is useful and recommended for debugging Xenomai out-of-band issues. From https://v4.xenomai.org/core/user-api/scheduling/: * CONFIG_EVL_SCHED_QUOTA and CONFIG_EVL_SCHED_TP enabled to give users more scheduler options for the Xenomai out-of-band scheduler. From https://eci.intel.com/docs/3.1/appendix.html#eci-kernel-configuration-optimizations: * CONFIG_NO_HZ and CPU_FREQ_STAT disabled to reduce task scheduling clock overhead. * CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE enabled as default to prevent the CPU governor from throttling the CPU frequency for power-saving. * CONFIG_SUSPEND and CONFIG_PM disabled to prevent power management features to introduce spikes to latency. * CONFIG_VIRT_CPU_ACCOUNTING and CONFIG_VIRT_CPU_ACCOUNTING_GEN for more accurate task and CPU time accounting. * CONFIG_RCU_NOCB_CPU for CPU temporal isolation. Each config in this commit was enabled individually and tested for 5 minutes under stress, using the Scary Grinder workload as defined on the doc https://v4.xenomai.org/core/benchmarks/#stress-workloads A final stress test was run for 3 hours. This is the same idea as the "EVL stress" test defined on https://v4.xenomai.org/ports/, except it was not run for 24h. Signed-off-by: Leonardo Graboski Veiga --- recipes-kernel/linux/files/xenomai.cfg | 41 ++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/recipes-kernel/linux/files/xenomai.cfg b/recipes-kernel/linux/files/xenomai.cfg index a34696b7..9da73683 100644 --- a/recipes-kernel/linux/files/xenomai.cfg +++ b/recipes-kernel/linux/files/xenomai.cfg @@ -3,12 +3,38 @@ # CONFIG_IRQ_PIPELINE=y +# +# Timers subsystem +# +CONFIG_CONTEXT_TRACKING=y +# CONFIG_CONTEXT_TRACKING_FORCE is not set +CONFIG_NO_HZ=n + +# +# CPU/Task time and stats accounting +# +CONFIG_VIRT_CPU_ACCOUNTING=y +# CONFIG_TICK_CPU_ACCOUNTING is not set +CONFIG_VIRT_CPU_ACCOUNTING_GEN=y + +# +# RCU Subsystem +# +CONFIG_RCU_EXPERT=y +CONFIG_RCU_FANOUT=64 +CONFIG_RCU_FANOUT_LEAF=16 +# CONFIG_RCU_FAST_NO_HZ is not set +# CONFIG_RCU_BOOST is not set +CONFIG_RCU_NOCB_CPU=y +# CONFIG_TASKS_TRACE_RCU_READ_MB is not set + # # Processor type and features # CONFIG_EVL=y -# CONFIG_EVL_SCHED_QUOTA is not set -# CONFIG_EVL_SCHED_TP is not set +CONFIG_EVL_SCHED_QUOTA=y +CONFIG_EVL_SCHED_TP=y +CONFIG_EVL_SCHED_TP_NR_PART=4 # CONFIG_EVL_HIGH_PERCPU_CONCURRENCY is not set CONFIG_EVL_RUNSTATS=y # CONFIG_EVL_NET is not set @@ -37,6 +63,12 @@ CONFIG_EVL_LATENCY_IRQ=0 CONFIG_DOVETAIL=y CONFIG_DOVETAIL_LEGACY_SYSCALL_RANGE=y +# +# Power management and ACPI options +# +CONFIG_SUSPEND=n +CONFIG_PM=n + # # CPU Frequency scaling # @@ -51,3 +83,8 @@ CONFIG_CPU_FREQ_GOV_ONDEMAND=n CONFIG_EVL_LATMUS=y CONFIG_EVL_HECTIC=y # end of Out-of-band device drivers + +CONFIG_DEBUG_IRQ_PIPELINE=y +# CONFIG_IRQ_PIPELINE_TORTURE_TEST is not set +CONFIG_DEBUG_DOVETAIL=y +CONFIG_RAW_PRINTK=y \ No newline at end of file From efd2476689781acf33aa30c97c0c266a4a2a8095 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 23 Mar 2024 02:37:36 -0300 Subject: [PATCH 150/163] common: version: Fix own versioning and bump it Signed-off-by: Matheus Castello --- .../images => conf/distro/include}/torizon-os-version.inc | 4 +++- conf/template/local.conf | 1 + recipes-images/images/torizon-core-common-docker-dev.bb | 3 --- recipes-images/images/torizon-core-common-docker.bb | 4 ---- 4 files changed, 4 insertions(+), 8 deletions(-) rename {recipes-images/images => conf/distro/include}/torizon-os-version.inc (73%) diff --git a/recipes-images/images/torizon-os-version.inc b/conf/distro/include/torizon-os-version.inc similarity index 73% rename from recipes-images/images/torizon-os-version.inc rename to conf/distro/include/torizon-os-version.inc index 73d1aee8..139ec29c 100644 --- a/recipes-images/images/torizon-os-version.inc +++ b/conf/distro/include/torizon-os-version.inc @@ -1,6 +1,8 @@ TDX_MAJOR = "6" -TDX_MINOR = "6" +TDX_MINOR = "7" TDX_PATCH = "0" TDX_RELEASE = "${TDX_MAJOR}.${TDX_MINOR}.${TDX_PATCH}-common" + +TDX_COMMON = "1" diff --git a/conf/template/local.conf b/conf/template/local.conf index d93e2954..3bfb431b 100644 --- a/conf/template/local.conf +++ b/conf/template/local.conf @@ -1,3 +1,4 @@ +require conf/distro/include/torizon-os-version.inc # CONF_VERSION is increased each time build/conf/ changes incompatibly CONF_VERSION = "2" diff --git a/recipes-images/images/torizon-core-common-docker-dev.bb b/recipes-images/images/torizon-core-common-docker-dev.bb index 328f9720..e7fc5cdc 100644 --- a/recipes-images/images/torizon-core-common-docker-dev.bb +++ b/recipes-images/images/torizon-core-common-docker-dev.bb @@ -1,6 +1,3 @@ -TDX_COMMON = "1" - -require torizon-os-version.inc require torizon-core-docker.bb require torizon-core-dev.inc diff --git a/recipes-images/images/torizon-core-common-docker.bb b/recipes-images/images/torizon-core-common-docker.bb index 349b7e41..b0072ace 100644 --- a/recipes-images/images/torizon-core-common-docker.bb +++ b/recipes-images/images/torizon-core-common-docker.bb @@ -1,7 +1,3 @@ -TDX_COMMON = "1" - -require torizon-os-version.inc - SUMMARY = "TorizonCore" DESCRIPTION = "TorizonCore Linux with no containers pre-provisioned." From 7ab475f3cf3becb6bab1746b8715f30dccaf8402 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 23 Mar 2024 02:44:08 -0300 Subject: [PATCH 151/163] common: rac: Fix SRCREV:use-head-next When the SRCREV:use-head-next is set to ${AUTOREV} the rac recipe fails to build because the SRCREV_tough should be exactly the same as the Cargo.lock file is referencing, and it need to be set manually. Signed-off-by: Matheus Castello --- recipes-sota/rac/rac_git.bb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/recipes-sota/rac/rac_git.bb b/recipes-sota/rac/rac_git.bb index f8ebc4ce..c5ec29f3 100644 --- a/recipes-sota/rac/rac_git.bb +++ b/recipes-sota/rac/rac_git.bb @@ -12,7 +12,9 @@ SRC_URI = " \ " SRCREV = "dd2c885984f9ab19b522cb4cff22e46ae4095e3d" -SRCREV:use-head-next = "${AUTOREV}" +# FIXME: this sounds wrong, should not be the next +# FIXME: BUT WE ARE FOLLOWING WHAT UPSTREAM IS DOING +#SRCREV:use-head-next = "${AUTOREV}" S = "${WORKDIR}/git" From fba94268b0823e02491aa50db585f6400d43b216 Mon Sep 17 00:00:00 2001 From: Matheus Castello Date: Sat, 23 Mar 2024 02:46:57 -0300 Subject: [PATCH 152/163] common: raspberrypi0-wifi: Fix splash screen The raspberrypi0-wifi machine does not support the drm renderer, so we need to force the use of the frame buffer renderer. Signed-off-by: Matheus Castello --- conf/machine/include/raspberrypi0-wifi.inc | 4 +++- recipes-core/plymouth/plymouth_%.bbappend | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/machine/include/raspberrypi0-wifi.inc b/conf/machine/include/raspberrypi0-wifi.inc index b8d9c6fa..61bb6df2 100644 --- a/conf/machine/include/raspberrypi0-wifi.inc +++ b/conf/machine/include/raspberrypi0-wifi.inc @@ -4,4 +4,6 @@ KERNEL_DEVICETREE:raspberrypi0-wifi:sota ?= " bcm2708-rpi-zero-w.dtb overlays/vc OSTREE_KERNEL:raspberrypi0-wifi = "zImage" KERNEL_IMAGETYPE:raspberrypi0-wifi = "zImage" KERNEL_IMAGETYPE:sota:raspberrypi0-wifi = "zImage" -KERNEL_BOOTCMD:raspberrypi0-wifi = "bootz" \ No newline at end of file +KERNEL_BOOTCMD:raspberrypi0-wifi = "bootz" + +OSTREE_KERNEL_ARGS:sota:append:rpi = " plymouth.ignore-udev " diff --git a/recipes-core/plymouth/plymouth_%.bbappend b/recipes-core/plymouth/plymouth_%.bbappend index adb84e3c..47c51efd 100644 --- a/recipes-core/plymouth/plymouth_%.bbappend +++ b/recipes-core/plymouth/plymouth_%.bbappend @@ -25,4 +25,9 @@ do_install:append () { fi install -m 0644 ${WORKDIR}/spinner.plymouth ${D}${datadir}/plymouth/themes/spinner/spinner.plymouth + + # remove the renderers/drm.so if we do not support drm + if [ "${MACHINE}" = "raspberrypi0-wifi" ]; then + rm -f ${D}${libdir}/plymouth/renderers/drm.so + fi } From c5935783c9f3d1d391a569f212cdf9aae7b2208f Mon Sep 17 00:00:00 2001 From: Leonardo Graboski Veiga Date: Wed, 17 Apr 2024 08:47:40 -0300 Subject: [PATCH 153/163] xenomai: add Xenomai 3 in addition to Xenomai 4 On the kernel, Xenomai 3 and 4 use the same base patch set, named "Dovetail" since the kernel 5.10 and newer. The difference is the co-kernel: Xenomai 3 uses Cobalt, and Xenomai 4 uses EVL. Due to this difference, this commit split the current implementation in two, so users can choose which version of the framework to use. The kernel is built as recommended on https://v3.xenomai.org/installation/ and the installation is tested on a Seeed Studio Odyssey X86J4125 v2 SBC using the official Xenomai 3 tools packaged in a container. Test instructions are available on https://github.com/leograba/xenomai-torizon-tests Signed-off-by: Leonardo Graboski Veiga --- conf/distro/torizon-xenomai.conf | 11 -- conf/distro/torizon-xenomai3.conf | 11 ++ conf/distro/torizon-xenomai4.conf | 11 ++ conf/machine/include/intel-corei7-64.inc | 17 ++- .../files/{xenomai.cfg => xenomai-common.cfg} | 41 +----- recipes-kernel/linux/files/xenomai3.cfg | 117 ++++++++++++++++++ recipes-kernel/linux/files/xenomai4.cfg | 39 ++++++ .../linux/linux-xenomai-3-dovetail.inc | 30 +++++ recipes-kernel/linux/linux-xenomai-3_5.10.bb | 32 +++++ ...ux-xenomai.inc => linux-xenomai-4-evl.inc} | 3 +- ...enomai_5.10.bb => linux-xenomai-4_5.10.bb} | 8 +- 11 files changed, 259 insertions(+), 61 deletions(-) delete mode 100644 conf/distro/torizon-xenomai.conf create mode 100644 conf/distro/torizon-xenomai3.conf create mode 100644 conf/distro/torizon-xenomai4.conf rename recipes-kernel/linux/files/{xenomai.cfg => xenomai-common.cfg} (54%) create mode 100644 recipes-kernel/linux/files/xenomai3.cfg create mode 100644 recipes-kernel/linux/files/xenomai4.cfg create mode 100644 recipes-kernel/linux/linux-xenomai-3-dovetail.inc create mode 100644 recipes-kernel/linux/linux-xenomai-3_5.10.bb rename recipes-kernel/linux/{linux-xenomai.inc => linux-xenomai-4-evl.inc} (92%) rename recipes-kernel/linux/{linux-xenomai_5.10.bb => linux-xenomai-4_5.10.bb} (80%) diff --git a/conf/distro/torizon-xenomai.conf b/conf/distro/torizon-xenomai.conf deleted file mode 100644 index e2238039..00000000 --- a/conf/distro/torizon-xenomai.conf +++ /dev/null @@ -1,11 +0,0 @@ -require conf/distro/torizon.conf - -DISTRO = "torizon-xenomai" -DISTRO_NAME = "TorizonCore with Xenomai" - -DISTRO_FLAVOUR = " (XENOMAI)" -DISTRO_FLAVOUR:experimental = " (XENOMAI EXPERIMENTAL)" - -DISTROOVERRIDES .= ":xenomai" - -IMAGE_BASENAME_SUFFIX = "-xenomai" diff --git a/conf/distro/torizon-xenomai3.conf b/conf/distro/torizon-xenomai3.conf new file mode 100644 index 00000000..84381dce --- /dev/null +++ b/conf/distro/torizon-xenomai3.conf @@ -0,0 +1,11 @@ +require conf/distro/torizon.conf + +DISTRO = "torizon-xenomai3" +DISTRO_NAME = "TorizonCore with Xenomai 3" + +DISTRO_FLAVOUR = " (XENOMAI3)" +DISTRO_FLAVOUR:experimental = " (XENOMAI3 EXPERIMENTAL)" + +DISTROOVERRIDES .= ":xenomai3" + +IMAGE_BASENAME_SUFFIX = "-xenomai3" diff --git a/conf/distro/torizon-xenomai4.conf b/conf/distro/torizon-xenomai4.conf new file mode 100644 index 00000000..5342fe8d --- /dev/null +++ b/conf/distro/torizon-xenomai4.conf @@ -0,0 +1,11 @@ +require conf/distro/torizon.conf + +DISTRO = "torizon-xenomai4" +DISTRO_NAME = "TorizonCore with Xenomai 4" + +DISTRO_FLAVOUR = " (XENOMAI4)" +DISTRO_FLAVOUR:experimental = " (XENOMAI4 EXPERIMENTAL)" + +DISTROOVERRIDES .= ":xenomai4" + +IMAGE_BASENAME_SUFFIX = "-xenomai4" diff --git a/conf/machine/include/intel-corei7-64.inc b/conf/machine/include/intel-corei7-64.inc index 23387462..62d1b524 100644 --- a/conf/machine/include/intel-corei7-64.inc +++ b/conf/machine/include/intel-corei7-64.inc @@ -5,10 +5,13 @@ WKS_FILE_DEPENDS:remove = "tezi-metadata virtual/dtb" CORE_IMAGE_BASE_INSTALL:append = "resize-helper docker-binfmt" OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64 = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:10 " -OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64:xenomai = "console=ttyS0,115200 root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash \ - fbcon=map:10 audit=0 hpet=disable clocksource=tsc tsc=reliable intel_pstate=disable intel_idle.max_cstate=0 intel.max_cstate=0 processor.max_cstate=0 processor_idle.max_cstate=0 \ + +XENOMAI_KERNEL_ARGS = "audit=0 hpet=disable clocksource=tsc tsc=reliable intel_pstate=disable intel_idle.max_cstate=0 intel.max_cstate=0 processor.max_cstate=0 processor_idle.max_cstate=0 \ rcupdate.rcu_cpu_stall_suppress=1 mce=off nmi_watchdog=0 nosoftlockup noht numa_balancing=disable hugepages=1024 rcu_nocb_poll=1024 irqaffinity=0 isolcpus=1,3 rcu_nocbs=1,3 nohz_full=1,3 \ i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0 " +OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64:xenomai3 = " ${XENOMAI_KERNEL_ARGS} " +OSTREE_KERNEL_ARGS:sota:append:intel-corei7-64:xenomai4 = " ${XENOMAI_KERNEL_ARGS} " + OSTREE_BOOTLOADER:intel-corei7-64 = "grub" OSTREE_DEPLOY_DEVICETREE:intel-corei7-64 = "0" EFI_PROVIDER:intel-corei7-64 = "grub-efi" @@ -27,9 +30,13 @@ PREFERRED_PROVIDER_virtual/dtb = "" PREFERRED_PROVIDER_virtual/kernel = "linux-intel" PREFERRED_VERSION_linux-intel = "5.10.%" -PREFERRED_PROVIDER_virtual/kernel:xenomai = "linux-xenomai" -PREFERRED_VERSION_linux-xenomai = "5.10.%" +PREFERRED_PROVIDER_virtual/kernel:xenomai3 = "linux-xenomai-3" +PREFERRED_VERSION_linux-xenomai-3 = "5.10.%" + +PREFERRED_PROVIDER_virtual/kernel:xenomai4 = "linux-xenomai-4" +PREFERRED_VERSION_linux-xenomai-4 = "5.10.%" IMAGE_INSTALL:remove = " minnowboard-efi-startup" LINUX_VERSION_EXTENSION ?= "-torizon-${LINUX_KERNEL_TYPE}" -LINUX_VERSION_EXTENSION:xenomai ?= "-torizon-${LINUX_KERNEL_TYPE}-xenomai" +LINUX_VERSION_EXTENSION:xenomai3 ?= "-torizon-${LINUX_KERNEL_TYPE}-xenomai3" +LINUX_VERSION_EXTENSION:xenomai4 ?= "-torizon-${LINUX_KERNEL_TYPE}-xenomai4" diff --git a/recipes-kernel/linux/files/xenomai.cfg b/recipes-kernel/linux/files/xenomai-common.cfg similarity index 54% rename from recipes-kernel/linux/files/xenomai.cfg rename to recipes-kernel/linux/files/xenomai-common.cfg index 9da73683..1dc46406 100644 --- a/recipes-kernel/linux/files/xenomai.cfg +++ b/recipes-kernel/linux/files/xenomai-common.cfg @@ -28,38 +28,6 @@ CONFIG_RCU_FANOUT_LEAF=16 CONFIG_RCU_NOCB_CPU=y # CONFIG_TASKS_TRACE_RCU_READ_MB is not set -# -# Processor type and features -# -CONFIG_EVL=y -CONFIG_EVL_SCHED_QUOTA=y -CONFIG_EVL_SCHED_TP=y -CONFIG_EVL_SCHED_TP_NR_PART=4 -# CONFIG_EVL_HIGH_PERCPU_CONCURRENCY is not set -CONFIG_EVL_RUNSTATS=y -# CONFIG_EVL_NET is not set - -# -# Fixed sizes and limits -# -CONFIG_EVL_COREMEM_SIZE=2048 -CONFIG_EVL_NR_THREADS=256 -CONFIG_EVL_NR_MONITORS=512 -CONFIG_EVL_NR_CLOCKS=8 -CONFIG_EVL_NR_XBUFS=128 -CONFIG_EVL_NR_PROXIES=64 -CONFIG_EVL_NR_OBSERVABLES=64 -# end of Fixed sizes and limits - -# -# Pre-calibrated latency -# -CONFIG_EVL_LATENCY_USER=0 -CONFIG_EVL_LATENCY_KERNEL=0 -CONFIG_EVL_LATENCY_IRQ=0 -# end of Pre-calibrated latency - -# CONFIG_EVL_DEBUG is not set CONFIG_DOVETAIL=y CONFIG_DOVETAIL_LEGACY_SYSCALL_RANGE=y @@ -77,14 +45,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=n CONFIG_CPU_FREQ_GOV_ONDEMAND=n -# -# Out-of-band device drivers -# -CONFIG_EVL_LATMUS=y -CONFIG_EVL_HECTIC=y -# end of Out-of-band device drivers - CONFIG_DEBUG_IRQ_PIPELINE=y # CONFIG_IRQ_PIPELINE_TORTURE_TEST is not set CONFIG_DEBUG_DOVETAIL=y -CONFIG_RAW_PRINTK=y \ No newline at end of file +CONFIG_RAW_PRINTK=y diff --git a/recipes-kernel/linux/files/xenomai3.cfg b/recipes-kernel/linux/files/xenomai3.cfg new file mode 100644 index 00000000..62f65b48 --- /dev/null +++ b/recipes-kernel/linux/files/xenomai3.cfg @@ -0,0 +1,117 @@ +# +# General architecture-dependent options +# +CONFIG_ARCH_WANT_IRQS_OFF_ACTIVATE_MM=y +# end of General architecture-dependent options + +CONFIG_XENOMAI=y +CONFIG_XENO_ARCH_FPU=y +CONFIG_XENO_ARCH_SYS3264=y + +# +# Core features +# +# CONFIG_XENO_OPT_SCHED_CLASSES is not set +CONFIG_XENO_OPT_STATS=y +# CONFIG_XENO_OPT_SHIRQ is not set +CONFIG_XENO_OPT_RR_QUANTUM=1000 +CONFIG_XENO_OPT_AUTOTUNE=y +# CONFIG_XENO_OPT_SCALABLE_SCHED is not set +# CONFIG_XENO_OPT_TIMER_LIST is not set +CONFIG_XENO_OPT_TIMER_RBTREE=y +CONFIG_XENO_OPT_VFILE=y +# end of Core features + +# +# Sizes and static limits +# +CONFIG_XENO_OPT_REGISTRY_NRSLOTS=512 +CONFIG_XENO_OPT_SYS_HEAPSZ=4096 +CONFIG_XENO_OPT_PRIVATE_HEAPSZ=256 +CONFIG_XENO_OPT_SHARED_HEAPSZ=256 +CONFIG_XENO_OPT_NRTIMERS=256 +# end of Sizes and static limits + +# +# Latency settings +# +CONFIG_XENO_OPT_TIMING_SCHEDLAT=0 +CONFIG_XENO_OPT_TIMING_KSCHEDLAT=0 +CONFIG_XENO_OPT_TIMING_IRQLAT=0 +# end of Latency settings + +# CONFIG_XENO_OPT_DEBUG is not set + +# +# Drivers +# +CONFIG_XENO_OPT_RTDM_COMPAT_DEVNODE=y +CONFIG_XENO_DRIVERS_AUTOTUNE=y + +# +# Serial drivers +# +# CONFIG_XENO_DRIVERS_16550A is not set +# end of Serial drivers + +# +# Testing drivers +# +CONFIG_XENO_DRIVERS_TIMERBENCH=y +CONFIG_XENO_DRIVERS_SWITCHTEST=y +CONFIG_XENO_DRIVERS_HEAPCHECK=y +# CONFIG_XENO_DRIVERS_RTDMTEST is not set +# end of Testing drivers + +# +# CAN drivers +# +# CONFIG_XENO_DRIVERS_CAN is not set +# end of CAN drivers + +# +# RTnet +# +# CONFIG_XENO_DRIVERS_NET is not set +# end of RTnet + +# +# ANALOGY drivers +# +# CONFIG_XENO_DRIVERS_ANALOGY is not set +# end of ANALOGY drivers + +# +# Real-time IPC drivers +# +# CONFIG_XENO_DRIVERS_RTIPC is not set +# end of Real-time IPC drivers + +# +# UDD support +# +# CONFIG_XENO_DRIVERS_UDD is not set +# end of UDD support + +# +# Real-time GPIO drivers +# +# CONFIG_XENO_DRIVERS_GPIO is not set +# end of Real-time GPIO drivers + +# +# GPIOPWM support +# +# CONFIG_XENO_DRIVERS_GPIOPWM is not set +# end of GPIOPWM support + +# +# Real-time SPI master drivers +# +# end of Real-time SPI master drivers +# end of Drivers + +CONFIG_XENO_VERSION_MAJOR=3 +CONFIG_XENO_VERSION_MINOR=2 +CONFIG_XENO_REVISION_LEVEL=4 +CONFIG_XENO_VERSION_STRING="3.2.4" diff --git a/recipes-kernel/linux/files/xenomai4.cfg b/recipes-kernel/linux/files/xenomai4.cfg new file mode 100644 index 00000000..b3623c75 --- /dev/null +++ b/recipes-kernel/linux/files/xenomai4.cfg @@ -0,0 +1,39 @@ +# +# Processor type and features +# +CONFIG_EVL=y +CONFIG_EVL_SCHED_QUOTA=y +CONFIG_EVL_SCHED_TP=y +CONFIG_EVL_SCHED_TP_NR_PART=4 +# CONFIG_EVL_HIGH_PERCPU_CONCURRENCY is not set +CONFIG_EVL_RUNSTATS=y +# CONFIG_EVL_NET is not set + +# +# Fixed sizes and limits +# +CONFIG_EVL_COREMEM_SIZE=2048 +CONFIG_EVL_NR_THREADS=256 +CONFIG_EVL_NR_MONITORS=512 +CONFIG_EVL_NR_CLOCKS=8 +CONFIG_EVL_NR_XBUFS=128 +CONFIG_EVL_NR_PROXIES=64 +CONFIG_EVL_NR_OBSERVABLES=64 +# end of Fixed sizes and limits + +# +# Pre-calibrated latency +# +CONFIG_EVL_LATENCY_USER=0 +CONFIG_EVL_LATENCY_KERNEL=0 +CONFIG_EVL_LATENCY_IRQ=0 +# end of Pre-calibrated latency + +# CONFIG_EVL_DEBUG is not set + +# +# Out-of-band device drivers +# +CONFIG_EVL_LATMUS=y +CONFIG_EVL_HECTIC=y +# end of Out-of-band device drivers diff --git a/recipes-kernel/linux/linux-xenomai-3-dovetail.inc b/recipes-kernel/linux/linux-xenomai-3-dovetail.inc new file mode 100644 index 00000000..a96e28ca --- /dev/null +++ b/recipes-kernel/linux/linux-xenomai-3-dovetail.inc @@ -0,0 +1,30 @@ +# from meta-intel +require recipes-kernel/linux/linux-yocto.inc +require recipes-kernel/linux/meta-intel-compat-kernel.inc + +# from common-torizon +require common.inc + +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +KERNEL_CONFIG_URI ?= "git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=${KMETA_BRANCH};destsuffix=${KMETA}" + +SRC_URI = " \ + git://source.denx.de/Xenomai/linux-dovetail.git;protocol=https;branch=${KBRANCH};name=machine; \ + git://source.denx.de/Xenomai/xenomai.git;protocol=https;branch=${XENBRANCH};name=xenomai;destsuffix=xenomai; \ + ${KERNEL_CONFIG_URI} \ + file://xenomai-common.cfg \ + file://xenomai3.cfg \ + " + +LINUX_VERSION_EXTENSION ??= "-intel-pk-${LINUX_KERNEL_TYPE}" + +PV = "${LINUX_VERSION}+git${SRCPV}" + +KMETA = "kernel-meta" +KCONF_BSP_AUDIT_LEVEL = "2" + +COMPATIBLE_MACHINE ?= "(intel-corei7-64|intel-core2-32)" + +KERNEL_FEATURES:append = " ${KERNEL_EXTRA_FEATURES}" +KERNEL_FEATURES:append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}" diff --git a/recipes-kernel/linux/linux-xenomai-3_5.10.bb b/recipes-kernel/linux/linux-xenomai-3_5.10.bb new file mode 100644 index 00000000..b9d2c103 --- /dev/null +++ b/recipes-kernel/linux/linux-xenomai-3_5.10.bb @@ -0,0 +1,32 @@ +require linux-xenomai-3-dovetail.inc + +SUMMARY = "Linux kernel for Xenomai 3 with Dovetail and the Cobalt core patches" + +# Skip processing of this recipe if it is not explicitly specified as the +# PREFERRED_PROVIDER for virtual/kernel. This avoids errors when trying +# to build multiple virtual/kernel providers, e.g. as dependency of +# core-image-rt-sdk, core-image-rt. +python () { + if d.getVar("KERNEL_PACKAGE_NAME", True) == "kernel" and d.getVar("PREFERRED_PROVIDER_virtual/kernel") != "linux-xenomai-3": + raise bb.parse.SkipPackage("Set PREFERRED_PROVIDER_virtual/kernel to linux-xenomai-3 to enable it") +} + +KBRANCH = "v5.10.y-dovetail" +KMETA_BRANCH = "yocto-5.10" +XENBRANCH = "stable/v3.2.x" + +LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" + +DEPENDS += "elfutils-native openssl-native util-linux-native" + +LINUX_VERSION ?= "5.10.209" +SRCREV_machine ?= "e2e46a0e4e4bf82d418f589a23a8d04df996b480" +SRCREV_meta ?= "603507f09e4a22a650e37fb9dcfbcb69ceb36841" +SRCREV_xenomai ?= "704ea7dab109c6ced8dee3a8377fbf72a977a0fc" + +# Functionality flags +KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/security/security.scc" + +do_patch:append () { + ${WORKDIR}/xenomai/scripts/prepare-kernel.sh --linux=${STAGING_KERNEL_DIR} --arch=x86 +} diff --git a/recipes-kernel/linux/linux-xenomai.inc b/recipes-kernel/linux/linux-xenomai-4-evl.inc similarity index 92% rename from recipes-kernel/linux/linux-xenomai.inc rename to recipes-kernel/linux/linux-xenomai-4-evl.inc index 8f4ec2eb..f58cff47 100644 --- a/recipes-kernel/linux/linux-xenomai.inc +++ b/recipes-kernel/linux/linux-xenomai-4-evl.inc @@ -12,7 +12,8 @@ KERNEL_CONFIG_URI ?= "git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;n SRC_URI = " \ git://source.denx.de/Xenomai/xenomai4/linux-evl.git;protocol=https;branch=${KBRANCH};name=machine; \ ${KERNEL_CONFIG_URI} \ - file://xenomai.cfg \ + file://xenomai-common.cfg \ + file://xenomai4.cfg \ " LINUX_VERSION_EXTENSION ??= "-intel-pk-${LINUX_KERNEL_TYPE}" diff --git a/recipes-kernel/linux/linux-xenomai_5.10.bb b/recipes-kernel/linux/linux-xenomai-4_5.10.bb similarity index 80% rename from recipes-kernel/linux/linux-xenomai_5.10.bb rename to recipes-kernel/linux/linux-xenomai-4_5.10.bb index d08fec82..1230634a 100644 --- a/recipes-kernel/linux/linux-xenomai_5.10.bb +++ b/recipes-kernel/linux/linux-xenomai-4_5.10.bb @@ -1,14 +1,14 @@ -require linux-xenomai.inc +require linux-xenomai-4-evl.inc -SUMMARY = "Linux kernel with Xenomai patches" +SUMMARY = "Linux kernel with Xenomai 4 patches and the EVL core" # Skip processing of this recipe if it is not explicitly specified as the # PREFERRED_PROVIDER for virtual/kernel. This avoids errors when trying # to build multiple virtual/kernel providers, e.g. as dependency of # core-image-rt-sdk, core-image-rt. python () { - if d.getVar("KERNEL_PACKAGE_NAME", True) == "kernel" and d.getVar("PREFERRED_PROVIDER_virtual/kernel") != "linux-xenomai": - raise bb.parse.SkipPackage("Set PREFERRED_PROVIDER_virtual/kernel to linux-xenomai to enable it") + if d.getVar("KERNEL_PACKAGE_NAME", True) == "kernel" and d.getVar("PREFERRED_PROVIDER_virtual/kernel") != "linux-xenomai-4": + raise bb.parse.SkipPackage("Set PREFERRED_PROVIDER_virtual/kernel to linux-xenomai-4 to enable it") } KBRANCH = "v5.10.y-evl-rebase" From 7e847a6e9351f04c95af925e8b8887e1d8a69525 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Thu, 16 May 2024 19:44:50 -0400 Subject: [PATCH 154/163] Cleanup kernel modules for verdin-am62. The ti-soc override is used for some changes needed on verdin-am62. But those changes do not work for beagleplay. Change the override to specifically use verdin-am62. Signed-off-by: Drew Moseley --- .../initramfs-framework/initramfs-framework_1.0.bbappend | 7 +++---- recipes-core/systemd/systemd-conf_%.bbappend | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend b/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend index c0f54e6b..cebe8fa8 100644 --- a/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend +++ b/recipes-core/initramfs-framework/initramfs-framework_1.0.bbappend @@ -86,8 +86,8 @@ do_install:append:mx8-nxp-bsp() { install -m 0755 ${WORKDIR}/50-imx8-graphics.conf ${D}/etc/modules-load.d/50-imx8-graphics.conf } -SRC_URI:append:ti-soc = " file://50-am62-graphics.conf" -RDEPENDS:initramfs-module-kmod:append:ti-soc = " \ +SRC_URI:append:verdin-am62 = " file://50-am62-graphics.conf" +RDEPENDS:initramfs-module-kmod:append:verdin-am62 = " \ kernel-module-pwm-tiehrpwm \ kernel-module-fb-sys-fops \ kernel-module-sysimgblt \ @@ -101,8 +101,7 @@ RDEPENDS:initramfs-module-kmod:append:ti-soc = " \ kernel-module-ti-sn65dsi83 \ kernel-module-lontium-lt8912b \ " - -do_install:append:ti-soc() { +do_install:append:verdin-am62() { install -d ${D}/etc/modules-load.d/ install -m 0755 ${WORKDIR}/50-am62-graphics.conf ${D}/etc/modules-load.d/50-am62-graphics.conf } diff --git a/recipes-core/systemd/systemd-conf_%.bbappend b/recipes-core/systemd/systemd-conf_%.bbappend index 6d098962..25362d1f 100644 --- a/recipes-core/systemd/systemd-conf_%.bbappend +++ b/recipes-core/systemd/systemd-conf_%.bbappend @@ -20,6 +20,6 @@ do_install:append() { sed -i "s/@@MACHINE@@/${MACHINE}/g" ${D}${systemd_unitdir}/system.conf.d/10-${BPN}.conf } -do_install:append:ti-soc() { +do_install:append:verdin-am62() { sed -i '$ d' ${D}${systemd_unitdir}/system.conf.d/10-${BPN}.conf } From a8bfe70ce1f693b774508345ad6367d3873380ab Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Mon, 20 May 2024 17:43:27 -0400 Subject: [PATCH 155/163] genericx86-64: Add kernel cfg fragment. Signed-off-by: Drew Moseley --- recipes-kernel/linux/files/genericx86-64.cfg | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 recipes-kernel/linux/files/genericx86-64.cfg diff --git a/recipes-kernel/linux/files/genericx86-64.cfg b/recipes-kernel/linux/files/genericx86-64.cfg new file mode 100644 index 00000000..72ad6e77 --- /dev/null +++ b/recipes-kernel/linux/files/genericx86-64.cfg @@ -0,0 +1,43 @@ +# enable qemuarm drm +CONFIG_DRM=y +CONFIG_DRM_PANEL_SIMPLE=y +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y +CONFIG_DRM_CIRRUS_QEMU=y +CONFIG_DRM_VBOXVIDEO=y +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_DDC=m +CONFIG_FB_BOOT_VESA_SUPPORT=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_HECUBA=m +CONFIG_FB_SVGALIB=m +CONFIG_FB_BACKLIGHT=m +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_CIRRUS=y +CONFIG_FB_ARC=y +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=y +CONFIG_FB_UVESA=y +CONFIG_FB_VESA=y +CONFIG_FB_SIMPLE=y +CONFIG_DRM_VMWGFX=m +CONFIG_DRM_VMWGFX_FBCON=y +CONFIG_USB_SERIAL=y +CONFIG_USB_SERIAL_CONSOLE=y +CONFIG_USB_SERIAL_CP210X=y +CONFIG_USB_SERIAL_WWAN=m +CONFIG_USB_SERIAL_OPTION=m From dc909601bc580f6ec9d241de1cbbdbf0388200e9 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Thu, 16 May 2024 14:02:34 -0400 Subject: [PATCH 156/163] Setup dynamic layers for intel BSPs. Signed-off-by: Drew Moseley --- conf/layer.conf | 4 ++++ .../intel/recipes-kernel}/linux/files/intel-corei7-64.cfg | 0 .../intel/recipes-kernel}/linux/files/xenomai-common.cfg | 0 .../intel/recipes-kernel}/linux/files/xenomai3.cfg | 0 .../intel/recipes-kernel}/linux/files/xenomai4.cfg | 0 .../intel/recipes-kernel}/linux/linux-intel%.bbappend | 2 +- .../intel/recipes-kernel}/linux/linux-xenomai-3-dovetail.inc | 2 +- .../intel/recipes-kernel}/linux/linux-xenomai-3_5.10.bb | 0 .../intel/recipes-kernel}/linux/linux-xenomai-4-evl.inc | 2 +- .../intel/recipes-kernel}/linux/linux-xenomai-4_5.10.bb | 0 10 files changed, 7 insertions(+), 3 deletions(-) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/files/intel-corei7-64.cfg (100%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/files/xenomai-common.cfg (100%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/files/xenomai3.cfg (100%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/files/xenomai4.cfg (100%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/linux-intel%.bbappend (74%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/linux-xenomai-3-dovetail.inc (96%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/linux-xenomai-3_5.10.bb (100%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/linux-xenomai-4-evl.inc (95%) rename {recipes-kernel => dynamic-layers/intel/recipes-kernel}/linux/linux-xenomai-4_5.10.bb (100%) diff --git a/conf/layer.conf b/conf/layer.conf index b1c8bb96..70509f05 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -10,3 +10,7 @@ BBFILE_PRIORITY_meta-common-torizon = "90" LAYERDEPENDS_meta-common-torizon = "freescale-layer toradex-bsp-common-layer meta-toradex-distro sota meta-toradex-security" LAYERSERIES_COMPAT_meta-common-torizon = "kirkstone" + +BBFILES_DYNAMIC += " \ + intel:${LAYERDIR}/dynamic-layers/intel/*/*/*.bbappend \ +" \ No newline at end of file diff --git a/recipes-kernel/linux/files/intel-corei7-64.cfg b/dynamic-layers/intel/recipes-kernel/linux/files/intel-corei7-64.cfg similarity index 100% rename from recipes-kernel/linux/files/intel-corei7-64.cfg rename to dynamic-layers/intel/recipes-kernel/linux/files/intel-corei7-64.cfg diff --git a/recipes-kernel/linux/files/xenomai-common.cfg b/dynamic-layers/intel/recipes-kernel/linux/files/xenomai-common.cfg similarity index 100% rename from recipes-kernel/linux/files/xenomai-common.cfg rename to dynamic-layers/intel/recipes-kernel/linux/files/xenomai-common.cfg diff --git a/recipes-kernel/linux/files/xenomai3.cfg b/dynamic-layers/intel/recipes-kernel/linux/files/xenomai3.cfg similarity index 100% rename from recipes-kernel/linux/files/xenomai3.cfg rename to dynamic-layers/intel/recipes-kernel/linux/files/xenomai3.cfg diff --git a/recipes-kernel/linux/files/xenomai4.cfg b/dynamic-layers/intel/recipes-kernel/linux/files/xenomai4.cfg similarity index 100% rename from recipes-kernel/linux/files/xenomai4.cfg rename to dynamic-layers/intel/recipes-kernel/linux/files/xenomai4.cfg diff --git a/recipes-kernel/linux/linux-intel%.bbappend b/dynamic-layers/intel/recipes-kernel/linux/linux-intel%.bbappend similarity index 74% rename from recipes-kernel/linux/linux-intel%.bbappend rename to dynamic-layers/intel/recipes-kernel/linux/linux-intel%.bbappend index b062f8bc..97cabdca 100644 --- a/recipes-kernel/linux/linux-intel%.bbappend +++ b/dynamic-layers/intel/recipes-kernel/linux/linux-intel%.bbappend @@ -1,5 +1,5 @@ -require common.inc +require recipes-kernel/linux/common.inc FILESEXTRAPATHS:prepend := "${THISDIR}/files:" diff --git a/recipes-kernel/linux/linux-xenomai-3-dovetail.inc b/dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-3-dovetail.inc similarity index 96% rename from recipes-kernel/linux/linux-xenomai-3-dovetail.inc rename to dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-3-dovetail.inc index a96e28ca..28900d9b 100644 --- a/recipes-kernel/linux/linux-xenomai-3-dovetail.inc +++ b/dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-3-dovetail.inc @@ -3,7 +3,7 @@ require recipes-kernel/linux/linux-yocto.inc require recipes-kernel/linux/meta-intel-compat-kernel.inc # from common-torizon -require common.inc +require recipes-kernel/linux/common.inc FILESEXTRAPATHS:prepend := "${THISDIR}/files:" diff --git a/recipes-kernel/linux/linux-xenomai-3_5.10.bb b/dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-3_5.10.bb similarity index 100% rename from recipes-kernel/linux/linux-xenomai-3_5.10.bb rename to dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-3_5.10.bb diff --git a/recipes-kernel/linux/linux-xenomai-4-evl.inc b/dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-4-evl.inc similarity index 95% rename from recipes-kernel/linux/linux-xenomai-4-evl.inc rename to dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-4-evl.inc index f58cff47..373d092f 100644 --- a/recipes-kernel/linux/linux-xenomai-4-evl.inc +++ b/dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-4-evl.inc @@ -3,7 +3,7 @@ require recipes-kernel/linux/linux-yocto.inc require recipes-kernel/linux/meta-intel-compat-kernel.inc # from common-torizon -require common.inc +require recipes-kernel/linux/common.inc FILESEXTRAPATHS:prepend := "${THISDIR}/files:" diff --git a/recipes-kernel/linux/linux-xenomai-4_5.10.bb b/dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-4_5.10.bb similarity index 100% rename from recipes-kernel/linux/linux-xenomai-4_5.10.bb rename to dynamic-layers/intel/recipes-kernel/linux/linux-xenomai-4_5.10.bb From e1d61a773c64942758382665cbfb6925e5c47112 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Thu, 16 May 2024 16:31:25 -0400 Subject: [PATCH 157/163] Setup dynamic-layers for riscv BSPs. Signed-off-by: Drew Moseley --- conf/layer.conf | 1 + .../riscv/recipes-kernel/linux/linux-nezha-%.bbappend | 2 ++ recipes-kernel/linux/linux-nezha-%.bbappend | 2 -- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 dynamic-layers/riscv/recipes-kernel/linux/linux-nezha-%.bbappend delete mode 100644 recipes-kernel/linux/linux-nezha-%.bbappend diff --git a/conf/layer.conf b/conf/layer.conf index 70509f05..a8fcff3d 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -13,4 +13,5 @@ LAYERSERIES_COMPAT_meta-common-torizon = "kirkstone" BBFILES_DYNAMIC += " \ intel:${LAYERDIR}/dynamic-layers/intel/*/*/*.bbappend \ + riscv-layer:${LAYERDIR}/dynamic-layers/riscv/*/*/*.bbappend \ " \ No newline at end of file diff --git a/dynamic-layers/riscv/recipes-kernel/linux/linux-nezha-%.bbappend b/dynamic-layers/riscv/recipes-kernel/linux/linux-nezha-%.bbappend new file mode 100644 index 00000000..8549c62c --- /dev/null +++ b/dynamic-layers/riscv/recipes-kernel/linux/linux-nezha-%.bbappend @@ -0,0 +1,2 @@ + +require recipes-kernel/linux/common.inc diff --git a/recipes-kernel/linux/linux-nezha-%.bbappend b/recipes-kernel/linux/linux-nezha-%.bbappend deleted file mode 100644 index 57ce0433..00000000 --- a/recipes-kernel/linux/linux-nezha-%.bbappend +++ /dev/null @@ -1,2 +0,0 @@ - -require common.inc From 194cad3e6e8a271d26489f6c61c6deb278a567bf Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Thu, 16 May 2024 17:11:21 -0400 Subject: [PATCH 158/163] Setup dynamic-layers for rpi BSPs Signed-off-by: Drew Moseley --- conf/layer.conf | 3 ++- .../recipes-kernel}/linux/linux-raspberrypi_5.15.bbappend | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) rename {recipes-kernel => dynamic-layers/raspberrypi/recipes-kernel}/linux/linux-raspberrypi_5.15.bbappend (91%) diff --git a/conf/layer.conf b/conf/layer.conf index a8fcff3d..c6685c81 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -14,4 +14,5 @@ LAYERSERIES_COMPAT_meta-common-torizon = "kirkstone" BBFILES_DYNAMIC += " \ intel:${LAYERDIR}/dynamic-layers/intel/*/*/*.bbappend \ riscv-layer:${LAYERDIR}/dynamic-layers/riscv/*/*/*.bbappend \ -" \ No newline at end of file + raspberrypi:${LAYERDIR}/dynamic-layers/raspberrypi/*/*/*.bbappend \ +" diff --git a/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend b/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend similarity index 91% rename from recipes-kernel/linux/linux-raspberrypi_5.15.bbappend rename to dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend index 53237e9c..d9f094e7 100644 --- a/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend +++ b/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.15.bbappend @@ -11,4 +11,4 @@ SRC_URI = " \ file://android-drivers.cfg \ " -require common.inc +require recipes-kernel/linux/common.inc From 0aec98bca469c224d1d5275638f932b8ae824b61 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Thu, 16 May 2024 20:06:31 -0400 Subject: [PATCH 159/163] Setup dynamic-layers for meta-ti BSPs Signed-off-by: Drew Moseley --- conf/layer.conf | 1 + dynamic-layers/ti/recipes-kernel/linux/linux-bb.org_%.bbappend | 2 ++ recipes-kernel/linux/linux-bb.org_%.bbappend | 2 -- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 dynamic-layers/ti/recipes-kernel/linux/linux-bb.org_%.bbappend delete mode 100644 recipes-kernel/linux/linux-bb.org_%.bbappend diff --git a/conf/layer.conf b/conf/layer.conf index c6685c81..95f535b3 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -15,4 +15,5 @@ BBFILES_DYNAMIC += " \ intel:${LAYERDIR}/dynamic-layers/intel/*/*/*.bbappend \ riscv-layer:${LAYERDIR}/dynamic-layers/riscv/*/*/*.bbappend \ raspberrypi:${LAYERDIR}/dynamic-layers/raspberrypi/*/*/*.bbappend \ + meta-ti-bsp:${LAYERDIR}/dynamic-layers/ti/*/*/*.bbappend \ " diff --git a/dynamic-layers/ti/recipes-kernel/linux/linux-bb.org_%.bbappend b/dynamic-layers/ti/recipes-kernel/linux/linux-bb.org_%.bbappend new file mode 100644 index 00000000..8549c62c --- /dev/null +++ b/dynamic-layers/ti/recipes-kernel/linux/linux-bb.org_%.bbappend @@ -0,0 +1,2 @@ + +require recipes-kernel/linux/common.inc diff --git a/recipes-kernel/linux/linux-bb.org_%.bbappend b/recipes-kernel/linux/linux-bb.org_%.bbappend deleted file mode 100644 index 57ce0433..00000000 --- a/recipes-kernel/linux/linux-bb.org_%.bbappend +++ /dev/null @@ -1,2 +0,0 @@ - -require common.inc From 9f220142208d2f09932a0805de248095a0387459 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Fri, 17 May 2024 13:59:06 -0400 Subject: [PATCH 160/163] Remove toradex machines from common torizon. Signed-off-by: Drew Moseley --- conf/layer.conf | 2 +- conf/machine/include/apalis-imx8.inc | 4 ---- conf/machine/include/verdin-imx8mm.inc | 1 - conf/machine/include/verdin-imx8mp.inc | 1 - conf/template/bblayers.conf | 1 - .../u-boot-ota/verdin-imx8mp/bootcommand.cfg | 2 -- recipes-kernel/linux/files/apalis-imx8.cfg | 14 -------------- recipes-kernel/linux/files/verdin-imx8mm.cfg | 14 -------------- recipes-kernel/linux/files/verdin-imx8mp.cfg | 14 -------------- 9 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 conf/machine/include/apalis-imx8.inc delete mode 100644 conf/machine/include/verdin-imx8mm.inc delete mode 100644 conf/machine/include/verdin-imx8mp.inc delete mode 100644 recipes-bsp/u-boot/u-boot-ota/verdin-imx8mp/bootcommand.cfg delete mode 100644 recipes-kernel/linux/files/apalis-imx8.cfg delete mode 100644 recipes-kernel/linux/files/verdin-imx8mm.cfg delete mode 100644 recipes-kernel/linux/files/verdin-imx8mp.cfg diff --git a/conf/layer.conf b/conf/layer.conf index 95f535b3..34a8b807 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -8,7 +8,7 @@ BBFILE_COLLECTIONS += "meta-common-torizon" BBFILE_PATTERN_meta-common-torizon := "^${LAYERDIR}/" BBFILE_PRIORITY_meta-common-torizon = "90" -LAYERDEPENDS_meta-common-torizon = "freescale-layer toradex-bsp-common-layer meta-toradex-distro sota meta-toradex-security" +LAYERDEPENDS_meta-common-torizon = "toradex-bsp-common-layer meta-toradex-distro sota meta-toradex-security" LAYERSERIES_COMPAT_meta-common-torizon = "kirkstone" BBFILES_DYNAMIC += " \ diff --git a/conf/machine/include/apalis-imx8.inc b/conf/machine/include/apalis-imx8.inc deleted file mode 100644 index f745c04d..00000000 --- a/conf/machine/include/apalis-imx8.inc +++ /dev/null @@ -1,4 +0,0 @@ -# to add custom configs - -# let's try to not use their old and jurassic RS232 -OSTREE_KERNEL_ARGS_EXTRA:append = " console=ttyLP0,115200n8 " diff --git a/conf/machine/include/verdin-imx8mm.inc b/conf/machine/include/verdin-imx8mm.inc deleted file mode 100644 index 4088b587..00000000 --- a/conf/machine/include/verdin-imx8mm.inc +++ /dev/null @@ -1 +0,0 @@ -# to add custom configs diff --git a/conf/machine/include/verdin-imx8mp.inc b/conf/machine/include/verdin-imx8mp.inc deleted file mode 100644 index 4088b587..00000000 --- a/conf/machine/include/verdin-imx8mp.inc +++ /dev/null @@ -1 +0,0 @@ -# to add custom configs diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index 44b424ec..4e0ad694 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -27,7 +27,6 @@ BSPLAYERS ?= " \ ${OEROOT}/layers/meta-yocto/meta-yocto-bsp \ ${OEROOT}/layers/meta-yocto/meta-poky \ ${OEROOT}/layers/meta-security \ - ${OEROOT}/layers/meta-toradex-ti \ ${OEROOT}/layers/meta-arm/meta-arm-toolchain \ ${OEROOT}/layers/meta-arm/meta-arm \ ${OEROOT}/layers/meta-ti/meta-ti-bsp \ diff --git a/recipes-bsp/u-boot/u-boot-ota/verdin-imx8mp/bootcommand.cfg b/recipes-bsp/u-boot/u-boot-ota/verdin-imx8mp/bootcommand.cfg deleted file mode 100644 index 95ae2727..00000000 --- a/recipes-bsp/u-boot/u-boot-ota/verdin-imx8mp/bootcommand.cfg +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_USE_BOOTCOMMAND=y -CONFIG_BOOTCOMMAND="run bootcmd_mmc2" diff --git a/recipes-kernel/linux/files/apalis-imx8.cfg b/recipes-kernel/linux/files/apalis-imx8.cfg deleted file mode 100644 index 78c2834e..00000000 --- a/recipes-kernel/linux/files/apalis-imx8.cfg +++ /dev/null @@ -1,14 +0,0 @@ -# splash screen -CONFIG_DRM_DISPLAY_CONNECTOR=y -CONFIG_DRM_IMX_CDNS_MHDP=m -CONFIG_DRM_SEC_MIPI_DSIM=y -CONFIG_DRM_IMX_SEC_DSIM=y -CONFIG_SND_SOC_IMX_HDMI=y -CONFIG_SND_SOC_IMX_SGTL5000=y -CONFIG_DRM_CDNS_MHDP=y -CONFIG_DRM_CDNS_HDMI=y -CONFIG_DRM_CDNS_DP=y -CONFIG_DRM_CDNS_AUDIO=y -CONFIG_DRM_CDNS_HDCP=y -CONFIG_DRM_CDNS_HDMI_CEC=y -# end of the kernel hack diff --git a/recipes-kernel/linux/files/verdin-imx8mm.cfg b/recipes-kernel/linux/files/verdin-imx8mm.cfg deleted file mode 100644 index c9f9b1c6..00000000 --- a/recipes-kernel/linux/files/verdin-imx8mm.cfg +++ /dev/null @@ -1,14 +0,0 @@ -# splash screen -CONFIG_DRM=y -CONFIG_DRM_DISPLAY_CONNECTOR=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_REGMAP_I2C=y -CONFIG_VIDEOMODE_HELPERS=y -CONFIG_DRM_LONTIUM_LT8912B=y -CONFIG_DRM_SEC_MIPI_DSIM=y -CONFIG_DRM_IMX_SEC_DSIM=y -CONFIG_DRM_TI_SN65DSI83=y -# end of the kernel hack diff --git a/recipes-kernel/linux/files/verdin-imx8mp.cfg b/recipes-kernel/linux/files/verdin-imx8mp.cfg deleted file mode 100644 index c9f9b1c6..00000000 --- a/recipes-kernel/linux/files/verdin-imx8mp.cfg +++ /dev/null @@ -1,14 +0,0 @@ -# splash screen -CONFIG_DRM=y -CONFIG_DRM_DISPLAY_CONNECTOR=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_REGMAP_I2C=y -CONFIG_VIDEOMODE_HELPERS=y -CONFIG_DRM_LONTIUM_LT8912B=y -CONFIG_DRM_SEC_MIPI_DSIM=y -CONFIG_DRM_IMX_SEC_DSIM=y -CONFIG_DRM_TI_SN65DSI83=y -# end of the kernel hack From d4403dcbfbc489d2edffeef78329d72153d86c82 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Sat, 18 May 2024 15:49:57 -0400 Subject: [PATCH 161/163] Remove meta-toradex-nxp and friends Signed-off-by: Drew Moseley --- conf/template/bblayers.conf | 3 --- 1 file changed, 3 deletions(-) diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index 4e0ad694..4e3854d9 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -21,9 +21,6 @@ BASELAYERS ?= " \ # These layers hold machine specific content, aka Board Support Packages BSPLAYERS ?= " \ ${OEROOT}/layers/meta-raspberrypi \ - ${OEROOT}/layers/meta-toradex-nxp \ - ${OEROOT}/layers/meta-freescale \ - ${OEROOT}/layers/meta-freescale-3rdparty \ ${OEROOT}/layers/meta-yocto/meta-yocto-bsp \ ${OEROOT}/layers/meta-yocto/meta-poky \ ${OEROOT}/layers/meta-security \ From 1a923bbb7964f2c8672e7663e6c05e1ec8d92fbb Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Sat, 18 May 2024 15:50:34 -0400 Subject: [PATCH 162/163] Make bblayers dynamic Signed-off-by: Drew Moseley --- conf/template/bblayers.conf | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/conf/template/bblayers.conf b/conf/template/bblayers.conf index 4e3854d9..d3f0aae7 100644 --- a/conf/template/bblayers.conf +++ b/conf/template/bblayers.conf @@ -18,19 +18,37 @@ BASELAYERS ?= " \ ${OEROOT}/layers/meta-updater \ " -# These layers hold machine specific content, aka Board Support Packages -BSPLAYERS ?= " \ +# Dynamically included machine layers +RPI_LAYERS = " \ ${OEROOT}/layers/meta-raspberrypi \ - ${OEROOT}/layers/meta-yocto/meta-yocto-bsp \ - ${OEROOT}/layers/meta-yocto/meta-poky \ - ${OEROOT}/layers/meta-security \ +" +BEAGLEPLAY_LAYERS = " \ ${OEROOT}/layers/meta-arm/meta-arm-toolchain \ ${OEROOT}/layers/meta-arm/meta-arm \ ${OEROOT}/layers/meta-ti/meta-ti-bsp \ ${OEROOT}/layers/meta-ti/meta-ti-extras \ - ${OEROOT}/layers/meta-intel \ +" +RISCV_LAYERS = " \ ${OEROOT}/layers/meta-riscv \ " +YOCTOBSP_LAYERS = " \ + ${OEROOT}/layers/meta-yocto/meta-yocto-bsp \ +" +INTEL_LAYERS = " \ + ${OEROOT}/layers/meta-intel \ +" + +# These layers hold machine specific content, aka Board Support Packages +BSPLAYERS ?= " \ + ${@'${RPI_LAYERS}' if '${MACHINE}'.startswith('raspberrypi') else ''} \ + ${@'${BEAGLEPLAY_LAYERS}' if '${MACHINE}' == 'beagleplay' else ''} \ + ${@'${RISCV_LAYERS}' if '${MACHINE}' == 'nezha-allwinner-d1' else ''} \ + ${@'${YOCTOBSP_LAYERS}' if '${MACHINE}' == 'genericx86-64' else ''} \ + ${@'${YOCTOBSP_LAYERS}' if '${MACHINE}' == 'beaglebone-yocto' else ''} \ + ${@'${INTEL_LAYERS}' if '${MACHINE}' == 'intel-corei7-64' else ''} \ + ${OEROOT}/layers/meta-yocto/meta-poky \ + ${OEROOT}/layers/meta-security \ +" # Add your overlay location to EXTRALAYERS # Make sure to have a conf/layers.conf in there From 7a64f6680e9442d8d852a371cb312106b672bca4 Mon Sep 17 00:00:00 2001 From: Drew Moseley Date: Wed, 22 May 2024 11:15:00 -0400 Subject: [PATCH 163/163] common: torizon.inc: Add meta-updater connman to the BBMASK. Signed-off-by: Drew Moseley --- conf/distro/include/torizon.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/distro/include/torizon.inc b/conf/distro/include/torizon.inc index 1dc01621..8cf1d7f3 100644 --- a/conf/distro/include/torizon.inc +++ b/conf/distro/include/torizon.inc @@ -76,6 +76,7 @@ BBMASK += " \ /openembedded-core/meta/recipes-devtools/cargo \ /openembedded-core/meta/recipes-devtools/rust \ /openembedded-core/meta/recipes-connectivity/connman \ + /meta-updater/recipes-connectivity/connman/ \ " # machines where TorizonCore is experimental