ppc4xx: Big cleanup of PPC4xx defines
[platform/kernel/u-boot.git] / cpu / ppc4xx / 44x_spd_ddr.c
index 10b4c18..c93f23a 100644 (file)
@@ -20,7 +20,7 @@
  * Jun Gu, Artesyn Technology, jung@artesyncp.com
  * Support for AMCC 440 based on OpenBIOS draminit.c from IBM.
  *
- * (C) Copyright 2005
+ * (C) Copyright 2005-2007
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
  * MA 02111-1307 USA
  */
 
+/* define DEBUG for debugging output (obviously ;-)) */
+#if 0
+#define DEBUG
+#endif
+
 #include <common.h>
 #include <asm/processor.h>
 #include <i2c.h>
 #include <ppc4xx.h>
 #include <asm/mmu.h>
 
+#include "ecc.h"
+
 #if defined(CONFIG_SPD_EEPROM) &&                                      \
        (defined(CONFIG_440GP) || defined(CONFIG_440GX) ||              \
         defined(CONFIG_440EP) || defined(CONFIG_440GR))
 /*
  * Set default values
  */
-#ifndef CFG_I2C_SPEED
-#define CFG_I2C_SPEED  50000
-#endif
-
-#ifndef CFG_I2C_SLAVE
-#define CFG_I2C_SLAVE  0xFE
+#ifndef CONFIG_SYS_I2C_SPEED
+#define CONFIG_SYS_I2C_SPEED   50000
 #endif
 
 #define ONE_BILLION    1000000000
 
-/*-----------------------------------------------------------------------------
-  |  Memory Controller Options 0
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_CFG0_DCEN                0x80000000      /* SDRAM Controller Enable      */
-#define SDRAM_CFG0_MCHK_MASK   0x30000000      /* Memory data errchecking mask */
-#define SDRAM_CFG0_MCHK_NON    0x00000000      /* No ECC generation            */
-#define SDRAM_CFG0_MCHK_GEN    0x20000000      /* ECC generation               */
-#define SDRAM_CFG0_MCHK_CHK    0x30000000      /* ECC generation and checking  */
-#define SDRAM_CFG0_RDEN                0x08000000      /* Registered DIMM enable       */
-#define SDRAM_CFG0_PMUD                0x04000000      /* Page management unit         */
-#define SDRAM_CFG0_DMWD_MASK   0x02000000      /* DRAM width mask              */
-#define SDRAM_CFG0_DMWD_32     0x00000000      /* 32 bits                      */
-#define SDRAM_CFG0_DMWD_64     0x02000000      /* 64 bits                      */
-#define SDRAM_CFG0_UIOS_MASK   0x00C00000      /* Unused IO State              */
-#define SDRAM_CFG0_PDP         0x00200000      /* Page deallocation policy     */
-
-/*-----------------------------------------------------------------------------
-  |  Memory Controller Options 1
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_CFG1_SRE         0x80000000      /* Self-Refresh Entry           */
-#define SDRAM_CFG1_PMEN                0x40000000      /* Power Management Enable      */
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM DEVPOT Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_DEVOPT_DLL       0x80000000
-#define SDRAM_DEVOPT_DS                0x40000000
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM MCSTS Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_MCSTS_MRSC       0x80000000
-#define SDRAM_MCSTS_SRMS       0x40000000
-#define SDRAM_MCSTS_CIS                0x20000000
-
-/*-----------------------------------------------------------------------------
-  |  SDRAM Refresh Timer Register
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_RTR_RINT_MASK      0xFFFF0000
-#define SDRAM_RTR_RINT_ENCODE(n)  (((n) << 16) & SDRAM_RTR_RINT_MASK)
-#define sdram_HZ_to_ns(hertz)    (1000000000/(hertz))
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM UABus Base Address Reg
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_UABBA_UBBA_MASK  0x0000000F
-
-/*-----------------------------------------------------------------------------+
-  |  Memory Bank 0-7 configuration
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_BXCR_SDBA_MASK   0xff800000        /* Base address             */
-#define SDRAM_BXCR_SDSZ_MASK   0x000e0000        /* Size                     */
-#define SDRAM_BXCR_SDSZ_8      0x00020000        /*   8M                     */
-#define SDRAM_BXCR_SDSZ_16     0x00040000        /*  16M                     */
-#define SDRAM_BXCR_SDSZ_32     0x00060000        /*  32M                     */
-#define SDRAM_BXCR_SDSZ_64     0x00080000        /*  64M                     */
-#define SDRAM_BXCR_SDSZ_128    0x000a0000        /* 128M                     */
-#define SDRAM_BXCR_SDSZ_256    0x000c0000        /* 256M                     */
-#define SDRAM_BXCR_SDSZ_512    0x000e0000        /* 512M                     */
-#define SDRAM_BXCR_SDAM_MASK   0x0000e000        /* Addressing mode          */
-#define SDRAM_BXCR_SDAM_1      0x00000000        /*   Mode 1                 */
-#define SDRAM_BXCR_SDAM_2      0x00002000        /*   Mode 2                 */
-#define SDRAM_BXCR_SDAM_3      0x00004000        /*   Mode 3                 */
-#define SDRAM_BXCR_SDAM_4      0x00006000        /*   Mode 4                 */
-#define SDRAM_BXCR_SDBE                0x00000001        /* Memory Bank Enable       */
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM TR0 Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_TR0_SDWR_MASK    0x80000000
-#define         SDRAM_TR0_SDWR_2_CLK   0x00000000
-#define         SDRAM_TR0_SDWR_3_CLK   0x80000000
-#define SDRAM_TR0_SDWD_MASK    0x40000000
-#define         SDRAM_TR0_SDWD_0_CLK   0x00000000
-#define         SDRAM_TR0_SDWD_1_CLK   0x40000000
-#define SDRAM_TR0_SDCL_MASK    0x01800000
-#define         SDRAM_TR0_SDCL_2_0_CLK 0x00800000
-#define         SDRAM_TR0_SDCL_2_5_CLK 0x01000000
-#define         SDRAM_TR0_SDCL_3_0_CLK 0x01800000
-#define SDRAM_TR0_SDPA_MASK    0x000C0000
-#define         SDRAM_TR0_SDPA_2_CLK   0x00040000
-#define         SDRAM_TR0_SDPA_3_CLK   0x00080000
-#define         SDRAM_TR0_SDPA_4_CLK   0x000C0000
-#define SDRAM_TR0_SDCP_MASK    0x00030000
-#define         SDRAM_TR0_SDCP_2_CLK   0x00000000
-#define         SDRAM_TR0_SDCP_3_CLK   0x00010000
-#define         SDRAM_TR0_SDCP_4_CLK   0x00020000
-#define         SDRAM_TR0_SDCP_5_CLK   0x00030000
-#define SDRAM_TR0_SDLD_MASK    0x0000C000
-#define         SDRAM_TR0_SDLD_1_CLK   0x00000000
-#define         SDRAM_TR0_SDLD_2_CLK   0x00004000
-#define SDRAM_TR0_SDRA_MASK    0x0000001C
-#define         SDRAM_TR0_SDRA_6_CLK   0x00000000
-#define         SDRAM_TR0_SDRA_7_CLK   0x00000004
-#define         SDRAM_TR0_SDRA_8_CLK   0x00000008
-#define         SDRAM_TR0_SDRA_9_CLK   0x0000000C
-#define         SDRAM_TR0_SDRA_10_CLK  0x00000010
-#define         SDRAM_TR0_SDRA_11_CLK  0x00000014
-#define         SDRAM_TR0_SDRA_12_CLK  0x00000018
-#define         SDRAM_TR0_SDRA_13_CLK  0x0000001C
-#define SDRAM_TR0_SDRD_MASK    0x00000003
-#define         SDRAM_TR0_SDRD_2_CLK   0x00000001
-#define         SDRAM_TR0_SDRD_3_CLK   0x00000002
-#define         SDRAM_TR0_SDRD_4_CLK   0x00000003
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM TR1 Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_TR1_RDSS_MASK    0xC0000000
-#define         SDRAM_TR1_RDSS_TR0     0x00000000
-#define         SDRAM_TR1_RDSS_TR1     0x40000000
-#define         SDRAM_TR1_RDSS_TR2     0x80000000
-#define         SDRAM_TR1_RDSS_TR3     0xC0000000
-#define SDRAM_TR1_RDSL_MASK    0x00C00000
-#define         SDRAM_TR1_RDSL_STAGE1  0x00000000
-#define         SDRAM_TR1_RDSL_STAGE2  0x00400000
-#define         SDRAM_TR1_RDSL_STAGE3  0x00800000
-#define SDRAM_TR1_RDCD_MASK    0x00000800
-#define         SDRAM_TR1_RDCD_RCD_0_0 0x00000000
-#define         SDRAM_TR1_RDCD_RCD_1_2 0x00000800
-#define SDRAM_TR1_RDCT_MASK    0x000001FF
-#define         SDRAM_TR1_RDCT_ENCODE(x)  (((x) << 0) & SDRAM_TR1_RDCT_MASK)
-#define         SDRAM_TR1_RDCT_DECODE(x)  (((x) & SDRAM_TR1_RDCT_MASK) >> 0)
-#define         SDRAM_TR1_RDCT_MIN     0x00000000
-#define         SDRAM_TR1_RDCT_MAX     0x000001FF
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM WDDCTR Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_WDDCTR_WRCP_MASK 0xC0000000
-#define         SDRAM_WDDCTR_WRCP_0DEG   0x00000000
-#define         SDRAM_WDDCTR_WRCP_90DEG  0x40000000
-#define         SDRAM_WDDCTR_WRCP_180DEG 0x80000000
-#define SDRAM_WDDCTR_DCD_MASK  0x000001FF
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM CLKTR Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_CLKTR_CLKP_MASK  0xC0000000
-#define         SDRAM_CLKTR_CLKP_0DEG    0x00000000
-#define         SDRAM_CLKTR_CLKP_90DEG   0x40000000
-#define         SDRAM_CLKTR_CLKP_180DEG  0x80000000
-#define SDRAM_CLKTR_DCDT_MASK  0x000001FF
-
-/*-----------------------------------------------------------------------------+
-  |  SDRAM DLYCAL Options
-  +-----------------------------------------------------------------------------*/
-#define SDRAM_DLYCAL_DLCV_MASK 0x000003FC
-#define         SDRAM_DLYCAL_DLCV_ENCODE(x) (((x)<<2) & SDRAM_DLYCAL_DLCV_MASK)
-#define         SDRAM_DLYCAL_DLCV_DECODE(x) (((x) & SDRAM_DLYCAL_DLCV_MASK)>>2)
+/*
+ * Board-specific Platform code can reimplement spd_ddr_init_hang () if needed
+ */
+void __spd_ddr_init_hang (void)
+{
+       hang ();
+}
+void spd_ddr_init_hang (void) __attribute__((weak, alias("__spd_ddr_init_hang")));
 
 /*-----------------------------------------------------------------------------+
   |  General Definition
  * memory.
  *
  * If at some time this restriction doesn't apply anymore, just define
- * CFG_ENABLE_SDRAM_CACHE in the board config file and this code should setup
+ * CONFIG_4xx_DCACHE in the board config file and this code should setup
  * everything correctly.
  */
-#ifdef CFG_ENABLE_SDRAM_CACHE
+#ifdef CONFIG_4xx_DCACHE
 #define MY_TLB_WORD2_I_ENABLE  0                       /* enable caching on SDRAM */
 #else
 #define MY_TLB_WORD2_I_ENABLE  TLB_WORD2_I_ENABLE      /* disable caching on SDRAM */
 #endif
 
-const unsigned long test[NUMMEMTESTS][NUMMEMWORDS] = {
-       {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
-        0xFFFFFFFF, 0xFFFFFFFF},
-       {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
-        0x00000000, 0x00000000},
-       {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
-        0x55555555, 0x55555555},
-       {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
-        0xAAAAAAAA, 0xAAAAAAAA},
-       {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
-        0x5A5A5A5A, 0x5A5A5A5A},
-       {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
-        0xA5A5A5A5, 0xA5A5A5A5},
-       {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
-        0x55AA55AA, 0x55AA55AA},
-       {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
-        0xAA55AA55, 0xAA55AA55}
-};
-
 /* bank_parms is used to sort the bank sizes by descending order */
 struct bank_param {
        unsigned long cr;
@@ -273,51 +115,37 @@ struct bank_param {
 
 typedef struct bank_param BANKPARMS;
 
-#ifdef CFG_SIMULATE_SPD_EEPROM
-extern unsigned char cfg_simulate_spd_eeprom[128];
+#ifdef CONFIG_SYS_SIMULATE_SPD_EEPROM
+extern const unsigned char cfg_simulate_spd_eeprom[128];
 #endif
-void program_tlb(u32 start, u32 size, u32 tlb_word2_i_value);
-
-unsigned char spd_read(uchar chip, uint addr);
-
-void get_spd_info(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void check_mem_type
-(unsigned long* dimm_populated,
- unsigned char* iic0_dimm_addr,
- unsigned long num_dimm_banks);
-
-void check_volt_type
-(unsigned long* dimm_populated,
- unsigned char* iic0_dimm_addr,
- unsigned long num_dimm_banks);
-
-void program_cfg0(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void program_cfg1(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
 
-void program_rtr (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void program_tr0 (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks);
-
-void program_tr1 (void);
-
-void program_ecc (unsigned long         num_bytes);
-
-unsigned
-long  program_bxcr(unsigned long* dimm_populated,
-                  unsigned char* iic0_dimm_addr,
-                  unsigned long  num_dimm_banks);
+static unsigned char spd_read(uchar chip, uint addr);
+static void get_spd_info(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks);
+static void check_mem_type(unsigned long *dimm_populated,
+                          unsigned char *iic0_dimm_addr,
+                          unsigned long num_dimm_banks);
+static void check_volt_type(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks);
+static void program_cfg0(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long  num_dimm_banks);
+static void program_cfg1(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks);
+static void program_rtr(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks);
+static void program_tr0(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks);
+static void program_tr1(void);
+
+static unsigned long program_bxcr(unsigned long *dimm_populated,
+                                 unsigned char *iic0_dimm_addr,
+                                 unsigned long num_dimm_banks);
 
 /*
  * This function is reading data from the DIMM module EEPROM over the SPD bus
@@ -328,7 +156,6 @@ long  program_bxcr(unsigned long* dimm_populated,
  * BUG: Don't handle ECC memory
  * BUG: A few values in the TR register is currently hardcoded
  */
-
 long int spd_sdram(void) {
        unsigned char iic0_dimm_addr[] = SPD_EEPROM_ADDRESS;
        unsigned long dimm_populated[sizeof(iic0_dimm_addr)];
@@ -343,7 +170,7 @@ long int spd_sdram(void) {
         * Make sure I2C controller is initialized
         * before continuing.
         */
-       i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE);
+       i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
 
        /*
         * Read the SPD information using I2C interface. Check to see if the
@@ -361,12 +188,12 @@ long int spd_sdram(void) {
         */
        check_volt_type(dimm_populated, iic0_dimm_addr, num_dimm_banks);
 
-#if defined(CONFIG_440GX) || defined(CONFIG_440EP) || defined(CONFIG_440GR) || defined(CONFIG_440SP)
+#if defined(CONFIG_440GX) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
        /*
         * Soft-reset SDRAM controller.
         */
-       mtsdr(sdr_srst, SDR0_SRST_DMC);
-       mtsdr(sdr_srst, 0x00000000);
+       mtsdr(SDR0_SRST, SDR0_SRST_DMC);
+       mtsdr(SDR0_SRST, 0x00000000);
 #endif
 
        /*
@@ -397,7 +224,7 @@ long int spd_sdram(void) {
 
 #ifdef CONFIG_PROG_SDRAM_TLB /* this define should eventually be removed */
        /* and program tlb entries for this size (dynamic) */
-       program_tlb(0, total_size, MY_TLB_WORD2_I_ENABLE);
+       program_tlb(0, 0, total_size, MY_TLB_WORD2_I_ENABLE);
 #endif
 
        /*
@@ -421,9 +248,8 @@ long int spd_sdram(void) {
         */
        while (1) {
                mfsdram(mem_mcsts, mcsts);
-               if ((mcsts & SDRAM_MCSTS_MRSC) != 0) {
+               if ((mcsts & SDRAM_MCSTS_MRSC) != 0)
                        break;
-               }
        }
 
        /*
@@ -431,25 +257,28 @@ long int spd_sdram(void) {
         */
        program_tr1();
 
+#ifdef CONFIG_DDR_ECC
        /*
-        * if ECC is enabled, initialize parity bits
+        * If ecc is enabled, initialize the parity bits.
         */
+       ecc_init(CONFIG_SYS_SDRAM_BASE, total_size);
+#endif
 
        return total_size;
 }
 
-unsigned char spd_read(uchar chip, uint addr)
+static unsigned char spd_read(uchar chip, uint addr)
 {
        unsigned char data[2];
 
-#ifdef CFG_SIMULATE_SPD_EEPROM
-       if (chip == CFG_SIMULATE_SPD_EEPROM) {
+#ifdef CONFIG_SYS_SIMULATE_SPD_EEPROM
+       if (chip == CONFIG_SYS_SIMULATE_SPD_EEPROM) {
                /*
                 * Onboard spd eeprom requested -> simulate values
                 */
                return cfg_simulate_spd_eeprom[addr];
        }
-#endif /* CFG_SIMULATE_SPD_EEPROM */
+#endif /* CONFIG_SYS_SIMULATE_SPD_EEPROM */
 
        if (i2c_probe(chip) == 0) {
                if (i2c_read(chip, addr, 1, data, 1) == 0) {
@@ -460,9 +289,9 @@ unsigned char spd_read(uchar chip, uint addr)
        return 0;
 }
 
-void get_spd_info(unsigned long*   dimm_populated,
-                 unsigned char*   iic0_dimm_addr,
-                 unsigned long    num_dimm_banks)
+static void get_spd_info(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long dimm_found;
@@ -480,26 +309,22 @@ void get_spd_info(unsigned long*   dimm_populated,
                if ((num_of_bytes != 0) && (total_size != 0)) {
                        dimm_populated[dimm_num] = TRUE;
                        dimm_found = TRUE;
-#if 0
-                       printf("DIMM slot %lu: populated\n", dimm_num);
-#endif
+                       debug("DIMM slot %lu: populated\n", dimm_num);
                } else {
                        dimm_populated[dimm_num] = FALSE;
-#if 0
-                       printf("DIMM slot %lu: Not populated\n", dimm_num);
-#endif
+                       debug("DIMM slot %lu: Not populated\n", dimm_num);
                }
        }
 
        if (dimm_found == FALSE) {
                printf("ERROR - No memory installed. Install a DDR-SDRAM DIMM.\n\n");
-               hang();
+               spd_ddr_init_hang ();
        }
 }
 
-void check_mem_type(unsigned long*   dimm_populated,
-                   unsigned char*   iic0_dimm_addr,
-                   unsigned long    num_dimm_banks)
+static void check_mem_type(unsigned long *dimm_populated,
+                          unsigned char *iic0_dimm_addr,
+                          unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned char dimm_type;
@@ -509,26 +334,23 @@ void check_mem_type(unsigned long*   dimm_populated,
                        dimm_type = spd_read(iic0_dimm_addr[dimm_num], 2);
                        switch (dimm_type) {
                        case 7:
-#if 0
-                               printf("DIMM slot %lu: DDR SDRAM detected\n", dimm_num);
-#endif
+                               debug("DIMM slot %lu: DDR SDRAM detected\n", dimm_num);
                                break;
                        default:
                                printf("ERROR: Unsupported DIMM detected in slot %lu.\n",
                                       dimm_num);
                                printf("Only DDR SDRAM DIMMs are supported.\n");
                                printf("Replace the DIMM module with a supported DIMM.\n\n");
-                               hang();
+                               spd_ddr_init_hang ();
                                break;
                        }
                }
        }
 }
 
-
-void check_volt_type(unsigned long*   dimm_populated,
-                    unsigned char*   iic0_dimm_addr,
-                    unsigned long    num_dimm_banks)
+static void check_volt_type(unsigned long *dimm_populated,
+                           unsigned char *iic0_dimm_addr,
+                           unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long voltage_type;
@@ -539,20 +361,18 @@ void check_volt_type(unsigned long*   dimm_populated,
                        if (voltage_type != 0x04) {
                                printf("ERROR: DIMM %lu with unsupported voltage level.\n",
                                       dimm_num);
-                               hang();
+                               spd_ddr_init_hang ();
                        } else {
-#if 0
-                               printf("DIMM %lu voltage level supported.\n", dimm_num);
-#endif
+                               debug("DIMM %lu voltage level supported.\n", dimm_num);
                        }
                        break;
                }
        }
 }
 
-void program_cfg0(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_cfg0(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long cfg0;
@@ -612,7 +432,7 @@ void program_cfg0(unsigned long* dimm_populated,
                                printf("WARNING: DIMM with datawidth of %lu bits.\n",
                                       data_width);
                                printf("Only DIMMs with 32 or 64 bit datawidths supported.\n");
-                               hang();
+                               spd_ddr_init_hang ();
                        }
                        break;
                }
@@ -640,9 +460,9 @@ void program_cfg0(unsigned long* dimm_populated,
        mtsdram(mem_cfg0, cfg0);
 }
 
-void program_cfg1(unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_cfg1(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long cfg1;
        mfsdram(mem_cfg1, cfg1);
@@ -658,9 +478,9 @@ void program_cfg1(unsigned long* dimm_populated,
        mtsdram(mem_cfg1, cfg1);
 }
 
-void program_rtr (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_rtr(unsigned long *dimm_populated,
+                       unsigned char *iic0_dimm_addr,
+                       unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long bus_period_x_10;
@@ -668,7 +488,7 @@ void program_rtr (unsigned long* dimm_populated,
        unsigned char refresh_rate_type;
        unsigned long refresh_interval;
        unsigned long sdram_rtr;
-       PPC440_SYS_INFO sys_info;
+       PPC4xx_SYS_INFO sys_info;
 
        /*
         * get the board info
@@ -676,7 +496,6 @@ void program_rtr (unsigned long* dimm_populated,
        get_sys_info(&sys_info);
        bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
 
-
        for (dimm_num = 0;  dimm_num < num_dimm_banks; dimm_num++) {
                if (dimm_populated[dimm_num] == TRUE) {
                        refresh_rate_type = 0x7F & spd_read(iic0_dimm_addr[dimm_num], 12);
@@ -719,9 +538,9 @@ void program_rtr (unsigned long* dimm_populated,
        mtsdram(mem_rtr, sdram_rtr);
 }
 
-void program_tr0 (unsigned long* dimm_populated,
-                 unsigned char* iic0_dimm_addr,
-                 unsigned long  num_dimm_banks)
+static void program_tr0(unsigned long *dimm_populated,
+                        unsigned char *iic0_dimm_addr,
+                        unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long tr0;
@@ -745,7 +564,7 @@ void program_tr0 (unsigned long* dimm_populated,
        unsigned long tcyc_2_0_ns_x_10;
        unsigned long tcyc_reg;
        unsigned long bus_period_x_10;
-       PPC440_SYS_INFO sys_info;
+       PPC4xx_SYS_INFO sys_info;
        unsigned long residue;
 
        /*
@@ -801,7 +620,7 @@ void program_tr0 (unsigned long* dimm_populated,
                                if ((tcyc_reg & 0x0F) >= 10) {
                                        printf("ERROR: Tcyc incorrect for DIMM in slot %lu\n",
                                               dimm_num);
-                                       hang();
+                                       spd_ddr_init_hang ();
                                }
 
                                cycle_time_ns_x_10[cas_index] =
@@ -881,7 +700,7 @@ void program_tr0 (unsigned long* dimm_populated,
                printf("ERROR: No supported CAS latency with the installed DIMMs.\n");
                printf("Only CAS latencies of 2.0, 2.5, and 3.0 are supported.\n");
                printf("Make sure the PLB speed is within the supported range.\n");
-               hang();
+               spd_ddr_init_hang ();
        }
 
        /*
@@ -1001,13 +820,74 @@ void program_tr0 (unsigned long* dimm_populated,
                break;
        }
 
-#if 0
-       printf("tr0: %x\n", tr0);
-#endif
+       debug("tr0: %x\n", tr0);
        mtsdram(mem_tr0, tr0);
 }
 
-void program_tr1 (void)
+static int short_mem_test(void)
+{
+       unsigned long i, j;
+       unsigned long bxcr_num;
+       unsigned long *membase;
+       const unsigned long test[NUMMEMTESTS][NUMMEMWORDS] = {
+               {0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+                0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF},
+               {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+                0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},
+               {0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
+                0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555},
+               {0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
+                0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA},
+               {0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
+                0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A},
+               {0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
+                0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5},
+               {0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
+                0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA},
+               {0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
+                0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55}};
+
+       for (bxcr_num = 0; bxcr_num < MAXBXCR; bxcr_num++) {
+               mtdcr(SDRAM0_CFGADDR, mem_b0cr + (bxcr_num << 2));
+               if ((mfdcr(SDRAM0_CFGDATA) & SDRAM_BXCR_SDBE) == SDRAM_BXCR_SDBE) {
+                       /* Bank is enabled */
+                       membase = (unsigned long*)
+                               (mfdcr(SDRAM0_CFGDATA) & SDRAM_BXCR_SDBA_MASK);
+
+                       /*
+                        * Run the short memory test
+                        */
+                       for (i = 0; i < NUMMEMTESTS; i++) {
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       /* printf("bank enabled base:%x\n", &membase[j]); */
+                                       membase[j] = test[i][j];
+                                       ppcDcbf((unsigned long)&(membase[j]));
+                               }
+
+                               for (j = 0; j < NUMMEMWORDS; j++) {
+                                       if (membase[j] != test[i][j]) {
+                                               ppcDcbf((unsigned long)&(membase[j]));
+                                               return 0;
+                                       }
+                                       ppcDcbf((unsigned long)&(membase[j]));
+                               }
+
+                               if (j < NUMMEMWORDS)
+                                       return 0;
+                       }
+
+                       /*
+                        * see if the rdclt value passed
+                        */
+                       if (i < NUMMEMTESTS)
+                               return 0;
+               }
+       }
+
+       return 1;
+}
+
+static void program_tr1(void)
 {
        unsigned long tr0;
        unsigned long tr1;
@@ -1015,8 +895,7 @@ void program_tr1 (void)
        unsigned long ecc_temp;
        unsigned long dlycal;
        unsigned long dly_val;
-       unsigned long i, j, k;
-       unsigned long bxcr_num;
+       unsigned long k;
        unsigned long max_pass_length;
        unsigned long current_pass_length;
        unsigned long current_fail_length;
@@ -1029,8 +908,7 @@ void program_tr1 (void)
        unsigned char window_found;
        unsigned char fail_found;
        unsigned char pass_found;
-       unsigned long * membase;
-       PPC440_SYS_INFO sys_info;
+       PPC4xx_SYS_INFO sys_info;
 
        /*
         * get the board info
@@ -1079,55 +957,16 @@ void program_tr1 (void)
        window_found = FALSE;
        fail_found = FALSE;
        pass_found = FALSE;
-#ifdef DEBUG
-       printf("Starting memory test ");
-#endif
+       debug("Starting memory test ");
+
        for (k = 0; k < NUMHALFCYCLES; k++) {
-               for (rdclt = 0; rdclt < dly_val; rdclt++)  {
+               for (rdclt = 0; rdclt < dly_val; rdclt++) {
                        /*
                         * Set the timing reg for the test.
                         */
                        mtsdram(mem_tr1, (tr1 | SDRAM_TR1_RDCT_ENCODE(rdclt)));
 
-                       for (bxcr_num = 0; bxcr_num < MAXBXCR; bxcr_num++) {
-                               mtdcr(memcfga, mem_b0cr + (bxcr_num<<2));
-                               if ((mfdcr(memcfgd) & SDRAM_BXCR_SDBE) == SDRAM_BXCR_SDBE) {
-                                       /* Bank is enabled */
-                                       membase = (unsigned long*)
-                                               (mfdcr(memcfgd) & SDRAM_BXCR_SDBA_MASK);
-
-                                       /*
-                                        * Run the short memory test
-                                        */
-                                       for (i = 0; i < NUMMEMTESTS; i++) {
-                                               for (j = 0; j < NUMMEMWORDS; j++) {
-                                                       membase[j] = test[i][j];
-                                                       ppcDcbf((unsigned long)&(membase[j]));
-                                               }
-
-                                               for (j = 0; j < NUMMEMWORDS; j++) {
-                                                       if (membase[j] != test[i][j]) {
-                                                               ppcDcbf((unsigned long)&(membase[j]));
-                                                               break;
-                                                       }
-                                                       ppcDcbf((unsigned long)&(membase[j]));
-                                               }
-
-                                               if (j < NUMMEMWORDS) {
-                                                       break;
-                                               }
-                                       }
-
-                                       /*
-                                        * see if the rdclt value passed
-                                        */
-                                       if (i < NUMMEMTESTS) {
-                                               break;
-                                       }
-                               }
-                       }
-
-                       if (bxcr_num == MAXBXCR) {
+                       if (short_mem_test()) {
                                if (fail_found == TRUE) {
                                        pass_found = TRUE;
                                        if (current_pass_length == 0) {
@@ -1157,9 +996,8 @@ void program_tr1 (void)
                                }
                        }
                }
-#ifdef DEBUG
-               printf(".");
-#endif
+               debug(".");
+
                if (window_found == TRUE) {
                        break;
                }
@@ -1167,16 +1005,14 @@ void program_tr1 (void)
                tr1 = tr1 ^ SDRAM_TR1_RDCD_MASK;
                rdclt_offset += dly_val;
        }
-#ifdef DEBUG
-       printf("\n");
-#endif
+       debug("\n");
 
        /*
         * make sure we find the window
         */
        if (window_found == FALSE) {
                printf("ERROR: Cannot determine a common read delay.\n");
-               hang();
+               spd_ddr_init_hang ();
        }
 
        /*
@@ -1204,9 +1040,6 @@ void program_tr1 (void)
        }
 
        rdclt_average = ((max_start + max_end) >> 1);
-       if (rdclt_average >= 0x60)
-               while (1)
-                       ;
 
        if (rdclt_average < 0) {
                rdclt_average = 0;
@@ -1218,18 +1051,17 @@ void program_tr1 (void)
        }
        tr1 |= SDRAM_TR1_RDCT_ENCODE(rdclt_average);
 
-#if 0
-       printf("tr1: %x\n", tr1);
-#endif
+       debug("tr1: %x\n", tr1);
+
        /*
         * program SDRAM Timing Register 1 TR1
         */
        mtsdram(mem_tr1, tr1);
 }
 
-unsigned long program_bxcr(unsigned long* dimm_populated,
-                          unsigned char* iic0_dimm_addr,
-                          unsigned long  num_dimm_banks)
+static unsigned long program_bxcr(unsigned long *dimm_populated,
+                                 unsigned char *iic0_dimm_addr,
+                                 unsigned long num_dimm_banks)
 {
        unsigned long dimm_num;
        unsigned long bank_base_addr;
@@ -1254,16 +1086,16 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
         * Set the BxCR regs.  First, wipe out the bank config registers.
         */
        for (bx_cr_num = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
-               mtdcr(memcfga, mem_b0cr + (bx_cr_num << 2));
-               mtdcr(memcfgd, 0x00000000);
+               mtdcr(SDRAM0_CFGADDR, mem_b0cr + (bx_cr_num << 2));
+               mtdcr(SDRAM0_CFGDATA, 0x00000000);
                bank_parms[bx_cr_num].bank_size_bytes = 0;
        }
 
 #ifdef CONFIG_BAMBOO
        /*
         * This next section is hardware dependent and must be programmed
-        * to match the hardware.  For bammboo, the following holds...
-        * 1. SDRAM0_B0CR: Bank 0 of dimm 0 ctrl_bank_num : 0
+        * to match the hardware.  For bamboo, the following holds...
+        * 1. SDRAM0_B0CR: Bank 0 of dimm 0 ctrl_bank_num : 0 (soldered onboard)
         * 2. SDRAM0_B1CR: Bank 0 of dimm 1 ctrl_bank_num : 1
         * 3. SDRAM0_B2CR: Bank 1 of dimm 1 ctrl_bank_num : 1
         * 4. SDRAM0_B3CR: Bank 0 of dimm 2 ctrl_bank_num : 3
@@ -1273,16 +1105,18 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
        ctrl_bank_num[1] = 1;
        ctrl_bank_num[2] = 3;
 #else
+       /*
+        * Ocotea, Ebony and the other IBM/AMCC eval boards have
+        * 2 DIMM slots with each max 2 banks
+        */
        ctrl_bank_num[0] = 0;
-       ctrl_bank_num[1] = 1;
-       ctrl_bank_num[2] = 2;
-       ctrl_bank_num[3] = 3;
+       ctrl_bank_num[1] = 2;
 #endif
 
        /*
         * reset the bank_base address
         */
-       bank_base_addr = CFG_SDRAM_BASE;
+       bank_base_addr = CONFIG_SYS_SDRAM_BASE;
 
        for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
                if (dimm_populated[dimm_num] == TRUE) {
@@ -1290,6 +1124,8 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                        num_col_addr = spd_read(iic0_dimm_addr[dimm_num], 4);
                        num_banks    = spd_read(iic0_dimm_addr[dimm_num], 5);
                        bank_size_id = spd_read(iic0_dimm_addr[dimm_num], 31);
+                       debug("DIMM%d: row=%d col=%d banks=%d\n", dimm_num,
+                             num_row_addr, num_col_addr, num_banks);
 
                        /*
                         * Set the SDRAM0_BxCR regs
@@ -1323,7 +1159,7 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                                printf("ERROR: Unsupported value for the banksize: %d.\n",
                                       bank_size_id);
                                printf("Replace the DIMM module with a supported DIMM.\n\n");
-                               hang();
+                               spd_ddr_init_hang ();
                        }
 
                        switch (num_col_addr) {
@@ -1345,7 +1181,7 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                                printf("ERROR: Unsupported value for number of "
                                       "column addresses: %d.\n", num_col_addr);
                                printf("Replace the DIMM module with a supported DIMM.\n\n");
-                               hang();
+                               spd_ddr_init_hang ();
                        }
 
                        /*
@@ -1353,11 +1189,14 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
                         */
                        cr |= SDRAM_BXCR_SDBE;
 
-                       for (i = 0; i < num_banks; i++) {
-                               bank_parms[ctrl_bank_num[dimm_num]+i+dimm_num].bank_size_bytes =
-                                       (4 * 1024 * 1024) * bank_size_id;
-                               bank_parms[ctrl_bank_num[dimm_num]+i+dimm_num].cr = cr;
-                       }
+                       for (i = 0; i < num_banks; i++) {
+                               bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes =
+                                       (4 << 20) * bank_size_id;
+                               bank_parms[ctrl_bank_num[dimm_num]+i].cr = cr;
+                               debug("DIMM%d-bank %d (SDRAM0_B%dCR): bank_size_bytes=%d\n",
+                                     dimm_num, i, ctrl_bank_num[dimm_num]+i,
+                                     bank_parms[ctrl_bank_num[dimm_num]+i].bank_size_bytes);
+                       }
                }
        }
 
@@ -1393,57 +1232,17 @@ unsigned long program_bxcr(unsigned long* dimm_populated,
        /* Set the SDRAM0_BxCR regs thanks to sort tables */
        for (bx_cr_num = 0, bank_base_addr = 0; bx_cr_num < MAXBXCR; bx_cr_num++) {
                if (bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes) {
-                       mtdcr(memcfga, mem_b0cr + (sorted_bank_num[bx_cr_num] << 2));
-                       temp = mfdcr(memcfgd) & ~(SDRAM_BXCR_SDBA_MASK | SDRAM_BXCR_SDSZ_MASK |
+                       mtdcr(SDRAM0_CFGADDR, mem_b0cr + (sorted_bank_num[bx_cr_num] << 2));
+                       temp = mfdcr(SDRAM0_CFGDATA) & ~(SDRAM_BXCR_SDBA_MASK | SDRAM_BXCR_SDSZ_MASK |
                                                  SDRAM_BXCR_SDAM_MASK | SDRAM_BXCR_SDBE);
                        temp = temp | (bank_base_addr & SDRAM_BXCR_SDBA_MASK) |
                                bank_parms[sorted_bank_num[bx_cr_num]].cr;
-                       mtdcr(memcfgd, temp);
+                       mtdcr(SDRAM0_CFGDATA, temp);
                        bank_base_addr += bank_parms[sorted_bank_num[bx_cr_num]].bank_size_bytes;
+                       debug("SDRAM0_B%dCR=0x%08lx\n", sorted_bank_num[bx_cr_num], temp);
                }
        }
 
        return(bank_base_addr);
 }
-
-void program_ecc (unsigned long         num_bytes)
-{
-       unsigned long bank_base_addr;
-       unsigned long current_address;
-       unsigned long end_address;
-       unsigned long address_increment;
-       unsigned long cfg0;
-
-       /*
-        * get Memory Controller Options 0 data
-        */
-       mfsdram(mem_cfg0, cfg0);
-
-       /*
-        * reset the bank_base address
-        */
-       bank_base_addr = CFG_SDRAM_BASE;
-
-       if ((cfg0 & SDRAM_CFG0_MCHK_MASK) != SDRAM_CFG0_MCHK_NON) {
-               mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) |
-                       SDRAM_CFG0_MCHK_GEN);
-
-               if ((cfg0 & SDRAM_CFG0_DMWD_MASK) == SDRAM_CFG0_DMWD_32) {
-                       address_increment = 4;
-               } else {
-                       address_increment = 8;
-               }
-
-               current_address = (unsigned long)(bank_base_addr);
-               end_address = (unsigned long)(bank_base_addr) + num_bytes;
-
-               while (current_address < end_address) {
-                       *((unsigned long*)current_address) = 0x00000000;
-                       current_address += address_increment;
-               }
-
-               mtsdram(mem_cfg0, (cfg0 & ~SDRAM_CFG0_MCHK_MASK) |
-                       SDRAM_CFG0_MCHK_CHK);
-       }
-}
 #endif /* CONFIG_SPD_EEPROM */