Module Name:    src
Committed By:   hsuenaga
Date:           Wed Apr 15 10:40:36 UTC 2015

Modified Files:
        src/sys/arch/arm/marvell: armadaxp.c armadaxpreg.h
Added Files:
        src/sys/arch/arm/marvell: armadaxpvar.h

Log Message:
implement L2 cache maintenance operations of ARMADA XP.
the L2 cahce maintenance operations are defined on SoC internal registers.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/marvell/armadaxp.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/marvell/armadaxpreg.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/marvell/armadaxpvar.h

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/marvell/armadaxp.c
diff -u src/sys/arch/arm/marvell/armadaxp.c:1.8 src/sys/arch/arm/marvell/armadaxp.c:1.9
--- src/sys/arch/arm/marvell/armadaxp.c:1.8	Sat Apr  5 22:41:50 2014
+++ src/sys/arch/arm/marvell/armadaxp.c	Wed Apr 15 10:40:36 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: armadaxp.c,v 1.8 2014/04/05 22:41:50 matt Exp $	*/
+/*	$NetBSD: armadaxp.c,v 1.9 2015/04/15 10:40:36 hsuenaga Exp $	*/
 /*******************************************************************************
 Copyright (C) Marvell International Ltd. and its affiliates
 
@@ -37,7 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
 *******************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v 1.8 2014/04/05 22:41:50 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v 1.9 2015/04/15 10:40:36 hsuenaga Exp $");
 
 #define _INTR_PRIVATE
 
@@ -58,6 +58,7 @@ __KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v
 #include <arm/marvell/mvsocreg.h>
 #include <arm/marvell/mvsocvar.h>
 #include <arm/marvell/armadaxpreg.h>
+#include <arm/marvell/armadaxpvar.h>
 
 #include <dev/marvell/marvellreg.h>
 
@@ -99,8 +100,6 @@ static void armadaxp_pic_set_priority(st
 
 static int armadaxp_find_pending_irqs(void);
 static void armadaxp_pic_block_irq(struct pic_softc *, size_t);
-void armadaxp_io_coherency_init(void);
-int armadaxp_l2_init(bus_addr_t);
 
 struct vco_freq_ratio {
 	uint8_t	vco_cpu;	/* VCO to CLK0(CPU) clock ratio */
@@ -477,6 +476,61 @@ armadaxp_l2_init(bus_addr_t pbase)
 }
 
 void
+armadaxp_sdcache_inv_all(void)
+{
+	L2_WRITE(ARMADAXP_L2_INV_WAY, L2_ALL_WAYS);
+}
+
+void
+armadaxp_sdcache_wb_all(void)
+{
+	L2_WRITE(ARMADAXP_L2_WB_WAY, L2_ALL_WAYS);
+	__asm__ __volatile__("dsb");
+}
+
+void
+armadaxp_sdcache_wbinv_all(void)
+{
+	L2_WRITE(ARMADAXP_L2_WBINV_WAY, L2_ALL_WAYS);
+	__asm__ __volatile__("dsb");
+}
+
+void
+armadaxp_sdcache_inv_range(vaddr_t va, paddr_t pa, psize_t sz)
+{
+	paddr_t pa_base, pa_end;
+
+	pa_base = pa & ~0x1f;
+	pa_end = (pa_base + sz) & ~0x1f;
+	L2_WRITE(ARMADAXP_L2_RANGE_BASE, pa_base);
+	L2_WRITE(ARMADAXP_L2_INV_RANGE, pa_end);
+}
+
+void
+armadaxp_sdcache_wb_range(vaddr_t va, paddr_t pa, psize_t sz)
+{
+	paddr_t pa_base, pa_end;
+
+	pa_base = pa & ~0x1f;
+	pa_end = (pa_base + sz) & ~0x1f;
+	L2_WRITE(ARMADAXP_L2_RANGE_BASE, pa_base);
+	L2_WRITE(ARMADAXP_L2_WB_RANGE, pa_end);
+	__asm__ __volatile__("dsb");
+}
+
+void
+armadaxp_sdcache_wbinv_range(vaddr_t va, paddr_t pa, psize_t sz)
+{
+	paddr_t pa_base, pa_end;
+
+	pa_base = pa & ~0x1f;
+	pa_end = (pa_base + sz) & ~0x1f;
+	L2_WRITE(ARMADAXP_L2_RANGE_BASE, pa_base);
+	L2_WRITE(ARMADAXP_L2_WBINV_RANGE, pa_end);
+	__asm__ __volatile__("dsb");
+}
+
+void
 armadaxp_io_coherency_init(void)
 {
 	uint32_t reg;

Index: src/sys/arch/arm/marvell/armadaxpreg.h
diff -u src/sys/arch/arm/marvell/armadaxpreg.h:1.2 src/sys/arch/arm/marvell/armadaxpreg.h:1.3
--- src/sys/arch/arm/marvell/armadaxpreg.h:1.2	Mon Dec 23 03:19:43 2013
+++ src/sys/arch/arm/marvell/armadaxpreg.h	Wed Apr 15 10:40:36 2015
@@ -222,7 +222,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
 #define ARMADAXP_L2_CNTR_CONF(x)	(0x204 + (x) * 0xc)
 #define ARMADAXP_L2_INT_CAUSE		0x220
 #define ARMADAXP_L2_CFU			0x228
-#define ARMADAXP_L2_INV_WAY		0x778
+#define ARMADAXP_L2_SYNC		0x700
+#define ARMADAXP_L2_STATUS		0x704
+/* Cache maintance operations */
+#define ARMADAXP_L2_RANGE_BASE		0x720
+#define ARMADAXP_L2_INV_PHYS		0x770
+#define ARMADAXP_L2_INV_RANGE		0x774
+#define ARMADAXP_L2_INV_IDXWAY		0x778
+#define ARMADAXP_L2_INV_WAY		0x77c
+#define ARMADAXP_L2_BLOCK		0x78c
+#define ARMADAXP_L2_WB_PHYS		0x7b0
+#define ARMADAXP_L2_WB_RANGE		0x7b4
+#define ARMADAXP_L2_WB_IDXWAY		0x7b8
+#define ARMADAXP_L2_WB_WAY		0x7bc
+#define ARMADAXP_L2_WBINV_PHYS		0x7f0
+#define ARMADAXP_L2_WBINV_RANGE		0x7f4
+#define ARMADAXP_L2_WBINV_IDXWAY	0x7f8
+#define ARMADAXP_L2_WBINV_WAY		0x7fc
 #define L2_ENABLE			(1 << 0)
 #define L2_WBWT_MODE_MASK		(3 << 0)
 #define L2_REP_STRAT_MASK		(3 << 27)

Added files:

Index: src/sys/arch/arm/marvell/armadaxpvar.h
diff -u /dev/null src/sys/arch/arm/marvell/armadaxpvar.h:1.1
--- /dev/null	Wed Apr 15 10:40:36 2015
+++ src/sys/arch/arm/marvell/armadaxpvar.h	Wed Apr 15 10:40:36 2015
@@ -0,0 +1,44 @@
+/*	$NetBSD: armadaxpvar.h,v 1.1 2015/04/15 10:40:36 hsuenaga Exp $	*/
+/*
+ * Copyright (c) 2015 SUENAGA Hiroki
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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.
+ */
+#ifndef _ARMDAXPVAR_H_
+#define _ARMDAXPVAR_H_
+#include <machine/bus_defs.h>
+
+/* device initalization */
+extern void armadaxp_io_coherency_init(void);
+extern int armadaxp_l2_init(bus_addr_t);
+
+/* l2cache maintanance */
+extern void armadaxp_sdcache_inv_all(void);
+extern void armadaxp_sdcache_wb_all(void);
+extern void armadaxp_sdcache_wbinv_all(void);
+extern void armadaxp_sdcache_inv_range(vaddr_t, paddr_t, psize_t);
+extern void armadaxp_sdcache_wb_range(vaddr_t, paddr_t, psize_t);
+extern void armadaxp_sdcache_wbinv_range(vaddr_t, paddr_t, psize_t);
+
+#endif /* _ARMDAXPVAR_H_ */
+

Reply via email to