Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / u-boot / arch / avr32 / cpu / cache.c
diff --git a/qemu/roms/u-boot/arch/avr32/cpu/cache.c b/qemu/roms/u-boot/arch/avr32/cpu/cache.c
new file mode 100644 (file)
index 0000000..ab0374e
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+
+#include <asm/arch/cacheflush.h>
+
+void dcache_clean_range(volatile void *start, size_t size)
+{
+       unsigned long v, begin, end, linesz;
+
+       linesz = CONFIG_SYS_DCACHE_LINESZ;
+
+       /* You asked for it, you got it */
+       begin = (unsigned long)start & ~(linesz - 1);
+       end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
+
+       for (v = begin; v < end; v += linesz)
+               dcache_clean_line((void *)v);
+
+       sync_write_buffer();
+}
+
+void dcache_invalidate_range(volatile void *start, size_t size)
+{
+       unsigned long v, begin, end, linesz;
+
+       linesz = CONFIG_SYS_DCACHE_LINESZ;
+
+       /* You asked for it, you got it */
+       begin = (unsigned long)start & ~(linesz - 1);
+       end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
+
+       for (v = begin; v < end; v += linesz)
+               dcache_invalidate_line((void *)v);
+}
+
+void dcache_flush_range(volatile void *start, size_t size)
+{
+       unsigned long v, begin, end, linesz;
+
+       linesz = CONFIG_SYS_DCACHE_LINESZ;
+
+       /* You asked for it, you got it */
+       begin = (unsigned long)start & ~(linesz - 1);
+       end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
+
+       for (v = begin; v < end; v += linesz)
+               dcache_flush_line((void *)v);
+
+       sync_write_buffer();
+}
+
+void icache_invalidate_range(volatile void *start, size_t size)
+{
+       unsigned long v, begin, end, linesz;
+
+       linesz = CONFIG_SYS_ICACHE_LINESZ;
+
+       /* You asked for it, you got it */
+       begin = (unsigned long)start & ~(linesz - 1);
+       end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
+
+       for (v = begin; v < end; v += linesz)
+               icache_invalidate_line((void *)v);
+}
+
+/*
+ * This is called after loading something into memory.  We need to
+ * make sure that everything that was loaded is actually written to
+ * RAM, and that the icache will look for it. Cleaning the dcache and
+ * invalidating the icache will do the trick.
+ */
+void  flush_cache (unsigned long start_addr, unsigned long size)
+{
+       dcache_clean_range((void *)start_addr, size);
+       icache_invalidate_range((void *)start_addr, size);
+}