1*3dd2db53SJon Loeliger /* 2*3dd2db53SJon Loeliger * Copyright 2007 Freescale Semiconductor, Inc. 3*3dd2db53SJon Loeliger * 4*3dd2db53SJon Loeliger * See file CREDITS for list of people who contributed to this 5*3dd2db53SJon Loeliger * project. 6*3dd2db53SJon Loeliger * 7*3dd2db53SJon Loeliger * This program is free software; you can redistribute it and/or 8*3dd2db53SJon Loeliger * modify it under the terms of the GNU General Public License as 9*3dd2db53SJon Loeliger * published by the Free Software Foundation; either version 2 of 10*3dd2db53SJon Loeliger * the License, or (at your option) any later version. 11*3dd2db53SJon Loeliger * 12*3dd2db53SJon Loeliger * This program is distributed in the hope that it will be useful, 13*3dd2db53SJon Loeliger * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*3dd2db53SJon Loeliger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*3dd2db53SJon Loeliger * GNU General Public License for more details. 16*3dd2db53SJon Loeliger * 17*3dd2db53SJon Loeliger * You should have received a copy of the GNU General Public License 18*3dd2db53SJon Loeliger * along with this program; if not, write to the Free Software 19*3dd2db53SJon Loeliger * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20*3dd2db53SJon Loeliger * MA 02111-1307 USA 21*3dd2db53SJon Loeliger */ 22*3dd2db53SJon Loeliger #define DEBUG 23*3dd2db53SJon Loeliger #include <common.h> 24*3dd2db53SJon Loeliger #include <command.h> 25*3dd2db53SJon Loeliger #include <pci.h> 26*3dd2db53SJon Loeliger #include <asm/processor.h> 27*3dd2db53SJon Loeliger #include <asm/immap_86xx.h> 28*3dd2db53SJon Loeliger #include <asm/immap_fsl_pci.h> 29*3dd2db53SJon Loeliger #include <spd.h> 30*3dd2db53SJon Loeliger #include <asm/io.h> 31*3dd2db53SJon Loeliger 32*3dd2db53SJon Loeliger 33*3dd2db53SJon Loeliger #if defined(CONFIG_OF_FLAT_TREE) 34*3dd2db53SJon Loeliger #include <ft_build.h> 35*3dd2db53SJon Loeliger extern void ft_cpu_setup(void *blob, bd_t *bd); 36*3dd2db53SJon Loeliger #endif 37*3dd2db53SJon Loeliger 38*3dd2db53SJon Loeliger #include "../common/pixis.h" 39*3dd2db53SJon Loeliger 40*3dd2db53SJon Loeliger #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 41*3dd2db53SJon Loeliger extern void ddr_enable_ecc(unsigned int dram_size); 42*3dd2db53SJon Loeliger #endif 43*3dd2db53SJon Loeliger 44*3dd2db53SJon Loeliger #if defined(CONFIG_SPD_EEPROM) 45*3dd2db53SJon Loeliger #include "spd_sdram.h" 46*3dd2db53SJon Loeliger #endif 47*3dd2db53SJon Loeliger 48*3dd2db53SJon Loeliger void sdram_init(void); 49*3dd2db53SJon Loeliger long int fixed_sdram(void); 50*3dd2db53SJon Loeliger 51*3dd2db53SJon Loeliger /* called before any console output */ 52*3dd2db53SJon Loeliger int board_early_init_f(void) 53*3dd2db53SJon Loeliger { 54*3dd2db53SJon Loeliger volatile immap_t *immap = (immap_t *)CFG_IMMR; 55*3dd2db53SJon Loeliger volatile ccsr_gur_t *gur = &immap->im_gur; 56*3dd2db53SJon Loeliger 57*3dd2db53SJon Loeliger gur->gpiocr |= 0x888a5500; /* DIU16, IR1, UART0, UART2 */ 58*3dd2db53SJon Loeliger 59*3dd2db53SJon Loeliger return 0; 60*3dd2db53SJon Loeliger } 61*3dd2db53SJon Loeliger 62*3dd2db53SJon Loeliger int checkboard(void) 63*3dd2db53SJon Loeliger { 64*3dd2db53SJon Loeliger volatile immap_t *immap = (immap_t *)CFG_IMMR; 65*3dd2db53SJon Loeliger volatile ccsr_lbc_t *memctl = &immap->im_lbc; 66*3dd2db53SJon Loeliger volatile ccsr_local_mcm_t *mcm = &immap->im_local_mcm; 67*3dd2db53SJon Loeliger 68*3dd2db53SJon Loeliger puts("Board: MPC8610HPCD\n"); 69*3dd2db53SJon Loeliger 70*3dd2db53SJon Loeliger mcm->abcr |= 0x00010000; /* 0 */ 71*3dd2db53SJon Loeliger mcm->hpmr3 = 0x80000008; /* 4c */ 72*3dd2db53SJon Loeliger mcm->hpmr0 = 0; 73*3dd2db53SJon Loeliger mcm->hpmr1 = 0; 74*3dd2db53SJon Loeliger mcm->hpmr2 = 0; 75*3dd2db53SJon Loeliger mcm->hpmr4 = 0; 76*3dd2db53SJon Loeliger mcm->hpmr5 = 0; 77*3dd2db53SJon Loeliger 78*3dd2db53SJon Loeliger return 0; 79*3dd2db53SJon Loeliger } 80*3dd2db53SJon Loeliger 81*3dd2db53SJon Loeliger 82*3dd2db53SJon Loeliger long int 83*3dd2db53SJon Loeliger initdram(int board_type) 84*3dd2db53SJon Loeliger { 85*3dd2db53SJon Loeliger long dram_size = 0; 86*3dd2db53SJon Loeliger 87*3dd2db53SJon Loeliger #if defined(CONFIG_SPD_EEPROM) 88*3dd2db53SJon Loeliger dram_size = spd_sdram(); 89*3dd2db53SJon Loeliger #else 90*3dd2db53SJon Loeliger dram_size = fixed_sdram(); 91*3dd2db53SJon Loeliger #endif 92*3dd2db53SJon Loeliger 93*3dd2db53SJon Loeliger #if defined(CFG_RAMBOOT) 94*3dd2db53SJon Loeliger puts(" DDR: "); 95*3dd2db53SJon Loeliger return dram_size; 96*3dd2db53SJon Loeliger #endif 97*3dd2db53SJon Loeliger 98*3dd2db53SJon Loeliger #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 99*3dd2db53SJon Loeliger /* 100*3dd2db53SJon Loeliger * Initialize and enable DDR ECC. 101*3dd2db53SJon Loeliger */ 102*3dd2db53SJon Loeliger ddr_enable_ecc(dram_size); 103*3dd2db53SJon Loeliger #endif 104*3dd2db53SJon Loeliger 105*3dd2db53SJon Loeliger puts(" DDR: "); 106*3dd2db53SJon Loeliger return dram_size; 107*3dd2db53SJon Loeliger } 108*3dd2db53SJon Loeliger 109*3dd2db53SJon Loeliger 110*3dd2db53SJon Loeliger #if defined(CFG_DRAM_TEST) 111*3dd2db53SJon Loeliger int 112*3dd2db53SJon Loeliger testdram(void) 113*3dd2db53SJon Loeliger { 114*3dd2db53SJon Loeliger uint *pstart = (uint *) CFG_MEMTEST_START; 115*3dd2db53SJon Loeliger uint *pend = (uint *) CFG_MEMTEST_END; 116*3dd2db53SJon Loeliger uint *p; 117*3dd2db53SJon Loeliger 118*3dd2db53SJon Loeliger puts("SDRAM test phase 1:\n"); 119*3dd2db53SJon Loeliger for (p = pstart; p < pend; p++) 120*3dd2db53SJon Loeliger *p = 0xaaaaaaaa; 121*3dd2db53SJon Loeliger 122*3dd2db53SJon Loeliger for (p = pstart; p < pend; p++) { 123*3dd2db53SJon Loeliger if (*p != 0xaaaaaaaa) { 124*3dd2db53SJon Loeliger printf("SDRAM test fails at: %08x\n", (uint) p); 125*3dd2db53SJon Loeliger return 1; 126*3dd2db53SJon Loeliger } 127*3dd2db53SJon Loeliger } 128*3dd2db53SJon Loeliger 129*3dd2db53SJon Loeliger puts("SDRAM test phase 2:\n"); 130*3dd2db53SJon Loeliger for (p = pstart; p < pend; p++) 131*3dd2db53SJon Loeliger *p = 0x55555555; 132*3dd2db53SJon Loeliger 133*3dd2db53SJon Loeliger for (p = pstart; p < pend; p++) { 134*3dd2db53SJon Loeliger if (*p != 0x55555555) { 135*3dd2db53SJon Loeliger printf("SDRAM test fails at: %08x\n", (uint) p); 136*3dd2db53SJon Loeliger return 1; 137*3dd2db53SJon Loeliger } 138*3dd2db53SJon Loeliger } 139*3dd2db53SJon Loeliger 140*3dd2db53SJon Loeliger puts("SDRAM test passed.\n"); 141*3dd2db53SJon Loeliger return 0; 142*3dd2db53SJon Loeliger } 143*3dd2db53SJon Loeliger #endif 144*3dd2db53SJon Loeliger 145*3dd2db53SJon Loeliger 146*3dd2db53SJon Loeliger #if !defined(CONFIG_SPD_EEPROM) 147*3dd2db53SJon Loeliger /* 148*3dd2db53SJon Loeliger * Fixed sdram init -- doesn't use serial presence detect. 149*3dd2db53SJon Loeliger */ 150*3dd2db53SJon Loeliger 151*3dd2db53SJon Loeliger long int fixed_sdram(void) 152*3dd2db53SJon Loeliger { 153*3dd2db53SJon Loeliger #if !defined(CFG_RAMBOOT) 154*3dd2db53SJon Loeliger volatile immap_t *immap = (immap_t *)CFG_IMMR; 155*3dd2db53SJon Loeliger volatile ccsr_ddr_t *ddr = &immap->im_ddr1; 156*3dd2db53SJon Loeliger uint d_init; 157*3dd2db53SJon Loeliger 158*3dd2db53SJon Loeliger ddr->cs0_bnds = 0x0000001f; 159*3dd2db53SJon Loeliger ddr->cs0_config = 0x80010202; 160*3dd2db53SJon Loeliger 161*3dd2db53SJon Loeliger ddr->ext_refrec = 0x00000000; 162*3dd2db53SJon Loeliger ddr->timing_cfg_0 = 0x00260802; 163*3dd2db53SJon Loeliger ddr->timing_cfg_1 = 0x3935d322; 164*3dd2db53SJon Loeliger ddr->timing_cfg_2 = 0x14904cc8; 165*3dd2db53SJon Loeliger ddr->sdram_mode_1 = 0x00480432; 166*3dd2db53SJon Loeliger ddr->sdram_mode_2 = 0x00000000; 167*3dd2db53SJon Loeliger ddr->sdram_interval = 0x06180fff; /* 0x06180100; */ 168*3dd2db53SJon Loeliger ddr->sdram_data_init = 0xDEADBEEF; 169*3dd2db53SJon Loeliger ddr->sdram_clk_cntl = 0x03800000; 170*3dd2db53SJon Loeliger ddr->sdram_cfg_2 = 0x04400010; 171*3dd2db53SJon Loeliger 172*3dd2db53SJon Loeliger #if defined(CONFIG_DDR_ECC) 173*3dd2db53SJon Loeliger ddr->err_int_en = 0x0000000d; 174*3dd2db53SJon Loeliger ddr->err_disable = 0x00000000; 175*3dd2db53SJon Loeliger ddr->err_sbe = 0x00010000; 176*3dd2db53SJon Loeliger #endif 177*3dd2db53SJon Loeliger asm("sync;isync"); 178*3dd2db53SJon Loeliger 179*3dd2db53SJon Loeliger udelay(500); 180*3dd2db53SJon Loeliger 181*3dd2db53SJon Loeliger ddr->sdram_cfg_1 = 0xc3000000; /* 0xe3008000;*/ 182*3dd2db53SJon Loeliger 183*3dd2db53SJon Loeliger 184*3dd2db53SJon Loeliger #if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 185*3dd2db53SJon Loeliger d_init = 1; 186*3dd2db53SJon Loeliger debug("DDR - 1st controller: memory initializing\n"); 187*3dd2db53SJon Loeliger /* 188*3dd2db53SJon Loeliger * Poll until memory is initialized. 189*3dd2db53SJon Loeliger * 512 Meg at 400 might hit this 200 times or so. 190*3dd2db53SJon Loeliger */ 191*3dd2db53SJon Loeliger while ((ddr->sdram_cfg_2 & (d_init << 4)) != 0) 192*3dd2db53SJon Loeliger udelay(1000); 193*3dd2db53SJon Loeliger 194*3dd2db53SJon Loeliger debug("DDR: memory initialized\n\n"); 195*3dd2db53SJon Loeliger asm("sync; isync"); 196*3dd2db53SJon Loeliger udelay(500); 197*3dd2db53SJon Loeliger #endif 198*3dd2db53SJon Loeliger 199*3dd2db53SJon Loeliger return 512 * 1024 * 1024; 200*3dd2db53SJon Loeliger #endif 201*3dd2db53SJon Loeliger return CFG_SDRAM_SIZE * 1024 * 1024; 202*3dd2db53SJon Loeliger } 203*3dd2db53SJon Loeliger 204*3dd2db53SJon Loeliger #endif 205*3dd2db53SJon Loeliger 206*3dd2db53SJon Loeliger #if defined(CONFIG_PCI) 207*3dd2db53SJon Loeliger /* 208*3dd2db53SJon Loeliger * Initialize PCI Devices, report devices found. 209*3dd2db53SJon Loeliger */ 210*3dd2db53SJon Loeliger 211*3dd2db53SJon Loeliger #ifndef CONFIG_PCI_PNP 212*3dd2db53SJon Loeliger static struct pci_config_table pci_fsl86xxads_config_table[] = { 213*3dd2db53SJon Loeliger {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 214*3dd2db53SJon Loeliger PCI_IDSEL_NUMBER, PCI_ANY_ID, 215*3dd2db53SJon Loeliger pci_cfgfunc_config_device, {PCI_ENET0_IOADDR, 216*3dd2db53SJon Loeliger PCI_ENET0_MEMADDR, 217*3dd2db53SJon Loeliger PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER} }, 218*3dd2db53SJon Loeliger {} 219*3dd2db53SJon Loeliger }; 220*3dd2db53SJon Loeliger #endif 221*3dd2db53SJon Loeliger 222*3dd2db53SJon Loeliger 223*3dd2db53SJon Loeliger static struct pci_controller pci1_hose = { 224*3dd2db53SJon Loeliger #ifndef CONFIG_PCI_PNP 225*3dd2db53SJon Loeliger config_table:pci_mpc86xxcts_config_table 226*3dd2db53SJon Loeliger #endif 227*3dd2db53SJon Loeliger }; 228*3dd2db53SJon Loeliger #endif /* CONFIG_PCI */ 229*3dd2db53SJon Loeliger 230*3dd2db53SJon Loeliger #ifdef CONFIG_PCIE1 231*3dd2db53SJon Loeliger static struct pci_controller pcie1_hose; 232*3dd2db53SJon Loeliger #endif 233*3dd2db53SJon Loeliger 234*3dd2db53SJon Loeliger #ifdef CONFIG_PCIE2 235*3dd2db53SJon Loeliger static struct pci_controller pcie2_hose; 236*3dd2db53SJon Loeliger #endif 237*3dd2db53SJon Loeliger 238*3dd2db53SJon Loeliger int first_free_busno = 0; 239*3dd2db53SJon Loeliger 240*3dd2db53SJon Loeliger void pci_init_board(void) 241*3dd2db53SJon Loeliger { 242*3dd2db53SJon Loeliger volatile immap_t *immap = (immap_t *) CFG_CCSRBAR; 243*3dd2db53SJon Loeliger volatile ccsr_gur_t *gur = &immap->im_gur; 244*3dd2db53SJon Loeliger uint devdisr = gur->devdisr; 245*3dd2db53SJon Loeliger uint io_sel = (gur->pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; 246*3dd2db53SJon Loeliger uint host_agent = (gur->porbmsr & MPC85xx_PORBMSR_HA) >> 16; 247*3dd2db53SJon Loeliger 248*3dd2db53SJon Loeliger printf( " pci_init_board: devdisr=%x, io_sel=%x, host_agent=%x\n", 249*3dd2db53SJon Loeliger devdisr, io_sel, host_agent); 250*3dd2db53SJon Loeliger 251*3dd2db53SJon Loeliger 252*3dd2db53SJon Loeliger #ifdef CONFIG_PCIE1 253*3dd2db53SJon Loeliger { 254*3dd2db53SJon Loeliger volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCIE1_ADDR; 255*3dd2db53SJon Loeliger extern void fsl_pci_init(struct pci_controller *hose); 256*3dd2db53SJon Loeliger struct pci_controller *hose = &pcie1_hose; 257*3dd2db53SJon Loeliger int pcie_configured = (io_sel == 1) || (io_sel == 4); 258*3dd2db53SJon Loeliger int pcie_ep = (host_agent == 0) || (host_agent == 2) || 259*3dd2db53SJon Loeliger (host_agent == 5); 260*3dd2db53SJon Loeliger 261*3dd2db53SJon Loeliger if (pcie_configured && !(devdisr & MPC86xx_DEVDISR_PCIE1)) { 262*3dd2db53SJon Loeliger printf(" PCIe 1 connected to Uli as %s (base address %x)\n", 263*3dd2db53SJon Loeliger pcie_ep ? "End Point" : "Root Complex", 264*3dd2db53SJon Loeliger (uint)pci); 265*3dd2db53SJon Loeliger if (pci->pme_msg_det) 266*3dd2db53SJon Loeliger pci->pme_msg_det = 0xffffffff; 267*3dd2db53SJon Loeliger 268*3dd2db53SJon Loeliger /* inbound */ 269*3dd2db53SJon Loeliger pci_set_region(hose->regions + 0, 270*3dd2db53SJon Loeliger CFG_PCI_MEMORY_BUS, 271*3dd2db53SJon Loeliger CFG_PCI_MEMORY_PHYS, 272*3dd2db53SJon Loeliger CFG_PCI_MEMORY_SIZE, 273*3dd2db53SJon Loeliger PCI_REGION_MEM | PCI_REGION_MEMORY); 274*3dd2db53SJon Loeliger 275*3dd2db53SJon Loeliger /* outbound memory */ 276*3dd2db53SJon Loeliger pci_set_region(hose->regions + 1, 277*3dd2db53SJon Loeliger CFG_PCIE1_MEM_BASE, 278*3dd2db53SJon Loeliger CFG_PCIE1_MEM_PHYS, 279*3dd2db53SJon Loeliger CFG_PCIE1_MEM_SIZE, 280*3dd2db53SJon Loeliger PCI_REGION_MEM); 281*3dd2db53SJon Loeliger 282*3dd2db53SJon Loeliger /* outbound io */ 283*3dd2db53SJon Loeliger pci_set_region(hose->regions + 2, 284*3dd2db53SJon Loeliger CFG_PCIE1_IO_BASE, 285*3dd2db53SJon Loeliger CFG_PCIE1_IO_PHYS, 286*3dd2db53SJon Loeliger CFG_PCIE1_IO_SIZE, 287*3dd2db53SJon Loeliger PCI_REGION_IO); 288*3dd2db53SJon Loeliger 289*3dd2db53SJon Loeliger hose->region_count = 3; 290*3dd2db53SJon Loeliger 291*3dd2db53SJon Loeliger hose->first_busno = first_free_busno; 292*3dd2db53SJon Loeliger pci_setup_indirect(hose, (int)&pci->cfg_addr, 293*3dd2db53SJon Loeliger (int)&pci->cfg_data); 294*3dd2db53SJon Loeliger 295*3dd2db53SJon Loeliger fsl_pci_init(hose); 296*3dd2db53SJon Loeliger 297*3dd2db53SJon Loeliger first_free_busno = hose->last_busno + 1; 298*3dd2db53SJon Loeliger printf(" PCI-Express 1 on bus %02x - %02x\n", 299*3dd2db53SJon Loeliger hose->first_busno, hose->last_busno); 300*3dd2db53SJon Loeliger 301*3dd2db53SJon Loeliger } else 302*3dd2db53SJon Loeliger puts(" PCI-Express 1: Disabled\n"); 303*3dd2db53SJon Loeliger } 304*3dd2db53SJon Loeliger #else 305*3dd2db53SJon Loeliger puts("PCI-Express 1: Disabled\n"); 306*3dd2db53SJon Loeliger #endif /* CONFIG_PCIE1 */ 307*3dd2db53SJon Loeliger 308*3dd2db53SJon Loeliger 309*3dd2db53SJon Loeliger #ifdef CONFIG_PCIE2 310*3dd2db53SJon Loeliger { 311*3dd2db53SJon Loeliger volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCIE2_ADDR; 312*3dd2db53SJon Loeliger extern void fsl_pci_init(struct pci_controller *hose); 313*3dd2db53SJon Loeliger struct pci_controller *hose = &pcie2_hose; 314*3dd2db53SJon Loeliger 315*3dd2db53SJon Loeliger int pcie_configured = (io_sel == 0) || (io_sel == 4); 316*3dd2db53SJon Loeliger int pcie_ep = (host_agent == 0) || (host_agent == 1) || 317*3dd2db53SJon Loeliger (host_agent == 4); 318*3dd2db53SJon Loeliger 319*3dd2db53SJon Loeliger if (pcie_configured && !(devdisr & MPC86xx_DEVDISR_PCIE2)) { 320*3dd2db53SJon Loeliger printf(" PCI-Express 2 connected to slot as %s" \ 321*3dd2db53SJon Loeliger " (base address %x)\n", 322*3dd2db53SJon Loeliger pcie_ep ? "End Point" : "Root Complex", 323*3dd2db53SJon Loeliger (uint)pci); 324*3dd2db53SJon Loeliger if (pci->pme_msg_det) 325*3dd2db53SJon Loeliger pci->pme_msg_det = 0xffffffff; 326*3dd2db53SJon Loeliger 327*3dd2db53SJon Loeliger /* inbound */ 328*3dd2db53SJon Loeliger pci_set_region(hose->regions + 0, 329*3dd2db53SJon Loeliger CFG_PCI_MEMORY_BUS, 330*3dd2db53SJon Loeliger CFG_PCI_MEMORY_PHYS, 331*3dd2db53SJon Loeliger CFG_PCI_MEMORY_SIZE, 332*3dd2db53SJon Loeliger PCI_REGION_MEM | PCI_REGION_MEMORY); 333*3dd2db53SJon Loeliger 334*3dd2db53SJon Loeliger /* outbound memory */ 335*3dd2db53SJon Loeliger pci_set_region(hose->regions + 1, 336*3dd2db53SJon Loeliger CFG_PCIE2_MEM_BASE, 337*3dd2db53SJon Loeliger CFG_PCIE2_MEM_PHYS, 338*3dd2db53SJon Loeliger CFG_PCIE2_MEM_SIZE, 339*3dd2db53SJon Loeliger PCI_REGION_MEM); 340*3dd2db53SJon Loeliger 341*3dd2db53SJon Loeliger /* outbound io */ 342*3dd2db53SJon Loeliger pci_set_region(hose->regions + 2, 343*3dd2db53SJon Loeliger CFG_PCIE2_IO_BASE, 344*3dd2db53SJon Loeliger CFG_PCIE2_IO_PHYS, 345*3dd2db53SJon Loeliger CFG_PCIE2_IO_SIZE, 346*3dd2db53SJon Loeliger PCI_REGION_IO); 347*3dd2db53SJon Loeliger 348*3dd2db53SJon Loeliger hose->region_count = 3; 349*3dd2db53SJon Loeliger 350*3dd2db53SJon Loeliger hose->first_busno = first_free_busno; 351*3dd2db53SJon Loeliger pci_setup_indirect(hose, (int)&pci->cfg_addr, 352*3dd2db53SJon Loeliger (int)&pci->cfg_data); 353*3dd2db53SJon Loeliger 354*3dd2db53SJon Loeliger fsl_pci_init(hose); 355*3dd2db53SJon Loeliger 356*3dd2db53SJon Loeliger first_free_busno = hose->last_busno + 1; 357*3dd2db53SJon Loeliger printf(" PCI-Express 2 on bus %02x - %02x\n", 358*3dd2db53SJon Loeliger hose->first_busno, hose->last_busno); 359*3dd2db53SJon Loeliger } else 360*3dd2db53SJon Loeliger puts(" PCI-Express 2: Disabled\n"); 361*3dd2db53SJon Loeliger } 362*3dd2db53SJon Loeliger #else 363*3dd2db53SJon Loeliger puts("PCI-Express 2: Disabled\n"); 364*3dd2db53SJon Loeliger #endif /* CONFIG_PCIE2 */ 365*3dd2db53SJon Loeliger 366*3dd2db53SJon Loeliger 367*3dd2db53SJon Loeliger #ifdef CONFIG_PCI1 368*3dd2db53SJon Loeliger { 369*3dd2db53SJon Loeliger volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCI1_ADDR; 370*3dd2db53SJon Loeliger extern void fsl_pci_init(struct pci_controller *hose); 371*3dd2db53SJon Loeliger struct pci_controller *hose = &pci1_hose; 372*3dd2db53SJon Loeliger int pci_agent = (host_agent >= 4) && (host_agent <= 6); 373*3dd2db53SJon Loeliger 374*3dd2db53SJon Loeliger if ( !(devdisr & MPC86xx_DEVDISR_PCI1)) { 375*3dd2db53SJon Loeliger printf(" PCI connected to PCI slots as %s" \ 376*3dd2db53SJon Loeliger " (base address %x)\n", 377*3dd2db53SJon Loeliger pci_agent ? "Agent" : "Host", 378*3dd2db53SJon Loeliger (uint)pci); 379*3dd2db53SJon Loeliger 380*3dd2db53SJon Loeliger /* inbound */ 381*3dd2db53SJon Loeliger pci_set_region(hose->regions + 0, 382*3dd2db53SJon Loeliger CFG_PCI_MEMORY_BUS, 383*3dd2db53SJon Loeliger CFG_PCI_MEMORY_PHYS, 384*3dd2db53SJon Loeliger CFG_PCI_MEMORY_SIZE, 385*3dd2db53SJon Loeliger PCI_REGION_MEM | PCI_REGION_MEMORY); 386*3dd2db53SJon Loeliger 387*3dd2db53SJon Loeliger /* outbound memory */ 388*3dd2db53SJon Loeliger pci_set_region(hose->regions + 1, 389*3dd2db53SJon Loeliger CFG_PCI1_MEM_BASE, 390*3dd2db53SJon Loeliger CFG_PCI1_MEM_PHYS, 391*3dd2db53SJon Loeliger CFG_PCI1_MEM_SIZE, 392*3dd2db53SJon Loeliger PCI_REGION_MEM); 393*3dd2db53SJon Loeliger 394*3dd2db53SJon Loeliger /* outbound io */ 395*3dd2db53SJon Loeliger pci_set_region(hose->regions + 2, 396*3dd2db53SJon Loeliger CFG_PCI1_IO_BASE, 397*3dd2db53SJon Loeliger CFG_PCI1_IO_PHYS, 398*3dd2db53SJon Loeliger CFG_PCI1_IO_SIZE, 399*3dd2db53SJon Loeliger PCI_REGION_IO); 400*3dd2db53SJon Loeliger 401*3dd2db53SJon Loeliger hose->region_count = 3; 402*3dd2db53SJon Loeliger 403*3dd2db53SJon Loeliger hose->first_busno = first_free_busno; 404*3dd2db53SJon Loeliger pci_setup_indirect(hose, (int) &pci->cfg_addr, 405*3dd2db53SJon Loeliger (int) &pci->cfg_data); 406*3dd2db53SJon Loeliger 407*3dd2db53SJon Loeliger fsl_pci_init(hose); 408*3dd2db53SJon Loeliger 409*3dd2db53SJon Loeliger first_free_busno = hose->last_busno + 1; 410*3dd2db53SJon Loeliger printf(" PCI on bus %02x - %02x\n", 411*3dd2db53SJon Loeliger hose->first_busno, hose->last_busno); 412*3dd2db53SJon Loeliger 413*3dd2db53SJon Loeliger 414*3dd2db53SJon Loeliger } else 415*3dd2db53SJon Loeliger puts(" PCI: Disabled\n"); 416*3dd2db53SJon Loeliger } 417*3dd2db53SJon Loeliger #endif /* CONFIG_PCI1 */ 418*3dd2db53SJon Loeliger } 419*3dd2db53SJon Loeliger 420*3dd2db53SJon Loeliger #if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) 421*3dd2db53SJon Loeliger void 422*3dd2db53SJon Loeliger ft_board_setup(void *blob, bd_t *bd) 423*3dd2db53SJon Loeliger { 424*3dd2db53SJon Loeliger u32 *p; 425*3dd2db53SJon Loeliger int len; 426*3dd2db53SJon Loeliger 427*3dd2db53SJon Loeliger ft_cpu_setup(blob, bd); 428*3dd2db53SJon Loeliger 429*3dd2db53SJon Loeliger p = ft_get_prop(blob, "/memory/reg", &len); 430*3dd2db53SJon Loeliger if (p != NULL) { 431*3dd2db53SJon Loeliger *p++ = cpu_to_be32(bd->bi_memstart); 432*3dd2db53SJon Loeliger *p = cpu_to_be32(bd->bi_memsize); 433*3dd2db53SJon Loeliger } 434*3dd2db53SJon Loeliger 435*3dd2db53SJon Loeliger #ifdef CONFIG_PCI1 436*3dd2db53SJon Loeliger p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8000/bus-range", &len); 437*3dd2db53SJon Loeliger if (p != NULL) { 438*3dd2db53SJon Loeliger p[0] = 0; 439*3dd2db53SJon Loeliger p[1] = pci1_hose.last_busno - pci1_hose.first_busno; 440*3dd2db53SJon Loeliger debug("pci@8000 first_busno=%d last_busno=%d\n",p[0],p[1]); 441*3dd2db53SJon Loeliger } 442*3dd2db53SJon Loeliger #endif 443*3dd2db53SJon Loeliger #ifdef CONFIG_PCIE1 444*3dd2db53SJon Loeliger p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pcie@a000/bus-range", &len); 445*3dd2db53SJon Loeliger if (p != NULL) { 446*3dd2db53SJon Loeliger p[0] = 0; 447*3dd2db53SJon Loeliger p[1] = pcie1_hose.last_busno - pcie1_hose.first_busno; 448*3dd2db53SJon Loeliger debug("pcie@9000 first_busno=%d last_busno=%d\n",p[0],p[1]); 449*3dd2db53SJon Loeliger } 450*3dd2db53SJon Loeliger #endif 451*3dd2db53SJon Loeliger #ifdef CONFIG_PCIE2 452*3dd2db53SJon Loeliger p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pcie@9000/bus-range", &len); 453*3dd2db53SJon Loeliger if (p != NULL) { 454*3dd2db53SJon Loeliger p[0] = 0; 455*3dd2db53SJon Loeliger p[1] = pcie2_hose.last_busno - pcie2_hose.first_busno; 456*3dd2db53SJon Loeliger debug("pcie@9000 first_busno=%d last_busno=%d\n",p[0],p[1]); 457*3dd2db53SJon Loeliger } 458*3dd2db53SJon Loeliger #endif 459*3dd2db53SJon Loeliger 460*3dd2db53SJon Loeliger } 461*3dd2db53SJon Loeliger #endif 462*3dd2db53SJon Loeliger 463*3dd2db53SJon Loeliger /* 464*3dd2db53SJon Loeliger * get_board_sys_clk 465*3dd2db53SJon Loeliger * Reads the FPGA on board for CONFIG_SYS_CLK_FREQ 466*3dd2db53SJon Loeliger */ 467*3dd2db53SJon Loeliger 468*3dd2db53SJon Loeliger unsigned long 469*3dd2db53SJon Loeliger get_board_sys_clk(ulong dummy) 470*3dd2db53SJon Loeliger { 471*3dd2db53SJon Loeliger u8 i, go_bit, rd_clks; 472*3dd2db53SJon Loeliger ulong val = 0; 473*3dd2db53SJon Loeliger ulong a; 474*3dd2db53SJon Loeliger 475*3dd2db53SJon Loeliger a = PIXIS_BASE + PIXIS_SPD; 476*3dd2db53SJon Loeliger i = in8(a); 477*3dd2db53SJon Loeliger i &= 0x07; 478*3dd2db53SJon Loeliger 479*3dd2db53SJon Loeliger switch (i) { 480*3dd2db53SJon Loeliger case 0: 481*3dd2db53SJon Loeliger val = 33333000; 482*3dd2db53SJon Loeliger break; 483*3dd2db53SJon Loeliger case 1: 484*3dd2db53SJon Loeliger val = 39999600; 485*3dd2db53SJon Loeliger break; 486*3dd2db53SJon Loeliger case 2: 487*3dd2db53SJon Loeliger val = 49999500; 488*3dd2db53SJon Loeliger break; 489*3dd2db53SJon Loeliger case 3: 490*3dd2db53SJon Loeliger val = 66666000; 491*3dd2db53SJon Loeliger break; 492*3dd2db53SJon Loeliger case 4: 493*3dd2db53SJon Loeliger val = 83332500; 494*3dd2db53SJon Loeliger break; 495*3dd2db53SJon Loeliger case 5: 496*3dd2db53SJon Loeliger val = 99999000; 497*3dd2db53SJon Loeliger break; 498*3dd2db53SJon Loeliger case 6: 499*3dd2db53SJon Loeliger val = 133332000; 500*3dd2db53SJon Loeliger break; 501*3dd2db53SJon Loeliger case 7: 502*3dd2db53SJon Loeliger val = 166665000; 503*3dd2db53SJon Loeliger break; 504*3dd2db53SJon Loeliger } 505*3dd2db53SJon Loeliger 506*3dd2db53SJon Loeliger return val; 507*3dd2db53SJon Loeliger } 508