Good morning Richard, On Fri, Oct 11, 2024 at 02:39:22PM +0200, Richard Weinberger wrote: > Texas Instruments ships a patch in their vendor kernels, > which adds a new NS message that includes a description field. > While TI is free to do whatever they want in their copy of the kernel, > it becomes a mess when people switch to a mainline kernel and want > to use their existing DSP programs with it. I suspect there is a lot more things to change when going from downstream to a mainline kernel. > > To make it easier to migrate to a mainline kernel, > let's make the kernel aware of their non-standard extension but > briefly ignore the description field. In my opinion the real fix here is to get TI to use the standard message announcement structure. The ->desc field doesn't seem to be that useful since it gets discarted. Thanks, Mathieu > > [0] https://patchwork.kernel.org/project/linux-remoteproc/patch/20190815231448.10100-1-s-anna@xxxxxx/ > [1] https://stash.phytec.com/projects/PUB/repos/linux-phytec-ti/commits/aeded1f439effc84aa9f4e341a6e92ce1844ab98#drivers/rpmsg/virtio_rpmsg_bus.c > > Cc: ohad@xxxxxxxxxx > Cc: s-anna@xxxxxx > Cc: t-kristo@xxxxxx > Signed-off-by: Richard Weinberger <richard@xxxxxx> > --- > FWIW, this is a forward port of a patch I'm using on v6.6. > > Thanks, > //richard > --- > drivers/rpmsg/rpmsg_ns.c | 30 ++++++++++++++++++++++-------- > include/linux/rpmsg/ns.h | 8 ++++++++ > 2 files changed, 30 insertions(+), 8 deletions(-) > > diff --git a/drivers/rpmsg/rpmsg_ns.c b/drivers/rpmsg/rpmsg_ns.c > index bde8c8d433e0a..2fb3721eb0141 100644 > --- a/drivers/rpmsg/rpmsg_ns.c > +++ b/drivers/rpmsg/rpmsg_ns.c > @@ -31,10 +31,11 @@ EXPORT_SYMBOL(rpmsg_ns_register_device); > static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, > void *priv, u32 src) > { > - struct rpmsg_ns_msg *msg = data; > struct rpmsg_device *newch; > struct rpmsg_channel_info chinfo; > struct device *dev = rpdev->dev.parent; > + __rpmsg32 ns_addr, ns_flags; > + char *ns_name; > int ret; > > #if defined(CONFIG_DYNAMIC_DEBUG) > @@ -42,23 +43,36 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len, > data, len, true); > #endif > > - if (len != sizeof(*msg)) { > + if (len == sizeof(struct rpmsg_ns_msg)) { > + struct rpmsg_ns_msg *msg = data; > + > + ns_addr = msg->addr; > + ns_flags = msg->flags; > + ns_name = msg->name; > + } else if (len == sizeof(struct __rpmsg_ns_msg_ti)) { > + struct __rpmsg_ns_msg_ti *msg = data; > + > + ns_addr = msg->addr; > + ns_flags = msg->flags; > + ns_name = msg->name; > + dev_warn(dev, "non-standard ns msg found\n"); > + } else { > dev_err(dev, "malformed ns msg (%d)\n", len); > return -EINVAL; > } > > /* don't trust the remote processor for null terminating the name */ > - msg->name[RPMSG_NAME_SIZE - 1] = '\0'; > + ns_name[RPMSG_NAME_SIZE - 1] = '\0'; > > - strscpy_pad(chinfo.name, msg->name, sizeof(chinfo.name)); > + strscpy_pad(chinfo.name, ns_name, sizeof(chinfo.name)); > chinfo.src = RPMSG_ADDR_ANY; > - chinfo.dst = rpmsg32_to_cpu(rpdev, msg->addr); > + chinfo.dst = rpmsg32_to_cpu(rpdev, ns_addr); > > dev_info(dev, "%sing channel %s addr 0x%x\n", > - rpmsg32_to_cpu(rpdev, msg->flags) & RPMSG_NS_DESTROY ? > - "destroy" : "creat", msg->name, chinfo.dst); > + rpmsg32_to_cpu(rpdev, ns_flags) & RPMSG_NS_DESTROY ? > + "destroy" : "creat", ns_name, chinfo.dst); > > - if (rpmsg32_to_cpu(rpdev, msg->flags) & RPMSG_NS_DESTROY) { > + if (rpmsg32_to_cpu(rpdev, ns_flags) & RPMSG_NS_DESTROY) { > ret = rpmsg_release_channel(rpdev, &chinfo); > if (ret) > dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret); > diff --git a/include/linux/rpmsg/ns.h b/include/linux/rpmsg/ns.h > index a7804edd6d58f..60fca84ad4cea 100644 > --- a/include/linux/rpmsg/ns.h > +++ b/include/linux/rpmsg/ns.h > @@ -26,6 +26,14 @@ struct rpmsg_ns_msg { > __rpmsg32 flags; > } __packed; > > +/* Non-standard extended ns message by Texas Instruments */ > +struct __rpmsg_ns_msg_ti { > + char name[RPMSG_NAME_SIZE]; > + char desc[RPMSG_NAME_SIZE]; /* ignored */ > + u32 addr; > + u32 flags; > +} __packed; > + > /** > * enum rpmsg_ns_flags - dynamic name service announcement flags > * > -- > 2.35.3 >