1*1c274c4eSKim Phillips /* 2*1c274c4eSKim Phillips * Copyright (C) 2007 Freescale Semiconductor, Inc. 3*1c274c4eSKim Phillips * 4*1c274c4eSKim Phillips * Michael Barkowski <michael.barkowski@freescale.com> 5*1c274c4eSKim Phillips * Based on mpc832xmds file by Dave Liu <daveliu@freescale.com> 6*1c274c4eSKim Phillips * 7*1c274c4eSKim Phillips * This program is free software; you can redistribute it and/or modify it 8*1c274c4eSKim Phillips * under the terms of the GNU General Public License version 2 as published 9*1c274c4eSKim Phillips * by the Free Software Foundation. 10*1c274c4eSKim Phillips */ 11*1c274c4eSKim Phillips 12*1c274c4eSKim Phillips #include <common.h> 13*1c274c4eSKim Phillips #include <ioports.h> 14*1c274c4eSKim Phillips #include <mpc83xx.h> 15*1c274c4eSKim Phillips #include <i2c.h> 16*1c274c4eSKim Phillips #include <spd.h> 17*1c274c4eSKim Phillips #include <miiphy.h> 18*1c274c4eSKim Phillips #include <command.h> 19*1c274c4eSKim Phillips #include <libfdt.h> 20*1c274c4eSKim Phillips #include <libfdt_env.h> 21*1c274c4eSKim Phillips #if defined(CONFIG_PCI) 22*1c274c4eSKim Phillips #include <pci.h> 23*1c274c4eSKim Phillips #endif 24*1c274c4eSKim Phillips #if defined(CONFIG_SPD_EEPROM) 25*1c274c4eSKim Phillips #include <spd_sdram.h> 26*1c274c4eSKim Phillips #else 27*1c274c4eSKim Phillips #include <asm/mmu.h> 28*1c274c4eSKim Phillips #endif 29*1c274c4eSKim Phillips 30*1c274c4eSKim Phillips const qe_iop_conf_t qe_iop_conf_tab[] = { 31*1c274c4eSKim Phillips /* UCC3 */ 32*1c274c4eSKim Phillips {1, 0, 1, 0, 1}, /* TxD0 */ 33*1c274c4eSKim Phillips {1, 1, 1, 0, 1}, /* TxD1 */ 34*1c274c4eSKim Phillips {1, 2, 1, 0, 1}, /* TxD2 */ 35*1c274c4eSKim Phillips {1, 3, 1, 0, 1}, /* TxD3 */ 36*1c274c4eSKim Phillips {1, 9, 1, 0, 1}, /* TxER */ 37*1c274c4eSKim Phillips {1, 12, 1, 0, 1}, /* TxEN */ 38*1c274c4eSKim Phillips {3, 24, 2, 0, 1}, /* TxCLK->CLK10 */ 39*1c274c4eSKim Phillips 40*1c274c4eSKim Phillips {1, 4, 2, 0, 1}, /* RxD0 */ 41*1c274c4eSKim Phillips {1, 5, 2, 0, 1}, /* RxD1 */ 42*1c274c4eSKim Phillips {1, 6, 2, 0, 1}, /* RxD2 */ 43*1c274c4eSKim Phillips {1, 7, 2, 0, 1}, /* RxD3 */ 44*1c274c4eSKim Phillips {1, 8, 2, 0, 1}, /* RxER */ 45*1c274c4eSKim Phillips {1, 10, 2, 0, 1}, /* RxDV */ 46*1c274c4eSKim Phillips {0, 13, 2, 0, 1}, /* RxCLK->CLK9 */ 47*1c274c4eSKim Phillips {1, 11, 2, 0, 1}, /* COL */ 48*1c274c4eSKim Phillips {1, 13, 2, 0, 1}, /* CRS */ 49*1c274c4eSKim Phillips 50*1c274c4eSKim Phillips /* UCC2 */ 51*1c274c4eSKim Phillips {0, 18, 1, 0, 1}, /* TxD0 */ 52*1c274c4eSKim Phillips {0, 19, 1, 0, 1}, /* TxD1 */ 53*1c274c4eSKim Phillips {0, 20, 1, 0, 1}, /* TxD2 */ 54*1c274c4eSKim Phillips {0, 21, 1, 0, 1}, /* TxD3 */ 55*1c274c4eSKim Phillips {0, 27, 1, 0, 1}, /* TxER */ 56*1c274c4eSKim Phillips {0, 30, 1, 0, 1}, /* TxEN */ 57*1c274c4eSKim Phillips {3, 23, 2, 0, 1}, /* TxCLK->CLK3 */ 58*1c274c4eSKim Phillips 59*1c274c4eSKim Phillips {0, 22, 2, 0, 1}, /* RxD0 */ 60*1c274c4eSKim Phillips {0, 23, 2, 0, 1}, /* RxD1 */ 61*1c274c4eSKim Phillips {0, 24, 2, 0, 1}, /* RxD2 */ 62*1c274c4eSKim Phillips {0, 25, 2, 0, 1}, /* RxD3 */ 63*1c274c4eSKim Phillips {0, 26, 1, 0, 1}, /* RxER */ 64*1c274c4eSKim Phillips {0, 28, 2, 0, 1}, /* Rx_DV */ 65*1c274c4eSKim Phillips {3, 21, 2, 0, 1}, /* RxCLK->CLK16 */ 66*1c274c4eSKim Phillips {0, 29, 2, 0, 1}, /* COL */ 67*1c274c4eSKim Phillips {0, 31, 2, 0, 1}, /* CRS */ 68*1c274c4eSKim Phillips 69*1c274c4eSKim Phillips {3, 4, 3, 0, 2}, /* MDIO */ 70*1c274c4eSKim Phillips {3, 5, 1, 0, 2}, /* MDC */ 71*1c274c4eSKim Phillips 72*1c274c4eSKim Phillips {0, 0, 0, 0, QE_IOP_TAB_END}, /* END of table */ 73*1c274c4eSKim Phillips }; 74*1c274c4eSKim Phillips 75*1c274c4eSKim Phillips int board_early_init_f(void) 76*1c274c4eSKim Phillips { 77*1c274c4eSKim Phillips return 0; 78*1c274c4eSKim Phillips } 79*1c274c4eSKim Phillips 80*1c274c4eSKim Phillips int fixed_sdram(void); 81*1c274c4eSKim Phillips 82*1c274c4eSKim Phillips long int initdram(int board_type) 83*1c274c4eSKim Phillips { 84*1c274c4eSKim Phillips volatile immap_t *im = (immap_t *) CFG_IMMR; 85*1c274c4eSKim Phillips u32 msize = 0; 86*1c274c4eSKim Phillips 87*1c274c4eSKim Phillips if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) 88*1c274c4eSKim Phillips return -1; 89*1c274c4eSKim Phillips 90*1c274c4eSKim Phillips /* DDR SDRAM - Main SODIMM */ 91*1c274c4eSKim Phillips im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR; 92*1c274c4eSKim Phillips 93*1c274c4eSKim Phillips msize = fixed_sdram(); 94*1c274c4eSKim Phillips 95*1c274c4eSKim Phillips puts("\n DDR RAM: "); 96*1c274c4eSKim Phillips 97*1c274c4eSKim Phillips /* return total bus SDRAM size(bytes) -- DDR */ 98*1c274c4eSKim Phillips return (msize * 1024 * 1024); 99*1c274c4eSKim Phillips } 100*1c274c4eSKim Phillips 101*1c274c4eSKim Phillips /************************************************************************* 102*1c274c4eSKim Phillips * fixed sdram init -- doesn't use serial presence detect. 103*1c274c4eSKim Phillips ************************************************************************/ 104*1c274c4eSKim Phillips int fixed_sdram(void) 105*1c274c4eSKim Phillips { 106*1c274c4eSKim Phillips volatile immap_t *im = (immap_t *) CFG_IMMR; 107*1c274c4eSKim Phillips u32 msize = 0; 108*1c274c4eSKim Phillips u32 ddr_size; 109*1c274c4eSKim Phillips u32 ddr_size_log2; 110*1c274c4eSKim Phillips 111*1c274c4eSKim Phillips msize = CFG_DDR_SIZE; 112*1c274c4eSKim Phillips for (ddr_size = msize << 20, ddr_size_log2 = 0; 113*1c274c4eSKim Phillips (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) { 114*1c274c4eSKim Phillips if (ddr_size & 1) { 115*1c274c4eSKim Phillips return -1; 116*1c274c4eSKim Phillips } 117*1c274c4eSKim Phillips } 118*1c274c4eSKim Phillips im->sysconf.ddrlaw[0].ar = 119*1c274c4eSKim Phillips LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE); 120*1c274c4eSKim Phillips im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL; 121*1c274c4eSKim Phillips im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS; 122*1c274c4eSKim Phillips im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG; 123*1c274c4eSKim Phillips im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0; 124*1c274c4eSKim Phillips im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; 125*1c274c4eSKim Phillips im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; 126*1c274c4eSKim Phillips im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3; 127*1c274c4eSKim Phillips im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG; 128*1c274c4eSKim Phillips im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2; 129*1c274c4eSKim Phillips im->ddr.sdram_mode = CFG_DDR_MODE; 130*1c274c4eSKim Phillips im->ddr.sdram_mode2 = CFG_DDR_MODE2; 131*1c274c4eSKim Phillips im->ddr.sdram_interval = CFG_DDR_INTERVAL; 132*1c274c4eSKim Phillips __asm__ __volatile__ ("sync"); 133*1c274c4eSKim Phillips udelay(200); 134*1c274c4eSKim Phillips 135*1c274c4eSKim Phillips im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; 136*1c274c4eSKim Phillips __asm__ __volatile__ ("sync"); 137*1c274c4eSKim Phillips return msize; 138*1c274c4eSKim Phillips } 139*1c274c4eSKim Phillips 140*1c274c4eSKim Phillips int checkboard(void) 141*1c274c4eSKim Phillips { 142*1c274c4eSKim Phillips puts("Board: Freescale MPC8323ERDB\n"); 143*1c274c4eSKim Phillips return 0; 144*1c274c4eSKim Phillips } 145*1c274c4eSKim Phillips 146*1c274c4eSKim Phillips static struct pci_region pci_regions[] = { 147*1c274c4eSKim Phillips { 148*1c274c4eSKim Phillips bus_start: CFG_PCI1_MEM_BASE, 149*1c274c4eSKim Phillips phys_start: CFG_PCI1_MEM_PHYS, 150*1c274c4eSKim Phillips size: CFG_PCI1_MEM_SIZE, 151*1c274c4eSKim Phillips flags: PCI_REGION_MEM | PCI_REGION_PREFETCH 152*1c274c4eSKim Phillips }, 153*1c274c4eSKim Phillips { 154*1c274c4eSKim Phillips bus_start: CFG_PCI1_MMIO_BASE, 155*1c274c4eSKim Phillips phys_start: CFG_PCI1_MMIO_PHYS, 156*1c274c4eSKim Phillips size: CFG_PCI1_MMIO_SIZE, 157*1c274c4eSKim Phillips flags: PCI_REGION_MEM 158*1c274c4eSKim Phillips }, 159*1c274c4eSKim Phillips { 160*1c274c4eSKim Phillips bus_start: CFG_PCI1_IO_BASE, 161*1c274c4eSKim Phillips phys_start: CFG_PCI1_IO_PHYS, 162*1c274c4eSKim Phillips size: CFG_PCI1_IO_SIZE, 163*1c274c4eSKim Phillips flags: PCI_REGION_IO 164*1c274c4eSKim Phillips } 165*1c274c4eSKim Phillips }; 166*1c274c4eSKim Phillips 167*1c274c4eSKim Phillips void pci_init_board(void) 168*1c274c4eSKim Phillips { 169*1c274c4eSKim Phillips volatile immap_t *immr = (volatile immap_t *)CFG_IMMR; 170*1c274c4eSKim Phillips volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk; 171*1c274c4eSKim Phillips volatile law83xx_t *pci_law = immr->sysconf.pcilaw; 172*1c274c4eSKim Phillips struct pci_region *reg[] = { pci_regions }; 173*1c274c4eSKim Phillips 174*1c274c4eSKim Phillips /* Enable all 3 PCI_CLK_OUTPUTs. */ 175*1c274c4eSKim Phillips clk->occr |= 0xe0000000; 176*1c274c4eSKim Phillips 177*1c274c4eSKim Phillips /* Configure PCI Local Access Windows */ 178*1c274c4eSKim Phillips pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR; 179*1c274c4eSKim Phillips pci_law[0].ar = LBLAWAR_EN | LBLAWAR_512MB; 180*1c274c4eSKim Phillips 181*1c274c4eSKim Phillips pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR; 182*1c274c4eSKim Phillips pci_law[1].ar = LBLAWAR_EN | LBLAWAR_1MB; 183*1c274c4eSKim Phillips 184*1c274c4eSKim Phillips mpc83xx_pci_init(1, reg, 0); 185*1c274c4eSKim Phillips } 186*1c274c4eSKim Phillips 187*1c274c4eSKim Phillips #if defined(CONFIG_OF_BOARD_SETUP) 188*1c274c4eSKim Phillips 189*1c274c4eSKim Phillips /* 190*1c274c4eSKim Phillips * Prototypes of functions that we use. 191*1c274c4eSKim Phillips */ 192*1c274c4eSKim Phillips void ft_cpu_setup(void *blob, bd_t *bd); 193*1c274c4eSKim Phillips 194*1c274c4eSKim Phillips #ifdef CONFIG_PCI 195*1c274c4eSKim Phillips void ft_pci_setup(void *blob, bd_t *bd); 196*1c274c4eSKim Phillips #endif 197*1c274c4eSKim Phillips 198*1c274c4eSKim Phillips void 199*1c274c4eSKim Phillips ft_board_setup(void *blob, bd_t *bd) 200*1c274c4eSKim Phillips { 201*1c274c4eSKim Phillips int nodeoffset; 202*1c274c4eSKim Phillips int tmp[2]; 203*1c274c4eSKim Phillips 204*1c274c4eSKim Phillips nodeoffset = fdt_find_node_by_path(blob, "/memory"); 205*1c274c4eSKim Phillips if (nodeoffset >= 0) { 206*1c274c4eSKim Phillips tmp[0] = cpu_to_be32(bd->bi_memstart); 207*1c274c4eSKim Phillips tmp[1] = cpu_to_be32(bd->bi_memsize); 208*1c274c4eSKim Phillips fdt_setprop(blob, nodeoffset, "reg", tmp, sizeof(tmp)); 209*1c274c4eSKim Phillips } 210*1c274c4eSKim Phillips 211*1c274c4eSKim Phillips ft_cpu_setup(blob, bd); 212*1c274c4eSKim Phillips 213*1c274c4eSKim Phillips #ifdef CONFIG_PCI 214*1c274c4eSKim Phillips ft_pci_setup(blob, bd); 215*1c274c4eSKim Phillips #endif 216*1c274c4eSKim Phillips } 217*1c274c4eSKim Phillips #endif /* CONFIG_OF_BOARD_SETUP */ 218