General code modification for mpc7448hpc2 board support.
authorroy zang <tie-fei.zang@freescale.com>
Thu, 2 Nov 2006 10:49:51 +0000 (18:49 +0800)
committerZang Tiefei <roy@bus.ap.freescale.net>
Thu, 2 Nov 2006 10:49:51 +0000 (18:49 +0800)
1. Add 7447A and 7448 processor support.
2. Add the following flags.

CFG_CONFIG_BUS_CLK : If the 74xx bus frequency can be configured dynamically
(such as by switch on board), this flag should be set.

CFG_EXCEPTION_AFTER_RELOCATE: If an exception occurs after the u-boot
relocates to RAM, this flag should be set.

CFG_SERIAL_HANG_IN_EXCEPTION: If the print out function will cause the
system hang in exception, this flag should be set.

There is a design issue for tsi108/109 pci configure  read. When pci scan
the slots, if there is no pci card, the tsi108/9 will cause a machine
check exception for mpc7448 processor.

Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
MAKEALL
Makefile
README
cpu/74xx_7xx/cpu.c
cpu/74xx_7xx/cpu_init.c
cpu/74xx_7xx/speed.c
drivers/Makefile
include/74xx_7xx.h
include/asm-ppc/global_data.h
lib_ppc/extable.c

diff --git a/MAKEALL b/MAKEALL
index 879a17f9cc5703e2dfd7984d0e6a00637f4337fe..812c006227f8e43d569f07da35b34a9d91621917 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -150,8 +150,8 @@ LIST_85xx=" \
 #########################################################################
 
 LIST_74xx="    \
-       DB64360         DB64460         EVB64260        P3G4            \
-       PCIPPC2         PCIPPC6         ZUMA                            \
+       DB64360         DB64460         EVB64260        mpc7448hpc2     \
+       P3G4            PCIPPC2         PCIPPC6         ZUMA            \
 "
 
 LIST_7xx="     \
index 62dafc5ed9fd45862a2fa207c283f975dbb7e561..e2fb6fded95ce7a64b06832b2105ea8dd55ab76b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1718,6 +1718,9 @@ EVB64260_config   \
 EVB64260_750CX_config: unconfig
        @$(MKCONFIG) EVB64260 ppc 74xx_7xx evb64260
 
+mpc7448hpc2_config:  unconfig
+       @./mkconfig $(@:_config=) ppc 74xx_7xx mpc7448hpc2
+
 P3G4_config: unconfig
        @$(MKCONFIG) $(@:_config=) ppc 74xx_7xx evb64260
 
diff --git a/README b/README
index b78ea6124dc8c4f92e6e4b5746157fe3bffdaea6..aa17e4650c0c04aa1042aca275b186ccede03aa7 100644 (file)
--- a/README
+++ b/README
@@ -2312,17 +2312,17 @@ configurations; the following names are supported:
        csb272_config           lwmon_config            sbc8260_config
        CU824_config            MBX860T_config          sbc8560_33_config
        DUET_ADS_config         MBX_config              sbc8560_66_config
-       EBONY_config            MPC8260ADS_config       SM850_config
-       ELPT860_config          MPC8540ADS_config       SPD823TS_config
-       ESTEEM192E_config       MPC8540EVAL_config      stxgp3_config
-       ETX094_config           MPC8560ADS_config       SXNI855T_config
-       FADS823_config          NETVIA_config           TQM823L_config
-       FADS850SAR_config       omap1510inn_config      TQM850L_config
-       FADS860T_config         omap1610h2_config       TQM855L_config
-       FPS850L_config          omap1610inn_config      TQM860L_config
-                               omap5912osk_config      walnut_config
-                               omap2420h4_config       Yukon8220_config
-                                                       ZPC1900_config
+       EBONY_config            mpc7448hpc2_config      SM850_config
+       ELPT860_config          MPC8260ADS_config       SPD823TS_config
+       ESTEEM192E_config       MPC8540ADS_config       stxgp3_config
+       ETX094_config           MPC8540EVAL_config      SXNI855T_config
+       FADS823_config          NMPC8560ADS_config      TQM823L_config
+       FADS850SAR_config       NETVIA_config           TQM850L_config
+       FADS860T_config         omap1510inn_config      TQM855L_config
+       FPS850L_config          omap1610h2_config       TQM860L_config
+                               omap1610inn_config      walnut_config
+                               omap5912osk_config      Yukon8220_config
+                               omap2420h4_config       ZPC1900_config
 
 Note: for some board special configuration names may exist; check if
       additional information is available from the board vendor; for
index ca45e17edbbd02a692ca1969613871f0445fd674..c3aadca29281e8da9969b34ace88deecd4a67c09 100644 (file)
 #include <74xx_7xx.h>
 #include <asm/cache.h>
 
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+
 #ifdef CONFIG_AMIGAONEG3SE
 #include "../board/MAI/AmigaOneG3SE/via686.h"
 #include "../board/MAI/AmigaOneG3SE/memio.h"
@@ -101,6 +105,14 @@ get_cpu_type(void)
                type = CPU_7457;
                break;
 
+       case 0x8003:
+               type = CPU_7447A;
+               break;
+               
+       case 0x8004:
+               type = CPU_7448;
+               break;
+               
        default:
                break;
        }
@@ -164,6 +176,14 @@ int checkcpu (void)
                str = "MPC7457";
                break;
 
+       case CPU_7447A:
+               str = "MPC7447A";
+               break;
+
+       case CPU_7448:
+               str = "MPC7448";
+               break;
+
        default:
                printf("Unknown CPU -- PVR: 0x%08x\n", pvr);
                return -1;
@@ -256,20 +276,19 @@ do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 /*
  * For the 7400 the TB clock runs at 1/4 the cpu bus speed.
  */
-#ifdef CONFIG_AMIGAONEG3SE
+#if defined(CONFIG_AMIGAONEG3SE) || defined(CFG_CONFIG_BUS_CLK)
 unsigned long get_tbclk(void)
 {
        return (gd->bus_clk / 4);
 }
-#else  /* ! CONFIG_AMIGAONEG3SE */
+#else  /* ! CONFIG_AMIGAONEG3SE and !CFG_CONFIG_BUS_CLK*/
 
 unsigned long get_tbclk (void)
 {
        return CFG_BUS_HZ / 4;
 }
-#endif /* CONFIG_AMIGAONEG3SE */
+#endif /* CONFIG_AMIGAONEG3SE or CFG_CONFIG_BUS_CLK*/
 /* ------------------------------------------------------------------------- */
-
 #if defined(CONFIG_WATCHDOG)
 #if !defined(CONFIG_PCIPPC2) && !defined(CONFIG_BAB7xx)
 void
@@ -281,3 +300,30 @@ watchdog_reset(void)
 #endif /* CONFIG_WATCHDOG */
 
 /* ------------------------------------------------------------------------- */
+
+#ifdef CONFIG_OF_FLAT_TREE
+void
+ft_cpu_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       ulong clock;
+       int len;
+               
+       clock = bd->bi_busfreq;
+       
+       p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+#if defined(CONFIG_TSI108_ETH)
+       p = ft_get_prop(blob, "/" OF_TSI "/ethernet@6200/address", &len);
+               memcpy(p, bd->bi_enetaddr, 6);
+#endif
+#if defined(CONFIG_HAS_ETH1)
+       p = ft_get_prop(blob, "/" OF_TSI "/ethernet@6600/address", &len);
+               memcpy(p, bd->bi_enet1addr, 6);
+#endif
+}
+#endif
+/* ------------------------------------------------------------------------- */
index 93f180f267ed7ff9996d650053af02df200f798d..1dd1b2cd8426017b92aa47e2e08dd983f77f1ee7 100644 (file)
@@ -43,6 +43,8 @@ cpu_init_f (void)
        case CPU_7450:
        case CPU_7455:
        case CPU_7457:
+       case CPU_7447A:
+       case CPU_7448:
                /* enable the timebase bit in HID0 */
                set_hid0(get_hid0() | 0x4000000);
                break;
index 2dc510746d69e2c678b45c6536143623138a8901..d520794568a10f2bcb3a8a2687a457b36b37fd56 100644 (file)
@@ -31,6 +31,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+extern unsigned long get_board_bus_clk(void);
+
 static const int hid1_multipliers_x_10[] = {
        25,     /* 0000 - 2.5x */
        75,     /* 0001 - 7.5x */
@@ -50,6 +52,41 @@ static const int hid1_multipliers_x_10[] = {
        0       /* 1111 - off */
 };
 
+static const int hid1_7447A_multipliers_x_10[] = {
+       115,    /* 00000 - 11.5x  */
+       170,    /* 00001 - 17x    */
+       75,     /* 00010 -  7.5x  */
+       150,    /* 00011 - 15x    */
+       70,     /* 00100 -  7x    */
+       180,    /* 00101 - 18x    */
+       10,     /* 00110 - bypass */
+       200,    /* 00111 - 20x    */
+       20,     /* 01000 -  2x    */
+       210,    /* 01001 - 21x    */
+       65,     /* 01010 -  6.5x  */
+       130,    /* 01011 - 13x    */
+       85,     /* 01100 -  8.5x  */
+       240,    /* 01101 - 13x    */
+       95,     /* 01110 -  9.5x  */
+       90,     /* 01111 -  9x    */
+       30,     /* 10000 -  3x    */
+       105,    /* 10001 - 10.5x  */
+       55,     /* 10010 -  5.5x  */
+       110,    /* 10011 - 11x    */
+       40,     /* 10100 -  4x    */
+       100,    /* 10101 - 10x    */
+       50,     /* 10110 -  5x    */
+       120,    /* 10111 - 12x    */
+       80,     /* 11000 -  8x    */
+       140,    /* 11001 - 14x    */
+       60,     /* 11010 -  6x    */
+       160,    /* 11011 - 16x    */
+       135,    /* 11100 - 13.5x  */
+       280,    /* 11101 - 28x    */
+       0,      /* 11110 - off    */
+       125     /* 11111 - 12.5x  */
+};
+
 static const int hid1_fx_multipliers_x_10[] = {
        00,     /* 0000 - off */
        00,     /* 0001 - off */
@@ -89,8 +126,19 @@ int get_clocks (void)
 {
        ulong clock = 0;
 
+#ifdef CFG_CONFIG_BUS_CLK
+       gd->bus_clk = get_board_bus_clk();
+#else
+       gd->bus_clk = CFG_BUS_CLK;
+#endif
+
        /* calculate the clock frequency based upon the CPU type */
        switch (get_cpu_type()) {
+       case CPU_7447A:
+       case CPU_7448:
+               clock = (gd->bus_clk / 10) * hid1_7447A_multipliers_x_10[(get_hid1 () >> 12) & 0x1F];
+               break;
+               
        case CPU_7455:
        case CPU_7457:
                /*
@@ -98,12 +146,12 @@ int get_clocks (void)
                 * Make sure division is done before multiplication to prevent 32-bit
                 * arithmetic overflows which will cause a negative number
                 */
-               clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[(get_hid1 () >> 13) & 0xF];
+               clock = (gd->bus_clk / 10) * hid1_multipliers_x_10[(get_hid1 () >> 13) & 0xF];
                break;
 
        case CPU_750GX:
        case CPU_750FX:
-               clock = CFG_BUS_CLK * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;
+               clock = gd->bus_clk * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;
                break;
 
        case CPU_7450:
@@ -120,7 +168,7 @@ int get_clocks (void)
                 * Make sure division is done before multiplication to prevent 32-bit
                 * arithmetic overflows which will cause a negative number
                 */
-               clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[get_hid1 () >> 28];
+               clock = (gd->bus_clk / 10) * hid1_multipliers_x_10[get_hid1 () >> 28];
                break;
 
        case CPU_UNKNOWN:
@@ -130,7 +178,6 @@ int get_clocks (void)
        }
 
        gd->cpu_clk = clock;
-       gd->bus_clk = CFG_BUS_CLK;
 
        return (0);
 }
index 5a369df2c418914c2e1245fafb57ddd21d10582f..6a3ea5da255e8392740ce61ca6ac4a94715000cf 100644 (file)
@@ -35,8 +35,8 @@ COBJS = 3c589.o 5701rls.o ali512x.o atmel_usart.o \
          lan91c96.o \
          natsemi.o ne2000.o netarm_eth.o netconsole.o \
          ns16550.o ns8382x.o ns87308.o ns7520_eth.o omap1510_i2c.o \
-         omap24xx_i2c.o pci.o pci_auto.o pci_indirect.o \
-         pcnet.o plb2800_eth.o \
+         omap24xx_i2c.o pci.o pci_auto.o pci_indirect.o tsi108_pci.o\
+         tsi108_i2c.o pcnet.o plb2800_eth.o \
          ps2ser.o ps2mult.o pc_keyb.o \
          rtl8019.o rtl8139.o rtl8169.o \
          s3c4510b_eth.o s3c4510b_uart.o \
@@ -45,7 +45,7 @@ COBJS = 3c589.o 5701rls.o ali512x.o atmel_usart.o \
          serial_pl010.o serial_pl011.o serial_xuartlite.o \
          sl811_usb.o sm501.o smc91111.o smiLynxEM.o \
          status_led.o sym53c8xx.o ahci.o \
-         ti_pci1410a.o tigon3.o tsec.o \
+         ti_pci1410a.o tigon3.o tsec.o tsi108_eth.o\
          usbdcore.o usbdcore_ep0.o usbdcore_omap1510.o usbtty.o \
          videomodes.o w83c553f.o \
          ks8695eth.o \
index a6287982a603a8e61862c91f6904c2d6aa8a89f2..7cd2f10b018760a9e77f3a3b8c517be933575849 100644 (file)
@@ -112,6 +112,7 @@ typedef enum __cpu_t {
        CPU_7400,
        CPU_7410,
        CPU_7450, CPU_7455, CPU_7457,
+       CPU_7447A, CPU_7448,
        CPU_UNKNOWN} cpu_t;
 
 extern cpu_t get_cpu_type(void);
index b73af96464aa1e1ccba43de06bc50014360fe72a..166afbe87a1df431d33bcd90c2c70e7ceb407f02 100644 (file)
@@ -49,6 +49,9 @@ typedef       struct  global_data {
        unsigned long   scc_clk;
        unsigned long   brg_clk;
 #endif
+#if defined(CONFIG_MPC7448HPC2)
+       unsigned long   mem_clk;
+#endif
 #if defined(CONFIG_MPC83XX)
        /* There are other clocks in the MPC83XX */
        u32 csb_clk;
index d92f14270ef189fc80fa02f8b0ce2443478c116f..34b5d460cf54c1318d3676b987d00d0235c58a77 100644 (file)
@@ -50,14 +50,22 @@ search_one_table(const struct exception_table_entry *first,
                 const struct exception_table_entry *last,
                 unsigned long value)
 {
+       DECLARE_GLOBAL_DATA_PTR;
+
        while (first <= last) {
                const struct exception_table_entry *mid;
                long diff;
 
                mid = (last - first) / 2 + first;
+#ifdef CFG_EXCEPTION_AFTER_RELOCATE
+               diff = (mid->insn + gd->reloc_off) - value;
+               if (diff == 0)
+                       return (mid->fixup + gd->reloc_off);
+#else
                diff = mid->insn - value;
                if (diff == 0)
                        return mid->fixup;
+#endif
                else if (diff < 0)
                        first = mid+1;
                else
@@ -75,8 +83,10 @@ search_exception_table(unsigned long addr)
 
        /* There is only the kernel to search.  */
        ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
+#if !defined(CFG_SERIAL_HANG_IN_EXCEPTION)
        if (ex_tab_message)
                printf("Bus Fault @ 0x%08lx, fixup 0x%08lx\n", addr, ret);
+#endif
        if (ret) return ret;
 
        return 0;