Module Name: src
Committed By: rkujawa
Date: Sun May 19 15:37:06 UTC 2013
Modified Files:
src/sys/arch/arm/arm: cpufunc.c
Log Message:
Plug support for PJ4B core into our ARM CPU support infrastructure.
Obtained from Marvell, Semihalf.
To generate a diff of this commit:
cvs rdiff -u -r1.119 -r1.120 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.119 src/sys/arch/arm/arm/cpufunc.c:1.120
--- src/sys/arch/arm/arm/cpufunc.c:1.119 Fri Dec 28 03:48:00 2012
+++ src/sys/arch/arm/arm/cpufunc.c Sun May 19 15:37:06 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.c,v 1.119 2012/12/28 03:48:00 msaitoh Exp $ */
+/* $NetBSD: cpufunc.c,v 1.120 2013/05/19 15:37:06 rkujawa 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.119 2012/12/28 03:48:00 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.120 2013/05/19 15:37:06 rkujawa Exp $");
#include "opt_compat_netbsd.h"
#include "opt_cpuoptions.h"
@@ -1329,6 +1329,67 @@ struct cpu_functions cortex_cpufuncs = {
};
#endif /* CPU_CORTEX */
+#ifdef CPU_PJ4B
+struct cpu_functions pj4bv7_cpufuncs = {
+ /* CPU functions */
+
+ .cf_id = cpufunc_id,
+ .cf_cpwait = pj4b_drain_writebuf,
+
+ /* MMU functions */
+
+ .cf_control = cpufunc_control,
+ .cf_domains = cpufunc_domains,
+ .cf_setttb = pj4b_setttb,
+ .cf_faultstatus = cpufunc_faultstatus,
+ .cf_faultaddress = cpufunc_faultaddress,
+
+ /* TLB functions */
+
+ .cf_tlb_flushID = pj4b_tlb_flushID,
+ .cf_tlb_flushID_SE = pj4b_tlb_flushID_SE,
+ .cf_tlb_flushI = pj4b_tlb_flushID,
+ .cf_tlb_flushI_SE = pj4b_tlb_flushID_SE,
+ .cf_tlb_flushD = pj4b_tlb_flushID,
+ .cf_tlb_flushD_SE = pj4b_tlb_flushID_SE,
+
+ /* Cache operations */
+
+ .cf_icache_sync_all = armv7_idcache_wbinv_all,
+ .cf_icache_sync_range = pj4b_icache_sync_range,
+
+ .cf_dcache_wbinv_all = armv7_dcache_wbinv_all,
+ .cf_dcache_wbinv_range = pj4b_dcache_wbinv_range,
+ .cf_dcache_inv_range = pj4b_dcache_inv_range,
+ .cf_dcache_wb_range = pj4b_dcache_wb_range,
+
+ .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
+ .cf_sdcache_inv_range = (void *)cpufunc_nullop,
+ .cf_sdcache_wb_range = (void *)cpufunc_nullop,
+
+ .cf_idcache_wbinv_all = armv7_idcache_wbinv_all,
+ .cf_idcache_wbinv_range = pj4b_idcache_wbinv_range,
+
+ /* Other functions */
+
+ .cf_flush_prefetchbuf = pj4b_drain_readbuf,
+ .cf_drain_writebuf = pj4b_drain_writebuf,
+ .cf_flush_brnchtgt_C = pj4b_flush_brnchtgt_all,
+ .cf_flush_brnchtgt_E = pj4b_flush_brnchtgt_va,
+
+ .cf_sleep = (void *)cpufunc_nullop,
+
+ /* Soft functions */
+
+ .cf_dataabt_fixup = cpufunc_null_fixup,
+ .cf_prefetchabt_fixup = cpufunc_null_fixup,
+
+ .cf_context_switch = pj4b_context_switch,
+
+ .cf_setup = pj4bv7_setup
+};
+#endif /* CPU_PJ4B */
+
#ifdef CPU_SHEEVA
struct cpu_functions sheeva_cpufuncs = {
/* CPU functions */
@@ -1403,7 +1464,7 @@ u_int cputype;
defined(CPU_FA526) || \
defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
- defined(CPU_CORTEX) || defined(CPU_SHEEVA)
+ defined(CPU_CORTEX) || defined(CPU_PJ4B) || defined(CPU_SHEEVA)
static void get_cachetype_cp15(void);
/* Additional cache information local to this file. Log2 of some of the
@@ -1418,7 +1479,7 @@ get_cachesize_cp15(int cssr)
{
u_int csid;
-#if (CPU_CORTEX) > 0
+#if ((CPU_CORTEX) > 0) || defined(CPU_PJ4B)
__asm volatile(".arch\tarmv7a");
__asm volatile("mcr p15, 2, %0, c0, c0, 0" :: "r" (cssr));
__asm volatile("isb"); /* sync to the new cssr */
@@ -2010,6 +2071,21 @@ set_cpufuncs(void)
return 0;
}
#endif /* CPU_CORTEX */
+
+#if defined(CPU_PJ4B)
+ if ((cputype == CPU_ID_MV88SV581X_V6 ||
+ cputype == CPU_ID_MV88SV581X_V7 ||
+ cputype == CPU_ID_MV88SV584X_V7 ||
+ cputype == CPU_ID_ARM_88SV581X_V6 ||
+ cputype == CPU_ID_ARM_88SV581X_V7) &&
+ (cpu_pfr(0) & ARM_PFR0_THUMBEE_MASK)) {
+ cpufuncs = pj4bv7_cpufuncs;
+ get_cachetype_cp15();
+ pmap_pte_init_armv7();
+ return 0;
+ }
+#endif /* CPU_PJ4B */
+
/*
* Bzzzz. And the answer was ...
*/
@@ -2888,6 +2964,40 @@ arm11mpcore_setup(char *args)
}
#endif /* CPU_ARM11MPCORE */
+#ifdef CPU_PJ4B
+void
+pj4bv7_setup(char *args)
+{
+ int cpuctrl;
+
+ pj4b_config();
+
+ cpuctrl = CPU_CONTROL_MMU_ENABLE;
+#ifndef ARM32_DISABLE_ALIGNMENT_FAULTS
+ cpuctrl |= CPU_CONTROL_AFLT_ENABLE;
+#endif
+ cpuctrl |= CPU_CONTROL_DC_ENABLE;
+ cpuctrl |= CPU_CONTROL_IC_ENABLE;
+ cpuctrl |= (0xf << 3);
+ cpuctrl |= CPU_CONTROL_BPRD_ENABLE;
+ cpuctrl |= (0x5 << 16) | (1 < 22);
+ cpuctrl |= CPU_CONTROL_XP_ENABLE;
+
+ if (vector_page == ARM_VECTORS_HIGH)
+ cpuctrl |= CPU_CONTROL_VECRELOC;
+
+ /* Clear out the cache */
+ cpu_idcache_wbinv_all();
+
+ /* Set the control register */
+ cpu_control(0xffffffff, cpuctrl);
+
+ /* And again. */
+ cpu_idcache_wbinv_all();
+
+ curcpu()->ci_ctrl = cpuctrl;
+}
+#endif /* CPU_PJ4B */
#if defined(CPU_CORTEX)
struct cpu_option armv7_options[] = {