Module Name: src
Committed By: kiyohara
Date: Sat Jan 7 16:19:29 UTC 2017
Modified Files:
src/sys/arch/arm/arm: cpufunc_asm_pj4b.S
src/sys/arch/arm/marvell: armadaxp.c armadaxpvar.h files.marvell
kirkwood.c mv78xx0.c mvsoc.c mvsoc_space.c mvsocreg.h mvsocvar.h
orion.c
src/sys/arch/evbarm/armadaxp: armadaxp_machdep.c
src/sys/arch/evbarm/marvell: marvell_machdep.c marvellreg.h
Added Files:
src/sys/arch/arm/marvell: dove.c dovereg.h mvsoc_sdhc.c mvsocpmu.c
mvsocpmuvar.h
Log Message:
Add support Marvell Dove.
Also <SoC>_intr_bootstrap() rename to <SoC>_bootstrap(). And SoC init func,
getclk into that.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/arm/cpufunc_asm_pj4b.S
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/marvell/armadaxp.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/marvell/armadaxpvar.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/marvell/dove.c \
src/sys/arch/arm/marvell/dovereg.h src/sys/arch/arm/marvell/mvsoc_sdhc.c \
src/sys/arch/arm/marvell/mvsocpmu.c \
src/sys/arch/arm/marvell/mvsocpmuvar.h
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/marvell/files.marvell
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/marvell/kirkwood.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/marvell/mv78xx0.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/marvell/mvsoc.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/marvell/mvsoc_space.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/marvell/mvsocreg.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/marvell/mvsocvar.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/marvell/orion.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/evbarm/marvell/marvell_machdep.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbarm/marvell/marvellreg.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/arm/cpufunc_asm_pj4b.S
diff -u src/sys/arch/arm/arm/cpufunc_asm_pj4b.S:1.12 src/sys/arch/arm/arm/cpufunc_asm_pj4b.S:1.13
--- src/sys/arch/arm/arm/cpufunc_asm_pj4b.S:1.12 Sat Jan 7 15:22:11 2017
+++ src/sys/arch/arm/arm/cpufunc_asm_pj4b.S Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc_asm_pj4b.S,v 1.12 2017/01/07 15:22:11 kiyohara Exp $ */
+/* $NetBSD: cpufunc_asm_pj4b.S,v 1.13 2017/01/07 16:19:28 kiyohara Exp $ */
/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
@@ -102,6 +102,7 @@ ENTRY(pj4b_config)
RET
END(pj4b_config)
+#ifdef AURORA_IO_CACHE_COHERENCY
/* LINTSTUB: void pj4b_io_coherency_barrier(vaddr_t, paddr_t, vsize_t); */
ENTRY_NP(pj4b_io_coherency_barrier)
movw r0, #:lower16:_C_LABEL(armadaxp_l2_barrier_reg)
@@ -120,3 +121,4 @@ END(pj4b_io_coherency_barrier)
STRONG_ALIAS(pj4b_dcache_cfu_wbinv_range, pj4b_io_coherency_barrier)
STRONG_ALIAS(pj4b_dcache_cfu_inv_range, pj4b_io_coherency_barrier)
STRONG_ALIAS(pj4b_dcache_cfu_wb_range, pj4b_io_coherency_barrier)
+#endif
Index: src/sys/arch/arm/marvell/armadaxp.c
diff -u src/sys/arch/arm/marvell/armadaxp.c:1.15 src/sys/arch/arm/marvell/armadaxp.c:1.16
--- src/sys/arch/arm/marvell/armadaxp.c:1.15 Wed Jun 3 02:53:19 2015
+++ src/sys/arch/arm/marvell/armadaxp.c Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: armadaxp.c,v 1.15 2015/06/03 02:53:19 hsuenaga Exp $ */
+/* $NetBSD: armadaxp.c,v 1.16 2017/01/07 16:19:28 kiyohara 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.15 2015/06/03 02:53:19 hsuenaga Exp $");
+__KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v 1.16 2017/01/07 16:19:28 kiyohara Exp $");
#define _INTR_PRIVATE
@@ -90,7 +90,6 @@ int iocc_state = 0;
vaddr_t misc_base;
vaddr_t armadaxp_l2_barrier_reg;
-extern void (*mvsoc_intr_init)(void);
static void armadaxp_intr_init(void);
static void armadaxp_pic_unblock_irqs(struct pic_softc *, size_t, uint32_t);
@@ -111,6 +110,17 @@ static void armadaxp_err_pic_source_name
int, char*, size_t);
static int armadaxp_err_pic_pending_irqs(struct pic_softc *);
+static void armadaxp_getclks(void);
+static void armada370_getclks(void);
+static int armadaxp_clkgating(struct marvell_attach_args *);
+
+static int armadaxp_l2_init(bus_addr_t);
+static paddr_t armadaxp_sdcache_wbalign_base(vaddr_t, paddr_t, psize_t);
+static paddr_t armadaxp_sdcache_wbalign_end(vaddr_t, paddr_t, psize_t);
+#ifdef AURORA_IO_CACHE_COHERENCY
+static void armadaxp_io_coherency_init(void);
+#endif
+
struct vco_freq_ratio {
uint8_t vco_cpu; /* VCO to CLK0(CPU) clock ratio */
uint8_t vco_l2c; /* VCO to NB(L2 cache) clock ratio */
@@ -511,13 +521,13 @@ static struct {
};
/*
- * armadaxp_intr_bootstrap:
+ * armadaxp_bootstrap:
*
- * Initialize the rest of the interrupt subsystem, making it
+ * Initialize the rest of the Armada XP dependencies, making it
* ready to handle interrupts from devices.
*/
void
-armadaxp_intr_bootstrap(bus_addr_t pbase)
+armadaxp_bootstrap(vaddr_t vbase, bus_addr_t pbase)
{
int i;
@@ -534,6 +544,35 @@ armadaxp_intr_bootstrap(bus_addr_t pbase
MPIC_WRITE(ARMADAXP_MLMB_MPIC_ICE, i);
mvsoc_intr_init = armadaxp_intr_init;
+
+ mvsoc_clkgating = armadaxp_clkgating;
+
+ misc_base = vbase + ARMADAXP_MISC_BASE;
+ switch (mvsoc_model()) {
+ case MARVELL_ARMADAXP_MV78130:
+ case MARVELL_ARMADAXP_MV78160:
+ case MARVELL_ARMADAXP_MV78230:
+ case MARVELL_ARMADAXP_MV78260:
+ case MARVELL_ARMADAXP_MV78460:
+ armadaxp_getclks();
+ break;
+
+ case MARVELL_ARMADA370_MV6707:
+ case MARVELL_ARMADA370_MV6710:
+ case MARVELL_ARMADA370_MV6W11:
+ armada370_getclks();
+ break;
+ }
+
+#ifdef L2CACHE_ENABLE
+ /* Initialize L2 Cache */
+ armadaxp_l2_init(pbase);
+#endif
+
+#ifdef AURORA_IO_CACHE_COHERENCY
+ /* Initialize cache coherency */
+ armadaxp_io_coherency_init();
+#endif
}
static void
@@ -744,7 +783,7 @@ armadaxp_err_pic_pending_irqs(struct pic
* Clock functions
*/
-void
+static void
armadaxp_getclks(void)
{
uint64_t sar_reg;
@@ -789,7 +828,7 @@ armadaxp_getclks(void)
curcpu()->ci_data.cpu_cc_freq = mvPclk;
}
-void
+static void
armada370_getclks(void)
{
uint32_t sar;
@@ -834,7 +873,7 @@ armada370_getclks(void)
* L2 Cache initialization
*/
-int
+static int
armadaxp_l2_init(bus_addr_t pbase)
{
u_int32_t reg;
@@ -1030,7 +1069,8 @@ armadaxp_sdcache_wbinv_range(vaddr_t va,
__asm__ __volatile__("dsb");
}
-void
+#ifdef AURORA_IO_CACHE_COHERENCY
+static void
armadaxp_io_coherency_init(void)
{
uint32_t reg;
@@ -1057,8 +1097,9 @@ armadaxp_io_coherency_init(void)
/* Mark as enabled */
iocc_state = 1;
}
+#endif
-int
+static int
armadaxp_clkgating(struct marvell_attach_args *mva)
{
uint32_t val;
Index: src/sys/arch/arm/marvell/armadaxpvar.h
diff -u src/sys/arch/arm/marvell/armadaxpvar.h:1.2 src/sys/arch/arm/marvell/armadaxpvar.h:1.3
--- src/sys/arch/arm/marvell/armadaxpvar.h:1.2 Wed Jun 3 02:53:19 2015
+++ src/sys/arch/arm/marvell/armadaxpvar.h Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: armadaxpvar.h,v 1.2 2015/06/03 02:53:19 hsuenaga Exp $ */
+/* $NetBSD: armadaxpvar.h,v 1.3 2017/01/07 16:19:28 kiyohara Exp $ */
/*
* Copyright (c) 2015 SUENAGA Hiroki
* All rights reserved.
@@ -29,10 +29,6 @@
#include <arm/marvell/mvsocvar.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);
Index: src/sys/arch/arm/marvell/files.marvell
diff -u src/sys/arch/arm/marvell/files.marvell:1.17 src/sys/arch/arm/marvell/files.marvell:1.18
--- src/sys/arch/arm/marvell/files.marvell:1.17 Wed Jun 3 04:20:02 2015
+++ src/sys/arch/arm/marvell/files.marvell Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-# $NetBSD: files.marvell,v 1.17 2015/06/03 04:20:02 hsuenaga Exp $
+# $NetBSD: files.marvell,v 1.18 2017/01/07 16:19:28 kiyohara Exp $
#
# Configuration info for Marvell System on Chip support
#
@@ -14,7 +14,8 @@ file arch/arm/marvell/mvsoc_dma.c
file arch/arm/arm32/irq_dispatch.S
# Some SoC(ARMADAXP) reports false DeviceID.
-defflag opt_mvsoc.h ORION KIRKWOOD MV78XX0 ARMADAXP
+defflag opt_mvsoc.h ORION KIRKWOOD MV78XX0 DOVE
+ ARMADAXP
MVSOC_CONSOLE_EARLY
defparam opt_mvsoc.h MVSOC_INTERREGS_PBASE
MVSOC_FIXUP_DEVID MEMSIZE
@@ -22,6 +23,7 @@ file arch/arm/marvell/mvsoc_intr.c
file arch/arm/marvell/orion.c orion
file arch/arm/marvell/kirkwood.c kirkwood
file arch/arm/marvell/mv78xx0.c mv78xx0
+file arch/arm/marvell/dove.c dove
file arch/arm/marvell/armadaxp.c armadaxp
@@ -89,11 +91,19 @@ file arch/arm/marvell/mvsocgpp.c mvsocg
# Secure Digital Input/Output (SDIO) Interface
attach mvsdio at mvsoc with mvsdio_mbus
+# Also SDHC (i.e. Dove)
+attach sdhc at mvsoc with mvsoc_sdhc
+file arch/arm/marvell/mvsoc_sdhc.c mvsoc_sdhc
# Thermal Sensor
device mvsocts: sysmon_envsys
attach mvsocts at mvsoc
file arch/arm/marvell/mvsocts.c mvsocts
+# Power Management Unit
+device mvsocpmu: sysmon_envsys
+attach mvsocpmu at mvsoc
+file arch/arm/marvell/mvsocpmu.c mvsocpmu needs-flag
+
# SPI Serial Peripheral Interface
attach mvspi at mvsoc with mvspi_mbus
Index: src/sys/arch/arm/marvell/kirkwood.c
diff -u src/sys/arch/arm/marvell/kirkwood.c:1.9 src/sys/arch/arm/marvell/kirkwood.c:1.10
--- src/sys/arch/arm/marvell/kirkwood.c:1.9 Tue Mar 11 07:52:37 2014
+++ src/sys/arch/arm/marvell/kirkwood.c Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: kirkwood.c,v 1.9 2014/03/11 07:52:37 martin Exp $ */
+/* $NetBSD: kirkwood.c,v 1.10 2017/01/07 16:19:28 kiyohara Exp $ */
/*
* Copyright (c) 2010 KIYOHARA Takashi
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kirkwood.c,v 1.9 2014/03/11 07:52:37 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kirkwood.c,v 1.10 2017/01/07 16:19:28 kiyohara Exp $");
#define _INTR_PRIVATE
@@ -56,6 +56,9 @@ static void kirkwood_pic_source_name(str
static int kirkwood_find_pending_irqs(void);
+static void kirkwood_getclks(vaddr_t);
+static int kirkwood_clkgating(struct marvell_attach_args *);
+
static const char * const sources[64] = {
"MainHighSum(0)", "Bridge(1)", "Host2CPU DB(2)", "CPU2Host DB(3)",
"Reserved_4(4)", "Xor0Chan0(5)", "Xor0Chan1(6)", "Xor1Chan0(7)",
@@ -111,15 +114,14 @@ static struct {
/*
- * kirkwood_intr_bootstrap:
+ * kirkwood_bootstrap:
*
- * Initialize the rest of the interrupt subsystem, making it
+ * Initialize the rest of the Kirkwood dependencies, making it
* ready to handle interrupts from devices.
*/
void
-kirkwood_intr_bootstrap(void)
+kirkwood_bootstrap(vaddr_t iobase)
{
- extern void (*mvsoc_intr_init)(void);
/* disable all interrupts */
write_mlmbreg(KIRKWOOD_MLMB_MIRQIMLR, 0);
@@ -139,6 +141,9 @@ kirkwood_intr_bootstrap(void)
}
gpp_irqbase = 96; /* Main Low(32) + High(32) + Bridge(32) */
#endif
+
+ kirkwood_getclks(iobase);
+ mvsoc_clkgating = kirkwood_clkgating;
}
static void
@@ -224,8 +229,8 @@ kirkwood_find_pending_irqs(void)
* Clock functions
*/
-void
-kirkwood_getclks(bus_addr_t iobase)
+static void
+kirkwood_getclks(vaddr_t iobase)
{
uint32_t reg;
uint16_t model;
@@ -282,7 +287,7 @@ kirkwood_getclks(bus_addr_t iobase)
}
-int
+static int
kirkwood_clkgating(struct marvell_attach_args *mva)
{
uint32_t val;
Index: src/sys/arch/arm/marvell/mv78xx0.c
diff -u src/sys/arch/arm/marvell/mv78xx0.c:1.1 src/sys/arch/arm/marvell/mv78xx0.c:1.2
--- src/sys/arch/arm/marvell/mv78xx0.c:1.1 Mon Sep 30 13:07:30 2013
+++ src/sys/arch/arm/marvell/mv78xx0.c Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mv78xx0.c,v 1.1 2013/09/30 13:07:30 kiyohara Exp $ */
+/* $NetBSD: mv78xx0.c,v 1.2 2017/01/07 16:19:28 kiyohara Exp $ */
/*
* Copyright (c) 2010 KIYOHARA Takashi
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mv78xx0.c,v 1.1 2013/09/30 13:07:30 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mv78xx0.c,v 1.2 2017/01/07 16:19:28 kiyohara Exp $");
#define _INTR_PRIVATE
@@ -59,6 +59,8 @@ static void mv78xx0_pic_source_name(stru
static int mv78xx0_find_pending_irqs(void);
+static void mv78xx0_getclks(vaddr_t);
+
static const char * const sources[64] = {
"ErrSum(0)", "SPI(1)", "TWSI0(2)", "TWSI1(3)",
"IDMA0(4)", "IDMA1(5)", "IDMA2(6)", "IDMA3(7)",
@@ -93,15 +95,14 @@ static struct pic_softc mv78xx0_pic = {
/*
- * mv78xx0_intr_bootstrap:
+ * mv78xx0_bootstrap:
*
- * Initialize the rest of the interrupt subsystem, making it
+ * Initialize the rest of the Discovery Innovation dependencies, making it
* ready to handle interrupts from devices.
*/
void
-mv78xx0_intr_bootstrap(void)
+mv78xx0_bootstrap(vaddr_t iobase)
{
- extern void (*mvsoc_intr_init)(void);
/* disable all interrupts */
write_mlmbreg(MV78XX0_ICI_IRQIMER, 0);
@@ -113,8 +114,12 @@ mv78xx0_intr_bootstrap(void)
mvsoc_intr_init = mv78xx0_intr_init;
+#if NMVSOCGPP > 0
gpp_npins = 32;
gpp_irqbase = 64; /* Main Low(32) + High(32) */
+#endif
+
+ mv78xx0_getclks(iobase);
}
static void
@@ -197,8 +202,8 @@ mv78xx0_find_pending_irqs(void)
* Clock functions
*/
-void
-mv78xx0_getclks(bus_addr_t iobase)
+static void
+mv78xx0_getclks(vaddr_t iobase)
{
const static int sys2cpu_clk_ratio_m[] = /* Mul constant */
{ 1, 3, 2, 5, 3, 7, 4, 9, 5, 1, 6 };
Index: src/sys/arch/arm/marvell/mvsoc.c
diff -u src/sys/arch/arm/marvell/mvsoc.c:1.24 src/sys/arch/arm/marvell/mvsoc.c:1.25
--- src/sys/arch/arm/marvell/mvsoc.c:1.24 Fri Nov 6 12:54:52 2015
+++ src/sys/arch/arm/marvell/mvsoc.c Sat Jan 7 16:19:28 2017
@@ -1,6 +1,6 @@
-/* $NetBSD: mvsoc.c,v 1.24 2015/11/06 12:54:52 kiyohara Exp $ */
+/* $NetBSD: mvsoc.c,v 1.25 2017/01/07 16:19:28 kiyohara Exp $ */
/*
- * Copyright (c) 2007, 2008, 2013, 2014 KIYOHARA Takashi
+ * Copyright (c) 2007, 2008, 2013, 2014, 2016 KIYOHARA Takashi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsoc.c,v 1.24 2015/11/06 12:54:52 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsoc.c,v 1.25 2017/01/07 16:19:28 kiyohara Exp $");
#include "opt_cputypes.h"
#include "opt_mvsoc.h"
@@ -52,6 +52,7 @@ __KERNEL_RCSID(0, "$NetBSD: mvsoc.c,v 1.
#include <arm/marvell/orionreg.h>
#include <arm/marvell/kirkwoodreg.h>
#include <arm/marvell/mv78xx0reg.h>
+#include <arm/marvell/dovereg.h>
#include <arm/marvell/armadaxpvar.h>
#include <arm/marvell/armadaxpreg.h>
@@ -73,6 +74,7 @@ static int mvsoc_search(device_t, cfdata
static int mvsoc_target_ddr(uint32_t, uint32_t *, uint32_t *);
static int mvsoc_target_ddr3(uint32_t, uint32_t *, uint32_t *);
+static int mvsoc_target_axi(int, uint32_t *, uint32_t *);
static int mvsoc_target_peripheral(uint32_t, uint32_t, uint32_t *, uint32_t *);
uint32_t mvPclk, mvSysclk, mvTclk = 0;
@@ -146,6 +148,11 @@ static struct {
{ MARVELL_TAG_SDRAM_CS3,
MARVELL_ATTR_SDRAM_CS3, MVSOC_UNITID_DDR },
+ { MARVELL_TAG_AXI_CS0,
+ MARVELL_ATTR_AXI_DDR, MVSOC_UNITID_DDR },
+ { MARVELL_TAG_AXI_CS1,
+ MARVELL_ATTR_AXI_DDR, MVSOC_UNITID_DDR },
+
{ MARVELL_TAG_DDR3_CS0,
MARVELL_ATTR_SDRAM_CS0, MVSOC_UNITID_DDR },
{ MARVELL_TAG_DDR3_CS1,
@@ -250,6 +257,29 @@ static struct {
MV78XX0_ATTR_CRYPT, MV78XX0_UNITID_CRYPT },
#endif
+#if defined(DOVE)
+ { DOVE_TAG_PEX0_MEM,
+ DOVE_ATTR_PEX_MEM, MVSOC_UNITID_PEX },
+ { DOVE_TAG_PEX0_IO,
+ DOVE_ATTR_PEX_IO, MVSOC_UNITID_PEX },
+ { DOVE_TAG_PEX1_MEM,
+ DOVE_ATTR_PEX_MEM, DOVE_UNITID_PEX1 },
+ { DOVE_TAG_PEX1_IO,
+ DOVE_ATTR_PEX_IO, DOVE_UNITID_PEX1 },
+ { DOVE_TAG_CRYPT,
+ DOVE_ATTR_SA, DOVE_UNITID_SA },
+ { DOVE_TAG_SPI0,
+ DOVE_ATTR_SPI0, MVSOC_UNITID_DEVBUS },
+ { DOVE_TAG_SPI1,
+ DOVE_ATTR_SPI1, MVSOC_UNITID_DEVBUS },
+ { DOVE_TAG_BOOTROM,
+ DOVE_ATTR_BOOTROM, MVSOC_UNITID_DEVBUS },
+ { DOVE_TAG_PMU,
+ DOVE_ATTR_NAND, DOVE_UNITID_NAND },
+ { DOVE_TAG_PMU,
+ DOVE_ATTR_PMU, DOVE_UNITID_PMU },
+#endif
+
#if defined(ARMADAXP)
{ ARMADAXP_TAG_PEX00_MEM,
ARMADAXP_ATTR_PEXx0_MEM, ARMADAXP_UNITID_PEX0 },
@@ -294,6 +324,10 @@ static struct {
#undef MV78XX0
#define MV78XX0(m) MARVELL_MV78XX0_ ## m
#endif
+#if defined(DOVE)
+#undef DOVE
+#define DOVE(m) MARVELL_DOVE_ ## m
+#endif
#if defined(ARMADAXP)
#undef ARMADAXP
#define ARMADAXP(m) MARVELL_ARMADAXP_ ## m
@@ -353,6 +387,16 @@ static struct {
{ MV78XX0(MV78200), 1, "MV78200", "A0", "Discovery Innovation" },
#endif
+#if defined(DOVE)
+ { DOVE(88AP510), 0, "88AP510", "Z0", "Dove" },
+ { DOVE(88AP510), 1, "88AP510", "Z1", "Dove" },
+ { DOVE(88AP510), 2, "88AP510", "Y0", "Dove" },
+ { DOVE(88AP510), 3, "88AP510", "Y1", "Dove" },
+ { DOVE(88AP510), 4, "88AP510", "X0", "Dove" },
+ { DOVE(88AP510), 6, "88AP510", "A0", "Dove" },
+ { DOVE(88AP510), 7, "88AP510", "A1", "Dove" },
+#endif
+
#if defined(ARMADAXP)
{ ARMADAXP(MV78130), 1, "MV78130", "A0", "Armada XP" },
{ ARMADAXP(MV78160), 1, "MV78160", "A0", "Armada XP" },
@@ -387,6 +431,12 @@ enum marvell_tags ddr3_tags[] = {
MARVELL_TAG_UNDEFINED
};
+enum marvell_tags axi_tags[] = {
+ MARVELL_TAG_AXI_CS0,
+ MARVELL_TAG_AXI_CS1,
+
+ MARVELL_TAG_UNDEFINED
+};
static struct {
uint16_t model;
uint8_t rev;
@@ -439,6 +489,17 @@ static struct {
{ MV78XX0(MV78200), 1, ddr_tags },
#endif
+#if defined(DOVE)
+ { DOVE(88AP510), 0, axi_tags },
+ { DOVE(88AP510), 1, axi_tags },
+ { DOVE(88AP510), 2, axi_tags },
+ { DOVE(88AP510), 3, axi_tags },
+ { DOVE(88AP510), 4, axi_tags },
+ { DOVE(88AP510), 5, axi_tags },
+ { DOVE(88AP510), 6, axi_tags },
+ { DOVE(88AP510), 7, axi_tags },
+#endif
+
#if defined(ARMADAXP)
{ ARMADAXP(MV78130), 1, ddr3_tags },
{ ARMADAXP(MV78160), 1, ddr3_tags },
@@ -667,6 +728,32 @@ static const struct mvsoc_periph {
{ MV78XX0(MV78200), "mvsata", 0, MV78XX0_SATAHC_BASE,MV78XX0_IRQ_SATA },
#endif
+#if defined(DOVE)
+#define DOVE_IRQ_TMR (64 + MVSOC_MLMB_MLMBI_CPUTIMER0INTREQ)
+
+ { DOVE(88AP510), "mvsoctmr",0, MVSOC_TMR_BASE, DOVE_IRQ_TMR },
+ { DOVE(88AP510), "mvsocpmu",0, DOVE_PMU_BASE, DOVE_IRQ_PMU },
+ { DOVE(88AP510), "com", 0, MVSOC_COM0_BASE, DOVE_IRQ_UART0 },
+ { DOVE(88AP510), "com", 1, MVSOC_COM1_BASE, DOVE_IRQ_UART1 },
+ { DOVE(88AP510), "com", 2, DOVE_COM2_BASE, DOVE_IRQ_UART2 },
+ { DOVE(88AP510), "com", 3, DOVE_COM3_BASE, DOVE_IRQ_UART3 },
+ { DOVE(88AP510), "gttwsi", 0, MVSOC_TWSI_BASE, DOVE_IRQ_TWSI },
+ { DOVE(88AP510), "mvspi", 0, DOVE_SPI0_BASE, DOVE_IRQ_SPI0 },
+ { DOVE(88AP510), "mvspi", 1, DOVE_SPI1_BASE, DOVE_IRQ_SPI1 },
+ { DOVE(88AP510), "mvcesa", 0, DOVE_CESA_BASE, DOVE_IRQ_SECURITYINT },
+ { DOVE(88AP510), "ehci", 0, DOVE_USB0_BASE, DOVE_IRQ_USB0CNT },
+ { DOVE(88AP510), "ehci", 1, DOVE_USB1_BASE, DOVE_IRQ_USB1CNT },
+ { DOVE(88AP510), "gtidmac", 0, DOVE_XORE_BASE, IRQ_DEFAULT },
+ { DOVE(88AP510), "mvgbec", 0, DOVE_GBE_BASE, IRQ_DEFAULT },
+ { DOVE(88AP510), "mvpex", 0, MVSOC_PEX_BASE, DOVE_IRQ_PEX0_INT },
+ { DOVE(88AP510), "mvpex", 1, DOVE_PEX1_BASE, DOVE_IRQ_PEX1_INT },
+ { DOVE(88AP510), "sdhc", 0, DOVE_SDHC0_BASE, DOVE_IRQ_SD0 },
+ { DOVE(88AP510), "sdhc", 1, DOVE_SDHC1_BASE, DOVE_IRQ_SD1 },
+ { DOVE(88AP510), "mvsata", 0, DOVE_SATAHC_BASE, DOVE_IRQ_SATAINT },
+// { DOVE(88AP510), "mvsocgpp",0, MVSOC_GPP_BASE, IRQ_DEFAULT },
+ { DOVE(88AP510), "mvsocrtc",0, DOVE_RTC_BASE, IRQ_DEFAULT },
+#endif
+
#if defined(ARMADAXP)
{ ARMADAXP(MV78130), "mvsoctmr",0,MVSOC_TMR_BASE, ARMADAXP_IRQ_TIMER0 },
{ ARMADAXP(MV78130), "com", 0, MVSOC_COM0_BASE, ARMADAXP_IRQ_UART0 },
@@ -1158,6 +1245,9 @@ mvsoc_target(int tag, uint32_t *target,
tag == MARVELL_TAG_SDRAM_CS2 ||
tag == MARVELL_TAG_SDRAM_CS3)
return mvsoc_target_ddr(mvsoc_tags[i].attr, base, size);
+ else if (tag == MARVELL_TAG_AXI_CS0 ||
+ tag == MARVELL_TAG_AXI_CS1)
+ return mvsoc_target_axi(tag, base, size);
else
return mvsoc_target_ddr3(mvsoc_tags[i].attr, base,
size);
@@ -1263,6 +1353,42 @@ mvsoc_target_ddr3(uint32_t attr, uint32_
}
static int
+mvsoc_target_axi(int tag, uint32_t *base, uint32_t *size)
+{
+ uint32_t val;
+ int cs;
+
+ /*
+ * Read MMAP1 Chip Select N the other side of AXI DDR Registers
+ */
+
+ switch (tag) {
+ case MARVELL_TAG_AXI_CS0:
+ cs = 0;
+ break;
+ case MARVELL_TAG_AXI_CS1:
+ cs = 1;
+ break;
+ default:
+ aprint_error("unknwon TAG: 0x%x", tag);
+ return -1;
+ }
+ val = *(volatile uint32_t *)(regbase + MVSOC_AXI_MMAP1(cs));
+ if (val & MVSOC_AXI_MMAP1_VALID) {
+ if (base != NULL)
+ *base = MVSOC_AXI_MMAP1_STARTADDRESS(val);
+ if (size != NULL)
+ *size = MVSOC_AXI_MMAP1_AREALENGTH(val);
+ } else {
+ if (base != NULL)
+ *base = 0;
+ if (size != NULL)
+ *size = 0;
+ }
+ return 0;
+}
+
+static int
mvsoc_target_peripheral(uint32_t target, uint32_t attr, uint32_t *base,
uint32_t *size)
{
Index: src/sys/arch/arm/marvell/mvsoc_space.c
diff -u src/sys/arch/arm/marvell/mvsoc_space.c:1.7 src/sys/arch/arm/marvell/mvsoc_space.c:1.8
--- src/sys/arch/arm/marvell/mvsoc_space.c:1.7 Sat Feb 22 20:33:00 2014
+++ src/sys/arch/arm/marvell/mvsoc_space.c Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mvsoc_space.c,v 1.7 2014/02/22 20:33:00 matt Exp $ */
+/* $NetBSD: mvsoc_space.c,v 1.8 2017/01/07 16:19:28 kiyohara Exp $ */
/*
* Copyright (c) 2007 KIYOHARA Takashi
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsoc_space.c,v 1.7 2014/02/22 20:33:00 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsoc_space.c,v 1.8 2017/01/07 16:19:28 kiyohara Exp $");
#include "opt_mvsoc.h"
#include "mvpex.h"
@@ -215,6 +215,45 @@ struct bus_space kirkwood_pex1_io_bs_tag
};
#endif
+#if defined(DOVE)
+struct bus_space dove_pex0_mem_bs_tag = {
+ /* cookie */
+ (void *)DOVE_TAG_PEX0_MEM,
+
+ MVSOC_BUS_SPACE_DEFAULT_FUNCS,
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+ MVSOC_BUS_SPACE_NORMAL_FUNCS,
+#endif
+};
+struct bus_space dove_pex0_io_bs_tag = {
+ /* cookie */
+ (void *)DOVE_TAG_PEX0_IO,
+
+ MVSOC_BUS_SPACE_DEFAULT_FUNCS,
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+ MVSOC_BUS_SPACE_NORMAL_FUNCS,
+#endif
+};
+struct bus_space dove_pex1_mem_bs_tag = {
+ /* cookie */
+ (void *)DOVE_TAG_PEX1_MEM,
+
+ MVSOC_BUS_SPACE_DEFAULT_FUNCS,
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+ MVSOC_BUS_SPACE_NORMAL_FUNCS,
+#endif
+};
+struct bus_space dove_pex1_io_bs_tag = {
+ /* cookie */
+ (void *)DOVE_TAG_PEX1_IO,
+
+ MVSOC_BUS_SPACE_DEFAULT_FUNCS,
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+ MVSOC_BUS_SPACE_NORMAL_FUNCS,
+#endif
+};
+#endif
+
#if defined(ARMADAXP)
struct bus_space armadaxp_pex00_mem_bs_tag = {
/* cookie */
Index: src/sys/arch/arm/marvell/mvsocreg.h
diff -u src/sys/arch/arm/marvell/mvsocreg.h:1.12 src/sys/arch/arm/marvell/mvsocreg.h:1.13
--- src/sys/arch/arm/marvell/mvsocreg.h:1.12 Wed Jun 3 03:04:21 2015
+++ src/sys/arch/arm/marvell/mvsocreg.h Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mvsocreg.h,v 1.12 2015/06/03 03:04:21 hsuenaga Exp $ */
+/* $NetBSD: mvsocreg.h,v 1.13 2017/01/07 16:19:28 kiyohara Exp $ */
/*
* Copyright (c) 2007, 2008 KIYOHARA Takashi
* All rights reserved.
@@ -35,6 +35,9 @@
#define MVSOC_UNITID_PEX 0x4 /* PCI Express Interface reg */
+#define MVSOC_INTERREGS_SIZE 0x00100000 /* 1 MB */
+
+
/*
* Physical address of integrated peripherals
*/
@@ -193,4 +196,18 @@
*/
#define MVSOC_PEX_BASE (UNITID2PHYS(PEX)) /* 0x40000 */
+
+/*
+ * AXI's DDR Controller Registers
+ * used by Dove only ???
+ */
+
+/* DDR SDRAM Contriller Address Decode Registers */
+#define MVSOC_AXI_NCS 2
+#define MVSOC_AXI_MMAP1(cs) (((cs) << 4) + 0x100)
+#define MVSOC_AXI_MMAP1_STARTADDRESS(v) ((v) & 0xff800000)
+#define MVSOC_AXI_MMAP1_AREALENGTH(v) (0x10000 << (((v) & 0xf0000) >> 16))
+#define MVSOC_AXI_MMAP1_ADDRESSMASK (0x1ff << 7)
+#define MVSOC_AXI_MMAP1_VALID (1 << 0)
+
#endif /* _MVSOCREG_H_ */
Index: src/sys/arch/arm/marvell/mvsocvar.h
diff -u src/sys/arch/arm/marvell/mvsocvar.h:1.10 src/sys/arch/arm/marvell/mvsocvar.h:1.11
--- src/sys/arch/arm/marvell/mvsocvar.h:1.10 Wed Jun 3 04:20:02 2015
+++ src/sys/arch/arm/marvell/mvsocvar.h Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mvsocvar.h,v 1.10 2015/06/03 04:20:02 hsuenaga Exp $ */
+/* $NetBSD: mvsocvar.h,v 1.11 2017/01/07 16:19:28 kiyohara Exp $ */
/*
* Copyright (c) 2007, 2010 KIYOHARA Takashi
* All rights reserved.
@@ -107,6 +107,17 @@ enum mvsoc_tags {
MV78XX0_TAG_PEX13_IO,
MV78XX0_TAG_CRYPT,
+ DOVE_TAG_PEX0_MEM,
+ DOVE_TAG_PEX0_IO,
+ DOVE_TAG_PEX1_MEM,
+ DOVE_TAG_PEX1_IO,
+ DOVE_TAG_CRYPT,
+ DOVE_TAG_SPI0,
+ DOVE_TAG_SPI1,
+ DOVE_TAG_BOOTROM,
+ DOVE_TAG_NAND,
+ DOVE_TAG_PMU,
+
ARMADAXP_TAG_PEX00_MEM,
ARMADAXP_TAG_PEX00_IO,
ARMADAXP_TAG_PEX01_MEM,
@@ -126,21 +137,13 @@ int mvsoc_target(int, uint32_t *, uint32
int mvsoc_target_dump(struct mvsoc_softc *);
int mvsoc_attr_dump(struct mvsoc_softc *, uint32_t, uint32_t);
+extern void (*mvsoc_intr_init)(void);
extern int (*mvsoc_clkgating)(struct marvell_attach_args *);
-void orion_intr_bootstrap(void);
-void orion_getclks(bus_addr_t);
-
-void kirkwood_intr_bootstrap(void);
-void kirkwood_getclks(bus_addr_t);
-int kirkwood_clkgating(struct marvell_attach_args *);
-
-void mv78xx0_intr_bootstrap(void);
-void mv78xx0_getclks(bus_addr_t);
-
-void armadaxp_intr_bootstrap(bus_addr_t);
-void armadaxp_getclks(void);
-void armada370_getclks(void);
-int armadaxp_clkgating(struct marvell_attach_args *);
+void orion_bootstrap(vaddr_t);
+void kirkwood_bootstrap(vaddr_t);
+void mv78xx0_bootstrap(vaddr_t);
+void dove_bootstrap(vaddr_t);
+void armadaxp_bootstrap(vaddr_t, bus_addr_t);
#endif /* _MVSOCVAR_H_ */
Index: src/sys/arch/arm/marvell/orion.c
diff -u src/sys/arch/arm/marvell/orion.c:1.5 src/sys/arch/arm/marvell/orion.c:1.6
--- src/sys/arch/arm/marvell/orion.c:1.5 Tue Jan 28 13:18:42 2014
+++ src/sys/arch/arm/marvell/orion.c Sat Jan 7 16:19:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: orion.c,v 1.5 2014/01/28 13:18:42 martin Exp $ */
+/* $NetBSD: orion.c,v 1.6 2017/01/07 16:19:28 kiyohara Exp $ */
/*
* Copyright (c) 2010 KIYOHARA Takashi
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: orion.c,v 1.5 2014/01/28 13:18:42 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: orion.c,v 1.6 2017/01/07 16:19:28 kiyohara Exp $");
#define _INTR_PRIVATE
@@ -56,6 +56,8 @@ static void orion_pic_source_name(struct
static int orion_find_pending_irqs(void);
+static void orion_getclks(vaddr_t);
+
static const char * const sources[64] = {
"Bridge(0)", "Host2CPU DB(1)", "CPU2Host DB(2)", "UART0(3)",
"UART1(4)", "TWSI(5)", "GPIO7_0(6)", "GPIO15_8(7)",
@@ -81,15 +83,14 @@ static struct pic_softc orion_pic = {
/*
- * orion_intr_bootstrap:
+ * orion_bootstrap:
*
- * Initialize the rest of the interrupt subsystem, making it
+ * Initialize the rest of the Orion dependences, making it
* ready to handle interrupts from devices.
*/
void
-orion_intr_bootstrap(void)
+orion_bootstrap(vaddr_t iobase)
{
- extern void (*mvsoc_intr_init)(void);
/* disable all interrupts */
write_mlmbreg(ORION_MLMB_MIRQIMR, 0);
@@ -103,6 +104,8 @@ orion_intr_bootstrap(void)
gpp_npins = 32;
gpp_irqbase = 64; /* Main(32) + Bridge(32) */
#endif
+
+ orion_getclks(iobase);
}
static void
@@ -173,8 +176,8 @@ orion_find_pending_irqs(void)
* Clock functions
*/
-void
-orion_getclks(bus_addr_t iobase)
+static void
+orion_getclks(vaddr_t iobase)
{
static const struct {
int armddrclkval;
Index: src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c
diff -u src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c:1.11 src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c:1.12
--- src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c:1.11 Sun May 3 14:38:10 2015
+++ src/sys/arch/evbarm/armadaxp/armadaxp_machdep.c Sat Jan 7 16:19:29 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: armadaxp_machdep.c,v 1.11 2015/05/03 14:38:10 hsuenaga Exp $ */
+/* $NetBSD: armadaxp_machdep.c,v 1.12 2017/01/07 16:19:29 kiyohara 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_machdep.c,v 1.11 2015/05/03 14:38:10 hsuenaga Exp $");
+__KERNEL_RCSID(0, "$NetBSD: armadaxp_machdep.c,v 1.12 2017/01/07 16:19:29 kiyohara Exp $");
#include "opt_machdep.h"
#include "opt_mvsoc.h"
@@ -146,10 +146,6 @@ extern int KERNEL_BASE_phys[];
#define KERNEL_VM_BASE (KERNEL_BASE + 0x40000000)
#define KERNEL_VM_SIZE 0x14000000
-/* Prototypes */
-extern int armadaxp_l2_init(bus_addr_t);
-extern void armadaxp_io_coherency_init(void);
-
void consinit(void);
#ifdef KGDB
static void kgdb_port_init(void);
@@ -198,7 +194,7 @@ static const struct pmap_devmap devmap[]
/* Internal registers */
.pd_va = _A(MARVELL_INTERREGS_VBASE),
.pd_pa = _A(MARVELL_INTERREGS_PBASE),
- .pd_size = _S(MARVELL_INTERREGS_SIZE),
+ .pd_size = _S(MVSOC_INTERREGS_SIZE),
.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
.pd_cache = PTE_NOCACHE
},
@@ -344,37 +340,9 @@ initarm(void *arg)
reset_axp_pcie_win();
/* Get CPU, system and timebase frequencies */
- extern vaddr_t misc_base;
- misc_base = MARVELL_INTERREGS_VBASE + ARMADAXP_MISC_BASE;
- switch (mvsoc_model()) {
- case MARVELL_ARMADA370_MV6707:
- case MARVELL_ARMADA370_MV6710:
- case MARVELL_ARMADA370_MV6W11:
- armada370_getclks();
- break;
- case MARVELL_ARMADAXP_MV78130:
- case MARVELL_ARMADAXP_MV78160:
- case MARVELL_ARMADAXP_MV78230:
- case MARVELL_ARMADAXP_MV78260:
- case MARVELL_ARMADAXP_MV78460:
- default:
- armadaxp_getclks();
- break;
- }
- mvsoc_clkgating = armadaxp_clkgating;
-
- /* Preconfigure interrupts */
- armadaxp_intr_bootstrap(MARVELL_INTERREGS_PBASE);
-
-#ifdef L2CACHE_ENABLE
- /* Initialize L2 Cache */
- (void)armadaxp_l2_init(MARVELL_INTERREGS_PBASE);
-#endif
-
-#ifdef AURORA_IO_CACHE_COHERENCY
- /* Initialize cache coherency */
- armadaxp_io_coherency_init();
-#endif
+ armadaxp_bootstrap(
+ MARVELL_INTERREGS_VBASE,
+ MARVELL_INTERREGS_PBASE);
#ifdef KGDB
kgdb_port_init();
Index: src/sys/arch/evbarm/marvell/marvell_machdep.c
diff -u src/sys/arch/evbarm/marvell/marvell_machdep.c:1.32 src/sys/arch/evbarm/marvell/marvell_machdep.c:1.33
--- src/sys/arch/evbarm/marvell/marvell_machdep.c:1.32 Wed Jun 3 03:25:51 2015
+++ src/sys/arch/evbarm/marvell/marvell_machdep.c Sat Jan 7 16:19:29 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: marvell_machdep.c,v 1.32 2015/06/03 03:25:51 hsuenaga Exp $ */
+/* $NetBSD: marvell_machdep.c,v 1.33 2017/01/07 16:19:29 kiyohara Exp $ */
/*
* Copyright (c) 2007, 2008, 2010 KIYOHARA Takashi
* All rights reserved.
@@ -25,7 +25,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: marvell_machdep.c,v 1.32 2015/06/03 03:25:51 hsuenaga Exp $");
+__KERNEL_RCSID(0, "$NetBSD: marvell_machdep.c,v 1.33 2017/01/07 16:19:29 kiyohara Exp $");
#include "opt_evbarm_boardtype.h"
#include "opt_ddb.h"
@@ -66,6 +66,7 @@ __KERNEL_RCSID(0, "$NetBSD: marvell_mach
#include <arm/marvell/orionreg.h>
#include <arm/marvell/kirkwoodreg.h>
#include <arm/marvell/mv78xx0reg.h>
+#include <arm/marvell/dovereg.h>
#include <arm/marvell/armadaxpreg.h>
#include <arm/marvell/armadaxpvar.h>
#include <arm/marvell/mvsocgppvar.h>
@@ -169,7 +170,7 @@ marvell_fixup_mbus_pex(int memtag, int i
#endif
}
-#if defined(ORION) || defined(KIRKWOOD) || defined(MV78XX0)
+#if defined(ORION) || defined(KIRKWOOD) || defined(MV78XX0) || defined(DOVE)
static void
marvell_system_reset(void)
{
@@ -260,7 +261,7 @@ static struct pmap_devmap marvell_devmap
{
MARVELL_INTERREGS_VBASE,
_A(MARVELL_INTERREGS_PBASE),
- _S(MARVELL_INTERREGS_SIZE),
+ _S(MVSOC_INTERREGS_SIZE),
VM_PROT_READ|VM_PROT_WRITE,
PTE_NOCACHE,
},
@@ -328,7 +329,7 @@ initarm(void *arg)
case MARVELL_ORION_2_88F5281:
cpu_reset_address = marvell_system_reset;
- orion_intr_bootstrap();
+ orion_bootstrap(MARVELL_INTERREGS_VBASE);
memtag = ORION_TAG_PEX0_MEM;
iotag = ORION_TAG_PEX0_IO;
@@ -338,7 +339,6 @@ initarm(void *arg)
cs = MARVELL_TAG_SDRAM_CS0;
cs_end = MARVELL_TAG_SDRAM_CS3;
- orion_getclks(MARVELL_INTERREGS_VBASE);
marvell_fixup_mbus(memtag, iotag);
break;
#endif /* ORION */
@@ -350,7 +350,7 @@ initarm(void *arg)
case MARVELL_KIRKWOOD_88F6282:
cpu_reset_address = marvell_system_reset;
- kirkwood_intr_bootstrap();
+ kirkwood_bootstrap(MARVELL_INTERREGS_VBASE);
memtag = KIRKWOOD_TAG_PEX_MEM;
iotag = KIRKWOOD_TAG_PEX_IO;
@@ -360,8 +360,6 @@ initarm(void *arg)
cs = MARVELL_TAG_SDRAM_CS0;
cs_end = MARVELL_TAG_SDRAM_CS3;
- kirkwood_getclks(MARVELL_INTERREGS_VBASE);
- mvsoc_clkgating = kirkwood_clkgating;
marvell_fixup_mbus(memtag, iotag);
break;
#endif /* KIRKWOOD */
@@ -371,7 +369,7 @@ initarm(void *arg)
case MARVELL_MV78XX0_MV78200:
cpu_reset_address = marvell_system_reset;
- mv78xx0_intr_bootstrap();
+ mv78xx0_bootstrap(MARVELL_INTERREGS_VBASE);
memtag = MV78XX0_TAG_PEX0_MEM;
iotag = MV78XX0_TAG_PEX0_IO;
@@ -381,52 +379,42 @@ initarm(void *arg)
cs = MARVELL_TAG_SDRAM_CS0;
cs_end = MARVELL_TAG_SDRAM_CS3;
- mv78xx0_getclks(MARVELL_INTERREGS_VBASE);
marvell_fixup_mbus(memtag, iotag);
break;
#endif /* MV78XX0 */
-#ifdef ARMADAXP
- case MARVELL_ARMADAXP_MV78130:
- case MARVELL_ARMADAXP_MV78160:
- case MARVELL_ARMADAXP_MV78230:
- case MARVELL_ARMADAXP_MV78260:
- case MARVELL_ARMADAXP_MV78460:
- cpu_reset_address = armadaxp_system_reset;
-
- armadaxp_intr_bootstrap(MARVELL_INTERREGS_PBASE);
-
- memtag = ARMADAXP_TAG_PEX00_MEM;
- iotag = ARMADAXP_TAG_PEX00_IO;
- nwindow = ARMADAXP_MLMB_NWINDOW;
- nremap = ARMADAXP_MLMB_NREMAP;
+#ifdef DOVE
+ case MARVELL_DOVE_88AP510:
+ cpu_reset_address = marvell_system_reset;
- cs = MARVELL_TAG_DDR3_CS0;
- cs_end = MARVELL_TAG_DDR3_CS3;
+ dove_bootstrap(MARVELL_INTERREGS_VBASE);
- extern vaddr_t misc_base;
- misc_base = MARVELL_INTERREGS_VBASE + ARMADAXP_MISC_BASE;
- armadaxp_getclks();
- mvsoc_clkgating = armadaxp_clkgating;
- armadaxp_fixup_mbus(memtag, iotag);
+ memtag = DOVE_TAG_PEX0_MEM;
+ iotag = DOVE_TAG_PEX0_IO;
+ nwindow = DOVE_DB_NWINDOW;
+ nremap = DOVE_DB_NREMAP;
-#ifdef L2CACHE_ENABLE
- /* Initialize L2 Cache */
- armadaxp_l2_init(MARVELL_INTERREGS_PBASE);
-#endif
+ cs = MARVELL_TAG_AXI_CS0;
+ cs_end = MARVELL_TAG_AXI_CS1;
-#ifdef AURORA_IO_CACHE_COHERENCY
- /* Initialize cache coherency */
- armadaxp_io_coherency_init();
-#endif
+ marvell_fixup_mbus(memtag, iotag);
break;
+#endif /* DOVE */
+#ifdef ARMADAXP
+ case MARVELL_ARMADAXP_MV78130:
+ case MARVELL_ARMADAXP_MV78160:
+ case MARVELL_ARMADAXP_MV78230:
+ case MARVELL_ARMADAXP_MV78260:
+ case MARVELL_ARMADAXP_MV78460:
case MARVELL_ARMADA370_MV6707:
case MARVELL_ARMADA370_MV6710:
case MARVELL_ARMADA370_MV6W11:
cpu_reset_address = armadaxp_system_reset;
- armadaxp_intr_bootstrap(MARVELL_INTERREGS_PBASE);
+ armadaxp_bootstrap(
+ MARVELL_INTERREGS_VBASE,
+ MARVELL_INTERREGS_PBASE);
memtag = ARMADAXP_TAG_PEX00_MEM;
iotag = ARMADAXP_TAG_PEX00_IO;
@@ -436,21 +424,7 @@ initarm(void *arg)
cs = MARVELL_TAG_DDR3_CS0;
cs_end = MARVELL_TAG_DDR3_CS3;
- extern vaddr_t misc_base;
- misc_base = MARVELL_INTERREGS_VBASE + ARMADAXP_MISC_BASE;
- armada370_getclks();
- mvsoc_clkgating = armadaxp_clkgating;
armadaxp_fixup_mbus(memtag, iotag);
-
-#ifdef L2CACHE_ENABLE
- /* Initialize L2 Cache */
- (void)armadaxp_l2_init(MARVELL_INTERREGS_PBASE);
-#endif
-
-#ifdef AURORA_IO_CACHE_COHERENCY
- /* Initialize cache coherency */
- armadaxp_io_coherency_init();
-#endif
break;
#endif /* ARMADAXP */
@@ -483,9 +457,9 @@ initarm(void *arg)
paddr_t segment_end;
segment_end = physmem = 0;
for ( ; cs <= cs_end; cs++) {
- uint32_t target, attr, base, size;
+ uint32_t base, size;
- mvsoc_target(cs, &target, &attr, &base, &size);
+ mvsoc_target(cs, NULL, NULL, &base, &size);
if (size == 0)
continue;
@@ -652,6 +626,11 @@ marvell_device_register(device_t dev, vo
kirkwood_pex_io_bs_tag, kirkwood_pex_mem_bs_tag,
kirkwood_pex1_io_bs_tag, kirkwood_pex1_mem_bs_tag;
#endif
+#ifdef DOVE
+ extern struct bus_space
+ dove_pex0_io_bs_tag, dove_pex0_mem_bs_tag,
+ dove_pex1_io_bs_tag, dove_pex1_mem_bs_tag;
+#endif
#ifdef ARMADAXP
extern struct bus_space
armadaxp_pex00_io_bs_tag, armadaxp_pex00_mem_bs_tag,
@@ -719,6 +698,24 @@ marvell_device_register(device_t dev, vo
break;
#endif
+#ifdef DOVE
+ case MARVELL_DOVE_88AP510:
+ if (mva->mva_offset == MVSOC_PEX_BASE) {
+ mvpex_io_bs_tag = &dove_pex0_io_bs_tag;
+ mvpex_mem_bs_tag = &dove_pex0_mem_bs_tag;
+ arm32_mvpex_chipset = &arm32_mvpex0_chipset;
+ iotag = DOVE_TAG_PEX0_IO;
+ memtag = DOVE_TAG_PEX0_MEM;
+ } else {
+ mvpex_io_bs_tag = &dove_pex1_io_bs_tag;
+ mvpex_mem_bs_tag = &dove_pex1_mem_bs_tag;
+ arm32_mvpex_chipset = &arm32_mvpex1_chipset;
+ iotag = DOVE_TAG_PEX1_IO;
+ memtag = DOVE_TAG_PEX1_MEM;
+ }
+ break;
+#endif
+
#ifdef ARMADAXP
case MARVELL_ARMADAXP_MV78130:
case MARVELL_ARMADAXP_MV78160:
Index: src/sys/arch/evbarm/marvell/marvellreg.h
diff -u src/sys/arch/evbarm/marvell/marvellreg.h:1.4 src/sys/arch/evbarm/marvell/marvellreg.h:1.5
--- src/sys/arch/evbarm/marvell/marvellreg.h:1.4 Sat Mar 15 13:56:19 2014
+++ src/sys/arch/evbarm/marvell/marvellreg.h Sat Jan 7 16:19:29 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: marvellreg.h,v 1.4 2014/03/15 13:56:19 kiyohara Exp $ */
+/* $NetBSD: marvellreg.h,v 1.5 2017/01/07 16:19:29 kiyohara Exp $ */
/*
* Copyright (c) 2007 KIYOHARA Takashi
* All rights reserved.
@@ -40,7 +40,6 @@
#else
#define MARVELL_INTERREGS_PBASE 0xf1000000
#endif
-#define MARVELL_INTERREGS_SIZE 0x00100000
#define MARVELL_PEXIO_PBASE 0xf2000000
#define MARVELL_PEXIO_SIZE 0x00100000
Added files:
Index: src/sys/arch/arm/marvell/dove.c
diff -u /dev/null src/sys/arch/arm/marvell/dove.c:1.1
--- /dev/null Sat Jan 7 16:19:29 2017
+++ src/sys/arch/arm/marvell/dove.c Sat Jan 7 16:19:28 2017
@@ -0,0 +1,562 @@
+/* $NetBSD: dove.c,v 1.1 2017/01/07 16:19:28 kiyohara Exp $ */
+/*
+ * Copyright (c) 2016 KIYOHARA Takashi
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: dove.c,v 1.1 2017/01/07 16:19:28 kiyohara Exp $");
+
+#define _INTR_PRIVATE
+
+#include "mvsocgpp.h"
+#include "mvsocpmu.h"
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/errno.h>
+
+#include <machine/intr.h>
+
+#include <arm/cpufunc.h>
+#include <arm/pic/picvar.h>
+#include <arm/pic/picvar.h>
+
+#include <arm/marvell/mvsocreg.h>
+#include <arm/marvell/mvsocvar.h>
+#include <arm/marvell/mvsocpmuvar.h>
+#include <arm/marvell/dovereg.h>
+
+#include <dev/marvell/marvellreg.h>
+
+
+#define read_dbreg read_mlmbreg
+#define write_dbreg write_mlmbreg
+#if NMVSOCPMU > 0
+#define READ_PMUREG(sc, o) \
+ bus_space_read_4((sc)->sc_iot, (sc)->sc_pmch, (o))
+#define WRITE_PMUREG(sc, o, v) \
+ bus_space_write_4((sc)->sc_iot, (sc)->sc_pmch, (o), (v))
+#else
+vaddr_t pmu_base = -1;
+#define READ_PMUREG(sc, o) (*(volatile uint32_t *)(pmu_base + (o)))
+#endif
+
+static void dove_intr_init(void);
+
+static void dove_pic_unblock_irqs(struct pic_softc *, size_t, uint32_t);
+static void dove_pic_block_irqs(struct pic_softc *, size_t, uint32_t);
+static void dove_pic_establish_irq(struct pic_softc *, struct intrsource *);
+static void dove_pic_source_name(struct pic_softc *, int, char *, size_t);
+
+static int dove_find_pending_irqs(void);
+
+static void dove_getclks(bus_addr_t);
+static int dove_clkgating(struct marvell_attach_args *);
+
+#if NMVSOCPMU > 0
+struct dove_pmu_softc {
+ struct mvsocpmu_softc sc_mvsocpmu_sc;
+
+ bus_space_tag_t sc_iot;
+ bus_space_handle_t sc_pmch; /* Power Management Core handler */
+ bus_space_handle_t sc_pmh; /* Power Management handler */
+
+ int sc_xpratio;
+ int sc_dpratio;
+};
+static int dove_pmu_match(device_t, struct cfdata *, void *);
+static void dove_pmu_attach(device_t, device_t, void *);
+static int dove_pmu_intr(void *);
+static int dove_tm_val2uc(int);
+static int dove_tm_uc2val(int);
+static int dove_dfs_slow(struct dove_pmu_softc *, bool);
+
+CFATTACH_DECL_NEW(mvsocpmu, sizeof(struct dove_pmu_softc),
+ dove_pmu_match, dove_pmu_attach, NULL, NULL);
+#endif
+
+
+static const char * const sources[64] = {
+ "Bridge(0)", "Host2CPUDoorbell(1)","CPU2HostDoorbell(2)","NF(3)",
+ "PDMA(4)", "SPI1(5)", "SPI0(6)", "UART0(7)",
+ "UART1(8)", "UART2(9)", "UART3(10)", "TWSI(11)",
+ "GPIO7_0(12)", "GPIO15_8(13)", "GPIO23_16(14)", "PEX0_Err(15)",
+ "PEX0_INT(16)", "PEX1_Err(17)", "PEX1_INT(18)", "Audio0_INT(19)",
+ "Audio0_Err(20)", "Audio1_INT(21)", "Audio1_Err(22)", "USBBr(23)",
+ "USB0Cnt(24)", "USB1Cnt(25)", "GbERx(26)", "GbETx(27)",
+ "GbEMisc(28)", "GbESum(29)", "GbEErr(30)", "SecurityInt(31)",
+
+ "AC97(32)", "PMU(33)", "CAM(34)", "SD0(35)",
+ "SD1(36)", "SD0_wakeup_Int(37)","SD1_wakeup_Int(38)","XOR0_DMA0(39)",
+ "XOR0_DMA1(40)", "XOR0Err(41)", "XOR1_DMA0(42)", "XOR1_DMA1(43)",
+ "XOR1Err(44)", "IRE_DCON(45)", "LCD1(46)", "LCD0(47)",
+ "GPU(48)", "Reserved(49)", "Reserved_18(50)", "Vmeta(51)",
+ "Reserved_20(52)", "Reserved_21(53)", "SSPTimer(54)", "SSPInt(55)",
+ "MemoryErr(56)", "DwnstrmExclTrn(57)","UpstrmAddrErr(58)","SecurityErr(59)",
+ "GPIO_31_24(60)", "HighGPIO(61)", "SATAInt(62)", "Reserved_31(63)"
+};
+
+static struct pic_ops dove_picops = {
+ .pic_unblock_irqs = dove_pic_unblock_irqs,
+ .pic_block_irqs = dove_pic_block_irqs,
+ .pic_establish_irq = dove_pic_establish_irq,
+ .pic_source_name = dove_pic_source_name,
+};
+static struct pic_softc dove_pic = {
+ .pic_ops = &dove_picops,
+ .pic_maxsources = 64,
+ .pic_name = "dove",
+};
+
+static struct {
+ bus_size_t offset;
+ uint32_t bits;
+} clkgatings[]= {
+ { DOVE_USB0_BASE, (1 << 0) },
+ { DOVE_USB1_BASE, (1 << 1) },
+ { DOVE_GBE_BASE, (1 << 2) | (1 << 30) },
+ { DOVE_SATAHC_BASE, (1 << 3) },
+ { MVSOC_PEX_BASE, (1 << 4) },
+ { DOVE_PEX1_BASE, (1 << 5) },
+ { DOVE_SDHC0_BASE, (1 << 8) },
+ { DOVE_SDHC1_BASE, (1 << 9) },
+ { DOVE_NAND_BASE, (1 << 10) },
+ { DOVE_CAMERA_BASE, (1 << 11) },
+ { DOVE_AUDIO0_BASE, (1 << 12) },
+ { DOVE_AUDIO1_BASE, (1 << 13) },
+ { DOVE_CESA_BASE, (1 << 15) },
+#if 0
+ { PDMA, (1 << 22) }, /* PdmaEnClock */
+#endif
+ { DOVE_XORE_BASE, (1 << 23) | (1 << 24) },
+};
+
+
+/*
+ * dove_bootstrap:
+ *
+ * Initialize the rest of the Dove dependencies, making it
+ * ready to handle interrupts from devices.
+ * And clks, PMU.
+ */
+void
+dove_bootstrap(bus_addr_t iobase)
+{
+
+ /* disable all interrupts */
+ write_dbreg(DOVE_DB_MIRQIMR, 0);
+ write_dbreg(DOVE_DB_SMIRQIMR, 0);
+
+ /* disable all bridge interrupts */
+ write_mlmbreg(MVSOC_MLMB_MLMBIMR, 0);
+
+ mvsoc_intr_init = dove_intr_init;
+
+#if NMVSOCGPP > 0
+ /*
+ * 64 General Purpose Port I/O (GPIO [63:0]) and
+ * an additional eight General Purpose Outputs (GPO [71:64]).
+ */
+ gpp_npins = 72;
+ gpp_irqbase = 96; /* Main(32) + Second Main(32) + Bridge(32) */
+#endif
+
+ dove_getclks(iobase);
+
+ mvsoc_clkgating = dove_clkgating;
+#if NMVSOCPMU == 0
+ pmu_base = iobase + DOVE_PMU_BASE;
+#endif
+}
+
+static void
+dove_intr_init(void)
+{
+ extern struct pic_softc mvsoc_bridge_pic;
+ void *ih __diagused;
+
+ pic_add(&dove_pic, 0);
+
+ pic_add(&mvsoc_bridge_pic, 64);
+ ih = intr_establish(DOVE_IRQ_BRIDGE, IPL_HIGH, IST_LEVEL_HIGH,
+ pic_handle_intr, &mvsoc_bridge_pic);
+ KASSERT(ih != NULL);
+
+ find_pending_irqs = dove_find_pending_irqs;
+}
+
+/* ARGSUSED */
+static void
+dove_pic_unblock_irqs(struct pic_softc *pic, size_t irqbase, uint32_t irq_mask)
+{
+ const size_t reg = DOVE_DB_MIRQIMR
+ + irqbase * (DOVE_DB_SMIRQIMR - DOVE_DB_MIRQIMR) / 32;
+
+ KASSERT(irqbase < 64);
+ write_dbreg(reg, read_dbreg(reg) | irq_mask);
+}
+
+/* ARGSUSED */
+static void
+dove_pic_block_irqs(struct pic_softc *pic, size_t irqbase,
+ uint32_t irq_mask)
+{
+ const size_t reg = DOVE_DB_MIRQIMR
+ + irqbase * (DOVE_DB_SMIRQIMR - DOVE_DB_MIRQIMR) / 32;
+
+ KASSERT(irqbase < 64);
+ write_dbreg(reg, read_dbreg(reg) & ~irq_mask);
+}
+
+/* ARGSUSED */
+static void
+dove_pic_establish_irq(struct pic_softc *pic, struct intrsource *is)
+{
+ /* Nothing */
+}
+
+static void
+dove_pic_source_name(struct pic_softc *pic, int irq, char *buf, size_t len)
+{
+
+ strlcpy(buf, sources[pic->pic_irqbase + irq], len);
+}
+
+/*
+ * Called with interrupts disabled
+ */
+static int
+dove_find_pending_irqs(void)
+{
+ int ipl = 0;
+
+ uint32_t cause = read_dbreg(DOVE_DB_MICR);
+ uint32_t pending = read_dbreg(DOVE_DB_MIRQIMR);
+ pending &= cause;
+ if (pending)
+ ipl |= pic_mark_pending_sources(&dove_pic, 0, pending);
+
+ uint32_t cause2 = read_dbreg(DOVE_DB_SMICR);
+ uint32_t pending2 = read_dbreg(DOVE_DB_SMIRQIMR);
+ pending2 &= cause2;
+ if (pending2)
+ ipl |= pic_mark_pending_sources(&dove_pic, 32, pending2);
+
+ return ipl;
+}
+
+/*
+ * Clock functions
+ */
+
+static void
+dove_getclks(bus_addr_t iobase)
+{
+ uint32_t val;
+
+#define MHz * 1000 * 1000
+
+ val = *(volatile uint32_t *)(iobase + DOVE_MISC_BASE +
+ DOVE_MISC_SAMPLE_AT_RESET0);
+
+ switch (val & 0x01800000) {
+ case 0x00000000: mvTclk = 166 MHz; break;
+ case 0x00800000: mvTclk = 125 MHz; break;
+ default:
+ panic("unknown mvTclk\n");
+ }
+
+ switch (val & 0x000001e0) {
+ case 0x000000a0: mvPclk = 1000 MHz; break;
+ case 0x000000c0: mvPclk = 933 MHz; break;
+ case 0x000000e0: mvPclk = 933 MHz; break;
+ case 0x00000100: mvPclk = 800 MHz; break;
+ case 0x00000120: mvPclk = 800 MHz; break;
+ case 0x00000140: mvPclk = 800 MHz; break;
+ case 0x00000160: mvPclk = 1067 MHz; break;
+ case 0x00000180: mvPclk = 667 MHz; break;
+ case 0x000001a0: mvPclk = 533 MHz; break;
+ case 0x000001c0: mvPclk = 400 MHz; break;
+ case 0x000001e0: mvPclk = 333 MHz; break;
+ default:
+ panic("unknown mvPclk\n");
+ }
+
+ switch (val & 0x0000f000) {
+ case 0x00000000: mvSysclk = mvPclk / 1; break;
+ case 0x00002000: mvSysclk = mvPclk / 2; break;
+ case 0x00004000: mvSysclk = mvPclk / 3; break;
+ case 0x00006000: mvSysclk = mvPclk / 4; break;
+ case 0x00008000: mvSysclk = mvPclk / 5; break;
+ case 0x0000a000: mvSysclk = mvPclk / 6; break;
+ case 0x0000c000: mvSysclk = mvPclk / 7; break;
+ case 0x0000e000: mvSysclk = mvPclk / 8; break;
+ case 0x0000f000: mvSysclk = mvPclk / 10; break;
+ }
+
+#undef MHz
+
+}
+
+static int
+dove_clkgating(struct marvell_attach_args *mva)
+{
+ uint32_t val;
+ int i;
+
+#if NMVSOCPMU > 0
+ struct dove_pmu_softc *pmu =
+ device_private(device_find_by_xname("mvsocpmu0"));
+
+ if (pmu == NULL)
+ return 0;
+#else
+ KASSERT(pmu_base != -1);
+#endif
+
+ if (strcmp(mva->mva_name, "mvsocpmu") == 0)
+ return 0;
+
+ for (i = 0; i < __arraycount(clkgatings); i++) {
+ if (clkgatings[i].offset == mva->mva_offset) {
+ val = READ_PMUREG(pmu, DOVE_PMU_CGCR);
+ if ((val & clkgatings[i].bits) == clkgatings[i].bits)
+ /* Clock enabled */
+ return 0;
+ return 1;
+ }
+ }
+ /* Clock Gating not support */
+ return 0;
+}
+
+#if NMVSOCPMU > 0
+static int
+dove_pmu_match(device_t parent, struct cfdata *match, void *aux)
+{
+ struct marvell_attach_args *mva = aux;
+
+ if (mvsocpmu_match(parent, match, aux) == 0)
+ return 0;
+
+ if (mva->mva_offset == MVA_OFFSET_DEFAULT ||
+ mva->mva_irq == MVA_IRQ_DEFAULT)
+ return 0;
+
+ mva->mva_size = DOVE_PMU_SIZE;
+ return 1;
+}
+
+static void
+dove_pmu_attach(device_t parent, device_t self, void *aux)
+{
+ struct dove_pmu_softc *sc = device_private(self);
+ struct marvell_attach_args *mva = aux;
+ uint32_t tdc0, cpucdc0;
+
+ sc->sc_iot = mva->mva_iot;
+ if (bus_space_subregion(sc->sc_iot, mva->mva_ioh,
+ mva->mva_offset, mva->mva_size, &sc->sc_pmch))
+ panic("%s: Cannot map core registers", device_xname(self));
+ if (bus_space_subregion(sc->sc_iot, mva->mva_ioh,
+ mva->mva_offset + (DOVE_PMU_BASE2 - DOVE_PMU_BASE),
+ DOVE_PMU_SIZE, &sc->sc_pmh))
+ panic("%s: Cannot map registers", device_xname(self));
+ if (bus_space_subregion(sc->sc_iot, mva->mva_ioh,
+ mva->mva_offset + (DOVE_PMU_SRAM_BASE - DOVE_PMU_BASE),
+ DOVE_PMU_SRAM_SIZE, &sc->sc_pmh))
+ panic("%s: Cannot map SRAM", device_xname(self));
+
+ tdc0 = READ_PMUREG(sc, DOVE_PMU_TDC0R);
+ tdc0 &= ~(DOVE_PMU_TDC0R_THERMAVGNUM_MASK |
+ DOVE_PMU_TDC0R_THERMREFCALCOUNT_MASK |
+ DOVE_PMU_TDC0R_THERMSELVCAL_MASK);
+ tdc0 |= (DOVE_PMU_TDC0R_THERMAVGNUM_2 |
+ DOVE_PMU_TDC0R_THERMREFCALCOUNT(0xf1) |
+ DOVE_PMU_TDC0R_THERMSELVCAL(2));
+ WRITE_PMUREG(sc, DOVE_PMU_TDC0R, tdc0);
+ WRITE_PMUREG(sc, DOVE_PMU_TDC0R,
+ READ_PMUREG(sc, DOVE_PMU_TDC0R) | DOVE_PMU_TDC0R_THERMSOFTRESET);
+ delay(1);
+ WRITE_PMUREG(sc, DOVE_PMU_TDC0R,
+ READ_PMUREG(sc, DOVE_PMU_TDC0R) & ~DOVE_PMU_TDC0R_THERMSOFTRESET);
+ cpucdc0 = READ_PMUREG(sc, DOVE_PMU_CPUCDC0R);
+ sc->sc_xpratio = DOVE_PMU_CPUCDC0R_XPRATIO(cpucdc0);
+ sc->sc_dpratio = DOVE_PMU_CPUCDC0R_DPRATIO(cpucdc0);
+
+ sc->sc_mvsocpmu_sc.sc_iot = mva->mva_iot;
+
+ if (bus_space_subregion(sc->sc_iot, sc->sc_pmch,
+ DOVE_PMU_TM_BASE, MVSOC_PMU_TM_SIZE, &sc->sc_mvsocpmu_sc.sc_tmh))
+ panic("%s: Cannot map thermal managaer registers",
+ device_xname(self));
+ sc->sc_mvsocpmu_sc.sc_uc2val = dove_tm_uc2val;
+ sc->sc_mvsocpmu_sc.sc_val2uc = dove_tm_val2uc;
+
+ mvsocpmu_attach(parent, self, aux);
+
+ WRITE_PMUREG(sc, DOVE_PMU_PMUICR, 0);
+ WRITE_PMUREG(sc, DOVE_PMU_PMUIMR, DOVE_PMU_PMUI_THERMOVERHEAT);
+
+ marvell_intr_establish(mva->mva_irq, IPL_HIGH, dove_pmu_intr, sc);
+}
+
+static int
+dove_pmu_intr(void *arg)
+{
+ struct dove_pmu_softc *sc = arg;
+ uint32_t cause, mask;
+
+ mask = READ_PMUREG(sc, DOVE_PMU_PMUIMR);
+ cause = READ_PMUREG(sc, DOVE_PMU_PMUICR);
+printf("dove pmu intr: cause 0x%x, mask 0x%x\n", cause, mask);
+ WRITE_PMUREG(sc, DOVE_PMU_PMUICR, 0);
+ cause &= mask;
+
+ if (cause & DOVE_PMU_PMUI_BATTFAULT) {
+printf(" Battery Falut\n");
+ }
+ if (cause & DOVE_PMU_PMUI_RTCALARM) {
+printf(" RTC Alarm\n");
+ }
+ if (cause & DOVE_PMU_PMUI_THERMOVERHEAT) {
+ mask |= DOVE_PMU_PMUI_THERMCOOLING;
+ if (dove_dfs_slow(sc, true) == 0)
+ mask &= ~DOVE_PMU_PMUI_THERMOVERHEAT;
+ WRITE_PMUREG(sc, DOVE_PMU_PMUIMR, mask);
+ }
+ if (cause & DOVE_PMU_PMUI_THERMCOOLING) {
+ mask |= DOVE_PMU_PMUI_THERMOVERHEAT;
+ if (dove_dfs_slow(sc, false) == 0)
+ mask &= ~DOVE_PMU_PMUI_THERMCOOLING;
+ WRITE_PMUREG(sc, DOVE_PMU_PMUIMR, mask);
+ }
+ if (cause & DOVE_PMU_PMUI_DVSDONE) {
+printf(" DVS Done\n");
+ }
+ if (cause & DOVE_PMU_PMUI_DFSDONE) {
+printf(" DFS Done\n");
+ }
+
+ return 0;
+}
+
+static int
+dove_tm_uc2val(int v)
+{
+
+ return (2281638 - v / 1000 * 10) / 7298;
+}
+
+static int
+dove_tm_val2uc(int v)
+{
+
+ return (2281638 - 7298 * v) / 10 * 1000;
+}
+
+static int
+dove_dfs_slow(struct dove_pmu_softc *sc, bool slow)
+{
+ uint32_t control, status, psw, pmucr;
+ int rv;
+uint32_t cause0, cause1, cause2;
+
+ status = READ_PMUREG(sc, DOVE_PMU_CPUSDFSSR);
+ status &= DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_MASK;
+ if ((slow && status == DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_SLOW) ||
+ (!slow && status == DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_TURBO))
+ return 0;
+
+cause0 = READ_PMUREG(sc, DOVE_PMU_PMUICR);
+ /*
+ * 1. Disable the CPU FIQ and IRQ interrupts.
+ */
+ psw = disable_interrupts(I32_bit | F32_bit);
+
+ /*
+ * 2. Program the new CPU Speed mode in the CPU Subsystem DFS Control
+ * Register.
+ */
+ control = READ_PMUREG(sc, DOVE_PMU_CPUSDFSCR);
+ if (slow) {
+ control |= DOVE_PMU_CPUSDFSCR_CPUSLOWEN;
+ control |= DOVE_PMU_CPUSDFSCR_CPUL2CR(sc->sc_dpratio);
+ } else {
+ control &= ~DOVE_PMU_CPUSDFSCR_CPUSLOWEN;
+ control |= DOVE_PMU_CPUSDFSCR_CPUL2CR(sc->sc_xpratio);
+ }
+ WRITE_PMUREG(sc, DOVE_PMU_CPUSDFSCR, control);
+
+ /*
+ * 3. Enable the <DFSDone> field in the PMU Interrupts Mask Register
+ * to wake up the CPU when the DFS procedure has been completed.
+ */
+ WRITE_PMUREG(sc, DOVE_PMU_PMUIMR,
+ READ_PMUREG(sc, DOVE_PMU_PMUIMR) | DOVE_PMU_PMUI_DFSDONE);
+
+ /*
+ * 4. Set the <MaskFIQ> and <MaskIRQ> field in the PMU Control Register.
+ * The PMU masks the main interrupt pins of the Interrupt Controller
+ * (FIQ and IRQ) from, so that they cannot be asserted to the CPU
+ * core.
+ */
+ pmucr = bus_space_read_4(sc->sc_iot, sc->sc_pmh, DOVE_PMU_PMUCR);
+cause1 = READ_PMUREG(sc, DOVE_PMU_PMUICR);
+ bus_space_write_4(sc->sc_iot, sc->sc_pmh, DOVE_PMU_PMUCR,
+ pmucr | DOVE_PMU_PMUCR_MASKFIQ | DOVE_PMU_PMUCR_MASKIRQ);
+
+ /*
+ * 5. Set the <DFSEn> field in the CPU Subsystem DFS Control Register.
+ */
+ WRITE_PMUREG(sc, DOVE_PMU_CPUSDFSCR,
+ READ_PMUREG(sc, DOVE_PMU_CPUSDFSCR) | DOVE_PMU_CPUSDFSCR_DFSEN);
+
+ /*
+ * 6. Use the WFI instruction (Wait for Interrupt), to place the CPU
+ * in Sleep mode.
+ */
+cause2 = READ_PMUREG(sc, DOVE_PMU_PMUICR);
+ __asm("wfi");
+
+ status = READ_PMUREG(sc, DOVE_PMU_CPUSDFSSR);
+ status &= DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_MASK;
+ if ((slow && status == DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_SLOW) ||
+ (!slow && status == DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_TURBO)) {
+ rv = 0;
+ printf("DFS changed to %s\n", slow ? "slow" : "turbo");
+ } else {
+ rv = 1;
+ printf("DFS failed to %s\n", slow ? "slow" : "turbo");
+ }
+
+ bus_space_write_4(sc->sc_iot, sc->sc_pmh, DOVE_PMU_PMUCR, pmucr);
+ restore_interrupts(psw);
+printf("causes: 0x%x -> 0x%x -> 0x%x\n", cause0, cause1, cause2);
+
+ return rv;
+}
+#endif
Index: src/sys/arch/arm/marvell/dovereg.h
diff -u /dev/null src/sys/arch/arm/marvell/dovereg.h:1.1
--- /dev/null Sat Jan 7 16:19:29 2017
+++ src/sys/arch/arm/marvell/dovereg.h Sat Jan 7 16:19:28 2017
@@ -0,0 +1,289 @@
+/* $NetBSD: dovereg.h,v 1.1 2017/01/07 16:19:28 kiyohara Exp $ */
+/*
+ * Copyright (c) 2016 KIYOHARA Takashi
+ * 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 _DOVEREG_H_
+#define _DOVEREG_H_
+
+#include <arm/marvell/mvsocreg.h>
+
+#define DOVE_UNITID_DDR MVSOC_UNITID_DDR
+#define DOVE_UNITID_DEVBUS MVSOC_UNITID_DEVBUS
+#define DOVE_UNITID_DB 0x2 /* Downstream Bridge reg */
+#define DOVE_UNITID_SA 0x3 /* Security Accelelerator reg */
+#define DOVE_UNITID_PEX MVSOC_UNITID_PEX
+#define DOVE_UNITID_USB 0x5
+#define DOVE_UNITID_XOR 0x6
+#define DOVE_UNITID_GBE 0x7
+#define DOVE_UNITID_PEX1 0x8
+#define DOVE_UNITID_SDIO 0x9
+#define DOVE_UNITID_SATA 0xa
+#define DOVE_UNITID_I2S 0xb
+#define DOVE_UNITID_NAND 0xc
+#define DOVE_UNITID_PMU 0xd
+#define DOVE_UNITID_AC97 0xe
+
+#define DOVE_ATTR_PEX_MEM 0xe8
+#define DOVE_ATTR_PEX_IO 0xe0
+#define DOVE_ATTR_SA 0x00
+#define DOVE_ATTR_SPI0 0xfe
+#define DOVE_ATTR_SPI1 0xfb
+#define DOVE_ATTR_BOOTROM 0xfd
+#define DOVE_ATTR_NAND 0x00
+#define DOVE_ATTR_PMU 0x00
+
+#define DOVE_IRQ_BRIDGE 0 /* Downstream Bridge intr */
+#define DOVE_IRQ_H2CPUDB 1 /* Doorbell Interrupt */
+#define DOVE_IRQ_CPU2HDB 2 /* Doorbell Interrupt */
+#define DOVE_IRQ_NF 3 /* NandFlash Interrupt */
+#define DOVE_IRQ_PDMA 4 /* Peripheral DMA Interrupt */
+#define DOVE_IRQ_SPI1 5 /* SPI1 Ready Interrupt */
+#define DOVE_IRQ_SPI0 6 /* SPI9 Ready Interrupt */
+#define DOVE_IRQ_UART0 7 /* UART0 Interrupt */
+#define DOVE_IRQ_UART1 8 /* UART1 Interrupt */
+#define DOVE_IRQ_UART2 9 /* UART2 Interrupt */
+#define DOVE_IRQ_UART3 10 /* UART3 Interrupt */
+#define DOVE_IRQ_TWSI 11 /* TWSI Interrupt */
+#define DOVE_IRQ_GPIO7_0 12 /* GPIO[7:0] Interrupt */
+#define DOVE_IRQ_GPIO15_8 13 /* GPIO[15:8] Interrupt */
+#define DOVE_IRQ_GPIO23_16 14 /* GPIO[23:16] Interrupt */
+#define DOVE_IRQ_PEX0_ERR 15 /* PCI Express0 Error */
+#define DOVE_IRQ_PEX0_INT 16 /*PCI Express0 INT [A-D] mesg*/
+#define DOVE_IRQ_PEX1_ERR 17 /* PCI Express1 Error */
+#define DOVE_IRQ_PEX1_INT 18 /*PCI Express1 INT [A-D] mesg*/
+#define DOVE_IRQ_AUDIO0_INT 19 /* Audio0 Interrupt */
+#define DOVE_IRQ_AUDIO0_ERR 20 /* Audio0 Error */
+#define DOVE_IRQ_AUDIO1_INT 21 /* Audio1 Interrupt */
+#define DOVE_IRQ_AUDIO1_ERR 22 /* Audio1 Error */
+#define DOVE_IRQ_USBBR 23 /* USB Bridge Error */
+#define DOVE_IRQ_USB0CNT 24 /* USB0 Controller Interrupt */
+#define DOVE_IRQ_USB1CNT 25 /* USB1 Controller Interrupt */
+#define DOVE_IRQ_GBERX 26 /* GbE Receive Interrupt */
+#define DOVE_IRQ_GBETX 27 /* GbE Transmit Interrupt */
+#define DOVE_IRQ_GBEMISC 28 /* GbE Miscellaneous intr */
+#define DOVE_IRQ_GBESUM 29 /* GbE Summary */
+#define DOVE_IRQ_GBEERR 30 /* GbE Error */
+#define DOVE_IRQ_SECURITYINT 31 /* Security Interrupt */
+#define DOVE_IRQ_AC97 32 /* AC97 Interrupt */
+#define DOVE_IRQ_PMU 33 /* Power Management Unit intr */
+#define DOVE_IRQ_CAM 34 /* Cafe Camera Interrupt */
+#define DOVE_IRQ_SD0 35 /* SD0 IRQ Interrupt */
+#define DOVE_IRQ_SD1 36 /* SD1 IRQ Interrupt */
+#define DOVE_IRQ_XOR0_DMA0 39 /* XOR Unit DMA0 Completion */
+#define DOVE_IRQ_XOR0_DMA1 40 /* XOR Unit DMA1 Completion */
+#define DOVE_IRQ_XOR0ERR 41 /* XOR Unit Error Interrupt */
+#define DOVE_IRQ_XOR1_DMA0 42 /* XOR Unit DMA0 Completion */
+#define DOVE_IRQ_XOR1_DMA1 43 /* XOR Unit DMA1 Completion */
+#define DOVE_IRQ_XOR1ERR 44 /* XOR Unit Error Interrupt */
+#define DOVE_IRQ_IRE_DCON 45 /* IRE OR DCON Interrupt */
+#define DOVE_IRQ_LCD1 46 /* LCD1 Interrupt */
+#define DOVE_IRQ_LCD0 47 /* LCD0 Interrupt */
+#define DOVE_IRQ_GPU 48 /* GPU Interrupt */
+#define DOVE_IRQ_VMETA 51 /*Video dec Unit Semaphore intr*/
+#define DOVE_IRQ_SSPTIMER 54 /* SSP Timer Interrupt */
+#define DOVE_IRQ_SSPINT 55 /* SSP Interrupt */
+#define DOVE_IRQ_MEMORYERR 56 /*mem Controller or L2 ECC err*/
+#define DOVE_IRQ_DWNSTRMEXCLTM 57
+#define DOVE_IRQ_UPSTRMADDERR 58
+#define DOVE_IRQ_SECURITYERR 59 /* Security Error */
+#define DOVE_IRQ_GPIO_31_24 60 /* Interrupt from GPIO[31:24] */
+#define DOVE_IRQ_HIGHGPIO 61 /* intr from High GPIO[31:0] */
+#define DOVE_IRQ_SATAINT 62 /* SATA Interrupt */
+
+
+/*
+ * Physical address of integrated peripherals
+ */
+
+#define DOVE_UNITID2PHYS(uid) ((DOVE_UNITID_ ## uid) << 16)
+
+/*
+ * SPI Registers
+ */
+#define DOVE_SPI0_BASE (MVSOC_DEVBUS_BASE + 0x0600) /* 0x10600 */
+#define DOVE_SPI1_BASE (MVSOC_DEVBUS_BASE + 0x4600) /* 0x14600 */
+
+/*
+ * UART Interface Registers
+ */
+ /* NS16550 compatible */
+#define DOVE_COM2_BASE (MVSOC_DEVBUS_BASE + 0x2200)
+#define DOVE_COM3_BASE (MVSOC_DEVBUS_BASE + 0x2300)
+
+/*
+ * Downstream Bridge Registers
+ */
+#define DOVE_DB_BASE (DOVE_UNITID2PHYS(DB))
+
+/* CPU Address Map Registers */
+#define DOVE_DB_NWINDOW 8
+#define DOVE_DB_NREMAP 4
+
+/* Main Interrupt Controller Registers */
+#define DOVE_DB_MICR 0x200 /* Main Interrupt Cause reg */
+#define DOVE_DB_MIRQIMR 0x204 /* Main IRQ Interrupt Mask */
+#define DOVE_DB_MFIQIMR 0x208 /* Main FIQ Interrupt Mask */
+#define DOVE_DB_EIMR 0x20c /* Endpoint Interrupt Mask */
+#define DOVE_DB_SMICR 0x210 /* Second Main Intr Cause reg */
+#define DOVE_DB_SMIRQIMR 0x214 /* Second Main IRQ intr Mask */
+#define DOVE_DB_SMFIQIMR 0x218 /* Second Main FIQ intr Mask */
+#define DOVE_DB_SEIMR 0x21c /* Second Endpoint intr Mask */
+#define DOVE_DB_PCIEIMR 0x220 /* PCIe0/PCIe1 intr Mask reg */
+
+
+/*
+ * Cryptographic Engine and Security Accelerator (CESA) Registers
+ */ /* 0x3d000 */
+#define DOVE_CESA_BASE (DOVE_UNITID2PHYS(SA) + 0xd000)
+
+/*
+ * USB 2.0 Interface Registers
+ */
+#define DOVE_USB0_BASE (DOVE_UNITID2PHYS(USB)) /* 0x50000 */
+#define DOVE_USB1_BASE (DOVE_UNITID2PHYS(USB) + 0x1000)
+
+/*
+ * XOR DMA Engine Registers
+ */
+#define DOVE_XORE_BASE (DOVE_UNITID2PHYS(XOR)) /* 0x60000 */
+
+/*
+ * Gigabit Ethernet Controller (GbE) Registers
+ */
+#define DOVE_GBE_BASE (DOVE_UNITID2PHYS(GBE)) /* 0x70000 */
+
+/*
+ * PCI Express (PCIe) Registers
+ */
+#define DOVE_PEX1_BASE (DOVE_UNITID2PHYS(PEX1)) /* 0x80000 */
+
+/*
+ * Camera and SDIO Registers
+ */
+#define DOVE_SDHC_SIZE 0x2000
+#define DOVE_SDHC1_BASE (DOVE_UNITID2PHYS(SDIO)) /* 0x90000 */
+#define DOVE_SDHC0_BASE (DOVE_SDHC1_BASE + DOVE_SDHC_SIZE)
+#define DOVE_CAMERA_BASE (DOVE_SDHC0_BASE + DOVE_SDHC_SIZE)
+
+/*
+ * Serial-ATA Host Controller Registers
+ */
+#define DOVE_SATAHC_BASE (DOVE_UNITID2PHYS(SATA)) /* 0xa0000 */
+
+/*
+ * Audio (I2S/S/PDIF) Interface Registers
+ */
+#define DOVE_AUDIO0_BASE (DOVE_UNITID2PHYS(I2S)) /* 0xb0000 */
+#define DOVE_AUDIO1_BASE (DOVE_UNITID2PHYS(I2S) + 0x4000)
+
+/*
+ * NAND Flash Registers
+ */
+#define DOVE_NAND_BASE (DOVE_UNITID2PHYS(NAND)) /* 0xc0000 */
+
+/*
+ * Power Management Registers
+ */
+#define DOVE_PMU_BASE (DOVE_UNITID2PHYS(PMU)) /* 0xd0000 */
+#define DOVE_MISC_BASE (DOVE_UNITID2PHYS(PMU) + 0x0200)
+#define DOVE_GPIO_BASE (DOVE_UNITID2PHYS(PMU) + 0x0400)
+#define DOVE_PMU_BASE2 (DOVE_UNITID2PHYS(PMU) + 0x8000)
+#define DOVE_RTC_BASE (DOVE_UNITID2PHYS(PMU) + 0x8500)
+#define DOVE_PMU_SRAM_BASE (DOVE_UNITID2PHYS(PMU) + 0xc000)
+#define DOVE_PMU_SRAM_SIZE 0x800
+
+#define DOVE_PMU_SIZE 0x200
+#define DOVE_PMU_CPUSDFSCR 0x00
+#define DOVE_PMU_CPUSDFSCR_DFSEN (1 << 0)
+#define DOVE_PMU_CPUSDFSCR_CPUSLOWEN (1 << 1)
+#define DOVE_PMU_CPUSDFSCR_DDRLRATIO(x) (((x) & 0x3f) << 3)
+#define DOVE_PMU_CPUSDFSCR_CPUL2CR(x) (((x) & 0x3f) << 9)
+#define DOVE_PMU_CPUSDFSCR_CHNGPLLEN (1 << 16)
+#define DOVE_PMU_CPUSDFSSR 0x04
+#define DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_MASK (1 << 1)
+#define DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_TURBO (0 << 1)
+#define DOVE_PMU_CPUSDFSSR_CPUSLOWMODESTTS_SLOW (1 << 1)
+#define DOVE_PMU_TM_BASE 0x1c
+#define DOVE_PMU_CGCR 0x38 /* Clock Gating Control reg */
+#define DOVE_PMU_CPUCDC0R 0x44 /* CPU Clock Divider Control */
+#define DOVE_PMU_CPUCDC0R_DPRATIO(x) (((x) >> 24) & 0x3f) /* DRAM */
+#define DOVE_PMU_CPUCDC0R_XPRATIO(x) (((x) >> 16) & 0x3f) /* L2C */
+#define DOVE_PMU_CPUCDC0R_BPRATIO(x) (((x) >> 8) & 0x3f) /* AXI DS */
+#define DOVE_PMU_CPUCDC0R_PPRATIO(x) (((x) >> 0) & 0x3f) /* CPU */
+#define DOVE_PMU_PMUICR 0x50 /* PMU Interruts Cause reg */
+#define DOVE_PMU_PMUIMR 0x54 /* PMU Interruts Mask reg */
+#define DOVE_PMU_PMUI_DFSDONE (1 << 0) /* DFS Done */
+#define DOVE_PMU_PMUI_DVSDONE (1 << 1) /* DVS Done */
+#define DOVE_PMU_PMUI_THERMCOOLING (1 << 3) /* Thermal Cooling */
+#define DOVE_PMU_PMUI_THERMOVERHEAT (1 << 4) /*Thermal Overheating*/
+#define DOVE_PMU_PMUI_RTCALARM (1 << 5)
+#define DOVE_PMU_PMUI_BATTFAULT (1 << 6) /* Battery Fault */
+#define DOVE_PMU_TDC0R 0x5c /* Thermal Diode Control 0 */
+#define DOVE_PMU_TDC0R_THERMSLEEP (1 << 30) /* sleep mode */
+#define DOVE_PMU_TDC0R_THERMOTFCALB (1 << 29) /* On-The-Fly calb */
+#define DOVE_PMU_TDC0R_THERMDOUBLESLOPE (1 << 28)
+#define DOVE_PMU_TDC0R_THERMAVGNUM_MASK (0x7 << 25)
+#define DOVE_PMU_TDC0R_THERMAVGNUM_NO (0x0 << 25)
+#define DOVE_PMU_TDC0R_THERMAVGNUM_2 (0x1 << 25)
+#define DOVE_PMU_TDC0R_THERMAVGNUM_4 (0x2 << 25)
+#define DOVE_PMU_TDC0R_THERMAVGNUM_8 (0x3 << 25)
+#define DOVE_PMU_TDC0R_THERMAVGNUM_16 (0x4 << 25)
+#define DOVE_PMU_TDC0R_THERMAVGNUM_32 (0x5 << 25) /* ? */
+#define DOVE_PMU_TDC0R_THERMSELCALCAPSRC_MASK (0x7 << 20)
+#define DOVE_PMU_TDC0R_THERMREFCALCOUNT_MASK (0x1ff << 11)
+#define DOVE_PMU_TDC0R_THERMREFCALCOUNT(x) ((x) << 11)
+#define DOVE_PMU_TDC0R_THERMATEST (0x3 << 10)
+#define DOVE_PMU_TDC0R_THERMSELIREF (1 << 8)
+#define DOVE_PMU_TDC0R_THERMVBEBYPASS (1 << 7)
+#define DOVE_PMU_TDC0R_THERMSELVCAL_MASK (0x3 << 5)
+#define DOVE_PMU_TDC0R_THERMSELVCAL(x) ((x) << 5)
+#define DOVE_PMU_TDC0R_THERMTCTRIP (0x7 << 2)
+#define DOVE_PMU_TDC0R_THERMSOFTRESET (1 << 1)
+#define DOVE_PMU_TDC0R_THERMPOWERDOWN (1 << 0)
+#define DOVE_PMU_TDC1R 0x60 /* Thermal Diode Control 1 */
+
+#define DOVE_PMU_PMUCR 0x00 /* PMU Control Register */
+#define DOVE_PMU_PMUCR_MASKFIQ (1 << 28)
+#define DOVE_PMU_PMUCR_MASKIRQ (1 << 24)
+#define DOVE_PMU_PMUCR_MCSLEEPREQACK (1 << 19)
+#define DOVE_PMU_PMUCR_MCSLEEPREQ (1 << 18)
+#define DOVE_PMU_PMUCR_MCHALTREQACK (1 << 17)
+#define DOVE_PMU_PMUCR_MCHALTREQ (1 << 16)
+#define DOVE_PMU_PMUCR_DDRSELFREFEN (1 << 5)
+#define DOVE_PMU_PMUCR_STDBYPWREN (1 << 4)
+#define DOVE_PMU_PMUCR_DEEPIDLEPWREN (1 << 3)
+#define DOVE_PMU_PMUCR_EBOOKMODE (1 << 2)
+#define DOVE_PMU_PMUCR_MEMRETENTIONEN (1 << 0)
+
+#define DOVE_MISC_SAMPLE_AT_RESET0 0x14
+
+/*
+ * Audio Codec'97 (AC'97) Registers
+ */
+#define DOVE_AC97_BASE (DOVE_UNITID2PHYS(AC97)) /* 0xe0000 */
+#define DOVE_SSP_BASE (DOVE_UNITID2PHYS(AC97) + 0xc000)
+
+#endif /* _DOVEREG_H_ */
Index: src/sys/arch/arm/marvell/mvsoc_sdhc.c
diff -u /dev/null src/sys/arch/arm/marvell/mvsoc_sdhc.c:1.1
--- /dev/null Sat Jan 7 16:19:29 2017
+++ src/sys/arch/arm/marvell/mvsoc_sdhc.c Sat Jan 7 16:19:28 2017
@@ -0,0 +1,107 @@
+/* $NetBSD: mvsoc_sdhc.c,v 1.1 2017/01/07 16:19:28 kiyohara Exp $ */
+/*
+ * Copyright (c) 2016 KIYOHARA Takashi
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: mvsoc_sdhc.c,v 1.1 2017/01/07 16:19:28 kiyohara Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/device.h>
+#include <sys/errno.h>
+#include <sys/malloc.h>
+#include <sys/systm.h>
+
+#include <dev/marvell/marvellreg.h>
+#include <dev/marvell/marvellvar.h>
+
+#include <dev/sdmmc/sdhcreg.h>
+#include <dev/sdmmc/sdhcvar.h>
+
+#define MVSOC_SDHC_SIZE 0x2000
+#define MVSOC_SDHC_REG_SIZE SDHC_CAPABILITIES2
+
+#define MVSOC_SDHC_MCR0 0x48
+#define MVSOC_SDHC_MCR1 0x4a
+#define MVSOC_SDHC_C1R 0x6a
+#define SDHC_C1R_CRC16_CHK_EN (1 << 2)
+
+static int mvsoc_sdhc_match(device_t, cfdata_t, void *);
+static void mvsoc_sdhc_attach(device_t, device_t, void *);
+
+CFATTACH_DECL_NEW(mvsoc_sdhc, sizeof(struct sdhc_softc),
+ mvsoc_sdhc_match, mvsoc_sdhc_attach, NULL, NULL);
+
+static int
+mvsoc_sdhc_match(device_t parent, cfdata_t match, void *aux)
+{
+ struct marvell_attach_args *mva = aux;
+
+ if (strcmp(mva->mva_name, match->cf_name) != 0)
+ return 0;
+ mva->mva_size = MVSOC_SDHC_SIZE;
+ return 1;
+}
+
+static void
+mvsoc_sdhc_attach(device_t parent, device_t self, void *aux)
+{
+ struct sdhc_softc *sc = device_private(self);
+ struct marvell_attach_args *mva = aux;
+ bus_space_handle_t ioh;
+ int error;
+
+ sc->sc_dev = self;
+ sc->sc_host = malloc(sizeof(*sc->sc_host), M_DEVBUF, M_WAITOK | M_ZERO);
+ sc->sc_dmat = mva->mva_dmat;
+ /* Must require the DMA. This sdhc can't 32bit access to SDHC_DATA. */
+ sc->sc_flags = SDHC_FLAG_USE_DMA;
+ sc->sc_flags |= SDHC_FLAG_EXTDMA_DMAEN;
+ sc->sc_flags |= SDHC_FLAG_NO_AUTO_STOP;
+ sc->sc_flags |= SDHC_FLAG_NO_BUSY_INTR;
+
+ aprint_naive("\n");
+ aprint_normal(": SDHC controller\n");
+
+ if (bus_space_subregion(mva->mva_iot, mva->mva_ioh,
+ mva->mva_offset, mva->mva_size, &ioh)) {
+ aprint_error_dev(self, "can't map registers\n");
+ return;
+ }
+
+ intr_establish(mva->mva_irq, IPL_VM, IST_LEVEL, sdhc_intr, sc);
+
+ bus_space_write_2(mva->mva_iot, ioh, MVSOC_SDHC_C1R,
+ bus_space_read_2(mva->mva_iot, ioh, MVSOC_SDHC_C1R) |
+ SDHC_C1R_CRC16_CHK_EN);
+
+ error = sdhc_host_found(sc, mva->mva_iot, ioh, MVSOC_SDHC_REG_SIZE);
+ if (error != 0) {
+ aprint_error_dev(self, "couldn't initialize host, error %d\n",
+ error);
+ return;
+ }
+}
Index: src/sys/arch/arm/marvell/mvsocpmu.c
diff -u /dev/null src/sys/arch/arm/marvell/mvsocpmu.c:1.1
--- /dev/null Sat Jan 7 16:19:29 2017
+++ src/sys/arch/arm/marvell/mvsocpmu.c Sat Jan 7 16:19:28 2017
@@ -0,0 +1,203 @@
+/* $NetBSD: mvsocpmu.c,v 1.1 2017/01/07 16:19:28 kiyohara Exp $ */
+/*
+ * Copyright (c) 2016 KIYOHARA Takashi
+ * 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.
+ */
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: mvsocpmu.c,v 1.1 2017/01/07 16:19:28 kiyohara Exp $");
+
+#include "opt_mvsoc.h"
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/errno.h>
+
+#include <dev/sysmon/sysmonvar.h>
+
+#include <arm/marvell/mvsocreg.h>
+#include <arm/marvell/mvsocvar.h>
+#include <arm/marvell/mvsocpmuvar.h>
+
+#include <dev/marvell/marvellreg.h>
+#include <dev/marvell/marvellvar.h>
+
+#define UC2UK(uc) ((uc) + 273150000)
+#define UK2UC(uk) ((uk) - 273150000)
+
+#define MVSOCPMU_TM_CSR 0x0 /* Control and Status Register */
+#define TM_CSR_TMDIS (1 << 0) /* Thermal Manager Disable */
+#define TM_CSR_THERMTEMPOUT(v) (((v) >> 1) & 0x1ff)/* Current Temperature */
+#define TM_CSR_THR(oh, c) ((((oh) & 0x1ff) << 19)|(((c) & 0x1ff) << 10))
+#define TM_CSR_COOLTHR_MASK (0x1ff << 10)
+#define TM_CSR_OVERHEATTHR_MASK (0x1ff << 19)
+#define TM_CSR_COOLTHR(v) (((v) >> 10) & 0x1ff) /* Cooling Threshold */
+#define TM_CSR_OVERHEATTHR(v) (((v) >> 19) & 0x1ff)/* Over Heat Threshold */
+#define MVSOCPMU_TM_CDR 0x4 /* Cooling Delay Register */
+#define MVSOCPMU_TM_ODR 0x8 /* Overheat Delay Register */
+
+#define MVSOCPMU_TM_READ(sc, r) \
+ bus_space_read_4((sc)->sc_iot, (sc)->sc_tmh, _TM_REG(r))
+#define MVSOCPMU_TM_WRITE(sc, r, v) \
+ bus_space_write_4((sc)->sc_iot, (sc)->sc_tmh, _TM_REG(r), (v))
+#define _TM_REG(r) MVSOCPMU_TM_ ## r
+
+static void mvsocpmu_tm_init(struct mvsocpmu_softc *);
+static void mvsocpmu_tm_refresh(struct sysmon_envsys *, envsys_data_t *);
+static void mvsocpmu_tm_get_limits(struct sysmon_envsys *, envsys_data_t *,
+ sysmon_envsys_lim_t *, uint32_t *);
+static void mvsocpmu_tm_set_limits(struct sysmon_envsys *, envsys_data_t *,
+ sysmon_envsys_lim_t *, uint32_t *);
+
+/* ARGSUSED */
+int
+mvsocpmu_match(device_t parent, struct cfdata *match, void *aux)
+{
+ struct marvell_attach_args *mva = aux;
+
+ if (strcmp(mva->mva_name, match->cf_name) != 0)
+ return 0;
+ return 1;
+}
+
+/* ARGSUSED */
+void
+mvsocpmu_attach(device_t parent, device_t self, void *aux)
+{
+ struct mvsocpmu_softc *sc = device_private(self);
+
+ aprint_naive("\n");
+ aprint_normal(": Marvell SoC Power Management Unit\n");
+
+ sc->sc_dev = self;
+
+ if (sc->sc_val2uc != NULL && sc->sc_uc2val != NULL)
+ mvsocpmu_tm_init(sc);
+}
+
+static void
+mvsocpmu_tm_init(struct mvsocpmu_softc *sc)
+{
+ uint32_t csr;
+
+ /* set default thresholds */
+ csr = MVSOCPMU_TM_READ(sc, CSR);
+ sc->sc_deflims.sel_warnmin = UC2UK(sc->sc_val2uc(TM_CSR_COOLTHR(csr)));
+ sc->sc_deflims.sel_warnmax =
+ UC2UK(sc->sc_val2uc(TM_CSR_OVERHEATTHR(csr)));
+ sc->sc_defprops = PROP_WARNMIN | PROP_WARNMAX;
+
+ sc->sc_sme = sysmon_envsys_create();
+ /* Initialize sensor data. */
+ sc->sc_sensor.units = ENVSYS_STEMP;
+ sc->sc_sensor.state = ENVSYS_SINVALID;
+ sc->sc_sensor.flags = ENVSYS_FMONLIMITS;
+ strlcpy(sc->sc_sensor.desc, device_xname(sc->sc_dev),
+ sizeof(sc->sc_sensor.desc));
+ if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor)) {
+ aprint_error_dev(sc->sc_dev, "Unable to attach sysmon\n");
+ sysmon_envsys_destroy(sc->sc_sme);
+ return;
+ }
+
+ /* Hook into system monitor. */
+ sc->sc_sme->sme_name = device_xname(sc->sc_dev);
+ sc->sc_sme->sme_cookie = sc;
+ sc->sc_sme->sme_refresh = mvsocpmu_tm_refresh;
+ sc->sc_sme->sme_get_limits = mvsocpmu_tm_get_limits;
+ sc->sc_sme->sme_set_limits = mvsocpmu_tm_set_limits;
+ if (sysmon_envsys_register(sc->sc_sme)) {
+ aprint_error_dev(sc->sc_dev,
+ "Unable to register with sysmon\n");
+ sysmon_envsys_destroy(sc->sc_sme);
+ }
+}
+
+static void
+mvsocpmu_tm_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
+{
+ struct mvsocpmu_softc *sc = sme->sme_cookie;
+ uint32_t csr, uc, uk;
+
+ csr = MVSOCPMU_TM_READ(sc, CSR);
+ if (csr & TM_CSR_TMDIS) {
+ sc->sc_sensor.state = ENVSYS_SINVALID;
+ return;
+ }
+ uc = sc->sc_val2uc(TM_CSR_THERMTEMPOUT(csr)); /* uC */
+ uk = UC2UK(uc); /* convert to uKelvin */
+ sc->sc_sensor.value_cur = uk;
+ sc->sc_sensor.state = ENVSYS_SVALID;
+}
+
+static void
+mvsocpmu_tm_get_limits(struct sysmon_envsys *sme, envsys_data_t *edata,
+ sysmon_envsys_lim_t *limits, uint32_t *props)
+{
+ struct mvsocpmu_softc *sc = sme->sme_cookie;
+ uint32_t csr;
+
+ csr = MVSOCPMU_TM_READ(sc, CSR);
+ limits->sel_warnmin = UC2UK(sc->sc_val2uc(TM_CSR_COOLTHR(csr)));
+ limits->sel_warnmax = UC2UK(sc->sc_val2uc(TM_CSR_OVERHEATTHR(csr)));
+ *props = (PROP_WARNMIN | PROP_WARNMAX | PROP_DRIVER_LIMITS);
+}
+
+static void
+mvsocpmu_tm_set_limits(struct sysmon_envsys *sme, envsys_data_t *edata,
+ sysmon_envsys_lim_t *limits, uint32_t *props)
+{
+ struct mvsocpmu_softc *sc = sme->sme_cookie;
+ uint32_t csr, mask;
+ int oh, c;
+
+ if (limits == NULL) {
+ limits = &sc->sc_deflims;
+ props = &sc->sc_defprops;
+ }
+ oh = c = 0;
+ mask = 0x0;
+ if (*props & PROP_WARNMIN) {
+ c = sc->sc_uc2val(UK2UC(limits->sel_warnmin));
+ mask |= TM_CSR_COOLTHR_MASK;
+ }
+ if (*props & PROP_WARNMAX) {
+ oh = sc->sc_uc2val(UK2UC(limits->sel_warnmax));
+ mask |= TM_CSR_OVERHEATTHR_MASK;
+ }
+ if (mask != 0) {
+ csr = MVSOCPMU_TM_READ(sc, CSR);
+ csr &= ~mask;
+ MVSOCPMU_TM_WRITE(sc, CSR, csr | TM_CSR_THR(oh, c));
+ }
+
+ /*
+ * If at least one limit is set that we can handle, and no
+ * limits are set that we cannot handle, tell sysmon that
+ * the driver will take care of monitoring the limits!
+ */
+ if (*props & (PROP_WARNMIN | PROP_WARNMAX))
+ *props |= PROP_DRIVER_LIMITS;
+ else
+ *props &= ~PROP_DRIVER_LIMITS;
+}
Index: src/sys/arch/arm/marvell/mvsocpmuvar.h
diff -u /dev/null src/sys/arch/arm/marvell/mvsocpmuvar.h:1.1
--- /dev/null Sat Jan 7 16:19:29 2017
+++ src/sys/arch/arm/marvell/mvsocpmuvar.h Sat Jan 7 16:19:28 2017
@@ -0,0 +1,48 @@
+/* $NetBSD: mvsocpmuvar.h,v 1.1 2017/01/07 16:19:28 kiyohara Exp $ */
+/*
+ * Copyright (c) 2016 KIYOHARA Takashi
+ * 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.
+ */
+
+#include <dev/sysmon/sysmonvar.h>
+
+struct mvsocpmu_softc {
+ device_t sc_dev;
+
+ bus_space_tag_t sc_iot;
+
+ /* Thermal Manager stuff */
+ bus_space_handle_t sc_tmh;
+#define MVSOC_PMU_TM_SIZE (sizeof(uint32_t) * 3)
+ int (*sc_uc2val)(int);
+ int (*sc_val2uc)(int);
+
+ struct sysmon_envsys *sc_sme;
+ envsys_data_t sc_sensor;
+ sysmon_envsys_lim_t sc_deflims;
+ uint32_t sc_defprops;
+};
+
+int mvsocpmu_match(device_t, struct cfdata *, void *);
+void mvsocpmu_attach(device_t, device_t, void *);