From 0f3f00d2ecb1f7de470e6eaeeb74ba0ba9b66eea Mon Sep 17 00:00:00 2001
From: ligd <liguiding1@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