Module Name:    src
Committed By:   rkujawa
Date:           Sun May 19 15:42:23 UTC 2013

Modified Files:
        src/sys/arch/arm/arm32: cpu.c

Log Message:
Plug support for PJ4B into our ARM CPU infrastructure.

Obtained from Marvell, Semihalf.


To generate a diff of this commit:
cvs rdiff -u -r1.93 -r1.94 src/sys/arch/arm/arm32/cpu.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/arm32/cpu.c
diff -u src/sys/arch/arm/arm32/cpu.c:1.93 src/sys/arch/arm/arm32/cpu.c:1.94
--- src/sys/arch/arm/arm32/cpu.c:1.93	Sun Feb  3 15:57:23 2013
+++ src/sys/arch/arm/arm32/cpu.c	Sun May 19 15:42:23 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.93 2013/02/03 15:57:23 matt Exp $	*/
+/*	$NetBSD: cpu.c,v 1.94 2013/05/19 15:42:23 rkujawa Exp $	*/
 
 /*
  * Copyright (c) 1995 Mark Brinicombe.
@@ -46,7 +46,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.93 2013/02/03 15:57:23 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.94 2013/05/19 15:42:23 rkujawa Exp $");
 
 #include <sys/systm.h>
 #include <sys/conf.h>
@@ -74,6 +74,7 @@ uint32_t arm_cpu_marker __cacheline_alig
 void identify_arm_cpu(device_t dv, struct cpu_info *);
 void identify_cortex_caches(device_t dv);
 void identify_features(device_t dv);
+u_int cpu_pfr(int num);
 
 /*
  * Identify the master (boot) CPU
@@ -227,6 +228,7 @@ enum cpu_class {
 	CPU_CLASS_ARM11J,
 	CPU_CLASS_ARMV4,
 	CPU_CLASS_CORTEX,
+	CPU_CLASS_PJ4B,
 };
 
 static const char * const generic_steppings[16] = {
@@ -487,6 +489,22 @@ const struct cpuidtab cpuids[] = {
 	{ CPU_ID_CORTEXA15R3,	CPU_CLASS_CORTEX,	"Cortex-A15 r3",
 	  pN_steppings, "7A" },
 
+	{ CPU_ID_MV88SV581X_V6, CPU_CLASS_PJ4B,      "Sheeva 88SV581x",
+	  generic_steppings },
+	{ CPU_ID_ARM_88SV581X_V6, CPU_CLASS_PJ4B,    "Sheeva 88SV581x",
+	  generic_steppings },
+	{ CPU_ID_MV88SV581X_V7, CPU_CLASS_PJ4B,      "Sheeva 88SV581x",
+	  generic_steppings },
+	{ CPU_ID_ARM_88SV581X_V7, CPU_CLASS_PJ4B,    "Sheeva 88SV581x",
+	  generic_steppings },
+	{ CPU_ID_MV88SV584X_V6, CPU_CLASS_PJ4B,      "Sheeva 88SV584x",
+	  generic_steppings },
+	{ CPU_ID_ARM_88SV584X_V6, CPU_CLASS_PJ4B,    "Sheeva 88SV584x",
+	  generic_steppings },
+	{ CPU_ID_MV88SV584X_V7, CPU_CLASS_PJ4B,      "Sheeva 88SV584x",
+	  generic_steppings },
+
+
 	{ 0, CPU_CLASS_NONE, NULL, NULL, "" }
 };
 
@@ -514,6 +532,7 @@ const struct cpu_classtab cpu_classes[] 
 	[CPU_CLASS_ARM11J] =	{ "ARM11J",	"CPU_ARM11" },
 	[CPU_CLASS_ARMV4] =	{ "ARMv4",	"CPU_ARMV4" },
 	[CPU_CLASS_CORTEX] =	{ "Cortex",	"CPU_CORTEX" },
+	[CPU_CLASS_PJ4B] =	{ "Marvell",	"CPU_PJ4B" },
 };
 
 /*
@@ -560,6 +579,29 @@ print_cache_info(device_t dv, struct arm
 	}
 }
 
+u_int cpu_pfr(int num)
+{
+	u_int feat;
+
+	switch (num) {
+	case 0:
+		__asm __volatile("mrc p15, 0, %0, c0, c1, 0"
+		    : "=r" (feat));
+		break;
+	case 1:
+		__asm __volatile("mrc p15, 0, %0, c0, c1, 1"
+		   : "=r" (feat));
+		break;
+	default:
+		panic("Processor Feature Register %d not implemented", num);
+		break;
+	}
+
+	return (feat);
+}
+
+
+
 void
 identify_arm_cpu(device_t dv, struct cpu_info *ci)
 {
@@ -627,6 +669,7 @@ identify_arm_cpu(device_t dv, struct cpu
 	case CPU_CLASS_ARM11J:
 	case CPU_CLASS_ARMV4:
 	case CPU_CLASS_CORTEX:
+	case CPU_CLASS_PJ4B:
 		if ((ci->ci_ctrl & CPU_CONTROL_DC_ENABLE) == 0)
 			aprint_normal(" DC disabled");
 		else
@@ -654,7 +697,7 @@ identify_arm_cpu(device_t dv, struct cpu
 
 	aprint_normal("\n");
 
-	if (CPU_ID_CORTEX_P(cpuid) || CPU_ID_ARM11_P(cpuid)) {
+	if (CPU_ID_CORTEX_P(cpuid) || CPU_ID_ARM11_P(cpuid) || CPU_ID_MV88SV58XX_P(cpuid)) {
 		identify_features(dv);
 	}
 
@@ -714,6 +757,9 @@ identify_arm_cpu(device_t dv, struct cpu
 #if defined(CPU_CORTEX)
 	case CPU_CLASS_CORTEX:
 #endif
+#if defined(CPU_PJ4B)
+	case CPU_CLASS_PJ4B:
+#endif
 #if defined(CPU_FA526)
 	case CPU_CLASS_ARMV4:
 #endif

Reply via email to