Skip to content

Commit e5c31ec

Browse files
ns: acknowledge the received creation message
the two phase handsake make the client could initiate the transfer immediately without the server side send any dummy message first. Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
1 parent afed3bd commit e5c31ec

5 files changed

Lines changed: 20 additions & 6 deletions

File tree

lib/include/openamp/rpmsg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ struct rpmsg_device {
123123
rpmsg_ns_bind_cb ns_unbind_cb;
124124
struct rpmsg_device_ops ops;
125125
bool support_ns;
126+
bool support_ack;
126127
};
127128

128129
/**

lib/include/openamp/rpmsg_virtio.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extern "C" {
2828

2929
/* The feature bitmap for virtio rpmsg */
3030
#define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */
31+
#define VIRTIO_RPMSG_F_ACK 1 /* RP supports name service acknowledge */
3132

3233
/**
3334
* struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers

lib/rpmsg/rpmsg.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,13 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
302302
rpmsg_register_endpoint(rdev, ept, name, addr, dest, cb, unbind_cb);
303303
metal_mutex_release(&rdev->lock);
304304

305-
/* Send NS announcement to remote processor */
305+
/* Send NS announcement/acknowledge to remote processor */
306306
if (ept->name[0] && rdev->support_ns &&
307307
ept->dest_addr == RPMSG_ADDR_ANY)
308308
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
309+
else if (ept->name[0] && rdev->support_ack &&
310+
ept->dest_addr != RPMSG_ADDR_ANY)
311+
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE_ACK);
309312

310313
if (status)
311314
rpmsg_unregister_endpoint(ept);

lib/rpmsg/rpmsg_internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ extern "C" {
3939
*
4040
* @RPMSG_NS_CREATE: a new remote service was just created
4141
* @RPMSG_NS_DESTROY: a known remote service was just destroyed
42-
* @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting
43-
* acknowledgment.
42+
* @RPMSG_NS_CREATE_ACK: acknowledge the previous creation message
4443
*/
4544
enum rpmsg_ns_flags {
4645
RPMSG_NS_CREATE = 0,
4746
RPMSG_NS_DESTROY = 1,
47+
RPMSG_NS_CREATE_ACK = 2,
4848
};
4949

5050
/**

lib/rpmsg/rpmsg_virtio.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -579,15 +579,15 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
579579
metal_mutex_acquire(&rdev->lock);
580580
_ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest);
581581

582-
if (ns_msg->flags & RPMSG_NS_DESTROY) {
582+
if (ns_msg->flags == RPMSG_NS_DESTROY) {
583583
if (_ept)
584584
_ept->dest_addr = RPMSG_ADDR_ANY;
585585
metal_mutex_release(&rdev->lock);
586586
if (_ept && _ept->ns_unbind_cb)
587587
_ept->ns_unbind_cb(_ept);
588588
if (rdev->ns_unbind_cb)
589589
rdev->ns_unbind_cb(rdev, name, dest);
590-
} else {
590+
} else if (ns_msg->flags == RPMSG_NS_CREATE) {
591591
if (!_ept) {
592592
/*
593593
* send callback to application, that can
@@ -601,7 +601,15 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
601601
} else {
602602
_ept->dest_addr = dest;
603603
metal_mutex_release(&rdev->lock);
604+
if (_ept->name[0] && rdev->support_ack)
605+
rpmsg_send_ns_message(_ept,
606+
RPMSG_NS_CREATE_ACK);
604607
}
608+
} else { /* RPMSG_NS_CREATE_ACK */
609+
/* save the received destination address */
610+
if (_ept)
611+
_ept->dest_addr = dest;
612+
metal_mutex_release(&rdev->lock);
605613
}
606614

607615
return RPMSG_SUCCESS;
@@ -682,6 +690,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
682690
#endif /*!VIRTIO_DRIVER_ONLY*/
683691
vdev->features = rpmsg_virtio_get_features(rvdev);
684692
rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS));
693+
rdev->support_ack = !!(vdev->features & (1 << VIRTIO_RPMSG_F_ACK));
685694

686695
#ifndef VIRTIO_DEVICE_ONLY
687696
if (role == RPMSG_HOST) {
@@ -777,7 +786,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
777786
* Create name service announcement endpoint if device supports name
778787
* service announcement feature.
779788
*/
780-
if (rdev->support_ns) {
789+
if (rdev->support_ns || rdev->support_ack) {
781790
rpmsg_register_endpoint(rdev, &rdev->ns_ept, "NS",
782791
RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
783792
rpmsg_virtio_ns_callback, NULL);

0 commit comments

Comments
 (0)