soc: ti: k3-navss-ringacc: Flush/invalidate caches on ring push/pop
[oweals/u-boot.git] / drivers / soc / ti / k3-navss-ringacc.c
index 64ebc0ba0030b06205bb1e34188a58529a583bd9..f06ea29c986c982df5e3a12ba1afda829d8a4621 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <cpu_func.h>
 #include <asm/io.h>
 #include <malloc.h>
 #include <asm/dma-mapping.h>
@@ -807,6 +808,11 @@ static int k3_nav_ringacc_ring_push_mem(struct k3_nav_ring *ring, void *elem)
 
        memcpy(elem_ptr, elem, (4 << ring->elm_size));
 
+       flush_dcache_range((unsigned long)ring->ring_mem_virt,
+                          ALIGN((unsigned long)ring->ring_mem_virt +
+                                ring->size * (4 << ring->elm_size),
+                                ARCH_DMA_MINALIGN));
+
        ring->windex = (ring->windex + 1) % ring->size;
        ring->free--;
        ringacc_writel(1, &ring->rt->db);
@@ -823,6 +829,11 @@ static int k3_nav_ringacc_ring_pop_mem(struct k3_nav_ring *ring, void *elem)
 
        elem_ptr = k3_nav_ringacc_get_elm_addr(ring, ring->rindex);
 
+       invalidate_dcache_range((unsigned long)ring->ring_mem_virt,
+                               ALIGN((unsigned long)ring->ring_mem_virt +
+                                     ring->size * (4 << ring->elm_size),
+                                     ARCH_DMA_MINALIGN));
+
        memcpy(elem, elem_ptr, (4 << ring->elm_size));
 
        ring->rindex = (ring->rindex + 1) % ring->size;