1129ba616SKumar Gala /* 2129ba616SKumar Gala * Copyright 2007-2008 Freescale Semiconductor, Inc. 3129ba616SKumar Gala * 4129ba616SKumar Gala * See file CREDITS for list of people who contributed to this 5129ba616SKumar Gala * project. 6129ba616SKumar Gala * 7129ba616SKumar Gala * This program is free software; you can redistribute it and/or 8129ba616SKumar Gala * modify it under the terms of the GNU General Public License as 9129ba616SKumar Gala * published by the Free Software Foundation; either version 2 of 10129ba616SKumar Gala * the License, or (at your option) any later version. 11129ba616SKumar Gala * 12129ba616SKumar Gala * This program is distributed in the hope that it will be useful, 13129ba616SKumar Gala * but WITHOUT ANY WARRANTY; without even the implied warranty of 14129ba616SKumar Gala * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15129ba616SKumar Gala * GNU General Public License for more details. 16129ba616SKumar Gala * 17129ba616SKumar Gala * You should have received a copy of the GNU General Public License 18129ba616SKumar Gala * along with this program; if not, write to the Free Software 19129ba616SKumar Gala * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20129ba616SKumar Gala * MA 02111-1307 USA 21129ba616SKumar Gala */ 22129ba616SKumar Gala 23129ba616SKumar Gala #include <common.h> 24129ba616SKumar Gala #include <command.h> 25129ba616SKumar Gala #include <pci.h> 26129ba616SKumar Gala #include <asm/processor.h> 27129ba616SKumar Gala #include <asm/mmu.h> 287c0d4a75SKumar Gala #include <asm/cache.h> 29129ba616SKumar Gala #include <asm/immap_85xx.h> 30c8514622SKumar Gala #include <asm/fsl_pci.h> 31129ba616SKumar Gala #include <asm/fsl_ddr_sdram.h> 32129ba616SKumar Gala #include <asm/io.h> 33129ba616SKumar Gala #include <miiphy.h> 34129ba616SKumar Gala #include <libfdt.h> 35129ba616SKumar Gala #include <fdt_support.h> 367e183cadSLiu Yu #include <tsec.h> 37129ba616SKumar Gala 38129ba616SKumar Gala #include "../common/pixis.h" 397e183cadSLiu Yu #include "../common/sgmii_riser.h" 40129ba616SKumar Gala 41129ba616SKumar Gala long int fixed_sdram(void); 42129ba616SKumar Gala 43129ba616SKumar Gala int checkboard (void) 44129ba616SKumar Gala { 456bb5b412SKumar Gala u8 vboot; 466bb5b412SKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 476bb5b412SKumar Gala 48cb69e4deSKumar Gala puts ("Board: MPC8572DS "); 49cb69e4deSKumar Gala #ifdef CONFIG_PHYS_64BIT 50cb69e4deSKumar Gala puts ("(36-bit addrmap) "); 51cb69e4deSKumar Gala #endif 52cb69e4deSKumar Gala printf ("Sys ID: 0x%02x, " 536bb5b412SKumar Gala "Sys Ver: 0x%02x, FPGA Ver: 0x%02x, ", 546bb5b412SKumar Gala in_8(pixis_base + PIXIS_ID), in_8(pixis_base + PIXIS_VER), 556bb5b412SKumar Gala in_8(pixis_base + PIXIS_PVER)); 566bb5b412SKumar Gala 576bb5b412SKumar Gala vboot = in_8(pixis_base + PIXIS_VBOOT); 586bb5b412SKumar Gala switch ((vboot & PIXIS_VBOOT_LBMAP) >> 6) { 596bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_NOR0: 606bb5b412SKumar Gala puts ("vBank: 0\n"); 616bb5b412SKumar Gala break; 626bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_PJET: 636bb5b412SKumar Gala puts ("Promjet\n"); 646bb5b412SKumar Gala break; 656bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_NAND: 666bb5b412SKumar Gala puts ("NAND\n"); 676bb5b412SKumar Gala break; 686bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_NOR1: 696bb5b412SKumar Gala puts ("vBank: 1\n"); 706bb5b412SKumar Gala break; 716bb5b412SKumar Gala } 726bb5b412SKumar Gala 73129ba616SKumar Gala return 0; 74129ba616SKumar Gala } 75129ba616SKumar Gala 76129ba616SKumar Gala phys_size_t initdram(int board_type) 77129ba616SKumar Gala { 78129ba616SKumar Gala phys_size_t dram_size = 0; 79129ba616SKumar Gala 80129ba616SKumar Gala puts("Initializing...."); 81129ba616SKumar Gala 82129ba616SKumar Gala #ifdef CONFIG_SPD_EEPROM 83129ba616SKumar Gala dram_size = fsl_ddr_sdram(); 84129ba616SKumar Gala #else 85129ba616SKumar Gala dram_size = fixed_sdram(); 86129ba616SKumar Gala #endif 87e57f0fa1SDave Liu dram_size = setup_ddr_tlbs(dram_size / 0x100000); 88e57f0fa1SDave Liu dram_size *= 0x100000; 89129ba616SKumar Gala 90129ba616SKumar Gala puts(" DDR: "); 91129ba616SKumar Gala return dram_size; 92129ba616SKumar Gala } 93129ba616SKumar Gala 94129ba616SKumar Gala #if !defined(CONFIG_SPD_EEPROM) 95129ba616SKumar Gala /* 96129ba616SKumar Gala * Fixed sdram init -- doesn't use serial presence detect. 97129ba616SKumar Gala */ 98129ba616SKumar Gala 99129ba616SKumar Gala phys_size_t fixed_sdram (void) 100129ba616SKumar Gala { 1016d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR; 102129ba616SKumar Gala volatile ccsr_ddr_t *ddr= &immap->im_ddr; 103129ba616SKumar Gala uint d_init; 104129ba616SKumar Gala 1056d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->cs0_bnds = CONFIG_SYS_DDR_CS0_BNDS; 1066d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->cs0_config = CONFIG_SYS_DDR_CS0_CONFIG; 107129ba616SKumar Gala 1086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3; 1096d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0; 1106d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1; 1116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2; 1126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_mode = CONFIG_SYS_DDR_MODE_1; 1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_mode_2 = CONFIG_SYS_DDR_MODE_2; 1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_interval = CONFIG_SYS_DDR_INTERVAL; 1156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_data_init = CONFIG_SYS_DDR_DATA_INIT; 1166d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL; 1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL2; 118129ba616SKumar Gala 119129ba616SKumar Gala #if defined (CONFIG_DDR_ECC) 1206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->err_int_en = CONFIG_SYS_DDR_ERR_INT_EN; 1216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->err_disable = CONFIG_SYS_DDR_ERR_DIS; 1226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->err_sbe = CONFIG_SYS_DDR_SBE; 123129ba616SKumar Gala #endif 124129ba616SKumar Gala asm("sync;isync"); 125129ba616SKumar Gala 126129ba616SKumar Gala udelay(500); 127129ba616SKumar Gala 1286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_cfg = CONFIG_SYS_DDR_CONTROL; 129129ba616SKumar Gala 130129ba616SKumar Gala #if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 131129ba616SKumar Gala d_init = 1; 132129ba616SKumar Gala debug("DDR - 1st controller: memory initializing\n"); 133129ba616SKumar Gala /* 134129ba616SKumar Gala * Poll until memory is initialized. 135129ba616SKumar Gala * 512 Meg at 400 might hit this 200 times or so. 136129ba616SKumar Gala */ 137129ba616SKumar Gala while ((ddr->sdram_cfg_2 & (d_init << 4)) != 0) { 138129ba616SKumar Gala udelay(1000); 139129ba616SKumar Gala } 140129ba616SKumar Gala debug("DDR: memory initialized\n\n"); 141129ba616SKumar Gala asm("sync; isync"); 142129ba616SKumar Gala udelay(500); 143129ba616SKumar Gala #endif 144129ba616SKumar Gala 145129ba616SKumar Gala return 512 * 1024 * 1024; 146129ba616SKumar Gala } 147129ba616SKumar Gala 148129ba616SKumar Gala #endif 149129ba616SKumar Gala 150129ba616SKumar Gala #ifdef CONFIG_PCIE1 151129ba616SKumar Gala static struct pci_controller pcie1_hose; 152129ba616SKumar Gala #endif 153129ba616SKumar Gala 154129ba616SKumar Gala #ifdef CONFIG_PCIE2 155129ba616SKumar Gala static struct pci_controller pcie2_hose; 156129ba616SKumar Gala #endif 157129ba616SKumar Gala 158129ba616SKumar Gala #ifdef CONFIG_PCIE3 159129ba616SKumar Gala static struct pci_controller pcie3_hose; 160129ba616SKumar Gala #endif 161129ba616SKumar Gala 162129ba616SKumar Gala int first_free_busno=0; 163129ba616SKumar Gala #ifdef CONFIG_PCI 164129ba616SKumar Gala void pci_init_board(void) 165129ba616SKumar Gala { 1666d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 167129ba616SKumar Gala uint devdisr = gur->devdisr; 168129ba616SKumar Gala uint io_sel = (gur->pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; 169129ba616SKumar Gala uint host_agent = (gur->porbmsr & MPC85xx_PORBMSR_HA) >> 16; 170129ba616SKumar Gala 171129ba616SKumar Gala debug (" pci_init_board: devdisr=%x, io_sel=%x, host_agent=%x\n", 172129ba616SKumar Gala devdisr, io_sel, host_agent); 173129ba616SKumar Gala 174129ba616SKumar Gala if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII1_DIS)) 175129ba616SKumar Gala printf (" eTSEC1 is in sgmii mode.\n"); 176129ba616SKumar Gala if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII2_DIS)) 177129ba616SKumar Gala printf (" eTSEC2 is in sgmii mode.\n"); 178129ba616SKumar Gala if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS)) 179129ba616SKumar Gala printf (" eTSEC3 is in sgmii mode.\n"); 180129ba616SKumar Gala if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII4_DIS)) 181129ba616SKumar Gala printf (" eTSEC4 is in sgmii mode.\n"); 182129ba616SKumar Gala 183129ba616SKumar Gala 184129ba616SKumar Gala #ifdef CONFIG_PCIE3 185129ba616SKumar Gala { 1866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCIE3_ADDR; 187129ba616SKumar Gala struct pci_controller *hose = &pcie3_hose; 188129ba616SKumar Gala int pcie_ep = (host_agent == 0) || (host_agent == 3) || 189129ba616SKumar Gala (host_agent == 5) || (host_agent == 6); 1909afc2ef0SRoy Zang int pcie_configured = (io_sel == 0x7); 1912dba0deaSKumar Gala struct pci_region *r = hose->regions; 192129ba616SKumar Gala u32 temp32; 193129ba616SKumar Gala 194028e1168SRoy Zang if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE3)){ 195129ba616SKumar Gala printf ("\n PCIE3 connected to ULI as %s (base address %x)", 196129ba616SKumar Gala pcie_ep ? "End Point" : "Root Complex", 197129ba616SKumar Gala (uint)pci); 198129ba616SKumar Gala if (pci->pme_msg_det) { 199129ba616SKumar Gala pci->pme_msg_det = 0xffffffff; 200129ba616SKumar Gala debug (" with errors. Clearing. Now 0x%08x",pci->pme_msg_det); 201129ba616SKumar Gala } 202129ba616SKumar Gala printf ("\n"); 203129ba616SKumar Gala 204129ba616SKumar Gala /* inbound */ 2052dba0deaSKumar Gala r += fsl_pci_setup_inbound_windows(r); 206129ba616SKumar Gala 207129ba616SKumar Gala /* outbound memory */ 2082dba0deaSKumar Gala pci_set_region(r++, 20910795f42SKumar Gala CONFIG_SYS_PCIE3_MEM_BUS, 2106d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE3_MEM_PHYS, 2116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE3_MEM_SIZE, 212129ba616SKumar Gala PCI_REGION_MEM); 213129ba616SKumar Gala 214129ba616SKumar Gala /* outbound io */ 2152dba0deaSKumar Gala pci_set_region(r++, 2165f91ef6aSKumar Gala CONFIG_SYS_PCIE3_IO_BUS, 2176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE3_IO_PHYS, 2186d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE3_IO_SIZE, 219129ba616SKumar Gala PCI_REGION_IO); 220129ba616SKumar Gala 2212dba0deaSKumar Gala hose->region_count = r - hose->regions; 222129ba616SKumar Gala hose->first_busno=first_free_busno; 223129ba616SKumar Gala pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); 224129ba616SKumar Gala 225129ba616SKumar Gala fsl_pci_init(hose); 226129ba616SKumar Gala 227129ba616SKumar Gala first_free_busno=hose->last_busno+1; 228129ba616SKumar Gala printf (" PCIE3 on bus %02x - %02x\n", 229129ba616SKumar Gala hose->first_busno,hose->last_busno); 230129ba616SKumar Gala 231129ba616SKumar Gala /* 232129ba616SKumar Gala * Activate ULI1575 legacy chip by performing a fake 233129ba616SKumar Gala * memory access. Needed to make ULI RTC work. 234129ba616SKumar Gala * Device 1d has the first on-board memory BAR. 235129ba616SKumar Gala */ 236129ba616SKumar Gala 237129ba616SKumar Gala pci_hose_read_config_dword(hose, PCI_BDF(2, 0x1d, 0 ), 238129ba616SKumar Gala PCI_BASE_ADDRESS_1, &temp32); 2395af0fdd8SKumar Gala if (temp32 >= CONFIG_SYS_PCIE3_MEM_BUS) { 240ad97dce1SKumar Gala void *p = pci_mem_to_virt(PCI_BDF(2, 0x1d, 0), 241ad97dce1SKumar Gala temp32, 4, 0); 242ad97dce1SKumar Gala debug(" uli1572 read to %p\n", p); 243ad97dce1SKumar Gala in_be32(p); 244129ba616SKumar Gala } 245129ba616SKumar Gala } else { 246129ba616SKumar Gala printf (" PCIE3: disabled\n"); 247129ba616SKumar Gala } 248129ba616SKumar Gala 249129ba616SKumar Gala } 250129ba616SKumar Gala #else 251129ba616SKumar Gala gur->devdisr |= MPC85xx_DEVDISR_PCIE3; /* disable */ 252129ba616SKumar Gala #endif 253129ba616SKumar Gala 254129ba616SKumar Gala #ifdef CONFIG_PCIE2 255129ba616SKumar Gala { 2566d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCIE2_ADDR; 257129ba616SKumar Gala struct pci_controller *hose = &pcie2_hose; 258129ba616SKumar Gala int pcie_ep = (host_agent == 2) || (host_agent == 4) || 25986be510fSEd Swarthout (host_agent == 6) || (host_agent == 0); 2609afc2ef0SRoy Zang int pcie_configured = (io_sel == 0x3) || (io_sel == 0x7); 2612dba0deaSKumar Gala struct pci_region *r = hose->regions; 262129ba616SKumar Gala 263028e1168SRoy Zang if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE2)){ 264129ba616SKumar Gala printf ("\n PCIE2 connected to Slot 1 as %s (base address %x)", 265129ba616SKumar Gala pcie_ep ? "End Point" : "Root Complex", 266129ba616SKumar Gala (uint)pci); 267129ba616SKumar Gala if (pci->pme_msg_det) { 268129ba616SKumar Gala pci->pme_msg_det = 0xffffffff; 269129ba616SKumar Gala debug (" with errors. Clearing. Now 0x%08x",pci->pme_msg_det); 270129ba616SKumar Gala } 271129ba616SKumar Gala printf ("\n"); 272129ba616SKumar Gala 273129ba616SKumar Gala /* inbound */ 2742dba0deaSKumar Gala r += fsl_pci_setup_inbound_windows(r); 275129ba616SKumar Gala 276129ba616SKumar Gala /* outbound memory */ 2772dba0deaSKumar Gala pci_set_region(r++, 27810795f42SKumar Gala CONFIG_SYS_PCIE2_MEM_BUS, 2796d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE2_MEM_PHYS, 2806d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE2_MEM_SIZE, 281129ba616SKumar Gala PCI_REGION_MEM); 282129ba616SKumar Gala 283129ba616SKumar Gala /* outbound io */ 2842dba0deaSKumar Gala pci_set_region(r++, 2855f91ef6aSKumar Gala CONFIG_SYS_PCIE2_IO_BUS, 2866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE2_IO_PHYS, 2876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE2_IO_SIZE, 288129ba616SKumar Gala PCI_REGION_IO); 289129ba616SKumar Gala 2902dba0deaSKumar Gala hose->region_count = r - hose->regions; 291129ba616SKumar Gala hose->first_busno=first_free_busno; 292129ba616SKumar Gala pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); 293129ba616SKumar Gala 294129ba616SKumar Gala fsl_pci_init(hose); 295129ba616SKumar Gala first_free_busno=hose->last_busno+1; 296129ba616SKumar Gala printf (" PCIE2 on bus %02x - %02x\n", 297129ba616SKumar Gala hose->first_busno,hose->last_busno); 298129ba616SKumar Gala 299129ba616SKumar Gala } else { 300129ba616SKumar Gala printf (" PCIE2: disabled\n"); 301129ba616SKumar Gala } 302129ba616SKumar Gala 303129ba616SKumar Gala } 304129ba616SKumar Gala #else 305129ba616SKumar Gala gur->devdisr |= MPC85xx_DEVDISR_PCIE2; /* disable */ 306129ba616SKumar Gala #endif 307129ba616SKumar Gala #ifdef CONFIG_PCIE1 308129ba616SKumar Gala { 3096d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCIE1_ADDR; 310129ba616SKumar Gala struct pci_controller *hose = &pcie1_hose; 31186be510fSEd Swarthout int pcie_ep = (host_agent <= 1) || (host_agent == 4) || 312129ba616SKumar Gala (host_agent == 5); 3139afc2ef0SRoy Zang int pcie_configured = (io_sel == 0x2) || (io_sel == 0x3) || 3149afc2ef0SRoy Zang (io_sel == 0x7) || (io_sel == 0xb) || 3159afc2ef0SRoy Zang (io_sel == 0xc) || (io_sel == 0xf); 3162dba0deaSKumar Gala struct pci_region *r = hose->regions; 317129ba616SKumar Gala 318129ba616SKumar Gala if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE)){ 319129ba616SKumar Gala printf ("\n PCIE1 connected to Slot 2 as %s (base address %x)", 320129ba616SKumar Gala pcie_ep ? "End Point" : "Root Complex", 321129ba616SKumar Gala (uint)pci); 322129ba616SKumar Gala if (pci->pme_msg_det) { 323129ba616SKumar Gala pci->pme_msg_det = 0xffffffff; 324129ba616SKumar Gala debug (" with errors. Clearing. Now 0x%08x",pci->pme_msg_det); 325129ba616SKumar Gala } 326129ba616SKumar Gala printf ("\n"); 327129ba616SKumar Gala 328129ba616SKumar Gala /* inbound */ 3292dba0deaSKumar Gala r += fsl_pci_setup_inbound_windows(r); 330129ba616SKumar Gala 331129ba616SKumar Gala /* outbound memory */ 3322dba0deaSKumar Gala pci_set_region(r++, 33310795f42SKumar Gala CONFIG_SYS_PCIE1_MEM_BUS, 3346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_MEM_PHYS, 3356d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_MEM_SIZE, 336129ba616SKumar Gala PCI_REGION_MEM); 337129ba616SKumar Gala 338129ba616SKumar Gala /* outbound io */ 3392dba0deaSKumar Gala pci_set_region(r++, 3405f91ef6aSKumar Gala CONFIG_SYS_PCIE1_IO_BUS, 3416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_IO_PHYS, 3426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE1_IO_SIZE, 343129ba616SKumar Gala PCI_REGION_IO); 344129ba616SKumar Gala 3452dba0deaSKumar Gala hose->region_count = r - hose->regions; 346129ba616SKumar Gala hose->first_busno=first_free_busno; 347129ba616SKumar Gala 348129ba616SKumar Gala pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); 349129ba616SKumar Gala 350129ba616SKumar Gala fsl_pci_init(hose); 351129ba616SKumar Gala 352129ba616SKumar Gala first_free_busno=hose->last_busno+1; 353129ba616SKumar Gala printf(" PCIE1 on bus %02x - %02x\n", 354129ba616SKumar Gala hose->first_busno,hose->last_busno); 355129ba616SKumar Gala 356129ba616SKumar Gala } else { 357129ba616SKumar Gala printf (" PCIE1: disabled\n"); 358129ba616SKumar Gala } 359129ba616SKumar Gala 360129ba616SKumar Gala } 361129ba616SKumar Gala #else 362129ba616SKumar Gala gur->devdisr |= MPC85xx_DEVDISR_PCIE; /* disable */ 363129ba616SKumar Gala #endif 364129ba616SKumar Gala } 365129ba616SKumar Gala #endif 366129ba616SKumar Gala 367129ba616SKumar Gala int board_early_init_r(void) 368129ba616SKumar Gala { 3696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD const unsigned int flashbase = CONFIG_SYS_FLASH_BASE; 370129ba616SKumar Gala const u8 flash_esel = 2; 371129ba616SKumar Gala 372129ba616SKumar Gala /* 373129ba616SKumar Gala * Remap Boot flash + PROMJET region to caching-inhibited 374129ba616SKumar Gala * so that flash can be erased properly. 375129ba616SKumar Gala */ 376129ba616SKumar Gala 3777c0d4a75SKumar Gala /* Flush d-cache and invalidate i-cache of any FLASH data */ 3787c0d4a75SKumar Gala flush_dcache(); 3797c0d4a75SKumar Gala invalidate_icache(); 380129ba616SKumar Gala 381129ba616SKumar Gala /* invalidate existing TLB entry for flash + promjet */ 382129ba616SKumar Gala disable_tlb(flash_esel); 383129ba616SKumar Gala 384c953ddfdSKumar Gala set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS, /* tlb, epn, rpn */ 385129ba616SKumar Gala MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, /* perms, wimge */ 386129ba616SKumar Gala 0, flash_esel, BOOKE_PAGESZ_256M, 1); /* ts, esel, tsize, iprot */ 387129ba616SKumar Gala 388129ba616SKumar Gala return 0; 389129ba616SKumar Gala } 390129ba616SKumar Gala 391129ba616SKumar Gala #ifdef CONFIG_GET_CLK_FROM_ICS307 392129ba616SKumar Gala /* decode S[0-2] to Output Divider (OD) */ 393129ba616SKumar Gala static unsigned char ics307_S_to_OD[] = { 394129ba616SKumar Gala 10, 2, 8, 4, 5, 7, 3, 6 395129ba616SKumar Gala }; 396129ba616SKumar Gala 397129ba616SKumar Gala /* Calculate frequency being generated by ICS307-02 clock chip based upon 398129ba616SKumar Gala * the control bytes being programmed into it. */ 399129ba616SKumar Gala /* XXX: This function should probably go into a common library */ 400129ba616SKumar Gala static unsigned long 401129ba616SKumar Gala ics307_clk_freq (unsigned char cw0, unsigned char cw1, unsigned char cw2) 402129ba616SKumar Gala { 403129ba616SKumar Gala const unsigned long InputFrequency = CONFIG_ICS307_REFCLK_HZ; 404129ba616SKumar Gala unsigned long VDW = ((cw1 << 1) & 0x1FE) + ((cw2 >> 7) & 1); 405129ba616SKumar Gala unsigned long RDW = cw2 & 0x7F; 406129ba616SKumar Gala unsigned long OD = ics307_S_to_OD[cw0 & 0x7]; 407129ba616SKumar Gala unsigned long freq; 408129ba616SKumar Gala 409129ba616SKumar Gala /* CLK1Frequency = InputFrequency * 2 * (VDW + 8) / ((RDW + 2) * OD) */ 410129ba616SKumar Gala 411129ba616SKumar Gala /* cw0: C1 C0 TTL F1 F0 S2 S1 S0 412129ba616SKumar Gala * cw1: V8 V7 V6 V5 V4 V3 V2 V1 413129ba616SKumar Gala * cw2: V0 R6 R5 R4 R3 R2 R1 R0 414129ba616SKumar Gala * 415129ba616SKumar Gala * R6:R0 = Reference Divider Word (RDW) 416129ba616SKumar Gala * V8:V0 = VCO Divider Word (VDW) 417129ba616SKumar Gala * S2:S0 = Output Divider Select (OD) 418129ba616SKumar Gala * F1:F0 = Function of CLK2 Output 419129ba616SKumar Gala * TTL = duty cycle 420129ba616SKumar Gala * C1:C0 = internal load capacitance for cyrstal 421129ba616SKumar Gala */ 422129ba616SKumar Gala 423129ba616SKumar Gala /* Adding 1 to get a "nicely" rounded number, but this needs 424129ba616SKumar Gala * more tweaking to get a "properly" rounded number. */ 425129ba616SKumar Gala 426129ba616SKumar Gala freq = 1 + (InputFrequency * 2 * (VDW + 8) / ((RDW + 2) * OD)); 427129ba616SKumar Gala 428129ba616SKumar Gala debug("ICS307: CW[0-2]: %02X %02X %02X => %u Hz\n", cw0, cw1, cw2, 429129ba616SKumar Gala freq); 430129ba616SKumar Gala return freq; 431129ba616SKumar Gala } 432129ba616SKumar Gala 433129ba616SKumar Gala unsigned long get_board_sys_clk(ulong dummy) 434129ba616SKumar Gala { 435*048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 436*048e7efeSKumar Gala 437129ba616SKumar Gala return ics307_clk_freq ( 438*048e7efeSKumar Gala in_8(pixis_base + PIXIS_VSYSCLK0), 439*048e7efeSKumar Gala in_8(pixis_base + PIXIS_VSYSCLK1), 440*048e7efeSKumar Gala in_8(pixis_base + PIXIS_VSYSCLK2) 441129ba616SKumar Gala ); 442129ba616SKumar Gala } 443129ba616SKumar Gala 444129ba616SKumar Gala unsigned long get_board_ddr_clk(ulong dummy) 445129ba616SKumar Gala { 446*048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 447*048e7efeSKumar Gala 448129ba616SKumar Gala return ics307_clk_freq ( 449*048e7efeSKumar Gala in_8(pixis_base + PIXIS_VDDRCLK0), 450*048e7efeSKumar Gala in_8(pixis_base + PIXIS_VDDRCLK1), 451*048e7efeSKumar Gala in_8(pixis_base + PIXIS_VDDRCLK2) 452129ba616SKumar Gala ); 453129ba616SKumar Gala } 454129ba616SKumar Gala #else 455129ba616SKumar Gala unsigned long get_board_sys_clk(ulong dummy) 456129ba616SKumar Gala { 457129ba616SKumar Gala u8 i; 458129ba616SKumar Gala ulong val = 0; 459*048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 460129ba616SKumar Gala 461*048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_SPD); 462129ba616SKumar Gala i &= 0x07; 463129ba616SKumar Gala 464129ba616SKumar Gala switch (i) { 465129ba616SKumar Gala case 0: 466129ba616SKumar Gala val = 33333333; 467129ba616SKumar Gala break; 468129ba616SKumar Gala case 1: 469129ba616SKumar Gala val = 40000000; 470129ba616SKumar Gala break; 471129ba616SKumar Gala case 2: 472129ba616SKumar Gala val = 50000000; 473129ba616SKumar Gala break; 474129ba616SKumar Gala case 3: 475129ba616SKumar Gala val = 66666666; 476129ba616SKumar Gala break; 477129ba616SKumar Gala case 4: 478129ba616SKumar Gala val = 83333333; 479129ba616SKumar Gala break; 480129ba616SKumar Gala case 5: 481129ba616SKumar Gala val = 100000000; 482129ba616SKumar Gala break; 483129ba616SKumar Gala case 6: 484129ba616SKumar Gala val = 133333333; 485129ba616SKumar Gala break; 486129ba616SKumar Gala case 7: 487129ba616SKumar Gala val = 166666666; 488129ba616SKumar Gala break; 489129ba616SKumar Gala } 490129ba616SKumar Gala 491129ba616SKumar Gala return val; 492129ba616SKumar Gala } 493129ba616SKumar Gala 494129ba616SKumar Gala unsigned long get_board_ddr_clk(ulong dummy) 495129ba616SKumar Gala { 496129ba616SKumar Gala u8 i; 497129ba616SKumar Gala ulong val = 0; 498*048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 499129ba616SKumar Gala 500*048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_SPD); 501129ba616SKumar Gala i &= 0x38; 502129ba616SKumar Gala i >>= 3; 503129ba616SKumar Gala 504129ba616SKumar Gala switch (i) { 505129ba616SKumar Gala case 0: 506129ba616SKumar Gala val = 33333333; 507129ba616SKumar Gala break; 508129ba616SKumar Gala case 1: 509129ba616SKumar Gala val = 40000000; 510129ba616SKumar Gala break; 511129ba616SKumar Gala case 2: 512129ba616SKumar Gala val = 50000000; 513129ba616SKumar Gala break; 514129ba616SKumar Gala case 3: 515129ba616SKumar Gala val = 66666666; 516129ba616SKumar Gala break; 517129ba616SKumar Gala case 4: 518129ba616SKumar Gala val = 83333333; 519129ba616SKumar Gala break; 520129ba616SKumar Gala case 5: 521129ba616SKumar Gala val = 100000000; 522129ba616SKumar Gala break; 523129ba616SKumar Gala case 6: 524129ba616SKumar Gala val = 133333333; 525129ba616SKumar Gala break; 526129ba616SKumar Gala case 7: 527129ba616SKumar Gala val = 166666666; 528129ba616SKumar Gala break; 529129ba616SKumar Gala } 530129ba616SKumar Gala return val; 531129ba616SKumar Gala } 532129ba616SKumar Gala #endif 533129ba616SKumar Gala 5347e183cadSLiu Yu #ifdef CONFIG_TSEC_ENET 5357e183cadSLiu Yu int board_eth_init(bd_t *bis) 5367e183cadSLiu Yu { 5377e183cadSLiu Yu struct tsec_info_struct tsec_info[4]; 5387e183cadSLiu Yu volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 5397e183cadSLiu Yu int num = 0; 5407e183cadSLiu Yu 5417e183cadSLiu Yu #ifdef CONFIG_TSEC1 5427e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 1); 5437e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII1_DIS)) 5447e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 5457e183cadSLiu Yu num++; 5467e183cadSLiu Yu #endif 5477e183cadSLiu Yu #ifdef CONFIG_TSEC2 5487e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 2); 5497e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII2_DIS)) 5507e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 5517e183cadSLiu Yu num++; 5527e183cadSLiu Yu #endif 5537e183cadSLiu Yu #ifdef CONFIG_TSEC3 5547e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 3); 5557e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS)) 5567e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 5577e183cadSLiu Yu num++; 5587e183cadSLiu Yu #endif 5597e183cadSLiu Yu #ifdef CONFIG_TSEC4 5607e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 4); 5617e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII4_DIS)) 5627e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 5637e183cadSLiu Yu num++; 5647e183cadSLiu Yu #endif 5657e183cadSLiu Yu 5667e183cadSLiu Yu if (!num) { 5677e183cadSLiu Yu printf("No TSECs initialized\n"); 5687e183cadSLiu Yu 5697e183cadSLiu Yu return 0; 5707e183cadSLiu Yu } 5717e183cadSLiu Yu 572feede8b0SAndy Fleming #ifdef CONFIG_FSL_SGMII_RISER 5737e183cadSLiu Yu fsl_sgmii_riser_init(tsec_info, num); 574feede8b0SAndy Fleming #endif 5757e183cadSLiu Yu 5767e183cadSLiu Yu tsec_eth_init(bis, tsec_info, num); 5777e183cadSLiu Yu 5787e183cadSLiu Yu return 0; 5797e183cadSLiu Yu } 5807e183cadSLiu Yu #endif 5817e183cadSLiu Yu 582129ba616SKumar Gala #if defined(CONFIG_OF_BOARD_SETUP) 583129ba616SKumar Gala void ft_board_setup(void *blob, bd_t *bd) 584129ba616SKumar Gala { 585b6730512SKumar Gala phys_addr_t base; 586b6730512SKumar Gala phys_size_t size; 587129ba616SKumar Gala 588129ba616SKumar Gala ft_cpu_setup(blob, bd); 589129ba616SKumar Gala 590129ba616SKumar Gala base = getenv_bootm_low(); 591129ba616SKumar Gala size = getenv_bootm_size(); 592129ba616SKumar Gala 593129ba616SKumar Gala fdt_fixup_memory(blob, (u64)base, (u64)size); 594129ba616SKumar Gala 595129ba616SKumar Gala #ifdef CONFIG_PCIE3 5962dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci0", &pcie3_hose); 597129ba616SKumar Gala #endif 598129ba616SKumar Gala #ifdef CONFIG_PCIE2 5992dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci1", &pcie2_hose); 600129ba616SKumar Gala #endif 601129ba616SKumar Gala #ifdef CONFIG_PCIE1 6022dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci2", &pcie1_hose); 603129ba616SKumar Gala #endif 604feede8b0SAndy Fleming #ifdef CONFIG_FSL_SGMII_RISER 605feede8b0SAndy Fleming fsl_sgmii_riser_fdt_fixup(blob); 606feede8b0SAndy Fleming #endif 607129ba616SKumar Gala } 608129ba616SKumar Gala #endif 609129ba616SKumar Gala 610129ba616SKumar Gala #ifdef CONFIG_MP 611129ba616SKumar Gala extern void cpu_mp_lmb_reserve(struct lmb *lmb); 612129ba616SKumar Gala 613129ba616SKumar Gala void board_lmb_reserve(struct lmb *lmb) 614129ba616SKumar Gala { 615129ba616SKumar Gala cpu_mp_lmb_reserve(lmb); 616129ba616SKumar Gala } 617129ba616SKumar Gala #endif 618