119580e66SDave Liu /* 219580e66SDave Liu * Copyright (C) 2007 Freescale Semiconductor, Inc. 319580e66SDave Liu * Dave Liu <daveliu@freescale.com> 419580e66SDave Liu * 519580e66SDave Liu * CREDITS: Kim Phillips contribute to LIBFDT code 619580e66SDave Liu * 719580e66SDave Liu * This program is free software; you can redistribute it and/or 819580e66SDave Liu * modify it under the terms of the GNU General Public License as 919580e66SDave Liu * published by the Free Software Foundation; either version 2 of 1019580e66SDave Liu * the License, or (at your option) any later version. 1119580e66SDave Liu */ 1219580e66SDave Liu 1319580e66SDave Liu #include <common.h> 1419580e66SDave Liu #include <i2c.h> 15*6f8c85e8SDave Liu #include <asm/io.h> 16*6f8c85e8SDave Liu #include <asm/fsl_serdes.h> 1719580e66SDave Liu #include <spd_sdram.h> 18b3458d2cSKim Phillips #if defined(CONFIG_OF_LIBFDT) 1919580e66SDave Liu #include <libfdt.h> 2019580e66SDave Liu #endif 2119580e66SDave Liu #if defined(CONFIG_PQ_MDS_PIB) 2219580e66SDave Liu #include "../common/pq-mds-pib.h" 2319580e66SDave Liu #endif 2419580e66SDave Liu 2519580e66SDave Liu int board_early_init_f(void) 2619580e66SDave Liu { 2719580e66SDave Liu u8 *bcsr = (u8 *)CFG_BCSR; 2819580e66SDave Liu 2919580e66SDave Liu /* Enable flash write */ 3019580e66SDave Liu bcsr[0x9] &= ~0x04; 3119580e66SDave Liu /* Clear all of the interrupt of BCSR */ 3219580e66SDave Liu bcsr[0xe] = 0xff; 3319580e66SDave Liu 34*6f8c85e8SDave Liu #ifdef CONFIG_FSL_SERDES 35*6f8c85e8SDave Liu immap_t *immr = (immap_t *)CFG_IMMR; 36*6f8c85e8SDave Liu u32 spridr = in_be32(&immr->sysconf.spridr); 37*6f8c85e8SDave Liu 38*6f8c85e8SDave Liu /* we check only part num, and don't look for CPU revisions */ 39*6f8c85e8SDave Liu switch (spridr >> 16) { 40*6f8c85e8SDave Liu case SPR_8379E_REV10 >> 16: 41*6f8c85e8SDave Liu case SPR_8379_REV10 >> 16: 42*6f8c85e8SDave Liu fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 43*6f8c85e8SDave Liu FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 44*6f8c85e8SDave Liu fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_SATA, 45*6f8c85e8SDave Liu FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 46*6f8c85e8SDave Liu break; 47*6f8c85e8SDave Liu case SPR_8378E_REV10 >> 16: 48*6f8c85e8SDave Liu case SPR_8378_REV10 >> 16: 49*6f8c85e8SDave Liu fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_PEX, 50*6f8c85e8SDave Liu FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 51*6f8c85e8SDave Liu break; 52*6f8c85e8SDave Liu case SPR_8377E_REV10 >> 16: 53*6f8c85e8SDave Liu case SPR_8377_REV10 >> 16: 54*6f8c85e8SDave Liu fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 55*6f8c85e8SDave Liu FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 56*6f8c85e8SDave Liu fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX, 57*6f8c85e8SDave Liu FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 58*6f8c85e8SDave Liu break; 59*6f8c85e8SDave Liu default: 60*6f8c85e8SDave Liu printf("serdes not configured: unknown CPU part number: " 61*6f8c85e8SDave Liu "%04x\n", spridr >> 16); 62*6f8c85e8SDave Liu break; 63*6f8c85e8SDave Liu } 64*6f8c85e8SDave Liu #endif /* CONFIG_FSL_SERDES */ 6519580e66SDave Liu return 0; 6619580e66SDave Liu } 6719580e66SDave Liu 6819580e66SDave Liu int board_early_init_r(void) 6919580e66SDave Liu { 7019580e66SDave Liu #ifdef CONFIG_PQ_MDS_PIB 7119580e66SDave Liu pib_init(); 7219580e66SDave Liu #endif 7319580e66SDave Liu return 0; 7419580e66SDave Liu } 7519580e66SDave Liu 7619580e66SDave Liu #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 7719580e66SDave Liu extern void ddr_enable_ecc(unsigned int dram_size); 7819580e66SDave Liu #endif 7919580e66SDave Liu int fixed_sdram(void); 8019580e66SDave Liu 8119580e66SDave Liu long int initdram(int board_type) 8219580e66SDave Liu { 8319580e66SDave Liu volatile immap_t *im = (immap_t *) CFG_IMMR; 8419580e66SDave Liu u32 msize = 0; 8519580e66SDave Liu 8619580e66SDave Liu if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) 8719580e66SDave Liu return -1; 8819580e66SDave Liu 8919580e66SDave Liu #if defined(CONFIG_SPD_EEPROM) 9019580e66SDave Liu msize = spd_sdram(); 9119580e66SDave Liu #else 9219580e66SDave Liu msize = fixed_sdram(); 9319580e66SDave Liu #endif 9419580e66SDave Liu 9519580e66SDave Liu #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 9619580e66SDave Liu /* Initialize DDR ECC byte */ 9719580e66SDave Liu ddr_enable_ecc(msize * 1024 * 1024); 9819580e66SDave Liu #endif 9919580e66SDave Liu 10019580e66SDave Liu /* return total bus DDR size(bytes) */ 10119580e66SDave Liu return (msize * 1024 * 1024); 10219580e66SDave Liu } 10319580e66SDave Liu 10419580e66SDave Liu #if !defined(CONFIG_SPD_EEPROM) 10519580e66SDave Liu /************************************************************************* 10619580e66SDave Liu * fixed sdram init -- doesn't use serial presence detect. 10719580e66SDave Liu ************************************************************************/ 10819580e66SDave Liu int fixed_sdram(void) 10919580e66SDave Liu { 11019580e66SDave Liu volatile immap_t *im = (immap_t *) CFG_IMMR; 11119580e66SDave Liu u32 msize = CFG_DDR_SIZE * 1024 * 1024; 11219580e66SDave Liu u32 msize_log2 = __ilog2(msize); 11319580e66SDave Liu 11419580e66SDave Liu im->sysconf.ddrlaw[0].bar = CFG_DDR_SDRAM_BASE >> 12; 11519580e66SDave Liu im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1); 11619580e66SDave Liu 11719580e66SDave Liu #if (CFG_DDR_SIZE != 512) 11819580e66SDave Liu #warning Currenly any ddr size other than 512 is not supported 11919580e66SDave Liu #endif 12019580e66SDave Liu im->sysconf.ddrcdr = CFG_DDRCDR_VALUE; 12119580e66SDave Liu udelay(50000); 12219580e66SDave Liu 12319580e66SDave Liu im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL; 12419580e66SDave Liu udelay(1000); 12519580e66SDave Liu 12619580e66SDave Liu im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS; 12719580e66SDave Liu im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG; 12819580e66SDave Liu udelay(1000); 12919580e66SDave Liu 13019580e66SDave Liu im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0; 13119580e66SDave Liu im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; 13219580e66SDave Liu im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; 13319580e66SDave Liu im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3; 13419580e66SDave Liu im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG; 13519580e66SDave Liu im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2; 13619580e66SDave Liu im->ddr.sdram_mode = CFG_DDR_MODE; 13719580e66SDave Liu im->ddr.sdram_mode2 = CFG_DDR_MODE2; 13819580e66SDave Liu im->ddr.sdram_interval = CFG_DDR_INTERVAL; 13919580e66SDave Liu __asm__ __volatile__("sync"); 14019580e66SDave Liu udelay(1000); 14119580e66SDave Liu 14219580e66SDave Liu im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; 14319580e66SDave Liu udelay(2000); 14419580e66SDave Liu return CFG_DDR_SIZE; 14519580e66SDave Liu } 14619580e66SDave Liu #endif /*!CFG_SPD_EEPROM */ 14719580e66SDave Liu 14819580e66SDave Liu int checkboard(void) 14919580e66SDave Liu { 15019580e66SDave Liu puts("Board: Freescale MPC837xEMDS\n"); 15119580e66SDave Liu return 0; 15219580e66SDave Liu } 15319580e66SDave Liu 15419580e66SDave Liu #if defined(CONFIG_OF_BOARD_SETUP) 15519580e66SDave Liu void ft_board_setup(void *blob, bd_t *bd) 15619580e66SDave Liu { 15719580e66SDave Liu ft_cpu_setup(blob, bd); 15819580e66SDave Liu #ifdef CONFIG_PCI 15919580e66SDave Liu ft_pci_setup(blob, bd); 16019580e66SDave Liu #endif 16119580e66SDave Liu } 16219580e66SDave Liu #endif /* CONFIG_OF_BOARD_SETUP */ 163