[PATCH RFC v2 11/11] PoC: arm64: dts: imx93-11x11-frdm: add multiple vdevs

From: Francesco Valla

Date: Sun Nov 01 2026 - 18:42:03 EST


Add rings and buffers for multiple virtio devices exposed by the
firmware running on the Cortex-M33 processor which is part of the i.MX93.
It is expected that such firmware exposes, through its resource table,
the following vdevs:

- vdev0: rpmsg
- vdev1: entropy
- vdev2: gpio
- vdev3: i2c
- vdev4: spi
- vdev5: can

The order in which the devices are contained inside the resource table
is critical, since it is used both to associate vrings and buffers to a
vdev and to map additional dt nodes to them.

All vdev buffers except the one for the rpmsg bus are declared as
restricted-dma-pool, because the corresponding drivers need bounce
buffering for the communication to work correctly.

Nodes for the gpio and i2c vdevs with example children devices are
included.

NOTE: this is a Proof-Of-Concept, not meant to be integrated!

Signed-off-by: Francesco Valla <francesco@xxxxxxxx>

---

Notable diff from RFC v1: the rsc-table node has been re-introduced to
focus on the changes that are truly in scope for the series. I still
believe something is off with the current implementation, but I'll
tackle it separately.
---
arch/arm64/boot/dts/freescale/imx93-11x11-frdm.dts | 188 +++++++++++++++++++++
1 file changed, 188 insertions(+)

diff --git a/arch/arm64/boot/dts/freescale/imx93-11x11-frdm.dts b/arch/arm64/boot/dts/freescale/imx93-11x11-frdm.dts
index 6e8351d12016..84324b02c45d 100644
--- a/arch/arm64/boot/dts/freescale/imx93-11x11-frdm.dts
+++ b/arch/arm64/boot/dts/freescale/imx93-11x11-frdm.dts
@@ -137,3 +137,191 @@ MX93_PAD_SD3_DATA3__GPIO3_IO25 0x31e
>;
};
};
+
+/* Multi-vdev PoC */
+
+#include <dt-bindings/input/linux-event-codes.h>
+
+/ {
+ reserved-memory {
+ rsc_table: rsc-table@2021e000 {
+ reg = <0 0x2021e000 0 0x1000>;
+ no-map;
+ };
+
+ /* vdev0: rpmsg */
+ vdev0vring0: vdev0vring0@a4000000 {
+ reg = <0 0xa4000000 0 0x8000>;
+ no-map;
+ };
+
+ vdev0vring1: vdev0vring1@a4008000 {
+ reg = <0 0xa4008000 0 0x8000>;
+ no-map;
+ };
+
+ vdev0buffer: vdev0buffer@a4020000 {
+ compatible = "shared-dma-pool";
+ reg = <0 0xa4020000 0 0x100000>;
+ no-map;
+ };
+
+ /* vdev1: entropy */
+ vdev1vring0: vdev1vring0@a4010000 {
+ reg = <0 0xa4010000 0 0x1000>;
+ no-map;
+ };
+
+ /delete-node/ vdev1vring1@a4018000;
+
+ vdev1buffer: vdev1buffer@a4120000 {
+ compatible = "restricted-dma-pool";
+ reg = <0 0xa4120000 0 0x10000>;
+ };
+
+ /* vdev2: GPIO */
+ vdev2vring0: vdev2vring0@a4011000 {
+ reg = <0 0xa4011000 0 0x2000>;
+ no-map;
+ };
+
+ vdev2vring1: vdev2vring1@a4013000 {
+ reg = <0 0xa4013000 0 0x2000>;
+ no-map;
+ };
+
+ vdev2buffer: vdev2buffer@a4130000 {
+ compatible = "restricted-dma-pool";
+ reg = <0 0xa4130000 0 0x20000>;
+ };
+
+ /* vdev3: I2C */
+ vdev3vring0: vdev3vring0@a4015000 {
+ reg = <0 0xa4015000 0 0x2000>;
+ no-map;
+ };
+
+ vdev3buffer: vdev3buffer@a4150000 {
+ compatible = "restricted-dma-pool";
+ reg = <0 0xa4150000 0 0x20000>;
+ };
+
+ /* vdev4: SPI */
+ vdev4vring0: vdev4vring0@a4017000 {
+ reg = <0 0xa4017000 0 0x4000>;
+ no-map;
+ };
+
+ vdev4buffer: vdev4buffer@a4170000 {
+ compatible = "restricted-dma-pool";
+ reg = <0 0xa4170000 0 0x90000>;
+ };
+
+ /* vdev5: CAN */
+ vdev5vring0: vdev5vring0@a401b000 {
+ reg = <0 0xa401b000 0 0x2000>;
+ no-map;
+ };
+
+ vdev5vring1: vdev5vring1@a401d000 {
+ reg = <0 0xa401d000 0 0x2000>;
+ no-map;
+ };
+
+ vdev5vring2: vdev5vring2@a401f000 {
+ reg = <0 0xa401f000 0 0x1000>;
+ no-map;
+ };
+
+ vdev5buffer: vdev5buffer@a4200000 {
+ compatible = "restricted-dma-pool";
+ reg = <0 0xa4200000 0 0x80000>;
+ };
+ };
+
+ gpio-keys-virtio {
+ compatible = "gpio-keys";
+
+ button-v1 {
+ label = "Button V1";
+ linux,code = <BTN_3>;
+ gpios = <&v_gpio 23 GPIO_ACTIVE_LOW>;
+ };
+
+ button-v2 {
+ label = "Button V2";
+ linux,code = <BTN_4>;
+ gpios = <&v_gpio 24 GPIO_ACTIVE_LOW>;
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ led {
+ gpios = <&v_gpio 18 GPIO_ACTIVE_HIGH>;
+ label = "LED V";
+ };
+ };
+};
+
+&cm33 {
+ memory-region = <&vdev0buffer>, <&vdev0vring0>, <&vdev0vring1>,
+ <&vdev1vring0>, <&vdev2vring0>, <&vdev2vring1>,
+ <&vdev3vring0>, <&vdev4vring0>, <&vdev5vring0>,
+ <&vdev5vring1>, <&vdev5vring2>, <&rsc_table>;
+
+ virtio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ /* vdev1: entropy */
+ vdev@1 {
+ reg = <1>;
+ memory-region = <&vdev1buffer>;
+ };
+
+ /* vdev2: GPIO */
+ vdev@2 {
+ reg = <2>;
+ memory-region = <&vdev2buffer>;
+
+ v_gpio: gpio {
+ compatible = "virtio,device29";
+ gpio-controller;
+ #gpio-cells = <2>;
+ interrupt-controller;
+ #interrupt-cells = <2>;
+ };
+ };
+
+ /* vdev3: I2C */
+ vdev@3 {
+ reg = <3>;
+ memory-region = <&vdev3buffer>;
+
+ i2c {
+ compatible = "virtio,device22";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ eeprom@50 {
+ compatible = "atmel,24c1025";
+ reg = <0x50>;
+ };
+ };
+ };
+
+ /* vdev4: SPI */
+ vdev@4 {
+ reg = <4>;
+ memory-region = <&vdev4buffer>;
+ };
+
+ /* vdev5: CAN */
+ vdev@5 {
+ reg = <5>;
+ memory-region = <&vdev5buffer>;
+ };
+ };
+};

--
2.56.0