openamp: add openamp patches

0006-openamp-fix-scenario-case.patch
0007-openamp-divide-shram-to-TX-shram-RX-shram.patch
0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch

Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
ligd 2022-03-28 20:29:18 +08:00 committed by Petro Karashchenko
parent 759898c090
commit bae9a97d31
4 changed files with 186 additions and 21 deletions

View File

@ -1,7 +1,7 @@
From d14f87ea5ff1371318acaf4539116b72986bae2c Mon Sep 17 00:00:00 2001
From c2b9d18c72eebe558c6a013bf39818c47cffecc3 Mon Sep 17 00:00:00 2001
From: ligd <liguiding1@xiaomi.com>
Date: Thu, 18 Nov 2021 20:54:45 +0800
Subject: [PATCH] openamp: fix scenario case
Subject: [PATCH 1/3] openamp: fix scenario case
description:
There are two CPUs use IPC.
@ -43,7 +43,6 @@ Resolve:
add recursive call rpmsg_virtio_rx_callback() when get_tx_buffer() failed
Signed-off-by: ligd <liguiding1@xiaomi.com>
Change-Id: I60512c50327f180a0aba891e3ec847b211e172db
---
lib/include/openamp/remoteproc.h | 10 +++
lib/include/openamp/rpmsg_virtio.h | 6 ++
@ -53,7 +52,7 @@ Change-Id: I60512c50327f180a0aba891e3ec847b211e172db
5 files changed, 97 insertions(+), 66 deletions(-)
diff --git a/lib/include/openamp/remoteproc.h open-amp/lib/include/openamp/remoteproc.h
index a71327b..222079e 100644
index a71327b..328ec3f 100644
--- a/lib/include/openamp/remoteproc.h
+++ open-amp/lib/include/openamp/remoteproc.h
@@ -449,6 +449,16 @@ struct remoteproc_ops {
@ -61,56 +60,56 @@ index a71327b..222079e 100644
void *va, size_t size,
struct remoteproc_mem *buf);
+ /**
+ * can_recursive
+ * wait_tx_buffer
+ *
+ * Check current vdev can do recursive rx_callabck or not
+ * Wait tx buffer available
+ *
+ * @rproc - pointer to remoteproc instance
+ *
+ * return true if can do recursive rx_callabck.
+ * return none
+ */
+ int (*can_recursive)(struct remoteproc *rproc);
+ int (*wait_tx_buffer)(struct remoteproc *rproc);
};
/* Remoteproc error codes */
diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
index e552b96..fa556a2 100644
index e552b96..ac155fb 100644
--- a/lib/include/openamp/rpmsg_virtio.h
+++ open-amp/lib/include/openamp/rpmsg_virtio.h
@@ -114,6 +114,12 @@ rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev,
callbacks);
}
+static inline int rpmsg_virtio_can_recursive(struct rpmsg_virtio_device *rvdev)
+static inline int rpmsg_virtio_wait_tx_buffer(struct rpmsg_virtio_device *rvdev)
+{
+ return rvdev->vdev->func->can_recursive ?
+ rvdev->vdev->func->can_recursive(rvdev->vdev) : 0;
+ return rvdev->vdev->func->wait_tx_buffer ?
+ rvdev->vdev->func->wait_tx_buffer(rvdev->vdev) : -EAGAIN;
+}
+
/**
* 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 55c8ea5..ce808cc 100644
index 55c8ea5..34bccaa 100644
--- a/lib/include/openamp/virtio.h
+++ open-amp/lib/include/openamp/virtio.h
@@ -137,6 +137,7 @@ struct virtio_dispatch {
void *src, int length);
void (*reset_device)(struct virtio_device *dev);
void (*notify)(struct virtqueue *vq);
+ int (*can_recursive)(struct virtio_device *dev);
+ int (*wait_tx_buffer)(struct virtio_device *dev);
};
int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags,
diff --git a/lib/remoteproc/remoteproc_virtio.c open-amp/lib/remoteproc/remoteproc_virtio.c
index ed9f33c..937f294 100644
index ed9f33c..0de31ee 100644
--- a/lib/remoteproc/remoteproc_virtio.c
+++ open-amp/lib/remoteproc/remoteproc_virtio.c
@@ -30,6 +30,17 @@ static void rproc_virtio_virtqueue_notify(struct virtqueue *vq)
rpvdev->notify(rpvdev->priv, vring_info->notifyid);
}
+static int rproc_virtio_can_recursive(struct virtio_device *vdev)
+static int rproc_virtio_wait_tx_buffer(struct virtio_device *vdev)
+{
+ struct remoteproc_virtio *rpvdev;
+ struct remoteproc *rproc;
@ -118,7 +117,7 @@ index ed9f33c..937f294 100644
+ rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
+ rproc = rpvdev->priv;
+
+ return rproc->ops->can_recursive ? rproc->ops->can_recursive(rproc) : 0;
+ return rproc->ops->wait_tx_buffer ? rproc->ops->wait_tx_buffer(rproc) : -EAGAIN;
+}
+
static unsigned char rproc_virtio_get_status(struct virtio_device *vdev)
@ -128,12 +127,12 @@ index ed9f33c..937f294 100644
.get_features = rproc_virtio_get_features,
.read_config = rproc_virtio_read_config,
.notify = rproc_virtio_virtqueue_notify,
+ .can_recursive = rproc_virtio_can_recursive,
+ .wait_tx_buffer = rproc_virtio_wait_tx_buffer,
#ifndef VIRTIO_SLAVE_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 2687320..a407be9 100644
index 2687320..30c3ab3 100644
--- a/lib/rpmsg/rpmsg_virtio.c
+++ open-amp/lib/rpmsg/rpmsg_virtio.c
@@ -286,6 +286,72 @@ static void rpmsg_virtio_release_rx_buffer(struct rpmsg_device *rdev,
@ -213,8 +212,8 @@ index 2687320..a407be9 100644
metal_mutex_release(&rdev->lock);
if (rp_hdr || !tick_count)
break;
+ if (rpmsg_virtio_can_recursive(rvdev))
+ rpmsg_virtio_rx_callback(rvdev->rvq);
+ if (rpmsg_virtio_wait_tx_buffer(rvdev) >= 0)
+ continue;
metal_sleep_usec(RPMSG_TICKS_PER_INTERVAL);
tick_count--;
}

View File

@ -0,0 +1,130 @@
From 0de084b8b7c65502a2339221b59aeaa60edbe8c5 Mon Sep 17 00:00:00 2001
From: ligd <liguiding1@xiaomi.com>
Date: Mon, 7 Feb 2022 20:36:25 +0800
Subject: [PATCH 2/3] openamp: divide shram to TX shram & RX shram
Add new API rpmsg_init_vdev_ext()
Signed-off-by: ligd <liguiding1@xiaomi.com>
Change-Id: I790cdcf27276ed12a633fab9cc8aefff7c7da830
---
lib/include/openamp/rpmsg_virtio.h | 30 +++++++++++++++++++++++++++++
lib/rpmsg/rpmsg_virtio.c | 31 ++++++++++++++++++++----------
2 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h
index ac155fb..9d6a16e 100644
--- a/lib/include/openamp/rpmsg_virtio.h
+++ open-amp/lib/include/openamp/rpmsg_virtio.h
@@ -156,6 +156,36 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
struct metal_io_region *shm_io,
struct rpmsg_virtio_shm_pool *shpool);
+/**
+ * rpmsg_init_vdev_ext - initialize rpmsg virtio device
+ * Master side:
+ * Initialize RPMsg virtio queues and shared buffers, the address of shm can be
+ * ANY. In this case, function will get shared memory from system shared memory
+ * pools. If the vdev has RPMsg name service feature, this API will create an
+ * name service endpoint.
+ *
+ * Slave side:
+ * This API will not return until the driver ready is set by the master side.
+ *
+ * @param rvdev - pointer to the rpmsg virtio device
+ * @param vdev - pointer to the virtio device
+ * @param ns_bind_cb - callback handler for name service announcement without
+ * local endpoints waiting to bind.
+ * @param shm_io - pointer to the share memory I/O region.
+ * @param tx_shpool - pointer to tx shared memory pool. rpmsg_virtio_init_shm_pool
+ * has to be called first to fill this structure.
+ * @param rx_shpool - pointer to rx shared memory pool. rpmsg_virtio_init_shm_pool
+ * has to be called first to fill this structure.
+ *
+ * @return - status of function execution
+ */
+int rpmsg_init_vdev_ext(struct rpmsg_virtio_device *rvdev,
+ struct virtio_device *vdev,
+ rpmsg_ns_bind_cb ns_bind_cb,
+ struct metal_io_region *shm_io,
+ struct rpmsg_virtio_shm_pool *tx_shpool,
+ struct rpmsg_virtio_shm_pool *rx_shpool);
+
/**
* rpmsg_deinit_vdev - deinitialize rpmsg virtio device
*
diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c
index 30c3ab3..8a2c795 100644
--- a/lib/rpmsg/rpmsg_virtio.c
+++ open-amp/lib/rpmsg/rpmsg_virtio.c
@@ -604,11 +604,12 @@ int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev)
return size;
}
-int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
- struct virtio_device *vdev,
- rpmsg_ns_bind_cb ns_bind_cb,
- struct metal_io_region *shm_io,
- struct rpmsg_virtio_shm_pool *shpool)
+int rpmsg_init_vdev_ext(struct rpmsg_virtio_device *rvdev,
+ struct virtio_device *vdev,
+ rpmsg_ns_bind_cb ns_bind_cb,
+ struct metal_io_region *shm_io,
+ struct rpmsg_virtio_shm_pool *tx_shpool,
+ struct rpmsg_virtio_shm_pool *rx_shpool)
{
struct rpmsg_device *rdev;
const char *vq_names[RPMSG_NUM_VRINGS];
@@ -654,11 +655,11 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
* Since device is RPMSG Remote so we need to manage the
* shared buffers. Create shared memory pool to handle buffers.
*/
- if (!shpool)
+ if (!tx_shpool || !rx_shpool)
return RPMSG_ERR_PARAM;
- if (!shpool->size)
+ if (!tx_shpool->size || !rx_shpool->size)
return RPMSG_ERR_NO_BUFF;
- rvdev->shpool = shpool;
+ rvdev->shpool = tx_shpool;
vq_names[0] = "rx_vq";
vq_names[1] = "tx_vq";
@@ -670,7 +671,8 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
#endif /*!VIRTIO_SLAVE_ONLY*/
#ifndef VIRTIO_MASTER_ONLY
- (void)shpool;
+ (void)tx_shpool;
+ (void)rx_shpool;
if (role == RPMSG_REMOTE) {
vq_names[0] = "tx_vq";
vq_names[1] = "rx_vq";
@@ -711,7 +713,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
vqbuf.len = rvdev->config.txbuf_size;
for (idx = 0; idx < rvdev->rvq->vq_nentries; idx++) {
/* Initialize TX virtqueue buffers for remote device */
- buffer = rpmsg_virtio_shm_pool_get_buffer(shpool,
+ buffer = rpmsg_virtio_shm_pool_get_buffer(rx_shpool,
rvdev->config.txbuf_size);
if (!buffer) {
@@ -757,6 +759,15 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
return status;
}
+int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
+ struct virtio_device *vdev,
+ rpmsg_ns_bind_cb ns_bind_cb,
+ struct metal_io_region *shm_io,
+ struct rpmsg_virtio_shm_pool *shpool)
+{
+ return rpmsg_init_vdev_ext(rvdev, vdev, ns_bind_cb, shm_io, shpool, shpool);
+}
+
void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev)
{
struct metal_list *node;
--
2.25.1

View File

@ -0,0 +1,34 @@
From 0e2e59941d9694e060f8ac06fce6b8284d8e74ec Mon Sep 17 00:00:00 2001
From: ligd <liguiding1@xiaomi.com>
Date: Mon, 28 Feb 2022 16:31:54 +0800
Subject: [PATCH 3/3] rpmsg_virtio: don't need check status when get_tx_payload
Signed-off-by: ligd <liguiding1@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 8a2c795..b95bf6d 100644
--- a/lib/rpmsg/rpmsg_virtio.c
+++ open-amp/lib/rpmsg/rpmsg_virtio.c
@@ -359,16 +359,10 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
struct rpmsg_hdr *rp_hdr;
uint16_t idx;
int tick_count;
- int status;
/* 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

View File

@ -39,6 +39,8 @@ open-amp.zip:
$(Q) patch -p0 < 0004-openamp-add-ns_unbind_notify-support.patch
$(Q) patch -p0 < 0005-rpmsg-notify-the-user-when-the-remote-address-is-rec.patch
$(Q) patch -p0 < 0006-openamp-fix-scenario-case.patch
$(Q) patch -p0 < 0007-openamp-divide-shram-to-TX-shram-RX-shram.patch
$(Q) patch -p0 < 0008-rpmsg_virtio-don-t-need-check-status-when-get_tx_pay.patch
.openamp_headers: open-amp.zip
$(eval headers := $(wildcard open-amp/lib/include/openamp/*.h))