diff --git a/lib/rpmsg/rpmsg_core.c b/lib/rpmsg/rpmsg_core.c
index d389e8d2eb3f1d69666d6772eaf1c7e108c1e302..6245b3f64dfb32f1868923008caf8982c15be61c 100644 (file)
--- a/lib/rpmsg/rpmsg_core.c
+++ b/lib/rpmsg/rpmsg_core.c
#include <string.h>
#include "openamp/rpmsg.h"
#include "metal/utilities.h"
+#include "metal/io.h"
+#include "metal/cache.h"
/* Internal functions */
static void rpmsg_rx_callback(struct virtqueue *vq);
{
struct llist node;
int status;
+ struct metal_io_region *io;
/* Initialize buffer node */
node.data = buffer;
node.next = RPMSG_NULL;
node.prev = RPMSG_NULL;
+ io = rdev->proc->sh_buff.io;
+ if (io) {
+ if (! (io->mem_flags & METAL_UNCACHED))
+ metal_cache_flush(buffer, (unsigned int)len);
+ }
if (rdev->role == RPMSG_REMOTE) {
status = virtqueue_add_buffer(rdev->tvq, &node, 0, 1, buffer);
} else {
virtqueue_get_available_buffer(rdev->rvq, idx,
(uint32_t *) len);
}
+ if (data) {
+ struct metal_io_region *io;
+ io = rdev->proc->sh_buff.io;
+ if (io) {
+ if (! (io->mem_flags & METAL_UNCACHED))
+ metal_cache_invalidate(data,
+ (unsigned int)(*len));
+ }
+ }
return data;
}