diff --git a/docs/rpmsg-design.md b/docs/rpmsg-design.md index 2c80afb01..d34ec1008 100644 --- a/docs/rpmsg-design.md +++ b/docs/rpmsg-design.md @@ -152,6 +152,13 @@ running on two processors. void (*rpmsg_ns_unbind_cb)(struct rpmsg_device *rdev, const char *name, uint32_t dest) ``` +* RPMsg endpoint name service binding callback. If user defines such callback, + when there is a name service announcement arrives, if there is a registered + endpoint found to bind to this name service, it will call this callback to + notify the user application about the remote has created the service.: + ``` + void (*rpmsg_ns_bind_cb)(struct rpmsg_endpoint *ept) + ``` * RPMsg endpoint name service unbind callback. If user defines such callback, when there is name service destroy arrives, it will call this callback to notify the user application about the remote has destroyed the service.: diff --git a/lib/include/openamp/rpmsg.h b/lib/include/openamp/rpmsg.h index 64678cfc5..4d0215f87 100644 --- a/lib/include/openamp/rpmsg.h +++ b/lib/include/openamp/rpmsg.h @@ -62,6 +62,8 @@ typedef void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev, * @dest_addr: address of the default remote endpoint binded. * @cb: user rx callback, return value of this callback is reserved * for future use, for now, only allow RPMSG_SUCCESS as return value. + * @ns_bind_cb: end point service bind callback, called when remote + * ept address is received. * @ns_unbind_cb: end point service unbind callback, called when remote * ept is destroyed. * @node: end point node. @@ -76,6 +78,7 @@ struct rpmsg_endpoint { uint32_t addr; uint32_t dest_addr; rpmsg_ept_cb cb; + rpmsg_ns_unbind_cb ns_bind_cb; rpmsg_ns_unbind_cb ns_unbind_cb; struct metal_list node; void *priv; diff --git a/lib/rpmsg/rpmsg_virtio.c b/lib/rpmsg/rpmsg_virtio.c index cab72e685..c5bf70b87 100644 --- a/lib/rpmsg/rpmsg_virtio.c +++ b/lib/rpmsg/rpmsg_virtio.c @@ -660,6 +660,9 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, } else { _ept->dest_addr = dest; metal_mutex_release(&rdev->lock); + /* notify application the endpoint has been bound */ + if (_ept->ns_bind_cb) + _ept->ns_bind_cb(_ept); } }