Skip to content

Commit d1702cc

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 20292c5 commit d1702cc

5 files changed

Lines changed: 26 additions & 14 deletions

File tree

lib/include/openamp/rpmsg.h

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

113114
/**

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: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,12 @@ static void rpmsg_unregister_endpoint(struct rpmsg_endpoint *ept)
183183

184184
rdev = ept->rdev;
185185

186+
metal_mutex_acquire(&rdev->lock);
186187
if (ept->addr != RPMSG_ADDR_ANY)
187188
rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE,
188189
ept->addr);
189190
metal_list_del(&ept->node);
191+
metal_mutex_release(&rdev->lock);
190192
}
191193

192194
void rpmsg_register_endpoint(struct rpmsg_device *rdev,
@@ -230,15 +232,19 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
230232

231233
rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb);
232234
rpmsg_register_endpoint(rdev, ept);
235+
metal_mutex_release(&rdev->lock);
233236

234-
if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) {
235-
/* Send NS announcement to remote processor */
236-
metal_mutex_release(&rdev->lock);
237+
/* Send NS announcement/acknowledge to remote processor */
238+
if (ept->name[0] && rdev->support_ns &&
239+
ept->dest_addr == RPMSG_ADDR_ANY)
237240
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
238-
metal_mutex_acquire(&rdev->lock);
239-
if (status)
240-
rpmsg_unregister_endpoint(ept);
241-
}
241+
else if (ept->name[0] && rdev->support_ack &&
242+
ept->dest_addr != RPMSG_ADDR_ANY)
243+
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE_ACK);
244+
245+
if (status)
246+
rpmsg_unregister_endpoint(ept);
247+
return status;
242248

243249
ret_status:
244250
metal_mutex_release(&rdev->lock);
@@ -263,7 +269,5 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept)
263269
rdev = ept->rdev;
264270
if (ept->name[0] && rdev->support_ns && ept->addr != RPMSG_NS_EPT_ADDR)
265271
(void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY);
266-
metal_mutex_acquire(&rdev->lock);
267272
rpmsg_unregister_endpoint(ept);
268-
metal_mutex_release(&rdev->lock);
269273
}

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
@@ -471,13 +471,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
471471
metal_mutex_acquire(&rdev->lock);
472472
_ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest);
473473

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

497502
return RPMSG_SUCCESS;
@@ -540,6 +545,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
540545
#endif /*!VIRTIO_MASTER_ONLY*/
541546
vdev->features = rpmsg_virtio_get_features(rvdev);
542547
rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS));
548+
rdev->support_ack = !!(vdev->features & (1 << VIRTIO_RPMSG_F_ACK));
543549

544550
#ifndef VIRTIO_SLAVE_ONLY
545551
if (role == RPMSG_MASTER) {
@@ -635,7 +641,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
635641
* Create name service announcement endpoint if device supports name
636642
* service announcement feature.
637643
*/
638-
if (rdev->support_ns) {
644+
if (rdev->support_ns || rdev->support_ack) {
639645
rpmsg_init_ept(&rdev->ns_ept, "NS",
640646
RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
641647
rpmsg_virtio_ns_callback, NULL);

0 commit comments

Comments
 (0)