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;