Plug support for PJ4B core into our ARM CPU support infrastructure.

Obtained from Marvell, Semihalf.
This commit is contained in:
rkujawa 2013-05-19 15:37:06 +00:00
parent 60dd6bd0af
commit 33587300c0

View File

@ -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[] = {