13dd2db53SJon Loeliger /* 26525d51fSKumar Gala * Copyright 2007,2009-2010 Freescale Semiconductor, Inc. 33dd2db53SJon Loeliger * 43dd2db53SJon Loeliger * See file CREDITS for list of people who contributed to this 53dd2db53SJon Loeliger * project. 63dd2db53SJon Loeliger * 73dd2db53SJon Loeliger * This program is free software; you can redistribute it and/or 83dd2db53SJon Loeliger * modify it under the terms of the GNU General Public License as 93dd2db53SJon Loeliger * published by the Free Software Foundation; either version 2 of 103dd2db53SJon Loeliger * the License, or (at your option) any later version. 113dd2db53SJon Loeliger * 123dd2db53SJon Loeliger * This program is distributed in the hope that it will be useful, 133dd2db53SJon Loeliger * but WITHOUT ANY WARRANTY; without even the implied warranty of 143dd2db53SJon Loeliger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 153dd2db53SJon Loeliger * GNU General Public License for more details. 163dd2db53SJon Loeliger * 173dd2db53SJon Loeliger * You should have received a copy of the GNU General Public License 183dd2db53SJon Loeliger * along with this program; if not, write to the Free Software 193dd2db53SJon Loeliger * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 203dd2db53SJon Loeliger * MA 02111-1307 USA 213dd2db53SJon Loeliger */ 22c9974ab0SJon Loeliger 233dd2db53SJon Loeliger #include <common.h> 243dd2db53SJon Loeliger #include <command.h> 253dd2db53SJon Loeliger #include <pci.h> 263dd2db53SJon Loeliger #include <asm/processor.h> 273dd2db53SJon Loeliger #include <asm/immap_86xx.h> 28c8514622SKumar Gala #include <asm/fsl_pci.h> 2939aa1a73SJon Loeliger #include <asm/fsl_ddr_sdram.h> 30c9974ab0SJon Loeliger #include <i2c.h> 313dd2db53SJon Loeliger #include <asm/io.h> 321df170f8SJon Loeliger #include <libfdt.h> 331df170f8SJon Loeliger #include <fdt_support.h> 34a30a549aSJon Loeliger #include <spd_sdram.h> 3589973f8aSBen Warren #include <netdev.h> 363dd2db53SJon Loeliger 373dd2db53SJon Loeliger void sdram_init(void); 384c77de3fSBecky Bruce phys_size_t fixed_sdram(void); 39e69e520fSTimur Tabi int mpc8610hpcd_diu_init(void); 40c9974ab0SJon Loeliger 413dd2db53SJon Loeliger 423dd2db53SJon Loeliger /* called before any console output */ 433dd2db53SJon Loeliger int board_early_init_f(void) 443dd2db53SJon Loeliger { 456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR; 463dd2db53SJon Loeliger volatile ccsr_gur_t *gur = &immap->im_gur; 473dd2db53SJon Loeliger 48a877880cSYork Sun gur->gpiocr |= 0x88aa5500; /* DIU16, IR1, UART0, UART2 */ 49a877880cSYork Sun 50a877880cSYork Sun return 0; 51a877880cSYork Sun } 52a877880cSYork Sun 53a877880cSYork Sun int misc_init_r(void) 54a877880cSYork Sun { 55a877880cSYork Sun u8 tmp_val, version; 56048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 57a877880cSYork Sun 58a877880cSYork Sun /*Do not use 8259PIC*/ 59048e7efeSKumar Gala tmp_val = in_8(pixis_base + PIXIS_BRDCFG0); 60048e7efeSKumar Gala out_8(pixis_base + PIXIS_BRDCFG0, tmp_val | 0x80); 61a877880cSYork Sun 62a877880cSYork Sun /*For FPGA V7 or higher, set the IRQMAPSEL to 0 to use MAP0 interrupt*/ 63048e7efeSKumar Gala version = in_8(pixis_base + PIXIS_PVER); 64a877880cSYork Sun if(version >= 0x07) { 65048e7efeSKumar Gala tmp_val = in_8(pixis_base + PIXIS_BRDCFG0); 66048e7efeSKumar Gala out_8(pixis_base + PIXIS_BRDCFG0, tmp_val & 0xbf); 67a877880cSYork Sun } 68a877880cSYork Sun 69a877880cSYork Sun /* Using this for DIU init before the driver in linux takes over 70a877880cSYork Sun * Enable the TFP410 Encoder (I2C address 0x38) 71a877880cSYork Sun */ 72a877880cSYork Sun 73a877880cSYork Sun tmp_val = 0xBF; 74a877880cSYork Sun i2c_write(0x38, 0x08, 1, &tmp_val, sizeof(tmp_val)); 75a877880cSYork Sun /* Verify if enabled */ 76a877880cSYork Sun tmp_val = 0; 77a877880cSYork Sun i2c_read(0x38, 0x08, 1, &tmp_val, sizeof(tmp_val)); 78a877880cSYork Sun debug("DVI Encoder Read: 0x%02lx\n",tmp_val); 79a877880cSYork Sun 80a877880cSYork Sun tmp_val = 0x10; 81a877880cSYork Sun i2c_write(0x38, 0x0A, 1, &tmp_val, sizeof(tmp_val)); 82a877880cSYork Sun /* Verify if enabled */ 83a877880cSYork Sun tmp_val = 0; 84a877880cSYork Sun i2c_read(0x38, 0x0A, 1, &tmp_val, sizeof(tmp_val)); 85a877880cSYork Sun debug("DVI Encoder Read: 0x%02lx\n",tmp_val); 86a877880cSYork Sun 873dd2db53SJon Loeliger return 0; 883dd2db53SJon Loeliger } 893dd2db53SJon Loeliger 903dd2db53SJon Loeliger int checkboard(void) 913dd2db53SJon Loeliger { 926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR; 933dd2db53SJon Loeliger volatile ccsr_local_mcm_t *mcm = &immap->im_local_mcm; 94048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 953dd2db53SJon Loeliger 969b55a253SWolfgang Denk printf ("Board: MPC8610HPCD, System ID: 0x%02x, " 979b55a253SWolfgang Denk "System Version: 0x%02x, FPGA Version: 0x%02x\n", 98048e7efeSKumar Gala in_8(pixis_base + PIXIS_ID), in_8(pixis_base + PIXIS_VER), 99048e7efeSKumar Gala in_8(pixis_base + PIXIS_PVER)); 1003dd2db53SJon Loeliger 1013dd2db53SJon Loeliger mcm->abcr |= 0x00010000; /* 0 */ 1023dd2db53SJon Loeliger mcm->hpmr3 = 0x80000008; /* 4c */ 1033dd2db53SJon Loeliger mcm->hpmr0 = 0; 1043dd2db53SJon Loeliger mcm->hpmr1 = 0; 1053dd2db53SJon Loeliger mcm->hpmr2 = 0; 1063dd2db53SJon Loeliger mcm->hpmr4 = 0; 1073dd2db53SJon Loeliger mcm->hpmr5 = 0; 1083dd2db53SJon Loeliger 1093dd2db53SJon Loeliger return 0; 1103dd2db53SJon Loeliger } 1113dd2db53SJon Loeliger 1123dd2db53SJon Loeliger 1139973e3c6SBecky Bruce phys_size_t 1143dd2db53SJon Loeliger initdram(int board_type) 1153dd2db53SJon Loeliger { 1164c77de3fSBecky Bruce phys_size_t dram_size = 0; 1173dd2db53SJon Loeliger 1183dd2db53SJon Loeliger #if defined(CONFIG_SPD_EEPROM) 11939aa1a73SJon Loeliger dram_size = fsl_ddr_sdram(); 1203dd2db53SJon Loeliger #else 1213dd2db53SJon Loeliger dram_size = fixed_sdram(); 1223dd2db53SJon Loeliger #endif 1233dd2db53SJon Loeliger 1249ff32d8cSTimur Tabi setup_ddr_bat(dram_size); 1259ff32d8cSTimur Tabi 1263dd2db53SJon Loeliger puts(" DDR: "); 1273dd2db53SJon Loeliger return dram_size; 1283dd2db53SJon Loeliger } 1293dd2db53SJon Loeliger 1303dd2db53SJon Loeliger 1313dd2db53SJon Loeliger #if !defined(CONFIG_SPD_EEPROM) 1323dd2db53SJon Loeliger /* 1333dd2db53SJon Loeliger * Fixed sdram init -- doesn't use serial presence detect. 1343dd2db53SJon Loeliger */ 1353dd2db53SJon Loeliger 1364c77de3fSBecky Bruce phys_size_t fixed_sdram(void) 1373dd2db53SJon Loeliger { 1386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if !defined(CONFIG_SYS_RAMBOOT) 1396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR; 1403dd2db53SJon Loeliger volatile ccsr_ddr_t *ddr = &immap->im_ddr1; 1413dd2db53SJon Loeliger uint d_init; 1423dd2db53SJon Loeliger 1433dd2db53SJon Loeliger ddr->cs0_bnds = 0x0000001f; 1443dd2db53SJon Loeliger ddr->cs0_config = 0x80010202; 1453dd2db53SJon Loeliger 14645239cf4SKumar Gala ddr->timing_cfg_3 = 0x00000000; 1473dd2db53SJon Loeliger ddr->timing_cfg_0 = 0x00260802; 1483dd2db53SJon Loeliger ddr->timing_cfg_1 = 0x3935d322; 1493dd2db53SJon Loeliger ddr->timing_cfg_2 = 0x14904cc8; 150e7ee23ecSPeter Tyser ddr->sdram_mode = 0x00480432; 1513dd2db53SJon Loeliger ddr->sdram_mode_2 = 0x00000000; 1523dd2db53SJon Loeliger ddr->sdram_interval = 0x06180fff; /* 0x06180100; */ 1533dd2db53SJon Loeliger ddr->sdram_data_init = 0xDEADBEEF; 1543dd2db53SJon Loeliger ddr->sdram_clk_cntl = 0x03800000; 1553dd2db53SJon Loeliger ddr->sdram_cfg_2 = 0x04400010; 1563dd2db53SJon Loeliger 1573dd2db53SJon Loeliger #if defined(CONFIG_DDR_ECC) 1583dd2db53SJon Loeliger ddr->err_int_en = 0x0000000d; 1593dd2db53SJon Loeliger ddr->err_disable = 0x00000000; 1603dd2db53SJon Loeliger ddr->err_sbe = 0x00010000; 1613dd2db53SJon Loeliger #endif 1623dd2db53SJon Loeliger asm("sync;isync"); 1633dd2db53SJon Loeliger 1643dd2db53SJon Loeliger udelay(500); 1653dd2db53SJon Loeliger 166e7ee23ecSPeter Tyser ddr->sdram_cfg = 0xc3000000; /* 0xe3008000;*/ 1673dd2db53SJon Loeliger 1683dd2db53SJon Loeliger 1693dd2db53SJon Loeliger #if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) 1703dd2db53SJon Loeliger d_init = 1; 1713dd2db53SJon Loeliger debug("DDR - 1st controller: memory initializing\n"); 1723dd2db53SJon Loeliger /* 1733dd2db53SJon Loeliger * Poll until memory is initialized. 1743dd2db53SJon Loeliger * 512 Meg at 400 might hit this 200 times or so. 1753dd2db53SJon Loeliger */ 1763dd2db53SJon Loeliger while ((ddr->sdram_cfg_2 & (d_init << 4)) != 0) 1773dd2db53SJon Loeliger udelay(1000); 1783dd2db53SJon Loeliger 1793dd2db53SJon Loeliger debug("DDR: memory initialized\n\n"); 1803dd2db53SJon Loeliger asm("sync; isync"); 1813dd2db53SJon Loeliger udelay(500); 1823dd2db53SJon Loeliger #endif 1833dd2db53SJon Loeliger 1843dd2db53SJon Loeliger return 512 * 1024 * 1024; 1853dd2db53SJon Loeliger #endif 1866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024; 1873dd2db53SJon Loeliger } 1883dd2db53SJon Loeliger 1893dd2db53SJon Loeliger #endif 1903dd2db53SJon Loeliger 1913dd2db53SJon Loeliger #if defined(CONFIG_PCI) 1923dd2db53SJon Loeliger /* 1933dd2db53SJon Loeliger * Initialize PCI Devices, report devices found. 1943dd2db53SJon Loeliger */ 1953dd2db53SJon Loeliger 1963dd2db53SJon Loeliger #ifndef CONFIG_PCI_PNP 1973dd2db53SJon Loeliger static struct pci_config_table pci_fsl86xxads_config_table[] = { 1983dd2db53SJon Loeliger {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 1993dd2db53SJon Loeliger PCI_IDSEL_NUMBER, PCI_ANY_ID, 2003dd2db53SJon Loeliger pci_cfgfunc_config_device, {PCI_ENET0_IOADDR, 2013dd2db53SJon Loeliger PCI_ENET0_MEMADDR, 2023dd2db53SJon Loeliger PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER} }, 2033dd2db53SJon Loeliger {} 2043dd2db53SJon Loeliger }; 2053dd2db53SJon Loeliger #endif 2063dd2db53SJon Loeliger 2073dd2db53SJon Loeliger 2083dd2db53SJon Loeliger static struct pci_controller pci1_hose = { 2093dd2db53SJon Loeliger #ifndef CONFIG_PCI_PNP 2103dd2db53SJon Loeliger config_table:pci_mpc86xxcts_config_table 2113dd2db53SJon Loeliger #endif 2123dd2db53SJon Loeliger }; 2133dd2db53SJon Loeliger #endif /* CONFIG_PCI */ 2143dd2db53SJon Loeliger 2153dd2db53SJon Loeliger #ifdef CONFIG_PCIE1 2163dd2db53SJon Loeliger static struct pci_controller pcie1_hose; 2173dd2db53SJon Loeliger #endif 2183dd2db53SJon Loeliger 2193dd2db53SJon Loeliger #ifdef CONFIG_PCIE2 2203dd2db53SJon Loeliger static struct pci_controller pcie2_hose; 2213dd2db53SJon Loeliger #endif 2223dd2db53SJon Loeliger 2233dd2db53SJon Loeliger void pci_init_board(void) 2243dd2db53SJon Loeliger { 2256d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immap = (immap_t *) CONFIG_SYS_CCSRBAR; 2263dd2db53SJon Loeliger volatile ccsr_gur_t *gur = &immap->im_gur; 2275e3d7050SKumar Gala struct fsl_pci_info pci_info[3]; 2285e3d7050SKumar Gala u32 devdisr, pordevsr, io_sel; 2295e3d7050SKumar Gala int first_free_busno = 0; 2305e3d7050SKumar Gala int num = 0; 2313dd2db53SJon Loeliger 2325e3d7050SKumar Gala int pci_agent, pcie_ep, pcie_configured; 2335e3d7050SKumar Gala 2345e3d7050SKumar Gala devdisr = in_be32(&gur->devdisr); 2355e3d7050SKumar Gala pordevsr = in_be32(&gur->pordevsr); 2365e3d7050SKumar Gala io_sel = (pordevsr & MPC8610_PORDEVSR_IO_SEL) 2375e3d7050SKumar Gala >> MPC8610_PORDEVSR_IO_SEL_SHIFT; 2385e3d7050SKumar Gala 2395e3d7050SKumar Gala debug (" pci_init_board: devdisr=%x, io_sel=%x\n", devdisr, io_sel); 2403dd2db53SJon Loeliger 2413dd2db53SJon Loeliger #ifdef CONFIG_PCIE1 2425e3d7050SKumar Gala pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_1, io_sel); 2433dd2db53SJon Loeliger 2443dd2db53SJon Loeliger if (pcie_configured && !(devdisr & MPC86xx_DEVDISR_PCIE1)){ 2455e3d7050SKumar Gala SET_STD_PCIE_INFO(pci_info[num], 1); 2465e3d7050SKumar Gala pcie_ep = fsl_setup_hose(&pcie1_hose, pci_info[num].regs); 247*8ca78f2cSPeter Tyser printf("PCIE1: connected to ULI as %s (base addr %lx)\n", 24864917ca3SPeter Tyser pcie_ep ? "Endpoint" : "Root Complex", 2495e3d7050SKumar Gala pci_info[num].regs); 2503dd2db53SJon Loeliger 2515e3d7050SKumar Gala first_free_busno = fsl_pci_init_port(&pci_info[num++], 2525e3d7050SKumar Gala &pcie1_hose, first_free_busno); 2535e3d7050SKumar Gala } else { 2545e3d7050SKumar Gala printf("PCIE1: disabled\n"); 2553dd2db53SJon Loeliger } 2563dd2db53SJon Loeliger 2575e3d7050SKumar Gala puts("\n"); 2585e3d7050SKumar Gala #else 2595e3d7050SKumar Gala setbits_be32(&gur->devdisr, MPC86xx_DEVDISR_PCIE1); /* disable */ 2605e3d7050SKumar Gala #endif 2613dd2db53SJon Loeliger 2623dd2db53SJon Loeliger #ifdef CONFIG_PCIE2 2635e3d7050SKumar Gala pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_2, io_sel); 2643dd2db53SJon Loeliger 2653dd2db53SJon Loeliger if (pcie_configured && !(devdisr & MPC86xx_DEVDISR_PCIE2)){ 2665e3d7050SKumar Gala SET_STD_PCIE_INFO(pci_info[num], 2); 2675e3d7050SKumar Gala pcie_ep = fsl_setup_hose(&pcie2_hose, pci_info[num].regs); 268*8ca78f2cSPeter Tyser printf("PCIE2: connected to Slot as %s (base addr %lx)\n", 26964917ca3SPeter Tyser pcie_ep ? "Endpoint" : "Root Complex", 2705e3d7050SKumar Gala pci_info[num].regs); 2715e3d7050SKumar Gala first_free_busno = fsl_pci_init_port(&pci_info[num++], 2725e3d7050SKumar Gala &pcie2_hose, first_free_busno); 2735e3d7050SKumar Gala } else { 2745e3d7050SKumar Gala printf("PCIE2: disabled\n"); 2753dd2db53SJon Loeliger } 2763dd2db53SJon Loeliger 2775e3d7050SKumar Gala puts("\n"); 2785e3d7050SKumar Gala #else 2795e3d7050SKumar Gala setbits_be32(&gur->devdisr, MPC86xx_DEVDISR_PCIE2); /* disable */ 2805e3d7050SKumar Gala #endif 2813dd2db53SJon Loeliger 2823dd2db53SJon Loeliger #ifdef CONFIG_PCI1 2833dd2db53SJon Loeliger if (!(devdisr & MPC86xx_DEVDISR_PCI1)) { 2845e3d7050SKumar Gala SET_STD_PCI_INFO(pci_info[num], 1); 2855e3d7050SKumar Gala pci_agent = fsl_setup_hose(&pci1_hose, pci_info[num].regs); 286*8ca78f2cSPeter Tyser printf("PCI: connected to PCI slots as %s" \ 2875e3d7050SKumar Gala " (base address %lx)\n", 2883dd2db53SJon Loeliger pci_agent ? "Agent" : "Host", 2895e3d7050SKumar Gala pci_info[num].regs); 2905e3d7050SKumar Gala first_free_busno = fsl_pci_init_port(&pci_info[num++], 2915e3d7050SKumar Gala &pci1_hose, first_free_busno); 2925e3d7050SKumar Gala } else { 2935e3d7050SKumar Gala printf("PCI: disabled\n"); 2943dd2db53SJon Loeliger } 2955e3d7050SKumar Gala 2965e3d7050SKumar Gala puts("\n"); 2975e3d7050SKumar Gala #else 2985e3d7050SKumar Gala setbits_be32(&gur->devdisr, MPC86xx_DEVDISR_PCI1); /* disable */ 2995e3d7050SKumar Gala #endif 3003dd2db53SJon Loeliger } 3013dd2db53SJon Loeliger 3021df170f8SJon Loeliger #if defined(CONFIG_OF_BOARD_SETUP) 3033dd2db53SJon Loeliger void 3043dd2db53SJon Loeliger ft_board_setup(void *blob, bd_t *bd) 3053dd2db53SJon Loeliger { 3068439f05cSPeter Tyser ft_cpu_setup(blob, bd); 3071df170f8SJon Loeliger 3086525d51fSKumar Gala FT_FSL_PCI_SETUP; 3091df170f8SJon Loeliger } 3103dd2db53SJon Loeliger #endif 3113dd2db53SJon Loeliger 3123dd2db53SJon Loeliger /* 3133dd2db53SJon Loeliger * get_board_sys_clk 3143dd2db53SJon Loeliger * Reads the FPGA on board for CONFIG_SYS_CLK_FREQ 3153dd2db53SJon Loeliger */ 3163dd2db53SJon Loeliger 3173dd2db53SJon Loeliger unsigned long 3183dd2db53SJon Loeliger get_board_sys_clk(ulong dummy) 3193dd2db53SJon Loeliger { 320a877880cSYork Sun u8 i; 3213dd2db53SJon Loeliger ulong val = 0; 322048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 3233dd2db53SJon Loeliger 324048e7efeSKumar Gala i = in_8(pixis_base + PIXIS_SPD); 3253dd2db53SJon Loeliger i &= 0x07; 3263dd2db53SJon Loeliger 3273dd2db53SJon Loeliger switch (i) { 3283dd2db53SJon Loeliger case 0: 3293dd2db53SJon Loeliger val = 33333000; 3303dd2db53SJon Loeliger break; 3313dd2db53SJon Loeliger case 1: 3323dd2db53SJon Loeliger val = 39999600; 3333dd2db53SJon Loeliger break; 3343dd2db53SJon Loeliger case 2: 3353dd2db53SJon Loeliger val = 49999500; 3363dd2db53SJon Loeliger break; 3373dd2db53SJon Loeliger case 3: 3383dd2db53SJon Loeliger val = 66666000; 3393dd2db53SJon Loeliger break; 3403dd2db53SJon Loeliger case 4: 3413dd2db53SJon Loeliger val = 83332500; 3423dd2db53SJon Loeliger break; 3433dd2db53SJon Loeliger case 5: 3443dd2db53SJon Loeliger val = 99999000; 3453dd2db53SJon Loeliger break; 3463dd2db53SJon Loeliger case 6: 3473dd2db53SJon Loeliger val = 133332000; 3483dd2db53SJon Loeliger break; 3493dd2db53SJon Loeliger case 7: 3503dd2db53SJon Loeliger val = 166665000; 3513dd2db53SJon Loeliger break; 3523dd2db53SJon Loeliger } 3533dd2db53SJon Loeliger 3543dd2db53SJon Loeliger return val; 3553dd2db53SJon Loeliger } 35665d3d99cSBen Warren 35765d3d99cSBen Warren int board_eth_init(bd_t *bis) 35865d3d99cSBen Warren { 35989973f8aSBen Warren return pci_eth_init(bis); 36065d3d99cSBen Warren } 3614ef630dfSPeter Tyser 3624ef630dfSPeter Tyser void board_reset(void) 3634ef630dfSPeter Tyser { 364048e7efeSKumar Gala u8 *pixis_base = (u8 *)PIXIS_BASE; 365048e7efeSKumar Gala 366048e7efeSKumar Gala out_8(pixis_base + PIXIS_RST, 0); 3674ef630dfSPeter Tyser 3684ef630dfSPeter Tyser while (1) 3694ef630dfSPeter Tyser ; 3704ef630dfSPeter Tyser } 371