1e58fe957SKim Phillips /* 2e58fe957SKim Phillips * Copyright (C) Freescale Semiconductor, Inc. 2006-2007 3e58fe957SKim Phillips * 4e58fe957SKim Phillips * Authors: Nick.Spence@freescale.com 5e58fe957SKim Phillips * Wilson.Lo@freescale.com 6e58fe957SKim Phillips * scottwood@freescale.com 7e58fe957SKim Phillips * 81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 9e58fe957SKim Phillips */ 10e58fe957SKim Phillips 11e58fe957SKim Phillips #include <common.h> 12e58fe957SKim Phillips #include <mpc83xx.h> 13e58fe957SKim Phillips #include <spd_sdram.h> 14e58fe957SKim Phillips 15e58fe957SKim Phillips #include <asm/bitops.h> 16e58fe957SKim Phillips #include <asm/io.h> 17e58fe957SKim Phillips 18e58fe957SKim Phillips #include <asm/processor.h> 19e58fe957SKim Phillips 201218abf1SWolfgang Denk DECLARE_GLOBAL_DATA_PTR; 211218abf1SWolfgang Denk 226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_8313ERDB_BROKEN_PMC resume_from_sleep(void)23e58fe957SKim Phillipsstatic void resume_from_sleep(void) 24e58fe957SKim Phillips { 25e58fe957SKim Phillips u32 magic = *(u32 *)0; 26e58fe957SKim Phillips 27e58fe957SKim Phillips typedef void (*func_t)(void); 28e58fe957SKim Phillips func_t resume = *(func_t *)4; 29e58fe957SKim Phillips 30e58fe957SKim Phillips if (magic == 0xf5153ae5) 31e58fe957SKim Phillips resume(); 32e58fe957SKim Phillips 33e58fe957SKim Phillips gd->flags &= ~GD_FLG_SILENT; 34e58fe957SKim Phillips puts("\nResume from sleep failed: bad magic word\n"); 35e58fe957SKim Phillips } 36e58fe957SKim Phillips #endif 37e58fe957SKim Phillips 38e58fe957SKim Phillips /* Fixed sdram init -- doesn't use serial presence detect. 39e58fe957SKim Phillips * 40e58fe957SKim Phillips * This is useful for faster booting in configs where the RAM is unlikely 41e58fe957SKim Phillips * to be changed, or for things like NAND booting where space is tight. 42e58fe957SKim Phillips */ fixed_sdram(void)43e58fe957SKim Phillipsstatic long fixed_sdram(void) 44e58fe957SKim Phillips { 456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024; 46e4c09508SScott Wood 476d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_RAMBOOT 486d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR; 49e58fe957SKim Phillips u32 msize_log2 = __ilog2(msize); 50e58fe957SKim Phillips 516d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000; 52e58fe957SKim Phillips im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1); 536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->sysconf.ddrcdr = CONFIG_SYS_DDRCDR_VALUE; 54e58fe957SKim Phillips 55e58fe957SKim Phillips /* 56e58fe957SKim Phillips * Erratum DDR3 requires a 50ms delay after clearing DDRCDR[DDR_cfg], 57e58fe957SKim Phillips * or the DDR2 controller may fail to initialize correctly. 58e58fe957SKim Phillips */ 593eb90badSIngo van Lil __udelay(50000); 60e58fe957SKim Phillips 612e651b24SJoe Hershberger #if ((CONFIG_SYS_DDR_SDRAM_BASE & 0x00FFFFFF) != 0) 622e651b24SJoe Hershberger #warning Chip select bounds is only configurable in 16MB increments 632e651b24SJoe Hershberger #endif 642e651b24SJoe Hershberger im->ddr.csbnds[0].csbnds = 652e651b24SJoe Hershberger ((CONFIG_SYS_DDR_SDRAM_BASE >> CSBNDS_SA_SHIFT) & CSBNDS_SA) | 662e651b24SJoe Hershberger (((CONFIG_SYS_DDR_SDRAM_BASE + msize - 1) >> CSBNDS_EA_SHIFT) & 672e651b24SJoe Hershberger CSBNDS_EA); 682e651b24SJoe Hershberger im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG; 69e58fe957SKim Phillips 70e58fe957SKim Phillips /* Currently we use only one CS, so disable the other bank. */ 71e58fe957SKim Phillips im->ddr.cs_config[1] = 0; 72e58fe957SKim Phillips 736d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CNTL; 746d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3; 756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1; 766d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2; 776d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0; 78e58fe957SKim Phillips 796d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_8313ERDB_BROKEN_PMC 80e58fe957SKim Phillips if (im->pmc.pmccr1 & PMCCR1_POWER_OFF) 816d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_cfg = CONFIG_SYS_SDRAM_CFG | SDRAM_CFG_BI; 82e58fe957SKim Phillips else 83e58fe957SKim Phillips #endif 846d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_cfg = CONFIG_SYS_SDRAM_CFG; 85e58fe957SKim Phillips 866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_cfg2 = CONFIG_SYS_SDRAM_CFG2; 876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_mode = CONFIG_SYS_DDR_MODE; 886d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_mode2 = CONFIG_SYS_DDR_MODE_2; 89e58fe957SKim Phillips 906d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_interval = CONFIG_SYS_DDR_INTERVAL; 91e58fe957SKim Phillips sync(); 92e58fe957SKim Phillips 93e58fe957SKim Phillips /* enable DDR controller */ 94e58fe957SKim Phillips im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; 95e4c09508SScott Wood #endif 96e58fe957SKim Phillips 97e58fe957SKim Phillips return msize; 98e58fe957SKim Phillips } 99e58fe957SKim Phillips dram_init(void)100*f1683aa7SSimon Glassint dram_init(void) 101e58fe957SKim Phillips { 1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR; 103f51cdaf1SBecky Bruce volatile fsl_lbc_t *lbc = &im->im_lbc; 104e58fe957SKim Phillips u32 msize; 105e58fe957SKim Phillips 106e58fe957SKim Phillips if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im) 107088454cdSSimon Glass return -ENXIO; 108e58fe957SKim Phillips 109e58fe957SKim Phillips /* DDR SDRAM - Main SODIMM */ 110e58fe957SKim Phillips msize = fixed_sdram(); 111e58fe957SKim Phillips 112e58fe957SKim Phillips /* Local Bus setup lbcr and mrtpr */ 1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD lbc->lbcr = CONFIG_SYS_LBC_LBCR; 1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD lbc->mrtpr = CONFIG_SYS_LBC_MRTPR; 115e58fe957SKim Phillips sync(); 116e58fe957SKim Phillips 1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_8313ERDB_BROKEN_PMC 118e58fe957SKim Phillips if (im->pmc.pmccr1 & PMCCR1_POWER_OFF) 119e58fe957SKim Phillips resume_from_sleep(); 120e58fe957SKim Phillips #endif 121e58fe957SKim Phillips 122e58fe957SKim Phillips /* return total bus SDRAM size(bytes) -- DDR */ 123088454cdSSimon Glass gd->ram_size = msize; 124088454cdSSimon Glass 125088454cdSSimon Glass return 0; 126e58fe957SKim Phillips } 127