15fb17030SIlya Yanok /* 25fb17030SIlya Yanok * Copyright (C) 2007 Freescale Semiconductor, Inc. 35fb17030SIlya Yanok * Copyright (C) 2010 Ilya Yanok, Emcraft Systems, yanok@emcraft.com 45fb17030SIlya Yanok * 55fb17030SIlya Yanok * Authors: Nick.Spence@freescale.com 65fb17030SIlya Yanok * Wilson.Lo@freescale.com 75fb17030SIlya Yanok * scottwood@freescale.com 85fb17030SIlya Yanok * 95fb17030SIlya Yanok * This files is mostly identical to the original from 105fb17030SIlya Yanok * board\freescale\mpc8315erdb\sdram.c 115fb17030SIlya Yanok * 121a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 135fb17030SIlya Yanok */ 145fb17030SIlya Yanok 155fb17030SIlya Yanok #include <common.h> 165fb17030SIlya Yanok #include <mpc83xx.h> 175fb17030SIlya Yanok 185fb17030SIlya Yanok #include <asm/bitops.h> 195fb17030SIlya Yanok #include <asm/io.h> 205fb17030SIlya Yanok 215fb17030SIlya Yanok #include <asm/processor.h> 225fb17030SIlya Yanok 235fb17030SIlya Yanok DECLARE_GLOBAL_DATA_PTR; 245fb17030SIlya Yanok 255fb17030SIlya Yanok /* Fixed sdram init -- doesn't use serial presence detect. 265fb17030SIlya Yanok * 275fb17030SIlya Yanok * This is useful for faster booting in configs where the RAM is unlikely 285fb17030SIlya Yanok * to be changed, or for things like NAND booting where space is tight. 295fb17030SIlya Yanok */ 305fb17030SIlya Yanok static long fixed_sdram(void) 315fb17030SIlya Yanok { 325fb17030SIlya Yanok immap_t *im = (immap_t *)CONFIG_SYS_IMMR; 335fb17030SIlya Yanok u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024; 345fb17030SIlya Yanok u32 msize_log2 = __ilog2(msize); 355fb17030SIlya Yanok 365fb17030SIlya Yanok out_be32(&im->sysconf.ddrlaw[0].bar, 375fb17030SIlya Yanok CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000); 385fb17030SIlya Yanok out_be32(&im->sysconf.ddrlaw[0].ar, LBLAWAR_EN | (msize_log2 - 1)); 395fb17030SIlya Yanok out_be32(&im->sysconf.ddrcdr, CONFIG_SYS_DDRCDR_VALUE); 405fb17030SIlya Yanok 415fb17030SIlya Yanok out_be32(&im->ddr.csbnds[0].csbnds, (msize - 1) >> 24); 425fb17030SIlya Yanok out_be32(&im->ddr.cs_config[0], CONFIG_SYS_DDR_CS0_CONFIG); 435fb17030SIlya Yanok 445fb17030SIlya Yanok /* Currently we use only one CS, so disable the other bank. */ 455fb17030SIlya Yanok out_be32(&im->ddr.cs_config[1], 0); 465fb17030SIlya Yanok 475fb17030SIlya Yanok out_be32(&im->ddr.sdram_clk_cntl, CONFIG_SYS_DDR_SDRAM_CLK_CNTL); 485fb17030SIlya Yanok out_be32(&im->ddr.timing_cfg_3, CONFIG_SYS_DDR_TIMING_3); 495fb17030SIlya Yanok out_be32(&im->ddr.timing_cfg_1, CONFIG_SYS_DDR_TIMING_1); 505fb17030SIlya Yanok out_be32(&im->ddr.timing_cfg_2, CONFIG_SYS_DDR_TIMING_2); 515fb17030SIlya Yanok out_be32(&im->ddr.timing_cfg_0, CONFIG_SYS_DDR_TIMING_0); 525fb17030SIlya Yanok 535fb17030SIlya Yanok out_be32(&im->ddr.sdram_cfg, CONFIG_SYS_DDR_SDRAM_CFG); 545fb17030SIlya Yanok out_be32(&im->ddr.sdram_cfg2, CONFIG_SYS_DDR_SDRAM_CFG2); 555fb17030SIlya Yanok out_be32(&im->ddr.sdram_mode, CONFIG_SYS_DDR_MODE); 565fb17030SIlya Yanok out_be32(&im->ddr.sdram_mode2, CONFIG_SYS_DDR_MODE2); 575fb17030SIlya Yanok 585fb17030SIlya Yanok out_be32(&im->ddr.sdram_interval, CONFIG_SYS_DDR_INTERVAL); 595fb17030SIlya Yanok sync(); 605fb17030SIlya Yanok 615fb17030SIlya Yanok /* enable DDR controller */ 625fb17030SIlya Yanok setbits_be32(&im->ddr.sdram_cfg, SDRAM_CFG_MEM_EN); 635fb17030SIlya Yanok sync(); 645fb17030SIlya Yanok 655fb17030SIlya Yanok return get_ram_size(CONFIG_SYS_DDR_SDRAM_BASE, msize); 665fb17030SIlya Yanok } 675fb17030SIlya Yanok 68*088454cdSSimon Glass int initdram(void) 695fb17030SIlya Yanok { 705fb17030SIlya Yanok immap_t *im = (immap_t *)CONFIG_SYS_IMMR; 715fb17030SIlya Yanok u32 msize; 725fb17030SIlya Yanok 735fb17030SIlya Yanok if ((in_be32(&im->sysconf.immrbar) & IMMRBAR_BASE_ADDR) != (u32)im) 74*088454cdSSimon Glass return -ENXIO; 755fb17030SIlya Yanok 765fb17030SIlya Yanok /* DDR SDRAM */ 775fb17030SIlya Yanok msize = fixed_sdram(); 785fb17030SIlya Yanok 795fb17030SIlya Yanok /* return total bus SDRAM size(bytes) -- DDR */ 80*088454cdSSimon Glass gd->ram_size = msize; 81*088454cdSSimon Glass 82*088454cdSSimon Glass return 0; 835fb17030SIlya Yanok } 84