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. 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. [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