You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2024/10/09 15:33:05 UTC

(nuttx) branch master updated (264252497c -> 89c49c53a7)

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


    from 264252497c pm: fix pm_wakelock_uninit api block, wd api need irq not disabled
     new 8b4376683a openamp: sync the openamp and libmetal to the last commit
     new ef67a866f3 openamp: replace VIRTIO_DRIVER/DEVICE_ONLY to VIRTIO_DRIVER/DEVICE_SUPPORT
     new 2bc9256684 openamp/libmetal.defs: fix OpenAMP upgrade err
     new 8e799ff823 rpmsg: upgrade API passing on parameters with the upgrade of OpenAMP
     new 5aeb644bc5 virtio: adapt to the new OpenAMP
     new 1b24139020 virtio-pci/mmio: Features change to 64 bit in all virtio_dispatch and fix compile warning
     new 60ab9ae37e virtio_9p.c: fix compile error in OpenAMP upgrade feature reflow to dev
     new 0b1f45d600 rptun: rptun implements notify_wait through rvdev->notify_wait_cb
     new 89c49c53a7 virtio-mmio/pci: add alloc_buf/free_buf for mmio and pci transport layer

The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 drivers/misc/rpmsgblk.c                            |   2 +-
 drivers/rpmsg/rpmsg.c                              |  12 -
 drivers/rpmsg/rpmsg_port.c                         |  59 +-
 drivers/rpmsg/rpmsg_router_edge.c                  |  59 +-
 drivers/rpmsg/rpmsg_router_hub.c                   |   8 +-
 drivers/rpmsg/rpmsg_virtio.c                       |  20 +-
 drivers/rptun/rptun.c                              |  23 +-
 drivers/virtio/virtio-blk.c                        |   4 +-
 drivers/virtio/virtio-gpu.c                        |   2 +-
 drivers/virtio/virtio-input.c                      |   2 +-
 drivers/virtio/virtio-mmio.c                       |  64 ++-
 drivers/virtio/virtio-net.c                        |   4 +-
 drivers/virtio/virtio-pci-legacy.c                 |  16 +-
 drivers/virtio/virtio-pci-modern.c                 |  22 +-
 drivers/virtio/virtio-pci.c                        |  39 +-
 drivers/virtio/virtio-pci.h                        |   7 +-
 drivers/virtio/virtio-rng.c                        |   2 +-
 drivers/virtio/virtio-rpmb.c                       |   2 +-
 drivers/virtio/virtio-serial.c                     |   2 +-
 drivers/virtio/virtio-snd.c                        |   4 +-
 drivers/virtio/virtio.c                            |  42 --
 fs/rpmsgfs/rpmsgfs_server.c                        |   4 +-
 fs/v9fs/virtio_9p.c                                |   4 +-
 include/nuttx/rpmsg/rpmsg.h                        |   7 -
 include/nuttx/virtio/virtio.h                      |  29 +-
 openamp/0001-lib-errno.h-fix-compile-error.patch   |  29 +
 ...etal-add-metal_list_for_each_safe-support.patch |  28 -
 ...acknowledge-the-received-creation-message.patch |  95 ++-
 ...otiate-individual-buffer-size-dynamically.patch | 130 ++---
 ...mic-enable-64-bit-atomic-by-toolchain-bu.patch} |  21 +-
 ...ttx-io.c-align-access-when-read-write-siz.patch |  57 --
 openamp/0003-atomic.h-fix-compiler-error.patch     |  52 ++
 ...ttx-io.c-Fix-void-pointer-arithmetic-in-a.patch |  36 --
 ...y-the-user-when-the-remote-address-is-rec.patch |  75 +++
 ...-nuttx-fix-unused-parameter-compile-error.patch | 156 +++++
 ...4-openamp-add-new-ops-notify_wait-support.patch | 189 ------
 ...tio.h-negotiate_features-also-can-be-call.patch |  37 ++
 ...ake-set-HAVE_STDATOMIC_H-default-true-in-.patch |  41 ++
 ...rpmsg_virtio-change-sched_yeild-to-usleep.patch |  49 ++
 ...o-don-t-need-check-status-when-get_tx_pay.patch |  33 --
 ...nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch |  28 +
 ...y-the-user-when-the-remote-address-is-rec.patch |  68 ---
 ... 0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch} |  51 +-
 ...enamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch |  43 ++
 ...id-double-calling-ns_bound-when-each-othe.patch |  55 --
 ...make-all-elf_-functions-static-except-elf.patch | 195 -------
 ...o-don-t-need-check-status-when-get_tx_pay.patch |  39 ++
 ...claration-of-vring_rsc-shadows-a-previous.patch |  36 --
 ...p-get_rx_buffer-return_rx_buffer-to-resol.patch |  58 ++
 ...o.c-virtqueue_kick-after-all-rx-buffer-re.patch |  71 +++
 ...ptun-don-t-wait-issue-when-get-tx-patyloa.patch |  28 -
 ...-rpmsg_virtio_get_tx_buffer-no-idx-return.patch |  30 -
 ...ge-feature-to-64-bit-in-all-virtio_dispat.patch | 255 +++++++++
 ...sg-add-new-API-rpdev_release_tx-rx_buffer.patch | 100 ----
 ..._virtio.c-fix-get_tx_payload_buffer-error.patch |  33 ++
 ...namp-add-assert-when-get-tx-buffer-failed.patch |  29 +
 ...mp-add-error-log-when-ept-cb-return-error.patch |  33 --
 ...rpmsg-add-cache-flash-when-hold-rx-buffer.patch |  65 ---
 ....h-add-memory-operation-for-virtio-device.patch |  98 ++++
 ...-cache_invalidate-when-real-data-returned.patch |  28 -
 ...dd-new-API-rpmsg_virtio_get_rxbuffer_size.patch | 105 ----
 ...ow-virtio-1.2-spec-add-more-virtio-status.patch |  93 ---
 ...upling-the-transport-layer-and-virtio-dev.patch | 635 ---------------------
 ...9-virtio.h-add-version-in-device-id-table.patch |  28 -
 ...d-the-virtio_negotiate_features-interface.patch |  41 --
 openamp/CMakeLists.txt                             |   3 +-
 openamp/Kconfig                                    |  12 +-
 openamp/Makefile                                   |   3 +-
 openamp/libmetal.cmake                             |  16 +-
 openamp/libmetal.defs                              |  16 +-
 openamp/open-amp.cmake                             |  54 +-
 openamp/open-amp.defs                              |  48 +-
 72 files changed, 1529 insertions(+), 2335 deletions(-)
 create mode 100644 openamp/0001-lib-errno.h-fix-compile-error.patch
 delete mode 100644 openamp/0001-libmetal-add-metal_list_for_each_safe-support.patch
 rename openamp/{0004-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch => 0002-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch} (66%)
 delete mode 100644 openamp/0002-libmetal-nuttx-io.c-align-access-when-read-write-siz.patch
 create mode 100644 openamp/0003-atomic.h-fix-compiler-error.patch
 delete mode 100644 openamp/0003-libmetal-nuttx-io.c-Fix-void-pointer-arithmetic-in-a.patch
 create mode 100644 openamp/0003-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
 create mode 100644 openamp/0004-lib-system-nuttx-fix-unused-parameter-compile-error.patch
 delete mode 100644 openamp/0004-openamp-add-new-ops-notify_wait-support.patch
 create mode 100644 openamp/0004-openamp-virtio.h-negotiate_features-also-can-be-call.patch
 create mode 100644 openamp/0005-libmetal-cmake-set-HAVE_STDATOMIC_H-default-true-in-.patch
 create mode 100644 openamp/0005-remoteproc-rpmsg_virtio-change-sched_yeild-to-usleep.patch
 delete mode 100644 openamp/0005-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
 create mode 100644 openamp/0006-lib-system-nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch
 delete mode 100644 openamp/0006-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
 rename openamp/{0003-rpmsg-wait-endpoint-ready-in-rpmsg_send-and-rpmsg_se.patch => 0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch} (75%)
 create mode 100644 openamp/0007-openamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch
 delete mode 100644 openamp/0007-openamp-avoid-double-calling-ns_bound-when-each-othe.patch
 delete mode 100644 openamp/0008-remoteproc-make-all-elf_-functions-static-except-elf.patch
 create mode 100644 openamp/0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
 delete mode 100644 openamp/0009-Fix-warn-declaration-of-vring_rsc-shadows-a-previous.patch
 create mode 100644 openamp/0009-openamp-swap-get_rx_buffer-return_rx_buffer-to-resol.patch
 create mode 100644 openamp/0010-rpmsg_virtio.c-virtqueue_kick-after-all-rx-buffer-re.patch
 delete mode 100644 openamp/0010-rptun-fix-rptun-don-t-wait-issue-when-get-tx-patyloa.patch
 delete mode 100644 openamp/0011-rpmsg-fix-rpmsg_virtio_get_tx_buffer-no-idx-return.patch
 create mode 100644 openamp/0011-virtio-change-feature-to-64-bit-in-all-virtio_dispat.patch
 delete mode 100644 openamp/0012-rpmsg-add-new-API-rpdev_release_tx-rx_buffer.patch
 create mode 100644 openamp/0012-rpmsg_virtio.c-fix-get_tx_payload_buffer-error.patch
 create mode 100644 openamp/0013-openamp-add-assert-when-get-tx-buffer-failed.patch
 delete mode 100644 openamp/0013-openamp-add-error-log-when-ept-cb-return-error.patch
 delete mode 100644 openamp/0014-rpmsg-add-cache-flash-when-hold-rx-buffer.patch
 create mode 100644 openamp/0014-virtio.h-add-memory-operation-for-virtio-device.patch
 delete mode 100644 openamp/0015-rpmsg-do-cache_invalidate-when-real-data-returned.patch
 delete mode 100644 openamp/0016-openamp-add-new-API-rpmsg_virtio_get_rxbuffer_size.patch
 delete mode 100644 openamp/0017-virtio-follow-virtio-1.2-spec-add-more-virtio-status.patch
 delete mode 100644 openamp/0018-virtio-decoupling-the-transport-layer-and-virtio-dev.patch
 delete mode 100644 openamp/0019-virtio.h-add-version-in-device-id-table.patch
 delete mode 100644 openamp/0020-virtio-Add-the-virtio_negotiate_features-interface.patch


(nuttx) 06/09: virtio-pci/mmio: Features change to 64 bit in all virtio_dispatch and fix compile warning

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 1b24139020e17619ffbe1ad7784ac808d5c944b4
Author: Yongrong Wang <wa...@xiaomi.com>
AuthorDate: Wed Jul 10 21:02:42 2024 +0800

    virtio-pci/mmio: Features change to 64 bit in all virtio_dispatch and fix compile warning
    
    virtio/virtio-pci-legacy.c:399:48: warning: passing argument 2 of ‘pci_bus_write_io_dword’ makes integer from pointer without a cast [-Wint-con>
      399 |   pci_write_io_dword(vpdev->dev, vpdev->ioaddr + VIRTIO_PCI_GUEST_FEATURES,
          |                                                ^
          |                                                |
          |                                                void *
    /home/wyr/work/code/project/vela/nuttx/include/nuttx/pci/pci.h:559:65: note: expected ‘uintptr_t’ {aka ‘long unsigned int’} but argument is of >
      559 | int pci_bus_write_io_dword(FAR struct pci_bus_s *bus, uintptr_t where,
          |                                                       ~~~~~~~~~~^~~~~
    
    Signed-off-by: Yongrong Wang <wa...@xiaomi.com>
---
 drivers/virtio/virtio-mmio.c       | 26 +++++++++++++++++---------
 drivers/virtio/virtio-pci-legacy.c | 16 +++++++++++-----
 drivers/virtio/virtio-pci-modern.c | 22 ++++++++++++++--------
 drivers/virtio/virtio-pci.c        |  4 ++--
 drivers/virtio/virtio-pci.h        |  4 ++--
 include/nuttx/virtio/virtio.h      |  2 +-
 6 files changed, 47 insertions(+), 27 deletions(-)

diff --git a/drivers/virtio/virtio-mmio.c b/drivers/virtio/virtio-mmio.c
index b11756ef55..6caeb60f28 100644
--- a/drivers/virtio/virtio-mmio.c
+++ b/drivers/virtio/virtio-mmio.c
@@ -221,11 +221,11 @@ static void virtio_mmio_write_config(FAR struct virtio_device *vdev,
 static void virtio_mmio_read_config(FAR struct virtio_device *vdev,
                                     uint32_t offset, FAR void *dst,
                                     int length);
-static uint32_t virtio_mmio_get_features(FAR struct virtio_device *vdev);
+static uint64_t virtio_mmio_get_features(FAR struct virtio_device *vdev);
 static void virtio_mmio_set_features(FAR struct virtio_device *vdev,
-                                     uint32_t features);
-static uint32_t virtio_mmio_negotiate_features(struct virtio_device *vdev,
-                                               uint32_t features);
+                                     uint64_t features);
+static uint64_t virtio_mmio_negotiate_features(struct virtio_device *vdev,
+                                               uint64_t features);
 static void virtio_mmio_reset_device(FAR struct virtio_device *vdev);
 static void virtio_mmio_notify(FAR struct virtqueue *vq);
 
@@ -652,13 +652,18 @@ byte_read:
  * Name: virtio_mmio_get_features
  ****************************************************************************/
 
-static uint32_t virtio_mmio_get_features(FAR struct virtio_device *vdev)
+static uint64_t virtio_mmio_get_features(FAR struct virtio_device *vdev)
 {
   FAR struct virtio_mmio_device_s *vmdev =
     (FAR struct virtio_mmio_device_s *)vdev;
+  uint32_t feature_lo;
+  uint32_t feature_hi;
 
   metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 0);
-  return metal_io_read32(&vmdev->cfg_io, VIRTIO_MMIO_DEVICE_FEATURES);
+  feature_lo = metal_io_read32(&vmdev->cfg_io, VIRTIO_MMIO_DEVICE_FEATURES);
+  metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 1);
+  feature_hi = metal_io_read32(&vmdev->cfg_io, VIRTIO_MMIO_DEVICE_FEATURES);
+  return ((uint64_t)feature_hi << 32) | (uint64_t)feature_lo;
 }
 
 /****************************************************************************
@@ -666,13 +671,16 @@ static uint32_t virtio_mmio_get_features(FAR struct virtio_device *vdev)
  ****************************************************************************/
 
 static void virtio_mmio_set_features(FAR struct virtio_device *vdev,
-                                     uint32_t features)
+                                     uint64_t features)
 {
   FAR struct virtio_mmio_device_s *vmdev =
     (FAR struct virtio_mmio_device_s *)vdev;
 
   metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 0);
   metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES, features);
+  metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES_SEL, 1);
+  metal_io_write32(&vmdev->cfg_io, VIRTIO_MMIO_DRIVER_FEATURES,
+                   features >> 32);
   vdev->features = features;
 }
 
@@ -680,8 +688,8 @@ static void virtio_mmio_set_features(FAR struct virtio_device *vdev,
  * Name: virtio_mmio_negotiate_features
  ****************************************************************************/
 
-static uint32_t virtio_mmio_negotiate_features(struct virtio_device *vdev,
-                                               uint32_t features)
+static uint64_t virtio_mmio_negotiate_features(struct virtio_device *vdev,
+                                               uint64_t features)
 {
   features = features & virtio_mmio_get_features(vdev);
   virtio_mmio_set_features(vdev, features);
diff --git a/drivers/virtio/virtio-pci-legacy.c b/drivers/virtio/virtio-pci-legacy.c
index 40243c813e..2fa293298a 100644
--- a/drivers/virtio/virtio-pci-legacy.c
+++ b/drivers/virtio/virtio-pci-legacy.c
@@ -122,10 +122,10 @@ static void virtio_pci_legacy_write_config(FAR struct virtio_device *vdev,
 static void virtio_pci_legacy_read_config(FAR struct virtio_device *vdev,
                                           uint32_t offset, FAR void *dst,
                                           int length);
-static uint32_t
+static uint64_t
 virtio_pci_legacy_get_features(FAR struct virtio_device *vdev);
 static void virtio_pci_legacy_set_features(FAR struct virtio_device *vdev,
-                                           uint32_t features);
+                                           uint64_t features);
 static void virtio_pci_legacy_notify(FAR struct virtqueue *vq);
 
 /****************************************************************************
@@ -367,7 +367,7 @@ static void virtio_pci_legacy_read_config(FAR struct virtio_device *vdev,
  * Name: virtio_pci_legacy_get_features
  ****************************************************************************/
 
-static uint32_t
+static uint64_t
 virtio_pci_legacy_get_features(FAR struct virtio_device *vdev)
 {
   FAR struct virtio_pci_device_s *vpdev =
@@ -385,14 +385,20 @@ virtio_pci_legacy_get_features(FAR struct virtio_device *vdev)
  ****************************************************************************/
 
 static void virtio_pci_legacy_set_features(FAR struct virtio_device *vdev,
-                                           uint32_t features)
+                                           uint64_t features)
 {
   FAR struct virtio_pci_device_s *vpdev =
     (FAR struct virtio_pci_device_s *)vdev;
 
+  if ((features >> 32) != 0)
+    {
+      features = (uint64_t)((uint32_t)features);
+      vrtwarn("Virtio pci legacy not support feature bits larger than 32\n");
+    }
+
   pci_write_io_dword(vpdev->dev,
                      (uintptr_t)(vpdev->ioaddr + VIRTIO_PCI_GUEST_FEATURES),
-                     vdev->features);
+                     features);
   vdev->features = features;
 }
 
diff --git a/drivers/virtio/virtio-pci-modern.c b/drivers/virtio/virtio-pci-modern.c
index b3ea09db29..75451eda82 100644
--- a/drivers/virtio/virtio-pci-modern.c
+++ b/drivers/virtio/virtio-pci-modern.c
@@ -176,10 +176,10 @@ static void virtio_pci_modern_write_config(FAR struct virtio_device *vdev,
 static void virtio_pci_modern_read_config(FAR struct virtio_device *vdev,
                                           uint32_t offset, FAR void *dst,
                                           int length);
-static uint32_t
+static uint64_t
 virtio_pci_modern_get_features(FAR struct virtio_device *vdev);
 static void virtio_pci_modern_set_features(FAR struct virtio_device *vdev,
-                                           uint32_t features);
+                                           uint64_t features);
 static void virtio_pci_modern_notify(FAR struct virtqueue *vq);
 
 /****************************************************************************
@@ -560,17 +560,22 @@ static void virtio_pci_modern_read_config(FAR struct virtio_device *vdev,
  * Name: virtio_pci_modern_get_features
  ****************************************************************************/
 
-static uint32_t
+static uint64_t
 virtio_pci_modern_get_features(FAR struct virtio_device *vdev)
 {
   FAR struct virtio_pci_device_s *vpdev =
     (FAR struct virtio_pci_device_s *)vdev;
   FAR struct virtio_pci_common_cfg_s *cfg = vpdev->common;
-  uint32_t feature;
+  uint32_t feature_lo;
+  uint32_t feature_hi;
 
   pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature_select, 0);
-  pci_read_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature, &feature);
-  return feature;
+  pci_read_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature,
+                    &feature_lo);
+  pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature_select, 1);
+  pci_read_io_dword(vpdev->dev, (uintptr_t)&cfg->device_feature,
+                    &feature_hi);
+  return ((uint64_t)feature_hi << 32) | (uint64_t)feature_lo;
 }
 
 /****************************************************************************
@@ -578,7 +583,7 @@ virtio_pci_modern_get_features(FAR struct virtio_device *vdev)
  ****************************************************************************/
 
 static void virtio_pci_modern_set_features(FAR struct virtio_device *vdev,
-                                           uint32_t features)
+                                           uint64_t features)
 {
   FAR struct virtio_pci_device_s *vpdev =
     (FAR struct virtio_pci_device_s *)vdev;
@@ -587,7 +592,8 @@ static void virtio_pci_modern_set_features(FAR struct virtio_device *vdev,
   pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature_select, 0);
   pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature, features);
   pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature_select, 1);
-  pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature, 0);
+  pci_write_io_dword(vpdev->dev, (uintptr_t)&cfg->driver_feature,
+                     features >> 32);
   vdev->features = features;
 }
 
diff --git a/drivers/virtio/virtio-pci.c b/drivers/virtio/virtio-pci.c
index 126ecb36f7..5c8eafd241 100644
--- a/drivers/virtio/virtio-pci.c
+++ b/drivers/virtio/virtio-pci.c
@@ -448,9 +448,9 @@ void virtio_pci_delete_virtqueues(FAR struct virtio_device *vdev)
  * Name: virtio_pci_negotiate_features
  ****************************************************************************/
 
-uint32_t
+uint64_t
 virtio_pci_negotiate_features(FAR struct virtio_device *vdev,
-                                     uint32_t features)
+                              uint64_t features)
 {
   features = features & vdev->func->get_features(vdev);
   vdev->func->set_features(vdev, features);
diff --git a/drivers/virtio/virtio-pci.h b/drivers/virtio/virtio-pci.h
index 66a36f9342..67334f7b5e 100644
--- a/drivers/virtio/virtio-pci.h
+++ b/drivers/virtio/virtio-pci.h
@@ -108,9 +108,9 @@ struct virtio_pci_device_s
  ****************************************************************************/
 
 void virtio_pci_reset_device(FAR struct virtio_device *vdev);
-uint32_t
+uint64_t
 virtio_pci_negotiate_features(FAR struct virtio_device *vdev,
-                              uint32_t features);
+                              uint64_t features);
 int virtio_pci_create_virtqueues(FAR struct virtio_device *vdev,
                                  unsigned int flags,
                                  unsigned int nvqs,
diff --git a/include/nuttx/virtio/virtio.h b/include/nuttx/virtio/virtio.h
index 3f6b46f9e9..92f039af81 100644
--- a/include/nuttx/virtio/virtio.h
+++ b/include/nuttx/virtio/virtio.h
@@ -48,7 +48,7 @@
 /* Virtio helper functions */
 
 #define virtio_has_feature(vdev, fbit) \
-      (((vdev)->features & (1UL << (fbit))) != 0)
+      (((vdev)->features & (1ULL << (fbit))) != 0)
 
 #define virtio_read_config_member(vdev, structname, member, ptr) \
       virtio_read_config((vdev), offsetof(structname, member), \


(nuttx) 05/09: virtio: adapt to the new OpenAMP

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 5aeb644bc5d24493a5a8e63414d536b6f2eb9cce
Author: wangyongrong <wa...@xiaomi.com>
AuthorDate: Tue Jul 2 16:29:13 2024 +0800

    virtio: adapt to the new OpenAMP
    
    Sync all the virtio api usage to sync with new OpenAMP
    
    Signed-off-by: wangyongrong <wa...@xiaomi.com>
---
 drivers/rpmsg/rpmsg_virtio.c   | 6 ++++--
 drivers/virtio/virtio-blk.c    | 4 ++--
 drivers/virtio/virtio-gpu.c    | 2 +-
 drivers/virtio/virtio-input.c  | 2 +-
 drivers/virtio/virtio-mmio.c   | 6 ++++--
 drivers/virtio/virtio-net.c    | 4 ++--
 drivers/virtio/virtio-pci.c    | 3 ++-
 drivers/virtio/virtio-pci.h    | 3 ++-
 drivers/virtio/virtio-rng.c    | 2 +-
 drivers/virtio/virtio-rpmb.c   | 2 +-
 drivers/virtio/virtio-serial.c | 2 +-
 drivers/virtio/virtio-snd.c    | 4 ++--
 12 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/drivers/rpmsg/rpmsg_virtio.c b/drivers/rpmsg/rpmsg_virtio.c
index 1f8b1bb6f6..0de34a501f 100644
--- a/drivers/rpmsg/rpmsg_virtio.c
+++ b/drivers/rpmsg/rpmsg_virtio.c
@@ -79,7 +79,8 @@ static int rpmsg_virtio_create_virtqueues_(FAR struct virtio_device *vdev,
                                            unsigned int flags,
                                            unsigned int nvqs,
                                            FAR const char *names[],
-                                           vq_callback callbacks[]);
+                                           vq_callback callbacks[],
+                                           FAR void *callback_args[]);
 static uint8_t rpmsg_virtio_get_status_(FAR struct virtio_device *dev);
 static void rpmsg_virtio_set_status_(FAR struct virtio_device *dev,
                                      uint8_t status);
@@ -128,7 +129,8 @@ static int rpmsg_virtio_create_virtqueues_(FAR struct virtio_device *vdev,
                                            unsigned int flags,
                                            unsigned int nvqs,
                                            FAR const char *names[],
-                                           vq_callback callbacks[])
+                                           vq_callback callbacks[],
+                                           FAR void *callback_args[])
 {
   int ret;
   int i;
diff --git a/drivers/virtio/virtio-blk.c b/drivers/virtio/virtio-blk.c
index 81c5bbf991..b1211e8179 100644
--- a/drivers/virtio/virtio-blk.c
+++ b/drivers/virtio/virtio-blk.c
@@ -517,12 +517,12 @@ static int virtio_blk_init(FAR struct virtio_blk_priv_s *priv,
   virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER);
   virtio_negotiate_features(vdev, (1UL << VIRTIO_BLK_F_RO) |
                                   (1UL << VIRTIO_BLK_F_BLK_SIZE) |
-                                  (1UL << VIRTIO_BLK_F_FLUSH));
+                                  (1UL << VIRTIO_BLK_F_FLUSH), NULL);
   virtio_set_status(vdev, VIRTIO_CONFIG_FEATURES_OK);
 
   vqname[0]   = "virtio_blk_vq";
   callback[0] = virtio_blk_done;
-  ret = virtio_create_virtqueues(vdev, 0, 1, vqname, callback);
+  ret = virtio_create_virtqueues(vdev, 0, 1, vqname, callback, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);
diff --git a/drivers/virtio/virtio-gpu.c b/drivers/virtio/virtio-gpu.c
index 9b343f9570..5991f82239 100644
--- a/drivers/virtio/virtio-gpu.c
+++ b/drivers/virtio/virtio-gpu.c
@@ -256,7 +256,7 @@ static int virtio_gpu_init(FAR struct virtio_gpu_priv_s *priv,
   vqnames[VIRTIO_GPU_CTL]   = "virtio_gpu_ctl";
   callbacks[VIRTIO_GPU_CTL] = virtio_gpu_done;
   ret = virtio_create_virtqueues(vdev, 0, VIRTIO_GPU_NUM, vqnames,
-                                 callbacks);
+                                 callbacks, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d", ret);
diff --git a/drivers/virtio/virtio-input.c b/drivers/virtio/virtio-input.c
index a209ebfb3e..922230e01c 100644
--- a/drivers/virtio/virtio-input.c
+++ b/drivers/virtio/virtio-input.c
@@ -391,7 +391,7 @@ static int virtio_input_probe(FAR struct virtio_device *vdev)
   vqnames[VIRTIO_INPUT_EVENT] = "virtio_input_event";
   callbacks[VIRTIO_INPUT_EVENT] = virtio_input_recv_events;
   ret = virtio_create_virtqueues(vdev, 0, VIRTIO_INPUT_NUM, vqnames,
-                                 callbacks);
+                                 callbacks, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);
diff --git a/drivers/virtio/virtio-mmio.c b/drivers/virtio/virtio-mmio.c
index fde390595c..b11756ef55 100644
--- a/drivers/virtio/virtio-mmio.c
+++ b/drivers/virtio/virtio-mmio.c
@@ -209,7 +209,8 @@ static int virtio_mmio_create_virtqueues(FAR struct virtio_device *vdev,
                                          unsigned int flags,
                                          unsigned int nvqs,
                                          FAR const char *names[],
-                                         vq_callback callbacks[]);
+                                         vq_callback callbacks[],
+                                         FAR void *callback_args[]);
 static void virtio_mmio_delete_virtqueues(FAR struct virtio_device *vdev);
 static void virtio_mmio_set_status(FAR struct virtio_device *vdev,
                                    uint8_t status);
@@ -420,7 +421,8 @@ static int virtio_mmio_create_virtqueues(FAR struct virtio_device *vdev,
                                          unsigned int flags,
                                          unsigned int nvqs,
                                          FAR const char *names[],
-                                         vq_callback callbacks[])
+                                         vq_callback callbacks[],
+                                         FAR void *callback_args[])
 {
   FAR struct virtio_mmio_device_s *vmdev =
     (FAR struct virtio_mmio_device_s *)vdev;
diff --git a/drivers/virtio/virtio-net.c b/drivers/virtio/virtio-net.c
index e6c0552a47..ced5cff5b5 100644
--- a/drivers/virtio/virtio-net.c
+++ b/drivers/virtio/virtio-net.c
@@ -569,7 +569,7 @@ static int virtio_net_init(FAR struct virtio_net_priv_s *priv,
 
   virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER);
   virtio_negotiate_features(vdev, (1UL << VIRTIO_NET_F_MAC) |
-                                  (1UL << VIRTIO_F_ANY_LAYOUT));
+                                  (1UL << VIRTIO_F_ANY_LAYOUT), NULL);
   virtio_set_status(vdev, VIRTIO_CONFIG_FEATURES_OK);
 
   vqnames[VIRTIO_NET_RX]   = "virtio_net_rx";
@@ -577,7 +577,7 @@ static int virtio_net_init(FAR struct virtio_net_priv_s *priv,
   callbacks[VIRTIO_NET_RX] = virtio_net_rxready;
   callbacks[VIRTIO_NET_TX] = virtio_net_txdone;
   ret = virtio_create_virtqueues(vdev, 0, VIRTIO_NET_NUM, vqnames,
-                                 callbacks);
+                                 callbacks, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);
diff --git a/drivers/virtio/virtio-pci.c b/drivers/virtio/virtio-pci.c
index f1b904c713..126ecb36f7 100644
--- a/drivers/virtio/virtio-pci.c
+++ b/drivers/virtio/virtio-pci.c
@@ -343,7 +343,8 @@ int virtio_pci_create_virtqueues(FAR struct virtio_device *vdev,
                                  unsigned int flags,
                                  unsigned int nvqs,
                                  FAR const char *names[],
-                                 vq_callback callbacks[])
+                                 vq_callback callbacks[],
+                                 FAR void *callback_args[])
 {
   FAR struct virtio_pci_device_s *vpdev =
     (FAR struct virtio_pci_device_s *)vdev;
diff --git a/drivers/virtio/virtio-pci.h b/drivers/virtio/virtio-pci.h
index 2608a21a93..66a36f9342 100644
--- a/drivers/virtio/virtio-pci.h
+++ b/drivers/virtio/virtio-pci.h
@@ -115,7 +115,8 @@ int virtio_pci_create_virtqueues(FAR struct virtio_device *vdev,
                                  unsigned int flags,
                                  unsigned int nvqs,
                                  FAR const char *names[],
-                                 vq_callback callbacks[]);
+                                 vq_callback callbacks[],
+                                 FAR void *callback_args[]);
 void virtio_pci_delete_virtqueues(FAR struct virtio_device *vdev);
 
 int virtio_pci_modern_probe(FAR struct pci_device_s *dev);
diff --git a/drivers/virtio/virtio-rng.c b/drivers/virtio/virtio-rng.c
index 768cc239ef..a3e4501e7b 100644
--- a/drivers/virtio/virtio-rng.c
+++ b/drivers/virtio/virtio-rng.c
@@ -215,7 +215,7 @@ static int virtio_rng_probe(FAR struct virtio_device *vdev)
 
   vqnames[0]  = "virtio_rng_rx";
   callback[0] = virtio_rng_done;
-  ret = virtio_create_virtqueues(vdev, 0, 1, vqnames, callback);
+  ret = virtio_create_virtqueues(vdev, 0, 1, vqnames, callback, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);
diff --git a/drivers/virtio/virtio-rpmb.c b/drivers/virtio/virtio-rpmb.c
index b256228f24..f855ad063c 100644
--- a/drivers/virtio/virtio-rpmb.c
+++ b/drivers/virtio/virtio-rpmb.c
@@ -211,7 +211,7 @@ static int virtio_rpmb_init(FAR struct virtio_rpmb_priv_s *priv,
 
   vqname[0]   = "virtio_rpmb_vq";
   callback[0] = virtio_rpmb_done;
-  ret = virtio_create_virtqueues(vdev, 0, 1, vqname, callback);
+  ret = virtio_create_virtqueues(vdev, 0, 1, vqname, callback, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);
diff --git a/drivers/virtio/virtio-serial.c b/drivers/virtio/virtio-serial.c
index 78e1e03517..315a8acee4 100644
--- a/drivers/virtio/virtio-serial.c
+++ b/drivers/virtio/virtio-serial.c
@@ -505,7 +505,7 @@ static int virtio_serial_init(FAR struct virtio_serial_priv_s *priv,
   callbacks[VIRTIO_SERIAL_RX] = virtio_serial_rxready;
   callbacks[VIRTIO_SERIAL_TX] = virtio_serial_txdone;
   ret = virtio_create_virtqueues(vdev, 0, VIRTIO_SERIAL_NUM, vqnames,
-                                 callbacks);
+                                 callbacks, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);
diff --git a/drivers/virtio/virtio-snd.c b/drivers/virtio/virtio-snd.c
index b6cd429a56..959bafce1b 100644
--- a/drivers/virtio/virtio-snd.c
+++ b/drivers/virtio/virtio-snd.c
@@ -1090,8 +1090,8 @@ static int virtio_snd_init(FAR struct virtio_snd_s *priv)
   callbacks[VIRTIO_SND_VQ_TX] = virtio_snd_pcm_notify_cb;
   callbacks[VIRTIO_SND_VQ_RX] = virtio_snd_pcm_notify_cb;
 
-  ret = virtio_create_virtqueues(priv->vdev, 0,
-                                 VIRTIO_SND_VQ_MAX, vqnames, callbacks);
+  ret = virtio_create_virtqueues(priv->vdev, 0, VIRTIO_SND_VQ_MAX,
+                                 vqnames, callbacks, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);


(nuttx) 01/09: openamp: sync the openamp and libmetal to the last commit

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 8b4376683a679bd17ae6dfab00578d4d24a5d3fc
Author: Bowen Wang <wa...@xiaomi.com>
AuthorDate: Tue Oct 8 15:30:21 2024 +0800

    openamp: sync the openamp and libmetal to the last commit
    
    Upgrade the openamp is a troublesome thing, so diretly sync the
    open-amp and libmetal the newest commit.
    
    We can update the commit and remove the patch when this patch has
    been merged in the OpenAMP repo.
    
    Signed-off-by: Bowen Wang <wa...@xiaomi.com>
---
 openamp/0001-lib-errno.h-fix-compile-error.patch   |  29 +
 ...etal-add-metal_list_for_each_safe-support.patch |  28 -
 ...acknowledge-the-received-creation-message.patch |  95 ++-
 ...otiate-individual-buffer-size-dynamically.patch | 130 ++---
 ...mic-enable-64-bit-atomic-by-toolchain-bu.patch} |  21 +-
 ...ttx-io.c-align-access-when-read-write-siz.patch |  57 --
 openamp/0003-atomic.h-fix-compiler-error.patch     |  52 ++
 ...ttx-io.c-Fix-void-pointer-arithmetic-in-a.patch |  36 --
 ...y-the-user-when-the-remote-address-is-rec.patch |  75 +++
 ...-nuttx-fix-unused-parameter-compile-error.patch | 156 +++++
 ...4-openamp-add-new-ops-notify_wait-support.patch | 189 ------
 ...tio.h-negotiate_features-also-can-be-call.patch |  37 ++
 ...ake-set-HAVE_STDATOMIC_H-default-true-in-.patch |  41 ++
 ...rpmsg_virtio-change-sched_yeild-to-usleep.patch |  49 ++
 ...o-don-t-need-check-status-when-get_tx_pay.patch |  33 --
 ...nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch |  28 +
 ...y-the-user-when-the-remote-address-is-rec.patch |  68 ---
 ... 0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch} |  51 +-
 ...enamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch |  43 ++
 ...id-double-calling-ns_bound-when-each-othe.patch |  55 --
 ...make-all-elf_-functions-static-except-elf.patch | 195 -------
 ...o-don-t-need-check-status-when-get_tx_pay.patch |  39 ++
 ...claration-of-vring_rsc-shadows-a-previous.patch |  36 --
 ...p-get_rx_buffer-return_rx_buffer-to-resol.patch |  58 ++
 ...o.c-virtqueue_kick-after-all-rx-buffer-re.patch |  71 +++
 ...ptun-don-t-wait-issue-when-get-tx-patyloa.patch |  28 -
 ...-rpmsg_virtio_get_tx_buffer-no-idx-return.patch |  30 -
 ...ge-feature-to-64-bit-in-all-virtio_dispat.patch | 255 +++++++++
 ...sg-add-new-API-rpdev_release_tx-rx_buffer.patch | 100 ----
 ..._virtio.c-fix-get_tx_payload_buffer-error.patch |  33 ++
 ...namp-add-assert-when-get-tx-buffer-failed.patch |  29 +
 ...mp-add-error-log-when-ept-cb-return-error.patch |  33 --
 ...rpmsg-add-cache-flash-when-hold-rx-buffer.patch |  65 ---
 ....h-add-memory-operation-for-virtio-device.patch |  98 ++++
 ...-cache_invalidate-when-real-data-returned.patch |  28 -
 ...dd-new-API-rpmsg_virtio_get_rxbuffer_size.patch | 105 ----
 ...ow-virtio-1.2-spec-add-more-virtio-status.patch |  93 ---
 ...upling-the-transport-layer-and-virtio-dev.patch | 635 ---------------------
 ...9-virtio.h-add-version-in-device-id-table.patch |  28 -
 ...d-the-virtio_negotiate_features-interface.patch |  41 --
 openamp/CMakeLists.txt                             |   3 +-
 openamp/Makefile                                   |   3 +-
 openamp/libmetal.cmake                             |  16 +-
 openamp/libmetal.defs                              |  14 +-
 openamp/open-amp.cmake                             |  42 +-
 openamp/open-amp.defs                              |  36 +-
 46 files changed, 1286 insertions(+), 2101 deletions(-)

diff --git a/openamp/0001-lib-errno.h-fix-compile-error.patch b/openamp/0001-lib-errno.h-fix-compile-error.patch
new file mode 100644
index 0000000000..c7388325ac
--- /dev/null
+++ b/openamp/0001-lib-errno.h-fix-compile-error.patch
@@ -0,0 +1,29 @@
+From b7eaa824f0f660825a7c2d601940d59141fb4f83 Mon Sep 17 00:00:00 2001
+From: wangyongrong <wa...@xiaomi.com>
+Date: Tue, 2 Jul 2024 10:27:44 +0800
+Subject: [PATCH 1/5] lib/errno.h: fix compile error
+
+lib/errno.h: delete defined(__arm__) for use GCC compile
+
+Change-Id: I00f93740810c1cb8875fc2e27bac478aecaf28d5
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
+---
+ lib/errno.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/errno.h libmetal/lib/errno.h
+index 2fc4f77..e84a2bc 100644
+--- a/lib/errno.h
++++ libmetal/lib/errno.h
+@@ -14,7 +14,7 @@
+ 
+ #if defined(__ICCARM__)
+ # include <metal/compiler/iar/errno.h>
+-#elif defined(__CC_ARM) || defined(__arm__)
++#elif defined(__CC_ARM)
+ # include <metal/compiler/armcc/errno.h>
+ #else
+ # include <errno.h>
+-- 
+2.34.1
+
diff --git a/openamp/0001-libmetal-add-metal_list_for_each_safe-support.patch b/openamp/0001-libmetal-add-metal_list_for_each_safe-support.patch
deleted file mode 100644
index 11d126501a..0000000000
--- a/openamp/0001-libmetal-add-metal_list_for_each_safe-support.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From f06b90cdc478124eba45b3be4f3630e8a729c51b Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Tue, 25 Jul 2023 14:25:58 +0800
-Subject: [PATCH] libmetal: add metal_list_for_each_safe() support
-
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/list.h | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/lib/list.h libmetal/lib/list.h
-index eb0e7b3..3e8d17f 100644
---- a/lib/list.h
-+++ libmetal/lib/list.h
-@@ -98,6 +98,10 @@ static inline struct metal_list *metal_list_first(struct metal_list *list)
- 	     (node) != (list);			\
- 	     (node) = (node)->next)
- 
-+#define metal_list_for_each_safe(list, node, temp)		\
-+	for(node = (list)->next, temp = node->next;		\
-+	    node != (list); node = temp, temp = node->next)
-+
- static inline bool metal_list_find_node(struct metal_list *list,
- 					struct metal_list *node)
- {
--- 
-2.25.1
-
diff --git a/openamp/0001-ns-acknowledge-the-received-creation-message.patch b/openamp/0001-ns-acknowledge-the-received-creation-message.patch
index 1f7ebb421a..18caee06d9 100644
--- a/openamp/0001-ns-acknowledge-the-received-creation-message.patch
+++ b/openamp/0001-ns-acknowledge-the-received-creation-message.patch
@@ -1,50 +1,54 @@
-From 1e43e60aa7ae118309cf256c50bd17f313540eba Mon Sep 17 00:00:00 2001
+From 5f90973cb572ec8df29ea03550eef29afa48015b Mon Sep 17 00:00:00 2001
 From: Xiang Xiao <xi...@xiaomi.com>
 Date: Mon, 7 Jan 2019 02:15:42 +0800
-Subject: [PATCH 01/10] ns: acknowledge the received creation message
+Subject: [PATCH 01/14] 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.
 
+Change-Id: I3289120a4e0d2291ba8b39de98d97de9e15880d0
 Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
 ---
- lib/include/openamp/rpmsg.h        |  1 +
+ lib/include/openamp/rpmsg.h        |  3 +++
  lib/include/openamp/rpmsg_virtio.h |  1 +
  lib/rpmsg/rpmsg.c                  |  5 ++++-
- lib/rpmsg/rpmsg_internal.h         |  4 ++--
- lib/rpmsg/rpmsg_virtio.c           | 15 ++++++++++++---
- 5 files changed, 20 insertions(+), 6 deletions(-)
+ lib/rpmsg/rpmsg_internal.h         |  2 ++
+ lib/rpmsg/rpmsg_virtio.c           | 14 +++++++++++---
+ 5 files changed, 21 insertions(+), 4 deletions(-)
 
 diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
-index 64678cfc..ff3ff8fb 100644
+index f994e1d..b2a9b17 100644
 --- a/lib/include/openamp/rpmsg.h
 +++ open-amp/lib/include/openamp/rpmsg.h
-@@ -126,6 +126,7 @@ struct rpmsg_device {
- 	rpmsg_ns_bind_cb ns_unbind_cb;
- 	struct rpmsg_device_ops ops;
+@@ -155,6 +155,9 @@ struct rpmsg_device {
+ 
+ 	/** Create/destroy namespace message */
  	bool support_ns;
++
++	/** Ack namespace message */
 +	bool support_ack;
  };
  
  /**
 diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
-index 80ce9981..874c9723 100644
+index 44ac4c0..6d6925f 100644
 --- a/lib/include/openamp/rpmsg_virtio.h
 +++ open-amp/lib/include/openamp/rpmsg_virtio.h
-@@ -28,6 +28,7 @@ extern "C" {
+@@ -29,6 +29,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
+ #ifdef VIRTIO_CACHED_BUFFERS
+ #warning "VIRTIO_CACHED_BUFFERS is deprecated, please use VIRTIO_USE_DCACHE"
 diff --git a/lib/rpmsg/rpmsg.c open-amp/lib/rpmsg/rpmsg.c
-index 0d3e1d03..e8757d80 100644
+index 39774bc..8ab59e1 100644
 --- a/lib/rpmsg/rpmsg.c
 +++ open-amp/lib/rpmsg/rpmsg.c
-@@ -317,10 +317,13 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
- 	rpmsg_register_endpoint(rdev, ept, name, addr, dest, cb, unbind_cb);
+@@ -357,10 +357,13 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
+ 	rpmsg_register_endpoint(rdev, ept, name, addr, dest, cb, unbind_cb, ept->priv);
  	metal_mutex_release(&rdev->lock);
  
 -	/* Send NS announcement to remote processor */
@@ -59,53 +63,46 @@ index 0d3e1d03..e8757d80 100644
  	if (status)
  		rpmsg_unregister_endpoint(ept);
 diff --git a/lib/rpmsg/rpmsg_internal.h open-amp/lib/rpmsg/rpmsg_internal.h
-index ab6e0f29..3e6ae37f 100644
+index 27b0f0d..1011b42 100644
 --- a/lib/rpmsg/rpmsg_internal.h
 +++ open-amp/lib/rpmsg/rpmsg_internal.h
-@@ -39,12 +39,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 {
+@@ -44,6 +44,8 @@ enum rpmsg_ns_flags {
  	RPMSG_NS_CREATE = 0,
+ 	/** A known remote service was just destroyed */
  	RPMSG_NS_DESTROY = 1,
++	/** Aknowledge the previous creation message*/
 +	RPMSG_NS_CREATE_ACK = 2,
  };
  
  /**
 diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index cab72e68..5726c2ca 100644
+index 7baaedd..820227e 100644
 --- a/lib/rpmsg/rpmsg_virtio.c
 +++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -638,7 +638,7 @@ 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);
+@@ -656,7 +656,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
+ 	 */
+ 	ept_to_release = _ept && _ept->release_cb;
  
 -	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);
-@@ -646,7 +646,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
- 			_ept->ns_unbind_cb(_ept);
- 		if (rdev->ns_unbind_cb)
- 			rdev->ns_unbind_cb(rdev, name, dest);
+ 		if (ept_to_release)
+@@ -671,7 +671,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
+ 			rpmsg_ept_decref(_ept);
+ 			metal_mutex_release(&rdev->lock);
+ 		}
 -	} else {
 +	} else if (ns_msg->flags == RPMSG_NS_CREATE) {
  		if (!_ept) {
  			/*
  			 * send callback to application, that can
-@@ -660,7 +660,15 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
+@@ -685,7 +685,14 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
  		} else {
  			_ept->dest_addr = dest;
  			metal_mutex_release(&rdev->lock);
 +			if (_ept->name[0] && rdev->support_ack)
-+				rpmsg_send_ns_message(_ept,
-+						      RPMSG_NS_CREATE_ACK);
++				rpmsg_send_ns_message(_ept, RPMSG_NS_CREATE_ACK);
  		}
 +	} else { /* RPMSG_NS_CREATE_ACK */
 +		/* save the received destination address */
@@ -115,15 +112,15 @@ index cab72e68..5726c2ca 100644
  	}
  
  	return RPMSG_SUCCESS;
-@@ -745,6 +753,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- #endif /*!VIRTIO_DRIVER_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));
+@@ -828,6 +835,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
+ 	if (status)
+ 		return status;
+ 	rdev->support_ns = !!(features & (1 << VIRTIO_RPMSG_F_NS));
++	rdev->support_ack = !!(features & (1 << VIRTIO_RPMSG_F_ACK));
  
- #ifndef VIRTIO_DEVICE_ONLY
- 	if (role == RPMSG_HOST) {
-@@ -841,7 +850,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
+ 	if (VIRTIO_ROLE_IS_DRIVER(rvdev->vdev)) {
+ 		/*
+@@ -926,7 +934,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
  	 * Create name service announcement endpoint if device supports name
  	 * service announcement feature.
  	 */
@@ -131,7 +128,7 @@ index cab72e68..5726c2ca 100644
 +	if (rdev->support_ns || rdev->support_ack) {
  		rpmsg_register_endpoint(rdev, &rdev->ns_ept, "NS",
  				     RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
- 				     rpmsg_virtio_ns_callback, NULL);
+ 				     rpmsg_virtio_ns_callback, NULL, rvdev);
 -- 
-2.25.1
+2.34.1
 
diff --git a/openamp/0002-Negotiate-individual-buffer-size-dynamically.patch b/openamp/0002-Negotiate-individual-buffer-size-dynamically.patch
index a309b31d43..03b84841c4 100644
--- a/openamp/0002-Negotiate-individual-buffer-size-dynamically.patch
+++ b/openamp/0002-Negotiate-individual-buffer-size-dynamically.patch
@@ -1,104 +1,94 @@
-From 285e4d359458ef09d397a41de04ada9a6b8d48e7 Mon Sep 17 00:00:00 2001
-From: Chao An <an...@pinecone.net>
+From a12f4359e3d4382e31a0f6f6983184b635fd0611 Mon Sep 17 00:00:00 2001
+From: anchao <an...@pinecone.net>
 Date: Mon, 10 Dec 2018 16:26:39 +0800
-Subject: [PATCH 02/10] Negotiate individual buffer size dynamically
+Subject: [PATCH 02/14] Negotiate individual buffer size dynamically
 
+Change config type from fw_rsc_config to rpmsg_virtio_config
+to avoid rpmsg_vitio.h couple with remoteproc.h.
 If slave support VIRTIO_RPMSG_F_BUFSZ(0x04) feature, master
 determine the buffer size from config space(first 8 bytes),
 otherwise the default size(512 bytes) will be used.
 
-Signed-off-by: Chao An <an...@pinecone.net>
+Change-Id: Ief68ed298495296a9eff38448ce5661f188300c2
+Signed-off-by: anchao <an...@pinecone.net>
+Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
 ---
- lib/include/openamp/remoteproc.h   | 17 +++++++++++++++++
- lib/include/openamp/rpmsg_virtio.h |  4 +++-
- lib/rpmsg/rpmsg_virtio.c           | 10 +++++++++-
- 3 files changed, 29 insertions(+), 2 deletions(-)
+ lib/include/openamp/remoteproc.h   | 15 +++++++++++++++
+ lib/include/openamp/rpmsg_virtio.h |  1 +
+ lib/rpmsg/rpmsg_virtio.c           |  7 +++++++
+ 3 files changed, 23 insertions(+)
 
 diff --git a/lib/include/openamp/remoteproc.h open-amp/lib/include/openamp/remoteproc.h
-index 7c79a292..d1efab85 100644
+index 84bf233..abc5481 100644
 --- a/lib/include/openamp/remoteproc.h
 +++ open-amp/lib/include/openamp/remoteproc.h
-@@ -303,6 +303,23 @@ struct fw_rsc_vdev {
- 	struct fw_rsc_vdev_vring vring[0];
+@@ -361,6 +361,21 @@ struct fw_rsc_vendor {
+ 	uint32_t len;
  } METAL_PACKED_END;
  
-+/**
-+ * struct fw_rsc_config - configuration space declaration
-+ * @h2r_buf_size: the size of the buffer used to send data from host to remote
-+ * @r2h_buf_size: the size of the buffer used to send data from remote to host
-+ * @reserved: reserved (must be zero)
-+ *
-+ * This structure immediately follow fw_rsc_vdev to provide the config info.
-+ */
++/** @brief Configuration space declaration ((if VIRTIO_RPMSG_F_BUFSZ)) */
 +METAL_PACKED_BEGIN
 +struct fw_rsc_config {
-+	/* The individual buffer size(if VIRTIO_RPMSG_F_BUFSZ) */
++	/** The host to remote buffer size */
 +	uint32_t h2r_buf_size;
++
++	/** The remote to host buffer size */
 +	uint32_t r2h_buf_size;
-+	uint32_t reserved[14]; /* Reserve for the future use */
-+	/* Put the customize config here */
++
++	/** Reserve for the future use */
++	uint32_t reserved[14];
++
++	/** Put the customize config here */
 +} METAL_PACKED_END;
 +
- /**
-  * struct fw_rsc_vendor - remote processor vendor specific resource
-  * @len: length of the resource
+ struct loader_ops;
+ struct image_store_ops;
+ struct remoteproc_ops;
 diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
-index 874c9723..0b22e840 100644
+index 6d6925f..d9cfa9b 100644
 --- a/lib/include/openamp/rpmsg_virtio.h
 +++ open-amp/lib/include/openamp/rpmsg_virtio.h
-@@ -16,6 +16,7 @@
- #include <metal/mutex.h>
- #include <openamp/rpmsg.h>
- #include <openamp/virtio.h>
-+#include <openamp/remoteproc.h>
- 
- #if defined __cplusplus
- extern "C" {
-@@ -29,6 +30,7 @@ extern "C" {
+@@ -30,6 +30,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 */
-+#define VIRTIO_RPMSG_F_BUFSZ	2 /* RP supports buffer size negotiation */
++#define VIRTIO_RPMSG_F_BUFSZ	2 /* RP supports get buffer size from config space */
  
- /**
-  * struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers
-@@ -72,7 +74,7 @@ struct rpmsg_virtio_config {
-  */
- struct rpmsg_virtio_device {
- 	struct rpmsg_device rdev;
--	struct rpmsg_virtio_config config;
-+	struct fw_rsc_config config;
- 	struct virtio_device *vdev;
- 	struct virtqueue *rvq;
- 	struct virtqueue *svq;
+ #ifdef VIRTIO_CACHED_BUFFERS
+ #warning "VIRTIO_CACHED_BUFFERS is deprecated, please use VIRTIO_USE_DCACHE"
 diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 5726c2ca..69537399 100644
+index 820227e..94c4b95 100644
 --- a/lib/rpmsg/rpmsg_virtio.c
 +++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -737,7 +737,8 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- 		if (config == NULL) {
- 			return RPMSG_ERR_PARAM;
- 		}
--		rvdev->config = *config;
-+		rvdev->config.h2r_buf_size = config->h2r_buf_size;
-+		rvdev->config.r2h_buf_size = config->r2h_buf_size;
- 	}
- #else /*!VIRTIO_DEVICE_ONLY*/
- 	/* Ignore passed config in the virtio-device-only configuration. */
-@@ -755,6 +756,13 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- 	rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS));
- 	rdev->support_ack = !!(vdev->features & (1 << VIRTIO_RPMSG_F_ACK));
+@@ -12,6 +12,7 @@
+ #include <metal/sleep.h>
+ #include <metal/utilities.h>
+ #include <openamp/rpmsg_virtio.h>
++#include <openamp/remoteproc.h>
+ #include <openamp/virtqueue.h>
  
-+	if (vdev->features & (1 << VIRTIO_RPMSG_F_BUFSZ)) {
-+		rpmsg_virtio_read_config(rvdev,
-+			0,
-+			&rvdev->config,
-+			sizeof(rvdev->config));
+ #include "rpmsg_internal.h"
+@@ -790,6 +791,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
+ 	struct rpmsg_device *rdev;
+ 	const char *vq_names[RPMSG_NUM_VRINGS];
+ 	vq_callback callback[RPMSG_NUM_VRINGS];
++	struct fw_rsc_config fw_config;
+ 	uint32_t features;
+ 	int status;
+ 	unsigned int i;
+@@ -836,6 +838,11 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
+ 		return status;
+ 	rdev->support_ns = !!(features & (1 << VIRTIO_RPMSG_F_NS));
+ 	rdev->support_ack = !!(features & (1 << VIRTIO_RPMSG_F_ACK));
++	if (features & (1 << VIRTIO_RPMSG_F_BUFSZ)) {
++		virtio_read_config(rvdev->vdev, 0, &fw_config, sizeof(fw_config));
++		rvdev->config.h2r_buf_size = fw_config.h2r_buf_size;
++		rvdev->config.r2h_buf_size = fw_config.r2h_buf_size;
 +	}
-+
- #ifndef VIRTIO_DEVICE_ONLY
- 	if (role == RPMSG_HOST) {
+ 
+ 	if (VIRTIO_ROLE_IS_DRIVER(rvdev->vdev)) {
  		/*
 -- 
-2.25.1
+2.34.1
 
diff --git a/openamp/0004-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch b/openamp/0002-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
similarity index 66%
rename from openamp/0004-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
rename to openamp/0002-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
index 73b95c3a81..9e416b8d31 100644
--- a/openamp/0004-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
+++ b/openamp/0002-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
@@ -1,8 +1,8 @@
-From f17ee493475793be52b364b0ad7cd7042bc27ffe Mon Sep 17 00:00:00 2001
+From 61756465a3dc241297b7a12d5500ac36a5ffa070 Mon Sep 17 00:00:00 2001
 From: chao an <an...@lixiang.com>
 Date: Sat, 29 Jun 2024 09:40:26 +0800
-Subject: [PATCH] libmetal/atomic: enable 64-bit atomic by toolchain builtin
- flags
+Subject: [PATCH 2/5] libmetal/atomic: enable 64-bit atomic by toolchain
+ builtin flags
 
 Fix compile error:
 arm-none-eabi-ld: (remoteproc_virtio.o): in function `metal_io_read':
@@ -18,27 +18,26 @@ toolchains have built-in properties to indicate whether support atomic64:
 | #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
 | #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
 
+Change-Id: Iab9f7df0a9d21e29c8b8d131006cb4817414ebdc
 Signed-off-by: chao an <an...@lixiang.com>
 ---
- openamp/libmetal/lib/io.h | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
+ lib/io.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
 
 diff --git a/lib/io.h libmetal/lib/io.h
-index ba416dd505..8cd03e41db 100644
+index ba416dd..81105e2 100644
 --- a/lib/io.h
 +++ libmetal/lib/io.h
-@@ -30,8 +30,9 @@ extern "C" {
+@@ -30,7 +30,8 @@ extern "C" {
   *  @{
   */
  
 -#ifdef __MICROBLAZE__
--#define NO_ATOMIC_64_SUPPORT
 +#if defined(__MICROBLAZE__) || \
-+   (defined(__GNUC__) && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8))
-+#  define NO_ATOMIC_64_SUPPORT
++(defined(__GNUC__) && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8))
+ #define NO_ATOMIC_64_SUPPORT
  #endif
  
- struct metal_io_region;
 -- 
 2.34.1
 
diff --git a/openamp/0002-libmetal-nuttx-io.c-align-access-when-read-write-siz.patch b/openamp/0002-libmetal-nuttx-io.c-align-access-when-read-write-siz.patch
deleted file mode 100644
index 8903c94bd9..0000000000
--- a/openamp/0002-libmetal-nuttx-io.c-align-access-when-read-write-siz.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From af3de6cd042c89ae2e8d07d503e0a07129e1296c Mon Sep 17 00:00:00 2001
-From: Bowen Wang <wa...@xiaomi.com>
-Date: Thu, 16 Nov 2023 14:52:48 +0800
-Subject: [PATCH] libmetal/nuttx/io.c: align access when read/write size = 1,
- 2, 4, 8
-
-Signed-off-by: Bowen Wang <wa...@xiaomi.com>
----
- lib/system/nuttx/io.c | 25 +++++++++++++++++++++++--
- 1 file changed, 23 insertions(+), 2 deletions(-)
-
-diff --git a/lib/system/nuttx/io.c libmetal/lib/system/nuttx/io.c
-index 4fa4727..3ce9cbe 100644
---- a/lib/system/nuttx/io.c
-+++ libmetal/lib/system/nuttx/io.c
-@@ -37,7 +37,17 @@ static int metal_io_block_read_(struct metal_io_region *io,
- 	void *va = metal_io_virt(io, offset);
- 
- 	metal_cache_invalidate(va, len);
--	memcpy(dst, va, len);
-+	if (len == 1)
-+		*(uint8_t *)dst = *(uint8_t *)va;
-+	else if (len == 2)
-+		*(uint16_t *)dst = *(uint16_t *)va;
-+	else if (len == 4)
-+		*(uint32_t *)dst = *(uint32_t *)va;
-+	else if (len == 8) {
-+		*(uint32_t *)dst = *(uint32_t *)va;
-+		*(uint32_t *)(dst + 4) = *(uint32_t *)(va + 4);
-+	} else
-+		memcpy(dst, va, len);
- 
- 	return len;
- }
-@@ -50,7 +60,18 @@ static int metal_io_block_write_(struct metal_io_region *io,
- {
- 	void *va = metal_io_virt(io, offset);
- 
--	memcpy(va, src, len);
-+	if (len == 1)
-+		*(uint8_t *)va = *(uint8_t *)src;
-+	else if (len == 2)
-+		*(uint16_t *)va = *(uint16_t *)src;
-+	else if (len == 4)
-+		*(uint32_t *)va = *(uint32_t *)src;
-+	else if (len == 8) {
-+		*(uint32_t *)va = *(uint32_t *)src;
-+		*(uint32_t *)(va + 4) = *(uint32_t *)(src + 4);
-+	} else
-+		memcpy(va, src, len);
-+
- 	metal_cache_flush(va, len);
- 
- 	return len;
--- 
-2.34.1
-
diff --git a/openamp/0003-atomic.h-fix-compiler-error.patch b/openamp/0003-atomic.h-fix-compiler-error.patch
new file mode 100644
index 0000000000..dee4c958b4
--- /dev/null
+++ b/openamp/0003-atomic.h-fix-compiler-error.patch
@@ -0,0 +1,52 @@
+From 6842947d3cd08748b8d44fd771a53a86ddfc8dac Mon Sep 17 00:00:00 2001
+From: Yongrong Wang <wa...@xiaomi.com>
+Date: Fri, 19 Jul 2024 17:40:51 +0800
+Subject: [PATCH 3/5] atomic.h: fix compiler error
+
+/home/wyr/work/code/velasim/upgrade/nuttx/include/metal/compiler/gcc/atomic.h:19:13: error: conflicting type qualifiers for 'atomic_flag'
+   19 | typedef int atomic_flag;
+      |             ^~~~~~~~~~~
+In file included from /home/wyr/work/code/velasim/upgrade/nuttx/include/nuttx/net/netdev_lowerhalf.h:38,
+                 from virtio/virtio-net.c:33:
+/home/wyr/work/code/velasim/upgrade/prebuilts/gcc/linux/arm/lib/gcc/arm-none-eabi/13.2.1/include/stdatomic.h:233:3: note: previous declaration of 'atomic_flag' with type 'atomic_flag'
+  233 | } atomic_flag;
+      |   ^~~~~~~~~~~
+/home/wyr/work/code/velasim/upgrade/nuttx/include/metal/compiler/gcc/atomic.h:20:14: error: conflicting type qualifiers for 'atomic_char'
+   20 | typedef char atomic_char;
+      |              ^~~~~~~~~~~
+/home/wyr/work/code/velasim/upgrade/prebuilts/gcc/linux/arm/lib/gcc/arm-none-eabi/13.2.1/include/stdatomic.h:41:22: note: previous declaration of 'atomic_char' with type 'atomic_char' {aka '_Atomic char'}
+   41 | typedef _Atomic char atomic_char;
+      |                      ^~~~~~~~~~~
+/home/wyr/work/code/velasim/upgrade/nuttx/include/metal/compiler/gcc/atomic.h:21:23: error: conflicting type qualifiers for 'atomic_uchar'
+   21 | typedef unsigned char atomic_uchar;
+      |                       ^~~~~~~~~~~~
+/home/wyr/work/code/velasim/upgrade/prebuilts/gcc/linux/arm/lib/gcc/arm-none-eabi/13.2.1/include/stdatomic.h:43:31: note: previous declaration of 'atomic_uchar' with type 'atomic_uchar' {aka '_Atomic unsigned char'}
+   43 | typedef _Atomic unsigned char atomic_uchar;
+      |                               ^~~~~~~~~~~~
+/home/wyr/work/code/velasim/upgrade/nuttx/include/metal/compiler/gcc/atomic.h:22:15: error: conflicting type qualifiers for 'atomic_short'
+   22 | typedef short atomic_short;
+
+Change-Id: Ic4e920c27e0f8a263136eb9ecb5350edd157195d
+Signed-off-by: Yongrong Wang <wa...@xiaomi.com>
+---
+ lib/atomic.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/atomic.h libmetal/lib/atomic.h
+index 2f4ab04..fe2c1e0 100644
+--- a/lib/atomic.h
++++ libmetal/lib/atomic.h
+@@ -100,8 +100,8 @@ using std::atomic_fetch_and_explicit;
+ using std::atomic_thread_fence;
+ using std::atomic_signal_fence;
+ 
+-#elif defined(HAVE_STDATOMIC_H) && !defined(__CC_ARM) && !defined(__arm__) && \
+-      !defined(__STDC_NO_ATOMICS__)
++#elif defined(HAVE_STDATOMIC_H) && !defined(__STDC_NO_ATOMICS__) && \
++      ((!defined(__CC_ARM) && !defined(__arm__)) || defined(__GNUC__))
+ # include <stdint.h>
+ # include <stdatomic.h>
+ #elif defined(__GNUC__)
+-- 
+2.34.1
+
diff --git a/openamp/0003-libmetal-nuttx-io.c-Fix-void-pointer-arithmetic-in-a.patch b/openamp/0003-libmetal-nuttx-io.c-Fix-void-pointer-arithmetic-in-a.patch
deleted file mode 100644
index 88ce403c93..0000000000
--- a/openamp/0003-libmetal-nuttx-io.c-Fix-void-pointer-arithmetic-in-a.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 59e2764f9d0598ad0135286d4a0ee1ac95893bba Mon Sep 17 00:00:00 2001
-From: Jukka Laitinen <ju...@ssrc.tii.ae>
-Date: Mon, 12 Feb 2024 13:27:13 +0200
-Subject: [PATCH] libmetal/nuttx/io.c: Fix void pointer arithmetic in access
- alignment
-
-Signed-off-by: Jukka Laitinen <ju...@ssrc.tii.ae>
----
- libmetal/lib/system/nuttx/io.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/lib/system/nuttx/io.c libmetal/lib/system/nuttx/io.c
-index 3ce9cbe..ab9bc6a 100644
---- a/lib/system/nuttx/io.c
-+++ libmetal/lib/system/nuttx/io.c
-@@ -45,7 +45,7 @@ static int metal_io_block_read_(struct metal_io_region *io,
- 		*(uint32_t *)dst = *(uint32_t *)va;
- 	else if (len == 8) {
- 		*(uint32_t *)dst = *(uint32_t *)va;
--		*(uint32_t *)(dst + 4) = *(uint32_t *)(va + 4);
-+		*((uint32_t *)dst + 1) = *((uint32_t *)va + 1);
- 	} else
- 		memcpy(dst, va, len);
- 
-@@ -68,7 +68,7 @@ static int metal_io_block_write_(struct metal_io_region *io,
- 		*(uint32_t *)va = *(uint32_t *)src;
- 	else if (len == 8) {
- 		*(uint32_t *)va = *(uint32_t *)src;
--		*(uint32_t *)(va + 4) = *(uint32_t *)(src + 4);
-+		*((uint32_t *)va + 1) = *((uint32_t *)src + 1);
- 	} else
- 		memcpy(va, src, len);
- 
--- 
-2.34.1
-
diff --git a/openamp/0003-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch b/openamp/0003-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
new file mode 100644
index 0000000000..905858dafa
--- /dev/null
+++ b/openamp/0003-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
@@ -0,0 +1,75 @@
+From ccedce5807709d184a9fe89529e611a556f0bf23 Mon Sep 17 00:00:00 2001
+From: ligd <li...@xiaomi.com>
+Date: Tue, 19 Oct 2021 19:45:14 +0800
+Subject: [PATCH 03/14] rpmsg: notify the user when the remote address is
+ received
+
+Change-Id: I1085e98aa0bd50746b624ec3fce1e3ca407c17e3
+Signed-off-by: ligd <li...@xiaomi.com>
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
+---
+ lib/include/openamp/rpmsg.h |  4 ++++
+ lib/rpmsg/rpmsg_virtio.c    | 17 ++++++++++++++---
+ 2 files changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
+index b2a9b17..bb1c160 100644
+--- a/lib/include/openamp/rpmsg.h
++++ open-amp/lib/include/openamp/rpmsg.h
+@@ -52,6 +52,7 @@ struct rpmsg_device;
+ typedef int (*rpmsg_ept_cb)(struct rpmsg_endpoint *ept, void *data,
+ 			    size_t len, uint32_t src, void *priv);
+ typedef void (*rpmsg_ept_release_cb)(struct rpmsg_endpoint *ept);
++typedef void (*rpmsg_ns_bound_cb)(struct rpmsg_endpoint *ept);
+ typedef void (*rpmsg_ns_unbind_cb)(struct rpmsg_endpoint *ept);
+ typedef void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev,
+ 				 const char *name, uint32_t dest);
+@@ -87,6 +88,9 @@ struct rpmsg_endpoint {
+ 	 */
+ 	rpmsg_ept_cb cb;
+ 
++	/** Endpoint service bound callback, called when remote ept address is received */
++	rpmsg_ns_bound_cb ns_bound_cb;
++
+ 	/** Endpoint service unbind callback, called when remote ept is destroyed */
+ 	rpmsg_ns_unbind_cb ns_unbind_cb;
+ 
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index 94c4b95..ad9a730 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -683,17 +683,28 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
+ 			metal_mutex_release(&rdev->lock);
+ 			if (rdev->ns_bind_cb)
+ 				rdev->ns_bind_cb(rdev, name, dest);
+-		} else {
++		} else if (_ept->dest_addr == RPMSG_ADDR_ANY) {
+ 			_ept->dest_addr = dest;
+ 			metal_mutex_release(&rdev->lock);
+ 			if (_ept->name[0] && rdev->support_ack)
+ 				rpmsg_send_ns_message(_ept, RPMSG_NS_CREATE_ACK);
++			/* notify application that the endpoint has been bound */
++			if (_ept->ns_bound_cb)
++				_ept->ns_bound_cb(_ept);
+ 		}
++		else
++			metal_mutex_release(&rdev->lock);
+ 	} else { /* RPMSG_NS_CREATE_ACK */
+ 		/* save the received destination address */
+-		if (_ept)
++		if (_ept && _ept->dest_addr == RPMSG_ADDR_ANY) {
+ 			_ept->dest_addr = dest;
+-		metal_mutex_release(&rdev->lock);
++			metal_mutex_release(&rdev->lock);
++			/* notify application that the endpoint has been bound */
++			if (_ept->ns_bound_cb)
++				_ept->ns_bound_cb(_ept);
++		}
++		else
++			metal_mutex_release(&rdev->lock);
+ 	}
+ 
+ 	return RPMSG_SUCCESS;
+-- 
+2.34.1
+
diff --git a/openamp/0004-lib-system-nuttx-fix-unused-parameter-compile-error.patch b/openamp/0004-lib-system-nuttx-fix-unused-parameter-compile-error.patch
new file mode 100644
index 0000000000..8d8b40ef1b
--- /dev/null
+++ b/openamp/0004-lib-system-nuttx-fix-unused-parameter-compile-error.patch
@@ -0,0 +1,156 @@
+From f003d671f816b319ad0f8d017022c93b438b78b3 Mon Sep 17 00:00:00 2001
+From: Yongrong Wang <wa...@xiaomi.com>
+Date: Mon, 9 Sep 2024 19:46:37 +0800
+Subject: [PATCH 4/5] lib/system/nuttx: fix unused parameter compile error
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+/home/wyr/work/code/project/cardev/nuttx/openamp/libmetal/lib/system/nuttx/device.c:16:22: error: 'io' undeclared (first use in this function)
+   16 |         metal_unused(io);
+/home/wyr/work/code/project/cardev/nuttx/openamp/libmetal/lib/system/nuttx/device.c:14:53: error: unused parameter 'dev' [-Werror=unused-parameter]
+   14 | int metal_generic_dev_sys_open(struct metal_device *dev)
+
+error: unused parameter ‘addr’ [-Werror=unused-parameter]
+   25 | static inline void __metal_cache_flush(void *addr, unsigned int len)
+      |                                        ~~~~~~^~~~
+error: unused parameter ‘len’ [-Werror=unused-parameter]
+   25 | static inline void __metal_cache_flush(void *addr, unsigned int len)
+      |                                                    ~~~~~~~~~~~~~^~~
+
+Change-Id: Ic4515da151d90fd1f87d94d5523144967a7ca688
+Signed-off-by: Yongrong Wang <wa...@xiaomi.com>
+---
+ lib/system/nuttx/cache.h  | 5 +++++
+ lib/system/nuttx/device.c | 1 +
+ lib/system/nuttx/init.c   | 1 +
+ lib/system/nuttx/io.c     | 6 ++++++
+ lib/system/nuttx/io.h     | 3 +++
+ 5 files changed, 16 insertions(+)
+
+diff --git a/lib/system/nuttx/cache.h libmetal/lib/system/nuttx/cache.h
+index e3b6052..22b94b4 100644
+--- a/lib/system/nuttx/cache.h
++++ libmetal/lib/system/nuttx/cache.h
+@@ -16,6 +16,7 @@
+ #ifndef __METAL_NUTTX_CACHE__H__
+ #define __METAL_NUTTX_CACHE__H__
+ 
++#include <metal/utilities.h>
+ #include <nuttx/arch.h>
+ 
+ #ifdef __cplusplus
+@@ -24,11 +25,15 @@ extern "C" {
+ 
+ static inline void __metal_cache_flush(void *addr, unsigned int len)
+ {
++	metal_unused(addr);
++	metal_unused(len);
+ 	up_clean_dcache((uintptr_t)addr, (uintptr_t)addr + len);
+ }
+ 
+ static inline void __metal_cache_invalidate(void *addr, unsigned int len)
+ {
++	metal_unused(addr);
++	metal_unused(len);
+ 	up_invalidate_dcache((uintptr_t)addr, (uintptr_t)addr + len);
+ }
+ 
+diff --git a/lib/system/nuttx/device.c libmetal/lib/system/nuttx/device.c
+index 7e66ab3..2c828ab 100644
+--- a/lib/system/nuttx/device.c
++++ libmetal/lib/system/nuttx/device.c
+@@ -13,5 +13,6 @@
+ 
+ int metal_generic_dev_sys_open(struct metal_device *dev)
+ {
++	metal_unused(dev);
+ 	return 0;
+ }
+diff --git a/lib/system/nuttx/init.c libmetal/lib/system/nuttx/init.c
+index 8d59784..2519dc6 100644
+--- a/lib/system/nuttx/init.c
++++ libmetal/lib/system/nuttx/init.c
+@@ -19,6 +19,7 @@ int metal_sys_init(const struct metal_init_params *params)
+ {
+ 	int ret = metal_cntr_irq_init();
+ 
++	metal_unused(params);
+ 	if (ret >= 0)
+ 		ret = metal_bus_register(&metal_generic_bus);
+ 	return ret;
+diff --git a/lib/system/nuttx/io.c libmetal/lib/system/nuttx/io.c
+index ab9bc6a..41697a7 100644
+--- a/lib/system/nuttx/io.c
++++ libmetal/lib/system/nuttx/io.c
+@@ -15,6 +15,7 @@ static uint64_t metal_io_read_(struct metal_io_region *io,
+ {
+ 	uint64_t value = 0;
+ 
++	metal_unused(order);
+ 	metal_io_block_read(io, offset, &value, width);
+ 	return value;
+ }
+@@ -25,6 +26,7 @@ static void metal_io_write_(struct metal_io_region *io,
+ 			    memory_order order,
+ 			    int width)
+ {
++	metal_unused(order);
+ 	metal_io_block_write(io, offset, &value, width);
+ }
+ 
+@@ -36,6 +38,7 @@ static int metal_io_block_read_(struct metal_io_region *io,
+ {
+ 	void *va = metal_io_virt(io, offset);
+ 
++	metal_unused(order);
+ 	metal_cache_invalidate(va, len);
+ 	if (len == 1)
+ 		*(uint8_t *)dst = *(uint8_t *)va;
+@@ -60,6 +63,7 @@ static int metal_io_block_write_(struct metal_io_region *io,
+ {
+ 	void *va = metal_io_virt(io, offset);
+ 
++	metal_unused(order);
+ 	if (len == 1)
+ 		*(uint8_t *)va = *(uint8_t *)src;
+ 	else if (len == 2)
+@@ -85,12 +89,14 @@ static void metal_io_block_set_(struct metal_io_region *io,
+ {
+ 	void *va = metal_io_virt(io, offset);
+ 
++	metal_unused(order);
+ 	memset(va, value, len);
+ 	metal_cache_flush(va, len);
+ }
+ 
+ static void metal_io_close_(struct metal_io_region *io)
+ {
++	metal_unused(io);
+ }
+ 
+ static metal_phys_addr_t metal_io_offset_to_phys_(struct metal_io_region *io,
+diff --git a/lib/system/nuttx/io.h libmetal/lib/system/nuttx/io.h
+index 7f6508d..743b7b1 100644
+--- a/lib/system/nuttx/io.h
++++ libmetal/lib/system/nuttx/io.h
+@@ -16,6 +16,8 @@
+ #ifndef __METAL_NUTTX_IO__H__
+ #define __METAL_NUTTX_IO__H__
+ 
++#include <metal/utilities.h>
++
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+@@ -39,6 +41,7 @@ struct metal_io_region *metal_io_get_region(void);
+  */
+ static inline void metal_sys_io_mem_map(struct metal_io_region *io)
+ {
++	metal_unused(io);
+ }
+ #endif
+ 
+-- 
+2.34.1
+
diff --git a/openamp/0004-openamp-add-new-ops-notify_wait-support.patch b/openamp/0004-openamp-add-new-ops-notify_wait-support.patch
deleted file mode 100644
index c7b4c68ba4..0000000000
--- a/openamp/0004-openamp-add-new-ops-notify_wait-support.patch
+++ /dev/null
@@ -1,189 +0,0 @@
-From ddc209c9475a2822ffe5d18441bd01718acdbc11 Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Fri, 29 Jul 2022 22:57:23 +0800
-Subject: [PATCH 04/10] openamp: add new ops notify_wait() support
-
-This can avoid looping check tx buffer
-
-Change-Id: Ie340ed06c306ce978ff165aacaf5b830e3645af8
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/include/openamp/remoteproc.h        | 12 ++++++++++++
- lib/include/openamp/remoteproc_virtio.h |  2 ++
- lib/include/openamp/rpmsg.h             |  1 +
- lib/include/openamp/rpmsg_virtio.h      |  9 +++++++++
- lib/include/openamp/virtio.h            |  1 +
- lib/remoteproc/remoteproc.c             | 11 +++++++++++
- lib/remoteproc/remoteproc_virtio.c      | 14 ++++++++++++++
- lib/rpmsg/rpmsg_virtio.c                |  7 +++++++
- 8 files changed, 57 insertions(+)
-
-diff --git a/lib/include/openamp/remoteproc.h open-amp/lib/include/openamp/remoteproc.h
-index d1efab85..f6554404 100644
---- a/lib/include/openamp/remoteproc.h
-+++ open-amp/lib/include/openamp/remoteproc.h
-@@ -428,6 +428,18 @@ struct remoteproc_ops {
- 	int (*stop)(struct remoteproc *rproc);
- 	int (*shutdown)(struct remoteproc *rproc);
- 	int (*notify)(struct remoteproc *rproc, uint32_t id);
-+	/**
-+	 * notify_wait
-+	 *
-+	 * Wait for remote notified, when there is no TX buffer anymore.
-+	 * Set to NULL means use usleep to wait TX buffer available.
-+	 *
-+	 * @rproc - pointer to remoteproc instance
-+	 * @id    - the notifyid
-+	 *
-+	 * return 0 means there is notify available, otherwise negative value.
-+	 */
-+	int (*notify_wait)(struct remoteproc *rproc, uint32_t id);
- 	/**
- 	 * get_mem
- 	 *
-diff --git a/lib/include/openamp/remoteproc_virtio.h open-amp/lib/include/openamp/remoteproc_virtio.h
-index 6609a1fd..e65488d5 100644
---- a/lib/include/openamp/remoteproc_virtio.h
-+++ open-amp/lib/include/openamp/remoteproc_virtio.h
-@@ -25,6 +25,7 @@ extern "C" {
- 
- /* define vdev notification function user should implement */
- typedef int (*rpvdev_notify_func)(void *priv, uint32_t id);
-+typedef int (*rpvdev_notify_wait)(void *priv, uint32_t id);
- 
- /**
-  * struct remoteproc_virtio
-@@ -40,6 +41,7 @@ struct remoteproc_virtio {
- 	void *vdev_rsc;
- 	struct metal_io_region *vdev_rsc_io;
- 	rpvdev_notify_func notify;
-+	rpvdev_notify_wait notify_wait;
- 	struct virtio_device vdev;
- 	struct metal_list node;
- };
-diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
-index dbe42ea6..14440e20 100644
---- a/lib/include/openamp/rpmsg.h
-+++ open-amp/lib/include/openamp/rpmsg.h
-@@ -50,6 +50,7 @@ extern "C" {
- #define RPMSG_ERR_INIT			(RPMSG_ERROR_BASE - 6)
- #define RPMSG_ERR_ADDR			(RPMSG_ERROR_BASE - 7)
- #define RPMSG_ERR_PERM			(RPMSG_ERROR_BASE - 8)
-+#define RPMSG_ERR_NXIO			(RPMSG_ERROR_BASE - 9)
- 
- struct rpmsg_endpoint;
- struct rpmsg_device;
-diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
-index 0b22e840..11cb6df9 100644
---- a/lib/include/openamp/rpmsg_virtio.h
-+++ open-amp/lib/include/openamp/rpmsg_virtio.h
-@@ -148,6 +148,15 @@ rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev,
- 					callbacks);
- }
- 
-+static inline int
-+rpmsg_virtio_notify_wait(struct rpmsg_virtio_device *rvdev,
-+			 struct virtqueue *vq)
-+{
-+	return rvdev->vdev->func->notify_wait ?
-+			rvdev->vdev->func->notify_wait(rvdev->vdev, vq) :
-+			RPMSG_ERR_NXIO;
-+}
-+
- /**
-  * rpmsg_virtio_get_buffer_size - get rpmsg virtio buffer size
-  *
-diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
-index 916132b4..0303a5b3 100644
---- a/lib/include/openamp/virtio.h
-+++ open-amp/lib/include/openamp/virtio.h
-@@ -162,6 +162,7 @@ struct virtio_dispatch {
- 			     void *src, int length);
- 	void (*reset_device)(struct virtio_device *dev);
- 	void (*notify)(struct virtqueue *vq);
-+	int (*notify_wait)(struct virtio_device *dev, struct virtqueue *vq);
- };
- 
- int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags,
-diff --git a/lib/remoteproc/remoteproc.c open-amp/lib/remoteproc/remoteproc.c
-index f7f9f2df..001b11bf 100644
---- a/lib/remoteproc/remoteproc.c
-+++ open-amp/lib/remoteproc/remoteproc.c
-@@ -899,6 +899,16 @@ static int remoteproc_virtio_notify(void *priv, uint32_t id)
- 	return 0;
- }
- 
-+static int remoteproc_virtio_notify_wait(void *priv, uint32_t id)
-+{
-+	struct remoteproc *rproc = priv;
-+
-+	if (rproc->ops->notify_wait)
-+		return rproc->ops->notify_wait(rproc, id);
-+
-+	return 0;
-+}
-+
- struct virtio_device *
- remoteproc_create_virtio(struct remoteproc *rproc,
- 			 int vdev_id, unsigned int role,
-@@ -957,6 +967,7 @@ remoteproc_create_virtio(struct remoteproc *rproc,
- 	rproc_virtio_wait_remote_ready(vdev);
- 
- 	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
-+	rpvdev->notify_wait = remoteproc_virtio_notify_wait;
- 	metal_list_add_tail(&rproc->vdevs, &rpvdev->node);
- 	num_vrings = vdev_rsc->num_of_vrings;
- 
-diff --git a/lib/remoteproc/remoteproc_virtio.c open-amp/lib/remoteproc/remoteproc_virtio.c
-index 169e5b5f..4375c4c3 100644
---- a/lib/remoteproc/remoteproc_virtio.c
-+++ open-amp/lib/remoteproc/remoteproc_virtio.c
-@@ -30,6 +30,19 @@ static void rproc_virtio_virtqueue_notify(struct virtqueue *vq)
- 	rpvdev->notify(rpvdev->priv, vring_info->notifyid);
- }
- 
-+static int rproc_virtio_notify_wait(struct virtio_device *vdev,
-+				    struct virtqueue *vq)
-+{
-+	struct remoteproc_virtio *rpvdev;
-+	struct virtio_vring_info *vring_info;
-+	unsigned int vq_id = vq->vq_queue_index;
-+
-+	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
-+	vring_info = &vdev->vrings_info[vq_id];
-+
-+	return rpvdev->notify_wait(rpvdev->priv, vring_info->notifyid);
-+}
-+
- static unsigned char rproc_virtio_get_status(struct virtio_device *vdev)
- {
- 	struct remoteproc_virtio *rpvdev;
-@@ -179,6 +192,7 @@ static const struct virtio_dispatch remoteproc_virtio_dispatch_funcs = {
- 	.get_features = rproc_virtio_get_features,
- 	.read_config = rproc_virtio_read_config,
- 	.notify = rproc_virtio_virtqueue_notify,
-+	.notify_wait = rproc_virtio_notify_wait,
- #ifndef VIRTIO_DEVICE_ONLY
- 	/*
- 	 * We suppose here that the vdev is in a shared memory so that can
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index c56e0cea..4960aa8a 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -373,6 +373,13 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
- 		metal_mutex_release(&rdev->lock);
- 		if (rp_hdr || !tick_count)
- 			break;
-+
-+		status = rpmsg_virtio_notify_wait(rvdev, rvdev->rvq);
-+		if (status == RPMSG_SUCCESS)
-+			continue;
-+		else if (status != RPMSG_ERR_NXIO)
-+			break;
-+
- 		metal_sleep_usec(RPMSG_TICKS_PER_INTERVAL);
- 		tick_count--;
- 	}
--- 
-2.25.1
-
diff --git a/openamp/0004-openamp-virtio.h-negotiate_features-also-can-be-call.patch b/openamp/0004-openamp-virtio.h-negotiate_features-also-can-be-call.patch
new file mode 100644
index 0000000000..2f974f9471
--- /dev/null
+++ b/openamp/0004-openamp-virtio.h-negotiate_features-also-can-be-call.patch
@@ -0,0 +1,37 @@
+From 17ca934563b3d62f950f5d1693d89556495d150f Mon Sep 17 00:00:00 2001
+From: wangyongrong <wa...@xiaomi.com>
+Date: Tue, 2 Jul 2024 16:33:32 +0800
+Subject: [PATCH 04/14] openamp/virtio.h: negotiate_features also can be call
+ when final_features is NULL
+
+Change-Id: I41774d6c8b3c8b7487dc4b640fa60f4061ad3694
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
+---
+ lib/include/openamp/virtio.h | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
+index c4d4927..278d2da 100644
+--- a/lib/include/openamp/virtio.h
++++ open-amp/lib/include/openamp/virtio.h
+@@ -468,13 +468,15 @@ static inline int virtio_negotiate_features(struct virtio_device *vdev,
+ 					    uint32_t features,
+ 					    uint32_t *final_features)
+ {
+-	if (!vdev || !final_features)
++	if (!vdev)
+ 		return -EINVAL;
+ 
+ 	if (!vdev->func || !vdev->func->negotiate_features)
+ 		return -ENXIO;
+ 
+-	*final_features = vdev->func->negotiate_features(vdev, features);
++	vdev->features = vdev->func->negotiate_features(vdev, features);
++	if (final_features)
++		*final_features = vdev->features;
+ 	return 0;
+ }
+ 
+-- 
+2.34.1
+
diff --git a/openamp/0005-libmetal-cmake-set-HAVE_STDATOMIC_H-default-true-in-.patch b/openamp/0005-libmetal-cmake-set-HAVE_STDATOMIC_H-default-true-in-.patch
new file mode 100644
index 0000000000..4c73ca0fcf
--- /dev/null
+++ b/openamp/0005-libmetal-cmake-set-HAVE_STDATOMIC_H-default-true-in-.patch
@@ -0,0 +1,41 @@
+From 2b9bd97db33d95c4d6d40e6f0ec1fa388fac3ab0 Mon Sep 17 00:00:00 2001
+From: xuxin19 <xu...@xiaomi.com>
+Date: Fri, 6 Sep 2024 10:56:49 +0800
+Subject: [PATCH 5/5] libmetal(cmake):set HAVE_STDATOMIC_H default true in
+ NuttX platform
+
+Change-Id: I84e6fdd03753a16a9c296e87ab121cb8c16f3c61
+Signed-off-by: xuxin19 <xu...@xiaomi.com>
+---
+ cmake/depends.cmake | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/cmake/depends.cmake libmetal/cmake/depends.cmake
+index 60b9739..15683f8 100644
+--- a/cmake/depends.cmake
++++ libmetal/cmake/depends.cmake
+@@ -24,7 +24,13 @@ if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+   find_package(LibRt REQUIRED)
+   collect (PROJECT_LIB_DEPS "${LIBRT_LIBRARIES}")
+ 
+-else ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
++elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "NuttX")
++
++  # there is no need to use cmake include detection
++  # under NuttX platform
++  set(HAVE_STDATOMIC_H true)
++
++else ()
+ 
+   # TODO: fix for find_path() to detect stdatomic.h
+   # find_path (HAVE_STDATOMIC_H stdatomic.h)
+@@ -33,5 +39,5 @@ else ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+   check_include_files (stdatomic.h HAVE_STDATOMIC_H)
+   set (CMAKE_REQUIRED_FLAGS ${_saved_cmake_required_flags})
+ 
+-endif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
++endif ()
+ 
+-- 
+2.34.1
+
diff --git a/openamp/0005-remoteproc-rpmsg_virtio-change-sched_yeild-to-usleep.patch b/openamp/0005-remoteproc-rpmsg_virtio-change-sched_yeild-to-usleep.patch
new file mode 100644
index 0000000000..14e8ec85da
--- /dev/null
+++ b/openamp/0005-remoteproc-rpmsg_virtio-change-sched_yeild-to-usleep.patch
@@ -0,0 +1,49 @@
+From 8892766fc72db6d607e2057be0cf7386ee7fea14 Mon Sep 17 00:00:00 2001
+From: wangyongrong <wa...@xiaomi.com>
+Date: Wed, 3 Jul 2024 10:00:34 +0800
+Subject: [PATCH 05/14] remoteproc/rpmsg_virtio: change sched_yeild to usleep
+
+Change-Id: I4246185cb1d2f363df170e2aa03a1901b0a296a8
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
+---
+ lib/remoteproc/remoteproc_virtio.c | 3 ++-
+ lib/rpmsg/rpmsg_virtio.c           | 3 +--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/lib/remoteproc/remoteproc_virtio.c open-amp/lib/remoteproc/remoteproc_virtio.c
+index ef39c49..aae026c 100644
+--- a/lib/remoteproc/remoteproc_virtio.c
++++ open-amp/lib/remoteproc/remoteproc_virtio.c
+@@ -15,6 +15,7 @@
+ #include <metal/cpu.h>
+ #include <metal/utilities.h>
+ #include <metal/alloc.h>
++#include <metal/sleep.h>
+ 
+ static void rproc_virtio_delete_virtqueues(struct virtio_device *vdev)
+ {
+@@ -412,6 +413,6 @@ void rproc_virtio_wait_remote_ready(struct virtio_device *vdev)
+ 		status = rproc_virtio_get_status(vdev);
+ 		if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
+ 			return;
+-		metal_cpu_yield();
++		metal_sleep_usec(1000);
+ 	}
+ }
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index ad9a730..db3392e 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -272,8 +272,7 @@ static int rpmsg_virtio_wait_remote_ready(struct rpmsg_virtio_device *rvdev)
+ 		} else if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK) {
+ 			return 0;
+ 		}
+-		/* TODO: clarify metal_cpu_yield usage*/
+-		metal_cpu_yield();
++		metal_sleep_usec(1000);
+ 	}
+ }
+ 
+-- 
+2.34.1
+
diff --git a/openamp/0005-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch b/openamp/0005-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
deleted file mode 100644
index 3edd6d971d..0000000000
--- a/openamp/0005-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 5a9d63c1ce2878aa792c49a1205ebb73dbe6258f Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Mon, 28 Feb 2022 16:31:54 +0800
-Subject: [PATCH 05/10] rpmsg_virtio: don't need check status when
- get_tx_payload
-
-VELAOS-21
-
-Change-Id: Icb01034dfab146b3a02ea2c70dbdf197d8ed419f
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/rpmsg/rpmsg_virtio.c | 5 -----
- 1 file changed, 5 deletions(-)
-
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 4960aa8a..1f6ce593 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -356,11 +356,6 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
- 	/* Get the associated remote device for channel. */
- 	rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev);
- 
--	/* Validate device state */
--	status = rpmsg_virtio_get_status(rvdev);
--	if (!(status & VIRTIO_CONFIG_STATUS_DRIVER_OK))
--		return NULL;
--
- 	if (wait)
- 		tick_count = RPMSG_TICK_COUNT / RPMSG_TICKS_PER_INTERVAL;
- 	else
--- 
-2.25.1
-
diff --git a/openamp/0006-lib-system-nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch b/openamp/0006-lib-system-nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch
new file mode 100644
index 0000000000..baabca6003
--- /dev/null
+++ b/openamp/0006-lib-system-nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch
@@ -0,0 +1,28 @@
+From b9181b30e8fc1c7ee058b34e6cfe2f54c43af665 Mon Sep 17 00:00:00 2001
+From: Bowen Wang <wa...@xiaomi.com>
+Date: Wed, 9 Oct 2024 20:54:56 +0800
+Subject: [PATCH 6/6] lib/system/nuttx/io.c: include <stddef.h> in nuttx/io.c
+
+Because nuttx/io.c use NULL and NULL is defined in <stddef.h>
+
+Change-Id: I98af56739e6beb6f165ef165e700c3ed8305d1d1
+Signed-off-by: Bowen Wang <wa...@xiaomi.com>
+---
+ lib/system/nuttx/io.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/lib/system/nuttx/io.c libmetal/lib/system/nuttx/io.c
+index 41697a7..cc5e0a7 100644
+--- a/lib/system/nuttx/io.c
++++ libmetal/lib/system/nuttx/io.c
+@@ -4,6 +4,7 @@
+  * SPDX-License-Identifier: BSD-3-Clause
+  */
+ 
++#include <stddef.h>
+ #include <metal/cache.h>
+ #include <metal/io.h>
+ #include <nuttx/arch.h>
+-- 
+2.34.1
+
diff --git a/openamp/0006-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch b/openamp/0006-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
deleted file mode 100644
index b7666e9b7f..0000000000
--- a/openamp/0006-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From a2c9d79f9b77f057d89ede1395559c0645169b7a Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Tue, 19 Oct 2021 19:45:14 +0800
-Subject: [PATCH 06/10] rpmsg: notify the user when the remote address is
- received
-
-Change-Id: I2f0601fb38944e0cfb8888aa397740161b159e40
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/include/openamp/rpmsg.h | 4 ++++
- lib/rpmsg/rpmsg_virtio.c    | 6 ++++++
- 2 files changed, 10 insertions(+)
-
-diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
-index 14440e20..fbd7f619 100644
---- a/lib/include/openamp/rpmsg.h
-+++ open-amp/lib/include/openamp/rpmsg.h
-@@ -58,6 +58,7 @@ struct rpmsg_device;
- /* Returns positive value on success or negative error value on failure */
- typedef int (*rpmsg_ept_cb)(struct rpmsg_endpoint *ept, void *data,
- 			    size_t len, uint32_t src, void *priv);
-+typedef void (*rpmsg_ns_bound_cb)(struct rpmsg_endpoint *ept);
- typedef void (*rpmsg_ns_unbind_cb)(struct rpmsg_endpoint *ept);
- typedef void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev,
- 				 const char *name, uint32_t dest);
-@@ -70,6 +71,8 @@ typedef void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev,
-  * @dest_addr: address of the default remote endpoint binded.
-  * @cb: user rx callback, return value of this callback is reserved
-  *      for future use, for now, only allow RPMSG_SUCCESS as return value.
-+ * @ns_bound_cb: end point service bound callback, called when remote
-+ *                ept address is received.
-  * @ns_unbind_cb: end point service unbind callback, called when remote
-  *                ept is destroyed.
-  * @node: end point node.
-@@ -84,6 +87,7 @@ struct rpmsg_endpoint {
- 	uint32_t addr;
- 	uint32_t dest_addr;
- 	rpmsg_ept_cb cb;
-+	rpmsg_ns_bound_cb ns_bound_cb;
- 	rpmsg_ns_unbind_cb ns_unbind_cb;
- 	struct metal_list node;
- 	void *priv;
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 1f6ce593..efbcd68d 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -658,12 +658,18 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
- 			if (_ept->name[0] && rdev->support_ack)
- 				rpmsg_send_ns_message(_ept,
- 						      RPMSG_NS_CREATE_ACK);
-+			/* notify application that the endpoint has been bound */
-+			if (_ept->ns_bound_cb)
-+				_ept->ns_bound_cb(_ept);
- 		}
- 	} else { /* RPMSG_NS_CREATE_ACK */
- 		/* save the received destination address */
- 		if (_ept)
- 			_ept->dest_addr = dest;
- 		metal_mutex_release(&rdev->lock);
-+		/* notify application that the endpoint has been bound */
-+		if (_ept && _ept->ns_bound_cb)
-+			_ept->ns_bound_cb(_ept);
- 	}
- 
- 	return RPMSG_SUCCESS;
--- 
-2.25.1
-
diff --git a/openamp/0003-rpmsg-wait-endpoint-ready-in-rpmsg_send-and-rpmsg_se.patch b/openamp/0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch
similarity index 75%
rename from openamp/0003-rpmsg-wait-endpoint-ready-in-rpmsg_send-and-rpmsg_se.patch
rename to openamp/0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch
index 9bbcc089fd..f82073bae5 100644
--- a/openamp/0003-rpmsg-wait-endpoint-ready-in-rpmsg_send-and-rpmsg_se.patch
+++ b/openamp/0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch
@@ -1,19 +1,20 @@
-From 931cd95ab99550befa75703cc36d5e6f6964b63e Mon Sep 17 00:00:00 2001
-From: Guiding Li <li...@pinecone.net>
+From 9ed3332f08c9877deb4dcabb7447b634abe8845e Mon Sep 17 00:00:00 2001
+From: ligd <li...@pinecone.net>
 Date: Wed, 20 Feb 2019 11:36:57 +0800
-Subject: [PATCH 03/10] rpmsg: wait endpoint ready in rpmsg_send and
- rpmsg_send_nocopy
+Subject: [PATCH 06/14] rpmsg: wait ept ready in rpmsg_send
 
-because the remote need time to return the destination address
+since the destination address need time to return from peer
 
-Signed-off-by: Guiding Li <li...@pinecone.net>
+Change-Id: I1a518c15cd375205b07861c7d39670de555eaaed
+Signed-off-by: ligd <li...@pinecone.net>
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
 ---
  lib/include/openamp/rpmsg.h | 59 ++++++++++++++++++++++++++-----------
  lib/rpmsg/rpmsg_virtio.c    |  7 -----
  2 files changed, 42 insertions(+), 24 deletions(-)
 
 diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
-index ff3ff8fb..dbe42ea6 100644
+index bb1c160..cb1a648 100644
 --- a/lib/include/openamp/rpmsg.h
 +++ open-amp/lib/include/openamp/rpmsg.h
 @@ -15,6 +15,7 @@
@@ -37,12 +38,12 @@ index ff3ff8fb..dbe42ea6 100644
  /* Error macros. */
  #define RPMSG_SUCCESS			0
  #define RPMSG_ERROR_BASE		-2000
-@@ -147,6 +154,19 @@ int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src,
+@@ -186,6 +193,19 @@ int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src,
  			      uint32_t dst, const void *data, int len,
  			      int wait);
  
 +/**
-+ * is_rpmsg_ept_ready - check if the rpmsg endpoint ready to send
++ * @brief Check if the rpmsg endpoint ready to send
 + *
 + * @ept: pointer to rpmsg endpoint
 + *
@@ -55,9 +56,9 @@ index ff3ff8fb..dbe42ea6 100644
 +}
 +
  /**
-  * rpmsg_send() - send a message across to the remote processor
-  * @ept: the rpmsg endpoint
-@@ -165,11 +185,20 @@ int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src,
+  * @brief Send a message across to the remote processor
+  *
+@@ -205,11 +225,20 @@ int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src,
  static inline int rpmsg_send(struct rpmsg_endpoint *ept, const void *data,
  			     int len)
  {
@@ -80,7 +81,7 @@ index ff3ff8fb..dbe42ea6 100644
  }
  
  /**
-@@ -476,11 +505,20 @@ static inline int rpmsg_sendto_nocopy(struct rpmsg_endpoint *ept,
+@@ -545,11 +574,20 @@ static inline int rpmsg_sendto_nocopy(struct rpmsg_endpoint *ept,
  static inline int rpmsg_send_nocopy(struct rpmsg_endpoint *ept,
  				    const void *data, int len)
  {
@@ -103,16 +104,16 @@ index ff3ff8fb..dbe42ea6 100644
  }
  
  /**
-@@ -524,19 +562,6 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
+@@ -594,19 +632,6 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
   */
  void rpmsg_destroy_ept(struct rpmsg_endpoint *ept);
  
 -/**
-- * is_rpmsg_ept_ready - check if the rpmsg endpoint ready to send
+- * @brief Check if the rpmsg endpoint ready to send
 - *
-- * @ept: pointer to rpmsg endpoint
+- * @param ept	Pointer to rpmsg endpoint
 - *
-- * Returns 1 if the rpmsg endpoint has both local addr and destination
+- * @return 1 if the rpmsg endpoint has both local addr and destination
 - * addr set, 0 otherwise
 - */
 -static inline unsigned int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept)
@@ -124,17 +125,17 @@ index ff3ff8fb..dbe42ea6 100644
  }
  #endif
 diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 69537399..c56e0cea 100644
+index db3392e..e6a4969 100644
 --- a/lib/rpmsg/rpmsg_virtio.c
 +++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -10,7 +10,6 @@
+@@ -9,7 +9,6 @@
+  */
  
  #include <metal/alloc.h>
- #include <metal/cache.h>
 -#include <metal/sleep.h>
  #include <metal/utilities.h>
  #include <openamp/rpmsg_virtio.h>
- #include <openamp/virtqueue.h>
+ #include <openamp/remoteproc.h>
 @@ -19,12 +18,6 @@
  
  #define RPMSG_NUM_VRINGS                        2
@@ -145,9 +146,9 @@ index 69537399..c56e0cea 100644
 -/* Time to wait - In multiple of 1 msecs. */
 -#define RPMSG_TICKS_PER_INTERVAL                1000
 -
- /**
-  * struct vbuff_reclaimer_t - vring buffer recycler
-  *
+ /*
+  * Get the buffer held counter value.
+  * If 0 the buffer can be released
 -- 
-2.25.1
+2.34.1
 
diff --git a/openamp/0007-openamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch b/openamp/0007-openamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch
new file mode 100644
index 0000000000..07b930c700
--- /dev/null
+++ b/openamp/0007-openamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch
@@ -0,0 +1,43 @@
+From 9a8e63285c30026a8fabaf0ed8af323eafd07539 Mon Sep 17 00:00:00 2001
+From: ligd <li...@xiaomi.com>
+Date: Thu, 23 Jun 2022 00:41:13 +0800
+Subject: [PATCH 07/14] openamp: add VIRTIO_RING_F_MUST_NOTIFY event
+
+Change-Id: I455c4a5427fbcc60c6f61707c4304c12aa13ee58
+Signed-off-by: ligd <li...@xiaomi.com>
+---
+ lib/include/openamp/virtqueue.h | 3 +++
+ lib/virtio/virtqueue.c          | 3 +++
+ 2 files changed, 6 insertions(+)
+
+diff --git a/lib/include/openamp/virtqueue.h open-amp/lib/include/openamp/virtqueue.h
+index 8194398..dd42c3a 100644
+--- a/lib/include/openamp/virtqueue.h
++++ open-amp/lib/include/openamp/virtqueue.h
+@@ -48,6 +48,9 @@ extern "C" {
+ /* Support to suppress interrupt until specific index is reached. */
+ #define VIRTIO_RING_F_EVENT_IDX        (1 << 29)
+ 
++/* Support to can't suppress interrupt. */
++#define VIRTIO_RING_F_MUST_NOTIFY      (1 << 30)
++
+ /* cache invalidation helpers */
+ #define CACHE_FLUSH(x, s)		metal_cache_flush(x, s)
+ #define CACHE_INVALIDATE(x, s)		metal_cache_invalidate(x, s)
+diff --git a/lib/virtio/virtqueue.c open-amp/lib/virtio/virtqueue.c
+index 363fda8..7ffe569 100644
+--- a/lib/virtio/virtqueue.c
++++ open-amp/lib/virtio/virtqueue.c
+@@ -609,6 +609,9 @@ static int vq_ring_must_notify(struct virtqueue *vq)
+ {
+ 	uint16_t new_idx, prev_idx, event_idx;
+ 
++	if (vq->vq_dev->features & VIRTIO_RING_F_MUST_NOTIFY)
++		return 1;
++
+ 	if (vq->vq_dev->features & VIRTIO_RING_F_EVENT_IDX) {
+ 		if (VIRTIO_ROLE_IS_DRIVER(vq->vq_dev)) {
+ 			/* CACHE: no need to invalidate avail */
+-- 
+2.34.1
+
diff --git a/openamp/0007-openamp-avoid-double-calling-ns_bound-when-each-othe.patch b/openamp/0007-openamp-avoid-double-calling-ns_bound-when-each-othe.patch
deleted file mode 100644
index 31a781f0a1..0000000000
--- a/openamp/0007-openamp-avoid-double-calling-ns_bound-when-each-othe.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From 0e77783658066c02903cc6693460f3bb577e3030 Mon Sep 17 00:00:00 2001
-From: Jiuzhu Dong <do...@xiaomi.com>
-Date: Mon, 11 Apr 2022 13:31:35 +0800
-Subject: [PATCH 07/10] openamp: avoid double calling ns_bound when each other
- calls create_ept
-
-VELAPLATFO-1522
-
-Change-Id: I78c027e3fcaf54126b75358b91b557e477955964
-Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
----
- lib/rpmsg/rpmsg_virtio.c | 17 +++++++++++------
- 1 file changed, 11 insertions(+), 6 deletions(-)
-
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index efbcd68d..49817799 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -652,7 +652,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
- 			metal_mutex_release(&rdev->lock);
- 			if (rdev->ns_bind_cb)
- 				rdev->ns_bind_cb(rdev, name, dest);
--		} else {
-+		} else if (_ept->dest_addr == RPMSG_ADDR_ANY) {
- 			_ept->dest_addr = dest;
- 			metal_mutex_release(&rdev->lock);
- 			if (_ept->name[0] && rdev->support_ack)
-@@ -662,14 +662,19 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
- 			if (_ept->ns_bound_cb)
- 				_ept->ns_bound_cb(_ept);
- 		}
-+		else
-+			metal_mutex_release(&rdev->lock);
- 	} else { /* RPMSG_NS_CREATE_ACK */
- 		/* save the received destination address */
--		if (_ept)
-+		if (_ept && _ept->dest_addr == RPMSG_ADDR_ANY) {
- 			_ept->dest_addr = dest;
--		metal_mutex_release(&rdev->lock);
--		/* notify application that the endpoint has been bound */
--		if (_ept && _ept->ns_bound_cb)
--			_ept->ns_bound_cb(_ept);
-+			metal_mutex_release(&rdev->lock);
-+			/* notify application that the endpoint has been bound */
-+			if (_ept->ns_bound_cb)
-+				_ept->ns_bound_cb(_ept);
-+		}
-+		else
-+			metal_mutex_release(&rdev->lock);
- 	}
- 
- 	return RPMSG_SUCCESS;
--- 
-2.25.1
-
diff --git a/openamp/0008-remoteproc-make-all-elf_-functions-static-except-elf.patch b/openamp/0008-remoteproc-make-all-elf_-functions-static-except-elf.patch
deleted file mode 100644
index fb5e9d5e11..0000000000
--- a/openamp/0008-remoteproc-make-all-elf_-functions-static-except-elf.patch
+++ /dev/null
@@ -1,195 +0,0 @@
-From bcd10078fe4266cadbc437b130832dd90c00df33 Mon Sep 17 00:00:00 2001
-From: Xiang Xiao <xi...@xiaomi.com>
-Date: Fri, 15 Nov 2019 19:01:49 +0800
-Subject: [PATCH 08/10] remoteproc: make all elf_* functions static except
- elf_identify
-
-it's the best practice to reduce the name scope as small as possible
-
-Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
----
- lib/include/openamp/elf_loader.h | 93 --------------------------------
- lib/remoteproc/elf_loader.c      | 28 +++++-----
- 2 files changed, 14 insertions(+), 107 deletions(-)
-
-diff --git a/lib/include/openamp/elf_loader.h open-amp/lib/include/openamp/elf_loader.h
-index e7dda748..916a23f9 100644
---- a/lib/include/openamp/elf_loader.h
-+++ open-amp/lib/include/openamp/elf_loader.h
-@@ -323,99 +323,6 @@ extern const struct loader_ops elf_ops;
-  */
- int elf_identify(const void *img_data, size_t len);
- 
--/**
-- * elf_load_header - Load ELF headers
-- *
-- * It will get the ELF header, the program header, and the section header.
-- *
-- * @img_data: image data
-- * @offset: input image data offset to the start of image file
-- * @len: input image data length
-- * @img_info: pointer to store image information data
-- * @last_load_state: last state return by this function
-- * @noffset: pointer to next offset required by loading ELF header
-- * @nlen: pointer to next data length required by loading ELF header
-- *
-- * return ELF loading header state, or negative value for failure
-- */
--int elf_load_header(const void *img_data, size_t offset, size_t len,
--		    void **img_info, int last_load_state,
--		    size_t *noffset, size_t *nlen);
--
--/**
-- * elf_load - load ELF data
-- *
-- * It will parse the ELF image and return the target device address,
-- * offset to the start of the ELF image of the data to load and the
-- * length of the data to load.
-- *
-- * @rproc: pointer to remoteproc instance
-- * @img_data: image data which will passed to the function.
-- *            it can be NULL, if image data doesn't need to be handled
-- *            by the load function. E.g. binary data which was
-- *            loaded to the target memory.
-- * @offset: last loaded image data offset to the start of image file
-- * @len: last loaded image data length
-- * @img_info: pointer to store image information data
-- * @last_load_state: the returned state of the last function call.
-- * @da: target device address, if the data to load is not for target memory
-- *      the da will be set to ANY.
-- * @noffset: pointer to next offset required by loading ELF header
-- * @nlen: pointer to next data length required by loading ELF header
-- * @padding: value to pad it is possible that a size of a segment in memory
-- *           is larger than what it is in the ELF image. e.g. a segment
-- *           can have stack section .bss. It doesn't need to copy image file
-- *           space, in this case, it will be packed with 0.
-- * @nmemsize: pointer to next data target memory size. The size of a segment
-- *            in the target memory can be larger than the its size in the
-- *            image file.
-- *
-- * return 0 for success, otherwise negative value for failure
-- */
--int elf_load(struct remoteproc *rproc, const void *img_data,
--	     size_t offset, size_t len,
--	     void **img_info, int last_load_state,
--	     metal_phys_addr_t *da,
--	     size_t *noffset, size_t *nlen,
--	     unsigned char *padding, size_t *nmemsize);
--
--/**
-- * elf_release - Release ELF image information
-- *
-- * It will release ELF image information data.
-- *
-- * @img_info: pointer to ELF image information
-- */
--void elf_release(void *img_info);
--
--/**
-- * elf_get_entry - Get entry point
-- *
-- * It will return entry point specified in the ELF file.
-- *
-- * @img_info: pointer to ELF image information
-- *
-- * return entry address
-- */
--metal_phys_addr_t elf_get_entry(void *img_info);
--
--/**
-- * elf_locate_rsc_table - locate the resource table information
-- *
-- * It will return the length of the resource table, and the device address of
-- * the resource table.
-- *
-- * @img_info: pointer to ELF image information
-- * @da: pointer to the device address
-- * @offset: pointer to the offset to in the ELF image of the resource
-- *          table section.
-- * @size: pointer to the size of the resource table section.
-- *
-- * return 0 if successfully locate the resource table, negative value for
-- * failure.
-- */
--int elf_locate_rsc_table(void *img_info, metal_phys_addr_t *da,
--			 size_t *offset, size_t *size);
- 
- #if defined __cplusplus
- }
-diff --git a/lib/remoteproc/elf_loader.c open-amp/lib/remoteproc/elf_loader.c
-index c90b8d46..ffb253fb 100644
---- a/lib/remoteproc/elf_loader.c
-+++ open-amp/lib/remoteproc/elf_loader.c
-@@ -392,9 +392,9 @@ int elf_identify(const void *img_data, size_t len)
- 		return 0;
- }
- 
--int elf_load_header(const void *img_data, size_t offset, size_t len,
--		    void **img_info, int last_load_state,
--		    size_t *noffset, size_t *nlen)
-+static int elf_load_header(const void *img_data, size_t offset, size_t len,
-+			   void **img_info, int last_load_state,
-+			   size_t *noffset, size_t *nlen)
- {
- 	int *load_state;
- 
-@@ -531,12 +531,12 @@ int elf_load_header(const void *img_data, size_t offset, size_t len,
- 	return last_load_state;
- }
- 
--int elf_load(struct remoteproc *rproc,
--	     const void *img_data, size_t offset, size_t len,
--	     void **img_info, int last_load_state,
--	     metal_phys_addr_t *da,
--	     size_t *noffset, size_t *nlen,
--	     unsigned char *padding, size_t *nmemsize)
-+static int elf_load(struct remoteproc *rproc,
-+		    const void *img_data, size_t offset, size_t len,
-+		    void **img_info, int last_load_state,
-+		    metal_phys_addr_t *da,
-+		    size_t *noffset, size_t *nlen,
-+		    unsigned char *padding, size_t *nmemsize)
- {
- 	int *load_state;
- 	const void *phdr;
-@@ -614,7 +614,7 @@ int elf_load(struct remoteproc *rproc,
- 	return *load_state;
- }
- 
--void elf_release(void *img_info)
-+static void elf_release(void *img_info)
- {
- 	if (!img_info)
- 		return;
-@@ -642,7 +642,7 @@ void elf_release(void *img_info)
- 	}
- }
- 
--metal_phys_addr_t elf_get_entry(void *elf_info)
-+static metal_phys_addr_t elf_get_entry(void *elf_info)
- {
- 	if (!elf_info)
- 		return METAL_BAD_PHYS;
-@@ -662,8 +662,8 @@ metal_phys_addr_t elf_get_entry(void *elf_info)
- 	}
- }
- 
--int elf_locate_rsc_table(void *elf_info, metal_phys_addr_t *da,
--			 size_t *offset, size_t *size)
-+static int elf_locate_rsc_table(void *elf_info, metal_phys_addr_t *da,
-+				size_t *offset, size_t *size)
- {
- 	char *sect_name = ".resource_table";
- 	void *shdr;
-@@ -687,7 +687,7 @@ int elf_locate_rsc_table(void *elf_info, metal_phys_addr_t *da,
- 	return 0;
- }
- 
--int elf_get_load_state(void *img_info)
-+static int elf_get_load_state(void *img_info)
- {
- 	int *load_state;
- 
--- 
-2.25.1
-
diff --git a/openamp/0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch b/openamp/0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
new file mode 100644
index 0000000000..8eb9b5ed31
--- /dev/null
+++ b/openamp/0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
@@ -0,0 +1,39 @@
+From b092024f77f34c679b0537f6481947d297bca281 Mon Sep 17 00:00:00 2001
+From: wangyongrong <wa...@xiaomi.com>
+Date: Wed, 3 Jul 2024 10:28:31 +0800
+Subject: [PATCH 08/14] rpmsg_virtio: don't need check status when
+ get_tx_payload
+
+Change-Id: I6c0632a6924dafeb0c01ec0b16c9f53d2fbc6810
+Signed-off-by: ligd <li...@xiaomi.com>
+---
+ lib/rpmsg/rpmsg_virtio.c | 6 ------
+ 1 file changed, 6 deletions(-)
+
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index e6a4969..9dd14b6 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -352,7 +352,6 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
+ {
+ 	struct rpmsg_virtio_device *rvdev;
+ 	struct rpmsg_hdr *rp_hdr;
+-	uint8_t virtio_status;
+ 	uint16_t idx;
+ 	int tick_count;
+ 	int status;
+@@ -360,11 +359,6 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
+ 	/* Get the associated remote device for channel. */
+ 	rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev);
+ 
+-	/* Validate device state */
+-	status = virtio_get_status(rvdev->vdev, &virtio_status);
+-	if (status || !(virtio_status & VIRTIO_CONFIG_STATUS_DRIVER_OK))
+-		return NULL;
+-
+ 	if (wait)
+ 		tick_count = RPMSG_TICK_COUNT / RPMSG_TICKS_PER_INTERVAL;
+ 	else
+-- 
+2.34.1
+
diff --git a/openamp/0009-Fix-warn-declaration-of-vring_rsc-shadows-a-previous.patch b/openamp/0009-Fix-warn-declaration-of-vring_rsc-shadows-a-previous.patch
deleted file mode 100644
index 853565f0de..0000000000
--- a/openamp/0009-Fix-warn-declaration-of-vring_rsc-shadows-a-previous.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From e33b3fa0b6f111b54648f682102266b077a0c285 Mon Sep 17 00:00:00 2001
-From: Xiang Xiao <xi...@xiaomi.com>
-Date: Sun, 6 Nov 2022 00:51:35 +0800
-Subject: [PATCH 09/10] Fix warn: declaration of 'vring_rsc' shadows a previous
- local
-
-regressed by commit 03c80a13417f67f94852cf7d5cb160f1bdf8271e
-Author: Tammy Leino <ta...@mentor.com>
-Date:   Mon Sep 26 08:14:35 2022 -0700
-
-    handle_vdev_rsc must return error if notifyid cannot be assigned
-
-    Updated handle_vdev_rsc to return error if a unique id cannot be assigned
-    Signed-off-by: Tammy Leino <ta...@mentor.com>
-
-Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
----
- lib/remoteproc/rsc_table_parser.c | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/lib/remoteproc/rsc_table_parser.c open-amp/lib/remoteproc/rsc_table_parser.c
-index 80879380..4cccf4f1 100644
---- a/lib/remoteproc/rsc_table_parser.c
-+++ open-amp/lib/remoteproc/rsc_table_parser.c
-@@ -144,8 +144,6 @@ int handle_vdev_rsc(struct remoteproc *rproc, void *rsc)
- 
- 	num_vrings = vdev_rsc->num_of_vrings;
- 	for (i = 0; i < num_vrings; i++) {
--		struct fw_rsc_vdev_vring *vring_rsc;
--
- 		vring_rsc = &vdev_rsc->vring[i];
- 		notifyid = vring_rsc->notifyid;
- 		notifyid = remoteproc_allocate_id(rproc,
--- 
-2.25.1
-
diff --git a/openamp/0009-openamp-swap-get_rx_buffer-return_rx_buffer-to-resol.patch b/openamp/0009-openamp-swap-get_rx_buffer-return_rx_buffer-to-resol.patch
new file mode 100644
index 0000000000..e053318bf1
--- /dev/null
+++ b/openamp/0009-openamp-swap-get_rx_buffer-return_rx_buffer-to-resol.patch
@@ -0,0 +1,58 @@
+From fc935c6e5abcd0a96e5c3ca3bd5ec272543abc1a Mon Sep 17 00:00:00 2001
+From: ligd <li...@xiaomi.com>
+Date: Fri, 7 Apr 2023 12:42:09 +0800
+Subject: [PATCH 09/14] openamp: swap get_rx_buffer & return_rx_buffer to
+ resolve remote low power.
+
+Change-Id: I84e8b3a7a6796b5865da482db0408d5a08c55c2a
+Signed-off-by: ligd <li...@xiaomi.com>
+Signed-off-by: wangyongrong <wa...@xiaomi.com>
+---
+ lib/rpmsg/rpmsg_virtio.c | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index 9dd14b6..dfd36e3 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -545,17 +545,26 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq)
+ 	struct virtio_device *vdev = vq->vq_dev;
+ 	struct rpmsg_virtio_device *rvdev = vdev->priv;
+ 	struct rpmsg_device *rdev = &rvdev->rdev;
++	struct rpmsg_hdr *next_hdr = NULL;
+ 	struct rpmsg_endpoint *ept;
+ 	struct rpmsg_hdr *rp_hdr;
++	uint32_t next_len;
++	uint16_t next_idx;
+ 	uint32_t len;
+ 	uint16_t idx;
+ 	int status;
+ 
+ 	while (1) {
+ 		/* Process the received data from remote node */
+-		metal_mutex_acquire(&rdev->lock);
+-		rp_hdr = rpmsg_virtio_get_rx_buffer(rvdev, &len, &idx);
+-		metal_mutex_release(&rdev->lock);
++		if (!next_hdr) {
++			metal_mutex_acquire(&rdev->lock);
++			rp_hdr = rpmsg_virtio_get_rx_buffer(rvdev, &len, &idx);
++			metal_mutex_release(&rdev->lock);
++		} else {
++			rp_hdr = next_hdr;
++			len = next_len;
++			idx = next_idx;
++		}
+ 
+ 		/* No more filled rx buffers */
+ 		if (!rp_hdr)
+@@ -587,6 +596,7 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq)
+ 
+ 		metal_mutex_acquire(&rdev->lock);
+ 		rpmsg_ept_decref(ept);
++		next_hdr = rpmsg_virtio_get_rx_buffer(rvdev, &next_len, &next_idx);
+ 		if (rpmsg_virtio_buf_held_dec_test(rp_hdr))
+ 			rpmsg_virtio_release_rx_buffer_nolock(rvdev, rp_hdr);
+ 		metal_mutex_release(&rdev->lock);
+-- 
+2.34.1
+
diff --git a/openamp/0010-rpmsg_virtio.c-virtqueue_kick-after-all-rx-buffer-re.patch b/openamp/0010-rpmsg_virtio.c-virtqueue_kick-after-all-rx-buffer-re.patch
new file mode 100644
index 0000000000..4c55516691
--- /dev/null
+++ b/openamp/0010-rpmsg_virtio.c-virtqueue_kick-after-all-rx-buffer-re.patch
@@ -0,0 +1,71 @@
+From 76fd1e2c7e967ec979a24a49ce1c9626a4279f21 Mon Sep 17 00:00:00 2001
+From: Yongrong Wang <wa...@xiaomi.com>
+Date: Wed, 10 Jul 2024 15:02:01 +0800
+Subject: [PATCH 10/14] rpmsg_virtio.c: virtqueue_kick after all rx buffer
+ release
+
+Only kick once when all the rx buffers has been returned to decrease
+the interrupt times to improve the performance
+
+Change-Id: I158e3a63063e8eff7b97a02660f2d7a6c812c493
+Signed-off-by: Yongrong Wang <wa...@xiaomi.com>
+Signed-off-by: Bowen Wang <wa...@xiaomi.com>
+---
+ lib/rpmsg/rpmsg_virtio.c | 20 +++++++++++++-------
+ 1 file changed, 13 insertions(+), 7 deletions(-)
+
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index dfd36e3..bdf9046 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -314,8 +314,6 @@ static bool rpmsg_virtio_release_rx_buffer_nolock(struct rpmsg_virtio_device *rv
+ 	/* Return buffer on virtqueue. */
+ 	len = virtqueue_get_buffer_length(rvdev->rvq, idx);
+ 	rpmsg_virtio_return_buffer(rvdev, rp_hdr, len, idx);
+-	/* Tell peer we returned an rx buffer */
+-	virtqueue_kick(rvdev->rvq);
+ 
+ 	return true;
+ }
+@@ -330,8 +328,11 @@ static void rpmsg_virtio_release_rx_buffer(struct rpmsg_device *rdev,
+ 	rp_hdr = RPMSG_LOCATE_HDR(rxbuf);
+ 
+ 	metal_mutex_acquire(&rdev->lock);
+-	if (rpmsg_virtio_buf_held_dec_test(rp_hdr))
++	if (rpmsg_virtio_buf_held_dec_test(rp_hdr)) {
+ 		rpmsg_virtio_release_rx_buffer_nolock(rvdev, rp_hdr);
++		/* Tell peer we returned an rx buffer */
++		virtqueue_kick(rvdev->rvq);
++	}
+ 	metal_mutex_release(&rdev->lock);
+ }
+ 
+@@ -560,16 +561,21 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq)
+ 			metal_mutex_acquire(&rdev->lock);
+ 			rp_hdr = rpmsg_virtio_get_rx_buffer(rvdev, &len, &idx);
+ 			metal_mutex_release(&rdev->lock);
++			if (!rp_hdr)
++				break;
+ 		} else {
++			/* No more filled rx buffers */
++			if (!next_hdr) {
++				/* Tell peer we returned some rx buffer */
++				virtqueue_kick(rvdev->rvq);
++				break;
++			}
++
+ 			rp_hdr = next_hdr;
+ 			len = next_len;
+ 			idx = next_idx;
+ 		}
+ 
+-		/* No more filled rx buffers */
+-		if (!rp_hdr)
+-			break;
+-
+ 		rp_hdr->reserved = idx;
+ 
+ 		/* Get the channel node from the remote device channels list. */
+-- 
+2.34.1
+
diff --git a/openamp/0010-rptun-fix-rptun-don-t-wait-issue-when-get-tx-patyloa.patch b/openamp/0010-rptun-fix-rptun-don-t-wait-issue-when-get-tx-patyloa.patch
deleted file mode 100644
index 99768f79e3..0000000000
--- a/openamp/0010-rptun-fix-rptun-don-t-wait-issue-when-get-tx-patyloa.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 160e7ee44228668074347226e9c0d9068c480d98 Mon Sep 17 00:00:00 2001
-From: Jiuzhu Dong <do...@xiaomi.com>
-Date: Thu, 11 Aug 2022 21:54:53 +0800
-Subject: [PATCH 10/10] rptun: fix rptun don't wait issue when get tx patyload
- buffer
-
-Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/rpmsg/rpmsg_virtio.c | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 49817799..06c6890b 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -372,8 +372,6 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
- 		status = rpmsg_virtio_notify_wait(rvdev, rvdev->rvq);
- 		if (status == RPMSG_SUCCESS)
- 			continue;
--		else if (status != RPMSG_ERR_NXIO)
--			break;
- 
- 		metal_sleep_usec(RPMSG_TICKS_PER_INTERVAL);
- 		tick_count--;
--- 
-2.25.1
-
diff --git a/openamp/0011-rpmsg-fix-rpmsg_virtio_get_tx_buffer-no-idx-return.patch b/openamp/0011-rpmsg-fix-rpmsg_virtio_get_tx_buffer-no-idx-return.patch
deleted file mode 100644
index 018dd29763..0000000000
--- a/openamp/0011-rpmsg-fix-rpmsg_virtio_get_tx_buffer-no-idx-return.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 6c7a71ed16d86638141566fa7457e2aa36112202 Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Fri, 6 Jan 2023 22:13:49 +0800
-Subject: [PATCH 1/6] rpmsg: fix rpmsg_virtio_get_tx_buffer no idx return
-
-Change-Id: Ib7004b9039403156ec39f01ecf3d29900957c3be
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/rpmsg/rpmsg_virtio.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 06c6890..fcf24cd 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -176,8 +176,10 @@ static void *rpmsg_virtio_get_tx_buffer(struct rpmsg_virtio_device *rvdev,
- 		data = r_desc;
- 
- #ifndef VIRTIO_DEVICE_ONLY
--		if (role == RPMSG_HOST)
-+		if (role == RPMSG_HOST) {
-+			*idx = r_desc->idx;
- 			*len = rvdev->config.h2r_buf_size;
-+		}
- #endif /*!VIRTIO_DEVICE_ONLY*/
- #ifndef VIRTIO_DRIVER_ONLY
- 		if (role == RPMSG_REMOTE) {
--- 
-2.25.1
-
diff --git a/openamp/0011-virtio-change-feature-to-64-bit-in-all-virtio_dispat.patch b/openamp/0011-virtio-change-feature-to-64-bit-in-all-virtio_dispat.patch
new file mode 100644
index 0000000000..abb7319a64
--- /dev/null
+++ b/openamp/0011-virtio-change-feature-to-64-bit-in-all-virtio_dispat.patch
@@ -0,0 +1,255 @@
+From 6d2bf800f07a9584ea2445b4046c2d82cddf0c6f Mon Sep 17 00:00:00 2001
+From: Yongrong Wang <wa...@xiaomi.com>
+Date: Wed, 10 Jul 2024 18:47:33 +0800
+Subject: [PATCH 11/14] virtio: change feature to 64 bit in all virtio_dispatch
+
+The virtio device feature bit has exceeded 32 bits, so change feautre
+to 64 bit like linux does to support more features
+
+Change-Id: I42c016e3e9eaac5fdbfdf19549a906bc51eb6939
+Signed-off-by: Yongrong Wang <wa...@xiaomi.com>
+---
+ lib/include/openamp/rpmsg_virtio.h |  2 +-
+ lib/include/openamp/virtio.h       | 20 ++++++-------
+ lib/remoteproc/remoteproc_virtio.c | 14 +++++-----
+ lib/rpmsg/rpmsg_virtio.c           |  2 +-
+ lib/virtio/virtio.c                |  2 +-
+ lib/virtio_mmio/virtio_mmio_drv.c  | 45 +++++++++++++++---------------
+ 6 files changed, 42 insertions(+), 43 deletions(-)
+
+diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
+index d9cfa9b..866e9eb 100644
+--- a/lib/include/openamp/rpmsg_virtio.h
++++ open-amp/lib/include/openamp/rpmsg_virtio.h
+@@ -179,7 +179,7 @@ static inline uint8_t rpmsg_virtio_get_status(struct rpmsg_virtio_device *rvdev)
+  * @return The features supported by both the rpmsg driver and rpmsg device.
+  */
+ __deprecated
+-static inline uint32_t
++static inline uint64_t
+ rpmsg_virtio_get_features(struct rpmsg_virtio_device *rvdev)
+ {
+ 	return rvdev->vdev->func->get_features(rvdev->vdev);
+diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
+index 278d2da..dd285ac 100644
+--- a/lib/include/openamp/virtio.h
++++ open-amp/lib/include/openamp/virtio.h
+@@ -156,7 +156,7 @@ struct virtio_dispatch;
+ /** @brief Device features. */
+ struct virtio_feature_desc {
+ 	/** Unique feature ID, defined in the virtio specification. */
+-	uint32_t vfd_val;
++	uint64_t vfd_val;
+ 
+ 	/** Name of the feature (for debug). */
+ 	const char *vfd_str;
+@@ -221,7 +221,7 @@ struct virtio_device {
+ const char *virtio_dev_name(uint16_t devid);
+ 
+ __deprecated void virtio_describe(struct virtio_device *dev, const char *msg,
+-				  uint32_t features,
++				  uint64_t features,
+ 				  struct virtio_feature_desc *feature_desc);
+ 
+ /**
+@@ -249,17 +249,17 @@ struct virtio_dispatch {
+ 	void (*set_status)(struct virtio_device *dev, uint8_t status);
+ 
+ 	/** Get the feature exposed by the virtio device. */
+-	uint32_t (*get_features)(struct virtio_device *dev);
++	uint64_t (*get_features)(struct virtio_device *dev);
+ 
+ 	/** Set the supported `feature` (virtio driver only). */
+-	void (*set_features)(struct virtio_device *dev, uint32_t feature);
++	void (*set_features)(struct virtio_device *dev, uint64_t feature);
+ 
+ 	/**
+ 	 * Set the supported features negotiate between the `features` parameter and features
+ 	 * supported by the device (virtio driver only).
+ 	 */
+-	uint32_t (*negotiate_features)(struct virtio_device *dev,
+-				       uint32_t features);
++	uint64_t (*negotiate_features)(struct virtio_device *dev,
++				       uint64_t features);
+ 
+ 	/**
+ 	 * Read a variable amount from the device specific (ie, network)
+@@ -422,7 +422,7 @@ static inline int virtio_write_config(struct virtio_device *vdev,
+  * @return 0 on success, otherwise error code.
+  */
+ static inline int virtio_get_features(struct virtio_device *vdev,
+-				      uint32_t *features)
++				      uint64_t *features)
+ {
+ 	if (!vdev || !features)
+ 		return -EINVAL;
+@@ -443,7 +443,7 @@ static inline int virtio_get_features(struct virtio_device *vdev,
+  * @return 0 on success, otherwise error code.
+  */
+ static inline int virtio_set_features(struct virtio_device *vdev,
+-				      uint32_t features)
++				      uint64_t features)
+ {
+ 	if (!vdev)
+ 		return -EINVAL;
+@@ -465,8 +465,8 @@ static inline int virtio_set_features(struct virtio_device *vdev,
+  * @return 0 on success, otherwise error code.
+  */
+ static inline int virtio_negotiate_features(struct virtio_device *vdev,
+-					    uint32_t features,
+-					    uint32_t *final_features)
++					    uint64_t features,
++					    uint64_t *final_features)
+ {
+ 	if (!vdev)
+ 		return -EINVAL;
+diff --git a/lib/remoteproc/remoteproc_virtio.c open-amp/lib/remoteproc/remoteproc_virtio.c
+index aae026c..902fc41 100644
+--- a/lib/remoteproc/remoteproc_virtio.c
++++ open-amp/lib/remoteproc/remoteproc_virtio.c
+@@ -165,7 +165,7 @@ static uint32_t rproc_virtio_get_dfeatures(struct virtio_device *vdev)
+ 	return features;
+ }
+ 
+-static uint32_t rproc_virtio_get_features(struct virtio_device *vdev)
++static uint64_t rproc_virtio_get_features(struct virtio_device *vdev)
+ {
+ 	struct remoteproc_virtio *rpvdev;
+ 	struct fw_rsc_vdev *vdev_rsc;
+@@ -181,12 +181,12 @@ static uint32_t rproc_virtio_get_features(struct virtio_device *vdev)
+ 			metal_io_virt_to_offset(io, &vdev_rsc->gfeatures));
+ 	dfeatures = rproc_virtio_get_dfeatures(vdev);
+ 
+-	return dfeatures & gfeatures;
++	return (uint64_t)(dfeatures & gfeatures);
+ }
+ 
+ #if VIRTIO_ENABLED(VIRTIO_DRIVER_SUPPORT)
+ static void rproc_virtio_set_features(struct virtio_device *vdev,
+-				      uint32_t features)
++				      uint64_t features)
+ {
+ 	struct remoteproc_virtio *rpvdev;
+ 	struct fw_rsc_vdev *vdev_rsc;
+@@ -197,17 +197,17 @@ static void rproc_virtio_set_features(struct virtio_device *vdev,
+ 	io = rpvdev->vdev_rsc_io;
+ 	metal_io_write32(io,
+ 			 metal_io_virt_to_offset(io, &vdev_rsc->gfeatures),
+-			 features);
++			 (uint32_t)features);
+ 	RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev));
+ 	rpvdev->notify(rpvdev->priv, vdev->notifyid);
+ }
+ 
+-static uint32_t rproc_virtio_negotiate_features(struct virtio_device *vdev,
+-						uint32_t features)
++static uint64_t rproc_virtio_negotiate_features(struct virtio_device *vdev,
++						uint64_t features)
+ {
+ 	uint32_t dfeatures = rproc_virtio_get_dfeatures(vdev);
+ 
+-	rproc_virtio_set_features(vdev, dfeatures & features);
++	rproc_virtio_set_features(vdev, dfeatures & (uint32_t)features);
+ 
+ 	return 0;
+ }
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index bdf9046..e54155f 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -805,7 +805,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
+ 	const char *vq_names[RPMSG_NUM_VRINGS];
+ 	vq_callback callback[RPMSG_NUM_VRINGS];
+ 	struct fw_rsc_config fw_config;
+-	uint32_t features;
++	uint64_t features;
+ 	int status;
+ 	unsigned int i;
+ 
+diff --git a/lib/virtio/virtio.c open-amp/lib/virtio/virtio.c
+index a442e52..e2ab3d8 100644
+--- a/lib/virtio/virtio.c
++++ open-amp/lib/virtio/virtio.c
+@@ -51,7 +51,7 @@ const char *virtio_dev_name(unsigned short devid)
+ }
+ 
+ __deprecated void virtio_describe(struct virtio_device *dev, const char *msg,
+-				  uint32_t features, struct virtio_feature_desc *desc)
++				  uint64_t features, struct virtio_feature_desc *desc)
+ {
+ 	(void)dev;
+ 	(void)msg;
+diff --git a/lib/virtio_mmio/virtio_mmio_drv.c open-amp/lib/virtio_mmio/virtio_mmio_drv.c
+index 5700471..34f2b67 100644
+--- a/lib/virtio_mmio/virtio_mmio_drv.c
++++ open-amp/lib/virtio_mmio/virtio_mmio_drv.c
+@@ -75,44 +75,43 @@ static void virtio_mmio_read_config(struct virtio_device *vdev,
+ 		d[i] = virtio_mmio_read8(vdev, VIRTIO_MMIO_CONFIG + i);
+ }
+ 
+-static uint32_t _virtio_mmio_get_features(struct virtio_device *vdev, int idx)
++static uint64_t virtio_mmio_get_features(struct virtio_device *vdev)
+ {
+-	uint32_t hfeatures;
++	uint32_t feature_hi;
++	uint32_t feature_lo;
+ 
+ 	/* Writing selection register VIRTIO_MMIO_DEVICE_FEATURES_SEL. In pure AMP
+ 	 * mode this needs to be followed by a synchronization w/ the device
+ 	 * before reading VIRTIO_MMIO_DEVICE_FEATURES
+ 	 */
+-	virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, idx);
+-	hfeatures = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES);
+-	return hfeatures & vdev->features;
++	virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, 0);
++	feature_lo = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES);
++	virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, 1);
++	feature_hi = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES);
++	return (((uint64_t)feature_hi << 32) | (uint64_t)feature_lo) &
++		   vdev->features;
+ }
+ 
+-static uint32_t virtio_mmio_get_features(struct virtio_device *vdev)
++static void virtio_mmio_set_features(struct virtio_device *vdev, uint64_t features)
+ {
+-	return _virtio_mmio_get_features(vdev, 0);
+-}
+-
+-/* This is more like negotiate_features */
+-static void _virtio_mmio_set_features(struct virtio_device *vdev,
+-				      uint32_t features, int idx)
+-{
+-	uint32_t hfeatures;
++	uint32_t feature_hi;
++	uint32_t feature_lo;
+ 
+ 	/* Writing selection register VIRTIO_MMIO_DEVICE_FEATURES_SEL. In pure AMP
+ 	 * mode this needs to be followed by a synchronization w/ the device
+ 	 * before reading VIRTIO_MMIO_DEVICE_FEATURES
+ 	 */
+-	virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, idx);
+-	hfeatures = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES);
+-	features &= hfeatures;
+-	virtio_mmio_write32(vdev, VIRTIO_MMIO_DRIVER_FEATURES, features);
+-	vdev->features = features;
+-}
++	virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, 0);
++	feature_lo = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES) &
++				 (uint32_t)features;
++	virtio_mmio_write32(vdev, VIRTIO_MMIO_DRIVER_FEATURES, feature_lo);
+ 
+-static void virtio_mmio_set_features(struct virtio_device *vdev, uint32_t features)
+-{
+-	_virtio_mmio_set_features(vdev, features, 0);
++	virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, 1);
++	feature_hi = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES) &
++				 (uint32_t)(features >> 32);
++	virtio_mmio_write32(vdev, VIRTIO_MMIO_DRIVER_FEATURES, feature_hi);
++
++	vdev->features = ((uint64_t)feature_hi << 32) | (uint64_t)feature_lo;
+ }
+ 
+ static void virtio_mmio_reset_device(struct virtio_device *vdev)
+-- 
+2.34.1
+
diff --git a/openamp/0012-rpmsg-add-new-API-rpdev_release_tx-rx_buffer.patch b/openamp/0012-rpmsg-add-new-API-rpdev_release_tx-rx_buffer.patch
deleted file mode 100644
index 456f477ed0..0000000000
--- a/openamp/0012-rpmsg-add-new-API-rpdev_release_tx-rx_buffer.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From a541d9d446e5700fd5a74cf5d8296114023b40fb Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Fri, 6 Jan 2023 22:57:02 +0800
-Subject: [PATCH 2/6] rpmsg: add new API rpdev_release_tx/rx_buffer()
-
-These API used for release tx/rx buffer from rpmsg_device
-For case:
-get_tx_buffer
-close ept
-release tx buffer failed
-
-Change-Id: I74f83ff336415ccbe0191e67315ed27a35be3983
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/include/openamp/rpmsg.h |  2 ++
- lib/rpmsg/rpmsg.c           | 32 ++++++++++++++++++++------------
- 2 files changed, 22 insertions(+), 12 deletions(-)
-
-diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
-index fbd7f61..d39a7a4 100644
---- a/lib/include/openamp/rpmsg.h
-+++ open-amp/lib/include/openamp/rpmsg.h
-@@ -360,6 +360,7 @@ void rpmsg_hold_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf);
-  * @see rpmsg_hold_rx_buffer
-  */
- void rpmsg_release_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf);
-+void rpdev_release_rx_buffer(struct rpmsg_device *rdev, void *rxbuf);
- 
- /**
-  * @brief Gets the tx buffer for message payload.
-@@ -405,6 +406,7 @@ void *rpmsg_get_tx_payload_buffer(struct rpmsg_endpoint *ept,
-  * @see rpmsg_get_tx_payload_buffer
-  */
- int rpmsg_release_tx_buffer(struct rpmsg_endpoint *ept, void *txbuf);
-+int rpdev_release_tx_buffer(struct rpmsg_device *rdev, void *txbuf);
- 
- /**
-  * rpmsg_send_offchannel_nocopy() - send a message in tx buffer reserved by
-diff --git a/lib/rpmsg/rpmsg.c open-amp/lib/rpmsg/rpmsg.c
-index 4e7f7da..93a6282 100644
---- a/lib/rpmsg/rpmsg.c
-+++ open-amp/lib/rpmsg/rpmsg.c
-@@ -157,34 +157,42 @@ void rpmsg_hold_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf)
- 		rdev->ops.hold_rx_buffer(rdev, rxbuf);
- }
- 
--void rpmsg_release_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf)
-+void rpdev_release_rx_buffer(struct rpmsg_device *rdev, void *rxbuf)
- {
--	struct rpmsg_device *rdev;
--
--	if (!ept || !ept->rdev || !rxbuf)
-+	if (!rdev || !rxbuf)
- 		return;
- 
--	rdev = ept->rdev;
--
- 	if (rdev->ops.release_rx_buffer)
- 		rdev->ops.release_rx_buffer(rdev, rxbuf);
- }
- 
--int rpmsg_release_tx_buffer(struct rpmsg_endpoint *ept, void *buf)
-+void rpmsg_release_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf)
- {
--	struct rpmsg_device *rdev;
-+	if (!ept)
-+		return;
- 
--	if (!ept || !ept->rdev || !buf)
--		return RPMSG_ERR_PARAM;
-+	rpdev_release_rx_buffer(ept->rdev, rxbuf);
-+}
- 
--	rdev = ept->rdev;
-+int rpdev_release_tx_buffer(struct rpmsg_device *rdev, void *txbuf)
-+{
-+	if (!rdev || !txbuf)
-+		return RPMSG_ERR_PERM;
- 
- 	if (rdev->ops.release_tx_buffer)
--		return rdev->ops.release_tx_buffer(rdev, buf);
-+		return rdev->ops.release_tx_buffer(rdev, txbuf);
- 
- 	return RPMSG_ERR_PERM;
- }
- 
-+int rpmsg_release_tx_buffer(struct rpmsg_endpoint *ept, void *txbuf)
-+{
-+	if (!ept)
-+		return RPMSG_ERR_PARAM;
-+
-+	return rpdev_release_tx_buffer(ept->rdev, txbuf);
-+}
-+
- void *rpmsg_get_tx_payload_buffer(struct rpmsg_endpoint *ept,
- 				  uint32_t *len, int wait)
- {
--- 
-2.25.1
-
diff --git a/openamp/0012-rpmsg_virtio.c-fix-get_tx_payload_buffer-error.patch b/openamp/0012-rpmsg_virtio.c-fix-get_tx_payload_buffer-error.patch
new file mode 100644
index 0000000000..2d6aecd846
--- /dev/null
+++ b/openamp/0012-rpmsg_virtio.c-fix-get_tx_payload_buffer-error.patch
@@ -0,0 +1,33 @@
+From 3146340e66f9dae5817c0a9592f8e375c2cf9e77 Mon Sep 17 00:00:00 2001
+From: Yongrong Wang <wa...@xiaomi.com>
+Date: Wed, 31 Jul 2024 15:36:43 +0800
+Subject: [PATCH 12/14] rpmsg_virtio.c: fix get_tx_payload_buffer error
+
+Always sleep when notify wait return not RPMSG_SUCCESS
+
+Change-Id: I2fa50e649de36114597fec09dfcf96c7d2d35546
+Signed-off-by: Yongrong Wang <wa...@xiaomi.com>
+---
+ lib/rpmsg/rpmsg_virtio.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index e54155f..7aeec5b 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -378,11 +378,9 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
+ 		 * use metal_sleep_usec() method by default.
+ 		 */
+ 		status = rpmsg_virtio_notify_wait(rvdev, rvdev->rvq);
+-		if (status == RPMSG_EOPNOTSUPP) {
++		if (status != RPMSG_SUCCESS) {
+ 			metal_sleep_usec(RPMSG_TICKS_PER_INTERVAL);
+ 			tick_count--;
+-		} else if (status == RPMSG_SUCCESS) {
+-			break;
+ 		}
+ 	}
+ 
+-- 
+2.34.1
+
diff --git a/openamp/0013-openamp-add-assert-when-get-tx-buffer-failed.patch b/openamp/0013-openamp-add-assert-when-get-tx-buffer-failed.patch
new file mode 100644
index 0000000000..781b575e00
--- /dev/null
+++ b/openamp/0013-openamp-add-assert-when-get-tx-buffer-failed.patch
@@ -0,0 +1,29 @@
+From a2f4672050433811aabfcd8abef206c28397276d Mon Sep 17 00:00:00 2001
+From: dongjiuzhu1 <do...@xiaomi.com>
+Date: Mon, 27 May 2024 20:32:46 +0800
+Subject: [PATCH 13/14] openamp: add assert when get tx buffer failed
+
+So we can found the error more eaily
+
+Change-Id: Idade291ac8d8224b1ccbe0c0120bc07c036be17a
+Signed-off-by: dongjiuzhu1 <do...@xiaomi.com>
+---
+ lib/rpmsg/rpmsg_virtio.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
+index 7aeec5b..33c6c33 100644
+--- a/lib/rpmsg/rpmsg_virtio.c
++++ open-amp/lib/rpmsg/rpmsg_virtio.c
+@@ -384,6 +384,8 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
+ 		}
+ 	}
+ 
++	metal_assert(!wait || rp_hdr != NULL);
++
+ 	if (!rp_hdr)
+ 		return NULL;
+ 
+-- 
+2.34.1
+
diff --git a/openamp/0013-openamp-add-error-log-when-ept-cb-return-error.patch b/openamp/0013-openamp-add-error-log-when-ept-cb-return-error.patch
deleted file mode 100644
index aa25c45443..0000000000
--- a/openamp/0013-openamp-add-error-log-when-ept-cb-return-error.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From c47e2e05a8402997657bd0680621ffcecaaa9971 Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Fri, 10 Feb 2023 17:05:54 +0800
-Subject: [PATCH 3/6] openamp: add error log when ept->cb return error
-
-Change-Id: Id750dc9518a7f861a74965c34a6491e5b3463e95
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/rpmsg/rpmsg_virtio.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index fcf24cd..357d821 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -571,8 +571,12 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq)
- 			status = ept->cb(ept, RPMSG_LOCATE_DATA(rp_hdr),
- 					 rp_hdr->len, rp_hdr->src, ept->priv);
- 
--			RPMSG_ASSERT(status >= 0,
--				     "unexpected callback status\r\n");
-+			if (status < 0) {
-+				metal_log(METAL_LOG_ERROR,
-+					  "ept %s, cb %p, return status %d\r\n",
-+					  ept->name, ept->cb, status);
-+				RPMSG_ASSERT(0, "unexpected callback status\r\n");
-+			}
- 		}
- 
- 		metal_mutex_acquire(&rdev->lock);
--- 
-2.25.1
-
diff --git a/openamp/0014-rpmsg-add-cache-flash-when-hold-rx-buffer.patch b/openamp/0014-rpmsg-add-cache-flash-when-hold-rx-buffer.patch
deleted file mode 100644
index fffb262859..0000000000
--- a/openamp/0014-rpmsg-add-cache-flash-when-hold-rx-buffer.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 0f3f00d2ecb1f7de470e6eaeeb74ba0ba9b66eea Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Mon, 13 Feb 2023 20:34:56 +0800
-Subject: [PATCH 4/6] rpmsg: add cache flash when hold rx buffer
-
-Assume we have 2 cpus, and use cached shram buffer
-
-CPU0                    CPU1
-
-1. send tx bufferX
-                        2. recv rx bufferX
-                        3. set idx to hdr->reserved
-                        4. handled rx bufferX
-                        5. return bufferX
-6. reuse tx bufferX
-                        7. dirty cache auto flushed, hdr changed
-8. buffer X meet error
-
-Change-Id: If6c347d121ced0c59b6172a490098689b9b7ffd7
----
- lib/rpmsg/rpmsg_virtio.c | 14 ++++++++++----
- 1 file changed, 10 insertions(+), 4 deletions(-)
-
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index fcf24cd..1a510e6 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -321,7 +321,7 @@ static void rpmsg_virtio_hold_rx_buffer(struct rpmsg_device *rdev, void *rxbuf)
- 	rp_hdr = RPMSG_LOCATE_HDR(rxbuf);
- 
- 	/* Set held status to keep buffer */
--	rp_hdr->reserved |= RPMSG_BUF_HELD;
-+	rp_hdr->reserved = RPMSG_BUF_HELD;
- }
- 
- static void rpmsg_virtio_release_rx_buffer(struct rpmsg_device *rdev,
-@@ -553,8 +553,6 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq)
- 	metal_mutex_release(&rdev->lock);
- 
- 	while (rp_hdr) {
--		rp_hdr->reserved = idx;
--
- 		/* Get the channel node from the remote device channels list. */
- 		metal_mutex_acquire(&rdev->lock);
- 		ept = rpmsg_get_ept_from_addr(rdev, rp_hdr->dst);
-@@ -578,7 +576,15 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq)
- 		metal_mutex_acquire(&rdev->lock);
- 
- 		/* Check whether callback wants to hold buffer */
--		if (!(rp_hdr->reserved & RPMSG_BUF_HELD)) {
-+		if (rp_hdr->reserved & RPMSG_BUF_HELD) {
-+			/* Yes, save idx. */
-+			rp_hdr->reserved |= idx;
-+
-+#ifdef VIRTIO_CACHED_BUFFERS
-+			metal_cache_flush(rp_hdr, sizeof(struct rpmsg_hdr));
-+#endif
-+
-+		} else {
- 			/* No, return used buffers. */
- 			rpmsg_virtio_return_buffer(rvdev, rp_hdr, len, idx);
- 		}
--- 
-2.25.1
-
diff --git a/openamp/0014-virtio.h-add-memory-operation-for-virtio-device.patch b/openamp/0014-virtio.h-add-memory-operation-for-virtio-device.patch
new file mode 100644
index 0000000000..47abc6dcca
--- /dev/null
+++ b/openamp/0014-virtio.h-add-memory-operation-for-virtio-device.patch
@@ -0,0 +1,98 @@
+From 1091cadd99315959303ab3a8227e054884c28770 Mon Sep 17 00:00:00 2001
+From: Bowen Wang <wa...@xiaomi.com>
+Date: Mon, 12 Aug 2024 10:15:24 +0800
+Subject: [PATCH 14/14] virtio.h: add memory operation for virtio device
+
+To make different virtio device/transport can use it's own memory
+region.
+
+Change-Id: I30adcc2c4215cefa8d0f7d81b6ebffd0f3ad74b5
+Signed-off-by: Bowen Wang <wa...@xiaomi.com>
+---
+ lib/include/openamp/virtio.h | 42 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 42 insertions(+)
+
+diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
+index dd285ac..1099a26 100644
+--- a/lib/include/openamp/virtio.h
++++ open-amp/lib/include/openamp/virtio.h
+@@ -152,6 +152,7 @@ struct virtio_device_id {
+ typedef void (*virtio_dev_reset_cb)(struct virtio_device *vdev);
+ 
+ struct virtio_dispatch;
++struct virtio_memory_ops;
+ 
+ /** @brief Device features. */
+ struct virtio_feature_desc {
+@@ -197,6 +198,9 @@ struct virtio_device {
+ 	/** Virtio dispatch table */
+ 	const struct virtio_dispatch *func;
+ 
++	/** Virtio device memory operations */
++	const struct virtio_memory_ops *mmops;
++
+ 	/** Private data */
+ 	void *priv;
+ 
+@@ -204,6 +208,7 @@ struct virtio_device {
+ 	unsigned int vrings_num;
+ 
+ 	/** Pointer to the virtio vring structure */
++
+ 	struct virtio_vring_info *vrings_info;
+ };
+ 
+@@ -282,6 +287,11 @@ struct virtio_dispatch {
+ 	void (*notify)(struct virtqueue *vq);
+ };
+ 
++struct virtio_memory_ops {
++	void *(*alloc)(struct virtio_device *dev, size_t size, size_t align);
++	void (*free)(struct virtio_device *dev, void *buf);
++};
++
+ /**
+  * @brief Create the virtio device virtqueue.
+  *
+@@ -499,6 +509,38 @@ static inline int virtio_reset_device(struct virtio_device *vdev)
+ 	return 0;
+ }
+ 
++/**
++ * @brief Allocate buffer from the virtio device
++ *
++ * @param vdev	Pointer to virtio device structure.
++ * @param size	Allocated buffer size.
++ * @param align	Allocated buffer alignment.
++ *
++ * @return The allocated buffer address.
++ */
++static inline void *virtio_alloc_buf(struct virtio_device *vdev,
++				     size_t size, size_t align)
++{
++	if (!vdev->mmops->alloc)
++		return NULL;
++
++	return vdev->mmops->alloc(vdev, size, align);
++}
++
++/**
++ * @brief Free buffer to the virtio device
++ *
++ * @param vdev	Pointer to virtio device structure.
++ * @param buf	Buffer need to be freed.
++ */
++static inline void virtio_free_buf(struct virtio_device *vdev, void *buf)
++{
++	if (!vdev->mmops->free)
++		return;
++
++	vdev->mmops->free(vdev, buf);
++}
++
+ #if defined __cplusplus
+ }
+ #endif
+-- 
+2.34.1
+
diff --git a/openamp/0015-rpmsg-do-cache_invalidate-when-real-data-returned.patch b/openamp/0015-rpmsg-do-cache_invalidate-when-real-data-returned.patch
deleted file mode 100644
index c52af88069..0000000000
--- a/openamp/0015-rpmsg-do-cache_invalidate-when-real-data-returned.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 7588713482056dcb8395da1d6fa470559f139e94 Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Thu, 16 Feb 2023 17:41:57 +0800
-Subject: [PATCH 5/6] rpmsg: do cache_invalidate() when real data returned
-
-Change-Id: Ib5788c3974e40421deda2d100a46f61348ccafbd
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/rpmsg/rpmsg_virtio.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 1a510e6..3db86e6 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -239,7 +239,8 @@ static void *rpmsg_virtio_get_rx_buffer(struct rpmsg_virtio_device *rvdev,
- 
- #ifdef VIRTIO_CACHED_BUFFERS
- 	/* Invalidate the buffer before returning it */
--	metal_cache_invalidate(data, *len);
-+	if (data)
-+		metal_cache_invalidate(data, *len);
- #endif /* VIRTIO_CACHED_BUFFERS */
- 
- 	return data;
--- 
-2.25.1
-
diff --git a/openamp/0016-openamp-add-new-API-rpmsg_virtio_get_rxbuffer_size.patch b/openamp/0016-openamp-add-new-API-rpmsg_virtio_get_rxbuffer_size.patch
deleted file mode 100644
index 6895b03abe..0000000000
--- a/openamp/0016-openamp-add-new-API-rpmsg_virtio_get_rxbuffer_size.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-From b03e398fb8c2016029500f058e1cdaa7cc4cb92f Mon Sep 17 00:00:00 2001
-From: ligd <li...@xiaomi.com>
-Date: Mon, 20 Feb 2023 21:08:35 +0800
-Subject: [PATCH 6/6] openamp: add new API rpmsg_virtio_get_rxbuffer_size()
-
-Change-Id: If98c7260be8524627cd1c272c164c22a9548198c
-Signed-off-by: ligd <li...@xiaomi.com>
----
- lib/include/openamp/rpmsg_virtio.h | 11 ++++++++++-
- lib/rpmsg/rpmsg_virtio.c           | 25 +++++++++++++++++++++----
- 2 files changed, 31 insertions(+), 5 deletions(-)
-
-diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
-index 11cb6df..bdc6cc6 100644
---- a/lib/include/openamp/rpmsg_virtio.h
-+++ open-amp/lib/include/openamp/rpmsg_virtio.h
-@@ -158,7 +158,7 @@ rpmsg_virtio_notify_wait(struct rpmsg_virtio_device *rvdev,
- }
- 
- /**
-- * rpmsg_virtio_get_buffer_size - get rpmsg virtio buffer size
-+ * rpmsg_virtio_get_buffer_size - get rpmsg virtio Tx buffer size
-  *
-  * @rdev - pointer to the rpmsg device
-  *
-@@ -166,6 +166,15 @@ rpmsg_virtio_notify_wait(struct rpmsg_virtio_device *rvdev,
-  */
- int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev);
- 
-+/**
-+ * rpmsg_virtio_get_rx_buffer_size - get rpmsg virtio Rx buffer size
-+ *
-+ * @rdev - pointer to the rpmsg device
-+ *
-+ * @return - next available buffer size for text, negative value for failure
-+ */
-+int rpmsg_virtio_get_rx_buffer_size(struct rpmsg_device *rdev);
-+
- /**
-  * rpmsg_init_vdev - initialize rpmsg virtio device
-  * Host side:
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 13fd496..c44b4fd 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -275,11 +275,12 @@ static int rpmsg_virtio_wait_remote_ready(struct rpmsg_virtio_device *rvdev)
-  * Returns buffer size available for sending messages.
-  *
-  * @param rvdev - pointer to rpmsg device
-+ *        tx    - tx or rx
-  *
-  * @return - buffer size
-  *
-  */
--static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev)
-+static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev, bool tx)
- {
- 	unsigned int role = rpmsg_virtio_get_role(rvdev);
- 	int length = 0;
-@@ -290,7 +291,9 @@ static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev)
- 		 * If device role is host then buffers are provided by us,
- 		 * so just provide the macro.
- 		 */
--		length = rvdev->config.h2r_buf_size - sizeof(struct rpmsg_hdr);
-+		length =
-+		    tx ? rvdev->config.h2r_buf_size : rvdev->config.r2h_buf_size
-+		    - sizeof(struct rpmsg_hdr);
- 	}
- #endif /*!VIRTIO_DEVICE_ONLY*/
- 
-@@ -301,7 +304,7 @@ static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev)
- 		 * so get the buffer size from the virtqueue.
- 		 */
- 		length =
--		    (int)virtqueue_get_desc_size(rvdev->svq) -
-+		    (int)virtqueue_get_desc_size(tx ? rvdev->svq : rvdev->rvq) -
- 		    sizeof(struct rpmsg_hdr);
- 	}
- #endif /*!VIRTIO_DRIVER_ONLY*/
-@@ -700,7 +703,21 @@ int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev)
- 		return RPMSG_ERR_PARAM;
- 	metal_mutex_acquire(&rdev->lock);
- 	rvdev = (struct rpmsg_virtio_device *)rdev;
--	size = _rpmsg_virtio_get_buffer_size(rvdev);
-+	size = _rpmsg_virtio_get_buffer_size(rvdev, true);
-+	metal_mutex_release(&rdev->lock);
-+	return size;
-+}
-+
-+int rpmsg_virtio_get_rx_buffer_size(struct rpmsg_device *rdev)
-+{
-+	int size;
-+	struct rpmsg_virtio_device *rvdev;
-+
-+	if (!rdev)
-+		return RPMSG_ERR_PARAM;
-+	metal_mutex_acquire(&rdev->lock);
-+	rvdev = (struct rpmsg_virtio_device *)rdev;
-+	size = _rpmsg_virtio_get_buffer_size(rvdev, false);
- 	metal_mutex_release(&rdev->lock);
- 	return size;
- }
--- 
-2.25.1
-
diff --git a/openamp/0017-virtio-follow-virtio-1.2-spec-add-more-virtio-status.patch b/openamp/0017-virtio-follow-virtio-1.2-spec-add-more-virtio-status.patch
deleted file mode 100644
index bc6eaef94a..0000000000
--- a/openamp/0017-virtio-follow-virtio-1.2-spec-add-more-virtio-status.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 61a7811f09b529341351c19ce1644b7e790daa5f Mon Sep 17 00:00:00 2001
-From: wangbowen6 <wa...@xiaomi.com>
-Date: Tue, 9 May 2023 11:30:09 +0800
-Subject: [PATCH 1/2] virtio: follow virtio 1.2 spec, add more virtio status
- and device
-
-Signed-off-by: wangbowen6 <wa...@xiaomi.com>
----
- lib/include/openamp/virtio.h | 37 ++++++++++++++++++++++++++----------
- lib/virtio/virtio.c          | 14 ++++++++++++++
- 2 files changed, 41 insertions(+), 10 deletions(-)
-
-diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
-index 0303a5b..3001a06 100644
---- a/lib/include/openamp/virtio.h
-+++ open-amp/lib/include/openamp/virtio.h
-@@ -15,21 +15,38 @@ extern "C" {
- #endif
- 
- /* VirtIO device IDs. */
--#define VIRTIO_ID_NETWORK    0x01UL
--#define VIRTIO_ID_BLOCK      0x02UL
--#define VIRTIO_ID_CONSOLE    0x03UL
--#define VIRTIO_ID_ENTROPY    0x04UL
--#define VIRTIO_ID_BALLOON    0x05UL
--#define VIRTIO_ID_IOMEMORY   0x06UL
--#define VIRTIO_ID_RPMSG      0x07UL /* remote processor messaging */
--#define VIRTIO_ID_SCSI       0x08UL
--#define VIRTIO_ID_9P         0x09UL
--#define VIRTIO_DEV_ANY_ID    (-1)UL
-+#define VIRTIO_ID_NETWORK      1UL
-+#define VIRTIO_ID_BLOCK        2UL
-+#define VIRTIO_ID_CONSOLE      3UL
-+#define VIRTIO_ID_ENTROPY      4UL
-+#define VIRTIO_ID_BALLOON      5UL
-+#define VIRTIO_ID_IOMEMORY     6UL
-+#define VIRTIO_ID_RPMSG        7UL /* remote processor messaging */
-+#define VIRTIO_ID_SCSI         8UL
-+#define VIRTIO_ID_9P           9UL
-+#define VIRTIO_ID_RPROC_SERIAL 11UL
-+#define VIRTIO_ID_GPU          16UL
-+#define VIRTIO_ID_INPUT        18UL
-+#define VIRTIO_ID_VSOCK        19UL
-+#define VIRTIO_ID_CRYPTO       20UL
-+#define VIRTIO_ID_IOMMU        23UL
-+#define VIRTIO_ID_MEM          24UL
-+#define VIRTIO_ID_SOUND        25UL
-+#define VIRTIO_ID_FS           26UL
-+#define VIRTIO_ID_PMEM         27UL
-+#define VIRTIO_ID_RPMB         28UL
-+#define VIRTIO_ID_SCMI         32UL
-+#define VIRTIO_ID_I2C_ADAPTER  34UL
-+#define VIRTIO_ID_BT           40UL
-+#define VIRTIO_ID_GPIO         41UL
-+#define VIRTIO_DEV_ANY_ID      -1UL
- 
- /* Status byte for guest to report progress. */
-+#define VIRTIO_CONFIG_STATUS_RESET     0x00
- #define VIRTIO_CONFIG_STATUS_ACK       0x01
- #define VIRTIO_CONFIG_STATUS_DRIVER    0x02
- #define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04
-+#define VIRTIO_CONFIG_FEATURES_OK      0x08
- #define VIRTIO_CONFIG_STATUS_NEEDS_RESET 0x40
- #define VIRTIO_CONFIG_STATUS_FAILED    0x80
- 
-diff --git a/lib/virtio/virtio.c open-amp/lib/virtio/virtio.c
-index d205784..d25aec3 100644
---- a/lib/virtio/virtio.c
-+++ open-amp/lib/virtio/virtio.c
-@@ -26,6 +26,20 @@ static const struct virtio_ident {
- 	VIRTIO_ID_IOMEMORY, "IOMemory"}, {
- 	VIRTIO_ID_SCSI, "SCSI"}, {
- 	VIRTIO_ID_9P, "9P Transport"}, {
-+	VIRTIO_ID_GPU, "GPU"}, {
-+	VIRTIO_ID_INPUT, "Input"}, {
-+	VIRTIO_ID_VSOCK, "Vsock Transport"}, {
-+	VIRTIO_ID_CRYPTO, "Crypto"}, {
-+	VIRTIO_ID_IOMMU, "IOMMU"}, {
-+	VIRTIO_ID_MEM, "Memory"}, {
-+	VIRTIO_ID_SOUND, "Sound"}, {
-+	VIRTIO_ID_FS, "File System"}, {
-+	VIRTIO_ID_PMEM, "Pmem"}, {
-+	VIRTIO_ID_RPMB, "RPMB"}, {
-+	VIRTIO_ID_SCMI, "SCMI"}, {
-+	VIRTIO_ID_I2C_ADAPTER, "I2C Adapter"}, {
-+	VIRTIO_ID_BT, "Bluetooth"}, {
-+	VIRTIO_ID_GPIO, "GPIO" }, {
- 	0, NULL}
- };
- 
--- 
-2.25.1
-
diff --git a/openamp/0018-virtio-decoupling-the-transport-layer-and-virtio-dev.patch b/openamp/0018-virtio-decoupling-the-transport-layer-and-virtio-dev.patch
deleted file mode 100644
index 77068e8eab..0000000000
--- a/openamp/0018-virtio-decoupling-the-transport-layer-and-virtio-dev.patch
+++ /dev/null
@@ -1,635 +0,0 @@
-From 3ed768a2ce3b35e64c56cd69eb48e4436bdc4c12 Mon Sep 17 00:00:00 2001
-From: wangbowen6 <wa...@xiaomi.com>
-Date: Tue, 9 May 2023 12:53:21 +0800
-Subject: [PATCH 2/2] virtio: decoupling the transport layer and virtio device
- layer
-
-1. Add virtio device api to decouple the transport layer and virtio
-   device layer.
-2. Move the vrings info and virtqueue allocation/free  to the
-   remoteproc transport layer;
-3. Because 2, modify the rpmsg device also;
-
-Change-Id: Ideb5fc388dd1626ce4ac1efd4c5120863918057b
-Signed-off-by: wangbowen6 <wa...@xiaomi.com>
----
- lib/include/openamp/rpmsg_virtio.h |  10 +-
- lib/include/openamp/virtio.h       | 128 +++++++++++++++++++-
- lib/remoteproc/remoteproc.c        |  32 -----
- lib/remoteproc/remoteproc_virtio.c | 188 +++++++++++++++++++++--------
- lib/rpmsg/rpmsg_virtio.c           |  29 ++++-
- lib/virtio/virtio.c                |  40 ------
- 6 files changed, 293 insertions(+), 134 deletions(-)
-
-diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
-index bdc6cc6..e2d166f 100644
---- a/lib/include/openamp/rpmsg_virtio.h
-+++ open-amp/lib/include/openamp/rpmsg_virtio.h
-@@ -144,8 +144,14 @@ rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev,
- 			       const char *names[],
- 			       vq_callback *callbacks)
- {
--	return virtio_create_virtqueues(rvdev->vdev, flags, nvqs, names,
--					callbacks);
-+	return rvdev->vdev->func->create_virtqueues(rvdev->vdev, flags, nvqs,
-+						    names, callbacks);
-+}
-+
-+static inline void
-+rpmsg_virtio_delete_virtqueues(struct rpmsg_virtio_device *rvdev)
-+{
-+	rvdev->vdev->func->delete_virtqueues(rvdev->vdev);
- }
- 
- static inline int
-diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
-index 3001a06..fb68c19 100644
---- a/lib/include/openamp/virtio.h
-+++ open-amp/lib/include/openamp/virtio.h
-@@ -161,6 +161,11 @@ void virtio_describe(struct virtio_device *dev, const char *msg,
-  */
- 
- struct virtio_dispatch {
-+	int (*create_virtqueues)(struct virtio_device *vdev,
-+				 unsigned int flags,
-+				 unsigned int nvqs, const char *names[],
-+				 vq_callback callbacks[]);
-+	void (*delete_virtqueues)(struct virtio_device *vdev);
- 	uint8_t (*get_status)(struct virtio_device *dev);
- 	void (*set_status)(struct virtio_device *dev, uint8_t status);
- 	uint32_t (*get_features)(struct virtio_device *dev);
-@@ -182,9 +187,126 @@ struct virtio_dispatch {
- 	int (*notify_wait)(struct virtio_device *dev, struct virtqueue *vq);
- };
- 
--int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags,
--			     unsigned int nvqs, const char *names[],
--			     vq_callback callbacks[]);
-+/**
-+ * @brief Create the virtio device virtqueue.
-+ *
-+ * @param vdev		Pointer to virtio device structure.
-+ * @param flags		Create flag.
-+ * @param nvqs		The virtqueue number.
-+ * @param names		Virtqueue names.
-+ * @param callbacks	Virtqueue callback functions.
-+ *
-+ * @return Pointer to virtio device structure.
-+ */
-+static inline int virtio_create_virtqueues(struct virtio_device *vdev,
-+					   unsigned int flags,
-+					   unsigned int nvqs,
-+					   const char *names[],
-+					   vq_callback callbacks[])
-+{
-+	return vdev->func->create_virtqueues(vdev, flags, nvqs, names,
-+					     callbacks);
-+}
-+
-+/**
-+ * @brief Delete the virtio device virtqueue.
-+ *
-+ * @param vdev	Pointer to virtio device structure.
-+ *
-+ * @return pointer to virtio device structure.
-+ */
-+static inline void virtio_delete_virtqueues(struct virtio_device *vdev)
-+{
-+	return vdev->func->delete_virtqueues(vdev);
-+}
-+
-+/**
-+ * @brief Retrieve device status.
-+ *
-+ * @param dev	Pointer to device structure.
-+ *
-+ * @return status of the device.
-+ */
-+static inline uint8_t virtio_get_status(struct virtio_device *vdev)
-+{
-+	return vdev->func->get_status(vdev);
-+}
-+
-+/**
-+ * @brief Set device status.
-+ *
-+ * @param dev		Pointer to device structure.
-+ * @param status	Value to be set as device status.
-+ */
-+static inline void virtio_set_status(struct virtio_device *vdev,
-+				     uint8_t status)
-+{
-+	vdev->func->set_status(vdev, status);
-+}
-+
-+/**
-+ * @brief Retrieve configuration data from the device.
-+ *
-+ * @param dev		Pointer to device structure.
-+ * @param offset	Offset of the data within the configuration area.
-+ * @param dst		Address of the buffer that will hold the data.
-+ * @param len		Length of the data to be retrieved.
-+ */
-+static inline void virtio_read_config(struct virtio_device *vdev,
-+				      uint32_t offset, void *dst,
-+				      int length)
-+{
-+	vdev->func->read_config(vdev, offset, dst, length);
-+}
-+
-+/**
-+ * @brief Write configuration data to the device.
-+ *
-+ * @param dev		Pointer to device structure.
-+ * @param offset	Offset of the data within the configuration area.
-+ * @param src		Address of the buffer that holds the data to write.
-+ * @param len		Length of the data to be written.
-+ */
-+static inline void virtio_write_config(struct virtio_device *vdev,
-+				       uint32_t offset, void *src,
-+				       int length)
-+{
-+	vdev->func->write_config(vdev, offset, src, length);
-+}
-+
-+/**
-+ * @brief Get the virtio device features.
-+ *
-+ * @param[in] dev	Pointer to device structure.
-+ *
-+ * @return Features supported by both the driver and the device as a bitfield.
-+ */
-+static inline uint32_t virtio_get_features(struct virtio_device *vdev)
-+{
-+	return vdev->func->get_features(vdev);
-+}
-+
-+/**
-+ * @brief Set features supported by the VIRTIO driver.
-+ *
-+ * @param dev		Pointer to device structure.
-+ * @param features	Features supported by the driver as a bitfield.
-+ */
-+static inline void virtio_set_features(struct virtio_device *vdev,
-+				       uint32_t features)
-+{
-+	return vdev->func->set_features(vdev, features);
-+}
-+
-+/**
-+ * @brief Reset virtio device.
-+ *
-+ * @param vdev	Pointer to virtio_device structure.
-+ */
-+static inline void virtio_reset_device(struct virtio_device *vdev)
-+{
-+	vdev->func->reset_device(vdev);
-+}
- 
- #if defined __cplusplus
- }
-diff --git a/lib/remoteproc/remoteproc.c open-amp/lib/remoteproc/remoteproc.c
-index 001b11b..5a38fe1 100644
---- a/lib/remoteproc/remoteproc.c
-+++ open-amp/lib/remoteproc/remoteproc.c
-@@ -921,7 +921,6 @@ remoteproc_create_virtio(struct remoteproc *rproc,
- 	struct remoteproc_virtio *rpvdev;
- 	size_t vdev_rsc_offset;
- 	unsigned int notifyid;
--	unsigned int num_vrings, i;
- 	struct metal_list *node;
- 
- #ifdef VIRTIO_DRIVER_ONLY
-@@ -969,39 +968,8 @@ remoteproc_create_virtio(struct remoteproc *rproc,
- 	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
- 	rpvdev->notify_wait = remoteproc_virtio_notify_wait;
- 	metal_list_add_tail(&rproc->vdevs, &rpvdev->node);
--	num_vrings = vdev_rsc->num_of_vrings;
--
--	/* set the notification id for vrings */
--	for (i = 0; i < num_vrings; i++) {
--		struct fw_rsc_vdev_vring *vring_rsc;
--		metal_phys_addr_t da;
--		unsigned int num_descs, align;
--		struct metal_io_region *io;
--		void *va;
--		size_t size;
--		int ret;
--
--		vring_rsc = &vdev_rsc->vring[i];
--		notifyid = vring_rsc->notifyid;
--		da = vring_rsc->da;
--		num_descs = vring_rsc->num;
--		align = vring_rsc->align;
--		size = vring_size(num_descs, align);
--		va = remoteproc_mmap(rproc, NULL, &da, size, 0, &io);
--		if (!va)
--			goto err1;
--		ret = rproc_virtio_init_vring(vdev, i, notifyid,
--					      va, io, num_descs, align);
--		if (ret)
--			goto err1;
--	}
- 	metal_mutex_release(&rproc->lock);
- 	return vdev;
--
--err1:
--	remoteproc_remove_virtio(rproc, vdev);
--	metal_mutex_release(&rproc->lock);
--	return NULL;
- }
- 
- void remoteproc_remove_virtio(struct remoteproc *rproc,
-diff --git a/lib/remoteproc/remoteproc_virtio.c open-amp/lib/remoteproc/remoteproc_virtio.c
-index 4375c4c..96767c1 100644
---- a/lib/remoteproc/remoteproc_virtio.c
-+++ open-amp/lib/remoteproc/remoteproc_virtio.c
-@@ -16,6 +16,139 @@
- #include <metal/utilities.h>
- #include <metal/alloc.h>
- 
-+static void rproc_virtio_delete_virtqueues(struct virtio_device *vdev)
-+{
-+	struct virtio_vring_info *vring_info;
-+	unsigned int i;
-+
-+	if (vdev->vrings_info != NULL) {
-+		for (i = 0; i < vdev->vrings_num; i++) {
-+			vring_info = &vdev->vrings_info[i];
-+			if (vring_info->vq != NULL) {
-+				virtqueue_free(vring_info->vq);
-+			}
-+		}
-+
-+		metal_free_memory(vdev->vrings_info);
-+	}
-+}
-+
-+static int rproc_virtio_create_virtqueue(struct virtio_device *vdev,
-+					 unsigned int flags,
-+					 unsigned int i,
-+					 const char *name,
-+					 vq_callback callback)
-+{
-+	struct remoteproc_virtio *rpvdev;
-+	struct fw_rsc_vdev_vring *vring_rsc;
-+	struct fw_rsc_vdev *vdev_rsc;
-+	struct remoteproc *rproc;
-+	struct virtio_vring_info *vring_info;
-+	struct vring_alloc_info *vring_alloc;
-+	struct metal_io_region *io;
-+	metal_phys_addr_t da;
-+	size_t vringsize;
-+	void *va;
-+	int ret;
-+
-+	/* Get remoteproc virtio device */
-+	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
-+
-+	/* Get the remoteproc */
-+	rproc = rpvdev->priv;
-+
-+	/* Get the rsc table */
-+	vdev_rsc = rpvdev->vdev_rsc;
-+	vring_rsc = &vdev_rsc->vring[i];
-+
-+	/*
-+	 * Initialize the vring information according to the vring resource
-+	 * table.
-+	 */
-+	da = vring_rsc->da;
-+	vringsize = vring_size(vring_rsc->num, vring_rsc->align);
-+	va = remoteproc_mmap(rproc, NULL, &da, vringsize, 0, &io);
-+	if (!va) {
-+		return ERROR_VQUEUE_INVLD_PARAM;
-+	}
-+
-+	ret = rproc_virtio_init_vring(vdev, i, vring_rsc->notifyid, va, io,
-+				      vring_rsc->num, vring_rsc->align);
-+	if (ret) {
-+		return ret;
-+	}
-+
-+	/* Get the vring information */
-+	vring_info = &vdev->vrings_info[i];
-+	vring_alloc = &vring_info->info;
-+
-+	/* Alloc the virtqueue and init it */
-+	vring_info->vq = virtqueue_allocate(vring_alloc->num_descs);
-+	if (!vring_info->vq) {
-+		return ERROR_NO_MEM;
-+	}
-+
-+#ifndef VIRTIO_DEVICE_ONLY
-+	if (vdev->role == VIRTIO_DEV_DRIVER) {
-+		size_t offset = metal_io_virt_to_offset(vring_info->io,
-+							vring_alloc->vaddr);
-+		metal_io_block_set(vring_info->io, offset, 0, vringsize);
-+	}
-+#endif
-+	ret = virtqueue_create(vdev, i, name, vring_alloc, callback,
-+			       vdev->func->notify, vring_info->vq);
-+	if (ret) {
-+		return ret;
-+	}
-+	return 0;
-+}
-+
-+static int rproc_virtio_create_virtqueues(struct virtio_device *vdev,
-+					  unsigned int flags,
-+					  unsigned int nvqs,
-+					  const char *names[],
-+					  vq_callback callbacks[])
-+{
-+	struct remoteproc_virtio *rpvdev;
-+	struct virtio_vring_info *vrings_info;
-+	struct fw_rsc_vdev *vdev_rsc;
-+	unsigned int i;
-+	int ret;
-+	(void)flags;
-+
-+	/* Get remoteproc virtio device, rsc table, remoteproc */
-+	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
-+	vdev_rsc = rpvdev->vdev_rsc;
-+
-+	/* Check vrings number */
-+	if (nvqs > vdev_rsc->num_of_vrings)
-+		return ERROR_VQUEUE_INVLD_PARAM;
-+
-+	/* Alloc vrings info for the virtio device */
-+	vrings_info = metal_allocate_memory(sizeof(*vrings_info) * nvqs);
-+	if (!vrings_info) {
-+		return ERROR_NO_MEM;
-+	}
-+
-+	memset(vrings_info, 0, sizeof(*vrings_info) * nvqs);
-+	vdev->vrings_info = vrings_info;
-+	vdev->vrings_num = nvqs;
-+
-+	/* set the notification id for vrings */
-+	for (i = 0; i < nvqs; i++) {
-+		ret = rproc_virtio_create_virtqueue(vdev, flags, i, names[i],
-+						    callbacks[i]);
-+		if (ret) {
-+			goto err;
-+		}
-+	}
-+	return 0;
-+
-+err:
-+	rproc_virtio_delete_virtqueues(vdev);
-+	return ret;
-+}
-+
- static void rproc_virtio_virtqueue_notify(struct virtqueue *vq)
- {
- 	struct remoteproc_virtio *rpvdev;
-@@ -148,7 +281,7 @@ static void rproc_virtio_read_config(struct virtio_device *vdev,
- 
- 	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
- 	vdev_rsc = rpvdev->vdev_rsc;
--	config = (char *)(&vdev_rsc->vring[vdev->vrings_num]);
-+	config = (char *)(&vdev_rsc->vring[vdev_rsc->num_of_vrings]);
- 	io = rpvdev->vdev_rsc_io;
- 
- 	if (offset + length <= vdev_rsc->config_len)
-@@ -168,7 +301,7 @@ static void rproc_virtio_write_config(struct virtio_device *vdev,
- 
- 	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
- 	vdev_rsc = rpvdev->vdev_rsc;
--	config = (char *)(&vdev_rsc->vring[vdev->vrings_num]);
-+	config = (char *)(&vdev_rsc->vring[vdev_rsc->num_of_vrings]);
- 	io = rpvdev->vdev_rsc_io;
- 
- 	if (offset + length <= vdev_rsc->config_len) {
-@@ -188,6 +321,8 @@ static void rproc_virtio_reset_device(struct virtio_device *vdev)
- #endif
- 
- static const struct virtio_dispatch remoteproc_virtio_dispatch_funcs = {
-+	.create_virtqueues = rproc_virtio_create_virtqueues,
-+	.delete_virtqueues = rproc_virtio_delete_virtqueues,
- 	.get_status = rproc_virtio_get_status,
- 	.get_features = rproc_virtio_get_features,
- 	.read_config = rproc_virtio_read_config,
-@@ -215,44 +350,16 @@ rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid,
- 			 virtio_dev_reset_cb rst_cb)
- {
- 	struct remoteproc_virtio *rpvdev;
--	struct virtio_vring_info *vrings_info;
- 	struct fw_rsc_vdev *vdev_rsc = rsc;
- 	struct virtio_device *vdev;
--	unsigned int num_vrings = vdev_rsc->num_of_vrings;
--	unsigned int i;
- 
- 	rpvdev = metal_allocate_memory(sizeof(*rpvdev));
- 	if (!rpvdev)
- 		return NULL;
--	vrings_info = metal_allocate_memory(sizeof(*vrings_info) * num_vrings);
--	if (!vrings_info)
--		goto err0;
- 	memset(rpvdev, 0, sizeof(*rpvdev));
--	memset(vrings_info, 0, sizeof(*vrings_info));
- 	vdev = &rpvdev->vdev;
--
--	for (i = 0; i < num_vrings; i++) {
--		struct virtqueue *vq;
--#ifndef VIRTIO_DEVICE_ONLY
--		struct fw_rsc_vdev_vring *vring_rsc;
--#endif
--		unsigned int num_extra_desc = 0;
--
--#ifndef VIRTIO_DEVICE_ONLY
--		vring_rsc = &vdev_rsc->vring[i];
--		if (role == VIRTIO_DEV_DRIVER) {
--			num_extra_desc = vring_rsc->num;
--		}
--#endif
--		vq = virtqueue_allocate(num_extra_desc);
--		if (!vq)
--			goto err1;
--		vrings_info[i].vq = vq;
--	}
--
- 	rpvdev->notify = notify;
- 	rpvdev->priv = priv;
--	vdev->vrings_info = vrings_info;
- 	/* Assuming the shared memory has been mapped and registered if
- 	 * necessary
- 	 */
-@@ -262,7 +369,6 @@ rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid,
- 	vdev->notifyid = notifyid;
- 	vdev->role = role;
- 	vdev->reset_cb = rst_cb;
--	vdev->vrings_num = num_vrings;
- 	vdev->func = &remoteproc_virtio_dispatch_funcs;
- 
- #ifndef VIRTIO_DEVICE_ONLY
-@@ -274,35 +380,15 @@ rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid,
- #endif
- 
- 	return &rpvdev->vdev;
--
--err1:
--	for (i = 0; i < num_vrings; i++) {
--		if (vrings_info[i].vq)
--			metal_free_memory(vrings_info[i].vq);
--	}
--	metal_free_memory(vrings_info);
--err0:
--	metal_free_memory(rpvdev);
--	return NULL;
- }
- 
- void rproc_virtio_remove_vdev(struct virtio_device *vdev)
- {
- 	struct remoteproc_virtio *rpvdev;
--	unsigned int i;
- 
- 	if (!vdev)
- 		return;
- 	rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
--	for (i = 0; i < vdev->vrings_num; i++) {
--		struct virtqueue *vq;
--
--		vq = vdev->vrings_info[i].vq;
--		if (vq)
--			metal_free_memory(vq);
--	}
--	if (vdev->vrings_info)
--		metal_free_memory(vdev->vrings_info);
- 	metal_free_memory(rpvdev);
- }
- 
-diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
-index 2f38faa..b30eccc 100644
---- a/lib/rpmsg/rpmsg_virtio.c
-+++ open-amp/lib/rpmsg/rpmsg_virtio.c
-@@ -821,8 +821,6 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- 		vq_names[1] = "tx_vq";
- 		callback[0] = rpmsg_virtio_rx_callback;
- 		callback[1] = rpmsg_virtio_tx_callback;
--		rvdev->rvq  = vdev->vrings_info[0].vq;
--		rvdev->svq  = vdev->vrings_info[1].vq;
- 	}
- #endif /*!VIRTIO_DEVICE_ONLY*/
- 
-@@ -833,8 +831,6 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- 		vq_names[1] = "rx_vq";
- 		callback[0] = rpmsg_virtio_tx_callback;
- 		callback[1] = rpmsg_virtio_rx_callback;
--		rvdev->rvq  = vdev->vrings_info[1].vq;
--		rvdev->svq  = vdev->vrings_info[0].vq;
- 	}
- #endif /*!VIRTIO_DRIVER_ONLY*/
- 	rvdev->shbuf_io = shm_io;
-@@ -846,6 +842,21 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- 	if (status != RPMSG_SUCCESS)
- 		return status;
- 
-+	/* Create virtqueue success, assign back the virtqueue */
-+#ifndef VIRTIO_DEVICE_ONLY
-+	if (role == RPMSG_HOST) {
-+		rvdev->rvq  = vdev->vrings_info[0].vq;
-+		rvdev->svq  = vdev->vrings_info[1].vq;
-+	}
-+#endif /*!VIRTIO_DEVICE_ONLY*/
-+
-+#ifndef VIRTIO_DRIVER_ONLY
-+	if (role == RPMSG_REMOTE) {
-+		rvdev->rvq  = vdev->vrings_info[1].vq;
-+		rvdev->svq  = vdev->vrings_info[0].vq;
-+	}
-+#endif /*!VIRTIO_DRIVER_ONLY*/
-+
- 	/*
- 	 * Suppress "tx-complete" interrupts
- 	 * since send method use busy loop when buffer pool exhaust
-@@ -873,7 +884,8 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- 					rvdev->config.r2h_buf_size);
- 
- 			if (!buffer) {
--				return RPMSG_ERR_NO_BUFF;
-+				status = RPMSG_ERR_NO_BUFF;
-+				goto err;
- 			}
- 
- 			vqbuf.buf = buffer;
-@@ -887,7 +899,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- 						     buffer);
- 
- 			if (status != RPMSG_SUCCESS) {
--				return status;
-+				goto err;
- 			}
- 		}
- 	}
-@@ -912,6 +924,10 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
- #endif /*!VIRTIO_DEVICE_ONLY*/
- 
- 	return status;
-+
-+err:
-+	rpmsg_virtio_delete_virtqueues(rvdev);
-+	return status;
- }
- 
- void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev)
-@@ -931,6 +947,7 @@ void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev)
- 		rvdev->rvq = 0;
- 		rvdev->svq = 0;
- 
-+		rpmsg_virtio_delete_virtqueues(rvdev);
- 		metal_mutex_deinit(&rdev->lock);
- 	}
- }
-diff --git a/lib/virtio/virtio.c open-amp/lib/virtio/virtio.c
-index d25aec3..e67e97d 100644
---- a/lib/virtio/virtio.c
-+++ open-amp/lib/virtio/virtio.c
-@@ -96,43 +96,3 @@ void virtio_describe(struct virtio_device *dev, const char *msg,
- 	/* TODO: Not used currently - keeping it for future use*/
- 	virtio_feature_name(0, desc);
- }
--
--int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags,
--			     unsigned int nvqs, const char *names[],
--			     vq_callback callbacks[])
--{
--	struct virtio_vring_info *vring_info;
--	struct vring_alloc_info *vring_alloc;
--	unsigned int num_vrings, i;
--	int ret;
--	(void)flags;
--
--	num_vrings = vdev->vrings_num;
--	if (nvqs > num_vrings)
--		return ERROR_VQUEUE_INVLD_PARAM;
--	/* Initialize virtqueue for each vring */
--	for (i = 0; i < nvqs; i++) {
--		vring_info = &vdev->vrings_info[i];
--
--		vring_alloc = &vring_info->info;
--#ifndef VIRTIO_DEVICE_ONLY
--		if (vdev->role == VIRTIO_DEV_DRIVER) {
--			size_t offset;
--			struct metal_io_region *io = vring_info->io;
--
--			offset = metal_io_virt_to_offset(io,
--							 vring_alloc->vaddr);
--			metal_io_block_set(io, offset, 0,
--					   vring_size(vring_alloc->num_descs,
--						      vring_alloc->align));
--		}
--#endif
--		ret = virtqueue_create(vdev, i, names[i], vring_alloc,
--				       callbacks[i], vdev->func->notify,
--				       vring_info->vq);
--		if (ret)
--			return ret;
--	}
--	return 0;
--}
--
--- 
-2.25.1
-
diff --git a/openamp/0019-virtio.h-add-version-in-device-id-table.patch b/openamp/0019-virtio.h-add-version-in-device-id-table.patch
deleted file mode 100644
index 30c4f36e39..0000000000
--- a/openamp/0019-virtio.h-add-version-in-device-id-table.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 8d69eb3524fd57753ab849ed790777f073242276 Mon Sep 17 00:00:00 2001
-From: wangbowen6 <wa...@xiaomi.com>
-Date: Thu, 25 May 2023 21:01:17 +0800
-Subject: [PATCH] virtio.h: add version in device id table
-
-support the leagcy mmio transport (version 1)
-
-Change-Id: I194c587754668d28cb7be4dc1b58fa5ce1393414
-Signed-off-by: wangbowen6 <wa...@xiaomi.com>
----
- lib/include/openamp/virtio.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
-index fb68c19..6ef1746 100644
---- a/lib/include/openamp/virtio.h
-+++ open-amp/lib/include/openamp/virtio.h
-@@ -82,6 +82,7 @@ __deprecated static inline int deprecated_virtio_dev_slave(void)
- struct virtio_device_id {
- 	uint32_t device;
- 	uint32_t vendor;
-+	uint32_t version;
- };
- 
- /*
--- 
-2.25.1
-
diff --git a/openamp/0020-virtio-Add-the-virtio_negotiate_features-interface.patch b/openamp/0020-virtio-Add-the-virtio_negotiate_features-interface.patch
deleted file mode 100644
index 83aaa6bc76..0000000000
--- a/openamp/0020-virtio-Add-the-virtio_negotiate_features-interface.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 49e9be3fee1c3f56e1891959965420550bbafa92 Mon Sep 17 00:00:00 2001
-From: liqinhui <li...@xiaomi.com>
-Date: Mon, 4 Dec 2023 19:35:59 +0800
-Subject: [PATCH] virtio: Add the virtio_negotiate_features interface.
-
-Add the interface for the VIRTIO_NET_F_MAC feature.
-
-Change-Id: I51fcb0e5388a908ebf43912b793c061c9488e226
-Signed-off-by: liqinhui <li...@xiaomi.com>
----
- lib/include/openamp/virtio.h | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
-diff --git a/lib/include/openamp/virtio.h open-amp/lib/include/openamp/virtio.h
-index 6ef1746..e32dc16 100644
---- a/lib/include/openamp/virtio.h
-+++ open-amp/lib/include/openamp/virtio.h
-@@ -299,6 +299,20 @@ static inline void virtio_set_features(struct virtio_device *vdev,
- 	return vdev->func->set_features(vdev, features);
- }
- 
-+/**
-+ * @brief Negotiate features between virtio device and driver.
-+ *
-+ * @param dev		Pointer to device structure.
-+ * @param features	Supported features.
-+ *
-+ * @return The final features after negotiate.
-+ */
-+static inline uint32_t virtio_negotiate_features(struct virtio_device *vdev,
-+                                                 uint32_t features)
-+{
-+	return vdev->func->negotiate_features(vdev, features);
-+}
-+
- /**
-  * @brief Reset virtio device.
-  *
--- 
-2.34.1
-
diff --git a/openamp/CMakeLists.txt b/openamp/CMakeLists.txt
index 74706e8a89..ceff5d839e 100644
--- a/openamp/CMakeLists.txt
+++ b/openamp/CMakeLists.txt
@@ -21,7 +21,8 @@
 # ##############################################################################
 if(CONFIG_OPENAMP)
 
-  set(OPENAMP_VERSION 2022.10.0)
+  set(OPENAMP_COMMIT c468328487a1e0596307a5ef7172756819e15745)
+  set(LIBMETAL_COMMIT a4bce3507502a7eb9e29bafe0eb174ed5c4316e9)
 
   include(libmetal.cmake)
   include(open-amp.cmake)
diff --git a/openamp/Makefile b/openamp/Makefile
index 8465da9ffa..b71febcbc5 100644
--- a/openamp/Makefile
+++ b/openamp/Makefile
@@ -22,7 +22,8 @@
 
 include $(TOPDIR)/Make.defs
 
-VERSION ?= 2022.10.0
+OPENAMP_COMMIT ?= c468328487a1e0596307a5ef7172756819e15745
+LIBMETAL_COMMIT ?= a4bce3507502a7eb9e29bafe0eb174ed5c4316e9
 
 include libmetal.defs
 include open-amp.defs
diff --git a/openamp/libmetal.cmake b/openamp/libmetal.cmake
index cd2ad81516..f92c3517ea 100644
--- a/openamp/libmetal.cmake
+++ b/openamp/libmetal.cmake
@@ -22,9 +22,9 @@
 if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/libmetal)
   FetchContent_Declare(
     libmetal
-    DOWNLOAD_NAME "libmetal-v${OPENAMP_VERSION}.zip"
+    DOWNLOAD_NAME "libmetal-main.zip"
     DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}
-    URL "https://github.com/OpenAMP/libmetal/archive/v${OPENAMP_VERSION}.zip"
+    URL "https://github.com/OpenAMP/libmetal/archive/${LIBMETAL_COMMIT}.zip"
         SOURCE_DIR
         ${CMAKE_CURRENT_LIST_DIR}/libmetal
         BINARY_DIR
@@ -37,13 +37,17 @@ if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/libmetal)
         ""
     PATCH_COMMAND
       patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0001-libmetal-add-metal_list_for_each_safe-support.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0001-lib-errno.h-fix-compile-error.patch &&
+      patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
+      ${CMAKE_CURRENT_LIST_DIR}/0002-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0002-libmetal-nuttx-io.c-align-access-when-read-write-siz.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0003-atomic.h-fix-compiler-error.patch && patch
+      -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
+      ${CMAKE_CURRENT_LIST_DIR}/0004-lib-system-nuttx-fix-unused-parameter-compile-error.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0003-libmetal-nuttx-io.c-Fix-void-pointer-arithmetic-in-a.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0005-libmetal-cmake-set-HAVE_STDATOMIC_H-default-true-in-.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0004-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0006-lib-system-nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch
     DOWNLOAD_NO_PROGRESS true
     TIMEOUT 30)
 
diff --git a/openamp/libmetal.defs b/openamp/libmetal.defs
index 3584573d8f..f50f69ab1c 100644
--- a/openamp/libmetal.defs
+++ b/openamp/libmetal.defs
@@ -75,13 +75,15 @@ LIBMETAL_HDRS_SEDEXP := \
 ifeq ($(wildcard libmetal/.git),)
 libmetal.zip:
 # Download and unpack tarball if no git repo found
-	$(call DOWNLOAD,https://github.com/OpenAMP/libmetal/archive,v$(VERSION).zip,libmetal.zip)
+	$(call DOWNLOAD,https://github.com/OpenAMP/libmetal/archive,$(LIBMETAL_COMMIT).zip,libmetal.zip)
 	$(Q) unzip -o libmetal.zip
-	$(Q) mv libmetal-$(VERSION) libmetal
-	$(Q) patch -p0 < 0001-libmetal-add-metal_list_for_each_safe-support.patch
-	$(Q) patch -p0 < 0002-libmetal-nuttx-io.c-align-access-when-read-write-siz.patch
-	$(Q) patch -p0 < 0003-libmetal-nuttx-io.c-Fix-void-pointer-arithmetic-in-a.patch
-	$(Q) patch -p0 < 0004-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
+	mv libmetal-$(LIBMETAL_COMMIT) libmetal
+	$(Q) patch -p0 < 0001-lib-errno.h-fix-compile-error.patch
+	$(Q) patch -p0 < 0002-libmetal-atomic-enable-64-bit-atomic-by-toolchain-bu.patch
+	$(Q) patch -p0 < 0003-atomic.h-fix-compiler-error.patch
+	$(Q) patch -p0 < 0004-lib-system-nuttx-fix-unused-parameter-compile-error.patch
+	$(Q) patch -p0 < 0005-libmetal-cmake-set-HAVE_STDATOMIC_H-default-true-in-.patch
+	$(Q) patch -p0 < 0006-lib-system-nuttx-io.c-include-stddef.h-in-nuttx-io.c.patch
 
 .libmetal_headers: libmetal.zip
 else
diff --git a/openamp/open-amp.cmake b/openamp/open-amp.cmake
index 154a0e0293..0470f55853 100644
--- a/openamp/open-amp.cmake
+++ b/openamp/open-amp.cmake
@@ -22,9 +22,9 @@
 if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/open-amp)
   FetchContent_Declare(
     open-amp
-    DOWNLOAD_NAME "libopen-amp-v${OPENAMP_VERSION}.zip"
+    DOWNLOAD_NAME "libopen-amp-main.zip"
     DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}
-    URL "https://github.com/OpenAMP/open-amp/archive/v${OPENAMP_VERSION}.zip"
+    URL "https://github.com/OpenAMP/open-amp/archive/${OPENAMP_COMMIT}.zip"
         SOURCE_DIR
         ${CMAKE_CURRENT_LIST_DIR}/open-amp
         BINARY_DIR
@@ -43,41 +43,29 @@ if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/open-amp)
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
       ${CMAKE_CURRENT_LIST_DIR}/0002-Negotiate-individual-buffer-size-dynamically.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0003-rpmsg-wait-endpoint-ready-in-rpmsg_send-and-rpmsg_se.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0003-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0004-openamp-add-new-ops-notify_wait-support.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0004-openamp-virtio.h-negotiate_features-also-can-be-call.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0005-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0005-remoteproc-rpmsg_virtio-change-sched_yeild-to-usleep.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0006-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
-      && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0007-openamp-avoid-double-calling-ns_bound-when-each-othe.patch
-      && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0008-remoteproc-make-all-elf_-functions-static-except-elf.patch
-      && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0009-Fix-warn-declaration-of-vring_rsc-shadows-a-previous.patch
-      && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0010-rptun-fix-rptun-don-t-wait-issue-when-get-tx-patyloa.patch
-      && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0011-rpmsg-fix-rpmsg_virtio_get_tx_buffer-no-idx-return.patch
-      && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0012-rpmsg-add-new-API-rpdev_release_tx-rx_buffer.patch
-      && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0013-openamp-add-error-log-when-ept-cb-return-error.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch &&
+      patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
+      ${CMAKE_CURRENT_LIST_DIR}/0007-openamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0014-rpmsg-add-cache-flash-when-hold-rx-buffer.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0015-rpmsg-do-cache_invalidate-when-real-data-returned.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0009-openamp-swap-get_rx_buffer-return_rx_buffer-to-resol.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0016-openamp-add-new-API-rpmsg_virtio_get_rxbuffer_size.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0010-rpmsg_virtio.c-virtqueue_kick-after-all-rx-buffer-re.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0017-virtio-follow-virtio-1.2-spec-add-more-virtio-status.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0011-virtio-change-feature-to-64-bit-in-all-virtio_dispat.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0018-virtio-decoupling-the-transport-layer-and-virtio-dev.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0012-rpmsg_virtio.c-fix-get_tx_payload_buffer-error.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0019-virtio.h-add-version-in-device-id-table.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0013-openamp-add-assert-when-get-tx-buffer-failed.patch
       && patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} <
-      ${CMAKE_CURRENT_LIST_DIR}/0020-virtio-Add-the-virtio_negotiate_features-interface.patch
+      ${CMAKE_CURRENT_LIST_DIR}/0014-virtio.h-add-memory-operation-for-virtio-device.patch
     DOWNLOAD_NO_PROGRESS true
     TIMEOUT 30)
 
diff --git a/openamp/open-amp.defs b/openamp/open-amp.defs
index 73aeb7f43a..55370805c2 100644
--- a/openamp/open-amp.defs
+++ b/openamp/open-amp.defs
@@ -52,31 +52,23 @@ CSRCS += open-amp/lib/virtio/virtqueue.c
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard open-amp/.git),)
 open-amp.zip:
-	$(call DOWNLOAD,https://github.com/OpenAMP/open-amp/archive,v$(VERSION).zip,open-amp.zip)
+	$(call DOWNLOAD,https://github.com/OpenAMP/open-amp/archive,$(OPENAMP_COMMIT).zip,open-amp.zip)
 	$(Q) unzip -o open-amp.zip
-	$(Q) mv open-amp-$(VERSION) open-amp
+	mv open-amp-$(OPENAMP_COMMIT) open-amp
 	$(Q) patch -p0 < 0001-ns-acknowledge-the-received-creation-message.patch
 	$(Q) patch -p0 < 0002-Negotiate-individual-buffer-size-dynamically.patch
-	$(Q) patch -p0 < 0003-rpmsg-wait-endpoint-ready-in-rpmsg_send-and-rpmsg_se.patch
-	$(Q) patch -p0 < 0004-openamp-add-new-ops-notify_wait-support.patch
-	$(Q) patch -p0 < 0005-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
-	$(Q) patch -p0 < 0006-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
-	$(Q) patch -p0 < 0007-openamp-avoid-double-calling-ns_bound-when-each-othe.patch
-	$(Q) patch -p0 < 0008-remoteproc-make-all-elf_-functions-static-except-elf.patch
-	$(Q) patch -p0 < 0009-Fix-warn-declaration-of-vring_rsc-shadows-a-previous.patch
-	$(Q) patch -p0 < 0010-rptun-fix-rptun-don-t-wait-issue-when-get-tx-patyloa.patch
-	$(Q) patch -p0 < 0011-rpmsg-fix-rpmsg_virtio_get_tx_buffer-no-idx-return.patch
-	$(Q) patch -p0 < 0012-rpmsg-add-new-API-rpdev_release_tx-rx_buffer.patch
-	$(Q) patch -p0 < 0013-openamp-add-error-log-when-ept-cb-return-error.patch
-	$(Q) patch -p0 < 0014-rpmsg-add-cache-flash-when-hold-rx-buffer.patch
-	$(Q) patch -p0 < 0015-rpmsg-do-cache_invalidate-when-real-data-returned.patch
-	$(Q) patch -p0 < 0016-openamp-add-new-API-rpmsg_virtio_get_rxbuffer_size.patch
-	$(Q) patch -p0 < 0017-virtio-follow-virtio-1.2-spec-add-more-virtio-status.patch
-	$(Q) patch -p0 < 0018-virtio-decoupling-the-transport-layer-and-virtio-dev.patch
-	$(Q) patch -p0 < 0019-virtio.h-add-version-in-device-id-table.patch
-	$(Q) patch -p0 < 0020-virtio-Add-the-virtio_negotiate_features-interface.patch
-
-
+	$(Q) patch -p0 < 0003-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
+	$(Q) patch -p0 < 0004-openamp-virtio.h-negotiate_features-also-can-be-call.patch
+	$(Q) patch -p0 < 0005-remoteproc-rpmsg_virtio-change-sched_yeild-to-usleep.patch
+	$(Q) patch -p0 < 0006-rpmsg-wait-ept-ready-in-rpmsg_send.patch
+	$(Q) patch -p0 < 0007-openamp-add-VIRTIO_RING_F_MUST_NOTIFY-event.patch
+	$(Q) patch -p0 < 0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
+	$(Q) patch -p0 < 0009-openamp-swap-get_rx_buffer-return_rx_buffer-to-resol.patch
+	$(Q) patch -p0 < 0010-rpmsg_virtio.c-virtqueue_kick-after-all-rx-buffer-re.patch
+	$(Q) patch -p0 < 0011-virtio-change-feature-to-64-bit-in-all-virtio_dispat.patch
+	$(Q) patch -p0 < 0012-rpmsg_virtio.c-fix-get_tx_payload_buffer-error.patch
+	$(Q) patch -p0 < 0013-openamp-add-assert-when-get-tx-buffer-failed.patch
+	$(Q) patch -p0 < 0014-virtio.h-add-memory-operation-for-virtio-device.patch
 
 .openamp_headers: open-amp.zip
 else


(nuttx) 09/09: virtio-mmio/pci: add alloc_buf/free_buf for mmio and pci transport layer

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 89c49c53a755cf5fc91036940e9fccb042d6a233
Author: Bowen Wang <wa...@xiaomi.com>
AuthorDate: Tue Oct 31 21:15:09 2023 +0800

    virtio-mmio/pci: add alloc_buf/free_buf for mmio and pci transport layer
    
    And remove the virtio_alloc/free_buf implementation in virtio.c, because
    these two apis has been moved to the OpenAMP
    
    Signed-off-by: Bowen Wang <wa...@xiaomi.com>
---
 drivers/virtio/virtio-mmio.c  | 31 +++++++++++++++++++++++++++++++
 drivers/virtio/virtio-pci.c   | 32 ++++++++++++++++++++++++++++++++
 drivers/virtio/virtio.c       | 42 ------------------------------------------
 include/nuttx/virtio/virtio.h | 27 ++++++++++++---------------
 4 files changed, 75 insertions(+), 57 deletions(-)

diff --git a/drivers/virtio/virtio-mmio.c b/drivers/virtio/virtio-mmio.c
index 9c26fb5a66..c5fb423f28 100644
--- a/drivers/virtio/virtio-mmio.c
+++ b/drivers/virtio/virtio-mmio.c
@@ -196,6 +196,10 @@ static uint32_t virtio_mmio_get_queue_len(FAR struct metal_io_region *io,
                                           int idx);
 static int virtio_mmio_config_virtqueue(FAR struct metal_io_region *io,
                                         FAR struct virtqueue *vq);
+static FAR void *virtio_mmio_alloc_buf(FAR struct virtio_device *vdev,
+                                       size_t size, size_t align);
+static void virtio_mmio_free_buf(FAR struct virtio_device *vdev,
+                                 FAR void *buf);
 static int virtio_mmio_init_device(FAR struct virtio_mmio_device_s *vmdev,
                                    FAR void *regs, int irq);
 
@@ -252,6 +256,12 @@ static const struct virtio_dispatch g_virtio_mmio_dispatch =
   virtio_mmio_notify,             /* notify */
 };
 
+static const struct virtio_memory_ops g_virtio_mmio_mmops =
+{
+  virtio_mmio_alloc_buf, /* Alloc */
+  virtio_mmio_free_buf,  /* Free */
+};
+
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
@@ -749,6 +759,26 @@ static int virtio_mmio_interrupt(int irq, FAR void *context, FAR void *arg)
   return OK;
 }
 
+/****************************************************************************
+ * Name: virtio_mmio_alloc_buf
+ ****************************************************************************/
+
+static FAR void *virtio_mmio_alloc_buf(FAR struct virtio_device *vdev,
+                                       size_t size, size_t align)
+{
+  return kmm_memalign(align, size);
+}
+
+/****************************************************************************
+ * Name: virtio_mmio_free_buf
+ ****************************************************************************/
+
+static void virtio_mmio_free_buf(FAR struct virtio_device *vdev,
+                                 FAR void *buf)
+{
+  kmm_free(buf);
+}
+
 /****************************************************************************
  * Name: virtio_mmio_init_device
  ****************************************************************************/
@@ -778,6 +808,7 @@ static int virtio_mmio_init_device(FAR struct virtio_mmio_device_s *vmdev,
 
   vdev->role = VIRTIO_DEV_DRIVER;
   vdev->func = &g_virtio_mmio_dispatch;
+  vdev->mmops = &g_virtio_mmio_mmops;
 
   magic = metal_io_read32(&vmdev->cfg_io, VIRTIO_MMIO_MAGIC_VALUE);
   if (magic != VIRTIO_MMIO_MAGIC_VALUE_STRING)
diff --git a/drivers/virtio/virtio-pci.c b/drivers/virtio/virtio-pci.c
index 5c8eafd241..dd88fab518 100644
--- a/drivers/virtio/virtio-pci.c
+++ b/drivers/virtio/virtio-pci.c
@@ -45,6 +45,11 @@
  * Private Function Prototypes
  ****************************************************************************/
 
+static FAR void *virtio_pci_alloc_buf(FAR struct virtio_device *vdev,
+                                      size_t size, size_t align);
+static void virtio_pci_free_buf(FAR struct virtio_device *vdev,
+                                FAR void *buf);
+
 static int virtio_pci_probe(FAR struct pci_device_s *dev);
 static void virtio_pci_remove(FAR struct pci_device_s *dev);
 
@@ -69,6 +74,12 @@ static struct pci_driver_s g_virtio_pci_drv =
   virtio_pci_remove
 };
 
+static const struct virtio_memory_ops g_virtio_pci_mmops =
+{
+  virtio_pci_alloc_buf, /* Alloc */
+  virtio_pci_free_buf,  /* Free */
+};
+
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
@@ -135,6 +146,26 @@ static void virtio_pci_wdog(wdparm_t arg)
 }
 #endif
 
+/****************************************************************************
+ * Name: virtio_pci_alloc_buf
+ ****************************************************************************/
+
+static FAR void *virtio_pci_alloc_buf(FAR struct virtio_device *vdev,
+                                      size_t size, size_t align)
+{
+  return kmm_memalign(align, size);
+}
+
+/****************************************************************************
+ * Name: virtio_pci_free_buf
+ ****************************************************************************/
+
+static void virtio_pci_free_buf(FAR struct virtio_device *vdev,
+                                FAR void *buf)
+{
+  return kmm_free(buf);
+}
+
 /****************************************************************************
  * Name: virtio_pci_probe
  ****************************************************************************/
@@ -163,6 +194,7 @@ static int virtio_pci_probe(FAR struct pci_device_s *dev)
   dev->priv = vpdev;
   vpdev->dev = dev;
   vdev = &vpdev->vdev;
+  vdev->mmops = &g_virtio_pci_mmops;
 
   /* Virtio device initialize */
 
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
index 21508db483..1addf34b0b 100644
--- a/drivers/virtio/virtio.c
+++ b/drivers/virtio/virtio.c
@@ -72,48 +72,6 @@ static struct virtio_bus_s g_virtio_bus =
  * Public Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: virtio_alloc_buf
- ****************************************************************************/
-
-FAR void *virtio_alloc_buf(FAR struct virtio_device *vdev,
-                           size_t size, size_t align)
-{
-  if (align == 0)
-    {
-      return kmm_malloc(size);
-    }
-  else
-    {
-      return kmm_memalign(align, size);
-    }
-}
-
-/****************************************************************************
- * Name: virtio_zalloc_buf
- ****************************************************************************/
-
-FAR void *virtio_zalloc_buf(FAR struct virtio_device *vdev,
-                            size_t size, size_t align)
-{
-  FAR void *ptr = virtio_alloc_buf(vdev, size, align);
-  if (ptr != NULL)
-    {
-      memset(ptr, 0, size);
-    }
-
-  return ptr;
-}
-
-/****************************************************************************
- * Name: virtio_mmio_free_buf
- ****************************************************************************/
-
-void virtio_free_buf(FAR struct virtio_device *vdev, FAR void *buf)
-{
-  kmm_free(buf);
-}
-
 /****************************************************************************
  * Name: virtio_register_drivers
  ****************************************************************************/
diff --git a/include/nuttx/virtio/virtio.h b/include/nuttx/virtio/virtio.h
index 92f039af81..bef7383d80 100644
--- a/include/nuttx/virtio/virtio.h
+++ b/include/nuttx/virtio/virtio.h
@@ -208,6 +208,18 @@ extern "C"
 #define EXTERN extern
 #endif
 
+static inline_function FAR void *
+virtio_zalloc_buf(FAR struct virtio_device *vdev, size_t size, size_t align)
+{
+  FAR void *buf = virtio_alloc_buf(vdev, size, align);
+  if (buf != NULL)
+    {
+      memset(buf, 0, size);
+    }
+
+  return buf;
+}
+
 /* Driver and device register/unregister function */
 
 int virtio_register_driver(FAR struct virtio_driver *driver);
@@ -216,21 +228,6 @@ int virtio_register_device(FAR struct virtio_device *device);
 int virtio_unregister_driver(FAR struct virtio_driver *driver);
 int virtio_unregister_device(FAR struct virtio_device *device);
 
-/* Virtio alloc/free buffer API
- * NOTE:
- * For now, these three apis are implemented in NuttX, and direclty mapping
- * to kmm_memalgin/kmm_free, so it's only compatible with virtio mmio
- * transport for now. After the virtio remoteproc transport layer completed,
- * these three apis should be moved to OpenAmp, and different transport layer
- * provide different implementation.
- */
-
-FAR void *virtio_alloc_buf(FAR struct virtio_device *vdev,
-                           size_t size, size_t align);
-FAR void *virtio_zalloc_buf(FAR struct virtio_device *vdev,
-                            size_t size, size_t align);
-void virtio_free_buf(FAR struct virtio_device *vdev, FAR void *buf);
-
 /* Virtio driver initailied function, called in NuttX driver_intialize() */
 
 void virtio_register_drivers(void);


(nuttx) 02/09: openamp: replace VIRTIO_DRIVER/DEVICE_ONLY to VIRTIO_DRIVER/DEVICE_SUPPORT

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit ef67a866f340413a4c3d570c2dff308f94ea953c
Author: wangyongrong <wa...@xiaomi.com>
AuthorDate: Mon Jul 1 16:34:05 2024 +0800

    openamp: replace VIRTIO_DRIVER/DEVICE_ONLY to VIRTIO_DRIVER/DEVICE_SUPPORT
    
    New OpenAMP change the VIRTIO_DRIVER/DEVICE_ONLY to the
    VIRTIO_DRIVER_DEVCE_SUPPORT, so upgrade the NuttX OpenAMP config too
    
    Signed-off-by: wangyongrong <wa...@xiaomi.com>
---
 openamp/Kconfig        | 12 ++++++------
 openamp/open-amp.cmake | 12 ++++++++----
 openamp/open-amp.defs  | 12 ++++++++----
 3 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/openamp/Kconfig b/openamp/Kconfig
index d9b0d072c6..d15399e936 100644
--- a/openamp/Kconfig
+++ b/openamp/Kconfig
@@ -22,12 +22,12 @@ config OPENAMP_DEBUG
 	bool "Enable OpenAMP Debug"
 	default n
 
-config OPENAMP_VIRTIO_DEVICE_ONLY
-	bool "Enable VIRTIO_DEVICE_ONLY"
-	default n
+config OPENAMP_VIRTIO_DEVICE_SUPPORT
+	bool "Enable VIRTIO_DEVICE_SUPPORT"
+	default y
 
-config OPENAMP_VIRTIO_DRIVER_ONLY
-	bool "Enable VIRTIO_DRIVER_ONLY"
-	default n
+config OPENAMP_VIRTIO_DRIVER_SUPPORT
+	bool "Enable VIRTIO_DRIVER_SUPPORT"
+	default y
 
 endif # OPENAMP
diff --git a/openamp/open-amp.cmake b/openamp/open-amp.cmake
index 0470f55853..bf2cbe456d 100644
--- a/openamp/open-amp.cmake
+++ b/openamp/open-amp.cmake
@@ -87,12 +87,16 @@ endif()
 
 add_compile_definitions(elf_load=remoteproc_elf_load)
 
-if(CONFIG_OPENAMP_VIRTIO_DEVICE_ONLY)
-  add_compile_definitions(VIRTIO_DEVICE_ONLY)
+if(CONFIG_OPENAMP_VIRTIO_DEVICE_SUPPORT)
+  add_compile_definitions(VIRTIO_DEVICE_SUPPORT=1)
+else()
+  add_compile_definitions(VIRTIO_DEVICE_SUPPORT=0)
 endif()
 
-if(CONFIG_OPENAMP_VIRTIO_DRIVER_ONLY)
-  add_compile_definitions(VIRTIO_DRIVER_ONLY)
+if(CONFIG_OPENAMP_VIRTIO_DRIVER_SUPPORT)
+  add_compile_definitions(VIRTIO_DRIVER_SUPPORT=1)
+else()
+  add_compile_definitions(VIRTIO_DRIVER_SUPPORT=0)
 endif()
 
 set(WITH_LIBMETAL_FIND OFF)
diff --git a/openamp/open-amp.defs b/openamp/open-amp.defs
index 55370805c2..8ca50ff58c 100644
--- a/openamp/open-amp.defs
+++ b/openamp/open-amp.defs
@@ -32,12 +32,16 @@ endif
 
 CFLAGS += -Delf_load=remoteproc_elf_load
 
-ifeq ($(CONFIG_OPENAMP_VIRTIO_DEVICE_ONLY),y)
-  CFLAGS += -DVIRTIO_DEVICE_ONLY
+ifeq ($(CONFIG_OPENAMP_VIRTIO_DEVICE_SUPPORT),y)
+  CFLAGS += -DVIRTIO_DEVICE_SUPPORT=1
+else
+  CFLAGS += -DVIRTIO_DEVICE_SUPPORT=0
 endif
 
-ifeq ($(CONFIG_OPENAMP_VIRTIO_DRIVER_ONLY),y)
-  CFLAGS += -DVIRTIO_DRIVER_ONLY
+ifeq ($(CONFIG_OPENAMP_VIRTIO_DRIVER_SUPPORT),y)
+  CFLAGS += -DVIRTIO_DRIVER_SUPPORT=1
+else
+  CFLAGS += -DVIRTIO_DRIVER_SUPPORT=0
 endif
 
 CSRCS += open-amp/lib/remoteproc/elf_loader.c


(nuttx) 07/09: virtio_9p.c: fix compile error in OpenAMP upgrade feature reflow to dev

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 60ab9ae37e5e05bff2548608eb4a16e2bd2c9b30
Author: Yongrong Wang <wa...@xiaomi.com>
AuthorDate: Sat Sep 14 21:45:57 2024 +0800

    virtio_9p.c: fix compile error in OpenAMP upgrade feature reflow to dev
    
    v9fs/virtio_9p.c:223:3: error: too few arguments to function 'virtio_negotiate_features'
      223 |   virtio_negotiate_features(vdev, 1 << VIRTIO_9P_MOUNT_TAG);
    v9fs/virtio_9p.c:245:9: error: too few arguments to function 'virtio_create_virtqueues'
      245 |   ret = virtio_create_virtqueues(vdev, 0, 1, vqname, callback);
    
    Signed-off-by: Yongrong Wang <wa...@xiaomi.com>
---
 fs/v9fs/virtio_9p.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/v9fs/virtio_9p.c b/fs/v9fs/virtio_9p.c
index 673f0f84a7..652361add5 100644
--- a/fs/v9fs/virtio_9p.c
+++ b/fs/v9fs/virtio_9p.c
@@ -221,7 +221,7 @@ static int virtio_9p_probe(FAR struct virtio_device *vdev)
   int ret;
 
   virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER);
-  virtio_negotiate_features(vdev, 1 << VIRTIO_9P_MOUNT_TAG);
+  virtio_negotiate_features(vdev, 1 << VIRTIO_9P_MOUNT_TAG, NULL);
   virtio_set_status(vdev, VIRTIO_CONFIG_FEATURES_OK);
 
   if (!virtio_has_feature(vdev, VIRTIO_9P_MOUNT_TAG))
@@ -243,7 +243,7 @@ static int virtio_9p_probe(FAR struct virtio_device *vdev)
 
   vqname[0] = "virtio_9p_vq";
   callback[0] = virtio_9p_done;
-  ret = virtio_create_virtqueues(vdev, 0, 1, vqname, callback);
+  ret = virtio_create_virtqueues(vdev, 0, 1, vqname, callback, NULL);
   if (ret < 0)
     {
       vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret);


(nuttx) 04/09: rpmsg: upgrade API passing on parameters with the upgrade of OpenAMP

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 8e799ff8236ee04ce50ee2e6ad3cb0882e8ed83e
Author: wangyongrong <wa...@xiaomi.com>
AuthorDate: Thu Jun 27 16:09:25 2024 +0800

    rpmsg: upgrade API passing on parameters with the upgrade of OpenAMP
    
    All the rpmsg transport layer and rpmsg services sync the API
    with new OpenAMP
    
    Signed-off-by: wangyongrong <wa...@xiaomi.com>
---
 drivers/misc/rpmsgblk.c           |  2 +-
 drivers/rpmsg/rpmsg.c             | 12 --------
 drivers/rpmsg/rpmsg_port.c        | 59 ++++++++++++++++++++-------------------
 drivers/rpmsg/rpmsg_router_edge.c | 59 ++++++++++++++++++++-------------------
 drivers/rpmsg/rpmsg_router_hub.c  |  8 +++---
 drivers/rpmsg/rpmsg_virtio.c      | 14 ----------
 drivers/rptun/rptun.c             | 14 ----------
 fs/rpmsgfs/rpmsgfs_server.c       |  4 +--
 include/nuttx/rpmsg/rpmsg.h       |  7 -----
 9 files changed, 68 insertions(+), 111 deletions(-)

diff --git a/drivers/misc/rpmsgblk.c b/drivers/misc/rpmsgblk.c
index 28e2638b09..70dc9a5ee9 100644
--- a/drivers/misc/rpmsgblk.c
+++ b/drivers/misc/rpmsgblk.c
@@ -614,7 +614,7 @@ static int rpmsgblk_mmc_multi_cmd_ioctl(FAR struct inode *inode,
 
   msglen = sizeof(*msg) + arglen - 1;
   rsplen += sizeof(*msg) - 1;
-  if (MAX(msglen, rsplen) > rpmsg_get_tx_buffer_size(priv->ept.rdev))
+  if (MAX(msglen, rsplen) > rpmsg_get_tx_buffer_size(&priv->ept))
     {
       int ret = 0;
 
diff --git a/drivers/rpmsg/rpmsg.c b/drivers/rpmsg/rpmsg.c
index 9af3cf6944..6db73ba676 100644
--- a/drivers/rpmsg/rpmsg.c
+++ b/drivers/rpmsg/rpmsg.c
@@ -207,18 +207,6 @@ FAR const char *rpmsg_get_cpuname(FAR struct rpmsg_device *rdev)
   return rpmsg ? rpmsg->ops->get_cpuname(rpmsg) : NULL;
 }
 
-int rpmsg_get_tx_buffer_size(FAR struct rpmsg_device *rdev)
-{
-  FAR struct rpmsg_s *rpmsg = rpmsg_get_by_rdev(rdev);
-  return rpmsg ? rpmsg->ops->get_tx_buffer_size(rpmsg) : -EINVAL;
-}
-
-int rpmsg_get_rx_buffer_size(FAR struct rpmsg_device *rdev)
-{
-  FAR struct rpmsg_s *rpmsg = rpmsg_get_by_rdev(rdev);
-  return rpmsg ? rpmsg->ops->get_rx_buffer_size(rpmsg) : -EINVAL;
-}
-
 int rpmsg_register_callback(FAR void *priv,
                             rpmsg_dev_cb_t device_created,
                             rpmsg_dev_cb_t device_destroy,
diff --git a/drivers/rpmsg/rpmsg_port.c b/drivers/rpmsg/rpmsg_port.c
index b0deb58458..0e9233fbed 100644
--- a/drivers/rpmsg/rpmsg_port.c
+++ b/drivers/rpmsg/rpmsg_port.c
@@ -48,8 +48,6 @@
 static FAR const char *
 rpmsg_port_get_local_cpuname(FAR struct rpmsg_s *rpmsg);
 static FAR const char *rpmsg_port_get_cpuname(FAR struct rpmsg_s *rpmsg);
-static int rpmsg_port_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg);
-static int rpmsg_port_get_rx_buffer_size(FAR struct rpmsg_s *rpmsg);
 static void rpmsg_port_dump(FAR struct rpmsg_s *rpmsg);
 
 /****************************************************************************
@@ -65,8 +63,6 @@ static const struct rpmsg_ops_s g_rpmsg_port_ops =
   rpmsg_port_dump,
   rpmsg_port_get_local_cpuname,
   rpmsg_port_get_cpuname,
-  rpmsg_port_get_tx_buffer_size,
-  rpmsg_port_get_rx_buffer_size,
 };
 
 /****************************************************************************
@@ -372,6 +368,32 @@ static int rpmsg_port_release_tx_buffer(FAR struct rpmsg_device *rdev,
   return RPMSG_SUCCESS;
 }
 
+/****************************************************************************
+ * Name: rpmsg_port_get_tx_buffer_size
+ ****************************************************************************/
+
+static int rpmsg_port_get_tx_buffer_size(FAR struct rpmsg_device *rdev)
+{
+  FAR struct rpmsg_port_s *port =
+    metal_container_of(rdev, struct rpmsg_port_s, rdev);
+
+  return port->txq.len - sizeof(struct rpmsg_port_header_s) -
+         sizeof(struct rpmsg_hdr);
+}
+
+/****************************************************************************
+ * Name: rpmsg_port_get_rx_buffer_size
+ ****************************************************************************/
+
+static int rpmsg_port_get_rx_buffer_size(FAR struct rpmsg_device *rdev)
+{
+  FAR struct rpmsg_port_s *port =
+    metal_container_of(rdev, struct rpmsg_port_s, rdev);
+
+  return port->rxq.len - sizeof(struct rpmsg_port_header_s) -
+         sizeof(struct rpmsg_hdr);
+}
+
 /****************************************************************************
  * Name: rpmsg_port_rx_callback
  ****************************************************************************/
@@ -540,30 +562,6 @@ static FAR const char *rpmsg_port_get_cpuname(FAR struct rpmsg_s *rpmsg)
   return port->cpuname;
 }
 
-/****************************************************************************
- * Name: rpmsg_port_get_tx_buffer_size
- ****************************************************************************/
-
-static int rpmsg_port_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg)
-{
-  FAR struct rpmsg_port_s *port = (FAR struct rpmsg_port_s *)rpmsg;
-
-  return port->txq.len - sizeof(struct rpmsg_port_header_s) -
-         sizeof(struct rpmsg_hdr);
-}
-
-/****************************************************************************
- * Name: rpmsg_port_get_rx_buffer_size
- ****************************************************************************/
-
-static int rpmsg_port_get_rx_buffer_size(FAR struct rpmsg_s *rpmsg)
-{
-  FAR struct rpmsg_port_s *port = (FAR struct rpmsg_port_s *)rpmsg;
-
-  return port->rxq.len - sizeof(struct rpmsg_port_header_s) -
-         sizeof(struct rpmsg_hdr);
-}
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -604,6 +602,8 @@ int rpmsg_port_initialize(FAR struct rpmsg_port_s *port,
   rdev->ops.get_tx_payload_buffer = rpmsg_port_get_tx_payload_buffer;
   rdev->ops.send_offchannel_nocopy = rpmsg_port_send_offchannel_nocopy;
   rdev->ops.release_tx_buffer = rpmsg_port_release_tx_buffer;
+  rdev->ops.get_rx_buffer_size = rpmsg_port_get_rx_buffer_size;
+  rdev->ops.get_tx_buffer_size = rpmsg_port_get_tx_buffer_size;
 
   metal_list_init(&rdev->endpoints);
 
@@ -611,7 +611,8 @@ int rpmsg_port_initialize(FAR struct rpmsg_port_s *port,
   rdev->support_ns = true;
 
   rpmsg_register_endpoint(rdev, &rdev->ns_ept, "NS", RPMSG_NS_EPT_ADDR,
-                          RPMSG_NS_EPT_ADDR, rpmsg_port_ns_callback, NULL);
+                          RPMSG_NS_EPT_ADDR, rpmsg_port_ns_callback, NULL,
+                          port);
   port->ops->register_callback(port, rpmsg_port_rx_callback);
 
   return 0;
diff --git a/drivers/rpmsg/rpmsg_router_edge.c b/drivers/rpmsg/rpmsg_router_edge.c
index 9874e8c9a3..fccdb68904 100644
--- a/drivers/rpmsg/rpmsg_router_edge.c
+++ b/drivers/rpmsg/rpmsg_router_edge.c
@@ -85,8 +85,11 @@ static FAR const char *
 rpmsg_router_edge_get_local_cpuname(FAR struct rpmsg_s *rpmsg);
 static FAR const char *
 rpmsg_router_edge_get_cpuname(FAR struct rpmsg_s *rpmsg);
-static int rpmsg_router_edge_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg);
-static int rpmsg_router_edge_get_rx_buffer_size(FAR struct rpmsg_s *rpmsg);
+
+static int
+rpmsg_router_edge_get_rx_buffer_size(FAR struct rpmsg_device *rdev);
+static int
+rpmsg_router_edge_get_tx_buffer_size(FAR struct rpmsg_device *rdev);
 
 /****************************************************************************
  * Private Data
@@ -101,8 +104,6 @@ static const struct rpmsg_ops_s g_rpmsg_router_edge_ops =
   NULL,
   rpmsg_router_edge_get_local_cpuname,
   rpmsg_router_edge_get_cpuname,
-  rpmsg_router_edge_get_tx_buffer_size,
-  rpmsg_router_edge_get_rx_buffer_size,
 };
 
 /****************************************************************************
@@ -135,30 +136,6 @@ rpmsg_router_edge_get_cpuname(FAR struct rpmsg_s *rpmsg)
   return edge->remotecpu;
 }
 
-/****************************************************************************
- * Name: rpmsg_router_edge_get_tx_buffer_size
- ****************************************************************************/
-
-static int rpmsg_router_edge_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg)
-{
-  FAR struct rpmsg_router_edge_s *edge =
-      (FAR struct rpmsg_router_edge_s *)rpmsg;
-
-  return edge->tx_len;
-}
-
-/****************************************************************************
- * Name: rpmsg_router_edge_get_rx_buffer_size
- ****************************************************************************/
-
-static int rpmsg_router_edge_get_rx_buffer_size(FAR struct rpmsg_s *rpmsg)
-{
-  FAR struct rpmsg_router_edge_s *edge =
-      (FAR struct rpmsg_router_edge_s *)rpmsg;
-
-  return edge->rx_len;
-}
-
 /****************************************************************************
  * Name: rpmsg_router_edge_get_tx_payload_buffer
  ****************************************************************************/
@@ -255,6 +232,30 @@ static int rpmsg_router_edge_send_nocopy(FAR struct rpmsg_device *rdev,
   return hubdev->ops.send_offchannel_nocopy(hubdev, src, dst, data, len);
 }
 
+/****************************************************************************
+ * Name: rpmsg_router_edge_get_rx_buffer_size
+ ****************************************************************************/
+
+static int
+rpmsg_router_edge_get_rx_buffer_size(FAR struct rpmsg_device *rdev)
+{
+  FAR struct rpmsg_router_edge_s *edge = rpmsg_router_edge_from_rdev(rdev);
+
+  return edge->rx_len;
+}
+
+/****************************************************************************
+ * Name: rpmsg_router_edge_get_tx_buffer_size
+ ****************************************************************************/
+
+static int
+rpmsg_router_edge_get_tx_buffer_size(FAR struct rpmsg_device *rdev)
+{
+  FAR struct rpmsg_router_edge_s *edge = rpmsg_router_edge_from_rdev(rdev);
+
+  return edge->tx_len;
+}
+
 /****************************************************************************
  * Name: rpmsg_router_edge_cb
  *
@@ -608,6 +609,8 @@ rpmsg_router_edge_create(FAR struct rpmsg_device *hubdev,
   rdev->ops.send_offchannel_nocopy = rpmsg_router_edge_send_nocopy;
   rdev->ops.send_offchannel_raw = rpmsg_router_edge_send_offchannel_raw;
   rdev->ops.get_tx_payload_buffer = rpmsg_router_edge_get_tx_payload_buffer;
+  rdev->ops.get_rx_buffer_size = rpmsg_router_edge_get_rx_buffer_size;
+  rdev->ops.get_tx_buffer_size = rpmsg_router_edge_get_tx_buffer_size;
 
   metal_list_init(&rdev->endpoints);
   rdev->support_ack = true;
diff --git a/drivers/rpmsg/rpmsg_router_hub.c b/drivers/rpmsg/rpmsg_router_hub.c
index 78080e1ee5..a150c719d9 100644
--- a/drivers/rpmsg/rpmsg_router_hub.c
+++ b/drivers/rpmsg/rpmsg_router_hub.c
@@ -322,10 +322,10 @@ static void rpmsg_router_bound(FAR struct rpmsg_endpoint *ept)
   for (i = 0; i < 2; i++)
     {
       msg.cmd = RPMSG_ROUTER_CREATE;
-      msg.tx_len = MIN(rpmsg_get_rx_buffer_size(hub->ept[i].rdev),
-                       rpmsg_get_tx_buffer_size(hub->ept[1 - i].rdev));
-      msg.rx_len = MIN(rpmsg_get_tx_buffer_size(hub->ept[i].rdev),
-                       rpmsg_get_rx_buffer_size(hub->ept[1 - i].rdev));
+      msg.tx_len = MIN(rpmsg_get_rx_buffer_size(&hub->ept[i]),
+                       rpmsg_get_tx_buffer_size(&hub->ept[1 - i]));
+      msg.rx_len = MIN(rpmsg_get_tx_buffer_size(&hub->ept[i]),
+                       rpmsg_get_rx_buffer_size(&hub->ept[1 - i]));
       strlcpy(msg.cpuname, hub->cpuname[i], sizeof(msg.cpuname));
       ret = rpmsg_send(&hub->ept[i], &msg, sizeof(msg));
       DEBUGASSERT(ret >= 0);
diff --git a/drivers/rpmsg/rpmsg_virtio.c b/drivers/rpmsg/rpmsg_virtio.c
index 890180c594..1f8b1bb6f6 100644
--- a/drivers/rpmsg/rpmsg_virtio.c
+++ b/drivers/rpmsg/rpmsg_virtio.c
@@ -74,8 +74,6 @@ static void rpmsg_virtio_dump(FAR struct rpmsg_s *rpmsg);
 static FAR const char *
 rpmsg_virtio_get_local_cpuname(FAR struct rpmsg_s *rpmsg);
 static FAR const char *rpmsg_virtio_get_cpuname(FAR struct rpmsg_s *rpmsg);
-static int rpmsg_virtio_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg);
-static int rpmsg_virtio_get_rx_buffer_size_(FAR struct rpmsg_s *rpmsg);
 
 static int rpmsg_virtio_create_virtqueues_(FAR struct virtio_device *vdev,
                                            unsigned int flags,
@@ -102,8 +100,6 @@ static const struct rpmsg_ops_s g_rpmsg_virtio_ops =
   .dump               = rpmsg_virtio_dump,
   .get_local_cpuname  = rpmsg_virtio_get_local_cpuname,
   .get_cpuname        = rpmsg_virtio_get_cpuname,
-  .get_tx_buffer_size = rpmsg_virtio_get_tx_buffer_size,
-  .get_rx_buffer_size = rpmsg_virtio_get_rx_buffer_size_,
 };
 
 static const struct virtio_dispatch g_rpmsg_virtio_dispatch =
@@ -429,16 +425,6 @@ static FAR const char *rpmsg_virtio_get_cpuname(FAR struct rpmsg_s *rpmsg)
   return RPMSG_VIRTIO_GET_CPUNAME(priv->dev);
 }
 
-static int rpmsg_virtio_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg)
-{
-  return rpmsg_virtio_get_buffer_size(rpmsg->rdev);
-}
-
-static int rpmsg_virtio_get_rx_buffer_size_(FAR struct rpmsg_s *rpmsg)
-{
-  return rpmsg_virtio_get_rx_buffer_size(rpmsg->rdev);
-}
-
 static void rpmsg_virtio_wakeup_rx(FAR struct rpmsg_virtio_priv_s *priv)
 {
   int semcount;
diff --git a/drivers/rptun/rptun.c b/drivers/rptun/rptun.c
index 144bae67a4..e6a23d1620 100644
--- a/drivers/rptun/rptun.c
+++ b/drivers/rptun/rptun.c
@@ -129,8 +129,6 @@ static void rptun_panic(FAR struct rpmsg_s *rpmsg);
 static void rptun_dump(FAR struct rpmsg_s *rpmsg);
 static FAR const char *rptun_get_local_cpuname(FAR struct rpmsg_s *rpmsg);
 static FAR const char *rptun_get_cpuname(FAR struct rpmsg_s *rpmsg);
-static int rptun_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg);
-static int rptun_get_rx_buffer_size(FAR struct rpmsg_s *rpmsg);
 
 /****************************************************************************
  * Private Data
@@ -167,8 +165,6 @@ static const struct rpmsg_ops_s g_rptun_rpmsg_ops =
   rptun_dump,
   rptun_get_local_cpuname,
   rptun_get_cpuname,
-  rptun_get_tx_buffer_size,
-  rptun_get_rx_buffer_size,
 };
 
 /****************************************************************************
@@ -769,16 +765,6 @@ static FAR const char *rptun_get_cpuname(FAR struct rpmsg_s *rpmsg)
   return RPTUN_GET_CPUNAME(priv->dev);
 }
 
-static int rptun_get_tx_buffer_size(FAR struct rpmsg_s *rpmsg)
-{
-  return rpmsg_virtio_get_buffer_size(rpmsg->rdev);
-}
-
-static int rptun_get_rx_buffer_size(FAR struct rpmsg_s *rpmsg)
-{
-  return rpmsg_virtio_get_rx_buffer_size(rpmsg->rdev);
-}
-
 static int rptun_dev_start(FAR struct remoteproc *rproc)
 {
   FAR struct rptun_priv_s *priv = rproc->priv;
diff --git a/fs/rpmsgfs/rpmsgfs_server.c b/fs/rpmsgfs/rpmsgfs_server.c
index 7fa9cd76f5..b3f8fbd8a8 100644
--- a/fs/rpmsgfs/rpmsgfs_server.c
+++ b/fs/rpmsgfs/rpmsgfs_server.c
@@ -616,8 +616,8 @@ static int rpmsgfs_readdir_handler(FAR struct rpmsg_endpoint *ept,
       entry = readdir(dir);
       if (entry)
         {
-          size = MIN(rpmsg_get_tx_buffer_size(ept->rdev),
-                     rpmsg_get_rx_buffer_size(ept->rdev));
+          size = MIN(rpmsg_get_tx_buffer_size(ept),
+                     rpmsg_get_rx_buffer_size(ept));
           size = MIN(size - len, strlen(entry->d_name) + 1);
           msg->type = entry->d_type;
           strlcpy(msg->name, entry->d_name, size);
diff --git a/include/nuttx/rpmsg/rpmsg.h b/include/nuttx/rpmsg/rpmsg.h
index 08435ef95f..b41a439bad 100644
--- a/include/nuttx/rpmsg/rpmsg.h
+++ b/include/nuttx/rpmsg/rpmsg.h
@@ -65,8 +65,6 @@ struct rpmsg_s
  * wait: wait sem.
  * post: post sem.
  * get_cpuname: get cpu name.
- * get_tx_buffer_size: get tx buffer size.
- * get_rx_buffer_size: get rx buffer size.
  */
 
 struct rpmsg_ops_s
@@ -78,8 +76,6 @@ struct rpmsg_ops_s
   CODE void (*dump)(FAR struct rpmsg_s *rpmsg);
   CODE FAR const char *(*get_local_cpuname)(FAR struct rpmsg_s *rpmsg);
   CODE FAR const char *(*get_cpuname)(FAR struct rpmsg_s *rpmsg);
-  CODE int (*get_tx_buffer_size)(FAR struct rpmsg_s *rpmsg);
-  CODE int (*get_rx_buffer_size)(FAR struct rpmsg_s *rpmsg);
 };
 
 CODE typedef void (*rpmsg_dev_cb_t)(FAR struct rpmsg_device *rdev,
@@ -109,9 +105,6 @@ int rpmsg_post(FAR struct rpmsg_endpoint *ept, FAR sem_t *sem);
 FAR const char *rpmsg_get_local_cpuname(FAR struct rpmsg_device *rdev);
 FAR const char *rpmsg_get_cpuname(FAR struct rpmsg_device *rdev);
 
-int rpmsg_get_tx_buffer_size(FAR struct rpmsg_device *rdev);
-int rpmsg_get_rx_buffer_size(FAR struct rpmsg_device *rdev);
-
 int rpmsg_register_callback(FAR void *priv,
                             rpmsg_dev_cb_t device_created,
                             rpmsg_dev_cb_t device_destroy,


(nuttx) 08/09: rptun: rptun implements notify_wait through rvdev->notify_wait_cb

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 0b1f45d60019bbd31400b6431248b76cf66a1319
Author: wangyongrong <wa...@xiaomi.com>
AuthorDate: Tue Jan 23 10:55:01 2024 +0800

    rptun: rptun implements notify_wait through rvdev->notify_wait_cb
    
    notify_wait has been remove in remoteproc ops and virtio_dispatch and
    has been moved to the struct rpmsg_virtio_device in new OpenAMP,
    so change the rptun too,
    
    Signed-off-by: wangyongrong <wa...@xiaomi.com>
---
 drivers/rptun/rptun.c        | 9 +++++----
 drivers/virtio/virtio-mmio.c | 1 -
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/rptun/rptun.c b/drivers/rptun/rptun.c
index e6a23d1620..8ae7ce02b2 100644
--- a/drivers/rptun/rptun.c
+++ b/drivers/rptun/rptun.c
@@ -100,7 +100,7 @@ rptun_get_mem(FAR struct remoteproc *rproc,
               metal_phys_addr_t da,
               FAR void *va, size_t size,
               FAR struct remoteproc_mem *buf);
-static int rptun_notify_wait(FAR struct remoteproc *rproc, uint32_t id);
+static int rptun_notify_wait(FAR struct rpmsg_device *rdev, uint32_t id);
 
 static int rptun_dev_start(FAR struct remoteproc *rproc);
 static int rptun_dev_stop(FAR struct remoteproc *rproc, bool stop_ns);
@@ -143,7 +143,6 @@ static const struct remoteproc_ops g_rptun_ops =
   .stop        = rptun_stop,
   .notify      = rptun_notify,
   .get_mem     = rptun_get_mem,
-  .notify_wait = rptun_notify_wait,
 };
 
 #ifdef CONFIG_RPTUN_LOADER
@@ -527,9 +526,10 @@ rptun_get_mem(FAR struct remoteproc *rproc,
   return buf;
 }
 
-static int rptun_notify_wait(FAR struct remoteproc *rproc, uint32_t id)
+static int rptun_notify_wait(FAR struct rpmsg_device *rdev, uint32_t id)
 {
-  FAR struct rptun_priv_s *priv = rproc->priv;
+  FAR struct rptun_priv_s *priv = (FAR struct rptun_priv_s *)
+    metal_container_of(rdev, struct rpmsg_s, rdev);
 
   if (!rptun_is_recursive(priv))
     {
@@ -919,6 +919,7 @@ static int rptun_dev_start(FAR struct remoteproc *rproc)
     }
 
   priv->rvdev.rdev.ns_unbind_cb = rpmsg_ns_unbind;
+  priv->rvdev.notify_wait_cb = rptun_notify_wait;
 
   /* Remote proc start */
 
diff --git a/drivers/virtio/virtio-mmio.c b/drivers/virtio/virtio-mmio.c
index 6caeb60f28..9c26fb5a66 100644
--- a/drivers/virtio/virtio-mmio.c
+++ b/drivers/virtio/virtio-mmio.c
@@ -250,7 +250,6 @@ static const struct virtio_dispatch g_virtio_mmio_dispatch =
   virtio_mmio_write_config,       /* write_config */
   virtio_mmio_reset_device,       /* reset_device */
   virtio_mmio_notify,             /* notify */
-  NULL,                           /* notify_wait */
 };
 
 /****************************************************************************


(nuttx) 03/09: openamp/libmetal.defs: fix OpenAMP upgrade err

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 2bc92566846dfe2ef2ff8afeea95dbdf599f937f
Author: wangyongrong <wa...@xiaomi.com>
AuthorDate: Thu Jun 27 09:41:23 2024 +0800

    openamp/libmetal.defs: fix OpenAMP upgrade err
    
    fix nuttx/openamp/libmetal/lib/cpu.h don't have <metal/processor/generic/cpu.h>
    error, let's use generic/cpu.h for all arch in NuttX
    
    Signed-off-by: wangyongrong <wa...@xiaomi.com>
---
 openamp/libmetal.defs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/openamp/libmetal.defs b/openamp/libmetal.defs
index f50f69ab1c..20254f5bad 100644
--- a/openamp/libmetal.defs
+++ b/openamp/libmetal.defs
@@ -90,7 +90,7 @@ else
 .libmetal_headers:
 endif
 	$(eval headers := $(wildcard libmetal/lib/compiler/gcc/*.h))
-	$(eval headers += $(wildcard libmetal/lib/processor/$(LIBMETAL_ARCH)/*.h))
+	$(eval headers += $(wildcard libmetal/lib/processor/generic/*.h))
 	$(eval headers += $(wildcard libmetal/lib/system/nuttx/*.h))
 	$(eval headers += $(wildcard libmetal/lib/*.h))
 	$(foreach header,$(headers), \