NXP Public
> -----Original Message-----
> From: Mathieu Poirier <[email protected]>
> Sent: Thursday, September 3, 2026 12:30 PM
> To: [email protected]; [email protected]
> Cc: Linus Walleij <[email protected]>; Bartosz Golaszewski <[email protected]>;
> Jonathan Corbet <[email protected]>; Conor Dooley <[email protected]>; Bjorn
> Andersson <[email protected]>; Frank Li <[email protected]>; Sascha Hauer
> <[email protected]>; Shuah Khan <[email protected]>; linux-
> [email protected]; [email protected]; [email protected];
> Pengutronix Kernel Team <[email protected]>; Fabio Estevam
> <[email protected]>; Shenwei Wang <[email protected]>; Peng Fan
> <[email protected]>; [email protected]; linux-
> [email protected]; [email protected]; linux-arm-
> [email protected]; dl-linux-imx <[email protected]>; Arnaud
> POULIQUEN <[email protected]>; [email protected]; Andrew Lunn
> <[email protected]>; [email protected]
> Subject: Re: [PATCH v15 2/5] dt-bindings: remoteproc: imx_rproc: Add "rpmsg"
> subnode support
>
> Krzysztof and Rob - I'm seeking your advice on the best way to define
> bindings for
> this use case.
>
> Here is some background:
>
> The transport mechanic between the kernel and remote processors can take
> different forms. As of this writing we have 'glink' and 'virtio'. The
> protocol that
> runs on top of the transport mechanic is RPMSG. All this is already
> implemented
> and stable.
>
> In this use case, we have GPIO controllers connected to the remote processor
> and we want to make them available to the kernel. We also want to use the
> existing virtio-gpio protocol on top of RPMSG, allowing the kernel to
> interface
> with the GPIO controllers as if they were virtio-gpios. This patchset is
> about
> providing a driver that will enact the virtio-gpio procotol on top of the
> mechanic
> used between the kernel and remote processor.
>
> Shenwei has proposed some bindings (below). I think they can be improved to
> take into account the transport mechanic and be closer to what virtio-gpio
> currently does. I'm proposing something like this:
>
> $(transport) {
> compatible = "$(transport),rpmsg";
> #address-cells = <1>;
> #size-cells = <0>;
>
> gpio {
> compatible = "virtio,device29";
> reg = <3>
> gpio-controller;
> #gpio-cells = <2>;
> interrupt-controller;
> #interrupt-cells = <2>;
> };
> gpio {
> compatible = "virtio,device29";
> reg = <4>
> gpio-controller;
> #gpio-cells = <2>;
> interrupt-controller;
> #interrupt-cells = <2>;
> };
> }
>
> A complete example with a virtio transport mechanic would look like:
>
I'd like to point out a conceptual difference here.
RPMSG is effectively a messaging bus that operates on top of the Virtio
transport.
Virtio itself is not a bus.
In the current implementation, the GPIO devices are exposed over the RPMSG bus,
not
directly over a Virtio interace. As a result, modeling the GPIO nodes as
children of a Virtio
device may not accurately reflect the software architecture or device discovery
path.
From the GPIO client's perspective, the communication path is:
GPIO consumer
-> RPMsg
-> Virtio transport
-> remote endpoint
Therefore, I think the binding should primarily describe the RPMSG-based
hierarchy that exists
today, while keeping the underlying Virtio transport as an implementation
detail unless there
is a specific need to expose it in the DT representation.
Shenwei
> m4_rproc: m4@10000000 {
> compatible = "st,stm32mp1-m4";
> reg = <0x10000000 0x40000>,
> <0x30000000 0x40000>,
> <0x38000000 0x10000>;
> resets = <&rcc MCU_R>;
> reset-names = "mcu_rst";
> st,syscfg-holdboot = <&rcc 0x10C 0x1>;
> st,syscfg-pdds = <&pwr_mcu 0x0 0x1>;
> st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
> st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>;
> status = "disabled";
>
> virtio {
> compatible = "virtio,rpmsg";
> #address-cells = <1>;
> #size-cells = <0>;
>
> gpio {
> compatible = "virtio,device29";
> reg = <3>
> gpio-controller;
> #gpio-cells = <2>;
> interrupt-controller;
> #interrupt-cells = <2>;
> };
> gpio {
> compatible = "virtio,device29";
> reg = <4>
> gpio-controller;
> #gpio-cells = <2>;
> interrupt-controller;
> #interrupt-cells = <2>;
> };
> }
> };
> };
>
> Let me know what you think.
>
> Thanks,
> Mathieu
>
>
> On Tue, Jul 21, 2026 at 03:46:45PM -0500, Shenwei Wang wrote:
> > From: Shenwei Wang <[email protected]>
> >
> > Remote processors may announce multiple GPIO controllers over an RPMSG
> > channel. These GPIO controllers may require corresponding device tree
> > nodes, especially when acting as providers, to supply phandles for
> > their consumers.
> >
> > Define an RPMSG node to work as a container for a group of RPMSG
> > channels under the imx_rproc node. Each subnode within "rpmsg"
> > represents an individual RPMSG channel. The name of each subnode
> > corresponds to the channel name as defined by the remote processor.
> >
> > All remote devices associated with a given channel are defined as
> > child nodes under the corresponding channel node.
> >
> > Signed-off-by: Shenwei Wang <[email protected]>
> > ---
> > .../devicetree/bindings/gpio/gpio-rpmsg.yaml | 55 +++++++++++++++++++
> > .../bindings/remoteproc/fsl,imx-rproc.yaml | 53 ++++++++++++++++++
> > 2 files changed, 108 insertions(+)
> > create mode 100644
> > Documentation/devicetree/bindings/gpio/gpio-rpmsg.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/gpio/gpio-rpmsg.yaml
> > b/Documentation/devicetree/bindings/gpio/gpio-rpmsg.yaml
> > new file mode 100644
> > index 000000000000..41eb2e149942
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/gpio/gpio-rpmsg.yaml
> > @@ -0,0 +1,55 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) %YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/gpio/gpio-rpmsg.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Generic RPMSG GPIO Controller
> > +
> > +maintainers:
> > + - Shenwei Wang <[email protected]>
> > +
> > +description:
> > + On an AMP platform, some GPIO controllers are exposed by the remote
> > +processor
> > + through the RPMSG bus. The RPMSG GPIO transport protocol defines
> > +the packet
> > + structure and communication flow between Linux and the remote
> > +firmware. Those
> > + controllers are managed via this transport protocol. For more
> > +details of the
> > + protocol, check the document below.
> > + Documentation/driver-api/gpio/gpio-rpmsg.rst
> > +
> > +properties:
> > + compatible:
> > + oneOf:
> > + - items:
> > + - enum:
> > + - fsl,rpmsg-gpio
> > + - const: rpmsg-gpio
> > + - const: rpmsg-gpio
> > +
> > + reg:
> > + description:
> > + The reg property represents the index of the GPIO controllers. Since
> > + the driver manages controllers on a remote system, this index tells
> > + the remote system which controller to operate.
> > + maxItems: 1
> > +
> > + "#gpio-cells":
> > + const: 2
> > +
> > + gpio-controller: true
> > +
> > + interrupt-controller: true
> > +
> > + "#interrupt-cells":
> > + const: 2
> > +
> > +required:
> > + - compatible
> > + - reg
> > + - "#gpio-cells"
> > + - gpio-controller
> > +
> > +allOf:
> > + - $ref: /schemas/gpio/gpio.yaml#
> > +
> > +unevaluatedProperties: false
> > diff --git
> > a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > index c18f71b64889..b9b559b186af 100644
> > --- a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > +++ b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > @@ -88,6 +88,34 @@ properties:
> > This property is to specify the resource id of the remote processor
> > in SoC
> > which supports SCFW
> >
> > + rpmsg:
> > + type: object
> > + additionalProperties: false
> > + description:
> > + Represents the RPMSG bus between Linux and the remote system.
> Contains
> > + a group of RPMSG channel devices running on the bus.
> > +
> > + properties:
> > + rpmsg-io:
> > + type: object
> > + additionalProperties: false
> > + properties:
> > + '#address-cells':
> > + const: 1
> > +
> > + '#size-cells':
> > + const: 0
> > +
> > + patternProperties:
> > + "^gpio@[0-9a-f]+$":
> > + type: object
> > + $ref: /schemas/gpio/gpio-rpmsg.yaml#
> > + unevaluatedProperties: false
> > +
> > + required:
> > + - '#address-cells'
> > + - '#size-cells'
> > +
> > required:
> > - compatible
> >
> > @@ -150,5 +178,30 @@ examples:
> > &mu 3 1>;
> > memory-region = <&vdev0buffer>, <&vdev0vring0>, <&vdev0vring1>,
> <&rsc_table>;
> > syscon = <&src>;
> > +
> > + rpmsg {
> > + rpmsg-io {
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > +
> > + gpio@0 {
> > + compatible = "rpmsg-gpio";
> > + reg = <0>;
> > + gpio-controller;
> > + #gpio-cells = <2>;
> > + #interrupt-cells = <2>;
> > + interrupt-controller;
> > + };
> > +
> > + gpio@1 {
> > + compatible = "rpmsg-gpio";
> > + reg = <1>;
> > + gpio-controller;
> > + #gpio-cells = <2>;
> > + #interrupt-cells = <2>;
> > + interrupt-controller;
> > + };
> > + };
> > + };
> > };
> > ...
> > --
> > 2.43.0
> >