* [DistroKit] [PATCH v2 1/4] platform: v8a: firmware-rockchip: Move barebox injects to separate package
2025-05-23 13:58 [DistroKit] [PATCH v2 0/4] platform: v8a: barebox: Untangle firmware inject files Alexander Dahl
@ 2025-05-23 13:58 ` Alexander Dahl
2025-05-23 13:58 ` [DistroKit] [PATCH v2 2/4] platform: v8a: barebox: Remove extra host prog Alexander Dahl
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Alexander Dahl @ 2025-05-23 13:58 UTC (permalink / raw)
To: distrokit; +Cc: Lars Schmidt
This is what 'barebox_firmware' was invented for. Done to avoid
cluttering the firmware-rockchip package with bootloader specific stuff.
Approach inspired by the patch series which introduced that
infrastructure in ptxdist. Same as with firmware-imx package.
Link: https://lore.ptxdist.org/ptxdist/20220129070330.2601433-6-michael.riesch@wolfvision.net/
Signed-off-by: Alexander Dahl <ada@thorsis.com>
---
Notes:
v2:
- reorder, now patch 1/4
v1:
- Link: https://lore.distrokit.org/distrokit/20240425080303.171897-8-ada@thorsis.com/
configs/platform-v8a/platformconfig | 1 +
.../platforms/barebox.rockchip.in | 14 +++++++++++++
.../platforms/firmware-rockchip.in | 5 -----
.../platform-v8a/rules/barebox.rockchip.make | 20 +++++++++++++++++++
.../platform-v8a/rules/firmware-rockchip.make | 10 ----------
5 files changed, 35 insertions(+), 15 deletions(-)
create mode 100644 configs/platform-v8a/platforms/barebox.rockchip.in
diff --git a/configs/platform-v8a/platformconfig b/configs/platform-v8a/platformconfig
index 61295ec..83c3615 100644
--- a/configs/platform-v8a/platformconfig
+++ b/configs/platform-v8a/platformconfig
@@ -185,6 +185,7 @@ PTXCONF_BAREBOX_BUILDSYSTEM_VERSION="${PTXDIST_VCS_VERSION}"
PTXCONF_BAREBOX_MD5="2b84bcf8644373db021c86864f2e5761"
PTXCONF_BAREBOX_CONFIG="barebox.config"
PTXCONF_BAREBOX_FIRMWARE=y
+PTXCONF_BAREBOX_NEEDS_FIRMWARE_ROCKCHIP=y
PTXCONF_BAREBOX_EXTRA_ENV=y
PTXCONF_BAREBOX_EXTRA_ENV_PATH="barebox-common-defaultenv"
# PTXCONF_BAREBOX_BAREBOXENV is not set
diff --git a/configs/platform-v8a/platforms/barebox.rockchip.in b/configs/platform-v8a/platforms/barebox.rockchip.in
new file mode 100644
index 0000000..3291085
--- /dev/null
+++ b/configs/platform-v8a/platforms/barebox.rockchip.in
@@ -0,0 +1,14 @@
+## SECTION=barebox_firmware
+
+config BAREBOX_NEEDS_FIRMWARE_ROCKCHIP
+ bool
+ prompt "barebox needs firmware-rockchip"
+ help
+ Select this if barebox needs the non-free Rockchip firmware blobs.
+
+config BAREBOX_DEPENDENCIES
+ tristate
+ select FIRMWARE_ROCKCHIP if BAREBOX_NEEDS_FIRMWARE_ROCKCHIP
+ select FIRMWARE_ROCKCHIP_RK3568_SDRAM if BAREBOX_NEEDS_FIRMWARE_ROCKCHIP
+ select FIRMWARE_ROCKCHIP_RK356x_BL31 if BAREBOX_NEEDS_FIRMWARE_ROCKCHIP
+ select FIRMWARE_ROCKCHIP_RK356x_BL32 if BAREBOX_NEEDS_FIRMWARE_ROCKCHIP
diff --git a/configs/platform-v8a/platforms/firmware-rockchip.in b/configs/platform-v8a/platforms/firmware-rockchip.in
index 87a1490..aa70241 100644
--- a/configs/platform-v8a/platforms/firmware-rockchip.in
+++ b/configs/platform-v8a/platforms/firmware-rockchip.in
@@ -39,8 +39,3 @@ config FIRMWARE_ROCKCHIP_RK356x_BL32
and the Rockchip RK3568 EVB1 board.
endif
-
-config BAREBOX_DEPENDENCIES
- tristate
- select FIRMWARE_ROCKCHIP
-
diff --git a/configs/platform-v8a/rules/barebox.rockchip.make b/configs/platform-v8a/rules/barebox.rockchip.make
index 17092a9..fad39c9 100644
--- a/configs/platform-v8a/rules/barebox.rockchip.make
+++ b/configs/platform-v8a/rules/barebox.rockchip.make
@@ -9,4 +9,24 @@
# TODO: remove this when it is added in PTXdist upstream
BAREBOX_PROGS_HOST += rk-usb-loader
+#
+# Firmware blobs for barebox
+#
+ifdef PTXCONF_FIRMWARE_ROCKCHIP
+
+ifdef PTXCONF_FIRMWARE_ROCKCHIP_RK356x_BL31
+BAREBOX_INJECT_FILES += rk3568_bl31_v1.24.elf:firmware/rk3568-bl31.bin
+endif
+
+ifdef PTXCONF_FIRMWARE_ROCKCHIP_RK356x_BL32
+BAREBOX_INJECT_FILES += rk3568_bl32_v1.05.bin:firmware/rk3568-op-tee.bin
+endif
+
+ifdef PTXCONF_FIRMWARE_ROCKCHIP_RK3568_SDRAM
+BAREBOX_INJECT_FILES += rk3568_ddr_1560MHz_v1.08.bin:arch/arm/boards/rockchip-rk3568-evb/sdram-init.bin
+BAREBOX_INJECT_FILES += rk3568_ddr_1560MHz_v1.08.bin:arch/arm/boards/radxa-rock3/sdram-init.bin
+endif
+
+endif
+
# vim: syntax=make
diff --git a/configs/platform-v8a/rules/firmware-rockchip.make b/configs/platform-v8a/rules/firmware-rockchip.make
index 6949148..dd50c86 100644
--- a/configs/platform-v8a/rules/firmware-rockchip.make
+++ b/configs/platform-v8a/rules/firmware-rockchip.make
@@ -20,16 +20,6 @@ FIRMWARE_ROCKCHIP_SOURCE := $(SRCDIR)/$(FIRMWARE_ROCKCHIP).$(FIRMWARE_ROCKCHIP_S
FIRMWARE_ROCKCHIP_DIR := $(BUILDDIR)/$(FIRMWARE_ROCKCHIP)
FIRMWARE_ROCKCHIP_LICENSE := proprietary
-#
-# Firmware blobs for barebox
-#
-ifdef PTXCONF_FIRMWARE_ROCKCHIP
-BAREBOX_INJECT_FILES += rk3568_bl31_v1.24.elf:firmware/rk3568-bl31.bin
-BAREBOX_INJECT_FILES += rk3568_bl32_v1.05.bin:firmware/rk3568-op-tee.bin
-BAREBOX_INJECT_FILES += rk3568_ddr_1560MHz_v1.08.bin:arch/arm/boards/rockchip-rk3568-evb/sdram-init.bin
-BAREBOX_INJECT_FILES += rk3568_ddr_1560MHz_v1.08.bin:arch/arm/boards/radxa-rock3/sdram-init.bin
-endif
-
# ----------------------------------------------------------------------------
# Prepare
# ----------------------------------------------------------------------------
--
2.39.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [DistroKit] [PATCH v2 2/4] platform: v8a: barebox: Remove extra host prog
2025-05-23 13:58 [DistroKit] [PATCH v2 0/4] platform: v8a: barebox: Untangle firmware inject files Alexander Dahl
2025-05-23 13:58 ` [DistroKit] [PATCH v2 1/4] platform: v8a: firmware-rockchip: Move barebox injects to separate package Alexander Dahl
@ 2025-05-23 13:58 ` Alexander Dahl
2025-05-23 13:58 ` [DistroKit] [PATCH v2 3/4] platform: v8a: firmware-imx: Break out barebox injects to separate packages Alexander Dahl
2025-05-23 13:58 ` [DistroKit] [PATCH v2 4/4] platform: v8a: barebox: Inject tf-a binaries conditionally Alexander Dahl
3 siblings, 0 replies; 5+ messages in thread
From: Alexander Dahl @ 2025-05-23 13:58 UTC (permalink / raw)
To: distrokit; +Cc: Lars Schmidt
Added to ptxdist-2023.07.0 and thus TODO completed.
Before removal BAREBOX_PROGS_HOST had this twice:
% p print BAREBOX_PROGS_HOST
bareboxenv kernel-install bareboxcrc32 bareboximd setupmbr/setupmbr imx/imx-usb-loader rk-usb-loader rk-usb-loader
Fixes: cd9e439e789e ("ptxdist: version bump 2023.06.0 -> 2023.07.1")
Signed-off-by: Alexander Dahl <ada@thorsis.com>
---
Notes:
v2:
- reorder, now patch 2/4
v1:
- Link: https://lore.distrokit.org/distrokit/20240425080303.171897-9-ada@thorsis.com/
configs/platform-v8a/rules/barebox.rockchip.make | 3 ---
1 file changed, 3 deletions(-)
diff --git a/configs/platform-v8a/rules/barebox.rockchip.make b/configs/platform-v8a/rules/barebox.rockchip.make
index fad39c9..c0789c6 100644
--- a/configs/platform-v8a/rules/barebox.rockchip.make
+++ b/configs/platform-v8a/rules/barebox.rockchip.make
@@ -6,9 +6,6 @@
# see the README file.
#
-# TODO: remove this when it is added in PTXdist upstream
-BAREBOX_PROGS_HOST += rk-usb-loader
-
#
# Firmware blobs for barebox
#
--
2.39.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [DistroKit] [PATCH v2 3/4] platform: v8a: firmware-imx: Break out barebox injects to separate packages
2025-05-23 13:58 [DistroKit] [PATCH v2 0/4] platform: v8a: barebox: Untangle firmware inject files Alexander Dahl
2025-05-23 13:58 ` [DistroKit] [PATCH v2 1/4] platform: v8a: firmware-rockchip: Move barebox injects to separate package Alexander Dahl
2025-05-23 13:58 ` [DistroKit] [PATCH v2 2/4] platform: v8a: barebox: Remove extra host prog Alexander Dahl
@ 2025-05-23 13:58 ` Alexander Dahl
2025-05-23 13:58 ` [DistroKit] [PATCH v2 4/4] platform: v8a: barebox: Inject tf-a binaries conditionally Alexander Dahl
3 siblings, 0 replies; 5+ messages in thread
From: Alexander Dahl @ 2025-05-23 13:58 UTC (permalink / raw)
To: distrokit; +Cc: Lars Schmidt
The firmware-imx package is independent from TF-A. barebox uses both,
but that does not mean firmware-imx should inject the tf-a binary for
barebox.
This is what 'barebox_firmware' was invented for. Done to avoid
cluttering the firmware-imx package even more.
Before duplicating the firmware-imx package files in an upper layer and
adding more such stuff for a different bootloader, we rather move this
stuff to multiple barebox_firmware packages (which can also sit in other
layers) and inject files from there.
The same approach can then be followed by other bootloaders depending on
firmware-imx package. This way we can depend on firmware-imx from one,
the other, or both bootloaders, respectively their firmware packages,
without the need to touch the firmware-imx package itself.
Approach inspired by the patch series which introduced that
infrastructure in ptxdist.
Link: https://lore.ptxdist.org/ptxdist/20220129070330.2601433-6-michael.riesch@wolfvision.net/
Signed-off-by: Alexander Dahl <ada@thorsis.com>
---
Notes:
v2:
- reordered, now patch 3/4
- extend to not only breakout firmware-imx but also tf-a to separate new
package fixups
v1:
- Link: https://lore.distrokit.org/distrokit/20240425080303.171897-7-ada@thorsis.com/
configs/platform-v8a/platformconfig | 2 ++
configs/platform-v8a/platforms/barebox.imx.in | 12 ++++++++++
.../platform-v8a/platforms/barebox.tf-a.in | 11 ++++++++++
.../platform-v8a/platforms/firmware-imx.in | 6 -----
configs/platform-v8a/rules/barebox.imx.make | 22 +++++++++++++++++++
configs/platform-v8a/rules/barebox.tf-a.make | 19 ++++++++++++++++
configs/platform-v8a/rules/firmware-imx.make | 21 ------------------
7 files changed, 66 insertions(+), 27 deletions(-)
create mode 100644 configs/platform-v8a/platforms/barebox.imx.in
create mode 100644 configs/platform-v8a/platforms/barebox.tf-a.in
create mode 100644 configs/platform-v8a/rules/barebox.imx.make
create mode 100644 configs/platform-v8a/rules/barebox.tf-a.make
diff --git a/configs/platform-v8a/platformconfig b/configs/platform-v8a/platformconfig
index 83c3615..cf8ba0c 100644
--- a/configs/platform-v8a/platformconfig
+++ b/configs/platform-v8a/platformconfig
@@ -185,7 +185,9 @@ PTXCONF_BAREBOX_BUILDSYSTEM_VERSION="${PTXDIST_VCS_VERSION}"
PTXCONF_BAREBOX_MD5="2b84bcf8644373db021c86864f2e5761"
PTXCONF_BAREBOX_CONFIG="barebox.config"
PTXCONF_BAREBOX_FIRMWARE=y
+PTXCONF_BAREBOX_NEEDS_FIRMWARE_IMX=y
PTXCONF_BAREBOX_NEEDS_FIRMWARE_ROCKCHIP=y
+PTXCONF_BAREBOX_NEEDS_TF_A=y
PTXCONF_BAREBOX_EXTRA_ENV=y
PTXCONF_BAREBOX_EXTRA_ENV_PATH="barebox-common-defaultenv"
# PTXCONF_BAREBOX_BAREBOXENV is not set
diff --git a/configs/platform-v8a/platforms/barebox.imx.in b/configs/platform-v8a/platforms/barebox.imx.in
new file mode 100644
index 0000000..971fc9b
--- /dev/null
+++ b/configs/platform-v8a/platforms/barebox.imx.in
@@ -0,0 +1,12 @@
+## SECTION=barebox_firmware
+
+config BAREBOX_NEEDS_FIRMWARE_IMX
+ bool
+ prompt "barebox needs firmware-imx"
+ help
+ Select this if barebox needs the non-free IMX firmware blobs.
+
+config BAREBOX_DEPENDENCIES
+ tristate
+ select FIRMWARE_IMX if BAREBOX_NEEDS_FIRMWARE_IMX
+ select FIRMWARE_IMX_BOOTIMAGE_IMX8 if BAREBOX_NEEDS_FIRMWARE_IMX
diff --git a/configs/platform-v8a/platforms/barebox.tf-a.in b/configs/platform-v8a/platforms/barebox.tf-a.in
new file mode 100644
index 0000000..20c4bc4
--- /dev/null
+++ b/configs/platform-v8a/platforms/barebox.tf-a.in
@@ -0,0 +1,11 @@
+## SECTION=barebox_firmware
+
+config BAREBOX_NEEDS_TF_A
+ bool
+ prompt "barebox needs tf-a"
+ help
+ Select this if barebox needs the TF-A firmware blobs.
+
+config BAREBOX_DEPENDENCIES
+ tristate
+ select TF_A if BAREBOX_NEEDS_TF_A
diff --git a/configs/platform-v8a/platforms/firmware-imx.in b/configs/platform-v8a/platforms/firmware-imx.in
index c93e9f8..965db38 100644
--- a/configs/platform-v8a/platforms/firmware-imx.in
+++ b/configs/platform-v8a/platforms/firmware-imx.in
@@ -53,9 +53,3 @@ config FIRMWARE_IMX_BOOTIMAGE_IMX9
a boot image.
endif
-
-config BAREBOX_DEPENDENCIES
- tristate
- select FIRMWARE_IMX
- select FIRMWARE_IMX_BOOTIMAGE_IMX8
- select TF_A
diff --git a/configs/platform-v8a/rules/barebox.imx.make b/configs/platform-v8a/rules/barebox.imx.make
new file mode 100644
index 0000000..2137c67
--- /dev/null
+++ b/configs/platform-v8a/rules/barebox.imx.make
@@ -0,0 +1,22 @@
+# -*-makefile-*-
+#
+# Copyright (C) 2024 by Alexander Dahl <ada@thorsis.com>
+#
+# For further information about the PTXdist project and license conditions
+# see the README file.
+#
+
+ifdef PTXCONF_FIRMWARE_IMX_BOOTIMAGE_IMX8
+
+BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_1d_dmem.bin:firmware/lpddr4_pmu_train_1d_dmem.bin
+BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_1d_imem.bin:firmware/lpddr4_pmu_train_1d_imem.bin
+BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_2d_dmem.bin:firmware/lpddr4_pmu_train_2d_dmem.bin
+BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_2d_imem.bin:firmware/lpddr4_pmu_train_2d_imem.bin
+BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_dmem_1d.bin:firmware/ddr4_dmem_1d.bin
+BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_dmem_2d.bin:firmware/ddr4_dmem_2d.bin
+BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_imem_1d.bin:firmware/ddr4_imem_1d.bin
+BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_imem_2d.bin:firmware/ddr4_imem_2d.bin
+
+endif
+
+# vim: syntax=make
diff --git a/configs/platform-v8a/rules/barebox.tf-a.make b/configs/platform-v8a/rules/barebox.tf-a.make
new file mode 100644
index 0000000..47d8032
--- /dev/null
+++ b/configs/platform-v8a/rules/barebox.tf-a.make
@@ -0,0 +1,19 @@
+# -*-makefile-*-
+#
+# Copyright (C) 2025 by Alexander Dahl <ada@thorsis.com>
+#
+# For further information about the PTXdist project and license conditions
+# see the README file.
+#
+
+ifdef PTXCONF_TF_A
+
+BAREBOX_INJECT_FILES += imx8mm-bl31.bin:firmware/imx8mm-bl31.bin
+BAREBOX_INJECT_FILES += imx8mn-bl31.bin:firmware/imx8mn-bl31.bin
+BAREBOX_INJECT_FILES += imx8mp-bl31.bin:firmware/imx8mp-bl31.bin
+BAREBOX_INJECT_FILES += imx8mq-bl31.bin:firmware/imx8mq-bl31.bin
+BAREBOX_INJECT_FILES += imx93-bl31.bin:firmware/imx93-bl31.bin
+
+endif
+
+# vim: syntax=make
diff --git a/configs/platform-v8a/rules/firmware-imx.make b/configs/platform-v8a/rules/firmware-imx.make
index 6b01af3..906691c 100644
--- a/configs/platform-v8a/rules/firmware-imx.make
+++ b/configs/platform-v8a/rules/firmware-imx.make
@@ -26,27 +26,6 @@ FIRMWARE_IMX_LICENSE := NXP-Software-License-Agreement
FIRMWARE_IMX_LICENSE_FILES := \
file://COPYING;md5=44a8052c384584ba09077e85a3d1654f
-#
-# Firmware blobs for barebox
-#
-ifdef PTXCONF_FIRMWARE_IMX
-BAREBOX_INJECT_FILES += imx8mm-bl31.bin:firmware/imx8mm-bl31.bin
-BAREBOX_INJECT_FILES += imx8mn-bl31.bin:firmware/imx8mn-bl31.bin
-BAREBOX_INJECT_FILES += imx8mp-bl31.bin:firmware/imx8mp-bl31.bin
-BAREBOX_INJECT_FILES += imx8mq-bl31.bin:firmware/imx8mq-bl31.bin
-BAREBOX_INJECT_FILES += imx93-bl31.bin:firmware/imx93-bl31.bin
-ifdef PTXCONF_FIRMWARE_IMX_BOOTIMAGE_IMX8
-BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_1d_dmem.bin:firmware/lpddr4_pmu_train_1d_dmem.bin
-BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_1d_imem.bin:firmware/lpddr4_pmu_train_1d_imem.bin
-BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_2d_dmem.bin:firmware/lpddr4_pmu_train_2d_dmem.bin
-BAREBOX_INJECT_FILES += ddr/synopsys/lpddr4_pmu_train_2d_imem.bin:firmware/lpddr4_pmu_train_2d_imem.bin
-BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_dmem_1d.bin:firmware/ddr4_dmem_1d.bin
-BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_dmem_2d.bin:firmware/ddr4_dmem_2d.bin
-BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_imem_1d.bin:firmware/ddr4_imem_1d.bin
-BAREBOX_INJECT_FILES += ddr/synopsys/ddr4_imem_2d.bin:firmware/ddr4_imem_2d.bin
-endif
-endif
-
# ----------------------------------------------------------------------------
# Extract
# ----------------------------------------------------------------------------
--
2.39.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [DistroKit] [PATCH v2 4/4] platform: v8a: barebox: Inject tf-a binaries conditionally
2025-05-23 13:58 [DistroKit] [PATCH v2 0/4] platform: v8a: barebox: Untangle firmware inject files Alexander Dahl
` (2 preceding siblings ...)
2025-05-23 13:58 ` [DistroKit] [PATCH v2 3/4] platform: v8a: firmware-imx: Break out barebox injects to separate packages Alexander Dahl
@ 2025-05-23 13:58 ` Alexander Dahl
3 siblings, 0 replies; 5+ messages in thread
From: Alexander Dahl @ 2025-05-23 13:58 UTC (permalink / raw)
To: distrokit; +Cc: Lars Schmidt
Previously this only worked if all of these configurations were built
with TF-A. Now inject only those actually built.
Suggested-by: Lars Schmidt <l.schmidt@pengutronix.de>
Signed-off-by: Alexander Dahl <ada@thorsis.com>
---
Notes:
v2:
- new patch
v1:
- not present in v1
configs/platform-v8a/rules/barebox.tf-a.make | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/configs/platform-v8a/rules/barebox.tf-a.make b/configs/platform-v8a/rules/barebox.tf-a.make
index 47d8032..10996dd 100644
--- a/configs/platform-v8a/rules/barebox.tf-a.make
+++ b/configs/platform-v8a/rules/barebox.tf-a.make
@@ -8,11 +8,21 @@
ifdef PTXCONF_TF_A
+ifneq ($(filter imx8mm,$(call remove_quotes, $(PTXCONF_TF_A_PLATFORMS))),)
BAREBOX_INJECT_FILES += imx8mm-bl31.bin:firmware/imx8mm-bl31.bin
+endif
+ifneq ($(filter imx8mn,$(call remove_quotes, $(PTXCONF_TF_A_PLATFORMS))),)
BAREBOX_INJECT_FILES += imx8mn-bl31.bin:firmware/imx8mn-bl31.bin
+endif
+ifneq ($(filter imx8mp,$(call remove_quotes, $(PTXCONF_TF_A_PLATFORMS))),)
BAREBOX_INJECT_FILES += imx8mp-bl31.bin:firmware/imx8mp-bl31.bin
+endif
+ifneq ($(filter imx8mq,$(call remove_quotes, $(PTXCONF_TF_A_PLATFORMS))),)
BAREBOX_INJECT_FILES += imx8mq-bl31.bin:firmware/imx8mq-bl31.bin
+endif
+ifneq ($(filter imx93,$(call remove_quotes, $(PTXCONF_TF_A_PLATFORMS))),)
BAREBOX_INJECT_FILES += imx93-bl31.bin:firmware/imx93-bl31.bin
+endif
endif
--
2.39.5
^ permalink raw reply [flat|nested] 5+ messages in thread