From a2456e61ee5b7c55eb3901bdcdd836b7e0f83bbc Mon Sep 17 00:00:00 2001 From: Iuliana Prodan Date: Wed, 12 Jul 2023 14:40:31 +0300 Subject: [PATCH] remoteproc: do cache invalidation before reading rsc_table info Do a cache invalidation before reading the resource table's info since this ca be in a cacheable region. Make this optional, based on VIRTIO_CACHED_RSC_TABLE. Signed-off-by: Iuliana Prodan --- cmake/options.cmake | 6 ++++++ lib/include/openamp/remoteproc_virtio.h | 10 ++++++++++ lib/remoteproc/remoteproc_virtio.c | 10 +++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/cmake/options.cmake b/cmake/options.cmake index f36ea1b..4f89589 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -90,6 +90,12 @@ if (WITH_DCACHE_BUFFERS) add_definitions(-DVIRTIO_CACHED_BUFFERS) endif (WITH_DCACHE_BUFFERS) +option (WITH_DCACHE_RSC_TABLE "Build with resource table cache operations enabled" OFF) + +if (WITH_DCACHE_RSC_TABLE) + add_definitions(-DVIRTIO_CACHED_RSC_TABLE) +endif (WITH_DCACHE_RSC_TABLE) + # Set the complication flags set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") diff --git a/lib/include/openamp/remoteproc_virtio.h b/lib/include/openamp/remoteproc_virtio.h index a37a7b1..31e575e 100644 --- a/lib/include/openamp/remoteproc_virtio.h +++ b/lib/include/openamp/remoteproc_virtio.h @@ -15,6 +15,7 @@ #include #include #include +#include #if defined __cplusplus extern "C" { @@ -23,6 +24,15 @@ extern "C" { /* maximum number of vring descriptors for a vdev limited by 16-bit data type */ #define RPROC_MAX_VRING_DESC USHRT_MAX +/* cache invalidation helpers for resource table */ +#ifdef VIRTIO_CACHED_RSC_TABLE +#define RSC_TABLE_FLUSH(x, s) metal_cache_flush(x, s) +#define RSC_TABLE_INVALIDATE(x, s) metal_cache_invalidate(x, s) +#else +#define RSC_TABLE_FLUSH(x, s) do { } while (0) +#define RSC_TABLE_INVALIDATE(x, s) do { } while (0) +#endif /* VIRTIO_CACHED_RSC_TABLE */ + /* define vdev notification function user should implement */ typedef int (*rpvdev_notify_func)(void *priv, uint32_t id); diff --git a/lib/remoteproc/remoteproc_virtio.c b/lib/remoteproc/remoteproc_virtio.c index 169e5b5..7ef1064 100644 --- a/lib/remoteproc/remoteproc_virtio.c +++ b/lib/remoteproc/remoteproc_virtio.c @@ -40,6 +40,7 @@ static unsigned char rproc_virtio_get_status(struct virtio_device *vdev) rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); vdev_rsc = rpvdev->vdev_rsc; io = rpvdev->vdev_rsc_io; + RSC_TABLE_INVALIDATE(vdev_rsc, sizeof(struct fw_rsc_vdev)); status = metal_io_read8(io, metal_io_virt_to_offset(io, &vdev_rsc->status)); return status; @@ -59,6 +60,7 @@ static void rproc_virtio_set_status(struct virtio_device *vdev, metal_io_write8(io, metal_io_virt_to_offset(io, &vdev_rsc->status), status); + RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev)); rpvdev->notify(rpvdev->priv, vdev->notifyid); } #endif @@ -73,6 +75,7 @@ static uint32_t rproc_virtio_get_dfeatures(struct virtio_device *vdev) rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); vdev_rsc = rpvdev->vdev_rsc; io = rpvdev->vdev_rsc_io; + RSC_TABLE_INVALIDATE(vdev_rsc, sizeof(struct fw_rsc_vdev)); features = metal_io_read32(io, metal_io_virt_to_offset(io, &vdev_rsc->dfeatures)); @@ -90,6 +93,7 @@ static uint32_t rproc_virtio_get_features(struct virtio_device *vdev) rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); vdev_rsc = rpvdev->vdev_rsc; io = rpvdev->vdev_rsc_io; + RSC_TABLE_INVALIDATE(vdev_rsc, sizeof(struct fw_rsc_vdev)); gfeatures = metal_io_read32(io, metal_io_virt_to_offset(io, &vdev_rsc->gfeatures)); dfeatures = rproc_virtio_get_dfeatures(vdev); @@ -111,6 +115,7 @@ static void rproc_virtio_set_features(struct virtio_device *vdev, metal_io_write32(io, metal_io_virt_to_offset(io, &vdev_rsc->gfeatures), features); + RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev)); rpvdev->notify(rpvdev->priv, vdev->notifyid); } @@ -138,10 +143,12 @@ static void rproc_virtio_read_config(struct virtio_device *vdev, config = (char *)(&vdev_rsc->vring[vdev->vrings_num]); io = rpvdev->vdev_rsc_io; - if (offset + length <= vdev_rsc->config_len) + if (offset + length <= vdev_rsc->config_len) { + RSC_TABLE_INVALIDATE(config + offset, length); metal_io_block_read(io, metal_io_virt_to_offset(io, config + offset), dst, length); + } } #ifndef VIRTIO_DEVICE_ONLY @@ -162,6 +169,7 @@ static void rproc_virtio_write_config(struct virtio_device *vdev, metal_io_block_write(io, metal_io_virt_to_offset(io, config + offset), src, length); + RSC_TABLE_FLUSH(config + offset, length); rpvdev->notify(rpvdev->priv, vdev->notifyid); } }