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