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> 37b560ab85SKumar Gala #include <netdev.h> 38129ba616SKumar Gala 39129ba616SKumar Gala #include "../common/pixis.h" 407e183cadSLiu Yu #include "../common/sgmii_riser.h" 41129ba616SKumar Gala 42129ba616SKumar Gala long int fixed_sdram(void); 43129ba616SKumar Gala 44129ba616SKumar Gala int checkboard (void) 45129ba616SKumar Gala { 466bb5b412SKumar Gala u8 vboot; 476bb5b412SKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 486bb5b412SKumar Gala 49cb69e4deSKumar Gala puts ("Board: MPC8572DS "); 50cb69e4deSKumar Gala #ifdef CONFIG_PHYS_64BIT 51cb69e4deSKumar Gala puts ("(36-bit addrmap) "); 52cb69e4deSKumar Gala #endif 53cb69e4deSKumar Gala printf ("Sys ID: 0x%02x, " 546bb5b412SKumar Gala "Sys Ver: 0x%02x, FPGA Ver: 0x%02x, ", 556bb5b412SKumar Gala in_8(pixis_base + PIXIS_ID), in_8(pixis_base + PIXIS_VER), 566bb5b412SKumar Gala in_8(pixis_base + PIXIS_PVER)); 576bb5b412SKumar Gala 586bb5b412SKumar Gala vboot = in_8(pixis_base + PIXIS_VBOOT); 596bb5b412SKumar Gala switch ((vboot & PIXIS_VBOOT_LBMAP) >> 6) { 606bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_NOR0: 616bb5b412SKumar Gala puts ("vBank: 0\n"); 626bb5b412SKumar Gala break; 636bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_PJET: 646bb5b412SKumar Gala puts ("Promjet\n"); 656bb5b412SKumar Gala break; 666bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_NAND: 676bb5b412SKumar Gala puts ("NAND\n"); 686bb5b412SKumar Gala break; 696bb5b412SKumar Gala case PIXIS_VBOOT_LBMAP_NOR1: 706bb5b412SKumar Gala puts ("vBank: 1\n"); 716bb5b412SKumar Gala break; 726bb5b412SKumar Gala } 736bb5b412SKumar Gala 74129ba616SKumar Gala return 0; 75129ba616SKumar Gala } 76129ba616SKumar Gala 77129ba616SKumar Gala phys_size_t initdram(int board_type) 78129ba616SKumar Gala { 79129ba616SKumar Gala phys_size_t dram_size = 0; 80129ba616SKumar Gala 81129ba616SKumar Gala puts("Initializing...."); 82129ba616SKumar Gala 83129ba616SKumar Gala #ifdef CONFIG_SPD_EEPROM 84129ba616SKumar Gala dram_size = fsl_ddr_sdram(); 85129ba616SKumar Gala #else 86129ba616SKumar Gala dram_size = fixed_sdram(); 87129ba616SKumar Gala #endif 88e57f0fa1SDave Liu dram_size = setup_ddr_tlbs(dram_size / 0x100000); 89e57f0fa1SDave Liu dram_size *= 0x100000; 90129ba616SKumar Gala 91129ba616SKumar Gala puts(" DDR: "); 92129ba616SKumar Gala return dram_size; 93129ba616SKumar Gala } 94129ba616SKumar Gala 95129ba616SKumar Gala #if !defined(CONFIG_SPD_EEPROM) 96129ba616SKumar Gala /* 97129ba616SKumar Gala * Fixed sdram init -- doesn't use serial presence detect. 98129ba616SKumar Gala */ 99129ba616SKumar Gala 100129ba616SKumar Gala phys_size_t fixed_sdram (void) 101129ba616SKumar Gala { 1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR; 103129ba616SKumar Gala volatile ccsr_ddr_t *ddr= &immap->im_ddr; 104129ba616SKumar Gala uint d_init; 105129ba616SKumar Gala 1066d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->cs0_bnds = CONFIG_SYS_DDR_CS0_BNDS; 1076d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->cs0_config = CONFIG_SYS_DDR_CS0_CONFIG; 108129ba616SKumar Gala 1096d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3; 1106d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0; 1116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1; 1126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2; 1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_mode = CONFIG_SYS_DDR_MODE_1; 1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_mode_2 = CONFIG_SYS_DDR_MODE_2; 1156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_interval = CONFIG_SYS_DDR_INTERVAL; 1166d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_data_init = CONFIG_SYS_DDR_DATA_INIT; 1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL; 1186d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL2; 119129ba616SKumar Gala 120129ba616SKumar Gala #if defined (CONFIG_DDR_ECC) 1216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->err_int_en = CONFIG_SYS_DDR_ERR_INT_EN; 1226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->err_disable = CONFIG_SYS_DDR_ERR_DIS; 1236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->err_sbe = CONFIG_SYS_DDR_SBE; 124129ba616SKumar Gala #endif 125129ba616SKumar Gala asm("sync;isync"); 126129ba616SKumar Gala 127129ba616SKumar Gala udelay(500); 128129ba616SKumar Gala 1296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD ddr->sdram_cfg = CONFIG_SYS_DDR_CONTROL; 130129ba616SKumar Gala 131129ba616SKumar Gala #if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 132129ba616SKumar Gala d_init = 1; 133129ba616SKumar Gala debug("DDR - 1st controller: memory initializing\n"); 134129ba616SKumar Gala /* 135129ba616SKumar Gala * Poll until memory is initialized. 136129ba616SKumar Gala * 512 Meg at 400 might hit this 200 times or so. 137129ba616SKumar Gala */ 138129ba616SKumar Gala while ((ddr->sdram_cfg_2 & (d_init << 4)) != 0) { 139129ba616SKumar Gala udelay(1000); 140129ba616SKumar Gala } 141129ba616SKumar Gala debug("DDR: memory initialized\n\n"); 142129ba616SKumar Gala asm("sync; isync"); 143129ba616SKumar Gala udelay(500); 144129ba616SKumar Gala #endif 145129ba616SKumar Gala 146129ba616SKumar Gala return 512 * 1024 * 1024; 147129ba616SKumar Gala } 148129ba616SKumar Gala 149129ba616SKumar Gala #endif 150129ba616SKumar Gala 151129ba616SKumar Gala #ifdef CONFIG_PCIE1 152129ba616SKumar Gala static struct pci_controller pcie1_hose; 153129ba616SKumar Gala #endif 154129ba616SKumar Gala 155129ba616SKumar Gala #ifdef CONFIG_PCIE2 156129ba616SKumar Gala static struct pci_controller pcie2_hose; 157129ba616SKumar Gala #endif 158129ba616SKumar Gala 159129ba616SKumar Gala #ifdef CONFIG_PCIE3 160129ba616SKumar Gala static struct pci_controller pcie3_hose; 161129ba616SKumar Gala #endif 162129ba616SKumar Gala 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); 167*f61dae7cSKumar Gala struct fsl_pci_info pci_info[3]; 168*f61dae7cSKumar Gala u32 devdisr, pordevsr, io_sel, host_agent, temp32; 169*f61dae7cSKumar Gala int first_free_busno = 0; 170*f61dae7cSKumar Gala int num = 0; 171*f61dae7cSKumar Gala 172*f61dae7cSKumar Gala int pcie_ep, pcie_configured; 173*f61dae7cSKumar Gala 174*f61dae7cSKumar Gala devdisr = in_be32(&gur->devdisr); 175*f61dae7cSKumar Gala pordevsr = in_be32(&gur->pordevsr); 176*f61dae7cSKumar Gala io_sel = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; 177*f61dae7cSKumar Gala host_agent = (in_be32(&gur->porbmsr) & MPC85xx_PORBMSR_HA) >> 16; 178129ba616SKumar Gala 179129ba616SKumar Gala debug (" pci_init_board: devdisr=%x, io_sel=%x, host_agent=%x\n", 180129ba616SKumar Gala devdisr, io_sel, host_agent); 181129ba616SKumar Gala 182*f61dae7cSKumar Gala if (!(pordevsr & MPC85xx_PORDEVSR_SGMII1_DIS)) 183129ba616SKumar Gala printf (" eTSEC1 is in sgmii mode.\n"); 184*f61dae7cSKumar Gala if (!(pordevsr & MPC85xx_PORDEVSR_SGMII2_DIS)) 185129ba616SKumar Gala printf (" eTSEC2 is in sgmii mode.\n"); 186*f61dae7cSKumar Gala if (!(pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS)) 187129ba616SKumar Gala printf (" eTSEC3 is in sgmii mode.\n"); 188*f61dae7cSKumar Gala if (!(pordevsr & MPC85xx_PORDEVSR_SGMII4_DIS)) 189129ba616SKumar Gala printf (" eTSEC4 is in sgmii mode.\n"); 190129ba616SKumar Gala 191*f61dae7cSKumar Gala puts("\n"); 192129ba616SKumar Gala #ifdef CONFIG_PCIE3 193*f61dae7cSKumar Gala pcie_ep = is_fsl_pci_agent(LAW_TRGT_IF_PCIE_3, host_agent); 194*f61dae7cSKumar Gala pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_3, io_sel); 195129ba616SKumar Gala 196028e1168SRoy Zang if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE3)){ 197*f61dae7cSKumar Gala SET_STD_PCIE_INFO(pci_info[num], 3); 198*f61dae7cSKumar Gala printf (" PCIE3 connected to ULI as %s (base addr %lx)\n", 199129ba616SKumar Gala pcie_ep ? "End Point" : "Root Complex", 200*f61dae7cSKumar Gala pci_info[num].regs); 201*f61dae7cSKumar Gala first_free_busno = fsl_pci_init_port(&pci_info[num++], 202*f61dae7cSKumar Gala &pcie3_hose, first_free_busno); 203129ba616SKumar Gala /* 204129ba616SKumar Gala * Activate ULI1575 legacy chip by performing a fake 205129ba616SKumar Gala * memory access. Needed to make ULI RTC work. 206129ba616SKumar Gala * Device 1d has the first on-board memory BAR. 207129ba616SKumar Gala */ 208*f61dae7cSKumar Gala pci_hose_read_config_dword(&pcie3_hose, PCI_BDF(2, 0x1d, 0), 209129ba616SKumar Gala PCI_BASE_ADDRESS_1, &temp32); 2105af0fdd8SKumar Gala if (temp32 >= CONFIG_SYS_PCIE3_MEM_BUS) { 211ad97dce1SKumar Gala void *p = pci_mem_to_virt(PCI_BDF(2, 0x1d, 0), 212ad97dce1SKumar Gala temp32, 4, 0); 213ad97dce1SKumar Gala debug(" uli1572 read to %p\n", p); 214ad97dce1SKumar Gala in_be32(p); 215129ba616SKumar Gala } 216129ba616SKumar Gala } else { 217129ba616SKumar Gala printf (" PCIE3: disabled\n"); 218129ba616SKumar Gala } 219*f61dae7cSKumar Gala puts("\n"); 220129ba616SKumar Gala #else 221*f61dae7cSKumar Gala setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCIE3); /* disable */ 222129ba616SKumar Gala #endif 223129ba616SKumar Gala 224129ba616SKumar Gala #ifdef CONFIG_PCIE2 225*f61dae7cSKumar Gala pcie_ep = is_fsl_pci_agent(LAW_TRGT_IF_PCIE_2, host_agent); 226*f61dae7cSKumar Gala pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_2, io_sel); 227129ba616SKumar Gala 228028e1168SRoy Zang if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE2)){ 229*f61dae7cSKumar Gala SET_STD_PCIE_INFO(pci_info[num], 2); 230*f61dae7cSKumar Gala printf (" PCIE2 connected to Slot 1 as %s (base addr %lx)\n", 231129ba616SKumar Gala pcie_ep ? "End Point" : "Root Complex", 232*f61dae7cSKumar Gala pci_info[num].regs); 233*f61dae7cSKumar Gala first_free_busno = fsl_pci_init_port(&pci_info[num++], 234*f61dae7cSKumar Gala &pcie2_hose, first_free_busno); 235129ba616SKumar Gala } else { 236129ba616SKumar Gala printf (" PCIE2: disabled\n"); 237129ba616SKumar Gala } 238129ba616SKumar Gala 239*f61dae7cSKumar Gala puts("\n"); 240129ba616SKumar Gala #else 241*f61dae7cSKumar Gala setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCIE2); /* disable */ 242129ba616SKumar Gala #endif 243*f61dae7cSKumar Gala 244129ba616SKumar Gala #ifdef CONFIG_PCIE1 245*f61dae7cSKumar Gala pcie_ep = is_fsl_pci_agent(LAW_TRGT_IF_PCIE_1, host_agent); 246*f61dae7cSKumar Gala pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_1, io_sel); 247129ba616SKumar Gala 248129ba616SKumar Gala if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE)){ 249*f61dae7cSKumar Gala SET_STD_PCIE_INFO(pci_info[num], 1); 250*f61dae7cSKumar Gala printf (" PCIE1 connected to Slot 2 as %s (base addr %lx)\n", 251129ba616SKumar Gala pcie_ep ? "End Point" : "Root Complex", 252*f61dae7cSKumar Gala pci_info[num].regs); 253*f61dae7cSKumar Gala first_free_busno = fsl_pci_init_port(&pci_info[num++], 254*f61dae7cSKumar Gala &pcie1_hose, first_free_busno); 255129ba616SKumar Gala } else { 256129ba616SKumar Gala printf (" PCIE1: disabled\n"); 257129ba616SKumar Gala } 258129ba616SKumar Gala 259*f61dae7cSKumar Gala puts("\n"); 260129ba616SKumar Gala #else 261*f61dae7cSKumar Gala setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCIE); /* disable */ 262129ba616SKumar Gala #endif 263129ba616SKumar Gala } 264129ba616SKumar Gala #endif 265129ba616SKumar Gala 266129ba616SKumar Gala int board_early_init_r(void) 267129ba616SKumar Gala { 2686d0f6bcfSJean-Christophe PLAGNIOL-VILLARD const unsigned int flashbase = CONFIG_SYS_FLASH_BASE; 269129ba616SKumar Gala const u8 flash_esel = 2; 270129ba616SKumar Gala 271129ba616SKumar Gala /* 272129ba616SKumar Gala * Remap Boot flash + PROMJET region to caching-inhibited 273129ba616SKumar Gala * so that flash can be erased properly. 274129ba616SKumar Gala */ 275129ba616SKumar Gala 2767c0d4a75SKumar Gala /* Flush d-cache and invalidate i-cache of any FLASH data */ 2777c0d4a75SKumar Gala flush_dcache(); 2787c0d4a75SKumar Gala invalidate_icache(); 279129ba616SKumar Gala 280129ba616SKumar Gala /* invalidate existing TLB entry for flash + promjet */ 281129ba616SKumar Gala disable_tlb(flash_esel); 282129ba616SKumar Gala 283c953ddfdSKumar Gala set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS, /* tlb, epn, rpn */ 284129ba616SKumar Gala MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, /* perms, wimge */ 285129ba616SKumar Gala 0, flash_esel, BOOKE_PAGESZ_256M, 1); /* ts, esel, tsize, iprot */ 286129ba616SKumar Gala 287129ba616SKumar Gala return 0; 288129ba616SKumar Gala } 289129ba616SKumar Gala 290129ba616SKumar Gala #ifdef CONFIG_GET_CLK_FROM_ICS307 291129ba616SKumar Gala /* decode S[0-2] to Output Divider (OD) */ 292129ba616SKumar Gala static unsigned char ics307_S_to_OD[] = { 293129ba616SKumar Gala 10, 2, 8, 4, 5, 7, 3, 6 294129ba616SKumar Gala }; 295129ba616SKumar Gala 296129ba616SKumar Gala /* Calculate frequency being generated by ICS307-02 clock chip based upon 297129ba616SKumar Gala * the control bytes being programmed into it. */ 298129ba616SKumar Gala /* XXX: This function should probably go into a common library */ 299129ba616SKumar Gala static unsigned long 300129ba616SKumar Gala ics307_clk_freq (unsigned char cw0, unsigned char cw1, unsigned char cw2) 301129ba616SKumar Gala { 302129ba616SKumar Gala const unsigned long InputFrequency = CONFIG_ICS307_REFCLK_HZ; 303129ba616SKumar Gala unsigned long VDW = ((cw1 << 1) & 0x1FE) + ((cw2 >> 7) & 1); 304129ba616SKumar Gala unsigned long RDW = cw2 & 0x7F; 305129ba616SKumar Gala unsigned long OD = ics307_S_to_OD[cw0 & 0x7]; 306129ba616SKumar Gala unsigned long freq; 307129ba616SKumar Gala 308129ba616SKumar Gala /* CLK1Frequency = InputFrequency * 2 * (VDW + 8) / ((RDW + 2) * OD) */ 309129ba616SKumar Gala 310129ba616SKumar Gala /* cw0: C1 C0 TTL F1 F0 S2 S1 S0 311129ba616SKumar Gala * cw1: V8 V7 V6 V5 V4 V3 V2 V1 312129ba616SKumar Gala * cw2: V0 R6 R5 R4 R3 R2 R1 R0 313129ba616SKumar Gala * 314129ba616SKumar Gala * R6:R0 = Reference Divider Word (RDW) 315129ba616SKumar Gala * V8:V0 = VCO Divider Word (VDW) 316129ba616SKumar Gala * S2:S0 = Output Divider Select (OD) 317129ba616SKumar Gala * F1:F0 = Function of CLK2 Output 318129ba616SKumar Gala * TTL = duty cycle 319129ba616SKumar Gala * C1:C0 = internal load capacitance for cyrstal 320129ba616SKumar Gala */ 321129ba616SKumar Gala 322129ba616SKumar Gala /* Adding 1 to get a "nicely" rounded number, but this needs 323129ba616SKumar Gala * more tweaking to get a "properly" rounded number. */ 324129ba616SKumar Gala 325129ba616SKumar Gala freq = 1 + (InputFrequency * 2 * (VDW + 8) / ((RDW + 2) * OD)); 326129ba616SKumar Gala 327129ba616SKumar Gala debug("ICS307: CW[0-2]: %02X %02X %02X => %u Hz\n", cw0, cw1, cw2, 328129ba616SKumar Gala freq); 329129ba616SKumar Gala return freq; 330129ba616SKumar Gala } 331129ba616SKumar Gala 332129ba616SKumar Gala unsigned long get_board_sys_clk(ulong dummy) 333129ba616SKumar Gala { 334048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 335048e7efeSKumar Gala 336129ba616SKumar Gala return ics307_clk_freq ( 337048e7efeSKumar Gala in_8(pixis_base + PIXIS_VSYSCLK0), 338048e7efeSKumar Gala in_8(pixis_base + PIXIS_VSYSCLK1), 339048e7efeSKumar Gala in_8(pixis_base + PIXIS_VSYSCLK2) 340129ba616SKumar Gala ); 341129ba616SKumar Gala } 342129ba616SKumar Gala 343129ba616SKumar Gala unsigned long get_board_ddr_clk(ulong dummy) 344129ba616SKumar Gala { 345048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 346048e7efeSKumar Gala 347129ba616SKumar Gala return ics307_clk_freq ( 348048e7efeSKumar Gala in_8(pixis_base + PIXIS_VDDRCLK0), 349048e7efeSKumar Gala in_8(pixis_base + PIXIS_VDDRCLK1), 350048e7efeSKumar Gala in_8(pixis_base + PIXIS_VDDRCLK2) 351129ba616SKumar Gala ); 352129ba616SKumar Gala } 353129ba616SKumar Gala #else 354129ba616SKumar Gala unsigned long get_board_sys_clk(ulong dummy) 355129ba616SKumar Gala { 356129ba616SKumar Gala u8 i; 357129ba616SKumar Gala ulong val = 0; 358048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 359129ba616SKumar Gala 360048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_SPD); 361129ba616SKumar Gala i &= 0x07; 362129ba616SKumar Gala 363129ba616SKumar Gala switch (i) { 364129ba616SKumar Gala case 0: 365129ba616SKumar Gala val = 33333333; 366129ba616SKumar Gala break; 367129ba616SKumar Gala case 1: 368129ba616SKumar Gala val = 40000000; 369129ba616SKumar Gala break; 370129ba616SKumar Gala case 2: 371129ba616SKumar Gala val = 50000000; 372129ba616SKumar Gala break; 373129ba616SKumar Gala case 3: 374129ba616SKumar Gala val = 66666666; 375129ba616SKumar Gala break; 376129ba616SKumar Gala case 4: 377129ba616SKumar Gala val = 83333333; 378129ba616SKumar Gala break; 379129ba616SKumar Gala case 5: 380129ba616SKumar Gala val = 100000000; 381129ba616SKumar Gala break; 382129ba616SKumar Gala case 6: 383129ba616SKumar Gala val = 133333333; 384129ba616SKumar Gala break; 385129ba616SKumar Gala case 7: 386129ba616SKumar Gala val = 166666666; 387129ba616SKumar Gala break; 388129ba616SKumar Gala } 389129ba616SKumar Gala 390129ba616SKumar Gala return val; 391129ba616SKumar Gala } 392129ba616SKumar Gala 393129ba616SKumar Gala unsigned long get_board_ddr_clk(ulong dummy) 394129ba616SKumar Gala { 395129ba616SKumar Gala u8 i; 396129ba616SKumar Gala ulong val = 0; 397048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 398129ba616SKumar Gala 399048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_SPD); 400129ba616SKumar Gala i &= 0x38; 401129ba616SKumar Gala i >>= 3; 402129ba616SKumar Gala 403129ba616SKumar Gala switch (i) { 404129ba616SKumar Gala case 0: 405129ba616SKumar Gala val = 33333333; 406129ba616SKumar Gala break; 407129ba616SKumar Gala case 1: 408129ba616SKumar Gala val = 40000000; 409129ba616SKumar Gala break; 410129ba616SKumar Gala case 2: 411129ba616SKumar Gala val = 50000000; 412129ba616SKumar Gala break; 413129ba616SKumar Gala case 3: 414129ba616SKumar Gala val = 66666666; 415129ba616SKumar Gala break; 416129ba616SKumar Gala case 4: 417129ba616SKumar Gala val = 83333333; 418129ba616SKumar Gala break; 419129ba616SKumar Gala case 5: 420129ba616SKumar Gala val = 100000000; 421129ba616SKumar Gala break; 422129ba616SKumar Gala case 6: 423129ba616SKumar Gala val = 133333333; 424129ba616SKumar Gala break; 425129ba616SKumar Gala case 7: 426129ba616SKumar Gala val = 166666666; 427129ba616SKumar Gala break; 428129ba616SKumar Gala } 429129ba616SKumar Gala return val; 430129ba616SKumar Gala } 431129ba616SKumar Gala #endif 432129ba616SKumar Gala 4337e183cadSLiu Yu #ifdef CONFIG_TSEC_ENET 4347e183cadSLiu Yu int board_eth_init(bd_t *bis) 4357e183cadSLiu Yu { 4367e183cadSLiu Yu struct tsec_info_struct tsec_info[4]; 4377e183cadSLiu Yu volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 4387e183cadSLiu Yu int num = 0; 4397e183cadSLiu Yu 4407e183cadSLiu Yu #ifdef CONFIG_TSEC1 4417e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 1); 4427e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII1_DIS)) 4437e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 4447e183cadSLiu Yu num++; 4457e183cadSLiu Yu #endif 4467e183cadSLiu Yu #ifdef CONFIG_TSEC2 4477e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 2); 4487e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII2_DIS)) 4497e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 4507e183cadSLiu Yu num++; 4517e183cadSLiu Yu #endif 4527e183cadSLiu Yu #ifdef CONFIG_TSEC3 4537e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 3); 4547e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS)) 4557e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 4567e183cadSLiu Yu num++; 4577e183cadSLiu Yu #endif 4587e183cadSLiu Yu #ifdef CONFIG_TSEC4 4597e183cadSLiu Yu SET_STD_TSEC_INFO(tsec_info[num], 4); 4607e183cadSLiu Yu if (!(gur->pordevsr & MPC85xx_PORDEVSR_SGMII4_DIS)) 4617e183cadSLiu Yu tsec_info[num].flags |= TSEC_SGMII; 4627e183cadSLiu Yu num++; 4637e183cadSLiu Yu #endif 4647e183cadSLiu Yu 4657e183cadSLiu Yu if (!num) { 4667e183cadSLiu Yu printf("No TSECs initialized\n"); 4677e183cadSLiu Yu 4687e183cadSLiu Yu return 0; 4697e183cadSLiu Yu } 4707e183cadSLiu Yu 471feede8b0SAndy Fleming #ifdef CONFIG_FSL_SGMII_RISER 4727e183cadSLiu Yu fsl_sgmii_riser_init(tsec_info, num); 473feede8b0SAndy Fleming #endif 4747e183cadSLiu Yu 4757e183cadSLiu Yu tsec_eth_init(bis, tsec_info, num); 4767e183cadSLiu Yu 477b560ab85SKumar Gala return pci_eth_init(bis); 4787e183cadSLiu Yu } 4797e183cadSLiu Yu #endif 4807e183cadSLiu Yu 481129ba616SKumar Gala #if defined(CONFIG_OF_BOARD_SETUP) 482129ba616SKumar Gala void ft_board_setup(void *blob, bd_t *bd) 483129ba616SKumar Gala { 484b6730512SKumar Gala phys_addr_t base; 485b6730512SKumar Gala phys_size_t size; 486129ba616SKumar Gala 487129ba616SKumar Gala ft_cpu_setup(blob, bd); 488129ba616SKumar Gala 489129ba616SKumar Gala base = getenv_bootm_low(); 490129ba616SKumar Gala size = getenv_bootm_size(); 491129ba616SKumar Gala 492129ba616SKumar Gala fdt_fixup_memory(blob, (u64)base, (u64)size); 493129ba616SKumar Gala 494129ba616SKumar Gala #ifdef CONFIG_PCIE3 4952dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci0", &pcie3_hose); 496129ba616SKumar Gala #endif 497129ba616SKumar Gala #ifdef CONFIG_PCIE2 4982dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci1", &pcie2_hose); 499129ba616SKumar Gala #endif 500129ba616SKumar Gala #ifdef CONFIG_PCIE1 5012dba0deaSKumar Gala ft_fsl_pci_setup(blob, "pci2", &pcie1_hose); 502129ba616SKumar Gala #endif 503feede8b0SAndy Fleming #ifdef CONFIG_FSL_SGMII_RISER 504feede8b0SAndy Fleming fsl_sgmii_riser_fdt_fixup(blob); 505feede8b0SAndy Fleming #endif 506129ba616SKumar Gala } 507129ba616SKumar Gala #endif 508129ba616SKumar Gala 509129ba616SKumar Gala #ifdef CONFIG_MP 510129ba616SKumar Gala extern void cpu_mp_lmb_reserve(struct lmb *lmb); 511129ba616SKumar Gala 512129ba616SKumar Gala void board_lmb_reserve(struct lmb *lmb) 513129ba616SKumar Gala { 514129ba616SKumar Gala cpu_mp_lmb_reserve(lmb); 515129ba616SKumar Gala } 516129ba616SKumar Gala #endif 517