Module Name: src
Committed By: kiyohara
Date: Sat Mar 15 11:48:38 UTC 2014
Modified Files:
src/sys/arch/arm/marvell: mvsoc.c
Log Message:
Support Armada 370.
To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/marvell/mvsoc.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/marvell/mvsoc.c
diff -u src/sys/arch/arm/marvell/mvsoc.c:1.17 src/sys/arch/arm/marvell/mvsoc.c:1.18
--- src/sys/arch/arm/marvell/mvsoc.c:1.17 Mon Feb 17 05:00:38 2014
+++ src/sys/arch/arm/marvell/mvsoc.c Sat Mar 15 11:48:37 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: mvsoc.c,v 1.17 2014/02/17 05:00:38 kiyohara Exp $ */
+/* $NetBSD: mvsoc.c,v 1.18 2014/03/15 11:48:37 kiyohara Exp $ */
/*
* Copyright (c) 2007, 2008, 2013, 2014 KIYOHARA Takashi
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsoc.c,v 1.17 2014/02/17 05:00:38 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsoc.c,v 1.18 2014/03/15 11:48:37 kiyohara Exp $");
#include "opt_cputypes.h"
#include "opt_mvsoc.h"
@@ -271,10 +271,6 @@ static struct {
#endif
};
-#if defined(ARMADAXP)
-#undef ARMADAXP
-#define ARMADAXP(m) MARVELL_ARMADAXP_ ## m
-#endif
#if defined(ORION)
#define ORION_1(m) MARVELL_ORION_1_ ## m
#define ORION_2(m) MARVELL_ORION_2_ ## m
@@ -287,6 +283,11 @@ static struct {
#undef MV78XX0
#define MV78XX0(m) MARVELL_MV78XX0_ ## m
#endif
+#if defined(ARMADAXP)
+#undef ARMADAXP
+#define ARMADAXP(m) MARVELL_ARMADAXP_ ## m
+#define ARMADA370(m) MARVELL_ARMADA370_ ## m
+#endif
static struct {
uint16_t model;
uint8_t rev;
@@ -348,9 +349,102 @@ static struct {
{ ARMADAXP(MV78260), 1, "MV78260", "A0", "Armada XP" },
{ ARMADAXP(MV78460), 1, "MV78460", "A0", "Armada XP" },
{ ARMADAXP(MV78460), 2, "MV78460", "B0", "Armada XP" },
+
+ { ARMADA370(MV6707), 0, "MV6707", "A0", "Armada 370" },
+ { ARMADA370(MV6707), 1, "MV6707", "A1", "Armada 370" },
+ { ARMADA370(MV6710), 0, "MV6710", "A0", "Armada 370" },
+ { ARMADA370(MV6710), 1, "MV6710", "A1", "Armada 370" },
+ { ARMADA370(MV6W11), 0, "MV6W11", "A0", "Armada 370" },
+ { ARMADA370(MV6W11), 1, "MV6W11", "A1", "Armada 370" },
+#endif
+};
+
+enum marvell_tags ddr_tags[] = {
+ MARVELL_TAG_SDRAM_CS0,
+ MARVELL_TAG_SDRAM_CS1,
+ MARVELL_TAG_SDRAM_CS2,
+ MARVELL_TAG_SDRAM_CS3,
+
+ MARVELL_TAG_UNDEFINED
+};
+enum marvell_tags ddr3_tags[] = {
+ MARVELL_TAG_DDR3_CS0,
+ MARVELL_TAG_DDR3_CS1,
+ MARVELL_TAG_DDR3_CS2,
+ MARVELL_TAG_DDR3_CS3,
+
+ MARVELL_TAG_UNDEFINED
+};
+static struct {
+ uint16_t model;
+ uint8_t rev;
+ enum marvell_tags *tags;
+} tagstbl[] = {
+#if defined(ORION)
+ { ORION_1(88F1181), 0, ddr_tags },
+ { ORION_1(88F5082), 2, ddr_tags },
+ { ORION_1(88F5180N), 3, ddr_tags },
+ { ORION_1(88F5181), 0, ddr_tags },
+ { ORION_1(88F5181), 1, ddr_tags },
+ { ORION_1(88F5181), 2, ddr_tags },
+ { ORION_1(88F5181), 3, ddr_tags },
+ { ORION_1(88F5181), 8, ddr_tags },
+ { ORION_1(88F5181), 9, ddr_tags },
+ { ORION_1(88F5182), 0, ddr_tags },
+ { ORION_1(88F5182), 1, ddr_tags },
+ { ORION_1(88F5182), 2, ddr_tags },
+ { ORION_1(88F6082), 0, ddr_tags },
+ { ORION_1(88F6082), 1, ddr_tags },
+ { ORION_1(88F6183), 0, ddr_tags },
+ { ORION_1(88F6183), 1, ddr_tags },
+ { ORION_1(88W8660), 0, ddr_tags },
+ { ORION_1(88W8660), 1, ddr_tags },
+
+ { ORION_2(88F1281), 0, ddr_tags },
+ { ORION_2(88F5281), 0, ddr_tags },
+ { ORION_2(88F5281), 1, ddr_tags },
+ { ORION_2(88F5281), 2, ddr_tags },
+ { ORION_2(88F5281), 3, ddr_tags },
+ { ORION_2(88F5281), 4, ddr_tags },
+#endif
+
+#if defined(KIRKWOOD)
+ { KIRKWOOD(88F6180), 2, ddr_tags },
+ { KIRKWOOD(88F6180), 3, ddr_tags },
+ { KIRKWOOD(88F6192), 0, ddr_tags },
+ { KIRKWOOD(88F6192), 2, ddr_tags },
+ { KIRKWOOD(88F6192), 3, ddr_tags },
+ { KIRKWOOD(88F6281), 0, ddr_tags },
+ { KIRKWOOD(88F6281), 2, ddr_tags },
+ { KIRKWOOD(88F6281), 3, ddr_tags },
+ { KIRKWOOD(88F6282), 0, ddr_tags },
+ { KIRKWOOD(88F6282), 1, ddr_tags },
+#endif
+
+#if defined(MV78XX0)
+ { MV78XX0(MV78100), 1, ddr_tags },
+ { MV78XX0(MV78100), 2, ddr_tags },
+ { MV78XX0(MV78200), 1, ddr_tags },
+#endif
+
+#if defined(ARMADAXP)
+ { ARMADAXP(MV78130), 1, ddr3_tags },
+ { ARMADAXP(MV78160), 1, ddr3_tags },
+ { ARMADAXP(MV78230), 1, ddr3_tags },
+ { ARMADAXP(MV78260), 1, ddr3_tags },
+ { ARMADAXP(MV78460), 1, ddr3_tags },
+ { ARMADAXP(MV78460), 2, ddr3_tags },
+
+ { ARMADA370(MV6707), 0, ddr3_tags },
+ { ARMADA370(MV6707), 1, ddr3_tags },
+ { ARMADA370(MV6710), 0, ddr3_tags },
+ { ARMADA370(MV6710), 1, ddr3_tags },
+ { ARMADA370(MV6W11), 0, ddr3_tags },
+ { ARMADA370(MV6W11), 1, ddr3_tags },
#endif
};
+
#define OFFSET_DEFAULT MVA_OFFSET_DEFAULT
#define IRQ_DEFAULT MVA_IRQ_DEFAULT
static const struct mvsoc_periph {
@@ -698,6 +792,25 @@ static const struct mvsoc_periph {
{ ARMADAXP(MV78460), "mvgbec", 3, ARMADAXP_GBE3_BASE,IRQ_DEFAULT },
{ ARMADAXP(MV78460), "mvcesa", 0, ARMADAXP_CESA0_BASE,ARMADAXP_IRQ_CESA0 },
{ ARMADAXP(MV78460), "mvcesa", 1, ARMADAXP_CESA1_BASE,ARMADAXP_IRQ_CESA1 },
+
+ { ARMADA370(MV6710), "mvsoctmr",0,MVSOC_TMR_BASE, ARMADAXP_IRQ_TIMER0 },
+ { ARMADA370(MV6710), "com", 0, MVSOC_COM0_BASE, ARMADAXP_IRQ_UART0 },
+ { ARMADA370(MV6710), "com", 1, MVSOC_COM1_BASE, ARMADAXP_IRQ_UART1 },
+ { ARMADA370(MV6710), "mvsocrtc",0,ARMADAXP_RTC_BASE,ARMADAXP_IRQ_RTC },
+ { ARMADA370(MV6710), "gttwsi", 0, MVSOC_TWSI_BASE, ARMADAXP_IRQ_TWSI0 },
+ { ARMADA370(MV6710), "gttwsi", 1, ARMADAXP_TWSI1_BASE,ARMADAXP_IRQ_TWSI1 },
+ { ARMADA370(MV6710), "gtidmac",0, ARMADAXP_XORE0_BASE,IRQ_DEFAULT },
+ { ARMADA370(MV6710), "ehci", 0, ARMADAXP_USB0_BASE,ARMADAXP_IRQ_USB0 },
+ { ARMADA370(MV6710), "ehci", 1, ARMADAXP_USB1_BASE,ARMADAXP_IRQ_USB1 },
+ { ARMADA370(MV6710), "mvpex", 0, MVSOC_PEX_BASE, ARMADAXP_IRQ_PEX00 },
+ { ARMADA370(MV6710), "mvpex", 1, ARMADAXP_PEX01_BASE,ARMADAXP_IRQ_PEX01 },
+ { ARMADA370(MV6710), "mvsata", 0, ARMADAXP_SATAHC_BASE,ARMADAXP_IRQ_SATA0 },
+ { ARMADA370(MV6710), "mvspi", 0, ARMADAXP_SPI_BASE,ARMADAXP_IRQ_SPI },
+ { ARMADA370(MV6710), "mvspi", 1, ARMADAXP_SPI_BASE,ARMADAXP_IRQ_SPI },
+ { ARMADA370(MV6710), "mvsdio", 0, ARMADAXP_SDIO_BASE,ARMADAXP_IRQ_SDIO },
+ { ARMADA370(MV6710), "mvgbec", 0, ARMADAXP_GBE0_BASE,IRQ_DEFAULT },
+ { ARMADA370(MV6710), "mvgbec", 1, ARMADAXP_GBE1_BASE,IRQ_DEFAULT },
+ { ARMADA370(MV6710), "mvcesa", 0, ARMADAXP_CESA0_BASE,ARMADAXP_IRQ_CESA0 },
#endif
};
@@ -719,6 +832,7 @@ mvsoc_attach(device_t parent, device_t s
{
struct mvsoc_softc *sc = device_private(self);
struct marvell_attach_args mva;
+ enum marvell_tags *tags;
uint16_t model;
uint8_t rev;
int i;
@@ -756,6 +870,13 @@ mvsoc_attach(device_t parent, device_t s
mvsoc_intr_init();
+ for (i = 0; i < __arraycount(tagstbl); i++)
+ if (tagstbl[i].model == model && tagstbl[i].rev == rev)
+ break;
+ if (i >= __arraycount(tagstbl))
+ panic("unknown SoC: model 0x%04x, rev 0x%02x", model, rev);
+ tags = tagstbl[i].tags;
+
for (i = 0; i < __arraycount(mvsoc_periphs); i++) {
if (mvsoc_periphs[i].model != model)
continue;
@@ -771,6 +892,7 @@ mvsoc_attach(device_t parent, device_t s
mva.mva_size = 0;
mva.mva_dmat = sc->sc_dmat;
mva.mva_irq = mvsoc_periphs[i].irq;
+ mva.mva_tags = tags;
/* Skip clock disabled devices */
if (mvsoc_clkgating != NULL && mvsoc_clkgating(&mva)) {