125d83d7fSJon Loeliger /* 26525d51fSKumar Gala * Copyright 2007,2009-2010 Freescale Semiconductor, Inc. 325d83d7fSJon Loeliger * 425d83d7fSJon Loeliger * See file CREDITS for list of people who contributed to this 525d83d7fSJon Loeliger * project. 625d83d7fSJon Loeliger * 725d83d7fSJon Loeliger * This program is free software; you can redistribute it and/or 825d83d7fSJon Loeliger * modify it under the terms of the GNU General Public License as 925d83d7fSJon Loeliger * published by the Free Software Foundation; either version 2 of 1025d83d7fSJon Loeliger * the License, or (at your option) any later version. 1125d83d7fSJon Loeliger * 1225d83d7fSJon Loeliger * This program is distributed in the hope that it will be useful, 1325d83d7fSJon Loeliger * but WITHOUT ANY WARRANTY; without even the implied warranty of 1425d83d7fSJon Loeliger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1525d83d7fSJon Loeliger * GNU General Public License for more details. 1625d83d7fSJon Loeliger * 1725d83d7fSJon Loeliger * You should have received a copy of the GNU General Public License 1825d83d7fSJon Loeliger * along with this program; if not, write to the Free Software 1925d83d7fSJon Loeliger * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 2025d83d7fSJon Loeliger * MA 02111-1307 USA 2125d83d7fSJon Loeliger */ 2225d83d7fSJon Loeliger 2325d83d7fSJon Loeliger #include <common.h> 2425d83d7fSJon Loeliger #include <command.h> 25837f1ba0SEd Swarthout #include <pci.h> 2625d83d7fSJon Loeliger #include <asm/processor.h> 271167a2fdSKumar Gala #include <asm/mmu.h> 2825d83d7fSJon Loeliger #include <asm/immap_85xx.h> 29c8514622SKumar Gala #include <asm/fsl_pci.h> 301167a2fdSKumar Gala #include <asm/fsl_ddr_sdram.h> 315d27e02cSKumar Gala #include <asm/fsl_serdes.h> 3256a92705SKumar Gala #include <asm/io.h> 3325d83d7fSJon Loeliger #include <miiphy.h> 34addce57eSKumar Gala #include <libfdt.h> 35addce57eSKumar Gala #include <fdt_support.h> 36063c1263SAndy Fleming #include <fsl_mdio.h> 37216f2a71SAndy Fleming #include <tsec.h> 380b252f50SBen Warren #include <netdev.h> 3925d83d7fSJon Loeliger 40216f2a71SAndy Fleming #include "../common/sgmii_riser.h" 4125d83d7fSJon Loeliger 4225d83d7fSJon Loeliger int checkboard (void) 4325d83d7fSJon Loeliger { 446d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 45f51cdaf1SBecky Bruce volatile fsl_lbc_t *lbc = LBC_BASE_ADDR; 466d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR); 476bb5b412SKumar Gala u8 vboot; 486bb5b412SKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 4925d83d7fSJon Loeliger 5025d83d7fSJon Loeliger if ((uint)&gur->porpllsr != 0xe00e0000) { 519b55a253SWolfgang Denk printf("immap size error %lx\n",(ulong)&gur->porpllsr); 5225d83d7fSJon Loeliger } 536bb5b412SKumar Gala printf ("Board: MPC8544DS, 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 if (vboot & PIXIS_VBOOT_FMAP) 606bb5b412SKumar Gala printf ("vBank: %d\n", ((vboot & PIXIS_VBOOT_FBANK) >> 6)); 616bb5b412SKumar Gala else 626bb5b412SKumar Gala puts ("Promjet\n"); 6325d83d7fSJon Loeliger 64837f1ba0SEd Swarthout lbc->ltesr = 0xffffffff; /* Clear LBC error interrupts */ 65837f1ba0SEd Swarthout lbc->lteir = 0xffffffff; /* Enable LBC error interrupts */ 66837f1ba0SEd Swarthout ecm->eedr = 0xffffffff; /* Clear ecm errors */ 67837f1ba0SEd Swarthout ecm->eeer = 0xffffffff; /* Enable ecm errors */ 68837f1ba0SEd Swarthout 6925d83d7fSJon Loeliger return 0; 7025d83d7fSJon Loeliger } 7125d83d7fSJon Loeliger 72837f1ba0SEd Swarthout #ifdef CONFIG_PCI1 73837f1ba0SEd Swarthout static struct pci_controller pci1_hose; 74837f1ba0SEd Swarthout #endif 75837f1ba0SEd Swarthout 76837f1ba0SEd Swarthout #ifdef CONFIG_PCIE3 77837f1ba0SEd Swarthout static struct pci_controller pcie3_hose; 78837f1ba0SEd Swarthout #endif 79837f1ba0SEd Swarthout 80645d5a78SKumar Gala void pci_init_board(void) 81837f1ba0SEd Swarthout { 826d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 8364a1686aSKumar Gala struct fsl_pci_info pci_info; 84645d5a78SKumar Gala u32 devdisr, pordevsr, io_sel; 85645d5a78SKumar Gala u32 porpllsr, pci_agent, pci_speed, pci_32, pci_arb, pci_clk_sel; 86645d5a78SKumar Gala int first_free_busno = 0; 87837f1ba0SEd Swarthout 88645d5a78SKumar Gala int pcie_ep, pcie_configured; 89645d5a78SKumar Gala 90645d5a78SKumar Gala devdisr = in_be32(&gur->devdisr); 91645d5a78SKumar Gala pordevsr = in_be32(&gur->pordevsr); 92645d5a78SKumar Gala porpllsr = in_be32(&gur->porpllsr); 93645d5a78SKumar Gala io_sel = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; 94645d5a78SKumar Gala 95645d5a78SKumar Gala debug (" pci_init_board: devdisr=%x, io_sel=%x\n", devdisr, io_sel); 96837f1ba0SEd Swarthout 97645d5a78SKumar Gala puts("\n"); 98837f1ba0SEd Swarthout 99837f1ba0SEd Swarthout #ifdef CONFIG_PCIE3 1005d27e02cSKumar Gala pcie_configured = is_serdes_configured(PCIE3); 101837f1ba0SEd Swarthout 102645d5a78SKumar Gala if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE3)){ 10364a1686aSKumar Gala /* contains both PCIE3 MEM & IO space */ 10464a1686aSKumar Gala set_next_law(CONFIG_SYS_PCIE3_MEM_PHYS, LAW_SIZE_4M, 10564a1686aSKumar Gala LAW_TRGT_IF_PCIE_3); 10664a1686aSKumar Gala SET_STD_PCIE_INFO(pci_info, 3); 10764a1686aSKumar Gala pcie_ep = fsl_setup_hose(&pcie3_hose, pci_info.regs); 10864a1686aSKumar Gala 109837f1ba0SEd Swarthout /* outbound memory */ 110645d5a78SKumar Gala pci_set_region(&pcie3_hose.regions[0], 11110795f42SKumar Gala CONFIG_SYS_PCIE3_MEM_BUS2, 1126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE3_MEM_PHYS2, 1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_PCIE3_MEM_SIZE2, 114837f1ba0SEd Swarthout PCI_REGION_MEM); 115645d5a78SKumar Gala 116645d5a78SKumar Gala pcie3_hose.region_count = 1; 11764a1686aSKumar Gala 1188ca78f2cSPeter Tyser printf("PCIE3: connected to ULI as %s (base addr %lx)\n", 11964917ca3SPeter Tyser pcie_ep ? "Endpoint" : "Root Complex", 12064a1686aSKumar Gala pci_info.regs); 12164a1686aSKumar Gala first_free_busno = fsl_pci_init_port(&pci_info, 122645d5a78SKumar Gala &pcie3_hose, first_free_busno); 123837f1ba0SEd Swarthout 12456a92705SKumar Gala /* 12556a92705SKumar Gala * Activate ULI1575 legacy chip by performing a fake 12656a92705SKumar Gala * memory access. Needed to make ULI RTC work. 12756a92705SKumar Gala */ 12810795f42SKumar Gala in_be32((u32 *)CONFIG_SYS_PCIE3_MEM_BUS); 129837f1ba0SEd Swarthout } else { 130837f1ba0SEd Swarthout printf("PCIE3: disabled\n"); 131837f1ba0SEd Swarthout } 132645d5a78SKumar Gala puts("\n"); 133837f1ba0SEd Swarthout #else 134645d5a78SKumar Gala setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCIE3); /* disable */ 135837f1ba0SEd Swarthout #endif 136837f1ba0SEd Swarthout 137837f1ba0SEd Swarthout #ifdef CONFIG_PCIE1 13864a1686aSKumar Gala SET_STD_PCIE_INFO(pci_info, 1); 13964a1686aSKumar Gala first_free_busno = fsl_pcie_init_ctrl(first_free_busno, devdisr, PCIE1, &pci_info); 140837f1ba0SEd Swarthout #else 14164a1686aSKumar Gala setbits_be32(&gur->devdisr, _DEVDISR_PCIE1); /* disable */ 142837f1ba0SEd Swarthout #endif 143837f1ba0SEd Swarthout 144837f1ba0SEd Swarthout #ifdef CONFIG_PCIE2 14564a1686aSKumar Gala SET_STD_PCIE_INFO(pci_info, 2); 14664a1686aSKumar Gala first_free_busno = fsl_pcie_init_ctrl(first_free_busno, devdisr, PCIE2, &pci_info); 147837f1ba0SEd Swarthout #else 14864a1686aSKumar Gala setbits_be32(&gur->devdisr, _DEVDISR_PCIE2); /* disable */ 149837f1ba0SEd Swarthout #endif 150837f1ba0SEd Swarthout 151837f1ba0SEd Swarthout #ifdef CONFIG_PCI1 152645d5a78SKumar Gala pci_speed = 66666000; 153645d5a78SKumar Gala pci_32 = 1; 154645d5a78SKumar Gala pci_arb = pordevsr & MPC85xx_PORDEVSR_PCI1_ARB; 155645d5a78SKumar Gala pci_clk_sel = porpllsr & MPC85xx_PORDEVSR_PCI1_SPD; 156837f1ba0SEd Swarthout 157837f1ba0SEd Swarthout if (!(devdisr & MPC85xx_DEVDISR_PCI1)) { 15864a1686aSKumar Gala SET_STD_PCI_INFO(pci_info, 1); 15964a1686aSKumar Gala set_next_law(pci_info.mem_phys, 16064a1686aSKumar Gala law_size_bits(pci_info.mem_size), pci_info.law); 16164a1686aSKumar Gala set_next_law(pci_info.io_phys, 16264a1686aSKumar Gala law_size_bits(pci_info.io_size), pci_info.law); 16364a1686aSKumar Gala 16464a1686aSKumar Gala pci_agent = fsl_setup_hose(&pci1_hose, pci_info.regs); 1658ca78f2cSPeter Tyser printf("PCI: %d bit, %s MHz, %s, %s, %s (base address %lx)\n", 166837f1ba0SEd Swarthout (pci_32) ? 32 : 64, 167837f1ba0SEd Swarthout (pci_speed == 33333000) ? "33" : 168837f1ba0SEd Swarthout (pci_speed == 66666000) ? "66" : "unknown", 169837f1ba0SEd Swarthout pci_clk_sel ? "sync" : "async", 170837f1ba0SEd Swarthout pci_agent ? "agent" : "host", 171837f1ba0SEd Swarthout pci_arb ? "arbiter" : "external-arbiter", 17264a1686aSKumar Gala pci_info.regs); 173837f1ba0SEd Swarthout 17464a1686aSKumar Gala first_free_busno = fsl_pci_init_port(&pci_info, 175645d5a78SKumar Gala &pci1_hose, first_free_busno); 176837f1ba0SEd Swarthout } else { 177837f1ba0SEd Swarthout printf("PCI: disabled\n"); 178837f1ba0SEd Swarthout } 179645d5a78SKumar Gala 180645d5a78SKumar Gala puts("\n"); 181837f1ba0SEd Swarthout #else 182645d5a78SKumar Gala setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCI1); /* disable */ 183837f1ba0SEd Swarthout #endif 184837f1ba0SEd Swarthout } 185837f1ba0SEd Swarthout 18625d83d7fSJon Loeliger int last_stage_init(void) 18725d83d7fSJon Loeliger { 18825d83d7fSJon Loeliger return 0; 18925d83d7fSJon Loeliger } 19025d83d7fSJon Loeliger 19125d83d7fSJon Loeliger 19225d83d7fSJon Loeliger unsigned long 19325d83d7fSJon Loeliger get_board_sys_clk(ulong dummy) 19425d83d7fSJon Loeliger { 19525d83d7fSJon Loeliger u8 i, go_bit, rd_clks; 19625d83d7fSJon Loeliger ulong val = 0; 197048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 19825d83d7fSJon Loeliger 199048e7efeSKumar Gala go_bit = in_8(pixis_base + PIXIS_VCTL); 20025d83d7fSJon Loeliger go_bit &= 0x01; 20125d83d7fSJon Loeliger 202048e7efeSKumar Gala rd_clks = in_8(pixis_base + PIXIS_VCFGEN0); 20325d83d7fSJon Loeliger rd_clks &= 0x1C; 20425d83d7fSJon Loeliger 20525d83d7fSJon Loeliger /* 20625d83d7fSJon Loeliger * Only if both go bit and the SCLK bit in VCFGEN0 are set 20725d83d7fSJon Loeliger * should we be using the AUX register. Remember, we also set the 20825d83d7fSJon Loeliger * GO bit to boot from the alternate bank on the on-board flash 20925d83d7fSJon Loeliger */ 21025d83d7fSJon Loeliger 21125d83d7fSJon Loeliger if (go_bit) { 21225d83d7fSJon Loeliger if (rd_clks == 0x1c) 213048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_AUX); 21425d83d7fSJon Loeliger else 215048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_SPD); 21625d83d7fSJon Loeliger } else { 217048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_SPD); 21825d83d7fSJon Loeliger } 21925d83d7fSJon Loeliger 22025d83d7fSJon Loeliger i &= 0x07; 22125d83d7fSJon Loeliger 22225d83d7fSJon Loeliger switch (i) { 22325d83d7fSJon Loeliger case 0: 22425d83d7fSJon Loeliger val = 33333333; 22525d83d7fSJon Loeliger break; 22625d83d7fSJon Loeliger case 1: 22725d83d7fSJon Loeliger val = 40000000; 22825d83d7fSJon Loeliger break; 22925d83d7fSJon Loeliger case 2: 23025d83d7fSJon Loeliger val = 50000000; 23125d83d7fSJon Loeliger break; 23225d83d7fSJon Loeliger case 3: 23325d83d7fSJon Loeliger val = 66666666; 23425d83d7fSJon Loeliger break; 23525d83d7fSJon Loeliger case 4: 23625d83d7fSJon Loeliger val = 83000000; 23725d83d7fSJon Loeliger break; 23825d83d7fSJon Loeliger case 5: 23925d83d7fSJon Loeliger val = 100000000; 24025d83d7fSJon Loeliger break; 24125d83d7fSJon Loeliger case 6: 24225d83d7fSJon Loeliger val = 133333333; 24325d83d7fSJon Loeliger break; 24425d83d7fSJon Loeliger case 7: 24525d83d7fSJon Loeliger val = 166666666; 24625d83d7fSJon Loeliger break; 24725d83d7fSJon Loeliger } 24825d83d7fSJon Loeliger 24925d83d7fSJon Loeliger return val; 25025d83d7fSJon Loeliger } 25125d83d7fSJon Loeliger 252063c1263SAndy Fleming 253063c1263SAndy Fleming #define MIIM_CIS8204_SLED_CON 0x1b 254063c1263SAndy Fleming #define MIIM_CIS8204_SLEDCON_INIT 0x1115 255063c1263SAndy Fleming /* 256063c1263SAndy Fleming * Hack to write all 4 PHYs with the LED values 257063c1263SAndy Fleming */ 258063c1263SAndy Fleming int board_phy_config(struct phy_device *phydev) 259063c1263SAndy Fleming { 260063c1263SAndy Fleming static int do_once; 261063c1263SAndy Fleming uint phyid; 262063c1263SAndy Fleming struct mii_dev *bus = phydev->bus; 263063c1263SAndy Fleming 264*9fafe7daSTroy Kisky if (phydev->drv->config) 265*9fafe7daSTroy Kisky phydev->drv->config(phydev); 266063c1263SAndy Fleming if (do_once) 267063c1263SAndy Fleming return 0; 268063c1263SAndy Fleming 269063c1263SAndy Fleming for (phyid = 0; phyid < 4; phyid++) 270063c1263SAndy Fleming bus->write(bus, phyid, MDIO_DEVAD_NONE, MIIM_CIS8204_SLED_CON, 271063c1263SAndy Fleming MIIM_CIS8204_SLEDCON_INIT); 272063c1263SAndy Fleming 273063c1263SAndy Fleming do_once = 1; 274063c1263SAndy Fleming 275063c1263SAndy Fleming return 0; 276063c1263SAndy Fleming } 277063c1263SAndy Fleming 278063c1263SAndy Fleming 279216f2a71SAndy Fleming int board_eth_init(bd_t *bis) 280216f2a71SAndy Fleming { 2810b252f50SBen Warren #ifdef CONFIG_TSEC_ENET 282063c1263SAndy Fleming struct fsl_pq_mdio_info mdio_info; 283216f2a71SAndy Fleming struct tsec_info_struct tsec_info[2]; 284216f2a71SAndy Fleming int num = 0; 285216f2a71SAndy Fleming 286216f2a71SAndy Fleming #ifdef CONFIG_TSEC1 287216f2a71SAndy Fleming SET_STD_TSEC_INFO(tsec_info[num], 1); 288058d7dc7SKumar Gala if (is_serdes_configured(SGMII_TSEC1)) { 289058d7dc7SKumar Gala puts("eTSEC1 is in sgmii mode.\n"); 290216f2a71SAndy Fleming tsec_info[num].flags |= TSEC_SGMII; 291058d7dc7SKumar Gala } 292216f2a71SAndy Fleming num++; 293216f2a71SAndy Fleming #endif 294216f2a71SAndy Fleming #ifdef CONFIG_TSEC3 295216f2a71SAndy Fleming SET_STD_TSEC_INFO(tsec_info[num], 3); 296058d7dc7SKumar Gala if (is_serdes_configured(SGMII_TSEC3)) { 297058d7dc7SKumar Gala puts("eTSEC3 is in sgmii mode.\n"); 298216f2a71SAndy Fleming tsec_info[num].flags |= TSEC_SGMII; 299058d7dc7SKumar Gala } 300216f2a71SAndy Fleming num++; 301216f2a71SAndy Fleming #endif 302216f2a71SAndy Fleming 303216f2a71SAndy Fleming if (!num) { 304216f2a71SAndy Fleming printf("No TSECs initialized\n"); 305216f2a71SAndy Fleming 306216f2a71SAndy Fleming return 0; 307216f2a71SAndy Fleming } 308216f2a71SAndy Fleming 309058d7dc7SKumar Gala if (is_serdes_configured(SGMII_TSEC1) || 310058d7dc7SKumar Gala is_serdes_configured(SGMII_TSEC3)) { 311216f2a71SAndy Fleming fsl_sgmii_riser_init(tsec_info, num); 312058d7dc7SKumar Gala } 313216f2a71SAndy Fleming 314063c1263SAndy Fleming mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR; 315063c1263SAndy Fleming mdio_info.name = DEFAULT_MII_NAME; 316063c1263SAndy Fleming fsl_pq_mdio_init(bis, &mdio_info); 317216f2a71SAndy Fleming 318216f2a71SAndy Fleming tsec_eth_init(bis, tsec_info, num); 319216f2a71SAndy Fleming #endif 3200b252f50SBen Warren return pci_eth_init(bis); 3210b252f50SBen Warren } 322216f2a71SAndy Fleming 323addce57eSKumar Gala #if defined(CONFIG_OF_BOARD_SETUP) 3242dba0deaSKumar Gala void ft_board_setup(void *blob, bd_t *bd) 32525d83d7fSJon Loeliger { 32625d83d7fSJon Loeliger ft_cpu_setup(blob, bd); 32725d83d7fSJon Loeliger 3286525d51fSKumar Gala FT_FSL_PCI_SETUP; 3292dba0deaSKumar Gala 330feede8b0SAndy Fleming #ifdef CONFIG_FSL_SGMII_RISER 331feede8b0SAndy Fleming fsl_sgmii_riser_fdt_fixup(blob); 332feede8b0SAndy Fleming #endif 33325d83d7fSJon Loeliger } 33425d83d7fSJon Loeliger #endif 335