Module Name:    src
Committed By:   matt
Date:           Fri Mar 28 21:49:22 UTC 2014

Modified Files:
        src/sys/arch/arm/arm: cpufunc.c

Log Message:
Initialize cache way_size and sets


To generate a diff of this commit:
cvs rdiff -u -r1.140 -r1.141 src/sys/arch/arm/arm/cpufunc.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/arm/cpufunc.c
diff -u src/sys/arch/arm/arm/cpufunc.c:1.140 src/sys/arch/arm/arm/cpufunc.c:1.141
--- src/sys/arch/arm/arm/cpufunc.c:1.140	Fri Feb 21 06:28:25 2014
+++ src/sys/arch/arm/arm/cpufunc.c	Fri Mar 28 21:49:22 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.c,v 1.140 2014/02/21 06:28:25 matt Exp $	*/
+/*	$NetBSD: cpufunc.c,v 1.141 2014/03/28 21:49:22 matt Exp $	*/
 
 /*
  * arm7tdmi support code Copyright (c) 2001 John Fremlin
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.140 2014/02/21 06:28:25 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.141 2014/03/28 21:49:22 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_cpuoptions.h"
@@ -1506,19 +1506,21 @@ static void
 get_cacheinfo_clidr(struct arm_cache_info *info, u_int level, u_int clidr)
 {
 	u_int csid;
-	u_int nsets;
 
 	if (clidr & 6) {
 		csid = get_cachesize_cp15(level << 1); /* select dcache values */
-		nsets = CPU_CSID_NUMSETS(csid) + 1;
+		info->dcache_sets = CPU_CSID_NUMSETS(csid) + 1;
 		info->dcache_ways = CPU_CSID_ASSOC(csid) + 1;
 		info->dcache_line_size = 1U << (CPU_CSID_LEN(csid) + 4);
-		info->dcache_size = info->dcache_line_size * info->dcache_ways * nsets;
+		info->dcache_way_size =
+		    info->dcache_line_size * info->dcache_sets;
+		info->dcache_size = info->dcache_way_size * info->dcache_ways;
 
 		if (level == 0) {
 			arm_dcache_log2_assoc = CPU_CSID_ASSOC(csid) + 1;
 			arm_dcache_log2_linesize = CPU_CSID_LEN(csid) + 4;
-			arm_dcache_log2_nsets = 31 - __builtin_clz(nsets*2-1);
+			arm_dcache_log2_nsets =
+			    31 - __builtin_clz(info->dcache_sets*2-1);
 		}
 	}
 
@@ -1532,17 +1534,19 @@ get_cacheinfo_clidr(struct arm_cache_inf
 	if (info->cache_unified) {
 		info->icache_ways = info->dcache_ways;
 		info->icache_line_size = info->dcache_line_size;
+		info->icache_way_size = info->dcache_way_size;
 		info->icache_size = info->dcache_size;
 	} else {
 		csid = get_cachesize_cp15((level << 1)|CPU_CSSR_InD); /* select icache values */
-		nsets = CPU_CSID_NUMSETS(csid) + 1;
+		info->icache_sets = CPU_CSID_NUMSETS(csid) + 1;
 		info->icache_ways = CPU_CSID_ASSOC(csid) + 1;
 		info->icache_line_size = 1U << (CPU_CSID_LEN(csid) + 4);
-		info->icache_size = info->icache_line_size * info->icache_ways * nsets;
+		info->icache_way_size = info->icache_line_size * info->icache_sets;
+		info->icache_size = info->icache_way_size * info->icache_ways;
 	}
 	if (level == 0
-	    && info->dcache_size / info->dcache_ways <= PAGE_SIZE
-	    && info->icache_size / info->icache_ways <= PAGE_SIZE) {
+	    && info->dcache_way_size <= PAGE_SIZE
+	    && info->icache_way_size <= PAGE_SIZE) {
 		arm_cache_prefer_mask = 0;
 	}
 }
@@ -1595,8 +1599,11 @@ get_cachetype_cp15(void)
 			if (arm_scache.dcache_line_size < arm_dcache_align)
 				arm_dcache_align = arm_scache.dcache_line_size;
 		}
-		if (arm_pcache.dcache_type == CACHE_TYPE_PIPT
-		    && arm_pcache.icache_type == CACHE_TYPE_PIPT) {
+		/*
+		 * The pmap cleans an entire way for an exec page so
+		 * we don't care that it's VIPT anymore.
+		 */
+		if (arm_pcache.dcache_type == CACHE_TYPE_PIPT) {
 			arm_cache_prefer_mask = 0;
 		}
 		goto out;
@@ -1634,6 +1641,8 @@ get_cachetype_cp15(void)
 #endif
 		}
 		arm_pcache.icache_size = multiplier << (CPU_CT_xSIZE_SIZE(isize) + 8);
+		arm_pcache.icache_way_size =
+		    __BIT(9 + CPU_CT_xSIZE_SIZE(isize) - CPU_CT_xSIZE_ASSOC(isize));
 	}
 
 	dsize = CPU_CT_DSIZE(ctype);
@@ -1658,6 +1667,8 @@ get_cachetype_cp15(void)
 #endif
 	}
 	arm_pcache.dcache_size = multiplier << (CPU_CT_xSIZE_SIZE(dsize) + 8);
+	arm_pcache.dcache_way_size =
+	    __BIT(9 + CPU_CT_xSIZE_SIZE(dsize) - CPU_CT_xSIZE_ASSOC(dsize));
 
 	arm_dcache_align = arm_pcache.dcache_line_size;
 
@@ -1724,10 +1735,20 @@ get_cachetype_table(void)
 			arm_pcache.dcache_line_size =
 			    cachetab[i].ct_pdcache_line_size;
 			arm_pcache.dcache_ways = cachetab[i].ct_pdcache_ways;
+			if (arm_pcache.dcache_ways) {
+				arm_pcache.dcache_way_size = 
+				    arm_pcache.dcache_line_size
+				    / arm_pcache.dcache_ways;
+			}
 			arm_pcache.icache_size = cachetab[i].ct_picache_size;
 			arm_pcache.icache_line_size =
 			    cachetab[i].ct_picache_line_size;
 			arm_pcache.icache_ways = cachetab[i].ct_picache_ways;
+			if (arm_pcache.icache_ways) {
+				arm_pcache.icache_way_size = 
+				    arm_pcache.icache_line_size
+				    / arm_pcache.icache_ways;
+			}
 		}
 	}
 

Reply via email to