|
@@ -45,12 +45,58 @@ static inline void __flush_dcache_icache_phys(unsigned long physaddr)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-extern void flush_dcache_range(unsigned long start, unsigned long stop);
|
|
|
#ifdef CONFIG_PPC32
|
|
|
-extern void clean_dcache_range(unsigned long start, unsigned long stop);
|
|
|
-extern void invalidate_dcache_range(unsigned long start, unsigned long stop);
|
|
|
+/*
|
|
|
+ * Write any modified data cache blocks out to memory and invalidate them.
|
|
|
+ * Does not invalidate the corresponding instruction cache blocks.
|
|
|
+ */
|
|
|
+static inline void flush_dcache_range(unsigned long start, unsigned long stop)
|
|
|
+{
|
|
|
+ void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
|
|
|
+ unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
|
|
|
+ unsigned long i;
|
|
|
+
|
|
|
+ for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
|
|
|
+ dcbf(addr);
|
|
|
+ mb(); /* sync */
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Write any modified data cache blocks out to memory.
|
|
|
+ * Does not invalidate the corresponding cache lines (especially for
|
|
|
+ * any corresponding instruction cache).
|
|
|
+ */
|
|
|
+static inline void clean_dcache_range(unsigned long start, unsigned long stop)
|
|
|
+{
|
|
|
+ void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
|
|
|
+ unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
|
|
|
+ unsigned long i;
|
|
|
+
|
|
|
+ for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
|
|
|
+ dcbst(addr);
|
|
|
+ mb(); /* sync */
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Like above, but invalidate the D-cache. This is used by the 8xx
|
|
|
+ * to invalidate the cache so the PPC core doesn't get stale data
|
|
|
+ * from the CPM (no cache snooping here :-).
|
|
|
+ */
|
|
|
+static inline void invalidate_dcache_range(unsigned long start,
|
|
|
+ unsigned long stop)
|
|
|
+{
|
|
|
+ void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
|
|
|
+ unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
|
|
|
+ unsigned long i;
|
|
|
+
|
|
|
+ for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
|
|
|
+ dcbi(addr);
|
|
|
+ mb(); /* sync */
|
|
|
+}
|
|
|
+
|
|
|
#endif /* CONFIG_PPC32 */
|
|
|
#ifdef CONFIG_PPC64
|
|
|
+extern void flush_dcache_range(unsigned long start, unsigned long stop);
|
|
|
extern void flush_inval_dcache_range(unsigned long start, unsigned long stop);
|
|
|
extern void flush_dcache_phys_range(unsigned long start, unsigned long stop);
|
|
|
#endif
|