Module Name:    src
Committed By:   matt
Date:           Fri Sep  7 21:18:59 UTC 2012

Modified Files:
        src/sys/arch/arm/cortex: pl310.c

Log Message:
Don't disable the L2C is it isn't enabled.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/cortex/pl310.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/cortex/pl310.c
diff -u src/sys/arch/arm/cortex/pl310.c:1.3 src/sys/arch/arm/cortex/pl310.c:1.4
--- src/sys/arch/arm/cortex/pl310.c:1.3	Fri Sep  7 11:49:00 2012
+++ src/sys/arch/arm/cortex/pl310.c	Fri Sep  7 21:18:58 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pl310.c,v 1.3 2012/09/07 11:49:00 matt Exp $	*/
+/*	$NetBSD: pl310.c,v 1.4 2012/09/07 21:18:58 matt Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pl310.c,v 1.3 2012/09/07 11:49:00 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pl310.c,v 1.4 2012/09/07 21:18:58 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -134,13 +134,19 @@ arml2cc_attach(device_t parent, device_t
 		}
 	}
 
+	const bool enabled_p = arml2cc_read_4(sc, L2C_CTL) != 0;
+
 	aprint_naive("\n");
 	aprint_normal(": ARM PL310%s L2 Cache Controller%s\n",
-	    revstr, arml2cc_read_4(sc, L2C_CTL) ? "" : " (disabled)");
+	    revstr, enabled_p ? "" : " (disabled)");
+
+	if (enabled_p) {
+		arml2cc_disable(sc);
+		aprint_normal_dev(self, "cache %s\n",
+		    arml2cc_read_4(sc, L2C_CTL) ? "enabled" : "disabled");
+	}
 
-	arml2cc_disable(sc);
-	aprint_normal_dev(self, "cache %s\n",
-	    arml2cc_read_4(sc, L2C_CTL) ? "enabled" : "disabled");
+	KASSERT(arm_pcache.dcache_line_size == arm_scache.dcache_line_size);
 }
 
 void
@@ -191,3 +197,37 @@ arml2cc_init(bus_space_tag_t bst, bus_sp
 		info->icache_size = i_waysize * info->icache_ways;
 	}
 }
+
+#if 0
+static void
+arml2cc_dcache_wb_range(vaddr_t va, vsize_t len)
+{
+	const size_t line_size = arm_pcache.dcache_line_size;
+	const size_t line_mask = line_size - 1;
+	size_t off = va & line_mask;
+	size_t page_len = 0;
+	paddr_t pa = 0;
+	if (off) {
+		len += off;
+		va -= off;
+	}
+	for (const vaddr_t endva = va + roundup2(len, line_size);
+	     va < endva;
+	     va += line_size) {
+		armreg_dccmvac(va);		/* this may fault */
+		__asm __volatile("dsb");
+		if (page_len == 0) {
+			armreg_ats1cpr_write(va);
+			pa = armreg_par_read();
+			const psize = __predict_false(pa & 1) ? L1_SS_SIZE : L2_S_SIZE;
+			pa &= -psize;
+			endpa = pa + psize;
+			page_len = (va & (psize - 1);
+		}
+		size_t set = va 
+		arml2cc_write_4(sc, L2C_CLEAN_PA, pa);
+		
+		va += line_size;
+	}
+}
+#endif

Reply via email to