ixp425_mem.c revision 186352
1290494Sbapt/* $NetBSD: ixp425_mem.c,v 1.2 2005/12/11 12:16:51 christos Exp $ */ 2290494Sbapt 3290494Sbapt/* 4290494Sbapt * Copyright (c) 2003 Wasabi Systems, Inc. 5127549Stjr * All rights reserved. 6127549Stjr * 7127549Stjr * Written by Steve C. Woodford for Wasabi Systems, Inc. 8290494Sbapt * 9127549Stjr * Redistribution and use in source and binary forms, with or without 10127549Stjr * modification, are permitted provided that the following conditions 11290494Sbapt * are met: 12127549Stjr * 1. Redistributions of source code must retain the above copyright 13127549Stjr * notice, this list of conditions and the following disclaimer. 14290494Sbapt * 2. Redistributions in binary form must reproduce the above copyright 15127549Stjr * notice, this list of conditions and the following disclaimer in the 16127549Stjr * documentation and/or other materials provided with the distribution. 17290494Sbapt * 3. All advertising materials mentioning features or use of this software 18290494Sbapt * must display the following acknowledgement: 19290494Sbapt * This product includes software developed for the NetBSD Project by 20290494Sbapt * Wasabi Systems, Inc. 21127549Stjr * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22127549Stjr * or promote products derived from this software without specific prior 23290494Sbapt * written permission. 24127549Stjr * 25127549Stjr * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26290494Sbapt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27127549Stjr * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28127549Stjr * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29290494Sbapt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30127549Stjr * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31127549Stjr * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32290494Sbapt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33127549Stjr * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34127549Stjr * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35290494Sbapt * POSSIBILITY OF SUCH DAMAGE. 36127549Stjr */ 37127549Stjr 38290494Sbapt#include <sys/cdefs.h> 39127549Stjr__FBSDID("$FreeBSD: head/sys/arm/xscale/ixp425/ixp425_mem.c 186352 2008-12-20 03:26:09Z sam $"); 40127549Stjr 41290494Sbapt#include <sys/param.h> 42127549Stjr#include <sys/systm.h> 43127549Stjr 44290494Sbapt#include <arm/xscale/ixp425/ixp425reg.h> 45127549Stjr#include <arm/xscale/ixp425/ixp425var.h> 46127549Stjr 47290494Sbaptstatic uint32_t sdram_64bit[] = { 48127549Stjr 0x00800000, /* 8M: One 2M x 32 chip */ 49290494Sbapt 0x01000000, /* 16M: Two 2M x 32 chips */ 50127549Stjr 0x01000000, /* 16M: Two 4M x 16 chips */ 51 0x02000000, /* 32M: Four 4M x 32 chips */ 52 0, 0, 0, 0 53}; 54 55static uint32_t sdram_other[] = { 56 0x02000000, /* 32M: Two 8M x 16 chips */ 57 0x04000000, /* 64M: Four 8M x 16 chips */ 58 0x04000000, /* 64M: Two 16M x 16 chips */ 59 0x08000000, /* 128M: Four 16M x 16 chips */ 60 0x08000000, /* 128M: Two 32M x 16 chips */ 61 0x10000000, /* 256M: Four 32M x 16 chips */ 62 0, 0 63}; 64 65uint32_t 66ixp425_sdram_size(void) 67{ 68#define MCU_REG_READ(x) (*(volatile uint32_t *)(IXP425_MCU_VBASE + (x))) 69 uint32_t size, sdr_config; 70 71 sdr_config = MCU_REG_READ(MCU_SDR_CONFIG); 72 73 if (sdr_config & MCU_SDR_CONFIG_64MBIT) 74 size = sdram_64bit[MCU_SDR_CONFIG_MCONF(sdr_config)]; 75 else 76 size = sdram_other[MCU_SDR_CONFIG_MCONF(sdr_config)]; 77 78 if (size == 0) { 79 printf("** SDR_CONFIG retuns unknown value, using 32M\n"); 80 size = 32 * 1024 * 1024; 81 } 82 83 return (size); 84#undef MCU_REG_READ 85} 86 87uint32_t 88ixp435_ddram_size(void) 89{ 90#define MCU_REG_READ(x) (*(volatile uint32_t *)(IXP425_MCU_VBASE + (x))) 91 uint32_t sbr0; 92 93 /* 94 * Table 198, page 516 shows DDR-I/II SDRAM bank sizes 95 * for SBR0 and SBR1. The manual states both banks must 96 * be programmed to be the same size. We just assume 97 * it's done right and calculate 2x for the memory size. 98 */ 99 sbr0 = MCU_REG_READ(MCU_DDR_SBR0); 100 return 2 * 16*(sbr0 & 0x7f) * 1024 * 1024; 101#undef MCU_REG_READ 102} 103