Skip to content

Commit

Permalink
ns: acknowledge the received creation message
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
xiaoxiang781216 committed May 16, 2020
1 parent 20292c5 commit d1702cc
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 14 deletions.
1 change: 1 addition & 0 deletions lib/include/openamp/rpmsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ struct rpmsg_device {
rpmsg_ns_bind_cb ns_bind_cb;
struct rpmsg_device_ops ops;
bool support_ns;
bool support_ack;
};

/**
Expand Down
1 change: 1 addition & 0 deletions lib/include/openamp/rpmsg_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ extern "C" {

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

/**
* struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers
Expand Down
22 changes: 13 additions & 9 deletions lib/rpmsg/rpmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,12 @@ static void rpmsg_unregister_endpoint(struct rpmsg_endpoint *ept)

rdev = ept->rdev;

metal_mutex_acquire(&rdev->lock);
if (ept->addr != RPMSG_ADDR_ANY)
rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE,
ept->addr);
metal_list_del(&ept->node);
metal_mutex_release(&rdev->lock);
}

void rpmsg_register_endpoint(struct rpmsg_device *rdev,
Expand Down Expand Up @@ -230,15 +232,19 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,

rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb);
rpmsg_register_endpoint(rdev, ept);
metal_mutex_release(&rdev->lock);

if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) {
/* Send NS announcement to remote processor */
metal_mutex_release(&rdev->lock);
/* Send NS announcement/acknowledge to remote processor */
if (ept->name[0] && rdev->support_ns &&
ept->dest_addr == RPMSG_ADDR_ANY)
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
metal_mutex_acquire(&rdev->lock);
if (status)
rpmsg_unregister_endpoint(ept);
}
else if (ept->name[0] && rdev->support_ack &&
ept->dest_addr != RPMSG_ADDR_ANY)
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE_ACK);

if (status)
rpmsg_unregister_endpoint(ept);
return status;

ret_status:
metal_mutex_release(&rdev->lock);
Expand All @@ -263,7 +269,5 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept)
rdev = ept->rdev;
if (ept->name[0] && rdev->support_ns && ept->addr != RPMSG_NS_EPT_ADDR)
(void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY);
metal_mutex_acquire(&rdev->lock);
rpmsg_unregister_endpoint(ept);
metal_mutex_release(&rdev->lock);
}
4 changes: 2 additions & 2 deletions lib/rpmsg/rpmsg_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ extern "C" {
*
* @RPMSG_NS_CREATE: a new remote service was just created
* @RPMSG_NS_DESTROY: a known remote service was just destroyed
* @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting
* acknowledgment.
* @RPMSG_NS_CREATE_ACK: acknowledge the previous creation message
*/
enum rpmsg_ns_flags {
RPMSG_NS_CREATE = 0,
RPMSG_NS_DESTROY = 1,
RPMSG_NS_CREATE_ACK = 2,
};

/**
Expand Down
12 changes: 9 additions & 3 deletions lib/rpmsg/rpmsg_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -471,13 +471,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
metal_mutex_acquire(&rdev->lock);
_ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest);

if (ns_msg->flags & RPMSG_NS_DESTROY) {
if (ns_msg->flags == RPMSG_NS_DESTROY) {
if (_ept)
_ept->dest_addr = RPMSG_ADDR_ANY;
metal_mutex_release(&rdev->lock);
if (_ept && _ept->ns_unbind_cb)
_ept->ns_unbind_cb(ept);
} else {
} else if (ns_msg->flags == RPMSG_NS_CREATE) {
if (!_ept) {
/*
* send callback to application, that can
Expand All @@ -492,6 +492,11 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
_ept->dest_addr = dest;
metal_mutex_release(&rdev->lock);
}
} else { /* RPMSG_NS_CREATE_ACK */
/* save the received destination address */
if (_ept)
_ept->dest_addr = dest;
metal_mutex_release(&rdev->lock);
}

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

#ifndef VIRTIO_SLAVE_ONLY
if (role == RPMSG_MASTER) {
Expand Down Expand Up @@ -635,7 +641,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
* Create name service announcement endpoint if device supports name
* service announcement feature.
*/
if (rdev->support_ns) {
if (rdev->support_ns || rdev->support_ack) {
rpmsg_init_ept(&rdev->ns_ept, "NS",
RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
rpmsg_virtio_ns_callback, NULL);
Expand Down

0 comments on commit d1702cc

Please sign in to comment.