Message ID | 1513634534-22861-6-git-send-email-clew@codeaurora.org (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
On Mon 18 Dec 14:02 PST 2017, Chris Lew wrote: > Add support for client's to query the edge name their channel is > registered for. This is useful for clients who share the same channel > identifier across different remote procs. > I presume this will result in a strcmp in some client driver? When we're registering the rpmsg device, as part of handling of an arriving "open request", we do look for an of_node with matching qcom,glink-channels and if one is found we point the dev->of_node of the new device to this node. So I would suggest that you, in your client driver, use this to decide which instance you're on; regardless if you're using compatible based driver matching. Does this work for you? Regards, Bjorn -- To unsubscribe from this list: send the line "unsubscribe linux-remoteproc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 12/19/2017 9:52 AM, Bjorn Andersson wrote: > On Mon 18 Dec 14:02 PST 2017, Chris Lew wrote: > >> Add support for client's to query the edge name their channel is >> registered for. This is useful for clients who share the same channel >> identifier across different remote procs. >> > > I presume this will result in a strcmp in some client driver? > > When we're registering the rpmsg device, as part of handling of an > arriving "open request", we do look for an of_node with matching > qcom,glink-channels and if one is found we point the dev->of_node of the > new device to this node. > > So I would suggest that you, in your client driver, use this to decide > which instance you're on; regardless if you're using compatible based > driver matching. > > Does this work for you? > > Regards, > Bjorn > Yea I think this works for us, we can drop this patch. Just to confirm my understanding, clients can use rpdev->dev.of_node to get the parent of_node and from there get the label field? Also to ensure of_node is set, client's need to add their channel to the dt with qcom,glink-channels.
diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c index dffa3aab7178..d6ebd678b089 100644 --- a/drivers/rpmsg/rpmsg_core.c +++ b/drivers/rpmsg/rpmsg_core.c @@ -78,6 +78,27 @@ struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev, } EXPORT_SYMBOL(rpmsg_create_ept); + +/** + * rpmsg_get_rproc_name() - Return the name of the rproc for this device + * @rpdev: rpmsg channel device + * + * Expose the rproc name for clients who open the same channel across different + * rprocs and need to differentiate during their probe. + * + * Returns char string on success and NULL on failure. + */ +const char *rpmsg_get_rproc_name(struct rpmsg_device *rpdev) +{ + if (WARN_ON(!rpdev)) + return NULL; + + if (!rpdev->ops->get_rproc_name) + return NULL; + + return rpdev->ops->get_rproc_name(rpdev); +} + /** * rpmsg_destroy_ept() - destroy an existing rpmsg endpoint * @ept: endpoing to destroy diff --git a/drivers/rpmsg/rpmsg_internal.h b/drivers/rpmsg/rpmsg_internal.h index 0cf9c7e2ee83..83a028b6883f 100644 --- a/drivers/rpmsg/rpmsg_internal.h +++ b/drivers/rpmsg/rpmsg_internal.h @@ -31,6 +31,7 @@ * @create_ept: create backend-specific endpoint, requried * @announce_create: announce presence of new channel, optional * @announce_destroy: announce destruction of channel, optional + * @get_rproc_name: return name of the rproc for this device, optional * * Indirection table for the operations that a rpmsg backend should implement. * @announce_create and @announce_destroy are optional as the backend might @@ -43,6 +44,8 @@ struct rpmsg_device_ops { int (*announce_create)(struct rpmsg_device *ept); int (*announce_destroy)(struct rpmsg_device *ept); + + const char *(*get_rproc_name)(struct rpmsg_device *rpdev); }; /** diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h index 10d6ae8bbb7d..167982dc5b4f 100644 --- a/include/linux/rpmsg.h +++ b/include/linux/rpmsg.h @@ -160,6 +160,8 @@ int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, unsigned int rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp, poll_table *wait); +const char *rpmsg_get_rproc_name(struct rpmsg_device *dev); + #else static inline int register_rpmsg_device(struct rpmsg_device *dev) @@ -267,6 +269,14 @@ static inline unsigned int rpmsg_poll(struct rpmsg_endpoint *ept, return 0; } +static inline const char *rpmsg_get_rproc_name(struct rpmsg_device *rpdev) +{ + /* This shouldn't be possible */ + WARN_ON(1); + + return NULL; +} + #endif /* IS_ENABLED(CONFIG_RPMSG) */ /* use a macro to avoid include chaining to get THIS_MODULE */
Add support for client's to query the edge name their channel is registered for. This is useful for clients who share the same channel identifier across different remote procs. Signed-off-by: Chris Lew <clew@codeaurora.org> --- drivers/rpmsg/rpmsg_core.c | 21 +++++++++++++++++++++ drivers/rpmsg/rpmsg_internal.h | 3 +++ include/linux/rpmsg.h | 10 ++++++++++ 3 files changed, 34 insertions(+)