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> 156f8c85e8SDave Liu #include <asm/io.h> 166f8c85e8SDave 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 346f8c85e8SDave Liu #ifdef CONFIG_FSL_SERDES 356f8c85e8SDave Liu immap_t *immr = (immap_t *)CFG_IMMR; 366f8c85e8SDave Liu u32 spridr = in_be32(&immr->sysconf.spridr); 376f8c85e8SDave Liu 386f8c85e8SDave Liu /* we check only part num, and don't look for CPU revisions */ 39*e5c4ade4SKim Phillips switch (spridr) { 40*e5c4ade4SKim Phillips case SPR_8377: 416f8c85e8SDave Liu fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 426f8c85e8SDave Liu FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 436f8c85e8SDave Liu fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX, 446f8c85e8SDave Liu FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 456f8c85e8SDave Liu break; 46*e5c4ade4SKim Phillips case SPR_8378: 47*e5c4ade4SKim Phillips fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_PEX, 48*e5c4ade4SKim Phillips FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 49*e5c4ade4SKim Phillips break; 50*e5c4ade4SKim Phillips case SPR_8379: 51*e5c4ade4SKim Phillips fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 52*e5c4ade4SKim Phillips FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 53*e5c4ade4SKim Phillips fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_SATA, 54*e5c4ade4SKim Phillips FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 55*e5c4ade4SKim Phillips break; 566f8c85e8SDave Liu default: 576f8c85e8SDave Liu printf("serdes not configured: unknown CPU part number: " 586f8c85e8SDave Liu "%04x\n", spridr >> 16); 596f8c85e8SDave Liu break; 606f8c85e8SDave Liu } 616f8c85e8SDave Liu #endif /* CONFIG_FSL_SERDES */ 6219580e66SDave Liu return 0; 6319580e66SDave Liu } 6419580e66SDave Liu 6519580e66SDave Liu int board_early_init_r(void) 6619580e66SDave Liu { 6719580e66SDave Liu #ifdef CONFIG_PQ_MDS_PIB 6819580e66SDave Liu pib_init(); 6919580e66SDave Liu #endif 7019580e66SDave Liu return 0; 7119580e66SDave Liu } 7219580e66SDave Liu 7319580e66SDave Liu #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 7419580e66SDave Liu extern void ddr_enable_ecc(unsigned int dram_size); 7519580e66SDave Liu #endif 7619580e66SDave Liu int fixed_sdram(void); 7719580e66SDave Liu 7819580e66SDave Liu long int initdram(int board_type) 7919580e66SDave Liu { 8019580e66SDave Liu volatile immap_t *im = (immap_t *) CFG_IMMR; 8119580e66SDave Liu u32 msize = 0; 8219580e66SDave Liu 8319580e66SDave Liu if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) 8419580e66SDave Liu return -1; 8519580e66SDave Liu 8619580e66SDave Liu #if defined(CONFIG_SPD_EEPROM) 8719580e66SDave Liu msize = spd_sdram(); 8819580e66SDave Liu #else 8919580e66SDave Liu msize = fixed_sdram(); 9019580e66SDave Liu #endif 9119580e66SDave Liu 9219580e66SDave Liu #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 9319580e66SDave Liu /* Initialize DDR ECC byte */ 9419580e66SDave Liu ddr_enable_ecc(msize * 1024 * 1024); 9519580e66SDave Liu #endif 9619580e66SDave Liu 9719580e66SDave Liu /* return total bus DDR size(bytes) */ 9819580e66SDave Liu return (msize * 1024 * 1024); 9919580e66SDave Liu } 10019580e66SDave Liu 10119580e66SDave Liu #if !defined(CONFIG_SPD_EEPROM) 10219580e66SDave Liu /************************************************************************* 10319580e66SDave Liu * fixed sdram init -- doesn't use serial presence detect. 10419580e66SDave Liu ************************************************************************/ 10519580e66SDave Liu int fixed_sdram(void) 10619580e66SDave Liu { 10719580e66SDave Liu volatile immap_t *im = (immap_t *) CFG_IMMR; 10819580e66SDave Liu u32 msize = CFG_DDR_SIZE * 1024 * 1024; 10919580e66SDave Liu u32 msize_log2 = __ilog2(msize); 11019580e66SDave Liu 11119580e66SDave Liu im->sysconf.ddrlaw[0].bar = CFG_DDR_SDRAM_BASE >> 12; 11219580e66SDave Liu im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1); 11319580e66SDave Liu 11419580e66SDave Liu #if (CFG_DDR_SIZE != 512) 11519580e66SDave Liu #warning Currenly any ddr size other than 512 is not supported 11619580e66SDave Liu #endif 11719580e66SDave Liu im->sysconf.ddrcdr = CFG_DDRCDR_VALUE; 11819580e66SDave Liu udelay(50000); 11919580e66SDave Liu 12019580e66SDave Liu im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL; 12119580e66SDave Liu udelay(1000); 12219580e66SDave Liu 12319580e66SDave Liu im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS; 12419580e66SDave Liu im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG; 12519580e66SDave Liu udelay(1000); 12619580e66SDave Liu 12719580e66SDave Liu im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0; 12819580e66SDave Liu im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; 12919580e66SDave Liu im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; 13019580e66SDave Liu im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3; 13119580e66SDave Liu im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG; 13219580e66SDave Liu im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2; 13319580e66SDave Liu im->ddr.sdram_mode = CFG_DDR_MODE; 13419580e66SDave Liu im->ddr.sdram_mode2 = CFG_DDR_MODE2; 13519580e66SDave Liu im->ddr.sdram_interval = CFG_DDR_INTERVAL; 13619580e66SDave Liu __asm__ __volatile__("sync"); 13719580e66SDave Liu udelay(1000); 13819580e66SDave Liu 13919580e66SDave Liu im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; 14019580e66SDave Liu udelay(2000); 14119580e66SDave Liu return CFG_DDR_SIZE; 14219580e66SDave Liu } 14319580e66SDave Liu #endif /*!CFG_SPD_EEPROM */ 14419580e66SDave Liu 14519580e66SDave Liu int checkboard(void) 14619580e66SDave Liu { 14719580e66SDave Liu puts("Board: Freescale MPC837xEMDS\n"); 14819580e66SDave Liu return 0; 14919580e66SDave Liu } 15019580e66SDave Liu 15119580e66SDave Liu #if defined(CONFIG_OF_BOARD_SETUP) 15219580e66SDave Liu void ft_board_setup(void *blob, bd_t *bd) 15319580e66SDave Liu { 15419580e66SDave Liu ft_cpu_setup(blob, bd); 15519580e66SDave Liu #ifdef CONFIG_PCI 15619580e66SDave Liu ft_pci_setup(blob, bd); 15719580e66SDave Liu #endif 15819580e66SDave Liu } 15919580e66SDave Liu #endif /* CONFIG_OF_BOARD_SETUP */ 160