1*d1712369SKumar Gala /* 2*d1712369SKumar Gala * Copyright 2009-2010 Freescale Semiconductor, Inc. 3*d1712369SKumar Gala * 4*d1712369SKumar Gala * See file CREDITS for list of people who contributed to this 5*d1712369SKumar Gala * project. 6*d1712369SKumar Gala * 7*d1712369SKumar Gala * This program is free software; you can redistribute it and/or 8*d1712369SKumar Gala * modify it under the terms of the GNU General Public License as 9*d1712369SKumar Gala * published by the Free Software Foundation; either version 2 of 10*d1712369SKumar Gala * the License, or (at your option) any later version. 11*d1712369SKumar Gala * 12*d1712369SKumar Gala * This program is distributed in the hope that it will be useful, 13*d1712369SKumar Gala * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*d1712369SKumar Gala * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*d1712369SKumar Gala * GNU General Public License for more details. 16*d1712369SKumar Gala * 17*d1712369SKumar Gala * You should have received a copy of the GNU General Public License 18*d1712369SKumar Gala * along with this program; if not, write to the Free Software 19*d1712369SKumar Gala * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20*d1712369SKumar Gala * MA 02111-1307 USA 21*d1712369SKumar Gala */ 22*d1712369SKumar Gala 23*d1712369SKumar Gala #include <common.h> 24*d1712369SKumar Gala #include <command.h> 25*d1712369SKumar Gala #include <netdev.h> 26*d1712369SKumar Gala #include <asm/mmu.h> 27*d1712369SKumar Gala #include <asm/processor.h> 28*d1712369SKumar Gala #include <asm/cache.h> 29*d1712369SKumar Gala #include <asm/immap_85xx.h> 30*d1712369SKumar Gala #include <asm/fsl_law.h> 31*d1712369SKumar Gala #include <asm/fsl_ddr_sdram.h> 32*d1712369SKumar Gala #include <asm/fsl_serdes.h> 33*d1712369SKumar Gala #include <asm/fsl_portals.h> 34*d1712369SKumar Gala #include <asm/fsl_liodn.h> 35*d1712369SKumar Gala 36*d1712369SKumar Gala extern void pci_of_setup(void *blob, bd_t *bd); 37*d1712369SKumar Gala 38*d1712369SKumar Gala #include "../common/ngpixis.h" 39*d1712369SKumar Gala 40*d1712369SKumar Gala DECLARE_GLOBAL_DATA_PTR; 41*d1712369SKumar Gala 42*d1712369SKumar Gala void cpu_mp_lmb_reserve(struct lmb *lmb); 43*d1712369SKumar Gala 44*d1712369SKumar Gala int checkboard (void) 45*d1712369SKumar Gala { 46*d1712369SKumar Gala u8 sw; 47*d1712369SKumar Gala struct cpu_type *cpu = gd->cpu; 48*d1712369SKumar Gala 49*d1712369SKumar Gala printf("Board: %sDS, ", cpu->name); 50*d1712369SKumar Gala printf("Sys ID: 0x%02x, Sys Ver: 0x%02x, FPGA Ver: 0x%02x, ", 51*d1712369SKumar Gala in_8(&pixis->id), in_8(&pixis->arch), in_8(&pixis->scver)); 52*d1712369SKumar Gala 53*d1712369SKumar Gala sw = in_8(&PIXIS_SW(PIXIS_LBMAP_SWITCH)); 54*d1712369SKumar Gala sw = (sw & PIXIS_LBMAP_MASK) >> PIXIS_LBMAP_SHIFT; 55*d1712369SKumar Gala 56*d1712369SKumar Gala if (sw < 0x8) 57*d1712369SKumar Gala printf("vBank: %d\n", sw); 58*d1712369SKumar Gala else if (sw == 0x8) 59*d1712369SKumar Gala puts("Promjet\n"); 60*d1712369SKumar Gala else if (sw == 0x9) 61*d1712369SKumar Gala puts("NAND\n"); 62*d1712369SKumar Gala else 63*d1712369SKumar Gala printf("invalid setting of SW%u\n", PIXIS_LBMAP_SWITCH); 64*d1712369SKumar Gala 65*d1712369SKumar Gala #ifdef CONFIG_PHYS_64BIT 66*d1712369SKumar Gala puts("36-bit Addressing\n"); 67*d1712369SKumar Gala #endif 68*d1712369SKumar Gala 69*d1712369SKumar Gala /* Display the actual SERDES reference clocks as configured by the 70*d1712369SKumar Gala * dip switches on the board. Note that the SWx registers could 71*d1712369SKumar Gala * technically be set to force the reference clocks to match the 72*d1712369SKumar Gala * values that the SERDES expects (or vice versa). For now, however, 73*d1712369SKumar Gala * we just display both values and hope the user notices when they 74*d1712369SKumar Gala * don't match. 75*d1712369SKumar Gala */ 76*d1712369SKumar Gala puts("SERDES Reference Clocks: "); 77*d1712369SKumar Gala sw = in_8(&PIXIS_SW(3)); 78*d1712369SKumar Gala printf("Bank1=%uMHz ", (sw & 0x40) ? 125 : 100); 79*d1712369SKumar Gala printf("Bank2=%sMHz ", (sw & 0x20) ? "156.25" : "125"); 80*d1712369SKumar Gala printf("Bank3=%sMHz\n", (sw & 0x10) ? "156.25" : "125"); 81*d1712369SKumar Gala 82*d1712369SKumar Gala return 0; 83*d1712369SKumar Gala } 84*d1712369SKumar Gala 85*d1712369SKumar Gala int board_early_init_f(void) 86*d1712369SKumar Gala { 87*d1712369SKumar Gala volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 88*d1712369SKumar Gala 89*d1712369SKumar Gala /* 90*d1712369SKumar Gala * P4080 DS board only uses the DDR1_MCK0/3 and DDR2_MCK0/3 91*d1712369SKumar Gala * disable the DDR1_MCK1/2/4/5 and DDR2_MCK1/2/4/5 to reduce 92*d1712369SKumar Gala * the noise introduced by these unterminated and unused clock pairs. 93*d1712369SKumar Gala */ 94*d1712369SKumar Gala setbits_be32(&gur->ddrclkdr, 0x001B001B); 95*d1712369SKumar Gala 96*d1712369SKumar Gala return 0; 97*d1712369SKumar Gala } 98*d1712369SKumar Gala 99*d1712369SKumar Gala int board_early_init_r(void) 100*d1712369SKumar Gala { 101*d1712369SKumar Gala const unsigned int flashbase = CONFIG_SYS_FLASH_BASE; 102*d1712369SKumar Gala const u8 flash_esel = find_tlb_idx((void *)flashbase, 1); 103*d1712369SKumar Gala 104*d1712369SKumar Gala /* 105*d1712369SKumar Gala * Remap Boot flash + PROMJET region to caching-inhibited 106*d1712369SKumar Gala * so that flash can be erased properly. 107*d1712369SKumar Gala */ 108*d1712369SKumar Gala 109*d1712369SKumar Gala /* Flush d-cache and invalidate i-cache of any FLASH data */ 110*d1712369SKumar Gala flush_dcache(); 111*d1712369SKumar Gala invalidate_icache(); 112*d1712369SKumar Gala 113*d1712369SKumar Gala /* invalidate existing TLB entry for flash + promjet */ 114*d1712369SKumar Gala disable_tlb(flash_esel); 115*d1712369SKumar Gala 116*d1712369SKumar Gala set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS, /* tlb, epn, rpn */ 117*d1712369SKumar Gala MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, /* perms, wimge */ 118*d1712369SKumar Gala 0, flash_esel, BOOKE_PAGESZ_256M, 1); /* ts, esel, tsize, iprot */ 119*d1712369SKumar Gala 120*d1712369SKumar Gala set_liodns(); 121*d1712369SKumar Gala setup_portals(); 122*d1712369SKumar Gala 123*d1712369SKumar Gala #ifdef CONFIG_SRIO1 124*d1712369SKumar Gala if (is_serdes_configured(SRIO1)) { 125*d1712369SKumar Gala set_next_law(CONFIG_SYS_RIO1_MEM_PHYS, LAW_SIZE_256M, 126*d1712369SKumar Gala LAW_TRGT_IF_RIO_1); 127*d1712369SKumar Gala } else { 128*d1712369SKumar Gala printf (" SRIO1: disabled\n"); 129*d1712369SKumar Gala } 130*d1712369SKumar Gala #else 131*d1712369SKumar Gala setbits_be32(&gur->devdisr, FSL_CORENET_DEVDISR_SRIO1); /* disable */ 132*d1712369SKumar Gala #endif 133*d1712369SKumar Gala 134*d1712369SKumar Gala #ifdef CONFIG_SRIO2 135*d1712369SKumar Gala if (is_serdes_configured(SRIO2)) { 136*d1712369SKumar Gala set_next_law(CONFIG_SYS_RIO2_MEM_PHYS, LAW_SIZE_256M, 137*d1712369SKumar Gala LAW_TRGT_IF_RIO_2); 138*d1712369SKumar Gala } else { 139*d1712369SKumar Gala printf (" SRIO2: disabled\n"); 140*d1712369SKumar Gala } 141*d1712369SKumar Gala #else 142*d1712369SKumar Gala setbits_be32(&gur->devdisr, FSL_CORENET_DEVDISR_SRIO2); /* disable */ 143*d1712369SKumar Gala #endif 144*d1712369SKumar Gala 145*d1712369SKumar Gala return 0; 146*d1712369SKumar Gala } 147*d1712369SKumar Gala 148*d1712369SKumar Gala static const char *serdes_clock_to_string(u32 clock) 149*d1712369SKumar Gala { 150*d1712369SKumar Gala switch(clock) { 151*d1712369SKumar Gala case SRDS_PLLCR0_RFCK_SEL_100: 152*d1712369SKumar Gala return "100"; 153*d1712369SKumar Gala case SRDS_PLLCR0_RFCK_SEL_125: 154*d1712369SKumar Gala return "125"; 155*d1712369SKumar Gala case SRDS_PLLCR0_RFCK_SEL_156_25: 156*d1712369SKumar Gala return "156.25"; 157*d1712369SKumar Gala default: 158*d1712369SKumar Gala return "???"; 159*d1712369SKumar Gala } 160*d1712369SKumar Gala } 161*d1712369SKumar Gala 162*d1712369SKumar Gala #define NUM_SRDS_BANKS 3 163*d1712369SKumar Gala 164*d1712369SKumar Gala int misc_init_r(void) 165*d1712369SKumar Gala { 166*d1712369SKumar Gala serdes_corenet_t *srds_regs = (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR; 167*d1712369SKumar Gala u32 actual[NUM_SRDS_BANKS]; 168*d1712369SKumar Gala unsigned int i; 169*d1712369SKumar Gala u8 sw3; 170*d1712369SKumar Gala 171*d1712369SKumar Gala /* Warn if the expected SERDES reference clocks don't match the 172*d1712369SKumar Gala * actual reference clocks. This needs to be done after calling 173*d1712369SKumar Gala * p4080_erratum_serdes8(), since that function may modify the clocks. 174*d1712369SKumar Gala */ 175*d1712369SKumar Gala sw3 = in_8(&PIXIS_SW(3)); 176*d1712369SKumar Gala actual[0] = (sw3 & 0x40) ? 177*d1712369SKumar Gala SRDS_PLLCR0_RFCK_SEL_125 : SRDS_PLLCR0_RFCK_SEL_100; 178*d1712369SKumar Gala actual[1] = (sw3 & 0x20) ? 179*d1712369SKumar Gala SRDS_PLLCR0_RFCK_SEL_156_25 : SRDS_PLLCR0_RFCK_SEL_125; 180*d1712369SKumar Gala actual[2] = (sw3 & 0x10) ? 181*d1712369SKumar Gala SRDS_PLLCR0_RFCK_SEL_156_25 : SRDS_PLLCR0_RFCK_SEL_125; 182*d1712369SKumar Gala 183*d1712369SKumar Gala for (i = 0; i < NUM_SRDS_BANKS; i++) { 184*d1712369SKumar Gala u32 expected = srds_regs->bank[i].pllcr0 & SRDS_PLLCR0_RFCK_SEL_MASK; 185*d1712369SKumar Gala if (expected != actual[i]) { 186*d1712369SKumar Gala printf("Warning: SERDES bank %u expects reference clock" 187*d1712369SKumar Gala " %sMHz, but actual is %sMHz\n", i + 1, 188*d1712369SKumar Gala serdes_clock_to_string(expected), 189*d1712369SKumar Gala serdes_clock_to_string(actual[i])); 190*d1712369SKumar Gala } 191*d1712369SKumar Gala } 192*d1712369SKumar Gala 193*d1712369SKumar Gala return 0; 194*d1712369SKumar Gala } 195*d1712369SKumar Gala 196*d1712369SKumar Gala phys_size_t initdram(int board_type) 197*d1712369SKumar Gala { 198*d1712369SKumar Gala phys_size_t dram_size; 199*d1712369SKumar Gala 200*d1712369SKumar Gala puts("Initializing....\n"); 201*d1712369SKumar Gala 202*d1712369SKumar Gala dram_size = fsl_ddr_sdram(); 203*d1712369SKumar Gala 204*d1712369SKumar Gala setup_ddr_tlbs(dram_size / 0x100000); 205*d1712369SKumar Gala 206*d1712369SKumar Gala puts(" DDR: "); 207*d1712369SKumar Gala return dram_size; 208*d1712369SKumar Gala } 209*d1712369SKumar Gala 210*d1712369SKumar Gala #ifdef CONFIG_MP 211*d1712369SKumar Gala void board_lmb_reserve(struct lmb *lmb) 212*d1712369SKumar Gala { 213*d1712369SKumar Gala cpu_mp_lmb_reserve(lmb); 214*d1712369SKumar Gala } 215*d1712369SKumar Gala #endif 216*d1712369SKumar Gala 217*d1712369SKumar Gala void ft_srio_setup(void *blob) 218*d1712369SKumar Gala { 219*d1712369SKumar Gala #ifdef CONFIG_SRIO1 220*d1712369SKumar Gala if (!is_serdes_configured(SRIO1)) { 221*d1712369SKumar Gala fdt_del_node_and_alias(blob, "rio0"); 222*d1712369SKumar Gala } 223*d1712369SKumar Gala #else 224*d1712369SKumar Gala fdt_del_node_and_alias(blob, "rio0"); 225*d1712369SKumar Gala #endif 226*d1712369SKumar Gala #ifdef CONFIG_SRIO2 227*d1712369SKumar Gala if (!is_serdes_configured(SRIO2)) { 228*d1712369SKumar Gala fdt_del_node_and_alias(blob, "rio1"); 229*d1712369SKumar Gala } 230*d1712369SKumar Gala #else 231*d1712369SKumar Gala fdt_del_node_and_alias(blob, "rio1"); 232*d1712369SKumar Gala #endif 233*d1712369SKumar Gala } 234*d1712369SKumar Gala 235*d1712369SKumar Gala void ft_board_setup(void *blob, bd_t *bd) 236*d1712369SKumar Gala { 237*d1712369SKumar Gala phys_addr_t base; 238*d1712369SKumar Gala phys_size_t size; 239*d1712369SKumar Gala 240*d1712369SKumar Gala ft_cpu_setup(blob, bd); 241*d1712369SKumar Gala 242*d1712369SKumar Gala ft_srio_setup(blob); 243*d1712369SKumar Gala 244*d1712369SKumar Gala base = getenv_bootm_low(); 245*d1712369SKumar Gala size = getenv_bootm_size(); 246*d1712369SKumar Gala 247*d1712369SKumar Gala fdt_fixup_memory(blob, (u64)base, (u64)size); 248*d1712369SKumar Gala 249*d1712369SKumar Gala #ifdef CONFIG_PCI 250*d1712369SKumar Gala pci_of_setup(blob, bd); 251*d1712369SKumar Gala #endif 252*d1712369SKumar Gala 253*d1712369SKumar Gala fdt_fixup_liodn(blob); 254*d1712369SKumar Gala } 255*d1712369SKumar Gala 256*d1712369SKumar Gala int board_eth_init(bd_t *bis) 257*d1712369SKumar Gala { 258*d1712369SKumar Gala return pci_eth_init(bis); 259*d1712369SKumar Gala } 260