Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm Add support Marvell Sheeva Core and SoC. (Orion...



details:   https://anonhg.NetBSD.org/src/rev/98bb87d7309e
branches:  trunk
changeset: 757885:98bb87d7309e
user:      kiyohara <kiyohara%NetBSD.org@localhost>
date:      Sat Oct 02 05:37:58 2010 +0000

description:
Add support Marvell Sheeva Core and SoC. (Orion/Kirkwood)
  Discovery Innovation not yet.

diffstat:

 sys/arch/arm/arm/cpufunc.c            |  135 ++++++++++++++++++++-
 sys/arch/arm/arm/cpufunc_asm_sheeva.S |  216 ++++++++++++++++++++++++++++++++++
 sys/arch/arm/arm32/cpu.c              |   10 +-
 sys/arch/arm/conf/files.arm           |   13 +-
 sys/arch/arm/include/armreg.h         |   17 ++-
 sys/arch/arm/include/cpuconf.h        |   10 +-
 sys/arch/arm/include/cpufunc.h        |   14 +-
 7 files changed, 396 insertions(+), 19 deletions(-)

diffs (truncated from 616 to 300 lines):

diff -r ce327225cc90 -r 98bb87d7309e sys/arch/arm/arm/cpufunc.c
--- a/sys/arch/arm/arm/cpufunc.c        Sat Oct 02 00:52:02 2010 +0000
+++ b/sys/arch/arm/arm/cpufunc.c        Sat Oct 02 05:37:58 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpufunc.c,v 1.100 2010/09/23 07:31:10 kiyohara Exp $   */
+/*     $NetBSD: cpufunc.c,v 1.101 2010/10/02 05:37:58 kiyohara 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.100 2010/09/23 07:31:10 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.101 2010/10/02 05:37:58 kiyohara Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_cpuoptions.h"
@@ -1141,6 +1141,63 @@
 };
 #endif /* CPU_CORTEX */
 
+#ifdef CPU_SHEEVA
+struct cpu_functions sheeva_cpufuncs = {
+       /* CPU functions */
+
+       .cf_id                  = cpufunc_id,
+       .cf_cpwait              = cpufunc_nullop,
+
+       /* MMU functions */
+
+       .cf_control             = cpufunc_control,
+       .cf_domains             = cpufunc_domains,
+       .cf_setttb              = armv5_ec_setttb,
+       .cf_faultstatus         = cpufunc_faultstatus,
+       .cf_faultaddress        = cpufunc_faultaddress,
+
+       /* TLB functions */
+
+       .cf_tlb_flushID         = armv4_tlb_flushID,
+       .cf_tlb_flushID_SE      = arm10_tlb_flushID_SE,
+       .cf_tlb_flushI          = armv4_tlb_flushI,
+       .cf_tlb_flushI_SE       = arm10_tlb_flushI_SE,
+       .cf_tlb_flushD          = armv4_tlb_flushD,
+       .cf_tlb_flushD_SE       = armv4_tlb_flushD_SE,
+
+       /* Cache operations */
+
+       .cf_icache_sync_all     = armv5_ec_icache_sync_all,
+       .cf_icache_sync_range   = armv5_ec_icache_sync_range,
+
+       .cf_dcache_wbinv_all    = armv5_ec_dcache_wbinv_all,
+       .cf_dcache_wbinv_range  = sheeva_dcache_wbinv_range,
+       .cf_dcache_inv_range    = sheeva_dcache_inv_range,
+       .cf_dcache_wb_range     = sheeva_dcache_wb_range,
+
+       .cf_idcache_wbinv_all   = armv5_ec_idcache_wbinv_all,
+       .cf_idcache_wbinv_range = sheeva_idcache_wbinv_range,
+
+       /* Other functions */
+
+       .cf_flush_prefetchbuf   = cpufunc_nullop,
+       .cf_drain_writebuf      = armv4_drain_writebuf,
+       .cf_flush_brnchtgt_C    = cpufunc_nullop,
+       .cf_flush_brnchtgt_E    = (void *)cpufunc_nullop,
+
+       .cf_sleep               = (void *)cpufunc_nullop,
+
+       /* Soft functions */
+
+       .cf_dataabt_fixup       = cpufunc_null_fixup,
+       .cf_prefetchabt_fixup   = cpufunc_null_fixup,
+
+       .cf_context_switch      = arm10_context_switch,
+
+       .cf_setup               = sheeva_setup
+};
+#endif /* CPU_SHEEVA */
+
 
 /*
  * Global constants also used by locore.s
@@ -1155,7 +1212,7 @@
     defined(CPU_FA526) || \
     defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
     defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
-    defined(CPU_CORTEX)
+    defined(CPU_CORTEX) || defined(CPU_SHEEVA)
 static void get_cachetype_cp15(void);
 
 /* Additional cache information local to this file.  Log2 of some of the
@@ -1476,6 +1533,16 @@
                return 0;
        }
 #endif /* CPU_ARM9E || CPU_ARM10 */
+#if defined(CPU_SHEEVA)
+       if (cputype == CPU_ID_MV88SV131 ||
+           cputype == CPU_ID_MV88FR571_VD) {
+               cpufuncs = sheeva_cpufuncs;
+               cpu_reset_needs_v4_MMU_disable = 1;     /* V4 or higher */
+               get_cachetype_cp15();
+               pmap_pte_init_generic();
+               return 0;
+       }
+#endif /* CPU_SHEEVA */
 #ifdef CPU_ARM10
        if (/* cputype == CPU_ID_ARM1020T || */
            cputype == CPU_ID_ARM1020E) {
@@ -2105,7 +2172,7 @@
        defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
        defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
        defined(CPU_ARM10) || defined(CPU_ARM11) || defined(CPU_ARM1136) || \
-       defined(CPU_FA526) || defined(CPU_CORTEX)
+       defined(CPU_FA526) || defined(CPU_CORTEX) || defined(CPU_SHEEVA)
 
 #define IGN    0
 #define OR     1
@@ -3059,3 +3126,63 @@
 }
 #endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */
 
+#if defined(CPU_SHEEVA)
+struct cpu_option sheeva_options[] = {
+       { "cpu.cache",          BIC, OR,  (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) },
+       { "cpu.nocache",        OR,  BIC, (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) },
+       { "sheeva.cache",       BIC, OR,  (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) },
+       { "sheeva.icache",      BIC, OR,  CPU_CONTROL_IC_ENABLE },
+       { "sheeva.dcache",      BIC, OR,  CPU_CONTROL_DC_ENABLE },
+       { "cpu.writebuf",       BIC, OR,  CPU_CONTROL_WBUF_ENABLE },
+       { "cpu.nowritebuf",     OR,  BIC, CPU_CONTROL_WBUF_ENABLE },
+       { "sheeva.writebuf",    BIC, OR,  CPU_CONTROL_WBUF_ENABLE },
+       { NULL,                 IGN, IGN, 0 }
+};
+
+void
+sheeva_setup(char *args)
+{
+       int cpuctrl, cpuctrlmask;
+
+       cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_SYST_ENABLE
+           | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE
+           | CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_BPRD_ENABLE;
+       cpuctrlmask = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_SYST_ENABLE
+           | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE
+           | CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_ROM_ENABLE
+           | CPU_CONTROL_BEND_ENABLE | CPU_CONTROL_AFLT_ENABLE
+           | CPU_CONTROL_BPRD_ENABLE
+           | CPU_CONTROL_ROUNDROBIN | CPU_CONTROL_CPCLK;
+
+#ifndef ARM32_DISABLE_ALIGNMENT_FAULTS
+       cpuctrl |= CPU_CONTROL_AFLT_ENABLE;
+#endif
+
+       cpuctrl = parse_cpu_options(args, sheeva_options, cpuctrl);
+
+       /*
+        * Sheeva has L2 Cache.  Enable/Disable it here.
+        * Really not support yet...
+        */
+
+#ifdef __ARMEB__
+       cpuctrl |= CPU_CONTROL_BEND_ENABLE;
+#endif
+
+       if (vector_page == ARM_VECTORS_HIGH)
+               cpuctrl |= CPU_CONTROL_VECRELOC;
+
+       /* Clear out the cache */
+       cpu_idcache_wbinv_all();
+
+       /* Now really make sure they are clean.  */
+       __asm volatile ("mcr\tp15, 0, r0, c7, c7, 0" : : );
+
+       /* Set the control register */
+       curcpu()->ci_ctrl = cpuctrl;
+       cpu_control(0xffffffff, cpuctrl);
+
+       /* And again. */
+       cpu_idcache_wbinv_all();
+}
+#endif /* CPU_SHEEVA */
diff -r ce327225cc90 -r 98bb87d7309e sys/arch/arm/arm/cpufunc_asm_sheeva.S
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/arm/cpufunc_asm_sheeva.S     Sat Oct 02 05:37:58 2010 +0000
@@ -0,0 +1,216 @@
+/*-
+ * Copyright (C) 2008 MARVELL INTERNATIONAL LTD.
+ * All rights reserved.
+ *
+ * Developed by Semihalf.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of MARVELL nor the names of contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <machine/cpu.h>
+#include <machine/asm.h>
+#include <arm/arm32/vmparam.h>
+
+.Lsheeva_cache_line_size:
+       .word   _C_LABEL(arm_pdcache_line_size)
+.Lsheeva_asm_page_mask:
+       .word   _C_LABEL(PAGE_MASK)
+
+ENTRY(sheeva_dcache_wbinv_range)
+       str     lr, [sp, #-4]!
+       mrs     lr, cpsr
+       /* Start with cache line aligned address */
+       ldr     ip, .Lsheeva_cache_line_size
+       ldr     ip, [ip]
+       sub     ip, ip, #1
+       and     r2, r0, ip
+       add     r1, r1, r2
+       add     r1, r1, ip
+       bics    r1, r1, ip
+       bics    r0, r0, ip
+
+       ldr     ip, .Lsheeva_asm_page_mask
+       and     r2, r0, ip
+       rsb     r2, r2, #PAGE_SIZE
+       cmp     r1, r2
+       movcc   ip, r1
+       movcs   ip, r2
+1:
+       add     r3, r0, ip
+       sub     r2, r3, #1
+       /* Disable irqs */
+       orr     r3, lr, #I32_bit | F32_bit
+       msr     cpsr_c, r3
+       mcr     p15, 5, r0, c15, c15, 0 /* Clean and inv zone start address */
+       mcr     p15, 5, r2, c15, c15, 1 /* Clean and inv zone end address */
+       /* Enable irqs */
+       msr     cpsr_c, lr
+
+       add     r0, r0, ip
+       sub     r1, r1, ip
+       cmp     r1, #PAGE_SIZE
+       movcc   ip, r1
+       movcs   ip, #PAGE_SIZE
+       cmp     r1, #0
+       bne     1b
+       mov     r0, #0
+       mcr     p15, 0, r0, c7, c10, 4  /* drain the write buffer */
+       ldr     lr, [sp], #4
+       RET
+
+ENTRY(sheeva_dcache_inv_range)
+       str     lr, [sp, #-4]!
+       mrs     lr, cpsr
+       /* Start with cache line aligned address */
+       ldr     ip, .Lsheeva_cache_line_size
+       ldr     ip, [ip]
+       sub     ip, ip, #1
+       and     r2, r0, ip
+       add     r1, r1, r2
+       add     r1, r1, ip
+       bics    r1, r1, ip
+       bics    r0, r0, ip
+
+       ldr     ip, .Lsheeva_asm_page_mask
+       and     r2, r0, ip
+       rsb     r2, r2, #PAGE_SIZE
+       cmp     r1, r2
+       movcc   ip, r1
+       movcs   ip, r2
+1:
+       add     r3, r0, ip
+       sub     r2, r3, #1
+       /* Disable irqs */
+       orr     r3, lr, #I32_bit | F32_bit
+       msr     cpsr_c, r3
+       mcr     p15, 5, r0, c15, c14, 0 /* Inv zone start address */
+       mcr     p15, 5, r2, c15, c14, 1 /* Inv zone end address */
+       /* Enable irqs */
+       msr     cpsr_c, lr
+
+       add     r0, r0, ip
+       sub     r1, r1, ip
+       cmp     r1, #PAGE_SIZE



Home | Main Index | Thread Index | Old Index