Merge rsync://rsync.denx.de/git/u-boot
authorKumar Gala <galak@kernel.crashing.org>
Wed, 22 Feb 2006 20:15:41 +0000 (14:15 -0600)
committerKumar Gala <galak@kernel.crashing.org>
Wed, 22 Feb 2006 20:15:41 +0000 (14:15 -0600)
22 files changed:
CHANGELOG
README
board/mpc8349ads/Makefile
board/mpc8349ads/mpc8349ads.c
board/mpc8349ads/pci.c [new file with mode: 0644]
common/cmd_bootm.c
common/ft_build.c
cpu/mpc83xx/cpu.c
cpu/mpc83xx/cpu_init.c
cpu/mpc83xx/interrupts.c
cpu/mpc83xx/start.S
drivers/pci.c
drivers/pci_auto.c
drivers/pci_indirect.c
include/asm-ppc/immap_83xx.h
include/asm-ppc/mpc8349_pci.h
include/configs/MPC8349ADS.h
include/configs/TQM834x.h
include/configs/stxxtc.h
include/ft_build.h
include/pci.h
lib_ppc/board.c

index a4b0700..eaa1893 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,77 @@
 Changes since U-Boot 1.1.4:
 ======================================================================
 
+* Enable address translation on MPC83xx
+  Patch by Kumar Gala, 10 Feb 2006
+
+* Decopuled setting of OR/BR and LBLAWBAR/LBLAWAR on MPC83xx
+  Patch by Kumar Gala, 25 Jan 2006
+
+* Fixed defines for MPC83xx SICRL register to match current specs
+  Patch by Kumar Gala, 23 Jan 2006
+
+* Fixed PCI indirect config ops to handle multiple PCI controllers
+  We need to adjust the bus number we are trying to access based
+  on which PCI controller its on
+  Patch by Kumar Gala 12 Jan 2006
+
+* Add helper function for generic flat device tree fixups for mpc83xx
+  Patch by Kumar Gala 11 Jan 2006
+
+* Add support for passing initrd information via flat device tree
+  Patch by Kumar Gala 11 Jan 2006
+
+* Added OF_STDOUT_PATH and OF_SOC
+
+  OF_STDOUT_PATH specifies the path to the device the kernel can use
+  for console output
+
+  OF_SOC specifies the proper name of the SOC node if one exists.
+  Patch by Kumar Gala 11 Jan 2006
+
+* Allow board code to fixup the flat device tree before booting a
+  kernel
+  Patch by Kumar Gala 11 Jan 2006
+
+* Added CONFIG_ options for bd_t and env in flat dev tree
+
+       CONFIG_OF_HAS_BD_T will put a copy of the bd_t
+       into the resulting flat device tree.
+
+       CONFIG_OF_HAS_UBOOT_ENV will copy the environment
+       variables from u-boot into the flat device tree
+
+  Patch by Kumar Gala 11 Jan 2006
+
+* Report back PCI bus when doing table based device config
+  Patch by Kumar Gala 11 Jan 2006
+
+* Added support for PCI prefetchable region and BARs
+  If a host controller sets up a region as prefetchable and
+  a device's BAR denotes it as prefetchable, allocate the
+  BAR into the prefetch region.
+
+  If a BAR is prefetchable and no prefetchable region has
+  been setup by the controller we fall back to allocating
+  the BAR into the normally memory region.
+  Patch by Kumar Gala 11 Jan 2006
+
+* Only disable the MPC83xx watchdog if its enabled out of reset.
+  If its disabled out of reset SW can later enable it if so desired
+  Patch by Kumar Gala, 11 Jan 2006
+
+* Allow config of GPIO direction & data registers at boot on 83xx
+  Patch by Kumar Gala, 11 Jan 2006
+
+* Enable time handling on 83xx
+  Patch by Kumar Gala, 11 Jan 2006
+
+* Make System IO Config Registers board configurable on MPC83xx
+  Patch by Kumar Gala, 11 Jan 2006
+
+* Added PCI support for MPC8349ADS board
+  Patch by Kumar Gala 11 Jan 2006
+
 * Add basic support for the SMMACO4 Board from PanDaCom.
   Patch by Heiko Schocher, 20 Feb 2006
 
@@ -55,6 +126,7 @@ Changes since U-Boot 1.1.4:
 * Fix mkimage bug with multifile images created on 64 bit systems.
 
 * Add support for 28F256J3A flash (=> 64 MB) on PM520 board
+>>>>>>> 6624b687bc2b747233090e67628df37d1c84ed17/CHANGELOG
 
 * Fix compiler problem with at91rm9200dk board.
   Patch by Eugen Bigz, 19 Dec 2005
diff --git a/README b/README
index 6f61008..ecaef9e 100644 (file)
--- a/README
+++ b/README
@@ -411,7 +411,24 @@ The following options need to be configured:
                The maximum size of the constructed OF tree.
 
                OF_CPU - The proper name of the cpus node.
+               OF_SOC - The proper name of the soc node.
                OF_TBCLK - The timebase frequency.
+               OF_STDOUT_PATH - The path to the console device
+
+               CONFIG_OF_HAS_BD_T
+
+               The resulting flat device tree will have a copy of the bd_t.
+               Space should be pre-allocated in the dts for the bd_t.
+
+               CONFIG_OF_HAS_UBOOT_ENV
+               
+               The resulting flat device tree will have a copy of u-boot's
+               environment variables
+
+               CONFIG_OF_BOARD_SETUP
+
+               Board code has addition modification that it wants to make
+               to the flat device tree before handing it off to the kernel
 
 - Serial Ports:
                CFG_PL010_SERIAL
index 4327b0d..f865f9c 100644 (file)
@@ -24,7 +24,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = lib$(BOARD).a
 
-OBJS   := $(BOARD).o
+OBJS   := $(BOARD).o pci.o
 
 $(LIB):        $(OBJS) $(SOBJS)
        $(AR) crv $@ $(OBJS)
index da8d3d7..505acbc 100644 (file)
@@ -147,47 +147,6 @@ int checkboard (void)
        return 0;
 }
 
-#if defined(CONFIG_PCI)
-/*
- * Initialize PCI Devices, report devices found
- */
-#ifndef CONFIG_PCI_PNP
-static struct pci_config_table pci_mpc83xxads_config_table[] = {
-       {PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID,PCI_ANY_ID,
-       pci_cfgfunc_config_device, {PCI_ENET0_IOADDR,
-                                   PCI_ENET0_MEMADDR,
-                                   PCI_COMMON_MEMORY | PCI_COMMAND_MASTER
-       } },
-       {}
-}
-#endif
-
-
-volatile static struct pci_controller hose[] = {
-       {
-#ifndef CONFIG_PCI_PNP
-       config_table:pci_mpc83xxads_config_table,
-#endif
-       },
-       {
-#ifndef CONFIG_PCI_PNP
-       config_table:pci_mpc83xxads_config_table,
-#endif
-       }
-};
-#endif /* CONFIG_PCI */
-
-
-void
-pci_init_board(void)
-{
-#ifdef CONFIG_PCI
-       extern void pci_mpc83xx_init(volatile struct pci_controller *hose);
-
-       pci_mpc83xx_init(hose);
-#endif /* CONFIG_PCI */
-}
-
 /*
  * if MPC8349ADS is soldered with SDRAM
  */
diff --git a/board/mpc8349ads/pci.c b/board/mpc8349ads/pci.c
new file mode 100644 (file)
index 0000000..6cafbaa
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+
+#include <asm/mmu.h>
+#include <common.h>
+#include <asm/global_data.h>
+#include <pci.h>
+#include <asm/mpc8349_pci.h>
+#include <i2c.h>
+
+#ifdef CONFIG_PCI
+
+/* System RAM mapped to PCI space */
+#define CONFIG_PCI_SYS_MEM_BUS CFG_SDRAM_BASE
+#define CONFIG_PCI_SYS_MEM_PHYS        CFG_SDRAM_BASE
+
+#ifndef CONFIG_PCI_PNP
+static struct pci_config_table pci_mpc83xxads_config_table[] = {
+       {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
+        PCI_IDSEL_NUMBER, PCI_ANY_ID,
+        pci_cfgfunc_config_device, {PCI_ENET0_IOADDR,
+                                    PCI_ENET0_MEMADDR,
+                                    PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER
+               }
+       },
+       {}
+};
+#endif
+
+static struct pci_controller pci_hose[] = {
+       {
+#ifndef CONFIG_PCI_PNP
+       config_table:pci_mpc83xxads_config_table,
+#endif
+       },
+       {
+#ifndef CONFIG_PCI_PNP
+       config_table:pci_mpc83xxads_config_table,
+#endif
+       }
+};
+
+/**************************************************************************
+ *
+ * pib_init() -- initialize the PCA9555PW IO expander on the PIB board
+ *
+ */
+void
+pib_init(void)
+{
+       u8 val8;
+       /*
+        * Assign PIB PMC slot to desired PCI bus
+        */
+       mpc8349_i2c = (i2c_t*)(CFG_IMMRBAR + CFG_I2C2_OFFSET);
+       i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
+
+       val8 = 0;
+       i2c_write(0x23, 0x6, 1, &val8, 1);
+       i2c_write(0x23, 0x7, 1, &val8, 1);
+       val8 = 0xff;
+       i2c_write(0x23, 0x2, 1, &val8, 1);
+       i2c_write(0x23, 0x3, 1, &val8, 1);
+
+       val8 = 0;
+       i2c_write(0x26, 0x6, 1, &val8, 1);
+       val8 = 0x34;
+       i2c_write(0x26, 0x7, 1, &val8, 1);
+#if defined(PCI_64BIT)
+       val8 = 0xf4;    /* PMC2:PCI1/64-bit */
+#elif defined(PCI_ALL_PCI1)
+       val8 = 0xf3;    /* PMC1:PCI1 PMC2:PCI1 PMC3:PCI1 */
+#elif defined(PCI_ONE_PCI1)
+       val8 = 0xf9;    /* PMC1:PCI1 PMC2:PCI2 PMC3:PCI2 */
+#else
+       val8 = 0xf5;    /* PMC1:PCI1 PMC2:PCI1 PMC3:PCI2 */
+#endif
+       i2c_write(0x26, 0x2, 1, &val8, 1);
+       val8 = 0xff;
+       i2c_write(0x26, 0x3, 1, &val8, 1);
+       val8 = 0;
+       i2c_write(0x27, 0x6, 1, &val8, 1);
+       i2c_write(0x27, 0x7, 1, &val8, 1);
+       val8 = 0xff;
+       i2c_write(0x27, 0x2, 1, &val8, 1);
+       val8 = 0xef;
+       i2c_write(0x27, 0x3, 1, &val8, 1);
+       asm("eieio");
+
+#if defined(PCI_64BIT)
+       printf("PCI1: 64-bit on PMC2\n");
+#elif defined(PCI_ALL_PCI1)
+       printf("PCI1: 32-bit on PMC1, PMC2, PMC3\n");
+#elif defined(PCI_ONE_PCI1)
+       printf("PCI1: 32-bit on PMC1\n");
+       printf("PCI2: 32-bit on PMC2, PMC3\n");
+#else
+       printf("PCI1: 32-bit on PMC1, PMC2\n");
+       printf("PCI2: 32-bit on PMC3\n");
+#endif
+}
+
+/**************************************************************************
+ * pci_init_board()
+ *
+ * NOTICE: PCI2 is not currently supported
+ *
+ */
+void
+pci_init_board(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       volatile immap_t *      immr;
+       volatile clk8349_t *    clk;
+       volatile law8349_t *    pci_law;
+       volatile pot8349_t *    pci_pot;
+       volatile pcictrl8349_t *        pci_ctrl;
+       volatile pciconf8349_t *        pci_conf;
+       u16 reg16;
+       u32 reg32;
+       u32 dev;
+       struct  pci_controller * hose;
+
+       immr = (immap_t *)CFG_IMMRBAR;
+       clk = (clk8349_t *)&immr->clk;
+       pci_law = immr->sysconf.pcilaw;
+       pci_pot = immr->ios.pot;
+       pci_ctrl = immr->pci_ctrl;
+       pci_conf = immr->pci_conf;
+
+       hose = &pci_hose[0];
+
+       pib_init();
+
+       /*
+        * Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode
+        */
+
+       reg32 = clk->occr;
+       udelay(2000);
+       clk->occr = 0xff000000;
+       udelay(2000);
+
+       /*
+        * Release PCI RST Output signal
+        */
+       pci_ctrl[0].gcr = 0;
+       udelay(2000);
+       pci_ctrl[0].gcr = 1;
+
+#ifdef CONFIG_MPC83XX_PCI2
+       pci_ctrl[1].gcr = 0;
+       udelay(2000);
+       pci_ctrl[1].gcr = 1;
+#endif
+
+       /* We need to wait at least a 1sec based on PCI specs */
+       {
+               int i;
+
+               for (i = 0; i < 1000; ++i)
+                       udelay (1000);
+       }
+
+       /*
+        * Configure PCI Local Access Windows
+        */
+       pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR;
+       pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G;
+
+       pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR;
+       pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_32M;
+
+       /*
+        * Configure PCI Outbound Translation Windows
+        */
+
+       /* PCI1 mem space - prefetch */
+       pci_pot[0].potar = (CFG_PCI1_MEM_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[0].pobar = (CFG_PCI1_MEM_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[0].pocmr = POCMR_EN | POCMR_PREFETCH_EN | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /* PCI1 IO space */
+       pci_pot[1].potar = (CFG_PCI1_IO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[1].pobar = (CFG_PCI1_IO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[1].pocmr = POCMR_EN | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK);
+
+       /* PCI1 mmio - non-prefetch mem space */
+       pci_pot[2].potar = (CFG_PCI1_MMIO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[2].pobar = (CFG_PCI1_MMIO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[2].pocmr = POCMR_EN | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /*
+        * Configure PCI Inbound Translation Windows
+        */
+
+       /* we need RAM mapped to PCI space for the devices to
+        * access main memory */
+       pci_ctrl[0].pitar1 = 0x0;
+       pci_ctrl[0].pibar1 = 0x0;
+       pci_ctrl[0].piebar1 = 0x0;
+       pci_ctrl[0].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1);
+
+       hose->first_busno = 0;
+       hose->last_busno = 0xff;
+
+       /* PCI memory prefetch space */
+       pci_set_region(hose->regions + 0,
+                      CFG_PCI1_MEM_BASE,
+                      CFG_PCI1_MEM_PHYS,
+                      CFG_PCI1_MEM_SIZE,
+                      PCI_REGION_MEM|PCI_REGION_PREFETCH);
+
+       /* PCI memory space */
+       pci_set_region(hose->regions + 1,
+                      CFG_PCI1_MMIO_BASE,
+                      CFG_PCI1_MMIO_PHYS,
+                      CFG_PCI1_MMIO_SIZE,
+                      PCI_REGION_MEM);
+
+       /* PCI IO space */
+       pci_set_region(hose->regions + 2,
+                      CFG_PCI1_IO_BASE,
+                      CFG_PCI1_IO_PHYS,
+                      CFG_PCI1_IO_SIZE,
+                      PCI_REGION_IO);
+
+       /* System memory space */
+       pci_set_region(hose->regions + 3,
+                      CONFIG_PCI_SYS_MEM_BUS,
+                       CONFIG_PCI_SYS_MEM_PHYS,
+                       gd->ram_size,
+                       PCI_REGION_MEM | PCI_REGION_MEMORY);
+
+       hose->region_count = 4;
+
+       pci_setup_indirect(hose,
+                          (CFG_IMMRBAR+0x8300),
+                          (CFG_IMMRBAR+0x8304));
+
+       pci_register_hose(hose);
+
+       /*
+        * Write to Command register
+        */
+       reg16 = 0xff;
+       dev = PCI_BDF(hose->first_busno, 0, 0);
+       pci_hose_read_config_word (hose, dev, PCI_COMMAND, &reg16);
+       reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16);
+
+       /*
+        * Clear non-reserved bits in status register.
+        */
+       pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff);
+       pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80);
+       pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
+
+#ifdef CONFIG_PCI_SCAN_SHOW
+       printf("PCI:   Bus Dev VenId DevId Class Int\n");
+#endif
+       /*
+        * Hose scan.
+        */
+       hose->last_busno = pci_hose_scan(hose);
+
+#ifdef CONFIG_MPC83XX_PCI2
+       hose = &pci_hose[1];
+
+       /*
+        * Configure PCI Outbound Translation Windows
+        */
+
+       /* PCI2 mem space - prefetch */
+       pci_pot[3].potar = (CFG_PCI2_MEM_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[3].pobar = (CFG_PCI2_MEM_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[3].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_PREFETCH_EN | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /* PCI2 IO space */
+       pci_pot[4].potar = (CFG_PCI2_IO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[4].pobar = (CFG_PCI2_IO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[4].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK);
+
+       /* PCI2 mmio - non-prefetch mem space */
+       pci_pot[5].potar = (CFG_PCI2_MMIO_BASE >> 12) & POTAR_TA_MASK;
+       pci_pot[5].pobar = (CFG_PCI2_MMIO_PHYS >> 12) & POBAR_BA_MASK;
+       pci_pot[5].pocmr = POCMR_EN | POCMR_PCI2 | (POCMR_CM_256M & POCMR_CM_MASK);
+
+       /*
+        * Configure PCI Inbound Translation Windows
+        */
+
+       /* we need RAM mapped to PCI space for the devices to
+        * access main memory */
+       pci_ctrl[1].pitar1 = 0x0;
+       pci_ctrl[1].pibar1 = 0x0;
+       pci_ctrl[1].piebar1 = 0x0;
+       pci_ctrl[1].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1);
+
+       hose->first_busno = pci_hose[0].last_busno + 1;
+       hose->last_busno = 0xff;
+
+       /* PCI memory prefetch space */
+       pci_set_region(hose->regions + 0,
+                      CFG_PCI2_MEM_BASE,
+                      CFG_PCI2_MEM_PHYS,
+                      CFG_PCI2_MEM_SIZE,
+                      PCI_REGION_MEM|PCI_REGION_PREFETCH);
+
+       /* PCI memory space */
+       pci_set_region(hose->regions + 1,
+                      CFG_PCI2_MMIO_BASE,
+                      CFG_PCI2_MMIO_PHYS,
+                      CFG_PCI2_MMIO_SIZE,
+                      PCI_REGION_MEM);
+
+       /* PCI IO space */
+       pci_set_region(hose->regions + 2,
+                      CFG_PCI2_IO_BASE,
+                      CFG_PCI2_IO_PHYS,
+                      CFG_PCI2_IO_SIZE,
+                      PCI_REGION_IO);
+
+       /* System memory space */
+       pci_set_region(hose->regions + 3,
+                      CONFIG_PCI_SYS_MEM_BUS,
+                       CONFIG_PCI_SYS_MEM_PHYS,
+                       gd->ram_size,
+                       PCI_REGION_MEM | PCI_REGION_MEMORY);
+
+       hose->region_count = 4;
+
+       pci_setup_indirect(hose,
+                          (CFG_IMMRBAR+0x8380),
+                          (CFG_IMMRBAR+0x8384));
+
+       pci_register_hose(hose);
+
+       /*
+        * Write to Command register
+        */
+       reg16 = 0xff;
+       dev = PCI_BDF(hose->first_busno, 0, 0);
+       pci_hose_read_config_word (hose, dev, PCI_COMMAND, &reg16);
+       reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16);
+
+       /*
+        * Clear non-reserved bits in status register.
+        */
+       pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff);
+       pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80);
+       pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
+
+       /*
+        * Hose scan.
+        */
+       hose->last_busno = pci_hose_scan(hose);
+#endif
+
+}
+#endif /* CONFIG_PCI */
index 8599a49..9562dbe 100644 (file)
@@ -819,7 +819,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
        (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
 
 #else
-       ft_setup(of_flat_tree, OF_FLAT_TREE_MAX_SIZE, kbd);
+       ft_setup(of_flat_tree, OF_FLAT_TREE_MAX_SIZE, kbd, initrd_start, initrd_end);
        /* ft_dump_blob(of_flat_tree); */
 
 #if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
@@ -828,12 +828,16 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
        /*
         * Linux Kernel Parameters:
         *   r3: ptr to OF flat tree, followed by the board info data
-        *   r4: initrd_start or 0 if no initrd
-        *   r5: initrd_end - unused if r4 is 0
-        *   r6: Start of command line string
-        *   r7: End   of command line string
+        *   r4: physical pointer to the kernel itself
+        *   r5: NULL
+        *   r6: NULL
+        *   r7: NULL
         */
-       (*kernel) ((bd_t *)of_flat_tree, initrd_start, initrd_end, cmd_start, cmd_end);
+       if (getenv("disable_of") != NULL)
+               (*kernel) ((bd_t *)of_flat_tree, initrd_start, initrd_end,
+                       cmd_start, cmd_end);
+       else
+               (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
 
 #endif
 }
index 65a274f..9e9c906 100644 (file)
@@ -163,7 +163,7 @@ void ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size)
        ((u64 *) cxt->pres)[0] = cpu_to_be64(physaddr); /* phys = 0, size = 0, terminate */
        ((u64 *) cxt->pres)[1] = cpu_to_be64(size);
 
-       cxt->pres += 18;        /* advance */
+       cxt->pres += 16;        /* advance */
 
        ((u64 *) cxt->pres)[0] = 0;     /* phys = 0, size = 0, terminate */
        ((u64 *) cxt->pres)[1] = 0;
@@ -529,6 +529,7 @@ extern uchar(*env_get_char) (int);
 
 #define BDM(x) {       .name = #x, .offset = offsetof(bd_t, bi_ ##x ) }
 
+#ifdef CONFIG_OF_HAS_BD_T
 static const struct {
        const char *name;
        int offset;
@@ -574,19 +575,24 @@ static const struct {
 #endif
        BDM(baudrate),
 };
+#endif
 
-void ft_setup(void *blob, int size, bd_t * bd)
+void ft_setup(void *blob, int size, bd_t * bd, ulong initrd_start, ulong initrd_end)
 {
-       DECLARE_GLOBAL_DATA_PTR;
-       u8 *end;
        u32 *p;
        int len;
        struct ft_cxt cxt;
-       int i, k, nxt;
-       static char tmpenv[256];
-       char *s, *lval, *rval;
        ulong clock;
-       uint32_t v;
+#if defined(CONFIG_OF_HAS_UBOOT_ENV)
+       int k, nxt;
+#endif
+#if defined(CONFIG_OF_HAS_BD_T)
+       u8 *end;
+#endif
+#if defined(CONFIG_OF_HAS_UBOOT_ENV) || defined(CONFIG_OF_HAS_BD_T)
+       int i;
+       static char tmpenv[256];
+#endif
 
        /* disable OF tree; booting old kernel */
        if (getenv("disable_of") != NULL) {
@@ -596,7 +602,8 @@ void ft_setup(void *blob, int size, bd_t * bd)
 
        ft_begin(&cxt, blob, size);
 
-       /* fs_add_rsvmap not used */
+       if (initrd_start && initrd_end)
+               ft_add_rsvmap(&cxt, initrd_start, initrd_end - initrd_start + 1);
 
        ft_begin_tree(&cxt);
 
@@ -610,9 +617,12 @@ void ft_setup(void *blob, int size, bd_t * bd)
        /* back into root */
        ft_backtrack_node(&cxt);
 
+#ifdef CONFIG_OF_HAS_UBOOT_ENV
        ft_begin_node(&cxt, "u-boot-env");
 
        for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
+               char *s, *lval, *rval;
+
                for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) ;
                s = tmpenv;
                for (k = i; k < nxt && s < &tmpenv[sizeof(tmpenv) - 1]; ++k)
@@ -629,12 +639,20 @@ void ft_setup(void *blob, int size, bd_t * bd)
        }
 
        ft_end_node(&cxt);
+#endif
 
        ft_begin_node(&cxt, "chosen");
 
        ft_prop_str(&cxt, "name", "chosen");
        ft_prop_str(&cxt, "bootargs", getenv("bootargs"));
        ft_prop_int(&cxt, "linux,platform", 0x600);     /* what is this? */
+       if (initrd_start && initrd_end) {
+               ft_prop_int(&cxt, "linux,initrd-start", initrd_start);
+               ft_prop_int(&cxt, "linux,initrd-end", initrd_end);
+       }
+#ifdef OF_STDOUT_PATH
+       ft_prop_str(&cxt, "linux,stdout-path", OF_STDOUT_PATH);
+#endif
 
        ft_end_node(&cxt);
 
@@ -647,14 +665,19 @@ void ft_setup(void *blob, int size, bd_t * bd)
           ft_dump_blob(blob);
         */
 
+#ifdef CONFIG_OF_HAS_BD_T
        /* paste the bd_t at the end of the flat tree */
        end = (char *)blob +
            be32_to_cpu(((struct boot_param_header *)blob)->totalsize);
        memcpy(end, bd, sizeof(*bd));
+#endif
 
 #ifdef CONFIG_PPC
 
+#ifdef CONFIG_OF_HAS_BD_T
        for (i = 0; i < sizeof(bd_map)/sizeof(bd_map[0]); i++) {
+               uint32_t v;
+
                sprintf(tmpenv, "/bd_t/%s", bd_map[i].name);
                v = *(uint32_t *)((char *)bd + bd_map[i].offset);
 
@@ -670,6 +693,7 @@ void ft_setup(void *blob, int size, bd_t * bd)
        p = ft_get_prop(blob, "/bd_t/ethspeed", &len);
        if (p != NULL)
                *p = cpu_to_be32((uint32_t) bd->bi_ethspeed);
+#endif
 
        clock = bd->bi_intfreq;
        p = ft_get_prop(blob, "/cpus/" OF_CPU "/clock-frequency", &len);
@@ -680,11 +704,14 @@ void ft_setup(void *blob, int size, bd_t * bd)
        clock = OF_TBCLK;
        p = ft_get_prop(blob, "/cpus/" OF_CPU "/timebase-frequency", &len);
        if (p != NULL)
-               *p = cpu_to_be32(OF_TBCLK);
+               *p = cpu_to_be32(clock);
 #endif
-
 #endif                         /* __powerpc__ */
 
+#ifdef CONFIG_OF_BOARD_SETUP
+       ft_board_setup(blob, bd);
+#endif
+
        /*
           printf("final OF-tree\n");
           ft_dump_blob(blob);
index 8c9b515..e49e4fe 100644 (file)
@@ -35,6 +35,7 @@
 #include <watchdog.h>
 #include <command.h>
 #include <mpc83xx.h>
+#include <ft_build.h>
 #include <asm/processor.h>
 
 
@@ -151,3 +152,40 @@ void watchdog_reset (void)
        hang();         /* FIXME: implement watchdog_reset()? */
 }
 #endif /* CONFIG_WATCHDOG */
+
+#if defined(CONFIG_OF_FLAT_TREE)
+void
+ft_cpu_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       int len;
+       ulong clock;
+
+       clock = bd->bi_busfreq;
+       p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/bus-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/serial@4500/clock-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/serial@4600/clock-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+#ifdef CONFIG_MPC83XX_TSEC1
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/address", &len);
+               memcpy(p, bd->bi_enetaddr, 6);
+#endif
+
+#ifdef CONFIG_MPC83XX_TSEC2
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/address", &len);
+               memcpy(p, bd->bi_enet1addr, 6);
+#endif
+}
+#endif
index dcb3445..acf6862 100644 (file)
@@ -63,8 +63,12 @@ void cpu_init_f (volatile immap_t * im)
        im->sysconf.spcr |= SPCR_TBEN;
 
        /* System General Purpose Register */
-       im->sysconf.sicrh = SICRH_TSOBI1;
-       im->sysconf.sicrl = SICRL_LDP_A;
+#ifdef CFG_SICRH
+       im->sysconf.sicrh = CFG_SICRH;
+#endif
+#ifdef CFG_SICRL
+       im->sysconf.sicrl = CFG_SICRL;
+#endif
 
        /*
         * Memory Controller:
@@ -87,69 +91,70 @@ void cpu_init_f (volatile immap_t * im)
 #error         CFG_BR0_PRELIM, CFG_OR0_PRELIM, CFG_LBLAWBAR0_PRELIM & CFG_LBLAWAR0_PRELIM must be defined
 #endif
 
-#if defined(CFG_BR1_PRELIM)  \
-       && defined(CFG_OR1_PRELIM) \
-       && defined(CFG_LBLAWBAR1_PRELIM) \
-       && defined(CFG_LBLAWAR1_PRELIM)
+#if defined(CFG_BR1_PRELIM) && defined(CFG_OR1_PRELIM)
        im->lbus.bank[1].br = CFG_BR1_PRELIM;
        im->lbus.bank[1].or = CFG_OR1_PRELIM;
+#endif
+#if defined(CFG_LBLAWBAR1_PRELIM) && defined(CFG_LBLAWAR1_PRELIM)
        im->sysconf.lblaw[1].bar = CFG_LBLAWBAR1_PRELIM;
        im->sysconf.lblaw[1].ar = CFG_LBLAWAR1_PRELIM;
 #endif
-#if defined(CFG_BR2_PRELIM)  \
-       && defined(CFG_OR2_PRELIM) \
-       && defined(CFG_LBLAWBAR2_PRELIM) \
-       && defined(CFG_LBLAWAR2_PRELIM)
+#if defined(CFG_BR2_PRELIM) && defined(CFG_OR2_PRELIM)
        im->lbus.bank[2].br = CFG_BR2_PRELIM;
        im->lbus.bank[2].or = CFG_OR2_PRELIM;
+#endif
+#if defined(CFG_LBLAWBAR2_PRELIM) && defined(CFG_LBLAWAR2_PRELIM)
        im->sysconf.lblaw[2].bar = CFG_LBLAWBAR2_PRELIM;
        im->sysconf.lblaw[2].ar = CFG_LBLAWAR2_PRELIM;
 #endif
-#if defined(CFG_BR3_PRELIM)  \
-       && defined(CFG_OR3_PRELIM) \
-       && defined(CFG_LBLAWBAR3_PRELIM) \
-       && defined(CFG_LBLAWAR3_PRELIM)
+#if defined(CFG_BR3_PRELIM) && defined(CFG_OR3_PRELIM)
        im->lbus.bank[3].br = CFG_BR3_PRELIM;
        im->lbus.bank[3].or = CFG_OR3_PRELIM;
+#endif
+#if defined(CFG_LBLAWBAR3_PRELIM) && defined(CFG_LBLAWAR3_PRELIM)
        im->sysconf.lblaw[3].bar = CFG_LBLAWBAR3_PRELIM;
        im->sysconf.lblaw[3].ar = CFG_LBLAWAR3_PRELIM;
 #endif
-#if defined(CFG_BR4_PRELIM)  \
-       && defined(CFG_OR4_PRELIM) \
-       && defined(CFG_LBLAWBAR4_PRELIM) \
-       && defined(CFG_LBLAWAR4_PRELIM)
+#if defined(CFG_BR4_PRELIM) && defined(CFG_OR4_PRELIM)
        im->lbus.bank[4].br = CFG_BR4_PRELIM;
        im->lbus.bank[4].or = CFG_OR4_PRELIM;
+#endif
+#if defined(CFG_LBLAWBAR4_PRELIM) && defined(CFG_LBLAWAR4_PRELIM)
        im->sysconf.lblaw[4].bar = CFG_LBLAWBAR4_PRELIM;
        im->sysconf.lblaw[4].ar = CFG_LBLAWAR4_PRELIM;
 #endif
-#if defined(CFG_BR5_PRELIM)  \
-       && defined(CFG_OR5_PRELIM) \
-       && defined(CFG_LBLAWBAR5_PRELIM) \
-       && defined(CFG_LBLAWAR5_PRELIM)
+#if defined(CFG_BR5_PRELIM) && defined(CFG_OR5_PRELIM)
        im->lbus.bank[5].br = CFG_BR5_PRELIM;
        im->lbus.bank[5].or = CFG_OR5_PRELIM;
+#endif
+#if defined(CFG_LBLAWBAR5_PRELIM) && defined(CFG_LBLAWAR5_PRELIM)
        im->sysconf.lblaw[5].bar = CFG_LBLAWBAR5_PRELIM;
        im->sysconf.lblaw[5].ar = CFG_LBLAWAR5_PRELIM;
 #endif
-#if defined(CFG_BR6_PRELIM)  \
-       && defined(CFG_OR6_PRELIM) \
-       && defined(CFG_LBLAWBAR6_PRELIM) \
-       && defined(CFG_LBLAWAR6_PRELIM)
+#if defined(CFG_BR6_PRELIM) && defined(CFG_OR6_PRELIM)
        im->lbus.bank[6].br = CFG_BR6_PRELIM;
        im->lbus.bank[6].or = CFG_OR6_PRELIM;
+#endif
+#if defined(CFG_LBLAWBAR6_PRELIM) && defined(CFG_LBLAWAR6_PRELIM)
        im->sysconf.lblaw[6].bar = CFG_LBLAWBAR6_PRELIM;
        im->sysconf.lblaw[6].ar = CFG_LBLAWAR6_PRELIM;
 #endif
-#if defined(CFG_BR7_PRELIM)  \
-       && defined(CFG_OR7_PRELIM) \
-       && defined(CFG_LBLAWBAR7_PRELIM) \
-       && defined(CFG_LBLAWAR7_PRELIM)
+#if defined(CFG_BR7_PRELIM) && defined(CFG_OR7_PRELIM)
        im->lbus.bank[7].br = CFG_BR7_PRELIM;
        im->lbus.bank[7].or = CFG_OR7_PRELIM;
+#endif
+#if defined(CFG_LBLAWBAR7_PRELIM) && defined(CFG_LBLAWAR7_PRELIM)
        im->sysconf.lblaw[7].bar = CFG_LBLAWBAR7_PRELIM;
        im->sysconf.lblaw[7].ar = CFG_LBLAWAR7_PRELIM;
 #endif
+#ifdef CFG_GPIO1_PRELIM
+       im->pgio[0].dir = CFG_GPIO1_DIR;
+       im->pgio[0].dat = CFG_GPIO1_DAT;
+#endif
+#ifdef CFG_GPIO2_PRELIM
+       im->pgio[1].dir = CFG_GPIO2_DIR;
+       im->pgio[1].dat = CFG_GPIO2_DAT;
+#endif
 }
 
 
index 53474f6..dfd51c1 100644 (file)
@@ -43,6 +43,16 @@ struct irq_action {
 
 int interrupt_init_cpu (unsigned *decrementer_count)
 {
+       DECLARE_GLOBAL_DATA_PTR;
+
+       volatile immap_t *immr = (immap_t *) CFG_IMMRBAR;
+
+       *decrementer_count = (gd->bus_clk / 4) / CFG_HZ;
+
+       /* Enable e300 time base */
+
+       immr->sysconf.spcr |= 0x00400000;
+
        return 0;
 }
 
index fb001a6..46c748f 100644 (file)
@@ -179,10 +179,47 @@ in_flash:
 #endif
 #endif /* CFG_RAMBOOT */
 
-       bl setup_stack_in_data_cache_on_r1
+       /* setup the bats */
+       bl      setup_bats
+       sync
+
+       /*
+        * Cache must be enabled here for stack-in-cache trick.
+        * This means we need to enable the BATS.
+        * This means:
+        *   1) for the EVB, original gt regs need to be mapped
+        *   2) need to have an IBAT for the 0xf region,
+        *      we are running there!
+        * Cache should be turned on after BATs, since by default
+        * everything is write-through.
+        * The init-mem BAT can be reused after reloc. The old
+        * gt-regs BAT can be reused after board_init_f calls
+        * board_early_init_f (EVB only).
+        */
+       /* enable address translation */
+       bl      enable_addr_trans
+       sync
+
+       /* enable and invalidate the data cache */
+       bl      dcache_enable
+       sync
+#ifdef CFG_INIT_RAM_LOCK
+       bl      lock_ram_in_cache
+       sync
+#endif
+
+       /* set up the stack pointer in our newly created
+        * cache-ram (r1) */
+       lis     r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h
+       ori     r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l
+
+       li      r0, 0           /* Make room for stack frame header and */
+       stwu    r0, -4(r1)      /* clear final stack frame so that      */
+       stwu    r0, -4(r1)      /* stack backtraces terminate cleanly   */
+
 
        /* let the C-code set up the rest                           */
-       /*                                                                                  */
+       /*                                                          */
        /* Be careful to keep code relocatable & stack humble   */
        /*------------------------------------------------------*/
 
@@ -426,8 +463,14 @@ init_e300_core: /* time t 10 */
 #else
        /* Disable Wathcdog  */
        /*-------------------*/
+       lwz r4, SWCRR(r3)
+       /* Check to see if its enabled for disabling
+          once disabled by SW you can't re-enable */
+       andi. r4, r4, 0x4
+       beq 1f
        xor r4, r4, r4
        stw r4, SWCRR(r3)
+1:
 #endif /* CONFIG_WATCHDOG */
 
        /* Initialize the Hardware Implementation-dependent Registers */
@@ -503,6 +546,221 @@ init_e300_core: /* time t 10 */
        /*------------------------------*/
        blr
 
+       .globl  invalidate_bats
+invalidate_bats:
+       /* invalidate BATs */
+       mtspr   IBAT0U, r0
+       mtspr   IBAT1U, r0
+       mtspr   IBAT2U, r0
+       mtspr   IBAT3U, r0
+#if (CFG_HID2 & HID2_HBE)
+       mtspr   IBAT4U, r0
+       mtspr   IBAT5U, r0
+       mtspr   IBAT6U, r0
+       mtspr   IBAT7U, r0
+#endif
+       isync
+       mtspr   DBAT0U, r0
+       mtspr   DBAT1U, r0
+       mtspr   DBAT2U, r0
+       mtspr   DBAT3U, r0
+#if (CFG_HID2 & HID2_HBE)
+       mtspr   DBAT4U, r0
+       mtspr   DBAT5U, r0
+       mtspr   DBAT6U, r0
+       mtspr   DBAT7U, r0
+#endif
+       isync
+       sync
+       blr
+
+       /* setup_bats - set them up to some initial state */
+       .globl  setup_bats
+setup_bats:
+       addis   r0, r0, 0x0000
+
+       /* IBAT 0 */
+       addis   r4, r0, CFG_IBAT0L@h
+       ori     r4, r4, CFG_IBAT0L@l
+       addis   r3, r0, CFG_IBAT0U@h
+       ori     r3, r3, CFG_IBAT0U@l
+       mtspr   IBAT0L, r4
+       mtspr   IBAT0U, r3
+       isync
+
+       /* DBAT 0 */
+       addis   r4, r0, CFG_DBAT0L@h
+       ori     r4, r4, CFG_DBAT0L@l
+       addis   r3, r0, CFG_DBAT0U@h
+       ori     r3, r3, CFG_DBAT0U@l
+       mtspr   DBAT0L, r4
+       mtspr   DBAT0U, r3
+       isync
+
+       /* IBAT 1 */
+       addis   r4, r0, CFG_IBAT1L@h
+       ori     r4, r4, CFG_IBAT1L@l
+       addis   r3, r0, CFG_IBAT1U@h
+       ori     r3, r3, CFG_IBAT1U@l
+       mtspr   IBAT1L, r4
+       mtspr   IBAT1U, r3
+       isync
+
+       /* DBAT 1 */
+       addis   r4, r0, CFG_DBAT1L@h
+       ori     r4, r4, CFG_DBAT1L@l
+       addis   r3, r0, CFG_DBAT1U@h
+       ori     r3, r3, CFG_DBAT1U@l
+       mtspr   DBAT1L, r4
+       mtspr   DBAT1U, r3
+       isync
+
+       /* IBAT 2 */
+       addis   r4, r0, CFG_IBAT2L@h
+       ori     r4, r4, CFG_IBAT2L@l
+       addis   r3, r0, CFG_IBAT2U@h
+       ori     r3, r3, CFG_IBAT2U@l
+       mtspr   IBAT2L, r4
+       mtspr   IBAT2U, r3
+       isync
+
+       /* DBAT 2 */
+       addis   r4, r0, CFG_DBAT2L@h
+       ori     r4, r4, CFG_DBAT2L@l
+       addis   r3, r0, CFG_DBAT2U@h
+       ori     r3, r3, CFG_DBAT2U@l
+       mtspr   DBAT2L, r4
+       mtspr   DBAT2U, r3
+       isync
+
+       /* IBAT 3 */
+       addis   r4, r0, CFG_IBAT3L@h
+       ori     r4, r4, CFG_IBAT3L@l
+       addis   r3, r0, CFG_IBAT3U@h
+       ori     r3, r3, CFG_IBAT3U@l
+       mtspr   IBAT3L, r4
+       mtspr   IBAT3U, r3
+       isync
+
+       /* DBAT 3 */
+       addis   r4, r0, CFG_DBAT3L@h
+       ori     r4, r4, CFG_DBAT3L@l
+       addis   r3, r0, CFG_DBAT3U@h
+       ori     r3, r3, CFG_DBAT3U@l
+       mtspr   DBAT3L, r4
+       mtspr   DBAT3U, r3
+       isync
+
+#if (CFG_HID2 & HID2_HBE)
+       /* IBAT 4 */
+       addis   r4, r0, CFG_IBAT4L@h
+       ori     r4, r4, CFG_IBAT4L@l
+       addis   r3, r0, CFG_IBAT4U@h
+       ori     r3, r3, CFG_IBAT4U@l
+       mtspr   IBAT4L, r4
+       mtspr   IBAT4U, r3
+       isync
+
+       /* DBAT 4 */
+       addis   r4, r0, CFG_DBAT4L@h
+       ori     r4, r4, CFG_DBAT4L@l
+       addis   r3, r0, CFG_DBAT4U@h
+       ori     r3, r3, CFG_DBAT4U@l
+       mtspr   DBAT4L, r4
+       mtspr   DBAT4U, r3
+       isync
+
+       /* IBAT 5 */
+       addis   r4, r0, CFG_IBAT5L@h
+       ori     r4, r4, CFG_IBAT5L@l
+       addis   r3, r0, CFG_IBAT5U@h
+       ori     r3, r3, CFG_IBAT5U@l
+       mtspr   IBAT5L, r4
+       mtspr   IBAT5U, r3
+       isync
+
+       /* DBAT 5 */
+       addis   r4, r0, CFG_DBAT5L@h
+       ori     r4, r4, CFG_DBAT5L@l
+       addis   r3, r0, CFG_DBAT5U@h
+       ori     r3, r3, CFG_DBAT5U@l
+       mtspr   DBAT5L, r4
+       mtspr   DBAT5U, r3
+       isync
+
+       /* IBAT 6 */
+       addis   r4, r0, CFG_IBAT6L@h
+       ori     r4, r4, CFG_IBAT6L@l
+       addis   r3, r0, CFG_IBAT6U@h
+       ori     r3, r3, CFG_IBAT6U@l
+       mtspr   IBAT6L, r4
+       mtspr   IBAT6U, r3
+       isync
+
+       /* DBAT 6 */
+       addis   r4, r0, CFG_DBAT6L@h
+       ori     r4, r4, CFG_DBAT6L@l
+       addis   r3, r0, CFG_DBAT6U@h
+       ori     r3, r3, CFG_DBAT6U@l
+       mtspr   DBAT6L, r4
+       mtspr   DBAT6U, r3
+       isync
+
+       /* IBAT 7 */
+       addis   r4, r0, CFG_IBAT7L@h
+       ori     r4, r4, CFG_IBAT7L@l
+       addis   r3, r0, CFG_IBAT7U@h
+       ori     r3, r3, CFG_IBAT7U@l
+       mtspr   IBAT7L, r4
+       mtspr   IBAT7U, r3
+       isync
+
+       /* DBAT 7 */
+       addis   r4, r0, CFG_DBAT7L@h
+       ori     r4, r4, CFG_DBAT7L@l
+       addis   r3, r0, CFG_DBAT7U@h
+       ori     r3, r3, CFG_DBAT7U@l
+       mtspr   DBAT7L, r4
+       mtspr   DBAT7U, r3
+       isync
+#endif
+
+       /* Invalidate TLBs.
+        * -> for (val = 0; val < 0x20000; val+=0x1000)
+        * ->   tlbie(val);
+        */
+       lis     r3, 0
+       lis     r5, 2
+
+1:
+       tlbie   r3
+       addi    r3, r3, 0x1000
+       cmp     0, 0, r3, r5
+       blt     1b
+
+       blr
+
+       .globl enable_addr_trans
+enable_addr_trans:
+       /* enable address translation */
+       mfmsr   r5
+       ori     r5, r5, (MSR_IR | MSR_DR)
+       mtmsr   r5
+       isync
+       blr
+
+       .globl disable_addr_trans
+disable_addr_trans:
+       /* disable address translation */
+       mflr    r4
+       mfmsr   r3
+       andi.   r0, r3, (MSR_IR | MSR_DR)
+       beqlr
+       andc    r3, r3, r0
+       mtspr   SRR0, r4
+       mtspr   SRR1, r3
+       rfi
+
 /* Cache functions.
  *
  * Note: requires that all cache bits in
@@ -544,26 +802,25 @@ icache_status:
        .globl  dcache_enable
 dcache_enable:
        mfspr   r3, HID0
-       ori     r3, r3, HID0_ENABLE_DATA_CACHE
-       lis     r4, 0
-       ori     r4, r4, HID0_LOCK_DATA_CACHE
-       andc    r3, r3, r4
-       ori     r4, r3, HID0_LOCK_INSTRUCTION_CACHE
+       li      r5, HID0_DCFI|HID0_DLOCK
+       andc    r3, r3, r5
+       mtspr   HID0, r3                /* no invalidate, unlock */
+       ori     r3, r3, HID0_DCE
+       ori     r5, r3, HID0_DCFI
+       mtspr   HID0, r5                /* enable + invalidate */
+       mtspr   HID0, r3                /* enable */
        sync
-       mtspr   HID0, r4    /* sets enable and invalidate, clears lock */
-       sync
-       mtspr   HID0, r3        /* clears invalidate */
        blr
 
        .globl  dcache_disable
 dcache_disable:
        mfspr   r3, HID0
        lis     r4, 0
-       ori     r4, r4, HID0_ENABLE_DATA_CACHE|HID0_LOCK_DATA_CACHE
+       ori     r4, r4, HID0_DCE|HID0_DLOCK
        andc    r3, r3, r4
-       ori     r4, r3, HID0_INVALIDATE_DATA_CACHE
+       ori     r4, r3, HID0_DCI
        sync
-       mtspr   HID0, r4    /* sets invalidate, clears enable and lock */
+       mtspr   HID0, r4        /* sets invalidate, clears enable and lock */
        sync
        mtspr   HID0, r3        /* clears invalidate */
        blr
@@ -668,46 +925,29 @@ relocate_code:
  * Now flush the cache: note that we must start from a cache aligned
  * address. Otherwise we might miss one cache line.
  */
-4:
-       bl un_setup_stack_in_data_cache
-       mr r7, r3
-       mr r8, r4
-       bl dcache_disable
-       mr r3, r7
-       mr r4, r8
-
-       cmpwi   r6,0
+4:     cmpwi   r6,0
        add     r5,r3,r5
-       beq     7f      /* Always flush prefetch queue in any case */
+       beq     7f              /* Always flush prefetch queue in any case */
        subi    r0,r6,1
        andc    r3,r3,r0
-       mfspr   r7,HID0         /* don't do dcbst if dcache is disabled*/
-       rlwinm  r7,r7,HID0_DCE_SHIFT,31,31
-       cmpwi   r7,0
-       beq     9f
        mr      r4,r3
 5:     dcbst   0,r4
        add     r4,r4,r6
        cmplw   r4,r5
        blt     5b
-       sync            /* Wait for all dcbst to complete on bus */
-9:     mfspr   r7,HID0         /* don't do icbi if icache is disabled */
-       rlwinm  r7,r7,HID0_DCE_SHIFT,31,31
-       cmpwi   r7,0
-       beq     7f
+       sync                    /* Wait for all dcbst to complete on bus */
        mr      r4,r3
 6:     icbi    0,r4
        add     r4,r4,r6
        cmplw   r4,r5
        blt     6b
-7:     sync            /* Wait for all icbi to complete on bus */
+7:     sync                    /* Wait for all icbi to complete on bus */
        isync
 
 /*
  * We are done. Do not return, instead branch to second part of board
  * initialization, now running from RAM.
  */
-
        addi    r0, r10, in_ram - _start + EXC_OFF_SYS_RESET
        mtlr    r0
        blr
@@ -865,6 +1105,27 @@ trap_reloc:
        blr
 
 #ifdef CFG_INIT_RAM_LOCK
+lock_ram_in_cache:
+       /* Allocate Initial RAM in data cache.
+        */
+       lis     r3, (CFG_INIT_RAM_ADDR & ~31)@h
+       ori     r3, r3, (CFG_INIT_RAM_ADDR & ~31)@l
+       li      r2, ((CFG_INIT_RAM_END & ~31) + \
+                    (CFG_INIT_RAM_ADDR & 31) + 31) / 32
+       mtctr   r2
+1:
+       dcbz    r0, r3
+       addi    r3, r3, 32
+       bdnz    1b
+
+       /* Lock the data cache */
+       mfspr   r0, HID0
+       ori     r0, r0, 0x1000
+       sync
+       mtspr   HID0, r0
+       sync
+       blr
+
 .globl unlock_ram_in_cache
 unlock_ram_in_cache:
        /* invalidate the INIT_RAM section */
@@ -878,6 +1139,15 @@ unlock_ram_in_cache:
        bdnz    1b
        sync                    /* Wait for all icbi to complete on bus */
        isync
+
+       /* Unlock the data cache and invalidate it */
+       mfspr   r3, HID0
+       li      r5, HID0_DLOCK|HID0_DCFI
+       andc    r3, r3, r5              /* no invalidate, unlock */
+       ori     r5, r3, HID0_DCFI       /* invalidate, unlock */
+       mtspr   HID0, r5                /* invalidate, unlock */
+       mtspr   HID0, r3                /* no invalidate, unlock */
+       sync
        blr
 #endif
 
@@ -946,148 +1216,3 @@ remap_flash_by_law0:
        stw r4, LBLAWBAR1(r3)
        stw r4, LBLAWAR1(r3) /* Off LBIU LAW1 */
        blr
-
-setup_stack_in_data_cache_on_r1:
-       lis r3, (CFG_IMMRBAR)@h
-
-       /* setup D-BAT for the D-Cache (with out real memory backup) */
-
-       lis r4, (CFG_INIT_RAM_ADDR & 0xFFFE0000)@h
-       mtspr   DBAT0U, r4
-       ori r4, r4, 0x0002
-       mtspr   DBAT0L, r4
-       isync
-
-#if 0
-       /* Enable MMU */
-       mfmsr r4
-       ori r4, r4, (MSR_DR | MSR_IR)@l
-       mtmsr r4
-#endif
-
-       /* Enable and invalidate data cache. */
-       mfspr   r4, HID0
-       mr      r5, r4
-       ori     r4, r4, HID0_DCE | HID0_DCI
-       ori     r5, r5, HID0_DCE
-       sync
-       mtspr   HID0, r4
-       mtspr   HID0, r5
-       sync
-
-       /* Allocate Initial RAM in data cache.*/
-       li  r0, 0
-       lis     r4, (CFG_INIT_RAM_ADDR)@h
-       ori     r4, r4, (CFG_INIT_RAM_ADDR)@l
-       li      r5, 128*8 /* 128*8*32=32Kb */
-       mtctr   r5
-1:
-       dcbz    r0, r4
-       addi    r4, r4, 32
-       bdnz    1b
-       isync
-
-       /* Lock all the D-cache, basically leaving the reset of the program without dcache */
-       mfspr   r4, HID0
-       ori     r4, r4, (HID0_DLOCK)@l
-       sync
-       mtspr   HID0 , r4
-
-       /* setup the stack pointer in r1 */
-       lis     r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h
-       ori     r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l
-       li      r0, 0                   /* Make room for stack frame header and */
-
-       stwu    r0, -4(r1)              /* clear final stack frame so that      */
-       stwu    r0, -4(r1)              /* stack backtraces terminate cleanly   */
-
-       blr
-
-un_setup_stack_in_data_cache:
-       blr
-       mr r14, r4
-       mr r15, r5
-
-
-       lis r4, (CFG_INIT_RAM_ADDR & 0xFFFE0000)@h
-       mtspr   DBAT0U, r4
-       ori r4, r4, 0x0002
-       mtspr   DBAT0L, r4
-       isync
-
-       /* un lock all the D-cache */
-       mfspr   r4, HID0
-       lis r5, (~(HID0_DLOCK))@h
-       ori     r5, r5, (~(HID0_DLOCK))@l
-       and r4, r4, r5
-       sync
-       mtspr   HID0 , r4
-
-       /* Re - Allocate Initial RAM in data cache.*/
-       li  r0, 0
-       lis     r4, (CFG_INIT_RAM_ADDR)@h
-       ori     r4, r4, (CFG_INIT_RAM_ADDR)@l
-       li      r5, 128*8 /* 128*8*32=32Kb */
-       mtctr   r5
-1:
-       dcbz    r0, r4
-       addi    r4, r4, 32
-       bdnz    1b
-       isync
-
-       mflr r16
-       bl dcache_disable
-       mtlr r16
-
-       blr
-
-#if 0
-#define GREEN_LIGHT 0x2B0D4046
-#define RED_LIGHT   0x250D4046
-#define LIB_CNT     0x4FFF
-
-/*
- * Lib Light
- */
-
-       .globl liblight
-liblight:
-       lis     r3, CFG_IMMRBAR@h
-       ori     r3, r3, CFG_IMMRBAR@l
-       li r4, 0x3002
-       mtmsr r4
-       xor r4, r4, r4
-       mtspr   HID0, r4
-       mtspr   HID2, r4
-       lis r4, 0xF8000000@h
-       ori r4, r4, 0xF8000000@l
-       stw r4, LBLAWBAR1(r3)
-       lis r4, 0x8000000E@h
-       ori r4, r4, 0x8000000E@l
-       stw r4, LBLAWAR1(r3)
-       lis r4, 0xF8000801@h
-       ori r4, r4, 0xF8000801@l
-       stw r4, BR1(r3)
-       lis r4, 0xFFFFE8f0@h
-       ori r4, r4, 0xFFFFE8f0@l
-       stw r4, OR1(r3)
-
-       lis r4, 0xF8000000@h
-       ori r4, r4, 0xF8000000@l
-       lis r5, GREEN_LIGHT@h
-       ori r5, r5, GREEN_LIGHT@l
-       lis r6, RED_LIGHT@h
-       ori r6, r6, RED_LIGHT@l
-       lis r7, LIB_CNT@h
-       ori r7, r7, LIB_CNT@l
-
-1:
-       stw r5, 0(r4)
-       mtctr r7
-2:     bdnz 2b
-       stw r6, 0(r4)
-       mtctr r7
-3:     bdnz 3b
-       b 1b
-
-#endif
index 5360030..3c24b99 100644 (file)
@@ -459,6 +459,7 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus)
                                              PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
                        if (cfg) {
                                cfg->config_device(hose, dev, cfg);
+                               sub_bus = max(sub_bus, hose->current_busno);
 #ifdef CONFIG_PCI_PNP
                        } else {
                                int n = pciauto_config_device(hose, dev);
index 3302457..15f7432 100644 (file)
@@ -77,6 +77,7 @@ int pciauto_region_allocate(struct pci_region* res, unsigned int size, unsigned
 void pciauto_setup_device(struct pci_controller *hose,
                          pci_dev_t dev, int bars_num,
                          struct pci_region *mem,
+                         struct pci_region *prefetch,
                          struct pci_region *io)
 {
        unsigned int bar_value, bar_response, bar_size;
@@ -111,7 +112,10 @@ void pciauto_setup_device(struct pci_controller *hose,
                                found_mem64 = 1;
 
                        bar_size = ~(bar_response & PCI_BASE_ADDRESS_MEM_MASK) + 1;
-                       bar_res = mem;
+                       if (prefetch && (bar_response & PCI_BASE_ADDRESS_MEM_PREFETCH))
+                               bar_res = prefetch;
+                       else
+                               bar_res = mem;
 
                        DEBUGF("PCI Autoconfig: BAR %d, Mem, size=0x%x, ", bar_nr, bar_size);
                }
@@ -148,6 +152,7 @@ static void pciauto_prescan_setup_bridge(struct pci_controller *hose,
                                         pci_dev_t dev, int sub_bus)
 {
        struct pci_region *pci_mem = hose->pci_mem;
+       struct pci_region *pci_prefetch = hose->pci_prefetch;
        struct pci_region *pci_io = hose->pci_io;
        unsigned int cmdstat;
 
@@ -169,6 +174,21 @@ static void pciauto_prescan_setup_bridge(struct pci_controller *hose,
                cmdstat |= PCI_COMMAND_MEMORY;
        }
 
+       if (pci_prefetch) {
+               /* Round memory allocator to 1MB boundary */
+               pciauto_region_align(pci_prefetch, 0x100000);
+
+               /* Set up memory and I/O filter limits, assume 32-bit I/O space */
+               pci_hose_write_config_word(hose, dev, PCI_PREF_MEMORY_BASE,
+                                       (pci_prefetch->bus_lower & 0xfff00000) >> 16);
+
+               cmdstat |= PCI_COMMAND_MEMORY;
+       } else {
+               /* We don't support prefetchable memory for now, so disable */
+               pci_hose_write_config_word(hose, dev, PCI_PREF_MEMORY_BASE, 0x1000);
+               pci_hose_write_config_word(hose, dev, PCI_PREF_MEMORY_LIMIT, 0x1000);
+       }
+
        if (pci_io) {
                /* Round I/O allocator to 4KB boundary */
                pciauto_region_align(pci_io, 0x1000);
@@ -181,10 +201,6 @@ static void pciauto_prescan_setup_bridge(struct pci_controller *hose,
                cmdstat |= PCI_COMMAND_IO;
        }
 
-       /* We don't support prefetchable memory for now, so disable */
-       pci_hose_write_config_word(hose, dev, PCI_PREF_MEMORY_BASE, 0x1000);
-       pci_hose_write_config_word(hose, dev, PCI_PREF_MEMORY_LIMIT, 0x1000);
-
        /* Enable memory and I/O accesses, enable bus master */
        pci_hose_write_config_dword(hose, dev, PCI_COMMAND, cmdstat | PCI_COMMAND_MASTER);
 }
@@ -193,6 +209,7 @@ static void pciauto_postscan_setup_bridge(struct pci_controller *hose,
                                          pci_dev_t dev, int sub_bus)
 {
        struct pci_region *pci_mem = hose->pci_mem;
+       struct pci_region *pci_prefetch = hose->pci_prefetch;
        struct pci_region *pci_io = hose->pci_io;
 
        /* Configure bus number registers */
@@ -206,6 +223,14 @@ static void pciauto_postscan_setup_bridge(struct pci_controller *hose,
                                        (pci_mem->bus_lower-1) >> 16);
        }
 
+       if (pci_prefetch) {
+               /* Round memory allocator to 1MB boundary */
+               pciauto_region_align(pci_prefetch, 0x100000);
+
+               pci_hose_write_config_word(hose, dev, PCI_PREF_MEMORY_LIMIT,
+                                       (pci_prefetch->bus_lower-1) >> 16);
+       }
+
        if (pci_io) {
                /* Round I/O allocator to 4KB boundary */
                pciauto_region_align(pci_io, 0x1000);
@@ -239,6 +264,11 @@ void pciauto_config_init(struct pci_controller *hose)
                            hose->pci_mem->size < hose->regions[i].size)
                                hose->pci_mem = hose->regions + i;
                        break;
+               case (PCI_REGION_MEM | PCI_REGION_PREFETCH):
+                       if (!hose->pci_prefetch ||
+                           hose->pci_prefetch->size < hose->regions[i].size)
+                               hose->pci_prefetch = hose->regions + i;
+                       break;
                }
        }
 
@@ -251,6 +281,14 @@ void pciauto_config_init(struct pci_controller *hose)
                    hose->pci_mem->bus_start + hose->pci_mem->size - 1);
        }
 
+       if (hose->pci_prefetch) {
+               pciauto_region_init(hose->pci_prefetch);
+
+               DEBUGF("PCI Autoconfig: Prefetchable Memory region: [%lx-%lx]\n",
+                   hose->pci_prefetch->bus_start,
+                   hose->pci_prefetch->bus_start + hose->pci_prefetch->size - 1);
+       }
+
        if (hose->pci_io) {
                pciauto_region_init(hose->pci_io);
 
@@ -275,7 +313,7 @@ int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev)
        switch(class) {
        case PCI_CLASS_BRIDGE_PCI:
                hose->current_busno++;
-               pciauto_setup_device(hose, dev, 2, hose->pci_mem, hose->pci_io);
+               pciauto_setup_device(hose, dev, 2, hose->pci_mem, hose->pci_prefetch, hose->pci_io);
 
                DEBUGF("PCI Autoconfig: Found P2P bridge, device %d\n", PCI_DEV(dev));
 
@@ -301,12 +339,12 @@ int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev)
                        return sub_bus;
                }
 
-               pciauto_setup_device(hose, dev, 6, hose->pci_mem, hose->pci_io);
+               pciauto_setup_device(hose, dev, 6, hose->pci_mem, hose->pci_prefetch, hose->pci_io);
                break;
 
        case PCI_CLASS_BRIDGE_CARDBUS:
                /* just do a minimal setup of the bridge, let the OS take care of the rest */
-               pciauto_setup_device(hose, dev, 0, hose->pci_mem, hose->pci_io);
+               pciauto_setup_device(hose, dev, 0, hose->pci_mem, hose->pci_prefetch, hose->pci_io);
 
                DEBUGF("PCI Autoconfig: Found P2CardBus bridge, device %d\n", PCI_DEV(dev));
 
@@ -328,11 +366,11 @@ int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev)
                 * the PIMMR window to be allocated (BAR0 - 1MB size)
                 */
                DEBUGF("PCI Autoconfig: Broken bridge found, only minimal config\n");
-               pciauto_setup_device(hose, dev, 0, hose->pci_mem, hose->pci_io);
+               pciauto_setup_device(hose, dev, 0, hose->pci_mem, hose->pci_prefetch, hose->pci_io);
                break;
 #endif
        default:
-               pciauto_setup_device(hose, dev, 6, hose->pci_mem, hose->pci_io);
+               pciauto_setup_device(hose, dev, 6, hose->pci_mem, hose->pci_prefetch, hose->pci_io);
                break;
        }
 
index e8f19f5..f0c4a1c 100644 (file)
@@ -36,6 +36,10 @@ static int                                                            \
 indirect_##rw##_config_##size(struct pci_controller *hose,              \
                              pci_dev_t dev, int offset, type val)       \
 {                                                                       \
+       u32 b, d,f;                                                      \
+       b = PCI_BUS(dev); d = PCI_DEV(dev); f = PCI_FUNC(dev);           \
+       b = b - hose->first_busno;                                       \
+       dev = PCI_BDF(b, d, f);                                          \
        out_le32(hose->cfg_addr, dev | (offset & 0xfc) | 0x80000000);    \
        sync();                                                          \
        cfg_##rw(val, hose->cfg_data + (offset & mask), type, op);       \
@@ -47,6 +51,10 @@ static int                                                               \
 indirect_##rw##_config_##size(struct pci_controller *hose,               \
                              pci_dev_t dev, int offset, type val)       \
 {                                                                        \
+       u32 b, d,f;                                                      \
+       b = PCI_BUS(dev); d = PCI_DEV(dev); f = PCI_FUNC(dev);           \
+       b = b - hose->first_busno;                                       \
+       dev = PCI_BDF(b, d, f);                                          \
        *(hose->cfg_addr) = dev | (offset & 0xfc) | 0x80000000;          \
        sync();                                                          \
        cfg_##rw(val, hose->cfg_data + (offset & mask), type, op);       \
@@ -58,6 +66,10 @@ static int                                                            \
 indirect_##rw##_config_##size(struct pci_controller *hose,              \
                              pci_dev_t dev, int offset, type val)       \
 {                                                                       \
+       u32 b, d,f;                                                      \
+       b = PCI_BUS(dev); d = PCI_DEV(dev); f = PCI_FUNC(dev);           \
+       b = b - hose->first_busno;                                       \
+       dev = PCI_BDF(b, d, f);                                          \
        if (PCI_BUS(dev) > 0)                                            \
                out_le32(hose->cfg_addr, dev | (offset & 0xfc) | 0x80000001); \
        else                                                             \
@@ -71,6 +83,10 @@ static int                                                            \
 indirect_##rw##_config_##size(struct pci_controller *hose,              \
                              pci_dev_t dev, int offset, type val)       \
 {                                                                       \
+       u32 b, d,f;                                                      \
+       b = PCI_BUS(dev); d = PCI_DEV(dev); f = PCI_FUNC(dev);           \
+       b = b - hose->first_busno;                                       \
+       dev = PCI_BDF(b, d, f);                                          \
        out_le32(hose->cfg_addr, dev | (offset & 0xfc) | 0x80000000);    \
        cfg_##rw(val, hose->cfg_data + (offset & mask), type, op);       \
        return 0;                                                        \
index 6c2c712..f5fec22 100644 (file)
@@ -71,8 +71,8 @@ typedef struct sysconf8349 {
                        | SPCR_TSEC2DP | SPCR_TSEC2BDP | SPCR_TSEC2EP)
        u32 sicrl; /* System General Purpose Register Low */
 #define SICRL_LDP_A   0x80000000
-#define SICRL_USB0    0x40000000
-#define SICRL_USB1    0x20000000
+#define SICRL_USB1    0x40000000
+#define SICRL_USB0    0x20000000
 #define SICRL_UART    0x0C000000
 #define SICRL_GPIO1_A 0x02000000
 #define SICRL_GPIO1_B 0x01000000
index 48255a3..7a1adba 100644 (file)
@@ -77,6 +77,7 @@
 #define POCMR_ENABLE        0x80000000
 #define POCMR_PCI_IO        0x40000000
 #define POCMR_PREFETCH_EN   0x20000000
+#define POCMR_PCI2          0x10000000
 
 /* Soft PCI reset */
 
index d6d2fab..1e9a1f7 100644 (file)
@@ -41,9 +41,8 @@
 #define CONFIG_MPC8349         1       /* MPC8349 specific */
 #define CONFIG_MPC8349ADS      1       /* MPC8349ADS board specific */
 
-/* FIXME: Real PCI support will come in a follow-up update. */
-#undef CONFIG_PCI
-
+#define CONFIG_PCI
+#undef  CONFIG_MPC83XX_PCI2            /* support for 2nd PCI controller */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
 
 
 #define CONFIG_L1_INIT_RAM
 #define CFG_INIT_RAM_LOCK      1
-#define CFG_INIT_RAM_ADDR      0xe4010000   /* Initial RAM address */
+#define CFG_INIT_RAM_ADDR      0x40000000   /* Initial RAM address */
 #define CFG_INIT_RAM_END       0x1000       /* End of used area in RAM*/
 
 #define CFG_GBL_DATA_SIZE      0x100     /* num bytes initial data */
  * General PCI
  * Addresses are mapped 1-1.
  */
+
 #define CFG_PCI1_MEM_BASE      0x80000000
 #define CFG_PCI1_MEM_PHYS      CFG_PCI1_MEM_BASE
-#define CFG_PCI1_MEM_SIZE      0x20000000      /* 512M */
+#define CFG_PCI1_MEM_SIZE      0x10000000      /* 256M */
+#define CFG_PCI1_MMIO_BASE     0x90000000
+#define CFG_PCI1_MMIO_PHYS     CFG_PCI1_MMIO_BASE
+#define CFG_PCI1_MMIO_SIZE     0x10000000      /* 256M */
 #define CFG_PCI1_IO_BASE       0x00000000
 #define CFG_PCI1_IO_PHYS       0xe2000000
-#define CFG_PCI1_IO_SIZE       0x1000000       /* 16M */
+#define CFG_PCI1_IO_SIZE       0x00100000      /* 1M */
 
-#define CFG_PCI2_MEM_BASE      0xA0000000
+#define CFG_PCI2_MEM_BASE      0xa0000000
 #define CFG_PCI2_MEM_PHYS      CFG_PCI2_MEM_BASE
-#define CFG_PCI2_MEM_SIZE      0x20000000      /* 512M */
+#define CFG_PCI2_MEM_SIZE      0x10000000      /* 256M */
+#define CFG_PCI2_MMIO_BASE     0xb0000000
+#define CFG_PCI2_MMIO_PHYS     CFG_PCI2_MMIO_BASE
+#define CFG_PCI2_MMIO_SIZE     0x10000000      /* 256M */
 #define CFG_PCI2_IO_BASE       0x00000000
-#define CFG_PCI2_IO_PHYS       0xe3000000
-#define CFG_PCI2_IO_SIZE       0x1000000       /* 16M */
+#define CFG_PCI2_IO_PHYS       0xe2100000
+#define CFG_PCI2_IO_SIZE       0x00100000      /* 1M */
 #if defined(CONFIG_PCI)
 
 #define PCI_ALL_PCI1
        HRCWH_TSEC2M_IN_GMII )
 #endif
 
+/* System IO Config */
+#define CFG_SICRH      SICRH_TSOBI1
+#define CFG_SICRL      SICRL_LDP_A
+
 #define CFG_HID0_INIT 0x000000000
 
 #define CFG_HID0_FINAL CFG_HID0_INIT
        HID0_ENABLE_M_BIT |\
        HID0_ENABLE_ADDRESS_BROADCAST ) */
 
-#define CFG_HID2 0x000000000
+#define CFG_HID2 HID2_HBE
+
+/* DDR 0 - 256MB */
+#define CFG_IBAT0L     (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT0U     (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* stack in DCACHE @ 1GB (no backing mem) */
+#define CFG_IBAT1L     (CFG_INIT_RAM_ADDR | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT1U     (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP)
+
+/* 2G - 3G PCI */
+#ifdef CONFIG_PCI
+#define CFG_IBAT2L     (CFG_PCI1_MEM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT2U     (CFG_PCI1_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT3L     (CFG_PCI1_MMIO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT3U     (CFG_PCI1_MMIO_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#else
+#define CFG_IBAT2L     (0)
+#define CFG_IBAT2U     (0)
+#define CFG_IBAT3L     (0)
+#define CFG_IBAT3U     (0)
+#endif
+
+#ifdef CONFIG_MPC83XX_PCI2
+#define CFG_IBAT4L     (CFG_PCI2_MEM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT4U     (CFG_PCI2_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT5L     (CFG_PCI2_MMIO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT5U     (CFG_PCI2_MMIO_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#else
+#define CFG_IBAT4L     (0)
+#define CFG_IBAT4U     (0)
+#define CFG_IBAT5L     (0)
+#define CFG_IBAT5U     (0)
+#endif
+
+/* IMMRBAR */
+#define CFG_IBAT6L     (CFG_IMMRBAR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT6U     (CFG_IMMRBAR | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* SDRAM, BCSR & FLASH */
+#define CFG_IBAT7L     (0xf0000000 | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT7U     (0xf0000000 | BATU_BL_256M | BATU_VS | BATU_VP)
+
+#define CFG_DBAT0L     CFG_IBAT0L
+#define CFG_DBAT0U     CFG_IBAT0U
+#define CFG_DBAT1L     CFG_IBAT1L
+#define CFG_DBAT1U     CFG_IBAT1U
+#define CFG_DBAT2L     CFG_IBAT2L
+#define CFG_DBAT2U     CFG_IBAT2U
+#define CFG_DBAT3L     CFG_IBAT3L
+#define CFG_DBAT3U     CFG_IBAT3U
+#define CFG_DBAT4L     CFG_IBAT4L
+#define CFG_DBAT4U     CFG_IBAT4U
+#define CFG_DBAT5L     CFG_IBAT5L
+#define CFG_DBAT5U     CFG_IBAT5U
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+#define CFG_DBAT7L     CFG_IBAT7L
+#define CFG_DBAT7U     CFG_IBAT7U
+
 
 /*
  * Internal Definitions
index 41f44c5..cec7e3e 100644 (file)
@@ -417,11 +417,58 @@ extern int tqm834x_num_flash_banks;
        HRCWH_TSEC2M_IN_GMII )
 #endif
 
+/* System IO Config */
+#define CFG_SICRH      SICRH_TSOBI1
+#define CFG_SICRL      SICRL_LDP_A
+
 /* i-cache and d-cache disabled */
 #define CFG_HID0_INIT          0x000000000
 #define CFG_HID0_FINAL         CFG_HID0_INIT
 #define CFG_HID2               0x000000000
 
+/* DDR 0 - 512M */
+#define CFG_IBAT0L     (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT0U     (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT1L     (CFG_SDRAM_BASE + 0x10000000 | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT1U     (CFG_SDRAM_BASE + 0x10000000 | BATU_BL_256M | BATU_VS | BATU_VP)
+
+/* stack in DCACHE @ 512M (no backing mem) */
+#define CFG_IBAT2L     (CFG_INIT_RAM_ADDR | BATL_PP_10 | BATL_MEMCOHERENCE)
+#define CFG_IBAT2U     (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP)
+
+/* PCI */
+#define CFG_IBAT3L     (CFG_PCI1_MEM_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT3U     (CFG_PCI1_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT4L     (CFG_PCI1_MEM_BASE + 0x10000000 | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT4U     (CFG_PCI1_MEM_BASE + 0x10000000 | BATU_BL_256M | BATU_VS | BATU_VP)
+#define CFG_IBAT5L     (CFG_PCI1_IO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT5U     (CFG_PCI1_IO_BASE + 0x10000000 | BATU_BL_16M | BATU_VS | BATU_VP)
+
+/* IMMRBAR */
+#define CFG_IBAT6L     (CFG_IMMRBAR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT6U     (CFG_IMMRBAR | BATU_BL_1M | BATU_VS | BATU_VP)
+
+/* FLASH */
+#define CFG_IBAT7L     (CFG_FLASH_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE)
+#define CFG_IBAT7U     (CFG_FLASH_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
+
+#define CFG_DBAT0L     CFG_IBAT0L
+#define CFG_DBAT0U     CFG_IBAT0U
+#define CFG_DBAT1L     CFG_IBAT1L
+#define CFG_DBAT1U     CFG_IBAT1U
+#define CFG_DBAT2L     CFG_IBAT2L
+#define CFG_DBAT2U     CFG_IBAT2U
+#define CFG_DBAT3L     CFG_IBAT3L
+#define CFG_DBAT3U     CFG_IBAT3U
+#define CFG_DBAT4L     CFG_IBAT4L
+#define CFG_DBAT4U     CFG_IBAT4U
+#define CFG_DBAT5L     CFG_IBAT5L
+#define CFG_DBAT5U     CFG_IBAT5U
+#define CFG_DBAT6L     CFG_IBAT6L
+#define CFG_DBAT6U     CFG_IBAT6U
+#define CFG_DBAT7L     CFG_IBAT7L
+#define CFG_DBAT7U     CFG_IBAT7U
+
 /*
  * Internal Definitions
  *
index 3ffe6b2..be6c36c 100644 (file)
@@ -584,5 +584,7 @@ typedef unsigned int led_id_t;
 
 #define OF_CPU                 "PowerPC,MPC870@0"
 #define OF_TBCLK               (MPC8XX_HZ / 16)
+#define CONFIG_OF_HAS_BD_T     1
+#define CONFIG_OF_HAS_UBOOT_ENV        1
 
 #endif /* __CONFIG_H */
index 9104b1a..47ca575 100644 (file)
@@ -57,10 +57,12 @@ void ft_prop_int(struct ft_cxt *cxt, const char *name, int val);
 void ft_begin(struct ft_cxt *cxt, void *blob, int max_size);
 void ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
 
-void ft_setup(void *blob, int size, bd_t * bd);
+void ft_setup(void *blob, int size, bd_t * bd, ulong initrd_start, ulong initrd_end);
 
 void ft_dump_blob(const void *bphp);
 void ft_merge_blob(struct ft_cxt *cxt, void *blob);
 void *ft_get_prop(void *bphp, const char *propname, int *szp);
 
+void ft_board_setup(void *blob, bd_t *bd);
+
 #endif
index 8f19997..f78a769 100644 (file)
@@ -309,6 +309,7 @@ struct pci_region {
 #define PCI_REGION_MEM         0x00000000      /* PCI memory space */
 #define PCI_REGION_IO          0x00000001      /* PCI IO space */
 #define PCI_REGION_TYPE                0x00000001
+#define PCI_REGION_PREFETCH    0x00000008      /* prefetchable PCI memory */
 
 #define PCI_REGION_MEMORY      0x00000100      /* System memory */
 #define PCI_REGION_RO          0x00000200      /* Read-only memory */
@@ -386,7 +387,7 @@ struct pci_controller {
        int (*write_dword)(struct pci_controller*, pci_dev_t, int where, u32);
 
        /* Used by auto config */
-       struct pci_region *pci_mem, *pci_io;
+       struct pci_region *pci_mem, *pci_io, *pci_prefetch;
 
        /* Used by ppc405 autoconfig*/
        struct pci_region *pci_fb;
@@ -472,6 +473,7 @@ extern int pciauto_region_allocate(struct pci_region* res, unsigned int size, un
 extern void pciauto_setup_device(struct pci_controller *hose,
                                 pci_dev_t dev, int bars_num,
                                 struct pci_region *mem,
+                                struct pci_region *prefetch,
                                 struct pci_region *io);
 int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev);
 
index f40bb25..e569e97 100644 (file)
@@ -670,7 +670,8 @@ void board_init_r (gd_t *id, ulong dest_addr)
 
        WATCHDOG_RESET();
 
-#if defined(CONFIG_IP860) || defined(CONFIG_PCU_E) || defined (CONFIG_FLAGADM)
+#if defined(CONFIG_IP860) || defined(CONFIG_PCU_E) || \
+       defined (CONFIG_FLAGADM) || defined(CONFIG_MPC83XX)
        icache_enable ();       /* it's time to enable the instruction cache */
 #endif