svn commit: r238030 - head/sys/powerpc/booke

Marcel Moolenaar marcel at FreeBSD.org
Mon Jul 2 21:11:02 UTC 2012


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


More information about the svn-src-all mailing list