111c45ebdSJoe Hamman /* 2bd42bbb8SPaul Gortmaker * Copyright 2007,2009 Wind River Systems, Inc. <www.windriver.com> 3bd42bbb8SPaul Gortmaker * 411c45ebdSJoe Hamman * Copyright 2007 Embedded Specialties, Inc. 511c45ebdSJoe Hamman * 611c45ebdSJoe Hamman * Copyright 2004, 2007 Freescale Semiconductor. 711c45ebdSJoe Hamman * 811c45ebdSJoe Hamman * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com> 911c45ebdSJoe Hamman * 1011c45ebdSJoe Hamman * See file CREDITS for list of people who contributed to this 1111c45ebdSJoe Hamman * project. 1211c45ebdSJoe Hamman * 1311c45ebdSJoe Hamman * This program is free software; you can redistribute it and/or 1411c45ebdSJoe Hamman * modify it under the terms of the GNU General Public License as 1511c45ebdSJoe Hamman * published by the Free Software Foundation; either version 2 of 1611c45ebdSJoe Hamman * the License, or (at your option) any later version. 1711c45ebdSJoe Hamman * 1811c45ebdSJoe Hamman * This program is distributed in the hope that it will be useful, 1911c45ebdSJoe Hamman * but WITHOUT ANY WARRANTY; without even the implied warranty of 2011c45ebdSJoe Hamman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2111c45ebdSJoe Hamman * GNU General Public License for more details. 2211c45ebdSJoe Hamman * 2311c45ebdSJoe Hamman * You should have received a copy of the GNU General Public License 2411c45ebdSJoe Hamman * along with this program; if not, write to the Free Software 2511c45ebdSJoe Hamman * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 2611c45ebdSJoe Hamman * MA 02111-1307 USA 2711c45ebdSJoe Hamman */ 2811c45ebdSJoe Hamman 2911c45ebdSJoe Hamman #include <common.h> 3011c45ebdSJoe Hamman #include <pci.h> 3111c45ebdSJoe Hamman #include <asm/processor.h> 3211c45ebdSJoe Hamman #include <asm/immap_85xx.h> 33c8514622SKumar Gala #include <asm/fsl_pci.h> 3433b9079bSKumar Gala #include <asm/fsl_ddr_sdram.h> 35a30a549aSJon Loeliger #include <spd_sdram.h> 3694ca0914SPaul Gortmaker #include <netdev.h> 3794ca0914SPaul Gortmaker #include <tsec.h> 3811c45ebdSJoe Hamman #include <miiphy.h> 3911c45ebdSJoe Hamman #include <libfdt.h> 4011c45ebdSJoe Hamman #include <fdt_support.h> 4111c45ebdSJoe Hamman 4211c45ebdSJoe Hamman DECLARE_GLOBAL_DATA_PTR; 4311c45ebdSJoe Hamman 4411c45ebdSJoe Hamman void local_bus_init(void); 4511c45ebdSJoe Hamman void sdram_init(void); 4611c45ebdSJoe Hamman long int fixed_sdram (void); 4711c45ebdSJoe Hamman 4811c45ebdSJoe Hamman int board_early_init_f (void) 4911c45ebdSJoe Hamman { 5011c45ebdSJoe Hamman return 0; 5111c45ebdSJoe Hamman } 5211c45ebdSJoe Hamman 5311c45ebdSJoe Hamman int checkboard (void) 5411c45ebdSJoe Hamman { 556d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR); 566d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile u_char *rev= (void *)CONFIG_SYS_BD_REV; 5711c45ebdSJoe Hamman 5811c45ebdSJoe Hamman printf ("Board: Wind River SBC8548 Rev. 0x%01x\n", 590c7e4d45SPaul Gortmaker in_8(rev) >> 4); 6011c45ebdSJoe Hamman 6111c45ebdSJoe Hamman /* 6211c45ebdSJoe Hamman * Initialize local bus. 6311c45ebdSJoe Hamman */ 6411c45ebdSJoe Hamman local_bus_init (); 6511c45ebdSJoe Hamman 660c7e4d45SPaul Gortmaker out_be32(&ecm->eedr, 0xffffffff); /* clear ecm errors */ 670c7e4d45SPaul Gortmaker out_be32(&ecm->eeer, 0xffffffff); /* enable ecm errors */ 6811c45ebdSJoe Hamman return 0; 6911c45ebdSJoe Hamman } 7011c45ebdSJoe Hamman 719973e3c6SBecky Bruce phys_size_t 7211c45ebdSJoe Hamman initdram(int board_type) 7311c45ebdSJoe Hamman { 7411c45ebdSJoe Hamman long dram_size = 0; 7511c45ebdSJoe Hamman 7611c45ebdSJoe Hamman puts("Initializing\n"); 7711c45ebdSJoe Hamman 7811c45ebdSJoe Hamman #if defined(CONFIG_DDR_DLL) 7911c45ebdSJoe Hamman { 8011c45ebdSJoe Hamman /* 8111c45ebdSJoe Hamman * Work around to stabilize DDR DLL MSYNC_IN. 8211c45ebdSJoe Hamman * Errata DDR9 seems to have been fixed. 8311c45ebdSJoe Hamman * This is now the workaround for Errata DDR11: 8411c45ebdSJoe Hamman * Override DLL = 1, Course Adj = 1, Tap Select = 0 8511c45ebdSJoe Hamman */ 8611c45ebdSJoe Hamman 876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 8811c45ebdSJoe Hamman 890c7e4d45SPaul Gortmaker out_be32(&gur->ddrdllcr, 0x81000000); 9011c45ebdSJoe Hamman asm("sync;isync;msync"); 9111c45ebdSJoe Hamman udelay(200); 9211c45ebdSJoe Hamman } 9311c45ebdSJoe Hamman #endif 9411c45ebdSJoe Hamman 9511c45ebdSJoe Hamman #if defined(CONFIG_SPD_EEPROM) 9633b9079bSKumar Gala dram_size = fsl_ddr_sdram(); 9733b9079bSKumar Gala dram_size = setup_ddr_tlbs(dram_size / 0x100000); 9833b9079bSKumar Gala dram_size *= 0x100000; 9911c45ebdSJoe Hamman #else 10011c45ebdSJoe Hamman dram_size = fixed_sdram (); 10111c45ebdSJoe Hamman #endif 10211c45ebdSJoe Hamman 10311c45ebdSJoe Hamman /* 10411c45ebdSJoe Hamman * SDRAM Initialization 10511c45ebdSJoe Hamman */ 10611c45ebdSJoe Hamman sdram_init(); 10711c45ebdSJoe Hamman 10811c45ebdSJoe Hamman puts(" DDR: "); 10911c45ebdSJoe Hamman return dram_size; 11011c45ebdSJoe Hamman } 11111c45ebdSJoe Hamman 11211c45ebdSJoe Hamman /* 11311c45ebdSJoe Hamman * Initialize Local Bus 11411c45ebdSJoe Hamman */ 11511c45ebdSJoe Hamman void 11611c45ebdSJoe Hamman local_bus_init(void) 11711c45ebdSJoe Hamman { 1186d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 1196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); 12011c45ebdSJoe Hamman 12111c45ebdSJoe Hamman uint clkdiv; 12211c45ebdSJoe Hamman uint lbc_hz; 12311c45ebdSJoe Hamman sys_info_t sysinfo; 12411c45ebdSJoe Hamman 12511c45ebdSJoe Hamman get_sys_info(&sysinfo); 1260c7e4d45SPaul Gortmaker clkdiv = (in_be32(&lbc->lcrr) & LCRR_CLKDIV) * 2; 12711c45ebdSJoe Hamman lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv; 12811c45ebdSJoe Hamman 1290c7e4d45SPaul Gortmaker out_be32(&gur->lbiuiplldcr1, 0x00078080); 13011c45ebdSJoe Hamman if (clkdiv == 16) { 1310c7e4d45SPaul Gortmaker out_be32(&gur->lbiuiplldcr0, 0x7c0f1bf0); 13211c45ebdSJoe Hamman } else if (clkdiv == 8) { 1330c7e4d45SPaul Gortmaker out_be32(&gur->lbiuiplldcr0, 0x6c0f1bf0); 13411c45ebdSJoe Hamman } else if (clkdiv == 4) { 1350c7e4d45SPaul Gortmaker out_be32(&gur->lbiuiplldcr0, 0x5c0f1bf0); 13611c45ebdSJoe Hamman } 13711c45ebdSJoe Hamman 1380c7e4d45SPaul Gortmaker setbits_be32(&lbc->lcrr, 0x00030000); 13911c45ebdSJoe Hamman 14011c45ebdSJoe Hamman asm("sync;isync;msync"); 14111c45ebdSJoe Hamman 1420c7e4d45SPaul Gortmaker out_be32(&lbc->ltesr, 0xffffffff); /* Clear LBC error IRQs */ 1430c7e4d45SPaul Gortmaker out_be32(&lbc->lteir, 0xffffffff); /* Enable LBC error IRQs */ 14411c45ebdSJoe Hamman } 14511c45ebdSJoe Hamman 14611c45ebdSJoe Hamman /* 14711c45ebdSJoe Hamman * Initialize SDRAM memory on the Local Bus. 14811c45ebdSJoe Hamman */ 14911c45ebdSJoe Hamman void 15011c45ebdSJoe Hamman sdram_init(void) 15111c45ebdSJoe Hamman { 152*11d5a629SPaul Gortmaker #if defined(CONFIG_SYS_LBC_SDRAM_SIZE) 15311c45ebdSJoe Hamman 15411c45ebdSJoe Hamman uint idx; 1556d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); 1566d0f6bcfSJean-Christophe PLAGNIOL-VILLARD uint *sdram_addr = (uint *)CONFIG_SYS_LBC_SDRAM_BASE; 15711c45ebdSJoe Hamman uint lsdmr_common; 15811c45ebdSJoe Hamman 15911c45ebdSJoe Hamman puts(" SDRAM: "); 16011c45ebdSJoe Hamman 1616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD print_size (CONFIG_SYS_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); 16211c45ebdSJoe Hamman 16311c45ebdSJoe Hamman /* 16411c45ebdSJoe Hamman * Setup SDRAM Base and Option Registers 16511c45ebdSJoe Hamman */ 1660c7e4d45SPaul Gortmaker out_be32(&lbc->or3, CONFIG_SYS_OR3_PRELIM); 16711c45ebdSJoe Hamman asm("msync"); 16811c45ebdSJoe Hamman 1690c7e4d45SPaul Gortmaker out_be32(&lbc->br3, CONFIG_SYS_BR3_PRELIM); 17011c45ebdSJoe Hamman asm("msync"); 17111c45ebdSJoe Hamman 172*11d5a629SPaul Gortmaker out_be32(&lbc->or4, CONFIG_SYS_OR4_PRELIM); 173*11d5a629SPaul Gortmaker asm("msync"); 174*11d5a629SPaul Gortmaker 175*11d5a629SPaul Gortmaker out_be32(&lbc->br4, CONFIG_SYS_BR4_PRELIM); 176*11d5a629SPaul Gortmaker asm("msync"); 177*11d5a629SPaul Gortmaker 1780c7e4d45SPaul Gortmaker out_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR); 17911c45ebdSJoe Hamman asm("msync"); 18011c45ebdSJoe Hamman 18111c45ebdSJoe Hamman 1820c7e4d45SPaul Gortmaker out_be32(&lbc->lsrt, CONFIG_SYS_LBC_LSRT); 1830c7e4d45SPaul Gortmaker out_be32(&lbc->mrtpr, CONFIG_SYS_LBC_MRTPR); 18411c45ebdSJoe Hamman asm("msync"); 18511c45ebdSJoe Hamman 18611c45ebdSJoe Hamman /* 18711c45ebdSJoe Hamman * MPC8548 uses "new" 15-16 style addressing. 18811c45ebdSJoe Hamman */ 1896d0f6bcfSJean-Christophe PLAGNIOL-VILLARD lsdmr_common = CONFIG_SYS_LBC_LSDMR_COMMON; 190b0fe93edSKumar Gala lsdmr_common |= LSDMR_BSMA1516; 19111c45ebdSJoe Hamman 19211c45ebdSJoe Hamman /* 19311c45ebdSJoe Hamman * Issue PRECHARGE ALL command. 19411c45ebdSJoe Hamman */ 1950c7e4d45SPaul Gortmaker out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_PCHALL); 19611c45ebdSJoe Hamman asm("sync;msync"); 19711c45ebdSJoe Hamman *sdram_addr = 0xff; 19811c45ebdSJoe Hamman ppcDcbf((unsigned long) sdram_addr); 19911c45ebdSJoe Hamman udelay(100); 20011c45ebdSJoe Hamman 20111c45ebdSJoe Hamman /* 20211c45ebdSJoe Hamman * Issue 8 AUTO REFRESH commands. 20311c45ebdSJoe Hamman */ 20411c45ebdSJoe Hamman for (idx = 0; idx < 8; idx++) { 2050c7e4d45SPaul Gortmaker out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_ARFRSH); 20611c45ebdSJoe Hamman asm("sync;msync"); 20711c45ebdSJoe Hamman *sdram_addr = 0xff; 20811c45ebdSJoe Hamman ppcDcbf((unsigned long) sdram_addr); 20911c45ebdSJoe Hamman udelay(100); 21011c45ebdSJoe Hamman } 21111c45ebdSJoe Hamman 21211c45ebdSJoe Hamman /* 21311c45ebdSJoe Hamman * Issue 8 MODE-set command. 21411c45ebdSJoe Hamman */ 2150c7e4d45SPaul Gortmaker out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_MRW); 21611c45ebdSJoe Hamman asm("sync;msync"); 21711c45ebdSJoe Hamman *sdram_addr = 0xff; 21811c45ebdSJoe Hamman ppcDcbf((unsigned long) sdram_addr); 21911c45ebdSJoe Hamman udelay(100); 22011c45ebdSJoe Hamman 22111c45ebdSJoe Hamman /* 22211c45ebdSJoe Hamman * Issue NORMAL OP command. 22311c45ebdSJoe Hamman */ 2240c7e4d45SPaul Gortmaker out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_NORMAL); 22511c45ebdSJoe Hamman asm("sync;msync"); 22611c45ebdSJoe Hamman *sdram_addr = 0xff; 22711c45ebdSJoe Hamman ppcDcbf((unsigned long) sdram_addr); 22811c45ebdSJoe Hamman udelay(200); /* Overkill. Must wait > 200 bus cycles */ 22911c45ebdSJoe Hamman 23011c45ebdSJoe Hamman #endif /* enable SDRAM init */ 23111c45ebdSJoe Hamman } 23211c45ebdSJoe Hamman 2336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_DRAM_TEST) 23411c45ebdSJoe Hamman int 23511c45ebdSJoe Hamman testdram(void) 23611c45ebdSJoe Hamman { 2376d0f6bcfSJean-Christophe PLAGNIOL-VILLARD uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START; 2386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD uint *pend = (uint *) CONFIG_SYS_MEMTEST_END; 23911c45ebdSJoe Hamman uint *p; 24011c45ebdSJoe Hamman 24111c45ebdSJoe Hamman printf("Testing DRAM from 0x%08x to 0x%08x\n", 2426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_MEMTEST_START, 2436d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_MEMTEST_END); 24411c45ebdSJoe Hamman 24511c45ebdSJoe Hamman printf("DRAM test phase 1:\n"); 24611c45ebdSJoe Hamman for (p = pstart; p < pend; p++) 24711c45ebdSJoe Hamman *p = 0xaaaaaaaa; 24811c45ebdSJoe Hamman 24911c45ebdSJoe Hamman for (p = pstart; p < pend; p++) { 25011c45ebdSJoe Hamman if (*p != 0xaaaaaaaa) { 25111c45ebdSJoe Hamman printf ("DRAM test fails at: %08x\n", (uint) p); 25211c45ebdSJoe Hamman return 1; 25311c45ebdSJoe Hamman } 25411c45ebdSJoe Hamman } 25511c45ebdSJoe Hamman 25611c45ebdSJoe Hamman printf("DRAM test phase 2:\n"); 25711c45ebdSJoe Hamman for (p = pstart; p < pend; p++) 25811c45ebdSJoe Hamman *p = 0x55555555; 25911c45ebdSJoe Hamman 26011c45ebdSJoe Hamman for (p = pstart; p < pend; p++) { 26111c45ebdSJoe Hamman if (*p != 0x55555555) { 26211c45ebdSJoe Hamman printf ("DRAM test fails at: %08x\n", (uint) p); 26311c45ebdSJoe Hamman return 1; 26411c45ebdSJoe Hamman } 26511c45ebdSJoe Hamman } 26611c45ebdSJoe Hamman 26711c45ebdSJoe Hamman printf("DRAM test passed.\n"); 26811c45ebdSJoe Hamman return 0; 26911c45ebdSJoe Hamman } 27011c45ebdSJoe Hamman #endif 27111c45ebdSJoe Hamman 27211c45ebdSJoe Hamman #if !defined(CONFIG_SPD_EEPROM) 2730c7e4d45SPaul Gortmaker #define CONFIG_SYS_DDR_CONTROL 0xc300c000 27411c45ebdSJoe Hamman /************************************************************************* 27511c45ebdSJoe Hamman * fixed_sdram init -- doesn't use serial presence detect. 27611c45ebdSJoe Hamman * assumes 256MB DDR2 SDRAM SODIMM, without ECC, running at DDR400 speed. 27711c45ebdSJoe Hamman ************************************************************************/ 27811c45ebdSJoe Hamman long int fixed_sdram (void) 27911c45ebdSJoe Hamman { 2806d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC85xx_DDR_ADDR); 28111c45ebdSJoe Hamman 2820c7e4d45SPaul Gortmaker out_be32(&ddr->cs0_bnds, 0x0000007f); 2830c7e4d45SPaul Gortmaker out_be32(&ddr->cs1_bnds, 0x008000ff); 2840c7e4d45SPaul Gortmaker out_be32(&ddr->cs2_bnds, 0x00000000); 2850c7e4d45SPaul Gortmaker out_be32(&ddr->cs3_bnds, 0x00000000); 2860c7e4d45SPaul Gortmaker out_be32(&ddr->cs0_config, 0x80010101); 2870c7e4d45SPaul Gortmaker out_be32(&ddr->cs1_config, 0x80010101); 2880c7e4d45SPaul Gortmaker out_be32(&ddr->cs2_config, 0x00000000); 2890c7e4d45SPaul Gortmaker out_be32(&ddr->cs3_config, 0x00000000); 2900c7e4d45SPaul Gortmaker out_be32(&ddr->timing_cfg_3, 0x00000000); 2910c7e4d45SPaul Gortmaker out_be32(&ddr->timing_cfg_0, 0x00220802); 2920c7e4d45SPaul Gortmaker out_be32(&ddr->timing_cfg_1, 0x38377322); 2930c7e4d45SPaul Gortmaker out_be32(&ddr->timing_cfg_2, 0x0fa044C7); 2940c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_cfg, 0x4300C000); 2950c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_cfg_2, 0x24401000); 2960c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_mode, 0x23C00542); 2970c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_mode_2, 0x00000000); 2980c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_interval, 0x05080100); 2990c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_md_cntl, 0x00000000); 3000c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_data_init, 0x00000000); 3010c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_clk_cntl, 0x03800000); 30211c45ebdSJoe Hamman asm("sync;isync;msync"); 30311c45ebdSJoe Hamman udelay(500); 30411c45ebdSJoe Hamman 30511c45ebdSJoe Hamman #if defined (CONFIG_DDR_ECC) 30611c45ebdSJoe Hamman /* Enable ECC checking */ 3070c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_cfg, CONFIG_SYS_DDR_CONTROL | 0x20000000); 30811c45ebdSJoe Hamman #else 3090c7e4d45SPaul Gortmaker out_be32(&ddr->sdram_cfg, CONFIG_SYS_DDR_CONTROL); 31011c45ebdSJoe Hamman #endif 31111c45ebdSJoe Hamman 3126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024; 31311c45ebdSJoe Hamman } 31411c45ebdSJoe Hamman #endif 31511c45ebdSJoe Hamman 3167b1f1399SPaul Gortmaker #ifdef CONFIG_PCI1 3177b1f1399SPaul Gortmaker static struct pci_controller pci1_hose; 3187b1f1399SPaul Gortmaker #endif /* CONFIG_PCI1 */ 31911c45ebdSJoe Hamman 32011c45ebdSJoe Hamman #ifdef CONFIG_PCIE1 32111c45ebdSJoe Hamman static struct pci_controller pcie1_hose; 32211c45ebdSJoe Hamman #endif /* CONFIG_PCIE1 */ 32311c45ebdSJoe Hamman 32411c45ebdSJoe Hamman int first_free_busno=0; 32511c45ebdSJoe Hamman 32611c45ebdSJoe Hamman void 32711c45ebdSJoe Hamman pci_init_board(void) 32811c45ebdSJoe Hamman { 3296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 33011c45ebdSJoe Hamman 33111c45ebdSJoe Hamman #ifdef CONFIG_PCI1 33211c45ebdSJoe Hamman { 3336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCI1_ADDR; 33411c45ebdSJoe Hamman struct pci_controller *hose = &pci1_hose; 3352dba0deaSKumar Gala struct pci_region *r = hose->regions; 33611c45ebdSJoe Hamman 33711c45ebdSJoe Hamman uint pci_32 = gur->pordevsr & MPC85xx_PORDEVSR_PCI1_PCI32; /* PORDEVSR[15] */ 33811c45ebdSJoe Hamman uint pci_arb = gur->pordevsr & MPC85xx_PORDEVSR_PCI1_ARB; /* PORDEVSR[14] */ 33911c45ebdSJoe Hamman uint pci_clk_sel = gur->porpllsr & MPC85xx_PORDEVSR_PCI1_SPD; /* PORPLLSR[16] */ 34011c45ebdSJoe Hamman 3412c40acd3SPaul Gortmaker uint pci_speed = CONFIG_SYS_CLK_FREQ; /* get_clock_freq() */ 34211c45ebdSJoe Hamman 34311c45ebdSJoe Hamman if (!(gur->devdisr & MPC85xx_DEVDISR_PCI1)) { 3447b1f1399SPaul Gortmaker printf (" PCI host: %d bit, %s MHz, %s, %s\n", 34511c45ebdSJoe Hamman (pci_32) ? 32 : 64, 3462c40acd3SPaul Gortmaker (pci_speed == 33000000) ? "33" : 3472c40acd3SPaul Gortmaker (pci_speed == 66000000) ? "66" : "unknown", 34811c45ebdSJoe Hamman pci_clk_sel ? "sync" : "async", 34911c45ebdSJoe Hamman pci_arb ? "arbiter" : "external-arbiter" 35011c45ebdSJoe Hamman ); 35111c45ebdSJoe Hamman 35211c45ebdSJoe Hamman /* outbound memory */ 3532dba0deaSKumar Gala pci_set_region(r++, 3546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MEM_BASE, 3556d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MEM_PHYS, 3566d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_MEM_SIZE, 35711c45ebdSJoe Hamman PCI_REGION_MEM); 35811c45ebdSJoe Hamman 35911c45ebdSJoe Hamman /* outbound io */ 3602dba0deaSKumar Gala pci_set_region(r++, 3616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_IO_BASE, 3626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_IO_PHYS, 3636d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCI1_IO_SIZE, 36411c45ebdSJoe Hamman PCI_REGION_IO); 3652dba0deaSKumar Gala hose->region_count = r - hose->regions; 36611c45ebdSJoe Hamman 36711c45ebdSJoe Hamman hose->first_busno=first_free_busno; 36811c45ebdSJoe Hamman 369fb3143b3SKumar Gala fsl_pci_init(hose, (u32)&pci->cfg_addr, (u32)&pci->cfg_data); 37011c45ebdSJoe Hamman first_free_busno=hose->last_busno+1; 37111c45ebdSJoe Hamman printf ("PCI on bus %02x - %02x\n",hose->first_busno,hose->last_busno); 37211c45ebdSJoe Hamman #ifdef CONFIG_PCIX_CHECK 3739427ccdeSPeter Tyser if (!(gur->pordevsr & MPC85xx_PORDEVSR_PCI1)) { 37411c45ebdSJoe Hamman /* PCI-X init */ 37511c45ebdSJoe Hamman if (CONFIG_SYS_CLK_FREQ < 66000000) 37611c45ebdSJoe Hamman printf("PCI-X will only work at 66 MHz\n"); 37711c45ebdSJoe Hamman 37811c45ebdSJoe Hamman reg16 = PCI_X_CMD_MAX_SPLIT | PCI_X_CMD_MAX_READ 37911c45ebdSJoe Hamman | PCI_X_CMD_ERO | PCI_X_CMD_DPERR_E; 38011c45ebdSJoe Hamman pci_hose_write_config_word(hose, bus, PCIX_COMMAND, reg16); 38111c45ebdSJoe Hamman } 38211c45ebdSJoe Hamman #endif 38311c45ebdSJoe Hamman } else { 38411c45ebdSJoe Hamman printf (" PCI: disabled\n"); 38511c45ebdSJoe Hamman } 38611c45ebdSJoe Hamman } 38711c45ebdSJoe Hamman #else 38811c45ebdSJoe Hamman gur->devdisr |= MPC85xx_DEVDISR_PCI1; /* disable */ 38911c45ebdSJoe Hamman #endif 39011c45ebdSJoe Hamman 3917b1f1399SPaul Gortmaker gur->devdisr |= MPC85xx_DEVDISR_PCI2; /* disable PCI2 */ 39211c45ebdSJoe Hamman 39311c45ebdSJoe Hamman #ifdef CONFIG_PCIE1 39411c45ebdSJoe Hamman { 3956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCIE1_ADDR; 39611c45ebdSJoe Hamman struct pci_controller *hose = &pcie1_hose; 3972dba0deaSKumar Gala struct pci_region *r = hose->regions; 39811c45ebdSJoe Hamman 3993e7b6c1fSKumar Gala int pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_1, io_sel); 40011c45ebdSJoe Hamman 40111c45ebdSJoe Hamman if (pcie_configured && !(gur->devdisr & MPC85xx_DEVDISR_PCIE)){ 4027b1f1399SPaul Gortmaker printf ("\n PCIE at base address %x", 40311c45ebdSJoe Hamman (uint)pci); 40411c45ebdSJoe Hamman 40511c45ebdSJoe Hamman if (pci->pme_msg_det) { 40611c45ebdSJoe Hamman pci->pme_msg_det = 0xffffffff; 40711c45ebdSJoe Hamman debug (" with errors. Clearing. Now 0x%08x",pci->pme_msg_det); 40811c45ebdSJoe Hamman } 40911c45ebdSJoe Hamman printf ("\n"); 41011c45ebdSJoe Hamman 41111c45ebdSJoe Hamman /* outbound memory */ 4122dba0deaSKumar Gala pci_set_region(r++, 4136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_MEM_BASE, 4146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_MEM_PHYS, 4156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_MEM_SIZE, 41611c45ebdSJoe Hamman PCI_REGION_MEM); 41711c45ebdSJoe Hamman 41811c45ebdSJoe Hamman /* outbound io */ 4192dba0deaSKumar Gala pci_set_region(r++, 4206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_IO_BASE, 4216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_IO_PHYS, 4226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_IO_SIZE, 42311c45ebdSJoe Hamman PCI_REGION_IO); 42411c45ebdSJoe Hamman 4252dba0deaSKumar Gala hose->region_count = r - hose->regions; 42611c45ebdSJoe Hamman 42711c45ebdSJoe Hamman hose->first_busno=first_free_busno; 42811c45ebdSJoe Hamman 429fb3143b3SKumar Gala fsl_pci_init(hose, (u32)&pci->cfg_addr, (u32)&pci->cfg_data); 43011c45ebdSJoe Hamman printf ("PCIE on bus %d - %d\n",hose->first_busno,hose->last_busno); 43111c45ebdSJoe Hamman 43211c45ebdSJoe Hamman first_free_busno=hose->last_busno+1; 43311c45ebdSJoe Hamman 43411c45ebdSJoe Hamman } else { 43511c45ebdSJoe Hamman printf (" PCIE: disabled\n"); 43611c45ebdSJoe Hamman } 43711c45ebdSJoe Hamman } 43811c45ebdSJoe Hamman #else 43911c45ebdSJoe Hamman gur->devdisr |= MPC85xx_DEVDISR_PCIE; /* disable */ 44011c45ebdSJoe Hamman #endif 44111c45ebdSJoe Hamman 44211c45ebdSJoe Hamman } 44311c45ebdSJoe Hamman 44494ca0914SPaul Gortmaker int board_eth_init(bd_t *bis) 44594ca0914SPaul Gortmaker { 44694ca0914SPaul Gortmaker tsec_standard_init(bis); 44794ca0914SPaul Gortmaker pci_eth_init(bis); 44894ca0914SPaul Gortmaker return 0; /* otherwise cpu_eth_init gets run */ 44994ca0914SPaul Gortmaker } 45094ca0914SPaul Gortmaker 45111c45ebdSJoe Hamman int last_stage_init(void) 45211c45ebdSJoe Hamman { 45311c45ebdSJoe Hamman return 0; 45411c45ebdSJoe Hamman } 45511c45ebdSJoe Hamman 45611c45ebdSJoe Hamman #if defined(CONFIG_OF_BOARD_SETUP) 4572dba0deaSKumar Gala void ft_board_setup(void *blob, bd_t *bd) 45811c45ebdSJoe Hamman { 45911c45ebdSJoe Hamman ft_cpu_setup(blob, bd); 4602dba0deaSKumar Gala #ifdef CONFIG_PCI1 4612dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci0", &pci1_hose); 4622dba0deaSKumar Gala #endif 4632dba0deaSKumar Gala #ifdef CONFIG_PCIE1 4642dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci1", &pcie1_hose); 46511c45ebdSJoe Hamman #endif 46611c45ebdSJoe Hamman } 46711c45ebdSJoe Hamman #endif 468