public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
From: Beleswar Prasad Padhi <b-padhi@ti.com>
To: Arnaud POULIQUEN <arnaud.pouliquen@foss.st.com>,
	Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Shenwei Wang <shenwei.wang@nxp.com>, Andrew Lunn <andrew@lunn.ch>,
	"Linus Walleij" <linusw@kernel.org>,
	Bartosz Golaszewski <brgl@kernel.org>,
	"Jonathan Corbet" <corbet@lwn.net>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Bjorn Andersson <andersson@kernel.org>,
	Frank Li <frank.li@nxp.com>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Shuah Khan <skhan@linuxfoundation.org>,
	"linux-gpio@vger.kernel.org" <linux-gpio@vger.kernel.org>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	Fabio Estevam <festevam@gmail.com>, "Peng Fan" <peng.fan@nxp.com>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-remoteproc@vger.kernel.org"
	<linux-remoteproc@vger.kernel.org>,
	"imx@lists.linux.dev" <imx@lists.linux.dev>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	dl-linux-imx <linux-imx@nxp.com>,
	Bartosz Golaszewski <brgl@bgdev.pl>
Subject: Re: [PATCH v13 3/4] gpio: rpmsg: add generic rpmsg GPIO driver
Date: Mon, 4 May 2026 13:47:17 +0530	[thread overview]
Message-ID: <268f8e00-91bc-43ea-ba95-077cf859e7f3@ti.com> (raw)
In-Reply-To: <4c526816-b127-43e7-86e9-eee4dc1152bc@foss.st.com>

Hi Arnaud,

On 30/04/26 22:10, Arnaud POULIQUEN wrote:
>
>
> On 4/30/26 14:56, Beleswar Prasad Padhi wrote:
>> Hello Arnaud,
>>
>> On 30/04/26 13:05, Arnaud POULIQUEN wrote:
>>> Hello,
>>>
>>> On 4/29/26 21:20, Mathieu Poirier wrote:
>>>> On Wed, 29 Apr 2026 at 12:07, Padhi, Beleswar <b-padhi@ti.com> wrote:
>>>>>
>>>>> Hi Mathieu,
>>>>>
>>>>> On 4/29/2026 11:03 PM, Mathieu Poirier wrote:
>>>>>> On Wed, 29 Apr 2026 at 10:53, Shenwei Wang <shenwei.wang@nxp.com> wrote:
>>>>

[...]

>>>>> My mental model looks like this for the complete picture:
>>>>>
>>>>> 1. namespace/channel#1 = rpmsg-io
>>>>>       a. ept1 -> gpio-controller@1
>>>>>       b. ept2 -> gpio-controller@2
>>>>>
>>>>
>>>> I've asked for one endpoint per GPIO controller since the very
>>>> beginning.  I don't yet have a strong opinion on whether to use one
>>>> namespace request per GPIO controller or a single request that spins
>>>> off multiple endpoints.  I'll have to look at your link and reflect on
>>>> that.  Regardless of how we proceed on that front, multiplexing needs
>>>> to happen at the endpoint level rather than the packet level.  This is
>>>> the only way this work can move forward.
>>>>
>>>
>>> I would be more in favor of Mathieu’s proposal: “An endpoint is created with every namespace request.”
>>>
>>> If the endpoint is created only on the Linux side, how do we match the Linux endpoint address with the local port field on the remote side?
>>
>>
>> Simply by sending a message to the remote containing the newly created
>> endpoint and the port idx. Note that is this done just one time, after this
>> Linux need not have the port field in the message everytime its sending
>> a message.
>>
>>>
>>> With a multi-namespace approach, the namespace could be rpmsg-io-[addr], where [addr] corresponds to the GPIO controller address in the DT. This would:
>>
>>
>> You will face the same problem in this case also that you asked above:
>> "how do we match the Linux endpoint address with the local port field
>> on the remote side?"
>
> Sorry I probably introduced confusion here
> my sentence should be;
>  With a multi-namespace approach, the namespace could be rpmsg-io-[port],
>  where [port] corresponds to the GPIO controller port in the DT.
>
>
> For instance:
>
>       rpmsg {
>         rpmsg-io {
>           #address-cells = <1>;
>           #size-cells = <0>;
>
>           gpio@25 {
>             compatible = "rpmsg-gpio";
>             reg = <25>;
>             gpio-controller;
>             #gpio-cells = <2>;
>             #interrupt-cells = <2>;
>             interrupt-controller;
>           };
>
>           gpio@32 {
>             compatible = "rpmsg-gpio";
>             reg = <32>;
>             gpio-controller;
>             #gpio-cells = <2>;
>             #interrupt-cells = <2>;
>             interrupt-controller;
>           };
>         };
>       };
>
>  rpmsg-io-25  would match with gpio@25
>  rpmsg-io-32  would match with gpio@32
>
>
>>
>> Because the endpoint that is created on a namespace request is also
>> dynamic in nature. How will the remote know which endpoint addr
>> Linux allocated for a namespace that it announced?
>>
>> As an example/PoC, I created a firmware example which announces
>> 2 name services to Linux, one is the standard "rpmsg_chrdev" and
>> the other is a TI specific name service "ti.ipc4.ping-pong". You can
>> see it created 2 different addresses (0x400 and 0x401) for each of
>> the name service request from the same firmware:
>>
>> root@j784s4-evm:~# dmesg | grep virtio0 | grep -i channel
>> [    9.290275] virtio_rpmsg_bus virtio0: creating channel ti.ipc4.ping-pong addr 0xd
>> [    9.311230] virtio_rpmsg_bus virtio0: creating channel rpmsg_chrdev addr 0xe
>> [    9.496645] rpmsg_chrdev virtio0.rpmsg_chrdev.-1.14: DEBUG: Channel formed from src = 0x400 to dst = 0xe
>> [    9.707255] rpmsg_client_sample virtio0.ti.ipc4.ping-pong.-1.13: new channel: 0x401 -> 0xd!
>>
>> So in this case, rpmsg-io-1 can have different ept addr than rpmsg-io-2
>> Back to same problem. Simple solution is to reply to remote with the
>> created ept addr and the index.
>
> That why I would like to suggest to use the name service field to identify the port/controller, instead of the endpoint address.
>>  
>>>
>>> - match the RPMsg probe with the DT,
>>
>>
>> We can probe from all controllers with a single name service
>> announcement too.
>>
>>> - provide a simple mapping between the port and the endpoint on both sides,
>>
>>
>> We are trying to get rid of this mapping from Linux side to adapt
>> the gpio-virtio design.
>>
>>> - allow multiple endpoints on the remote side,
>>
>>
>> We can support this as well with single nameservice model.
>> There is no limitation. Remote has to send a message with
>> its newly created ept that's all.
>>
>>> - provide a simple discovery mechanism for remote capabilities.
>>
>>
>> A single announcement: "rpmsg-io" is also discovery mechanism.
>>
>> Feel free to let me know if you have concerns with any of the
>> suggestions!
>
> My only concern, whatever the solution, is that we find a smart
> solution to associate the correct endpoint with the correct GPIO
> port/controller defined in the DT. 


In my solution, there is no need to have this map of endpoint to
GPIO port at Linux side. This aligns more with virtio-gpio design
as well.

>
> I may have misunderstood your solution. Could you please help me
> understand your proposal by explaining how you would handle three
> GPIO ports defined in the DT, considering that the endpoint
> addresses on the Linux side can be random?
> If I assume there is a unique endpoint on the remote side,
> I do not understand how you can match, on the firmware side,
> the Linux endpoint address to the GPIO port. 


Sure, let me take an example:
Assumptions: 3 GPIO ports in DT, 3 endpoints in Linux (one per port),
1 endpoint in remote (0xd) and 1 rpmsg channel (rpmsg-io)

       rpmsg {
         rpmsg-io {
           #address-cells = <1>;
           #size-cells = <0>;

           gpio@25 {
             compatible = "rpmsg-gpio";
             reg = <25>;
             gpio-controller;
             #gpio-cells = <2>;
             #interrupt-cells = <2>;
             interrupt-controller;
           };

           gpio@32 {
             compatible = "rpmsg-gpio";
             reg = <32>;
             gpio-controller;
             #gpio-cells = <2>;
             #interrupt-cells = <2>;
             interrupt-controller;
           };

           gpio@35 {
             compatible = "rpmsg-gpio";
             reg = <35>;
             gpio-controller;
             #gpio-cells = <2>;
             #interrupt-cells = <2>;
             interrupt-controller;
           };
         };
       };

Code Flow:
1. "rpmsg-io" channel is announced from remote firmware with unique dst
    ept = 0xd.

2. rpmsg_core.c creates the default dynamic local ept for the channel
    ept = 0x405.

3. rpmsg_core.c assigns the allocated addr to rpdev device:
    rpdev->src = 0x405 and rpdev->dst = 0xd.

4. rpmsg_gpio_channel_probe() is triggered. For *each* of the GPIO ports
    in DT, it will trigger rpmsg_gpiochip_register() which will now:
       a. Call port->ept = rpmsg_create_ept(rpdev,
                                                                   rpmsg_gpio_channel_callback,
                                                                   port,
                                                                  {rpdev.id.name,
                                                                   RPMSG_ADDR_ANY,
                                                                   RPMSG_ADDR_ANY}); 
           Ex- port->ept->addr = 0x408

       b. Prepare a 8-byte message having 2 fields:
           port->ept->addr (0x408) and port->idx (25)

       c. Send this message to remote firmware on default channel ept
           (0x405 -> 0xd) by:
           rpmsg_send(rpdev->ept, &message, sizeof(message));

       d. Remote side receives this message and creates a map of the
           linux_ept_addr to gpio_port. (0x408 <-> 25)

5. After this point, any gpio messages sent from Linux from gpio port
    endpoints (Ex- 0x408) can be decoded at remote side by looking up
    its map (Ex- map[0x408] = 25).

6. Any messages sent from remote to Linux for a particular gpio port can
    also be decoded at Linux by simply fetching the priv pointer to get
    the per-port device:
    struct rpmsg_gpio_port *port = priv;

So Linux does not need to send the port idx everytime while sending a
gpio message anymore.

Thanks,
Beleswar

[...]



  reply	other threads:[~2026-05-04  8:17 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-22 21:28 [PATCH v13 0/4] Enable Remote GPIO over RPMSG on i.MX Platform Shenwei Wang
2026-04-22 21:28 ` [PATCH v13 1/4] docs: driver-api: gpio: rpmsg gpio driver over rpmsg bus Shenwei Wang
2026-05-04 19:23   ` Mathieu Poirier
2026-04-22 21:28 ` [PATCH v13 2/4] dt-bindings: remoteproc: imx_rproc: Add "rpmsg" subnode support Shenwei Wang
2026-04-22 21:28 ` [PATCH v13 3/4] gpio: rpmsg: add generic rpmsg GPIO driver Shenwei Wang
2026-04-26 12:43   ` Padhi, Beleswar
2026-04-27 19:23     ` Shenwei Wang
2026-04-27 20:28       ` Andrew Lunn
2026-04-27 20:43         ` Shenwei Wang
2026-04-27 20:49           ` Andrew Lunn
2026-04-28 15:24             ` Shenwei Wang
2026-04-29 15:41               ` Mathieu Poirier
2026-04-29 16:53                 ` Shenwei Wang
2026-04-29 17:33                   ` Mathieu Poirier
2026-04-29 18:06                     ` Padhi, Beleswar
2026-04-29 18:35                       ` Shenwei Wang
2026-04-29 18:57                         ` Padhi, Beleswar
2026-04-29 19:20                       ` Mathieu Poirier
2026-04-30  7:35                         ` Arnaud POULIQUEN
2026-04-30 12:56                           ` Beleswar Prasad Padhi
2026-04-30 16:40                             ` Arnaud POULIQUEN
2026-05-04  8:17                               ` Beleswar Prasad Padhi [this message]
2026-05-04 17:04                                 ` Arnaud POULIQUEN
2026-05-04 19:19                               ` Shah, Tanmay
2026-04-29 17:55                   ` Padhi, Beleswar
2026-04-29 18:21                     ` Andrew Lunn
2026-04-28  7:25       ` Beleswar Prasad Padhi
2026-04-28 14:43         ` [EXT] " Shenwei Wang
2026-04-28 15:11           ` Padhi, Beleswar
2026-04-28 15:31             ` Shenwei Wang
2026-04-28 15:52               ` Padhi, Beleswar
2026-04-28 16:36                 ` Shenwei Wang
2026-04-29 14:35                   ` Padhi, Beleswar
2026-04-29 19:26                     ` Shenwei Wang
2026-04-28 18:05                 ` Andrew Lunn
2026-04-29 15:04                   ` Padhi, Beleswar
2026-04-22 21:28 ` [PATCH v13 4/4] arm64: dts: imx8ulp: Add rpmsg node under imx_rproc Shenwei Wang
2026-04-23 12:53 ` [PATCH v13 0/4] Enable Remote GPIO over RPMSG on i.MX Platform Mathieu Poirier
2026-04-23 13:53   ` Andrew Lunn
2026-04-23 19:11     ` Shenwei Wang
2026-04-23 19:08   ` Shenwei Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=268f8e00-91bc-43ea-ba95-077cf859e7f3@ti.com \
    --to=b-padhi@ti.com \
    --cc=andersson@kernel.org \
    --cc=andrew@lunn.ch \
    --cc=arnaud.pouliquen@foss.st.com \
    --cc=brgl@bgdev.pl \
    --cc=brgl@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=corbet@lwn.net \
    --cc=devicetree@vger.kernel.org \
    --cc=festevam@gmail.com \
    --cc=frank.li@nxp.com \
    --cc=imx@lists.linux.dev \
    --cc=kernel@pengutronix.de \
    --cc=krzk+dt@kernel.org \
    --cc=linusw@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=peng.fan@nxp.com \
    --cc=robh@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=shenwei.wang@nxp.com \
    --cc=skhan@linuxfoundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox