Module Name:    src
Committed By:   kiyohara
Date:           Sat Mar 15 13:33:48 UTC 2014

Modified Files:
        src/sys/dev/marvell: ehci_mv.c gtidmac.c gtidmacvar.h if_mvgbe.c
            mvpex.c mvpexvar.h mvsata_mv.c mvsdio.c

Log Message:
Support Armada 370 and DDR3 tags.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/marvell/ehci_mv.c \
    src/sys/dev/marvell/mvsdio.c
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/marvell/gtidmac.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/marvell/gtidmacvar.h
cvs rdiff -u -r1.37 -r1.38 src/sys/dev/marvell/if_mvgbe.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/marvell/mvpex.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/marvell/mvpexvar.h
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/marvell/mvsata_mv.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/dev/marvell/ehci_mv.c
diff -u src/sys/dev/marvell/ehci_mv.c:1.4 src/sys/dev/marvell/ehci_mv.c:1.5
--- src/sys/dev/marvell/ehci_mv.c:1.4	Sun Sep  8 04:10:23 2013
+++ src/sys/dev/marvell/ehci_mv.c	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehci_mv.c,v 1.4 2013/09/08 04:10:23 kiyohara Exp $	*/
+/*	$NetBSD: ehci_mv.c,v 1.5 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2008 KIYOHARA Takashi
  * All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci_mv.c,v 1.4 2013/09/08 04:10:23 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci_mv.c,v 1.5 2014/03/15 13:33:48 kiyohara Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -164,8 +164,8 @@ struct mvusb_softc {
 static int mvusb_match(device_t, cfdata_t, void *);
 static void mvusb_attach(device_t, device_t, void *);
 
-static void mvusb_init(struct mvusb_softc *);
-static void mvusb_wininit(struct mvusb_softc *);
+static void mvusb_init(struct mvusb_softc *, enum marvell_tags *);
+static void mvusb_wininit(struct mvusb_softc *, enum marvell_tags *);
 
 static void mvusb_vendor_init(struct ehci_softc *);
 static int mvusb_vendor_port_status(struct ehci_softc *, uint32_t, int);
@@ -216,7 +216,7 @@ mvusb_attach(device_t parent, device_t s
 		aprint_error_dev(self, "can't map registers\n");
 		return;
 	}
-	mvusb_init(sc);
+	mvusb_init(sc, mva->mva_tags);
 
 	/* Map I/O registers for ehci */
 	sc->sc.sc_size = MARVELL_USB_EHCI_SIZE;
@@ -254,7 +254,7 @@ mvusb_attach(device_t parent, device_t s
 }
 
 static void
-mvusb_init(struct mvusb_softc *sc)
+mvusb_init(struct mvusb_softc *sc, enum marvell_tags *tags)
 {
 	uint32_t reg;
 	int opr_offs;
@@ -357,24 +357,16 @@ mvusb_init(struct mvusb_softc *sc)
 		    reg);
 	}
 
-	mvusb_wininit(sc);
+	mvusb_wininit(sc, tags);
 }
 
 static void
-mvusb_wininit(struct mvusb_softc *sc)
+mvusb_wininit(struct mvusb_softc *sc, enum marvell_tags *tags)
 {
 	device_t pdev = device_parent(sc->sc.sc_dev);
 	uint64_t base;
 	uint32_t size;
 	int window, target, attr, rv, i;
-	static int tags[] = {
-		MARVELL_TAG_SDRAM_CS0,
-		MARVELL_TAG_SDRAM_CS1,
-		MARVELL_TAG_SDRAM_CS2,
-		MARVELL_TAG_SDRAM_CS3,
-
-		MARVELL_TAG_UNDEFINED,
-	};
 
 	for (window = 0, i = 0;
 	    tags[i] != MARVELL_TAG_UNDEFINED && window < MARVELL_USB_NWINDOW;
Index: src/sys/dev/marvell/mvsdio.c
diff -u src/sys/dev/marvell/mvsdio.c:1.4 src/sys/dev/marvell/mvsdio.c:1.5
--- src/sys/dev/marvell/mvsdio.c:1.4	Sun Feb 13 06:43:51 2011
+++ src/sys/dev/marvell/mvsdio.c	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvsdio.c,v 1.4 2011/02/13 06:43:51 nonaka Exp $	*/
+/*	$NetBSD: mvsdio.c,v 1.5 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2010 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsdio.c,v 1.4 2011/02/13 06:43:51 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsdio.c,v 1.5 2014/03/15 13:33:48 kiyohara Exp $");
 
 #include "opt_mvsdio.h"
 
@@ -92,7 +92,7 @@ static void mvsdio_exec_command(sdmmc_ch
 static void mvsdio_card_enable_intr(sdmmc_chipset_handle_t, int);
 static void mvsdio_card_intr_ack(sdmmc_chipset_handle_t);
 
-static void mvsdio_wininit(struct mvsdio_softc *);
+static void mvsdio_wininit(struct mvsdio_softc *, enum marvell_tags *);
 
 static struct sdmmc_chip_functions mvsdio_chip_functions = {
 	/* host controller reset */
@@ -178,7 +178,7 @@ mvsdio_attach(device_t parent, device_t 
 
 	marvell_intr_establish(mva->mva_irq, IPL_SDMMC, mvsdio_intr, sc);
 
-	mvsdio_wininit(sc);
+	mvsdio_wininit(sc, mva->mva_tags);
 
 #if BYTE_ORDER == LITTLE_ENDIAN
 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, MVSDIO_HC, HC_BIGENDIAN);
@@ -683,19 +683,11 @@ mvsdio_card_intr_ack(sdmmc_chipset_handl
 
 
 static void
-mvsdio_wininit(struct mvsdio_softc *sc)
+mvsdio_wininit(struct mvsdio_softc *sc, enum marvell_tags *tags)
 {
 	uint64_t base;
 	uint32_t size;
 	int window, target, attr, rv, i;
-	static int tags[] = {
-		MARVELL_TAG_SDRAM_CS0,
-		MARVELL_TAG_SDRAM_CS1,
-		MARVELL_TAG_SDRAM_CS2,
-		MARVELL_TAG_SDRAM_CS3,
-
-		MARVELL_TAG_UNDEFINED,
-	};
 
 	for (window = 0, i = 0;
 	    tags[i] != MARVELL_TAG_UNDEFINED && window < MVSDIO_NWINDOW; i++) {

Index: src/sys/dev/marvell/gtidmac.c
diff -u src/sys/dev/marvell/gtidmac.c:1.10 src/sys/dev/marvell/gtidmac.c:1.11
--- src/sys/dev/marvell/gtidmac.c:1.10	Sat Sep 28 05:39:06 2013
+++ src/sys/dev/marvell/gtidmac.c	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: gtidmac.c,v 1.10 2013/09/28 05:39:06 kiyohara Exp $	*/
+/*	$NetBSD: gtidmac.c,v 1.11 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2008, 2012 KIYOHARA Takashi
  * All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gtidmac.c,v 1.10 2013/09/28 05:39:06 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gtidmac.c,v 1.11 2014/03/15 13:33:48 kiyohara Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -162,8 +162,8 @@ static __inline void gtidmac_dmmap_unloa
 static uint32_t gtidmac_finish(void *, int, int);
 static uint32_t mvxore_finish(void *, int, int);
 
-static void gtidmac_wininit(struct gtidmac_softc *);
-static void mvxore_wininit(struct gtidmac_softc *);
+static void gtidmac_wininit(struct gtidmac_softc *, enum marvell_tags *);
+static void mvxore_wininit(struct gtidmac_softc *, enum marvell_tags *);
 
 static int gtidmac_buffer_setup(struct gtidmac_softc *);
 static int mvxore_buffer_setup(struct gtidmac_softc *);
@@ -325,6 +325,9 @@ static struct {
 	{ MARVELL_ARMADAXP_MV78460,	0, -1, 2, 94 },
 };
 
+struct gtidmac_winacctbl *gtidmac_winacctbl;
+struct gtidmac_winacctbl *mvxore_winacctbl;
+
 CFATTACH_DECL_NEW(gtidmac_gt, sizeof(struct gtidmac_softc),
     gtidmac_match, gtidmac_attach, NULL, NULL);
 CFATTACH_DECL_NEW(gtidmac_mbus, sizeof(struct gtidmac_softc),
@@ -460,7 +463,7 @@ gtidmac_attach(device_t parent, device_t
 			goto fail4;
 
 		if (mva->mva_model != MARVELL_DISCOVERY)
-			gtidmac_wininit(sc);
+			gtidmac_wininit(sc, mva->mva_tags);
 
 		/* Setup interrupt */
 		for (i = 0; i < GTIDMAC_NINTRRUPT; i++) {
@@ -497,7 +500,7 @@ gtidmac_attach(device_t parent, device_t
 			    (i & 0x2) ? mvxore_port1_intr : mvxore_port0_intr,
 			    sc);
 
-		mvxore_wininit(sc);
+		mvxore_wininit(sc, mva->mva_tags);
 
 		/* Register us with dmover. */
 		sc->sc_dmb_xore.dmb_name = device_xname(sc->sc_dev);
@@ -1477,36 +1480,18 @@ mvxore_finish(void *tag, int chan, int e
 }
 
 static void
-gtidmac_wininit(struct gtidmac_softc *sc)
+gtidmac_wininit(struct gtidmac_softc *sc, enum marvell_tags *tags)
 {
 	device_t pdev = device_parent(sc->sc_dev);
 	uint64_t base;
-	uint32_t size, cxap, en;
-	int window, target, attr, rv, i;
-	struct {
-		int tag;
-		int winacc;
-	} targets[] = {
-		{ MARVELL_TAG_SDRAM_CS0,	GTIDMAC_CXAPR_WINACC_FA },
-		{ MARVELL_TAG_SDRAM_CS1,	GTIDMAC_CXAPR_WINACC_FA },
-		{ MARVELL_TAG_SDRAM_CS2,	GTIDMAC_CXAPR_WINACC_FA },
-		{ MARVELL_TAG_SDRAM_CS3,	GTIDMAC_CXAPR_WINACC_FA },
-
-		/* Also can set following targets. */
-		/*   Devices       = 0x1(ORION_TARGETID_DEVICE_*) */
-		/*   PCI           = 0x3(ORION_TARGETID_PCI0_*) */
-		/*   PCI Express   = 0x4(ORION_TARGETID_PEX?_*) */
-		/*   Tunit SRAM(?) = 0x5(???) */
-
-		{ MARVELL_TAG_UNDEFINED,	GTIDMAC_CXAPR_WINACC_NOAA }
-	};
+	uint32_t size, cxap, en, winacc;
+	int window, target, attr, rv, i, j;
 
 	en = 0xff;
 	cxap = 0;
 	for (window = 0, i = 0;
-	    targets[i].tag != MARVELL_TAG_UNDEFINED && window < GTIDMAC_NWINDOW;
-	    i++) {
-		rv = marvell_winparams_by_tag(pdev, targets[i].tag,
+	    tags[i] != MARVELL_TAG_UNDEFINED && window < GTIDMAC_NWINDOW; i++) {
+		rv = marvell_winparams_by_tag(pdev, tags[i],
 		    &target, &attr, &base, &size);
 		if (rv != 0 || size == 0)
 			continue;
@@ -1527,7 +1512,30 @@ gtidmac_wininit(struct gtidmac_softc *sc
 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, GTIDMAC_SRX(window),
 		    GTIDMAC_SRX_SIZE(size));
 		en &= ~GTIDMAC_BAER_EN(window);
-		cxap |= GTIDMAC_CXAPR_WINACC(window, targets[i].winacc);
+
+		winacc = GTIDMAC_CXAPR_WINACC_FA;
+		if (gtidmac_winacctbl != NULL)
+			for (j = 0;
+			    gtidmac_winacctbl[j].tag != MARVELL_TAG_UNDEFINED;
+			    j++) {
+				if (gtidmac_winacctbl[j].tag != tags[i])
+					continue;
+
+				switch (gtidmac_winacctbl[j].winacc) {
+				case GTIDMAC_WINACC_NOACCESSALLOWED:
+					winacc = GTIDMAC_CXAPR_WINACC_NOAA;
+					break;
+				case GTIDMAC_WINACC_READONLY:
+					winacc = GTIDMAC_CXAPR_WINACC_RO;
+					break;
+				case GTIDMAC_WINACC_FULLACCESS:
+				default: /* XXXX: default is full access */
+					break;
+				}
+				break;
+			}
+		cxap |= GTIDMAC_CXAPR_WINACC(window, winacc);
+
 		window++;
 	}
 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, GTIDMAC_BAER, en);
@@ -1538,29 +1546,17 @@ gtidmac_wininit(struct gtidmac_softc *sc
 }
 
 static void
-mvxore_wininit(struct gtidmac_softc *sc)
+mvxore_wininit(struct gtidmac_softc *sc, enum marvell_tags *tags)
 {
 	device_t pdev = device_parent(sc->sc_dev);
 	uint64_t base;
-	uint32_t target, attr, size, xexwc;
-	int window, rv, i, p;
-	struct {
-		int tag;
-		int winacc;
-	} targets[] = {
-		{ MARVELL_TAG_SDRAM_CS0,	MVXORE_XEXWCR_WINACC_FA },
-		{ MARVELL_TAG_SDRAM_CS1,	MVXORE_XEXWCR_WINACC_FA },
-		{ MARVELL_TAG_SDRAM_CS2,	MVXORE_XEXWCR_WINACC_FA },
-		{ MARVELL_TAG_SDRAM_CS3,	MVXORE_XEXWCR_WINACC_FA },
-
-		{ MARVELL_TAG_UNDEFINED,	MVXORE_XEXWCR_WINACC_NOAA }
-	};
+	uint32_t target, attr, size, xexwc, winacc;
+	int window, rv, i, j, p;
 
 	xexwc = 0;
 	for (window = 0, i = 0;
-	    targets[i].tag != MARVELL_TAG_UNDEFINED && window < MVXORE_NWINDOW;
-	    i++) {
-		rv = marvell_winparams_by_tag(pdev, targets[i].tag,
+	    tags[i] != MARVELL_TAG_UNDEFINED && window < MVXORE_NWINDOW; i++) {
+		rv = marvell_winparams_by_tag(pdev, tags[i],
 		    &target, &attr, &base, &size);
 		if (rv != 0 || size == 0)
 			continue;
@@ -1587,8 +1583,30 @@ mvxore_wininit(struct gtidmac_softc *sc)
 			    MVXORE_XESMRX(sc, p, window),
 			    MVXORE_XESMRX_SIZE(size));
 		}
+
+		winacc = MVXORE_XEXWCR_WINACC_FA;
+		if (mvxore_winacctbl != NULL)
+			for (j = 0;
+			    mvxore_winacctbl[j].tag != MARVELL_TAG_UNDEFINED;
+			    j++) {
+				if (gtidmac_winacctbl[j].tag != tags[i])
+					continue;
+
+				switch (gtidmac_winacctbl[j].winacc) {
+				case GTIDMAC_WINACC_NOACCESSALLOWED:
+					winacc = MVXORE_XEXWCR_WINACC_NOAA;
+					break;
+				case GTIDMAC_WINACC_READONLY:
+					winacc = MVXORE_XEXWCR_WINACC_RO;
+					break;
+				case GTIDMAC_WINACC_FULLACCESS:
+				default: /* XXXX: default is full access */
+					break;
+				}
+				break;
+			}
 		xexwc |= (MVXORE_XEXWCR_WINEN(window) |
-		    MVXORE_XEXWCR_WINACC(window, targets[i].winacc));
+		    MVXORE_XEXWCR_WINACC(window, winacc));
 		window++;
 	}
 

Index: src/sys/dev/marvell/gtidmacvar.h
diff -u src/sys/dev/marvell/gtidmacvar.h:1.1 src/sys/dev/marvell/gtidmacvar.h:1.2
--- src/sys/dev/marvell/gtidmacvar.h:1.1	Wed Apr 28 13:51:56 2010
+++ src/sys/dev/marvell/gtidmacvar.h	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: gtidmacvar.h,v 1.1 2010/04/28 13:51:56 kiyohara Exp $	*/
+/*	$NetBSD: gtidmacvar.h,v 1.2 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2008, 2009 KIYOHARA Takashi
  * All rights reserved.
@@ -28,6 +28,26 @@
 #ifndef _GTIDMACVAR_H_
 #define _GTIDMACVAR_H_
 
+#include <dev/marvell/marvellvar.h>
+
+/*
+ * We get access control of IDMAC. 
+ * Please set to variable 'gtidmac_winacctbl' your winacctbl-list by
+ * device_register() or MD initialization processing.  You can also set except
+ * MARVELL_TAG_SDRAM_CS* to a tag.  In this case, device_register() should
+ * replace mva_tags of marvell_attach_args to the tag list for you.
+ */
+struct gtidmac_winacctbl {
+	enum marvell_tags tag;
+
+#define GTIDMAC_WINACC_NOACCESSALLOWED	0	/* No Access Allowed */
+#define GTIDMAC_WINACC_READONLY		1	/* Read Only */
+#define GTIDMAC_WINACC_FULLACCESS	2	/* Full Access */
+	int winacc;
+};
+extern struct gtidmac_winacctbl *gtidmac_winacctbl;
+extern struct gtidmac_winacctbl *mvxore_winacctbl;
+
 void *gtidmac_tag_get(void);
 
 int gtidmac_chan_alloc(void *, bus_dmamap_t **, bus_dmamap_t **, void *);

Index: src/sys/dev/marvell/if_mvgbe.c
diff -u src/sys/dev/marvell/if_mvgbe.c:1.37 src/sys/dev/marvell/if_mvgbe.c:1.38
--- src/sys/dev/marvell/if_mvgbe.c:1.37	Tue Feb 25 18:30:10 2014
+++ src/sys/dev/marvell/if_mvgbe.c	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mvgbe.c,v 1.37 2014/02/25 18:30:10 pooka Exp $	*/
+/*	$NetBSD: if_mvgbe.c,v 1.38 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2007, 2008, 2013 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.37 2014/02/25 18:30:10 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.38 2014/03/15 13:33:48 kiyohara Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -271,7 +271,7 @@ static int mvgbec_miibus_readreg(device_
 static void mvgbec_miibus_writereg(device_t, int, int, int);
 static void mvgbec_miibus_statchg(struct ifnet *);
 
-static void mvgbec_wininit(struct mvgbec_softc *);
+static void mvgbec_wininit(struct mvgbec_softc *, enum marvell_tags *);
 
 /* Gigabit Ethernet Port part functions */
 
@@ -385,6 +385,13 @@ struct mvgbe_port {
 	{ MARVELL_ARMADAXP_MV78460,	1, 1, { 70 }, FLAGS_HAS_PV },
 	{ MARVELL_ARMADAXP_MV78460,	2, 1, { 74 }, FLAGS_HAS_PV },
 	{ MARVELL_ARMADAXP_MV78460,	3, 1, { 78 }, FLAGS_HAS_PV },
+
+	{ MARVELL_ARMADA370_MV6707,	0, 1, { 66 }, FLAGS_HAS_PV },
+	{ MARVELL_ARMADA370_MV6707,	1, 1, { 70 }, FLAGS_HAS_PV },
+	{ MARVELL_ARMADA370_MV6710,	0, 1, { 66 }, FLAGS_HAS_PV },
+	{ MARVELL_ARMADA370_MV6710,	1, 1, { 70 }, FLAGS_HAS_PV },
+	{ MARVELL_ARMADA370_MV6W11,	0, 1, { 66 }, FLAGS_HAS_PV },
+	{ MARVELL_ARMADA370_MV6W11,	1, 1, { 70 }, FLAGS_HAS_PV },
 };
 
 
@@ -443,7 +450,7 @@ mvgbec_attach(device_t parent, device_t 
 	MVGBE_WRITE(csc, MVGBE_EUIM, 0);
 	MVGBE_WRITE(csc, MVGBE_EUIC, 0);
 
-	mvgbec_wininit(csc);
+	mvgbec_wininit(csc, mva->mva_tags);
 
 	memset(&gbea, 0, sizeof(gbea));
 	for (i = 0; i < __arraycount(mvgbe_ports); i++) {
@@ -614,20 +621,12 @@ mvgbec_miibus_statchg(struct ifnet *ifp)
 
 
 static void
-mvgbec_wininit(struct mvgbec_softc *sc)
+mvgbec_wininit(struct mvgbec_softc *sc, enum marvell_tags *tags)
 {
 	device_t pdev = device_parent(sc->sc_dev);
 	uint64_t base;
 	uint32_t en, ac, size;
 	int window, target, attr, rv, i;
-	static int tags[] = {
-		MARVELL_TAG_SDRAM_CS0,
-		MARVELL_TAG_SDRAM_CS1,
-		MARVELL_TAG_SDRAM_CS2,
-		MARVELL_TAG_SDRAM_CS3,
-
-		MARVELL_TAG_UNDEFINED,
-	};
 
 	/* First disable all address decode windows */
 	en = MVGBE_BARE_EN_MASK;
@@ -1173,10 +1172,10 @@ mvgbe_init(struct ifnet *ifp)
 		MVGBE_WRITE(csc, MVGBE_PMACC0,
 		    MVGBE_PMACC0_RESERVED |
 		    MVGBE_PMACC0_FRAMESIZELIMIT(1600));
+		reg = MVGBE_READ(csc, MVGBE_PMACC2);
+		reg &= MVGBE_PMACC2_PCSEN;	/* keep PCSEN bit */
 		MVGBE_WRITE(csc, MVGBE_PMACC2,
-		    MVGBE_PMACC2_PCSEN		|
-		    MVGBE_PMACC2_RESERVED	|
-		    MVGBE_PMACC2_RGMIIEN);
+		    reg | MVGBE_PMACC2_RESERVED | MVGBE_PMACC2_RGMIIEN);
 
 		MVGBE_WRITE(sc, MVGBE_PXCX,
 		    MVGBE_READ(sc, MVGBE_PXCX) & ~MVGBE_PXCX_TXCRCDIS);

Index: src/sys/dev/marvell/mvpex.c
diff -u src/sys/dev/marvell/mvpex.c:1.8 src/sys/dev/marvell/mvpex.c:1.9
--- src/sys/dev/marvell/mvpex.c:1.8	Wed May  1 12:21:47 2013
+++ src/sys/dev/marvell/mvpex.c	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvpex.c,v 1.8 2013/05/01 12:21:47 rkujawa Exp $	*/
+/*	$NetBSD: mvpex.c,v 1.9 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2008 KIYOHARA Takashi
  * All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvpex.c,v 1.8 2013/05/01 12:21:47 rkujawa Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvpex.c,v 1.9 2014/03/15 13:33:48 kiyohara Exp $");
 
 #include "opt_pci.h"
 #include "pci.h"
@@ -61,13 +61,13 @@ static void mvpex_attach(device_t, devic
 
 static int mvpex_intr(void *);
 
-static void mvpex_init(struct mvpex_softc *);
+static void mvpex_init(struct mvpex_softc *, enum marvell_tags *);
 #if 0	/* shall move to pchb(4)? */
 static void mvpex_barinit(struct mvpex_softc *);
 static int mvpex_wininit(struct mvpex_softc *, int, int, int, int, uint32_t *,
 			 uint32_t *);
 #else
-static void mvpex_wininit(struct mvpex_softc *);
+static void mvpex_wininit(struct mvpex_softc *, enum marvell_tags *);
 #endif
 #if NPCI > 0
 static void mvpex_pci_config(struct mvpex_softc *, bus_space_tag_t,
@@ -75,6 +75,8 @@ static void mvpex_pci_config(struct mvpe
 			     u_long, u_long, u_long, u_long, int);
 #endif
 
+enum marvell_tags *mvpex_bar2_tags;
+
 CFATTACH_DECL_NEW(mvpex_gt, sizeof(struct mvpex_softc),
     mvpex_match, mvpex_attach, NULL, NULL);
 CFATTACH_DECL_NEW(mvpex_mbus, sizeof(struct mvpex_softc),
@@ -174,7 +176,7 @@ mvpex_attach(device_t parent, device_t s
 		aprint_error_dev(self, "can't map registers\n");
 		return;
 	}
-	mvpex_init(sc);
+	mvpex_init(sc, mva->mva_tags);
 
 	/* XXX: looks seem good to specify level IPL_VM. */
 	marvell_intr_establish(mva->mva_irq, IPL_VM, mvpex_intr, sc);
@@ -233,7 +235,7 @@ mvpex_intr(void *arg)
 
 
 static void
-mvpex_init(struct mvpex_softc *sc)
+mvpex_init(struct mvpex_softc *sc, enum marvell_tags *tags)
 {
 	uint32_t reg;
 	int window;
@@ -258,7 +260,7 @@ mvpex_init(struct mvpex_softc *sc)
 #if 0	/* shall move to pchb(4)? */
 	mvpex_barinit(sc);
 #else
-	mvpex_wininit(sc);
+	mvpex_wininit(sc, tags);
 #endif
 
 	/* Clear Interrupt Cause and Mask registers */
@@ -352,28 +354,16 @@ mvpex_barinit(struct mvpex_softc *sc)
 }
 #else
 static void
-mvpex_wininit(struct mvpex_softc *sc)
+mvpex_wininit(struct mvpex_softc *sc, enum marvell_tags *tags)
 {
 	device_t pdev = device_parent(sc->sc_dev);
 	uint64_t base;
-	uint32_t size;
-	int target, attr, window, rv, i;
-	static struct {
-		int tag;
-		int bar;
-	} tags[] = {
-		{ MARVELL_TAG_SDRAM_CS0,	MVPEX_WC_BARMAP_BAR1	},
-		{ MARVELL_TAG_SDRAM_CS1,	MVPEX_WC_BARMAP_BAR1	},
-		{ MARVELL_TAG_SDRAM_CS2,	MVPEX_WC_BARMAP_BAR1	},
-		{ MARVELL_TAG_SDRAM_CS3,	MVPEX_WC_BARMAP_BAR1	},
-
-		{ MARVELL_TAG_UNDEFINED,	0			},
-	};
+	uint32_t size, bar;
+	int target, attr, window, rv, i, j;
 
 	for (window = 0, i = 0;
-	    tags[i].tag != MARVELL_TAG_UNDEFINED && window < MVPEX_NWINDOW;
-	    i++) {
-		rv = marvell_winparams_by_tag(pdev, tags[i].tag,
+	    tags[i] != MARVELL_TAG_UNDEFINED && window < MVPEX_NWINDOW; i++) {
+		rv = marvell_winparams_by_tag(pdev, tags[i],
 		    &target, &attr, &base, &size);
 		if (rv != 0 || size == 0)
 			continue;
@@ -381,13 +371,23 @@ mvpex_wininit(struct mvpex_softc *sc)
 		if (base > 0xffffffffULL) {
 			aprint_error_dev(sc->sc_dev,
 			    "tag %d address 0x%llx not support\n",
-			    tags[i].tag, base);
+			    tags[i], base);
 			continue;
 		}
 
+		bar = MVPEX_WC_BARMAP_BAR1;
+		if (mvpex_bar2_tags != NULL)
+			for (j = 0; mvpex_bar2_tags[j] != MARVELL_TAG_UNDEFINED;
+			    j++) {
+				if (mvpex_bar2_tags[j] != tags[i])
+					continue;
+				bar = MVPEX_WC_BARMAP_BAR2;
+				break;
+			}
+
 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, MVPEX_WC(window),
 		    MVPEX_WC_WINEN		|
-		    tags[i].bar			|
+		    bar				|
 		    MVPEX_WC_TARGET(target)	|
 		    MVPEX_WC_ATTR(attr)		|
 		    MVPEX_WC_SIZE(size));

Index: src/sys/dev/marvell/mvpexvar.h
diff -u src/sys/dev/marvell/mvpexvar.h:1.3 src/sys/dev/marvell/mvpexvar.h:1.4
--- src/sys/dev/marvell/mvpexvar.h:1.3	Fri Sep  7 04:25:37 2012
+++ src/sys/dev/marvell/mvpexvar.h	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvpexvar.h,v 1.3 2012/09/07 04:25:37 matt Exp $	*/
+/*	$NetBSD: mvpexvar.h,v 1.4 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2009 KIYOHARA Takashi
  * All rights reserved.
@@ -28,6 +28,8 @@
 #ifndef	_MVPEXVAR_H_
 #define	_MVPEXVAR_H_
 
+extern enum marvell_tags *mvpex_bar2_tags;
+
 struct mvpex_intrhand {
 	LIST_ENTRY(mvpex_intrhand) ih_q;
 	int (*ih_func)(void *);

Index: src/sys/dev/marvell/mvsata_mv.c
diff -u src/sys/dev/marvell/mvsata_mv.c:1.6 src/sys/dev/marvell/mvsata_mv.c:1.7
--- src/sys/dev/marvell/mvsata_mv.c:1.6	Sat Sep 28 05:37:31 2013
+++ src/sys/dev/marvell/mvsata_mv.c	Sat Mar 15 13:33:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvsata_mv.c,v 1.6 2013/09/28 05:37:31 kiyohara Exp $	*/
+/*	$NetBSD: mvsata_mv.c,v 1.7 2014/03/15 13:33:48 kiyohara Exp $	*/
 /*
  * Copyright (c) 2008 KIYOHARA Takashi
  * All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsata_mv.c,v 1.6 2013/09/28 05:37:31 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsata_mv.c,v 1.7 2014/03/15 13:33:48 kiyohara Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -71,7 +71,7 @@ static void mvsatahc_attach(device_t, de
 static int mvsatahc_intr(void *);
 
 static void mvsatahc_enable_intr(struct mvsata_port *, int);
-static void mvsatahc_wininit(struct mvsata_softc *);
+static void mvsatahc_wininit(struct mvsata_softc *, enum marvell_tags *);
 
 CFATTACH_DECL_NEW(mvsata_gt, sizeof(struct mvsata_softc),
     mvsatahc_match, mvsatahc_attach, NULL, NULL);
@@ -105,6 +105,11 @@ struct mvsata_product mvsata_products[] 
 	{ PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_MV78230, 1, 2, gen2e, 0 },
 	{ PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_MV78260, 1, 2, gen2e, 0 },
 	{ PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_MV78460, 1, 2, gen2e, 0 },
+
+	/* Armada 370 */
+	{ PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_MV6707, 1, 2, gen2e, 0 },
+	{ PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_MV6710, 1, 2, gen2e, 0 },
+	{ PCI_VENDOR_MARVELL, PCI_PRODUCT_MARVELL_MV6W11, 1, 2, gen2e, 0 },
 };
 
 
@@ -152,7 +157,7 @@ mvsatahc_attach(device_t parent, device_
 	sc->sc_dmat = mva->mva_dmat;
 	sc->sc_enable_intr = mvsatahc_enable_intr;
 
-	mvsatahc_wininit(sc);
+	mvsatahc_wininit(sc, mva->mva_tags);
 
 	for (i = 0; i < __arraycount(mvsata_products); i++)
 		if (mva->mva_model == mvsata_products[i].model)
@@ -206,20 +211,12 @@ mvsatahc_enable_intr(struct mvsata_port 
 }
 
 static void
-mvsatahc_wininit(struct mvsata_softc *sc)
+mvsatahc_wininit(struct mvsata_softc *sc, enum marvell_tags *tags)
 {
 	device_t pdev = device_parent(sc->sc_wdcdev.sc_atac.atac_dev);
 	uint64_t base;
 	uint32_t size;
 	int window, target, attr, rv, i;
-	static int tags[] = {
-		MARVELL_TAG_SDRAM_CS0,
-		MARVELL_TAG_SDRAM_CS1,
-		MARVELL_TAG_SDRAM_CS2,
-		MARVELL_TAG_SDRAM_CS3,
-
-		MARVELL_TAG_UNDEFINED,
-	};
 
 	for (window = 0, i = 0;
 	    tags[i] != MARVELL_TAG_UNDEFINED && window < MVSATAHC_NWINDOW;

Reply via email to