0008-ns-acknowledge-the-received-creation-message.patch 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. From 3ea08a8002de5e4992bed32567ecb05c887f31be Mon Sep 17 00:00:00 2001
  2. From: Xiang Xiao <xiaoxiang@xiaomi.com>
  3. Date: Mon, 7 Jan 2019 02:15:42 +0800
  4. Subject: [PATCH 08/10] ns: acknowledge the received creation message
  5. the two phase handsake make the client could initiate the transfer
  6. immediately without the server side send any dummy message first.
  7. Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
  8. ---
  9. lib/include/openamp/rpmsg.h | 1 +
  10. lib/include/openamp/rpmsg_virtio.h | 1 +
  11. lib/rpmsg/rpmsg.c | 7 +++++--
  12. lib/rpmsg/rpmsg_internal.h | 4 ++--
  13. lib/rpmsg/rpmsg_virtio.c | 12 +++++++++---
  14. 5 files changed, 18 insertions(+), 7 deletions(-)
  15. diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
  16. index 0b46ee1..318acd1 100644
  17. --- a/lib/include/openamp/rpmsg.h
  18. +++ open-amp/lib/include/openamp/rpmsg.h
  19. @@ -127,6 +127,7 @@ struct rpmsg_device {
  20. rpmsg_ns_bind_cb ns_bind_cb;
  21. struct rpmsg_device_ops ops;
  22. bool support_ns;
  23. + bool support_ack;
  24. };
  25. /**
  26. diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
  27. index 2209a48..e6e5fa2 100644
  28. --- a/lib/include/openamp/rpmsg_virtio.h
  29. +++ open-amp/lib/include/openamp/rpmsg_virtio.h
  30. @@ -28,6 +28,7 @@ extern "C" {
  31. /* The feature bitmap for virtio rpmsg */
  32. #define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */
  33. +#define VIRTIO_RPMSG_F_ACK 1 /* RP supports name service acknowledge */
  34. /**
  35. * struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers
  36. diff --git a/lib/rpmsg/rpmsg.c open-amp/lib/rpmsg/rpmsg.c
  37. index 0a8de1b..0cc80da 100644
  38. --- a/lib/rpmsg/rpmsg.c
  39. +++ open-amp/lib/rpmsg/rpmsg.c
  40. @@ -297,10 +297,13 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
  41. rpmsg_init_ept(ept, rdev, name, addr, dest, cb, unbind_cb);
  42. - if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) {
  43. + if (ept->name[0]) {
  44. /* Send NS announcement to remote processor */
  45. metal_mutex_release(&rdev->lock);
  46. - status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
  47. + if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY)
  48. + status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
  49. + else if (rdev->support_ack && ept->dest_addr != RPMSG_ADDR_ANY)
  50. + status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE_ACK);
  51. metal_mutex_acquire(&rdev->lock);
  52. if (status)
  53. rpmsg_unregister_endpoint(ept);
  54. diff --git a/lib/rpmsg/rpmsg_internal.h open-amp/lib/rpmsg/rpmsg_internal.h
  55. index 3db6b24..d513a56 100644
  56. --- a/lib/rpmsg/rpmsg_internal.h
  57. +++ open-amp/lib/rpmsg/rpmsg_internal.h
  58. @@ -44,12 +44,12 @@ extern "C" {
  59. *
  60. * @RPMSG_NS_CREATE: a new remote service was just created
  61. * @RPMSG_NS_DESTROY: a known remote service was just destroyed
  62. - * @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting
  63. - * acknowledgment.
  64. + * @RPMSG_NS_CREATE_ACK: acknowledge the previous creation message
  65. */
  66. enum rpmsg_ns_flags {
  67. RPMSG_NS_CREATE = 0,
  68. RPMSG_NS_DESTROY = 1,
  69. + RPMSG_NS_CREATE_ACK = 2,
  70. };
  71. /**
  72. diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
  73. index 195189d..9988a1e 100644
  74. --- a/lib/rpmsg/rpmsg_virtio.c
  75. +++ open-amp/lib/rpmsg/rpmsg_virtio.c
  76. @@ -586,13 +586,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
  77. metal_mutex_acquire(&rdev->lock);
  78. _ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest);
  79. - if (ns_msg->flags & RPMSG_NS_DESTROY) {
  80. + if (ns_msg->flags == RPMSG_NS_DESTROY) {
  81. if (_ept)
  82. _ept->dest_addr = RPMSG_ADDR_ANY;
  83. metal_mutex_release(&rdev->lock);
  84. if (_ept && _ept->ns_unbind_cb)
  85. _ept->ns_unbind_cb(ept);
  86. - } else {
  87. + } else if (ns_msg->flags == RPMSG_NS_CREATE) {
  88. if (!_ept) {
  89. /*
  90. * send callback to application, that can
  91. @@ -607,6 +607,11 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
  92. _ept->dest_addr = dest;
  93. metal_mutex_release(&rdev->lock);
  94. }
  95. + } else { /* RPMSG_NS_CREATE_ACK */
  96. + /* save the received destination address */
  97. + if (_ept)
  98. + _ept->dest_addr = dest;
  99. + metal_mutex_release(&rdev->lock);
  100. }
  101. return RPMSG_SUCCESS;
  102. @@ -659,6 +664,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
  103. #endif /*!VIRTIO_MASTER_ONLY*/
  104. vdev->features = rpmsg_virtio_get_features(rvdev);
  105. rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS));
  106. + rdev->support_ack = !!(vdev->features & (1 << VIRTIO_RPMSG_F_ACK));
  107. #ifndef VIRTIO_SLAVE_ONLY
  108. if (role == RPMSG_MASTER) {
  109. @@ -754,7 +760,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
  110. * Create name service announcement endpoint if device supports name
  111. * service announcement feature.
  112. */
  113. - if (rdev->support_ns) {
  114. + if (rdev->support_ns || rdev->support_ack) {
  115. rpmsg_init_ept(&rdev->ns_ept, rdev, "NS",
  116. RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
  117. rpmsg_virtio_ns_callback, NULL);
  118. --
  119. 2.17.1