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> 182bd7460eSAnton Vorontsov #include <asm/fsl_serdes.h> 191ac4f320SJean-Christophe PLAGNIOL-VILLARD #include <fdt_support.h> 205e918a98SKim Phillips #include <spd_sdram.h> 2189c7784eSTimur Tabi #include <vsc7385.h> 2289c7784eSTimur Tabi 236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_DRAM_TEST) 245e918a98SKim Phillips int 255e918a98SKim Phillips testdram(void) 265e918a98SKim Phillips { 276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START; 286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD uint *pend = (uint *) CONFIG_SYS_MEMTEST_END; 295e918a98SKim Phillips uint *p; 305e918a98SKim Phillips 315e918a98SKim Phillips printf("Testing DRAM from 0x%08x to 0x%08x\n", 326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_MEMTEST_START, 336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_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 679973e3c6SBecky Bruce phys_size_t initdram(int board_type) 685e918a98SKim Phillips { 696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD immap_t *im = (immap_t *) CONFIG_SYS_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 { 956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD immap_t *im = (immap_t *) CONFIG_SYS_IMMR; 966d0f6bcfSJean-Christophe PLAGNIOL-VILLARD u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024; 975e918a98SKim Phillips u32 msize_log2 = __ilog2(msize); 985e918a98SKim Phillips 996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000; 1005e918a98SKim Phillips im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1); 1015e918a98SKim Phillips 1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->sysconf.ddrcdr = CONFIG_SYS_DDRCDR_VALUE; 1035e918a98SKim Phillips udelay(50000); 1045e918a98SKim Phillips 1056d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_SDRAM_CLK_CNTL; 1065e918a98SKim Phillips udelay(1000); 1075e918a98SKim Phillips 1086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.csbnds[0].csbnds = CONFIG_SYS_DDR_CS0_BNDS; 1096d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG; 1105e918a98SKim Phillips udelay(1000); 1115e918a98SKim Phillips 1126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0; 1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1; 1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2; 1156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3; 1166d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_cfg = CONFIG_SYS_DDR_SDRAM_CFG; 1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_cfg2 = CONFIG_SYS_DDR_SDRAM_CFG2; 1186d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_mode = CONFIG_SYS_DDR_MODE; 1196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_mode2 = CONFIG_SYS_DDR_MODE2; 1206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD im->ddr.sdram_interval = CONFIG_SYS_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); 1266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD return CONFIG_SYS_DDR_SIZE; 1275e918a98SKim Phillips } 1286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif /*!CONFIG_SYS_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 1362bd7460eSAnton Vorontsov int board_early_init_f(void) 1372bd7460eSAnton Vorontsov { 1382bd7460eSAnton Vorontsov #ifdef CONFIG_FSL_SERDES 1396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; 1402bd7460eSAnton Vorontsov u32 spridr = in_be32(&immr->sysconf.spridr); 1412bd7460eSAnton Vorontsov 1422bd7460eSAnton Vorontsov /* we check only part num, and don't look for CPU revisions */ 143e5c4ade4SKim Phillips switch (PARTID_NO_E(spridr)) { 144e5c4ade4SKim Phillips case SPR_8377: 1452bd7460eSAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 1462bd7460eSAnton Vorontsov FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 1472bd7460eSAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX, 1482bd7460eSAnton Vorontsov FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 1492bd7460eSAnton Vorontsov break; 150e5c4ade4SKim Phillips case SPR_8378: 151*55c53198SAnton Vorontsov fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX, 152e5c4ade4SKim Phillips FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 153e5c4ade4SKim Phillips break; 154e5c4ade4SKim Phillips case SPR_8379: 155e5c4ade4SKim Phillips fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA, 156e5c4ade4SKim Phillips FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 157e5c4ade4SKim Phillips fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_SATA, 158e5c4ade4SKim Phillips FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 159e5c4ade4SKim Phillips break; 1602bd7460eSAnton Vorontsov default: 1612bd7460eSAnton Vorontsov printf("serdes not configured: unknown CPU part number: " 1622bd7460eSAnton Vorontsov "%04x\n", spridr >> 16); 1632bd7460eSAnton Vorontsov break; 1642bd7460eSAnton Vorontsov } 1652bd7460eSAnton Vorontsov #endif /* CONFIG_FSL_SERDES */ 1662bd7460eSAnton Vorontsov return 0; 1672bd7460eSAnton Vorontsov } 1682bd7460eSAnton Vorontsov 16989c7784eSTimur Tabi /* 17089c7784eSTimur Tabi * Miscellaneous late-boot configurations 17189c7784eSTimur Tabi * 17289c7784eSTimur Tabi * If a VSC7385 microcode image is present, then upload it. 17389c7784eSTimur Tabi */ 17489c7784eSTimur Tabi int misc_init_r(void) 17589c7784eSTimur Tabi { 17689c7784eSTimur Tabi int rc = 0; 17789c7784eSTimur Tabi 17889c7784eSTimur Tabi #ifdef CONFIG_VSC7385_IMAGE 17989c7784eSTimur Tabi if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE, 18089c7784eSTimur Tabi CONFIG_VSC7385_IMAGE_SIZE)) { 18189c7784eSTimur Tabi puts("Failure uploading VSC7385 microcode.\n"); 18289c7784eSTimur Tabi rc = 1; 18389c7784eSTimur Tabi } 18489c7784eSTimur Tabi #endif 18589c7784eSTimur Tabi 18689c7784eSTimur Tabi return rc; 18789c7784eSTimur Tabi } 18889c7784eSTimur Tabi 1895e918a98SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP) 1905e918a98SKim Phillips 1915e918a98SKim Phillips void ft_board_setup(void *blob, bd_t *bd) 1925e918a98SKim Phillips { 1935e918a98SKim Phillips #ifdef CONFIG_PCI 1945e918a98SKim Phillips ft_pci_setup(blob, bd); 1955e918a98SKim Phillips #endif 1965e918a98SKim Phillips ft_cpu_setup(blob, bd); 19718e69a35SAnton Vorontsov fdt_fixup_dr_usb(blob, bd); 1985e918a98SKim Phillips } 1995e918a98SKim Phillips #endif /* CONFIG_OF_BOARD_SETUP */ 200