1*415a613bSKumar Gala /* 2*415a613bSKumar Gala * Copyright 2004 Freescale Semiconductor. 3*415a613bSKumar Gala * 4*415a613bSKumar Gala * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com> 5*415a613bSKumar Gala * 6*415a613bSKumar Gala * See file CREDITS for list of people who contributed to this 7*415a613bSKumar Gala * project. 8*415a613bSKumar Gala * 9*415a613bSKumar Gala * This program is free software; you can redistribute it and/or 10*415a613bSKumar Gala * modify it under the terms of the GNU General Public License as 11*415a613bSKumar Gala * published by the Free Software Foundation; either version 2 of 12*415a613bSKumar Gala * the License, or (at your option) any later version. 13*415a613bSKumar Gala * 14*415a613bSKumar Gala * This program is distributed in the hope that it will be useful, 15*415a613bSKumar Gala * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*415a613bSKumar Gala * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*415a613bSKumar Gala * GNU General Public License for more details. 18*415a613bSKumar Gala * 19*415a613bSKumar Gala * You should have received a copy of the GNU General Public License 20*415a613bSKumar Gala * along with this program; if not, write to the Free Software 21*415a613bSKumar Gala * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 22*415a613bSKumar Gala * MA 02111-1307 USA 23*415a613bSKumar Gala */ 24*415a613bSKumar Gala 25*415a613bSKumar Gala #include <common.h> 26*415a613bSKumar Gala #include <pci.h> 27*415a613bSKumar Gala #include <asm/processor.h> 28*415a613bSKumar Gala #include <asm/immap_85xx.h> 29*415a613bSKumar Gala #include <ioports.h> 30*415a613bSKumar Gala #include <spd.h> 31*415a613bSKumar Gala #include <libfdt.h> 32*415a613bSKumar Gala #include <fdt_support.h> 33*415a613bSKumar Gala 34*415a613bSKumar Gala #include "../common/cadmus.h" 35*415a613bSKumar Gala #include "../common/eeprom.h" 36*415a613bSKumar Gala #include "../common/via.h" 37*415a613bSKumar Gala 38*415a613bSKumar Gala #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 39*415a613bSKumar Gala extern void ddr_enable_ecc(unsigned int dram_size); 40*415a613bSKumar Gala #endif 41*415a613bSKumar Gala 42*415a613bSKumar Gala extern long int spd_sdram(void); 43*415a613bSKumar Gala 44*415a613bSKumar Gala void local_bus_init(void); 45*415a613bSKumar Gala void sdram_init(void); 46*415a613bSKumar Gala 47*415a613bSKumar Gala /* 48*415a613bSKumar Gala * I/O Port configuration table 49*415a613bSKumar Gala * 50*415a613bSKumar Gala * if conf is 1, then that port pin will be configured at boot time 51*415a613bSKumar Gala * according to the five values podr/pdir/ppar/psor/pdat for that entry 52*415a613bSKumar Gala */ 53*415a613bSKumar Gala 54*415a613bSKumar Gala const iop_conf_t iop_conf_tab[4][32] = { 55*415a613bSKumar Gala 56*415a613bSKumar Gala /* Port A configuration */ 57*415a613bSKumar Gala { /* conf ppar psor pdir podr pdat */ 58*415a613bSKumar Gala /* PA31 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 TxENB */ 59*415a613bSKumar Gala /* PA30 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 TxClav */ 60*415a613bSKumar Gala /* PA29 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 TxSOC */ 61*415a613bSKumar Gala /* PA28 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 RxENB */ 62*415a613bSKumar Gala /* PA27 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 RxSOC */ 63*415a613bSKumar Gala /* PA26 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 RxClav */ 64*415a613bSKumar Gala /* PA25 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[0] */ 65*415a613bSKumar Gala /* PA24 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[1] */ 66*415a613bSKumar Gala /* PA23 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[2] */ 67*415a613bSKumar Gala /* PA22 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[3] */ 68*415a613bSKumar Gala /* PA21 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[4] */ 69*415a613bSKumar Gala /* PA20 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[5] */ 70*415a613bSKumar Gala /* PA19 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[6] */ 71*415a613bSKumar Gala /* PA18 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXD[7] */ 72*415a613bSKumar Gala /* PA17 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[7] */ 73*415a613bSKumar Gala /* PA16 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[6] */ 74*415a613bSKumar Gala /* PA15 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[5] */ 75*415a613bSKumar Gala /* PA14 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[4] */ 76*415a613bSKumar Gala /* PA13 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[3] */ 77*415a613bSKumar Gala /* PA12 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[2] */ 78*415a613bSKumar Gala /* PA11 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[1] */ 79*415a613bSKumar Gala /* PA10 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXD[0] */ 80*415a613bSKumar Gala /* PA9 */ { 0, 1, 1, 1, 0, 0 }, /* FCC1 L1TXD */ 81*415a613bSKumar Gala /* PA8 */ { 0, 1, 1, 0, 0, 0 }, /* FCC1 L1RXD */ 82*415a613bSKumar Gala /* PA7 */ { 0, 0, 0, 1, 0, 0 }, /* PA7 */ 83*415a613bSKumar Gala /* PA6 */ { 0, 1, 1, 1, 0, 0 }, /* TDM A1 L1RSYNC */ 84*415a613bSKumar Gala /* PA5 */ { 0, 0, 0, 1, 0, 0 }, /* PA5 */ 85*415a613bSKumar Gala /* PA4 */ { 0, 0, 0, 1, 0, 0 }, /* PA4 */ 86*415a613bSKumar Gala /* PA3 */ { 0, 0, 0, 1, 0, 0 }, /* PA3 */ 87*415a613bSKumar Gala /* PA2 */ { 0, 0, 0, 1, 0, 0 }, /* PA2 */ 88*415a613bSKumar Gala /* PA1 */ { 1, 0, 0, 0, 0, 0 }, /* FREERUN */ 89*415a613bSKumar Gala /* PA0 */ { 0, 0, 0, 1, 0, 0 } /* PA0 */ 90*415a613bSKumar Gala }, 91*415a613bSKumar Gala 92*415a613bSKumar Gala /* Port B configuration */ 93*415a613bSKumar Gala { /* conf ppar psor pdir podr pdat */ 94*415a613bSKumar Gala /* PB31 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TX_ER */ 95*415a613bSKumar Gala /* PB30 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RX_DV */ 96*415a613bSKumar Gala /* PB29 */ { 1, 1, 1, 1, 0, 0 }, /* FCC2 MII TX_EN */ 97*415a613bSKumar Gala /* PB28 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RX_ER */ 98*415a613bSKumar Gala /* PB27 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII COL */ 99*415a613bSKumar Gala /* PB26 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII CRS */ 100*415a613bSKumar Gala /* PB25 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[3] */ 101*415a613bSKumar Gala /* PB24 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[2] */ 102*415a613bSKumar Gala /* PB23 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[1] */ 103*415a613bSKumar Gala /* PB22 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[0] */ 104*415a613bSKumar Gala /* PB21 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[0] */ 105*415a613bSKumar Gala /* PB20 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[1] */ 106*415a613bSKumar Gala /* PB19 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[2] */ 107*415a613bSKumar Gala /* PB18 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[3] */ 108*415a613bSKumar Gala /* PB17 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:RX_DIV */ 109*415a613bSKumar Gala /* PB16 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:RX_ERR */ 110*415a613bSKumar Gala /* PB15 */ { 0, 1, 0, 1, 0, 0 }, /* FCC3:TX_ERR */ 111*415a613bSKumar Gala /* PB14 */ { 0, 1, 0, 1, 0, 0 }, /* FCC3:TX_EN */ 112*415a613bSKumar Gala /* PB13 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:COL */ 113*415a613bSKumar Gala /* PB12 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:CRS */ 114*415a613bSKumar Gala /* PB11 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:RXD */ 115*415a613bSKumar Gala /* PB10 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:RXD */ 116*415a613bSKumar Gala /* PB9 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:RXD */ 117*415a613bSKumar Gala /* PB8 */ { 0, 1, 0, 0, 0, 0 }, /* FCC3:RXD */ 118*415a613bSKumar Gala /* PB7 */ { 0, 1, 0, 1, 0, 0 }, /* FCC3:TXD */ 119*415a613bSKumar Gala /* PB6 */ { 0, 1, 0, 1, 0, 0 }, /* FCC3:TXD */ 120*415a613bSKumar Gala /* PB5 */ { 0, 1, 0, 1, 0, 0 }, /* FCC3:TXD */ 121*415a613bSKumar Gala /* PB4 */ { 0, 1, 0, 1, 0, 0 }, /* FCC3:TXD */ 122*415a613bSKumar Gala /* PB3 */ { 0, 0, 0, 0, 0, 0 }, /* pin doesn't exist */ 123*415a613bSKumar Gala /* PB2 */ { 0, 0, 0, 0, 0, 0 }, /* pin doesn't exist */ 124*415a613bSKumar Gala /* PB1 */ { 0, 0, 0, 0, 0, 0 }, /* pin doesn't exist */ 125*415a613bSKumar Gala /* PB0 */ { 0, 0, 0, 0, 0, 0 } /* pin doesn't exist */ 126*415a613bSKumar Gala }, 127*415a613bSKumar Gala 128*415a613bSKumar Gala /* Port C */ 129*415a613bSKumar Gala { /* conf ppar psor pdir podr pdat */ 130*415a613bSKumar Gala /* PC31 */ { 0, 0, 0, 1, 0, 0 }, /* PC31 */ 131*415a613bSKumar Gala /* PC30 */ { 0, 0, 0, 1, 0, 0 }, /* PC30 */ 132*415a613bSKumar Gala /* PC29 */ { 0, 1, 1, 0, 0, 0 }, /* SCC1 EN *CLSN */ 133*415a613bSKumar Gala /* PC28 */ { 0, 0, 0, 1, 0, 0 }, /* PC28 */ 134*415a613bSKumar Gala /* PC27 */ { 0, 0, 0, 1, 0, 0 }, /* UART Clock in */ 135*415a613bSKumar Gala /* PC26 */ { 0, 0, 0, 1, 0, 0 }, /* PC26 */ 136*415a613bSKumar Gala /* PC25 */ { 0, 0, 0, 1, 0, 0 }, /* PC25 */ 137*415a613bSKumar Gala /* PC24 */ { 0, 0, 0, 1, 0, 0 }, /* PC24 */ 138*415a613bSKumar Gala /* PC23 */ { 0, 1, 0, 1, 0, 0 }, /* ATMTFCLK */ 139*415a613bSKumar Gala /* PC22 */ { 0, 1, 0, 0, 0, 0 }, /* ATMRFCLK */ 140*415a613bSKumar Gala /* PC21 */ { 0, 1, 0, 0, 0, 0 }, /* SCC1 EN RXCLK */ 141*415a613bSKumar Gala /* PC20 */ { 0, 1, 0, 0, 0, 0 }, /* SCC1 EN TXCLK */ 142*415a613bSKumar Gala /* PC19 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RX_CLK CLK13 */ 143*415a613bSKumar Gala /* PC18 */ { 1, 1, 0, 0, 0, 0 }, /* FCC Tx Clock (CLK14) */ 144*415a613bSKumar Gala /* PC17 */ { 0, 0, 0, 1, 0, 0 }, /* PC17 */ 145*415a613bSKumar Gala /* PC16 */ { 0, 1, 0, 0, 0, 0 }, /* FCC Tx Clock (CLK16) */ 146*415a613bSKumar Gala /* PC15 */ { 1, 1, 0, 0, 0, 0 }, /* PC15 */ 147*415a613bSKumar Gala /* PC14 */ { 0, 1, 0, 0, 0, 0 }, /* SCC1 EN *CD */ 148*415a613bSKumar Gala /* PC13 */ { 0, 0, 0, 1, 0, 0 }, /* PC13 */ 149*415a613bSKumar Gala /* PC12 */ { 0, 1, 0, 1, 0, 0 }, /* PC12 */ 150*415a613bSKumar Gala /* PC11 */ { 0, 0, 0, 1, 0, 0 }, /* LXT971 transmit control */ 151*415a613bSKumar Gala /* PC10 */ { 1, 0, 0, 1, 0, 0 }, /* FETHMDC */ 152*415a613bSKumar Gala /* PC9 */ { 1, 0, 0, 0, 0, 0 }, /* FETHMDIO */ 153*415a613bSKumar Gala /* PC8 */ { 0, 0, 0, 1, 0, 0 }, /* PC8 */ 154*415a613bSKumar Gala /* PC7 */ { 0, 0, 0, 1, 0, 0 }, /* PC7 */ 155*415a613bSKumar Gala /* PC6 */ { 0, 0, 0, 1, 0, 0 }, /* PC6 */ 156*415a613bSKumar Gala /* PC5 */ { 0, 0, 0, 1, 0, 0 }, /* PC5 */ 157*415a613bSKumar Gala /* PC4 */ { 0, 0, 0, 1, 0, 0 }, /* PC4 */ 158*415a613bSKumar Gala /* PC3 */ { 0, 0, 0, 1, 0, 0 }, /* PC3 */ 159*415a613bSKumar Gala /* PC2 */ { 0, 0, 0, 1, 0, 1 }, /* ENET FDE */ 160*415a613bSKumar Gala /* PC1 */ { 0, 0, 0, 1, 0, 0 }, /* ENET DSQE */ 161*415a613bSKumar Gala /* PC0 */ { 0, 0, 0, 1, 0, 0 }, /* ENET LBK */ 162*415a613bSKumar Gala }, 163*415a613bSKumar Gala 164*415a613bSKumar Gala /* Port D */ 165*415a613bSKumar Gala { /* conf ppar psor pdir podr pdat */ 166*415a613bSKumar Gala /* PD31 */ { 1, 1, 0, 0, 0, 0 }, /* SCC1 EN RxD */ 167*415a613bSKumar Gala /* PD30 */ { 1, 1, 1, 1, 0, 0 }, /* SCC1 EN TxD */ 168*415a613bSKumar Gala /* PD29 */ { 1, 1, 0, 1, 0, 0 }, /* SCC1 EN TENA */ 169*415a613bSKumar Gala /* PD28 */ { 0, 1, 0, 0, 0, 0 }, /* PD28 */ 170*415a613bSKumar Gala /* PD27 */ { 0, 1, 1, 1, 0, 0 }, /* PD27 */ 171*415a613bSKumar Gala /* PD26 */ { 0, 0, 0, 1, 0, 0 }, /* PD26 */ 172*415a613bSKumar Gala /* PD25 */ { 0, 0, 0, 1, 0, 0 }, /* PD25 */ 173*415a613bSKumar Gala /* PD24 */ { 0, 0, 0, 1, 0, 0 }, /* PD24 */ 174*415a613bSKumar Gala /* PD23 */ { 0, 0, 0, 1, 0, 0 }, /* PD23 */ 175*415a613bSKumar Gala /* PD22 */ { 0, 0, 0, 1, 0, 0 }, /* PD22 */ 176*415a613bSKumar Gala /* PD21 */ { 0, 0, 0, 1, 0, 0 }, /* PD21 */ 177*415a613bSKumar Gala /* PD20 */ { 0, 0, 0, 1, 0, 0 }, /* PD20 */ 178*415a613bSKumar Gala /* PD19 */ { 0, 0, 0, 1, 0, 0 }, /* PD19 */ 179*415a613bSKumar Gala /* PD18 */ { 0, 0, 0, 1, 0, 0 }, /* PD18 */ 180*415a613bSKumar Gala /* PD17 */ { 0, 1, 0, 0, 0, 0 }, /* FCC1 ATMRXPRTY */ 181*415a613bSKumar Gala /* PD16 */ { 0, 1, 0, 1, 0, 0 }, /* FCC1 ATMTXPRTY */ 182*415a613bSKumar Gala /* PD15 */ { 0, 1, 1, 0, 1, 0 }, /* I2C SDA */ 183*415a613bSKumar Gala /* PD14 */ { 0, 0, 0, 1, 0, 0 }, /* LED */ 184*415a613bSKumar Gala /* PD13 */ { 0, 0, 0, 0, 0, 0 }, /* PD13 */ 185*415a613bSKumar Gala /* PD12 */ { 0, 0, 0, 0, 0, 0 }, /* PD12 */ 186*415a613bSKumar Gala /* PD11 */ { 0, 0, 0, 0, 0, 0 }, /* PD11 */ 187*415a613bSKumar Gala /* PD10 */ { 0, 0, 0, 0, 0, 0 }, /* PD10 */ 188*415a613bSKumar Gala /* PD9 */ { 0, 1, 0, 1, 0, 0 }, /* SMC1 TXD */ 189*415a613bSKumar Gala /* PD8 */ { 0, 1, 0, 0, 0, 0 }, /* SMC1 RXD */ 190*415a613bSKumar Gala /* PD7 */ { 0, 0, 0, 1, 0, 1 }, /* PD7 */ 191*415a613bSKumar Gala /* PD6 */ { 0, 0, 0, 1, 0, 1 }, /* PD6 */ 192*415a613bSKumar Gala /* PD5 */ { 0, 0, 0, 1, 0, 1 }, /* PD5 */ 193*415a613bSKumar Gala /* PD4 */ { 0, 0, 0, 1, 0, 1 }, /* PD4 */ 194*415a613bSKumar Gala /* PD3 */ { 0, 0, 0, 0, 0, 0 }, /* pin doesn't exist */ 195*415a613bSKumar Gala /* PD2 */ { 0, 0, 0, 0, 0, 0 }, /* pin doesn't exist */ 196*415a613bSKumar Gala /* PD1 */ { 0, 0, 0, 0, 0, 0 }, /* pin doesn't exist */ 197*415a613bSKumar Gala /* PD0 */ { 0, 0, 0, 0, 0, 0 } /* pin doesn't exist */ 198*415a613bSKumar Gala } 199*415a613bSKumar Gala }; 200*415a613bSKumar Gala 201*415a613bSKumar Gala int board_early_init_f (void) 202*415a613bSKumar Gala { 203*415a613bSKumar Gala return 0; 204*415a613bSKumar Gala } 205*415a613bSKumar Gala 206*415a613bSKumar Gala int checkboard (void) 207*415a613bSKumar Gala { 208*415a613bSKumar Gala volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); 209*415a613bSKumar Gala 210*415a613bSKumar Gala /* PCI slot in USER bits CSR[6:7] by convention. */ 211*415a613bSKumar Gala uint pci_slot = get_pci_slot (); 212*415a613bSKumar Gala 213*415a613bSKumar Gala uint pci_dual = get_pci_dual (); /* PCI DUAL in CM_PCI[3] */ 214*415a613bSKumar Gala uint pci1_32 = gur->pordevsr & 0x10000; /* PORDEVSR[15] */ 215*415a613bSKumar Gala uint pci1_clk_sel = gur->porpllsr & 0x8000; /* PORPLLSR[16] */ 216*415a613bSKumar Gala uint pci2_clk_sel = gur->porpllsr & 0x4000; /* PORPLLSR[17] */ 217*415a613bSKumar Gala 218*415a613bSKumar Gala uint pci1_speed = get_clock_freq (); /* PCI PSPEED in [4:5] */ 219*415a613bSKumar Gala 220*415a613bSKumar Gala uint cpu_board_rev = get_cpu_board_revision (); 221*415a613bSKumar Gala 222*415a613bSKumar Gala printf ("Board: CDS Version 0x%02x, PCI Slot %d\n", 223*415a613bSKumar Gala get_board_version (), pci_slot); 224*415a613bSKumar Gala 225*415a613bSKumar Gala printf ("CPU Board Revision %d.%d (0x%04x)\n", 226*415a613bSKumar Gala MPC85XX_CPU_BOARD_MAJOR (cpu_board_rev), 227*415a613bSKumar Gala MPC85XX_CPU_BOARD_MINOR (cpu_board_rev), cpu_board_rev); 228*415a613bSKumar Gala 229*415a613bSKumar Gala printf (" PCI1: %d bit, %s MHz, %s\n", 230*415a613bSKumar Gala (pci1_32) ? 32 : 64, 231*415a613bSKumar Gala (pci1_speed == 33000000) ? "33" : 232*415a613bSKumar Gala (pci1_speed == 66000000) ? "66" : "unknown", 233*415a613bSKumar Gala pci1_clk_sel ? "sync" : "async"); 234*415a613bSKumar Gala 235*415a613bSKumar Gala if (pci_dual) { 236*415a613bSKumar Gala printf (" PCI2: 32 bit, 66 MHz, %s\n", 237*415a613bSKumar Gala pci2_clk_sel ? "sync" : "async"); 238*415a613bSKumar Gala } else { 239*415a613bSKumar Gala printf (" PCI2: disabled\n"); 240*415a613bSKumar Gala } 241*415a613bSKumar Gala 242*415a613bSKumar Gala /* 243*415a613bSKumar Gala * Initialize local bus. 244*415a613bSKumar Gala */ 245*415a613bSKumar Gala local_bus_init (); 246*415a613bSKumar Gala 247*415a613bSKumar Gala return 0; 248*415a613bSKumar Gala } 249*415a613bSKumar Gala 250*415a613bSKumar Gala long int 251*415a613bSKumar Gala initdram(int board_type) 252*415a613bSKumar Gala { 253*415a613bSKumar Gala long dram_size = 0; 254*415a613bSKumar Gala 255*415a613bSKumar Gala puts("Initializing\n"); 256*415a613bSKumar Gala 257*415a613bSKumar Gala #if defined(CONFIG_DDR_DLL) 258*415a613bSKumar Gala { 259*415a613bSKumar Gala /* 260*415a613bSKumar Gala * Work around to stabilize DDR DLL MSYNC_IN. 261*415a613bSKumar Gala * Errata DDR9 seems to have been fixed. 262*415a613bSKumar Gala * This is now the workaround for Errata DDR11: 263*415a613bSKumar Gala * Override DLL = 1, Course Adj = 1, Tap Select = 0 264*415a613bSKumar Gala */ 265*415a613bSKumar Gala 266*415a613bSKumar Gala volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); 267*415a613bSKumar Gala 268*415a613bSKumar Gala gur->ddrdllcr = 0x81000000; 269*415a613bSKumar Gala asm("sync;isync;msync"); 270*415a613bSKumar Gala udelay(200); 271*415a613bSKumar Gala } 272*415a613bSKumar Gala #endif 273*415a613bSKumar Gala dram_size = spd_sdram(); 274*415a613bSKumar Gala 275*415a613bSKumar Gala #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 276*415a613bSKumar Gala /* 277*415a613bSKumar Gala * Initialize and enable DDR ECC. 278*415a613bSKumar Gala */ 279*415a613bSKumar Gala ddr_enable_ecc(dram_size); 280*415a613bSKumar Gala #endif 281*415a613bSKumar Gala /* 282*415a613bSKumar Gala * SDRAM Initialization 283*415a613bSKumar Gala */ 284*415a613bSKumar Gala sdram_init(); 285*415a613bSKumar Gala 286*415a613bSKumar Gala puts(" DDR: "); 287*415a613bSKumar Gala return dram_size; 288*415a613bSKumar Gala } 289*415a613bSKumar Gala 290*415a613bSKumar Gala /* 291*415a613bSKumar Gala * Initialize Local Bus 292*415a613bSKumar Gala */ 293*415a613bSKumar Gala void 294*415a613bSKumar Gala local_bus_init(void) 295*415a613bSKumar Gala { 296*415a613bSKumar Gala volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); 297*415a613bSKumar Gala volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); 298*415a613bSKumar Gala 299*415a613bSKumar Gala uint clkdiv; 300*415a613bSKumar Gala uint lbc_hz; 301*415a613bSKumar Gala sys_info_t sysinfo; 302*415a613bSKumar Gala uint temp_lbcdll; 303*415a613bSKumar Gala 304*415a613bSKumar Gala /* 305*415a613bSKumar Gala * Errata LBC11. 306*415a613bSKumar Gala * Fix Local Bus clock glitch when DLL is enabled. 307*415a613bSKumar Gala * 308*415a613bSKumar Gala * If localbus freq is < 66Mhz, DLL bypass mode must be used. 309*415a613bSKumar Gala * If localbus freq is > 133Mhz, DLL can be safely enabled. 310*415a613bSKumar Gala * Between 66 and 133, the DLL is enabled with an override workaround. 311*415a613bSKumar Gala */ 312*415a613bSKumar Gala 313*415a613bSKumar Gala get_sys_info(&sysinfo); 314*415a613bSKumar Gala clkdiv = lbc->lcrr & 0x0f; 315*415a613bSKumar Gala lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv; 316*415a613bSKumar Gala 317*415a613bSKumar Gala if (lbc_hz < 66) { 318*415a613bSKumar Gala lbc->lcrr |= 0x80000000; /* DLL Bypass */ 319*415a613bSKumar Gala 320*415a613bSKumar Gala } else if (lbc_hz >= 133) { 321*415a613bSKumar Gala lbc->lcrr &= (~0x80000000); /* DLL Enabled */ 322*415a613bSKumar Gala 323*415a613bSKumar Gala } else { 324*415a613bSKumar Gala lbc->lcrr &= (~0x8000000); /* DLL Enabled */ 325*415a613bSKumar Gala udelay(200); 326*415a613bSKumar Gala 327*415a613bSKumar Gala /* 328*415a613bSKumar Gala * Sample LBC DLL ctrl reg, upshift it to set the 329*415a613bSKumar Gala * override bits. 330*415a613bSKumar Gala */ 331*415a613bSKumar Gala temp_lbcdll = gur->lbcdllcr; 332*415a613bSKumar Gala gur->lbcdllcr = (((temp_lbcdll & 0xff) << 16) | 0x80000000); 333*415a613bSKumar Gala asm("sync;isync;msync"); 334*415a613bSKumar Gala } 335*415a613bSKumar Gala } 336*415a613bSKumar Gala 337*415a613bSKumar Gala /* 338*415a613bSKumar Gala * Initialize SDRAM memory on the Local Bus. 339*415a613bSKumar Gala */ 340*415a613bSKumar Gala void 341*415a613bSKumar Gala sdram_init(void) 342*415a613bSKumar Gala { 343*415a613bSKumar Gala #if defined(CFG_OR2_PRELIM) && defined(CFG_BR2_PRELIM) 344*415a613bSKumar Gala 345*415a613bSKumar Gala uint idx; 346*415a613bSKumar Gala volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); 347*415a613bSKumar Gala uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE; 348*415a613bSKumar Gala uint cpu_board_rev; 349*415a613bSKumar Gala uint lsdmr_common; 350*415a613bSKumar Gala 351*415a613bSKumar Gala puts(" SDRAM: "); 352*415a613bSKumar Gala 353*415a613bSKumar Gala print_size (CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); 354*415a613bSKumar Gala 355*415a613bSKumar Gala /* 356*415a613bSKumar Gala * Setup SDRAM Base and Option Registers 357*415a613bSKumar Gala */ 358*415a613bSKumar Gala lbc->or2 = CFG_OR2_PRELIM; 359*415a613bSKumar Gala asm("msync"); 360*415a613bSKumar Gala 361*415a613bSKumar Gala lbc->br2 = CFG_BR2_PRELIM; 362*415a613bSKumar Gala asm("msync"); 363*415a613bSKumar Gala 364*415a613bSKumar Gala lbc->lbcr = CFG_LBC_LBCR; 365*415a613bSKumar Gala asm("msync"); 366*415a613bSKumar Gala 367*415a613bSKumar Gala 368*415a613bSKumar Gala lbc->lsrt = CFG_LBC_LSRT; 369*415a613bSKumar Gala lbc->mrtpr = CFG_LBC_MRTPR; 370*415a613bSKumar Gala asm("msync"); 371*415a613bSKumar Gala 372*415a613bSKumar Gala /* 373*415a613bSKumar Gala * Determine which address lines to use baed on CPU board rev. 374*415a613bSKumar Gala */ 375*415a613bSKumar Gala cpu_board_rev = get_cpu_board_revision(); 376*415a613bSKumar Gala lsdmr_common = CFG_LBC_LSDMR_COMMON; 377*415a613bSKumar Gala if (cpu_board_rev == MPC85XX_CPU_BOARD_REV_1_0) { 378*415a613bSKumar Gala lsdmr_common |= CFG_LBC_LSDMR_BSMA1617; 379*415a613bSKumar Gala } else if (cpu_board_rev == MPC85XX_CPU_BOARD_REV_1_1) { 380*415a613bSKumar Gala lsdmr_common |= CFG_LBC_LSDMR_BSMA1516; 381*415a613bSKumar Gala } else { 382*415a613bSKumar Gala /* 383*415a613bSKumar Gala * Assume something unable to identify itself is 384*415a613bSKumar Gala * really old, and likely has lines 16/17 mapped. 385*415a613bSKumar Gala */ 386*415a613bSKumar Gala lsdmr_common |= CFG_LBC_LSDMR_BSMA1617; 387*415a613bSKumar Gala } 388*415a613bSKumar Gala 389*415a613bSKumar Gala /* 390*415a613bSKumar Gala * Issue PRECHARGE ALL command. 391*415a613bSKumar Gala */ 392*415a613bSKumar Gala lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_PCHALL; 393*415a613bSKumar Gala asm("sync;msync"); 394*415a613bSKumar Gala *sdram_addr = 0xff; 395*415a613bSKumar Gala ppcDcbf((unsigned long) sdram_addr); 396*415a613bSKumar Gala udelay(100); 397*415a613bSKumar Gala 398*415a613bSKumar Gala /* 399*415a613bSKumar Gala * Issue 8 AUTO REFRESH commands. 400*415a613bSKumar Gala */ 401*415a613bSKumar Gala for (idx = 0; idx < 8; idx++) { 402*415a613bSKumar Gala lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_ARFRSH; 403*415a613bSKumar Gala asm("sync;msync"); 404*415a613bSKumar Gala *sdram_addr = 0xff; 405*415a613bSKumar Gala ppcDcbf((unsigned long) sdram_addr); 406*415a613bSKumar Gala udelay(100); 407*415a613bSKumar Gala } 408*415a613bSKumar Gala 409*415a613bSKumar Gala /* 410*415a613bSKumar Gala * Issue 8 MODE-set command. 411*415a613bSKumar Gala */ 412*415a613bSKumar Gala lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_MRW; 413*415a613bSKumar Gala asm("sync;msync"); 414*415a613bSKumar Gala *sdram_addr = 0xff; 415*415a613bSKumar Gala ppcDcbf((unsigned long) sdram_addr); 416*415a613bSKumar Gala udelay(100); 417*415a613bSKumar Gala 418*415a613bSKumar Gala /* 419*415a613bSKumar Gala * Issue NORMAL OP command. 420*415a613bSKumar Gala */ 421*415a613bSKumar Gala lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_NORMAL; 422*415a613bSKumar Gala asm("sync;msync"); 423*415a613bSKumar Gala *sdram_addr = 0xff; 424*415a613bSKumar Gala ppcDcbf((unsigned long) sdram_addr); 425*415a613bSKumar Gala udelay(200); /* Overkill. Must wait > 200 bus cycles */ 426*415a613bSKumar Gala 427*415a613bSKumar Gala #endif /* enable SDRAM init */ 428*415a613bSKumar Gala } 429*415a613bSKumar Gala 430*415a613bSKumar Gala #if defined(CFG_DRAM_TEST) 431*415a613bSKumar Gala int 432*415a613bSKumar Gala testdram(void) 433*415a613bSKumar Gala { 434*415a613bSKumar Gala uint *pstart = (uint *) CFG_MEMTEST_START; 435*415a613bSKumar Gala uint *pend = (uint *) CFG_MEMTEST_END; 436*415a613bSKumar Gala uint *p; 437*415a613bSKumar Gala 438*415a613bSKumar Gala printf("Testing DRAM from 0x%08x to 0x%08x\n", 439*415a613bSKumar Gala CFG_MEMTEST_START, 440*415a613bSKumar Gala CFG_MEMTEST_END); 441*415a613bSKumar Gala 442*415a613bSKumar Gala printf("DRAM test phase 1:\n"); 443*415a613bSKumar Gala for (p = pstart; p < pend; p++) 444*415a613bSKumar Gala *p = 0xaaaaaaaa; 445*415a613bSKumar Gala 446*415a613bSKumar Gala for (p = pstart; p < pend; p++) { 447*415a613bSKumar Gala if (*p != 0xaaaaaaaa) { 448*415a613bSKumar Gala printf ("DRAM test fails at: %08x\n", (uint) p); 449*415a613bSKumar Gala return 1; 450*415a613bSKumar Gala } 451*415a613bSKumar Gala } 452*415a613bSKumar Gala 453*415a613bSKumar Gala printf("DRAM test phase 2:\n"); 454*415a613bSKumar Gala for (p = pstart; p < pend; p++) 455*415a613bSKumar Gala *p = 0x55555555; 456*415a613bSKumar Gala 457*415a613bSKumar Gala for (p = pstart; p < pend; p++) { 458*415a613bSKumar Gala if (*p != 0x55555555) { 459*415a613bSKumar Gala printf ("DRAM test fails at: %08x\n", (uint) p); 460*415a613bSKumar Gala return 1; 461*415a613bSKumar Gala } 462*415a613bSKumar Gala } 463*415a613bSKumar Gala 464*415a613bSKumar Gala printf("DRAM test passed.\n"); 465*415a613bSKumar Gala return 0; 466*415a613bSKumar Gala } 467*415a613bSKumar Gala #endif 468*415a613bSKumar Gala 469*415a613bSKumar Gala #if defined(CONFIG_PCI) 470*415a613bSKumar Gala /* For some reason the Tundra PCI bridge shows up on itself as a 471*415a613bSKumar Gala * different device. Work around that by refusing to configure it. 472*415a613bSKumar Gala */ 473*415a613bSKumar Gala void dummy_func(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab) { } 474*415a613bSKumar Gala 475*415a613bSKumar Gala static struct pci_config_table pci_mpc85xxcds_config_table[] = { 476*415a613bSKumar Gala {0x10e3, 0x0513, PCI_ANY_ID, 1, 3, PCI_ANY_ID, dummy_func, {0,0,0}}, 477*415a613bSKumar Gala {0x1106, 0x0686, PCI_ANY_ID, 1, VIA_ID, 0, mpc85xx_config_via, {0,0,0}}, 478*415a613bSKumar Gala {0x1106, 0x0571, PCI_ANY_ID, 1, VIA_ID, 1, 479*415a613bSKumar Gala mpc85xx_config_via_usbide, {0,0,0}}, 480*415a613bSKumar Gala {0x1105, 0x3038, PCI_ANY_ID, 1, VIA_ID, 2, 481*415a613bSKumar Gala mpc85xx_config_via_usb, {0,0,0}}, 482*415a613bSKumar Gala {0x1106, 0x3038, PCI_ANY_ID, 1, VIA_ID, 3, 483*415a613bSKumar Gala mpc85xx_config_via_usb2, {0,0,0}}, 484*415a613bSKumar Gala {0x1106, 0x3058, PCI_ANY_ID, 1, VIA_ID, 5, 485*415a613bSKumar Gala mpc85xx_config_via_power, {0,0,0}}, 486*415a613bSKumar Gala {0x1106, 0x3068, PCI_ANY_ID, 1, VIA_ID, 6, 487*415a613bSKumar Gala mpc85xx_config_via_ac97, {0,0,0}}, 488*415a613bSKumar Gala {}, 489*415a613bSKumar Gala }; 490*415a613bSKumar Gala 491*415a613bSKumar Gala static struct pci_controller hose[] = { 492*415a613bSKumar Gala { config_table: pci_mpc85xxcds_config_table,}, 493*415a613bSKumar Gala #ifdef CONFIG_MPC85XX_PCI2 494*415a613bSKumar Gala {}, 495*415a613bSKumar Gala #endif 496*415a613bSKumar Gala }; 497*415a613bSKumar Gala 498*415a613bSKumar Gala #endif /* CONFIG_PCI */ 499*415a613bSKumar Gala 500*415a613bSKumar Gala void 501*415a613bSKumar Gala pci_init_board(void) 502*415a613bSKumar Gala { 503*415a613bSKumar Gala #ifdef CONFIG_PCI 504*415a613bSKumar Gala pci_mpc85xx_init(hose); 505*415a613bSKumar Gala #endif 506*415a613bSKumar Gala } 507*415a613bSKumar Gala 508*415a613bSKumar Gala #if defined(CONFIG_OF_BOARD_SETUP) 509*415a613bSKumar Gala void 510*415a613bSKumar Gala ft_pci_setup(void *blob, bd_t *bd) 511*415a613bSKumar Gala { 512*415a613bSKumar Gala int node, tmp[2]; 513*415a613bSKumar Gala const char *path; 514*415a613bSKumar Gala 515*415a613bSKumar Gala node = fdt_path_offset(blob, "/aliases"); 516*415a613bSKumar Gala tmp[0] = 0; 517*415a613bSKumar Gala if (node >= 0) { 518*415a613bSKumar Gala #ifdef CONFIG_PCI1 519*415a613bSKumar Gala path = fdt_getprop(blob, node, "pci0", NULL); 520*415a613bSKumar Gala if (path) { 521*415a613bSKumar Gala tmp[1] = hose[0].last_busno - hose[0].first_busno; 522*415a613bSKumar Gala do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); 523*415a613bSKumar Gala } 524*415a613bSKumar Gala #endif 525*415a613bSKumar Gala #ifdef CONFIG_MPC85XX_PCI2 526*415a613bSKumar Gala path = fdt_getprop(blob, node, "pci1", NULL); 527*415a613bSKumar Gala if (path) { 528*415a613bSKumar Gala tmp[1] = hose[1].last_busno - hose[1].first_busno; 529*415a613bSKumar Gala do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); 530*415a613bSKumar Gala } 531*415a613bSKumar Gala #endif 532*415a613bSKumar Gala } 533*415a613bSKumar Gala } 534*415a613bSKumar Gala #endif 535