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;