Module Name:    src
Committed By:   kiyohara
Date:           Mon Feb 17 05:00:38 UTC 2014

Modified Files:
        src/sys/arch/arm/marvell: mvsoc.c

Log Message:
Support MARVELL_TAG_DDR3_CS[0-3].


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 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.16 src/sys/arch/arm/marvell/mvsoc.c:1.17
--- src/sys/arch/arm/marvell/mvsoc.c:1.16	Mon Dec 23 04:12:09 2013
+++ src/sys/arch/arm/marvell/mvsoc.c	Mon Feb 17 05:00:38 2014
@@ -1,6 +1,6 @@
-/*	$NetBSD: mvsoc.c,v 1.16 2013/12/23 04:12:09 kiyohara Exp $	*/
+/*	$NetBSD: mvsoc.c,v 1.17 2014/02/17 05:00:38 kiyohara Exp $	*/
 /*
- * Copyright (c) 2007, 2008 KIYOHARA Takashi
+ * Copyright (c) 2007, 2008, 2013, 2014 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.16 2013/12/23 04:12:09 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsoc.c,v 1.17 2014/02/17 05:00:38 kiyohara Exp $");
 
 #include "opt_cputypes.h"
 #include "opt_mvsoc.h"
@@ -64,6 +64,10 @@ static void mvsoc_attach(device_t, devic
 static int mvsoc_print(void *, const char *);
 static int mvsoc_search(device_t, cfdata_t, const int *, void *);
 
+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_peripheral(uint32_t, uint32_t, uint32_t *, uint32_t *);
+
 uint32_t mvPclk, mvSysclk, mvTclk = 0;
 int nwindow = 0, nremap = 0;
 static vaddr_t regbase = 0xffffffff, dsc_base, pex_base;
@@ -135,6 +139,15 @@ static struct {
 	{ MARVELL_TAG_SDRAM_CS3,
 	  MARVELL_ATTR_SDRAM_CS3,	MVSOC_UNITID_DDR },
 
+	{ MARVELL_TAG_DDR3_CS0,
+	  MARVELL_ATTR_SDRAM_CS0,	MVSOC_UNITID_DDR },
+	{ MARVELL_TAG_DDR3_CS1,
+	  MARVELL_ATTR_SDRAM_CS1,	MVSOC_UNITID_DDR },
+	{ MARVELL_TAG_DDR3_CS2,
+	  MARVELL_ATTR_SDRAM_CS2,	MVSOC_UNITID_DDR },
+	{ MARVELL_TAG_DDR3_CS3,
+	  MARVELL_ATTR_SDRAM_CS3,	MVSOC_UNITID_DDR },
+
 #if defined(ORION)
 	{ ORION_TAG_DEVICE_CS0,
 	  ORION_ATTR_DEVICE_CS0,	MVSOC_UNITID_DEVBUS },
@@ -925,76 +938,150 @@ mvsoc_target(int tag, uint32_t *target, 
 		*attr = mvsoc_tags[i].attr;
 
 	if (mvsoc_tags[i].target == MVSOC_UNITID_DDR) {
-		/*
-		 * Read DDR SDRAM Controller Address Decode Registers
-		 */
-		uint32_t baseaddrreg, sizereg;
-		int cs = 0;
-
-		switch (mvsoc_tags[i].attr) {
-		case MARVELL_ATTR_SDRAM_CS0:
-			cs = 0;
-			break;
-		case MARVELL_ATTR_SDRAM_CS1:
-			cs = 1;
-			break;
-		case MARVELL_ATTR_SDRAM_CS2:
-			cs = 2;
-			break;
-		case MARVELL_ATTR_SDRAM_CS3:
-			cs = 3;
-			break;
-		}
-		sizereg = *(volatile uint32_t *)(dsc_base + MVSOC_DSC_CSSR(cs));
-		if (sizereg & MVSOC_DSC_CSSR_WINEN) {
-			baseaddrreg = *(volatile uint32_t *)(dsc_base +
-			    MVSOC_DSC_CSBAR(cs));
+		if (tag == MARVELL_TAG_SDRAM_CS0 ||
+		    tag == MARVELL_TAG_SDRAM_CS1 ||
+		    tag == MARVELL_TAG_SDRAM_CS2 ||
+		    tag == MARVELL_TAG_SDRAM_CS3)
+			return mvsoc_target_ddr(mvsoc_tags[i].attr, base, size);
+		else
+			return mvsoc_target_ddr3(mvsoc_tags[i].attr, base,
+			    size);
+	} else
+		return mvsoc_target_peripheral(mvsoc_tags[i].target,
+		    mvsoc_tags[i].attr, base, size);
+}
 
-			if (base != NULL)
-				*base = baseaddrreg & MVSOC_DSC_CSBAR_BASE_MASK;
-			if (size != NULL)
-				*size = (sizereg & MVSOC_DSC_CSSR_SIZE_MASK) +
-				    (~MVSOC_DSC_CSSR_SIZE_MASK + 1);
-		} else {
-			if (base != NULL)
-				*base = 0;
-			if (size != NULL)
-				*size = 0;
-		}
-		return 0;
-	} else {
-		/*
-		 * Read CPU Address Map Registers
-		 */
-		uint32_t basereg, ctrlreg, ta, tamask;
-
-		ta = MVSOC_MLMB_WCR_TARGET(mvsoc_tags[i].target) |
-		    MVSOC_MLMB_WCR_ATTR(mvsoc_tags[i].attr);
-		tamask = MVSOC_MLMB_WCR_TARGET(MVSOC_UNITID_MASK) |
-		    MVSOC_MLMB_WCR_ATTR(MARVELL_ATTR_MASK);
+static int
+mvsoc_target_ddr(uint32_t attr, uint32_t *base, uint32_t *size)
+{
+	uint32_t baseaddrreg, sizereg;
+	int cs;
+
+	/*
+	 * Read DDR SDRAM Controller Address Decode Registers
+	 */
 
+	switch (attr) {
+	case MARVELL_ATTR_SDRAM_CS0:
+		cs = 0;
+		break;
+	case MARVELL_ATTR_SDRAM_CS1:
+		cs = 1;
+		break;
+	case MARVELL_ATTR_SDRAM_CS2:
+		cs = 2;
+		break;
+	case MARVELL_ATTR_SDRAM_CS3:
+		cs = 3;
+		break;
+	default:
+		aprint_error("unknwon ATTR: 0x%x", attr);
+		return -1;
+	}
+	sizereg = *(volatile uint32_t *)(dsc_base + MVSOC_DSC_CSSR(cs));
+	if (sizereg & MVSOC_DSC_CSSR_WINEN) {
+		baseaddrreg =
+		    *(volatile uint32_t *)(dsc_base + MVSOC_DSC_CSBAR(cs));
+
+		if (base != NULL)
+			*base = baseaddrreg & MVSOC_DSC_CSBAR_BASE_MASK;
+		if (size != NULL)
+			*size = (sizereg & MVSOC_DSC_CSSR_SIZE_MASK) +
+			    (~MVSOC_DSC_CSSR_SIZE_MASK + 1);
+	} else {
 		if (base != NULL)
 			*base = 0;
 		if (size != NULL)
 			*size = 0;
+	}
+	return 0;
+}
+
+static int
+mvsoc_target_ddr3(uint32_t attr, uint32_t *base, uint32_t *size)
+{
+	uint32_t baseaddrreg, sizereg;
+	int cs, i;
 
-		for (i = 0; i < nwindow; i++) {
-			ctrlreg = read_mlmbreg(MVSOC_MLMB_WCR(i));
-			if ((ctrlreg & tamask) != ta)
-				continue;
-			if (ctrlreg & MVSOC_MLMB_WCR_WINEN) {
-				basereg = read_mlmbreg(MVSOC_MLMB_WBR(i));
-
-				if (base != NULL)
-					*base =
-					    basereg & MVSOC_MLMB_WBR_BASE_MASK;
-				if (size != NULL)
-					*size = (ctrlreg &
-					    MVSOC_MLMB_WCR_SIZE_MASK) +
-					    (~MVSOC_MLMB_WCR_SIZE_MASK + 1);
-			}
+	/*
+	 * Read DDR3 SDRAM Address Decoding Registers
+	 */
+
+	switch (attr) {
+	case MARVELL_ATTR_SDRAM_CS0:
+		cs = 0;
+		break;
+	case MARVELL_ATTR_SDRAM_CS1:
+		cs = 1;
+		break;
+	case MARVELL_ATTR_SDRAM_CS2:
+		cs = 2;
+		break;
+	case MARVELL_ATTR_SDRAM_CS3:
+		cs = 3;
+		break;
+	default:
+		aprint_error("unknwon ATTR: 0x%x", attr);
+		return -1;
+	}
+	for (i = 0; i < MVSOC_MLMB_NWIN; i++) {
+		sizereg = read_mlmbreg(MVSOC_MLMB_WINCR(i));
+		if ((sizereg & MVSOC_MLMB_WINCR_EN) &&
+		    MVSOC_MLMB_WINCR_WINCS(sizereg) == cs)
 			break;
+	}
+	if (i == MVSOC_MLMB_NWIN) {
+		if (base != NULL)
+			*base = 0;
+		if (size != NULL)
+			*size = 0;
+		return 0;
+	}
+
+	baseaddrreg = read_mlmbreg(MVSOC_MLMB_WINBAR(i));
+	if (base != NULL)
+		*base = baseaddrreg & MVSOC_MLMB_WINBAR_BASE_MASK;
+	if (size != NULL)
+		*size = (sizereg & MVSOC_MLMB_WINCR_SIZE_MASK) +
+		    (~MVSOC_MLMB_WINCR_SIZE_MASK + 1);
+	return 0;
+}
+
+static int
+mvsoc_target_peripheral(uint32_t target, uint32_t attr, uint32_t *base,
+			uint32_t *size)
+{
+	uint32_t basereg, ctrlreg, ta, tamask;
+	int i;
+
+	/*
+	 * Read CPU Address Map Registers
+	 */
+
+	ta = MVSOC_MLMB_WCR_TARGET(target) | MVSOC_MLMB_WCR_ATTR(attr);
+	tamask = MVSOC_MLMB_WCR_TARGET(MVSOC_UNITID_MASK) |
+	    MVSOC_MLMB_WCR_ATTR(MARVELL_ATTR_MASK);
+
+	if (base != NULL)
+		*base = 0;
+	if (size != NULL)
+		*size = 0;
+
+	for (i = 0; i < nwindow; i++) {
+		ctrlreg = read_mlmbreg(MVSOC_MLMB_WCR(i));
+		if ((ctrlreg & tamask) != ta)
+			continue;
+		if (ctrlreg & MVSOC_MLMB_WCR_WINEN) {
+			basereg = read_mlmbreg(MVSOC_MLMB_WBR(i));
+
+			if (base != NULL)
+				*base = basereg & MVSOC_MLMB_WBR_BASE_MASK;
+			if (size != NULL)
+				*size = (ctrlreg &
+				    MVSOC_MLMB_WCR_SIZE_MASK) +
+				    (~MVSOC_MLMB_WCR_SIZE_MASK + 1);
 		}
-		return i;
+		break;
 	}
+	return i;
 }

Reply via email to