1*5e918a98SKim Phillips /* 2*5e918a98SKim Phillips * Copyright (C) 2007 Freescale Semiconductor, Inc. 3*5e918a98SKim Phillips * Kevin Lam <kevin.lam@freescale.com> 4*5e918a98SKim Phillips * Joe D'Abbraccio <joe.d'abbraccio@freescale.com> 5*5e918a98SKim Phillips * 6*5e918a98SKim Phillips * See file CREDITS for list of people who contributed to this 7*5e918a98SKim Phillips * project. 8*5e918a98SKim Phillips * 9*5e918a98SKim Phillips * This program is free software; you can redistribute it and/or 10*5e918a98SKim Phillips * modify it under the terms of the GNU General Public License as 11*5e918a98SKim Phillips * published by the Free Software Foundation; either version 2 of 12*5e918a98SKim Phillips * the License, or (at your option) any later version. 13*5e918a98SKim Phillips */ 14*5e918a98SKim Phillips 15*5e918a98SKim Phillips #include <common.h> 16*5e918a98SKim Phillips #include <i2c.h> 17*5e918a98SKim Phillips #include <spd.h> 18*5e918a98SKim Phillips #include <asm/io.h> 19*5e918a98SKim Phillips #if defined(CONFIG_SPD_EEPROM) 20*5e918a98SKim Phillips #include <spd_sdram.h> 21*5e918a98SKim Phillips #endif 22*5e918a98SKim Phillips 23*5e918a98SKim Phillips #if defined(CFG_DRAM_TEST) 24*5e918a98SKim Phillips int 25*5e918a98SKim Phillips testdram(void) 26*5e918a98SKim Phillips { 27*5e918a98SKim Phillips uint *pstart = (uint *) CFG_MEMTEST_START; 28*5e918a98SKim Phillips uint *pend = (uint *) CFG_MEMTEST_END; 29*5e918a98SKim Phillips uint *p; 30*5e918a98SKim Phillips 31*5e918a98SKim Phillips printf("Testing DRAM from 0x%08x to 0x%08x\n", 32*5e918a98SKim Phillips CFG_MEMTEST_START, 33*5e918a98SKim Phillips CFG_MEMTEST_END); 34*5e918a98SKim Phillips 35*5e918a98SKim Phillips printf("DRAM test phase 1:\n"); 36*5e918a98SKim Phillips for (p = pstart; p < pend; p++) 37*5e918a98SKim Phillips *p = 0xaaaaaaaa; 38*5e918a98SKim Phillips 39*5e918a98SKim Phillips for (p = pstart; p < pend; p++) { 40*5e918a98SKim Phillips if (*p != 0xaaaaaaaa) { 41*5e918a98SKim Phillips printf("DRAM test fails at: %08x\n", (uint) p); 42*5e918a98SKim Phillips return 1; 43*5e918a98SKim Phillips } 44*5e918a98SKim Phillips } 45*5e918a98SKim Phillips 46*5e918a98SKim Phillips printf("DRAM test phase 2:\n"); 47*5e918a98SKim Phillips for (p = pstart; p < pend; p++) 48*5e918a98SKim Phillips *p = 0x55555555; 49*5e918a98SKim Phillips 50*5e918a98SKim Phillips for (p = pstart; p < pend; p++) { 51*5e918a98SKim Phillips if (*p != 0x55555555) { 52*5e918a98SKim Phillips printf("DRAM test fails at: %08x\n", (uint) p); 53*5e918a98SKim Phillips return 1; 54*5e918a98SKim Phillips } 55*5e918a98SKim Phillips } 56*5e918a98SKim Phillips 57*5e918a98SKim Phillips printf("DRAM test passed.\n"); 58*5e918a98SKim Phillips return 0; 59*5e918a98SKim Phillips } 60*5e918a98SKim Phillips #endif 61*5e918a98SKim Phillips 62*5e918a98SKim Phillips int board_early_init_f(void) 63*5e918a98SKim Phillips { 64*5e918a98SKim Phillips return 0; 65*5e918a98SKim Phillips } 66*5e918a98SKim Phillips 67*5e918a98SKim Phillips #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 68*5e918a98SKim Phillips void ddr_enable_ecc(unsigned int dram_size); 69*5e918a98SKim Phillips #endif 70*5e918a98SKim Phillips int fixed_sdram(void); 71*5e918a98SKim Phillips 72*5e918a98SKim Phillips long int initdram(int board_type) 73*5e918a98SKim Phillips { 74*5e918a98SKim Phillips immap_t *im = (immap_t *) CFG_IMMR; 75*5e918a98SKim Phillips u32 msize = 0; 76*5e918a98SKim Phillips 77*5e918a98SKim Phillips if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) 78*5e918a98SKim Phillips return -1; 79*5e918a98SKim Phillips 80*5e918a98SKim Phillips #if defined(CONFIG_SPD_EEPROM) 81*5e918a98SKim Phillips msize = spd_sdram(); 82*5e918a98SKim Phillips #else 83*5e918a98SKim Phillips msize = fixed_sdram(); 84*5e918a98SKim Phillips #endif 85*5e918a98SKim Phillips 86*5e918a98SKim Phillips #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 87*5e918a98SKim Phillips /* Initialize DDR ECC byte */ 88*5e918a98SKim Phillips ddr_enable_ecc(msize * 1024 * 1024); 89*5e918a98SKim Phillips #endif 90*5e918a98SKim Phillips /* return total bus DDR size(bytes) */ 91*5e918a98SKim Phillips return (msize * 1024 * 1024); 92*5e918a98SKim Phillips } 93*5e918a98SKim Phillips 94*5e918a98SKim Phillips #if !defined(CONFIG_SPD_EEPROM) 95*5e918a98SKim Phillips /************************************************************************* 96*5e918a98SKim Phillips * fixed sdram init -- doesn't use serial presence detect. 97*5e918a98SKim Phillips ************************************************************************/ 98*5e918a98SKim Phillips int fixed_sdram(void) 99*5e918a98SKim Phillips { 100*5e918a98SKim Phillips immap_t *im = (immap_t *) CFG_IMMR; 101*5e918a98SKim Phillips u32 msize = CFG_DDR_SIZE * 1024 * 1024; 102*5e918a98SKim Phillips u32 msize_log2 = __ilog2(msize); 103*5e918a98SKim Phillips 104*5e918a98SKim Phillips im->sysconf.ddrlaw[0].bar = CFG_DDR_SDRAM_BASE >> 12; 105*5e918a98SKim Phillips im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1); 106*5e918a98SKim Phillips 107*5e918a98SKim Phillips im->sysconf.ddrcdr = CFG_DDRCDR_VALUE; 108*5e918a98SKim Phillips udelay(50000); 109*5e918a98SKim Phillips 110*5e918a98SKim Phillips im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL; 111*5e918a98SKim Phillips udelay(1000); 112*5e918a98SKim Phillips 113*5e918a98SKim Phillips im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS; 114*5e918a98SKim Phillips im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG; 115*5e918a98SKim Phillips udelay(1000); 116*5e918a98SKim Phillips 117*5e918a98SKim Phillips im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0; 118*5e918a98SKim Phillips im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; 119*5e918a98SKim Phillips im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; 120*5e918a98SKim Phillips im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3; 121*5e918a98SKim Phillips im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG; 122*5e918a98SKim Phillips im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2; 123*5e918a98SKim Phillips im->ddr.sdram_mode = CFG_DDR_MODE; 124*5e918a98SKim Phillips im->ddr.sdram_mode2 = CFG_DDR_MODE2; 125*5e918a98SKim Phillips im->ddr.sdram_interval = CFG_DDR_INTERVAL; 126*5e918a98SKim Phillips sync(); 127*5e918a98SKim Phillips udelay(1000); 128*5e918a98SKim Phillips 129*5e918a98SKim Phillips im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; 130*5e918a98SKim Phillips udelay(2000); 131*5e918a98SKim Phillips return CFG_DDR_SIZE; 132*5e918a98SKim Phillips } 133*5e918a98SKim Phillips #endif /*!CFG_SPD_EEPROM */ 134*5e918a98SKim Phillips 135*5e918a98SKim Phillips int checkboard(void) 136*5e918a98SKim Phillips { 137*5e918a98SKim Phillips puts("Board: Freescale MPC837xERDB\n"); 138*5e918a98SKim Phillips return 0; 139*5e918a98SKim Phillips } 140*5e918a98SKim Phillips 141*5e918a98SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP) 142*5e918a98SKim Phillips 143*5e918a98SKim Phillips void ft_board_setup(void *blob, bd_t *bd) 144*5e918a98SKim Phillips { 145*5e918a98SKim Phillips #ifdef CONFIG_PCI 146*5e918a98SKim Phillips ft_pci_setup(blob, bd); 147*5e918a98SKim Phillips #endif 148*5e918a98SKim Phillips ft_cpu_setup(blob, bd); 149*5e918a98SKim Phillips } 150*5e918a98SKim Phillips #endif /* CONFIG_OF_BOARD_SETUP */ 151