1*765547dcSHaiying Wang /* 2*765547dcSHaiying Wang * Copyright 2009 Freescale Semiconductor. 3*765547dcSHaiying Wang * 4*765547dcSHaiying Wang * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com> 5*765547dcSHaiying Wang * 6*765547dcSHaiying Wang * See file CREDITS for list of people who contributed to this 7*765547dcSHaiying Wang * project. 8*765547dcSHaiying Wang * 9*765547dcSHaiying Wang * This program is free software; you can redistribute it and/or 10*765547dcSHaiying Wang * modify it under the terms of the GNU General Public License as 11*765547dcSHaiying Wang * published by the Free Software Foundation; either version 2 of 12*765547dcSHaiying Wang * the License, or (at your option) any later version. 13*765547dcSHaiying Wang * 14*765547dcSHaiying Wang * This program is distributed in the hope that it will be useful, 15*765547dcSHaiying Wang * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*765547dcSHaiying Wang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*765547dcSHaiying Wang * GNU General Public License for more details. 18*765547dcSHaiying Wang * 19*765547dcSHaiying Wang * You should have received a copy of the GNU General Public License 20*765547dcSHaiying Wang * along with this program; if not, write to the Free Software 21*765547dcSHaiying Wang * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 22*765547dcSHaiying Wang * MA 02111-1307 USA 23*765547dcSHaiying Wang */ 24*765547dcSHaiying Wang 25*765547dcSHaiying Wang #include <common.h> 26*765547dcSHaiying Wang #include <pci.h> 27*765547dcSHaiying Wang #include <asm/processor.h> 28*765547dcSHaiying Wang #include <asm/mmu.h> 29*765547dcSHaiying Wang #include <asm/immap_85xx.h> 30*765547dcSHaiying Wang #include <asm/immap_fsl_pci.h> 31*765547dcSHaiying Wang #include <asm/fsl_ddr_sdram.h> 32*765547dcSHaiying Wang #include <asm/io.h> 33*765547dcSHaiying Wang #include <spd_sdram.h> 34*765547dcSHaiying Wang #include <i2c.h> 35*765547dcSHaiying Wang #include <ioports.h> 36*765547dcSHaiying Wang #include <libfdt.h> 37*765547dcSHaiying Wang #include <fdt_support.h> 38*765547dcSHaiying Wang 39*765547dcSHaiying Wang #include "bcsr.h" 40*765547dcSHaiying Wang 41*765547dcSHaiying Wang phys_size_t fixed_sdram(void); 42*765547dcSHaiying Wang 43*765547dcSHaiying Wang const qe_iop_conf_t qe_iop_conf_tab[] = { 44*765547dcSHaiying Wang /* QE_MUX_MDC */ 45*765547dcSHaiying Wang {2, 31, 1, 0, 1}, /* QE_MUX_MDC */ 46*765547dcSHaiying Wang 47*765547dcSHaiying Wang /* QE_MUX_MDIO */ 48*765547dcSHaiying Wang {2, 30, 3, 0, 2}, /* QE_MUX_MDIO */ 49*765547dcSHaiying Wang 50*765547dcSHaiying Wang /* UCC_1_RGMII */ 51*765547dcSHaiying Wang {2, 11, 2, 0, 1}, /* CLK12 */ 52*765547dcSHaiying Wang {0, 0, 1, 0, 3}, /* ENET1_TXD0_SER1_TXD0 */ 53*765547dcSHaiying Wang {0, 1, 1, 0, 3}, /* ENET1_TXD1_SER1_TXD1 */ 54*765547dcSHaiying Wang {0, 2, 1, 0, 1}, /* ENET1_TXD2_SER1_TXD2 */ 55*765547dcSHaiying Wang {0, 3, 1, 0, 2}, /* ENET1_TXD3_SER1_TXD3 */ 56*765547dcSHaiying Wang {0, 6, 2, 0, 3}, /* ENET1_RXD0_SER1_RXD0 */ 57*765547dcSHaiying Wang {0, 7, 2, 0, 1}, /* ENET1_RXD1_SER1_RXD1 */ 58*765547dcSHaiying Wang {0, 8, 2, 0, 2}, /* ENET1_RXD2_SER1_RXD2 */ 59*765547dcSHaiying Wang {0, 9, 2, 0, 2}, /* ENET1_RXD3_SER1_RXD3 */ 60*765547dcSHaiying Wang {0, 4, 1, 0, 2}, /* ENET1_TX_EN_SER1_RTS_B */ 61*765547dcSHaiying Wang {0, 12, 2, 0, 3}, /* ENET1_RX_DV_SER1_CTS_B */ 62*765547dcSHaiying Wang {2, 8, 2, 0, 1}, /* ENET1_GRXCLK */ 63*765547dcSHaiying Wang {2, 20, 1, 0, 2}, /* ENET1_GTXCLK */ 64*765547dcSHaiying Wang 65*765547dcSHaiying Wang /* UCC_2_RGMII */ 66*765547dcSHaiying Wang {2, 16, 2, 0, 3}, /* CLK17 */ 67*765547dcSHaiying Wang {0, 14, 1, 0, 2}, /* ENET2_TXD0_SER2_TXD0 */ 68*765547dcSHaiying Wang {0, 15, 1, 0, 2}, /* ENET2_TXD1_SER2_TXD1 */ 69*765547dcSHaiying Wang {0, 16, 1, 0, 1}, /* ENET2_TXD2_SER2_TXD2 */ 70*765547dcSHaiying Wang {0, 17, 1, 0, 1}, /* ENET2_TXD3_SER2_TXD3 */ 71*765547dcSHaiying Wang {0, 20, 2, 0, 2}, /* ENET2_RXD0_SER2_RXD0 */ 72*765547dcSHaiying Wang {0, 21, 2, 0, 1}, /* ENET2_RXD1_SER2_RXD1 */ 73*765547dcSHaiying Wang {0, 22, 2, 0, 1}, /* ENET2_RXD2_SER2_RXD2 */ 74*765547dcSHaiying Wang {0, 23, 2, 0, 1}, /* ENET2_RXD3_SER2_RXD3 */ 75*765547dcSHaiying Wang {0, 18, 1, 0, 2}, /* ENET2_TX_EN_SER2_RTS_B */ 76*765547dcSHaiying Wang {0, 26, 2, 0, 3}, /* ENET2_RX_DV_SER2_CTS_B */ 77*765547dcSHaiying Wang {2, 3, 2, 0, 1}, /* ENET2_GRXCLK */ 78*765547dcSHaiying Wang {2, 2, 1, 0, 2}, /* ENET2_GTXCLK */ 79*765547dcSHaiying Wang 80*765547dcSHaiying Wang {0, 0, 0, 0, QE_IOP_TAB_END} /* END of table */ 81*765547dcSHaiying Wang }; 82*765547dcSHaiying Wang 83*765547dcSHaiying Wang void local_bus_init(void); 84*765547dcSHaiying Wang 85*765547dcSHaiying Wang int board_early_init_f (void) 86*765547dcSHaiying Wang { 87*765547dcSHaiying Wang /* 88*765547dcSHaiying Wang * Initialize local bus. 89*765547dcSHaiying Wang */ 90*765547dcSHaiying Wang local_bus_init (); 91*765547dcSHaiying Wang 92*765547dcSHaiying Wang enable_8569mds_flash_write(); 93*765547dcSHaiying Wang 94*765547dcSHaiying Wang #ifdef CONFIG_QE 95*765547dcSHaiying Wang enable_8569mds_qe_mdio(); 96*765547dcSHaiying Wang #endif 97*765547dcSHaiying Wang 98*765547dcSHaiying Wang #if CONFIG_SYS_I2C2_OFFSET 99*765547dcSHaiying Wang /* Enable I2C2 signals instead of SD signals */ 100*765547dcSHaiying Wang volatile struct ccsr_gur *gur; 101*765547dcSHaiying Wang gur = (struct ccsr_gur *)(CONFIG_SYS_IMMR + 0xe0000); 102*765547dcSHaiying Wang gur->plppar1 &= ~PLPPAR1_I2C_BIT_MASK; 103*765547dcSHaiying Wang gur->plppar1 |= PLPPAR1_I2C2_VAL; 104*765547dcSHaiying Wang gur->plpdir1 &= ~PLPDIR1_I2C_BIT_MASK; 105*765547dcSHaiying Wang gur->plpdir1 |= PLPDIR1_I2C2_VAL; 106*765547dcSHaiying Wang 107*765547dcSHaiying Wang disable_8569mds_brd_eeprom_write_protect(); 108*765547dcSHaiying Wang #endif 109*765547dcSHaiying Wang 110*765547dcSHaiying Wang return 0; 111*765547dcSHaiying Wang } 112*765547dcSHaiying Wang 113*765547dcSHaiying Wang int checkboard (void) 114*765547dcSHaiying Wang { 115*765547dcSHaiying Wang printf ("Board: 8569 MDS\n"); 116*765547dcSHaiying Wang 117*765547dcSHaiying Wang return 0; 118*765547dcSHaiying Wang } 119*765547dcSHaiying Wang 120*765547dcSHaiying Wang phys_size_t 121*765547dcSHaiying Wang initdram(int board_type) 122*765547dcSHaiying Wang { 123*765547dcSHaiying Wang long dram_size = 0; 124*765547dcSHaiying Wang 125*765547dcSHaiying Wang puts("Initializing\n"); 126*765547dcSHaiying Wang 127*765547dcSHaiying Wang #if defined(CONFIG_DDR_DLL) 128*765547dcSHaiying Wang /* 129*765547dcSHaiying Wang * Work around to stabilize DDR DLL MSYNC_IN. 130*765547dcSHaiying Wang * Errata DDR9 seems to have been fixed. 131*765547dcSHaiying Wang * This is now the workaround for Errata DDR11: 132*765547dcSHaiying Wang * Override DLL = 1, Course Adj = 1, Tap Select = 0 133*765547dcSHaiying Wang */ 134*765547dcSHaiying Wang volatile ccsr_gur_t *gur = 135*765547dcSHaiying Wang (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 136*765547dcSHaiying Wang 137*765547dcSHaiying Wang out_be32(&gur->ddrdllcr, 0x81000000); 138*765547dcSHaiying Wang udelay(200); 139*765547dcSHaiying Wang #endif 140*765547dcSHaiying Wang 141*765547dcSHaiying Wang #ifdef CONFIG_SPD_EEPROM 142*765547dcSHaiying Wang dram_size = fsl_ddr_sdram(); 143*765547dcSHaiying Wang #else 144*765547dcSHaiying Wang dram_size = fixed_sdram(); 145*765547dcSHaiying Wang #endif 146*765547dcSHaiying Wang 147*765547dcSHaiying Wang dram_size = setup_ddr_tlbs(dram_size / 0x100000); 148*765547dcSHaiying Wang dram_size *= 0x100000; 149*765547dcSHaiying Wang 150*765547dcSHaiying Wang puts(" DDR: "); 151*765547dcSHaiying Wang return dram_size; 152*765547dcSHaiying Wang } 153*765547dcSHaiying Wang 154*765547dcSHaiying Wang #if !defined(CONFIG_SPD_EEPROM) 155*765547dcSHaiying Wang phys_size_t fixed_sdram(void) 156*765547dcSHaiying Wang { 157*765547dcSHaiying Wang volatile ccsr_ddr_t *ddr = (ccsr_ddr_t *)CONFIG_SYS_MPC85xx_DDR_ADDR; 158*765547dcSHaiying Wang uint d_init; 159*765547dcSHaiying Wang 160*765547dcSHaiying Wang out_be32(&ddr->cs0_bnds, CONFIG_SYS_DDR_CS0_BNDS); 161*765547dcSHaiying Wang out_be32(&ddr->cs0_config, CONFIG_SYS_DDR_CS0_CONFIG); 162*765547dcSHaiying Wang out_be32(&ddr->timing_cfg_3, CONFIG_SYS_DDR_TIMING_3); 163*765547dcSHaiying Wang out_be32(&ddr->timing_cfg_0, CONFIG_SYS_DDR_TIMING_0); 164*765547dcSHaiying Wang out_be32(&ddr->timing_cfg_1, CONFIG_SYS_DDR_TIMING_1); 165*765547dcSHaiying Wang out_be32(&ddr->timing_cfg_2, CONFIG_SYS_DDR_TIMING_2); 166*765547dcSHaiying Wang out_be32(&ddr->sdram_cfg, CONFIG_SYS_DDR_SDRAM_CFG); 167*765547dcSHaiying Wang out_be32(&ddr->sdram_cfg_2, CONFIG_SYS_DDR_SDRAM_CFG_2); 168*765547dcSHaiying Wang out_be32(&ddr->sdram_mode, CONFIG_SYS_DDR_SDRAM_MODE); 169*765547dcSHaiying Wang out_be32(&ddr->sdram_mode_2, CONFIG_SYS_DDR_SDRAM_MODE_2); 170*765547dcSHaiying Wang out_be32(&ddr->sdram_interval, CONFIG_SYS_DDR_SDRAM_INTERVAL); 171*765547dcSHaiying Wang out_be32(&ddr->sdram_data_init, CONFIG_SYS_DDR_DATA_INIT); 172*765547dcSHaiying Wang out_be32(&ddr->sdram_clk_cntl, CONFIG_SYS_DDR_SDRAM_CLK_CNTL); 173*765547dcSHaiying Wang out_be32(&ddr->timing_cfg_4, CONFIG_SYS_DDR_TIMING_4); 174*765547dcSHaiying Wang out_be32(&ddr->timing_cfg_5, CONFIG_SYS_DDR_TIMING_5); 175*765547dcSHaiying Wang out_be32(&ddr->ddr_zq_cntl, CONFIG_SYS_DDR_ZQ_CNTL); 176*765547dcSHaiying Wang out_be32(&ddr->ddr_wrlvl_cntl, CONFIG_SYS_DDR_WRLVL_CNTL); 177*765547dcSHaiying Wang out_be32(&ddr->sdram_cfg_2, CONFIG_SYS_DDR_SDRAM_CFG_2); 178*765547dcSHaiying Wang #if defined (CONFIG_DDR_ECC) 179*765547dcSHaiying Wang out_be32(&ddr->err_int_en, CONFIG_SYS_DDR_ERR_INT_EN); 180*765547dcSHaiying Wang out_be32(&ddr->err_disable, CONFIG_SYS_DDR_ERR_DIS); 181*765547dcSHaiying Wang out_be32(&ddr->err_sbe, CONFIG_SYS_DDR_SBE); 182*765547dcSHaiying Wang #endif 183*765547dcSHaiying Wang udelay(500); 184*765547dcSHaiying Wang 185*765547dcSHaiying Wang out_be32(&ddr->sdram_cfg, CONFIG_SYS_DDR_CONTROL); 186*765547dcSHaiying Wang #if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 187*765547dcSHaiying Wang d_init = 1; 188*765547dcSHaiying Wang debug("DDR - 1st controller: memory initializing\n"); 189*765547dcSHaiying Wang /* 190*765547dcSHaiying Wang * Poll until memory is initialized. 191*765547dcSHaiying Wang * 512 Meg at 400 might hit this 200 times or so. 192*765547dcSHaiying Wang */ 193*765547dcSHaiying Wang while ((ddr->sdram_cfg_2 & (d_init << 4)) != 0) { 194*765547dcSHaiying Wang udelay(1000); 195*765547dcSHaiying Wang } 196*765547dcSHaiying Wang debug("DDR: memory initialized\n\n"); 197*765547dcSHaiying Wang udelay(500); 198*765547dcSHaiying Wang #endif 199*765547dcSHaiying Wang return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024; 200*765547dcSHaiying Wang } 201*765547dcSHaiying Wang #endif 202*765547dcSHaiying Wang 203*765547dcSHaiying Wang /* 204*765547dcSHaiying Wang * Initialize Local Bus 205*765547dcSHaiying Wang */ 206*765547dcSHaiying Wang void 207*765547dcSHaiying Wang local_bus_init(void) 208*765547dcSHaiying Wang { 209*765547dcSHaiying Wang volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 210*765547dcSHaiying Wang volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); 211*765547dcSHaiying Wang 212*765547dcSHaiying Wang uint clkdiv; 213*765547dcSHaiying Wang uint lbc_hz; 214*765547dcSHaiying Wang sys_info_t sysinfo; 215*765547dcSHaiying Wang 216*765547dcSHaiying Wang get_sys_info(&sysinfo); 217*765547dcSHaiying Wang clkdiv = (lbc->lcrr & LCRR_CLKDIV) * 2; 218*765547dcSHaiying Wang lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv; 219*765547dcSHaiying Wang 220*765547dcSHaiying Wang out_be32(&gur->lbiuiplldcr1, 0x00078080); 221*765547dcSHaiying Wang if (clkdiv == 16) 222*765547dcSHaiying Wang out_be32(&gur->lbiuiplldcr0, 0x7c0f1bf0); 223*765547dcSHaiying Wang else if (clkdiv == 8) 224*765547dcSHaiying Wang out_be32(&gur->lbiuiplldcr0, 0x6c0f1bf0); 225*765547dcSHaiying Wang else if (clkdiv == 4) 226*765547dcSHaiying Wang out_be32(&gur->lbiuiplldcr0, 0x5c0f1bf0); 227*765547dcSHaiying Wang 228*765547dcSHaiying Wang out_be32(&lbc->lcrr, (u32)in_be32(&lbc->lcrr)| 0x00030000); 229*765547dcSHaiying Wang } 230*765547dcSHaiying Wang 231*765547dcSHaiying Wang #ifdef CONFIG_PCIE1 232*765547dcSHaiying Wang static struct pci_controller pcie1_hose; 233*765547dcSHaiying Wang #endif /* CONFIG_PCIE1 */ 234*765547dcSHaiying Wang 235*765547dcSHaiying Wang extern int fsl_pci_setup_inbound_windows(struct pci_region *r); 236*765547dcSHaiying Wang extern void fsl_pci_init(struct pci_controller *hose); 237*765547dcSHaiying Wang 238*765547dcSHaiying Wang int first_free_busno = 0; 239*765547dcSHaiying Wang 240*765547dcSHaiying Wang #ifdef CONFIG_PCI 241*765547dcSHaiying Wang void 242*765547dcSHaiying Wang pci_init_board(void) 243*765547dcSHaiying Wang { 244*765547dcSHaiying Wang volatile ccsr_gur_t *gur; 245*765547dcSHaiying Wang uint io_sel; 246*765547dcSHaiying Wang uint host_agent; 247*765547dcSHaiying Wang 248*765547dcSHaiying Wang gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 249*765547dcSHaiying Wang io_sel = (gur->pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; 250*765547dcSHaiying Wang host_agent = (gur->porbmsr & MPC85xx_PORBMSR_HA) >> 16; 251*765547dcSHaiying Wang 252*765547dcSHaiying Wang #ifdef CONFIG_PCIE1 253*765547dcSHaiying Wang { 254*765547dcSHaiying Wang volatile ccsr_fsl_pci_t *pci; 255*765547dcSHaiying Wang struct pci_controller *hose; 256*765547dcSHaiying Wang int pcie_ep; 257*765547dcSHaiying Wang struct pci_region *r; 258*765547dcSHaiying Wang int pcie_configured; 259*765547dcSHaiying Wang 260*765547dcSHaiying Wang pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCIE1_ADDR; 261*765547dcSHaiying Wang hose = &pcie1_hose; 262*765547dcSHaiying Wang pcie_ep = (host_agent == 0) || (host_agent == 2 ) || (host_agent == 3); 263*765547dcSHaiying Wang r = hose->regions; 264*765547dcSHaiying Wang pcie_configured = io_sel >= 1; 265*765547dcSHaiying Wang 266*765547dcSHaiying Wang if (pcie_configured && !(gur->devdisr & MPC85xx_DEVDISR_PCIE)){ 267*765547dcSHaiying Wang printf ("\n PCIE connected to slot as %s (base address %x)", 268*765547dcSHaiying Wang pcie_ep ? "End Point" : "Root Complex", 269*765547dcSHaiying Wang (uint)pci); 270*765547dcSHaiying Wang 271*765547dcSHaiying Wang if (pci->pme_msg_det) { 272*765547dcSHaiying Wang pci->pme_msg_det = 0xffffffff; 273*765547dcSHaiying Wang debug (" with errors. Clearing. Now 0x%08x", 274*765547dcSHaiying Wang pci->pme_msg_det); 275*765547dcSHaiying Wang } 276*765547dcSHaiying Wang printf ("\n"); 277*765547dcSHaiying Wang 278*765547dcSHaiying Wang /* inbound */ 279*765547dcSHaiying Wang r += fsl_pci_setup_inbound_windows(r); 280*765547dcSHaiying Wang 281*765547dcSHaiying Wang /* outbound memory */ 282*765547dcSHaiying Wang pci_set_region(r++, 283*765547dcSHaiying Wang CONFIG_SYS_PCIE1_MEM_BUS, 284*765547dcSHaiying Wang CONFIG_SYS_PCIE1_MEM_PHYS, 285*765547dcSHaiying Wang CONFIG_SYS_PCIE1_MEM_SIZE, 286*765547dcSHaiying Wang PCI_REGION_MEM); 287*765547dcSHaiying Wang 288*765547dcSHaiying Wang /* outbound io */ 289*765547dcSHaiying Wang pci_set_region(r++, 290*765547dcSHaiying Wang CONFIG_SYS_PCIE1_IO_BUS, 291*765547dcSHaiying Wang CONFIG_SYS_PCIE1_IO_PHYS, 292*765547dcSHaiying Wang CONFIG_SYS_PCIE1_IO_SIZE, 293*765547dcSHaiying Wang PCI_REGION_IO); 294*765547dcSHaiying Wang 295*765547dcSHaiying Wang hose->region_count = r - hose->regions; 296*765547dcSHaiying Wang 297*765547dcSHaiying Wang hose->first_busno=first_free_busno; 298*765547dcSHaiying Wang pci_setup_indirect(hose, (int) &pci->cfg_addr, 299*765547dcSHaiying Wang (int) &pci->cfg_data); 300*765547dcSHaiying Wang 301*765547dcSHaiying Wang fsl_pci_init(hose); 302*765547dcSHaiying Wang printf ("PCIE on bus %02x - %02x\n", 303*765547dcSHaiying Wang hose->first_busno,hose->last_busno); 304*765547dcSHaiying Wang 305*765547dcSHaiying Wang first_free_busno=hose->last_busno+1; 306*765547dcSHaiying Wang 307*765547dcSHaiying Wang } else { 308*765547dcSHaiying Wang printf (" PCIE: disabled\n"); 309*765547dcSHaiying Wang } 310*765547dcSHaiying Wang } 311*765547dcSHaiying Wang #else 312*765547dcSHaiying Wang gur->devdisr |= MPC85xx_DEVDISR_PCIE; /* disable */ 313*765547dcSHaiying Wang #endif 314*765547dcSHaiying Wang } 315*765547dcSHaiying Wang #endif /* CONFIG_PCI */ 316*765547dcSHaiying Wang 317*765547dcSHaiying Wang #if defined(CONFIG_OF_BOARD_SETUP) 318*765547dcSHaiying Wang extern void ft_fsl_pci_setup(void *blob, const char *pci_alias, 319*765547dcSHaiying Wang struct pci_controller *hose); 320*765547dcSHaiying Wang 321*765547dcSHaiying Wang void ft_board_setup(void *blob, bd_t *bd) 322*765547dcSHaiying Wang { 323*765547dcSHaiying Wang ft_cpu_setup(blob, bd); 324*765547dcSHaiying Wang 325*765547dcSHaiying Wang #ifdef CONFIG_PCIE1 326*765547dcSHaiying Wang ft_fsl_pci_setup(blob, "pci1", &pcie1_hose); 327*765547dcSHaiying Wang #endif 328*765547dcSHaiying Wang } 329*765547dcSHaiying Wang #endif 330