]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/freescale/mpc8360emds/mpc8360emds.c
Merge branch 'master' of git://git.denx.de/u-boot-usb
[karo-tx-uboot.git] / board / freescale / mpc8360emds / mpc8360emds.c
index 0babd2648afce1f0661e9d8c86238a3dfce8e493..f0a55f8a8d8c3ef27f61161c1e2741dffe864432 100644 (file)
@@ -1,14 +1,8 @@
 /*
- * Copyright (C) 2006,2010 Freescale Semiconductor, Inc.
+ * Copyright (C) 2006,2010-2011 Freescale Semiconductor, Inc.
  * Dave Liu <daveliu@freescale.com>
  *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <mpc83xx.h>
 #include <i2c.h>
 #include <miiphy.h>
+#include <phy.h>
+#include <fsl_mdio.h>
 #if defined(CONFIG_PCI)
 #include <pci.h>
 #endif
 #include <spd_sdram.h>
 #include <asm/mmu.h>
 #include <asm/io.h>
-#include <asm/fsl_enet.h>
+#include <asm/mmu.h>
 #if defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
 #endif
@@ -138,9 +134,20 @@ int board_early_init_f(void)
 
 int board_early_init_r(void)
 {
+       gd_t *gd;
 #ifdef CONFIG_PQ_MDS_PIB
        pib_init();
 #endif
+       /*
+        * BAT6 is used for SDRAM when DDR size is 512MB or larger than 256MB
+        * So re-setup PCI MEM space used BAT5 after relocated to DDR
+        */
+       gd = (gd_t *)(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
+       if (gd->ram_size > CONFIG_MAX_MEM_MAPPED) {
+               write_bat(DBAT5, CONFIG_SYS_DBAT6U, CONFIG_SYS_DBAT6L);
+               write_bat(IBAT5, CONFIG_SYS_IBAT6U, CONFIG_SYS_IBAT6L);
+       }
+
        return 0;
 }
 
@@ -159,9 +166,11 @@ int board_eth_init(bd_t *bd)
        if (board_handle_erratum2()) {
                int i;
 
-               for (i = 0; i < ARRAY_SIZE(uec_info); i++)
-                       uec_info[i].enet_interface_type = RGMII_RXID;
-                       uec_info[i].speed = 1000;
+               for (i = 0; i < ARRAY_SIZE(uec_info); i++) {
+                       uec_info[i].enet_interface_type =
+                               PHY_INTERFACE_MODE_RGMII_RXID;
+                       uec_info[i].speed = SPEED_1000;
+               }
        }
        return uec_eth_init(bd, uec_info, ARRAY_SIZE(uec_info));
 }
@@ -214,19 +223,15 @@ phys_size_t initdram(int board_type)
 int fixed_sdram(void)
 {
        volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
-       u32 msize = 0;
-       u32 ddr_size;
-       u32 ddr_size_log2;
-
-       msize = CONFIG_SYS_DDR_SIZE;
-       for (ddr_size = msize << 20, ddr_size_log2 = 0;
-            (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) {
-               if (ddr_size & 1) {
-                       return -1;
-               }
-       }
+       u32 msize = CONFIG_SYS_DDR_SIZE;
+       u32 ddr_size = msize << 20;
+       u32 ddr_size_log2 = __ilog2(ddr_size);
+       u32 half_ddr_size = ddr_size >> 1;
+
+       im->sysconf.ddrlaw[0].bar =
+               CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000;
        im->sysconf.ddrlaw[0].ar =
-           LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
+               LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
 #if (CONFIG_SYS_DDR_SIZE != 256)
 #warning Currenly any ddr size other than 256 is not supported
 #endif
@@ -244,11 +249,25 @@ int fixed_sdram(void)
        im->ddr.sdram_interval = CONFIG_SYS_DDR_INTERVAL;
        im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CNTL;
 #else
-       im->ddr.csbnds[0].csbnds = 0x00000007;
-       im->ddr.csbnds[1].csbnds = 0x0008000f;
 
-       im->ddr.cs_config[0] = CONFIG_SYS_DDR_CONFIG;
-       im->ddr.cs_config[1] = CONFIG_SYS_DDR_CONFIG;
+#if ((CONFIG_SYS_DDR_SDRAM_BASE & 0x00FFFFFF) != 0)
+#warning Chip select bounds is only configurable in 16MB increments
+#endif
+       im->ddr.csbnds[0].csbnds =
+               ((CONFIG_SYS_DDR_SDRAM_BASE >> CSBNDS_SA_SHIFT) & CSBNDS_SA) |
+               (((CONFIG_SYS_DDR_SDRAM_BASE + half_ddr_size - 1) >>
+                               CSBNDS_EA_SHIFT) & CSBNDS_EA);
+       im->ddr.csbnds[1].csbnds =
+               (((CONFIG_SYS_DDR_SDRAM_BASE + half_ddr_size) >>
+                               CSBNDS_SA_SHIFT) & CSBNDS_SA) |
+               (((CONFIG_SYS_DDR_SDRAM_BASE + ddr_size - 1) >>
+                               CSBNDS_EA_SHIFT) & CSBNDS_EA);
+
+       im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG;
+       im->ddr.cs_config[1] = CONFIG_SYS_DDR_CS1_CONFIG;
+
+       im->ddr.cs_config[2] = 0;
+       im->ddr.cs_config[3] = 0;
 
        im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
        im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;
@@ -290,6 +309,19 @@ static int sdram_init(unsigned int base)
        if (rem)
                base = base - rem + sdram_size;
 
+       /*
+        * Setup BAT6 for SDRAM when DDR size is 512MB or larger than 256MB
+        * After relocated to DDR, reuse BAT5 for PCI MEM space
+        */
+       if (base > CONFIG_MAX_MEM_MAPPED) {
+               unsigned long batl = base | BATL_PP_10 | BATL_MEMCOHERENCE;
+               unsigned long batu = base | BATU_BL_64M | BATU_VS | BATU_VP;
+
+               /* Setup the BAT6 for SDRAM */
+               write_bat(DBAT6, batu, batl);
+               write_bat(IBAT6, batu, batl);
+       }
+
        sdram_addr = (uint *)base;
        /*
         * Setup SDRAM Base and Option Registers
@@ -370,7 +402,7 @@ static void ft_board_fixup_qe_usb(void *blob, bd_t *bd)
                           "peripheral", sizeof("peripheral"), 1);
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
        ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
@@ -395,10 +427,10 @@ void ft_board_setup(void *blob, bd_t *bd)
                        if (prop) {
                                path = fdt_path_offset(blob, prop);
                                prop = fdt_getprop(blob, path,
-                                                  "phy-connection-type", 0);
+                                                  "phy-connection-type", 0);
                                if (prop && (strcmp(prop, "rgmii-id") == 0))
                                        fdt_fixup_phy_connection(blob, path,
-                                                               RGMII_RXID);
+                                               PHY_INTERFACE_MODE_RGMII_RXID);
                        }
 #endif
 #if defined(CONFIG_HAS_ETH1)
@@ -407,13 +439,15 @@ void ft_board_setup(void *blob, bd_t *bd)
                        if (prop) {
                                path = fdt_path_offset(blob, prop);
                                prop = fdt_getprop(blob, path,
-                                                  "phy-connection-type", 0);
+                                                  "phy-connection-type", 0);
                                if (prop && (strcmp(prop, "rgmii-id") == 0))
                                        fdt_fixup_phy_connection(blob, path,
-                                                               RGMII_RXID);
+                                               PHY_INTERFACE_MODE_RGMII_RXID);
                        }
 #endif
                }
        }
+
+       return 0;
 }
 #endif