15e918a98SKim Phillips /* 25e918a98SKim Phillips * Copyright (C) 2007 Freescale Semiconductor, Inc. 35e918a98SKim Phillips * Kevin Lam <kevin.lam@freescale.com> 45e918a98SKim Phillips * Joe D'Abbraccio <joe.d'abbraccio@freescale.com> 55e918a98SKim Phillips * 65e918a98SKim Phillips * See file CREDITS for list of people who contributed to this 75e918a98SKim Phillips * project. 85e918a98SKim Phillips * 95e918a98SKim Phillips * This program is free software; you can redistribute it and/or 105e918a98SKim Phillips * modify it under the terms of the GNU General Public License as 115e918a98SKim Phillips * published by the Free Software Foundation; either version 2 of 125e918a98SKim Phillips * the License, or (at your option) any later version. 135e918a98SKim Phillips */ 145e918a98SKim Phillips 155e918a98SKim Phillips #include <common.h> 165e918a98SKim Phillips #include <i2c.h> 175e918a98SKim Phillips #include <asm/io.h> 18*2bd7460eSAnton Vorontsov #include <asm/fsl_serdes.h> 195e918a98SKim Phillips #include <spd_sdram.h> 2089c7784eSTimur Tabi #include <vsc7385.h> 2189c7784eSTimur Tabi 225e918a98SKim Phillips 235e918a98SKim Phillips #if defined(CFG_DRAM_TEST) 245e918a98SKim Phillips int 255e918a98SKim Phillips testdram(void) 265e918a98SKim Phillips { 275e918a98SKim Phillips uint *pstart = (uint *) CFG_MEMTEST_START; 285e918a98SKim Phillips uint *pend = (uint *) CFG_MEMTEST_END; 295e918a98SKim Phillips uint *p; 305e918a98SKim Phillips 315e918a98SKim Phillips printf("Testing DRAM from 0x%08x to 0x%08x\n", 325e918a98SKim Phillips CFG_MEMTEST_START, 335e918a98SKim Phillips CFG_MEMTEST_END); 345e918a98SKim Phillips 355e918a98SKim Phillips printf("DRAM test phase 1:\n"); 365e918a98SKim Phillips for (p = pstart; p < pend; p++) 375e918a98SKim Phillips *p = 0xaaaaaaaa; 385e918a98SKim Phillips 395e918a98SKim Phillips for (p = pstart; p < pend; p++) { 405e918a98SKim Phillips if (*p != 0xaaaaaaaa) { 415e918a98SKim Phillips printf("DRAM test fails at: %08x\n", (uint) p); 425e918a98SKim Phillips return 1; 435e918a98SKim Phillips } 445e918a98SKim Phillips } 455e918a98SKim Phillips 465e918a98SKim Phillips printf("DRAM test phase 2:\n"); 475e918a98SKim Phillips for (p = pstart; p < pend; p++) 485e918a98SKim Phillips *p = 0x55555555; 495e918a98SKim Phillips 505e918a98SKim Phillips for (p = pstart; p < pend; p++) { 515e918a98SKim Phillips if (*p != 0x55555555) { 525e918a98SKim Phillips printf("DRAM test fails at: %08x\n", (uint) p); 535e918a98SKim Phillips return 1; 545e918a98SKim Phillips } 555e918a98SKim Phillips } 565e918a98SKim Phillips 575e918a98SKim Phillips printf("DRAM test passed.\n"); 585e918a98SKim Phillips return 0; 595e918a98SKim Phillips } 605e918a98SKim Phillips #endif 615e918a98SKim Phillips 625e918a98SKim Phillips #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 635e918a98SKim Phillips void ddr_enable_ecc(unsigned int dram_size); 645e918a98SKim Phillips #endif 655e918a98SKim Phillips int fixed_sdram(void); 665e918a98SKim Phillips 675e918a98SKim Phillips long int initdram(int board_type) 685e918a98SKim Phillips { 695e918a98SKim Phillips immap_t *im = (immap_t *) CFG_IMMR; 705e918a98SKim Phillips u32 msize = 0; 715e918a98SKim Phillips 725e918a98SKim Phillips if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) 735e918a98SKim Phillips return -1; 745e918a98SKim Phillips 755e918a98SKim Phillips #if defined(CONFIG_SPD_EEPROM) 765e918a98SKim Phillips msize = spd_sdram(); 775e918a98SKim Phillips #else 785e918a98SKim Phillips msize = fixed_sdram(); 795e918a98SKim Phillips #endif 805e918a98SKim Phillips 815e918a98SKim Phillips #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) 825e918a98SKim Phillips /* Initialize DDR ECC byte */ 835e918a98SKim Phillips ddr_enable_ecc(msize * 1024 * 1024); 845e918a98SKim Phillips #endif 855e918a98SKim Phillips /* return total bus DDR size(bytes) */ 865e918a98SKim Phillips return (msize * 1024 * 1024); 875e918a98SKim Phillips } 885e918a98SKim Phillips 895e918a98SKim Phillips #if !defined(CONFIG_SPD_EEPROM) 905e918a98SKim Phillips /************************************************************************* 915e918a98SKim Phillips * fixed sdram init -- doesn't use serial presence detect. 925e918a98SKim Phillips ************************************************************************/ 935e918a98SKim Phillips int fixed_sdram(void) 945e918a98SKim Phillips { 955e918a98SKim Phillips immap_t *im = (immap_t *) CFG_IMMR; 965e918a98SKim Phillips u32 msize = CFG_DDR_SIZE * 1024 * 1024; 975e918a98SKim Phillips u32 msize_log2 = __ilog2(msize); 985e918a98SKim Phillips 995e918a98SKim Phillips im->sysconf.ddrlaw[0].bar = CFG_DDR_SDRAM_BASE >> 12; 1005e918a98SKim Phillips im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1); 1015e918a98SKim Phillips 1025e918a98SKim Phillips im->sysconf.ddrcdr = CFG_DDRCDR_VALUE; 1035e918a98SKim Phillips udelay(50000); 1045e918a98SKim Phillips 1055e918a98SKim Phillips im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL; 1065e918a98SKim Phillips udelay(1000); 1075e918a98SKim Phillips 1085e918a98SKim Phillips im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS; 1095e918a98SKim Phillips im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG; 1105e918a98SKim Phillips udelay(1000); 1115e918a98SKim Phillips 1125e918a98SKim Phillips im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0; 1135e918a98SKim Phillips im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; 1145e918a98SKim Phillips im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; 1155e918a98SKim Phillips im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3; 1165e918a98SKim Phillips im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG; 1175e918a98SKim Phillips im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2; 1185e918a98SKim Phillips im->ddr.sdram_mode = CFG_DDR_MODE; 1195e918a98SKim Phillips im->ddr.sdram_mode2 = CFG_DDR_MODE2; 1205e918a98SKim Phillips im->ddr.sdram_interval = CFG_DDR_INTERVAL; 1215e918a98SKim Phillips sync(); 1225e918a98SKim Phillips udelay(1000); 1235e918a98SKim Phillips 1245e918a98SKim Phillips im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; 1255e918a98SKim Phillips udelay(2000); 1265e918a98SKim Phillips return CFG_DDR_SIZE; 1275e918a98SKim Phillips } 1285e918a98SKim Phillips #endif /*!CFG_SPD_EEPROM */ 1295e918a98SKim Phillips 1305e918a98SKim Phillips int checkboard(void) 1315e918a98SKim Phillips { 1325e918a98SKim Phillips puts("Board: Freescale MPC837xERDB\n"); 1335e918a98SKim Phillips return 0; 1345e918a98SKim Phillips } 1355e918a98SKim Phillips 136*2bd7460eSAnton Vorontsov int board_early_init_f(void) 137*2bd7460eSAnton Vorontsov { 138*2bd7460eSAnton Vorontsov #ifdef CONFIG_FSL_SERDES 139*2bd7460eSAnton Vorontsov immap_t *immr = (immap_t *)CFG_IMMR; 140*2bd7460eSAnton Vorontsov u32 spridr = in_be32(&immr->sysconf.spridr); 141*2bd7460eSAnton Vorontsov 142*2bd7460eSAnton Vorontsov /* we check only part num, and don't look for CPU revisions */ 143*2bd7460eSAnton Vorontsov switch (spridr >> 16) { 144*2bd7460eSAnton Vorontsov case SPR_8379E_REV10 >> 16: 145*2bd7460eSAnton Vorontsov case SPR_8379_REV10 >> 16: 146*2bd7460eSAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 147*2bd7460eSAnton Vorontsov FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 148*2bd7460eSAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_SATA, 149*2bd7460eSAnton Vorontsov FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 150*2bd7460eSAnton Vorontsov break; 151*2bd7460eSAnton Vorontsov case SPR_8378E_REV10 >> 16: 152*2bd7460eSAnton Vorontsov case SPR_8378_REV10 >> 16: 153*2bd7460eSAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_PEX, 154*2bd7460eSAnton Vorontsov FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 155*2bd7460eSAnton Vorontsov break; 156*2bd7460eSAnton Vorontsov case SPR_8377E_REV10 >> 16: 157*2bd7460eSAnton Vorontsov case SPR_8377_REV10 >> 16: 158*2bd7460eSAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 159*2bd7460eSAnton Vorontsov FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 160*2bd7460eSAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX, 161*2bd7460eSAnton Vorontsov FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 162*2bd7460eSAnton Vorontsov break; 163*2bd7460eSAnton Vorontsov default: 164*2bd7460eSAnton Vorontsov printf("serdes not configured: unknown CPU part number: " 165*2bd7460eSAnton Vorontsov "%04x\n", spridr >> 16); 166*2bd7460eSAnton Vorontsov break; 167*2bd7460eSAnton Vorontsov } 168*2bd7460eSAnton Vorontsov #endif /* CONFIG_FSL_SERDES */ 169*2bd7460eSAnton Vorontsov return 0; 170*2bd7460eSAnton Vorontsov } 171*2bd7460eSAnton Vorontsov 17289c7784eSTimur Tabi /* 17389c7784eSTimur Tabi * Miscellaneous late-boot configurations 17489c7784eSTimur Tabi * 17589c7784eSTimur Tabi * If a VSC7385 microcode image is present, then upload it. 17689c7784eSTimur Tabi */ 17789c7784eSTimur Tabi int misc_init_r(void) 17889c7784eSTimur Tabi { 17989c7784eSTimur Tabi int rc = 0; 18089c7784eSTimur Tabi 18189c7784eSTimur Tabi #ifdef CONFIG_VSC7385_IMAGE 18289c7784eSTimur Tabi if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE, 18389c7784eSTimur Tabi CONFIG_VSC7385_IMAGE_SIZE)) { 18489c7784eSTimur Tabi puts("Failure uploading VSC7385 microcode.\n"); 18589c7784eSTimur Tabi rc = 1; 18689c7784eSTimur Tabi } 18789c7784eSTimur Tabi #endif 18889c7784eSTimur Tabi 18989c7784eSTimur Tabi return rc; 19089c7784eSTimur Tabi } 19189c7784eSTimur Tabi 1925e918a98SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP) 1935e918a98SKim Phillips 1945e918a98SKim Phillips void ft_board_setup(void *blob, bd_t *bd) 1955e918a98SKim Phillips { 1965e918a98SKim Phillips #ifdef CONFIG_PCI 1975e918a98SKim Phillips ft_pci_setup(blob, bd); 1985e918a98SKim Phillips #endif 1995e918a98SKim Phillips ft_cpu_setup(blob, bd); 2005e918a98SKim Phillips } 2015e918a98SKim Phillips #endif /* CONFIG_OF_BOARD_SETUP */ 202