[PATCH] rpmsg_ns: Work around TI non-standard message
From: Richard Weinberger
Date: Fri Oct 11 2024 - 08:39:59 EST
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