Skip to content

Commit ef89230

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 83f2b72 commit ef89230

5 files changed

Lines changed: 18 additions & 7 deletions

File tree

lib/include/openamp/rpmsg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ struct rpmsg_device {
107107
rpmsg_ns_bind_cb ns_bind_cb;
108108
struct rpmsg_device_ops ops;
109109
bool support_ns;
110+
bool support_ack;
110111
};
111112

112113
/**

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: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,13 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
227227
rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb);
228228
rpmsg_register_endpoint(rdev, ept);
229229

230-
if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) {
230+
if (ept->name[0]) {
231231
/* Send NS announcement to remote processor */
232232
metal_mutex_release(&rdev->lock);
233-
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
233+
if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY)
234+
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
235+
else if (rdev->support_ack && ept->dest_addr != RPMSG_ADDR_ANY)
236+
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE_ACK);
234237
metal_mutex_acquire(&rdev->lock);
235238
if (status)
236239
rpmsg_unregister_endpoint(ept);

lib/rpmsg/rpmsg_internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ extern "C" {
4141
*
4242
* @RPMSG_NS_CREATE: a new remote service was just created
4343
* @RPMSG_NS_DESTROY: a known remote service was just destroyed
44-
* @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting
45-
* acknowledgment.
44+
* @RPMSG_NS_CREATE_ACK: acknowledge the previous creation message
4645
*/
4746
enum rpmsg_ns_flags {
4847
RPMSG_NS_CREATE = 0,
4948
RPMSG_NS_DESTROY = 1,
49+
RPMSG_NS_CREATE_ACK = 2,
5050
};
5151

5252
/**

lib/rpmsg/rpmsg_virtio.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -470,13 +470,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
470470
metal_mutex_acquire(&rdev->lock);
471471
_ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest);
472472

473-
if (ns_msg->flags & RPMSG_NS_DESTROY) {
473+
if (ns_msg->flags == RPMSG_NS_DESTROY) {
474474
if (_ept)
475475
_ept->dest_addr = RPMSG_ADDR_ANY;
476476
metal_mutex_release(&rdev->lock);
477477
if (_ept && _ept->ns_unbind_cb)
478478
_ept->ns_unbind_cb(ept);
479-
} else {
479+
} else if (ns_msg->flags == RPMSG_NS_CREATE) {
480480
if (!_ept) {
481481
/*
482482
* send callback to application, that can
@@ -491,6 +491,11 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
491491
_ept->dest_addr = dest;
492492
metal_mutex_release(&rdev->lock);
493493
}
494+
} else { /* RPMSG_NS_CREATE_ACK */
495+
/* save the received destination address */
496+
if (_ept)
497+
_ept->dest_addr = dest;
498+
metal_mutex_release(&rdev->lock);
494499
}
495500

496501
return RPMSG_SUCCESS;
@@ -539,6 +544,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
539544
#endif /*!VIRTIO_MASTER_ONLY*/
540545
vdev->features = rpmsg_virtio_get_features(rvdev);
541546
rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS));
547+
rdev->support_ack = !!(vdev->features & (1 << VIRTIO_RPMSG_F_ACK));
542548

543549
#ifndef VIRTIO_SLAVE_ONLY
544550
if (role == RPMSG_MASTER) {
@@ -634,7 +640,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
634640
* Create name service announcement endpoint if device supports name
635641
* service announcement feature.
636642
*/
637-
if (rdev->support_ns) {
643+
if (rdev->support_ns || rdev->support_ack) {
638644
rpmsg_init_ept(&rdev->ns_ept, "NS",
639645
RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
640646
rpmsg_virtio_ns_callback, NULL);

0 commit comments

Comments
 (0)