Author: marcel
Date: Mon Jul  2 21:11:01 2012
New Revision: 238030
URL: http://svn.freebsd.org/changeset/base/238030

Log:
  Implement cpu_flush_dcache(). This allows us to optimize __syncicache()
  for the common case in chich D-caches are coherent by virtue of busdma.

Modified:
  head/sys/powerpc/booke/machdep.c

Modified: head/sys/powerpc/booke/machdep.c
==============================================================================
--- head/sys/powerpc/booke/machdep.c    Mon Jul  2 21:01:03 2012        
(r238029)
+++ head/sys/powerpc/booke/machdep.c    Mon Jul  2 21:11:01 2012        
(r238030)
@@ -473,7 +473,24 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpu
 void
 cpu_flush_dcache(void *ptr, size_t len)
 {
-       /* TBD */
+       register_t addr, off;
+
+       /*
+        * Align the address to a cacheline and adjust the length
+        * accordingly. Then round the length to a multiple of the
+        * cacheline for easy looping.
+        */
+       addr = (uintptr_t)ptr;
+       off = addr & (cacheline_size - 1);
+       addr -= off;
+       len = (len + off + cacheline_size - 1) & ~(cacheline_size - 1);
+
+       while (len > 0) {
+               __asm __volatile ("dcbf 0,%0" :: "r"(addr));
+               __asm __volatile ("sync");
+               addr += cacheline_size;
+               len -= cacheline_size;
+       }
 }
 
 void
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to