]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
Merge with /home/wd/git/u-boot/custodian/u-boot-ppc4xx
authorWolfgang Denk <wd@pollux.denx.de>
Thu, 8 Mar 2007 10:38:58 +0000 (11:38 +0100)
committerWolfgang Denk <wd@denx.de>
Thu, 8 Mar 2007 10:38:58 +0000 (11:38 +0100)
1  2 
cpu/ppc4xx/44x_spd_ddr2.c
cpu/ppc4xx/start.S
include/ppc440.h

index 3ab050f9f735e872865a9efef985a8e0a7ae8a4c,c4da739607cc6154d1a323f4263e5d203be4fe2c..83c991116f81a843f6eb4ea214ed06ab194221c6
@@@ -168,8 -168,8 +168,8 @@@ static void program_codt(unsigned long 
  static void program_mode(unsigned long *dimm_populated,
                         unsigned char *iic0_dimm_addr,
                         unsigned long num_dimm_banks,
 -                         ddr_cas_id_t *selected_cas,
 -                         int *write_recovery);
 +                       ddr_cas_id_t *selected_cas,
 +                       int *write_recovery);
  static void program_tr(unsigned long *dimm_populated,
                       unsigned char *iic0_dimm_addr,
                       unsigned long num_dimm_banks);
@@@ -185,9 -185,10 +185,10 @@@ static void program_copt1(unsigned lon
  static void program_initplr(unsigned long *dimm_populated,
                            unsigned char *iic0_dimm_addr,
                            unsigned long num_dimm_banks,
 -                            ddr_cas_id_t selected_cas,
 +                          ddr_cas_id_t selected_cas,
                            int write_recovery);
  static unsigned long is_ecc_enabled(void);
+ #ifdef CONFIG_DDR_ECC
  static void program_ecc(unsigned long *dimm_populated,
                        unsigned char *iic0_dimm_addr,
                        unsigned long num_dimm_banks,
  static void program_ecc_addr(unsigned long start_address,
                             unsigned long num_bytes,
                             unsigned long tlb_word2_i_value);
+ #endif
  static void program_DQS_calibration(unsigned long *dimm_populated,
                                    unsigned char *iic0_dimm_addr,
                                    unsigned long num_dimm_banks);
@@@ -255,15 -257,6 +257,6 @@@ static void mtdcr_any(u32 dcr, u32 val
        }
  }
  
- static void wait_ddr_idle(void)
- {
-       u32 val;
-       do {
-               mfsdram(SDRAM_MCSTAT, val);
-       } while ((val & SDRAM_MCSTAT_IDLE_MASK) == SDRAM_MCSTAT_IDLE_NOT);
- }
  static unsigned char spd_read(uchar chip, uint addr)
  {
        unsigned char data[2];
@@@ -491,7 -484,7 +484,7 @@@ long int initdram(int board_type
                (val & ~(SDRAM_MEMODE_DIC_MASK  | SDRAM_MEMODE_DLL_MASK |
                         SDRAM_MEMODE_RTT_MASK | SDRAM_MEMODE_DQS_MASK)) |
                (SDRAM_MEMODE_DIC_NORMAL | SDRAM_MEMODE_DLL_ENABLE
-                | SDRAM_MEMODE_RTT_75OHM | SDRAM_MEMODE_DQS_ENABLE));
+                | SDRAM_MEMODE_RTT_150OHM | SDRAM_MEMODE_DQS_ENABLE));
  
        /*------------------------------------------------------------------
         * Program Initialization preload registers.
         *-----------------------------------------------------------------*/
        program_DQS_calibration(dimm_populated, iic0_dimm_addr, num_dimm_banks);
  
+ #ifdef CONFIG_DDR_ECC
        /*------------------------------------------------------------------
         * If ecc is enabled, initialize the parity bits.
         *-----------------------------------------------------------------*/
        program_ecc(dimm_populated, iic0_dimm_addr, num_dimm_banks, MY_TLB_WORD2_I_ENABLE);
+ #endif
  
  #ifdef DEBUG
        ppc440sp_sdram_register_dump();
@@@ -702,7 -697,7 +697,7 @@@ static void check_frequency(unsigned lo
         *-----------------------------------------------------------------*/
        get_sys_info(&board_cfg);
  
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
  
        /*
@@@ -877,7 -872,11 +872,11 @@@ static void program_copt1(unsigned lon
        unsigned long ddrtype;
        unsigned long val;
  
+ #ifdef CONFIG_DDR_ECC
        ecc_enabled = TRUE;
+ #else
+       ecc_enabled = FALSE;
+ #endif
        dimm_32bit = FALSE;
        dimm_64bit = FALSE;
        buf0 = FALSE;
@@@ -1149,7 -1148,7 +1148,7 @@@ static void program_codt(unsigned long 
  static void program_initplr(unsigned long *dimm_populated,
                            unsigned char *iic0_dimm_addr,
                            unsigned long num_dimm_banks,
 -                            ddr_cas_id_t selected_cas,
 +                          ddr_cas_id_t selected_cas,
                            int write_recovery)
  {
        u32 cas = 0;
@@@ -1314,7 -1313,7 +1313,7 @@@ static void program_mode(unsigned long 
         *-----------------------------------------------------------------*/
        get_sys_info(&board_cfg);
  
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = MULDIV64((board_cfg.freqPLB), SDR0_DDR0_DDRM_DECODE(sdr_ddrpll), 1);
  
        /*------------------------------------------------------------------
        mfsdram(SDRAM_MMODE, mmode);
        mmode = mmode & ~(SDRAM_MMODE_WR_MASK | SDRAM_MMODE_DCL_MASK);
  
-       cycle_2_0_clk = MULDIV64(ONE_BILLION, 100, max_2_0_tcyc_ns_x_100);
-       cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100);
-       cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100);
-       cycle_4_0_clk = MULDIV64(ONE_BILLION, 100, max_4_0_tcyc_ns_x_100);
-       cycle_5_0_clk = MULDIV64(ONE_BILLION, 100, max_5_0_tcyc_ns_x_100);
+       /* add 10 here because of rounding problems */
+       cycle_2_0_clk = MULDIV64(ONE_BILLION, 100, max_2_0_tcyc_ns_x_100) + 10;
+       cycle_2_5_clk = MULDIV64(ONE_BILLION, 100, max_2_5_tcyc_ns_x_100) + 10;
+       cycle_3_0_clk = MULDIV64(ONE_BILLION, 100, max_3_0_tcyc_ns_x_100) + 10;
+       cycle_4_0_clk = MULDIV64(ONE_BILLION, 100, max_4_0_tcyc_ns_x_100) + 10;
+       cycle_5_0_clk = MULDIV64(ONE_BILLION, 100, max_5_0_tcyc_ns_x_100) + 10;
  
        if (sdram_ddr1 == TRUE) { /* DDR1 */
                if ((cas_2_0_available == TRUE) && (sdram_freq <= cycle_2_0_clk)) {
                } else {
                        printf("ERROR: Cannot find a supported CAS latency with the installed DIMMs.\n");
                        printf("Only DIMMs DDR2 with CAS latencies of 3.0, 4.0, and 5.0 are supported.\n");
-                       printf("Make sure the PLB speed is within the supported range of the DIMMs.\n\n");
+                       printf("Make sure the PLB speed is within the supported range of the DIMMs.\n");
+                       printf("cas3=%d cas4=%d cas5=%d\n",
+                              cas_3_0_available, cas_4_0_available, cas_5_0_available);
+                       printf("sdram_freq=%d cycle3=%d cycle4=%d cycle5=%d\n\n",
+                              sdram_freq, cycle_3_0_clk, cycle_4_0_clk, cycle_5_0_clk);
                        hang();
                }
        }
@@@ -1575,7 -1579,7 +1579,7 @@@ static void program_rtr(unsigned long *
        /*------------------------------------------------------------------
         * Set the SDRAM Refresh Timing Register, SDRAM_RTR
         *-----------------------------------------------------------------*/
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
  
        max_refresh_rate = 0;
@@@ -1661,7 -1665,7 +1665,7 @@@ static void program_tr(unsigned long *d
         *-----------------------------------------------------------------*/
        get_sys_info(&board_cfg);
  
-       mfsdr(sdr_ddr0, sdr_ddrpll);
+       mfsdr(SDR0_DDR0, sdr_ddrpll);
        sdram_freq = ((board_cfg.freqPLB) * SDR0_DDR0_DDRM_DECODE(sdr_ddrpll));
  
        /*------------------------------------------------------------------
@@@ -2069,7 -2073,7 +2073,7 @@@ static void program_memory_queue(unsign
                         * Set the sizes
                         *-----------------------------------------------------------------*/
                        baseadd_size = 0;
-                       rank_size_bytes = 1024 * 1024 * rank_size_id;
+                       rank_size_bytes = 4 * 1024 * 1024 * rank_size_id;
                        switch (rank_size_id) {
                        case 0x02:
                                baseadd_size |= SDRAM_RXBAS_SDSZ_8;
  
                        for (i = 0; i < num_ranks; i++) {
                                mtdcr_any(rank_reg+i+dimm_num+bank_0_populated,
-                                         (rank_base_addr & SDRAM_RXBAS_SDBA_MASK) |
-                                         baseadd_size);
+                                         (SDRAM_RXBAS_SDBA_ENCODE(rank_base_addr) |
+                                          baseadd_size));
                                rank_base_addr += rank_size_bytes;
                        }
                }
@@@ -2130,9 -2134,10 +2134,10 @@@ static unsigned long is_ecc_enabled(voi
                ecc = max(ecc, SDRAM_MCOPT1_MCHK_CHK_DECODE(val));
        }
  
-       return(ecc);
+       return ecc;
  }
  
+ #ifdef CONFIG_DDR_ECC
  /*-----------------------------------------------------------------------------+
   * program_ecc.
   *-----------------------------------------------------------------------------*/
@@@ -2208,6 -2213,15 +2213,15 @@@ static void check_ecc(void
  }
  #endif
  
+ static void wait_ddr_idle(void)
+ {
+       u32 val;
+       do {
+               mfsdram(SDRAM_MCSTAT, val);
+       } while ((val & SDRAM_MCSTAT_IDLE_MASK) == SDRAM_MCSTAT_IDLE_NOT);
+ }
  /*-----------------------------------------------------------------------------+
   * program_ecc_addr.
   *-----------------------------------------------------------------------------*/
@@@ -2276,6 -2290,7 +2290,7 @@@ static void program_ecc_addr(unsigned l
  #endif
        }
  }
+ #endif
  
  /*-----------------------------------------------------------------------------+
   * program_DQS_calibration.
@@@ -2531,7 -2546,6 +2546,6 @@@ static void DQS_calibration_process(voi
                }
        }               /* for rffd */
  
        /*------------------------------------------------------------------
         * Set the average RFFD value
         *-----------------------------------------------------------------*/
diff --combined cpu/ppc4xx/start.S
index 6b2c170335910b159ad8eaec0d853f907ed202c6,1301cd26d8bfbee817f9d7f1e59017a9a35b00ff..54be37cf68204d97b1d24d3230ac17e0b18a3f71
@@@ -1361,7 -1361,7 +1361,7 @@@ ppcSync
  relocate_code:
  #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
      defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
-     defined(CONFIG_440SPE)
+     defined(CONFIG_440SP) || defined(CONFIG_440SPE)
        /*
         * On some 440er platforms the cache is enabled in the first TLB (Boot-CS)
         * to speed up the boot process. Now this cache needs to be disabled.
@@@ -1916,43 -1916,43 +1916,43 @@@ pll_wait
  /*----------------------------------------------------------------------------+
  | dcbz_area.
  +----------------------------------------------------------------------------*/
 -        function_prolog(dcbz_area)
 -        rlwinm. r5,r4,0,27,31
 -        rlwinm  r5,r4,27,5,31
 -        beq     ..d_ra2
 -        addi    r5,r5,0x0001
 +      function_prolog(dcbz_area)
 +      rlwinm. r5,r4,0,27,31
 +      rlwinm  r5,r4,27,5,31
 +      beq     ..d_ra2
 +      addi    r5,r5,0x0001
  ..d_ra2:mtctr   r5
  ..d_ag2:dcbz    r0,r3
 -        addi    r3,r3,32
 -        bdnz    ..d_ag2
 -        sync
 -        blr
 -        function_epilog(dcbz_area)
 +      addi    r3,r3,32
 +      bdnz    ..d_ag2
 +      sync
 +      blr
 +      function_epilog(dcbz_area)
  
  /*----------------------------------------------------------------------------+
  | dflush.  Assume 32K at vector address is cachable.
  +----------------------------------------------------------------------------*/
 -        function_prolog(dflush)
 -        mfmsr   r9
 -        rlwinm  r8,r9,0,15,13
 -        rlwinm  r8,r8,0,17,15
 -        mtmsr   r8
 -        addi    r3,r0,0x0000
 -        mtspr   dvlim,r3
 -        mfspr   r3,ivpr
 -        addi    r4,r0,1024
 -        mtctr   r4
 +      function_prolog(dflush)
 +      mfmsr   r9
 +      rlwinm  r8,r9,0,15,13
 +      rlwinm  r8,r8,0,17,15
 +      mtmsr   r8
 +      addi    r3,r0,0x0000
 +      mtspr   dvlim,r3
 +      mfspr   r3,ivpr
 +      addi    r4,r0,1024
 +      mtctr   r4
  ..dflush_loop:
 -        lwz     r6,0x0(r3)
 -        addi    r3,r3,32
 -        bdnz    ..dflush_loop
 -        addi    r3,r3,-32
 -        mtctr   r4
 +      lwz     r6,0x0(r3)
 +      addi    r3,r3,32
 +      bdnz    ..dflush_loop
 +      addi    r3,r3,-32
 +      mtctr   r4
  ..ag:   dcbf    r0,r3
 -        addi    r3,r3,-32
 -        bdnz    ..ag
 -        sync
 -        mtmsr   r9
 -        blr
 -        function_epilog(dflush)
 +      addi    r3,r3,-32
 +      bdnz    ..ag
 +      sync
 +      mtmsr   r9
 +      blr
 +      function_epilog(dflush)
  #endif /* CONFIG_440 */
diff --combined include/ppc440.h
index 25e338fb1076a88a9db1b9fa86613a4e9254f647,5fe407626b145622c9674332c8bc68096fb87d53..9b15c2c5653d7d031ba4d55708e7980bdb1fc4cf
  #define SDR0_PEGPLLSET1               0x000003A0      /* PE Pll LC Tank Setting1 */
  #define SDR0_PEGPLLSET2               0x000003A1      /* PE Pll LC Tank Setting2 */
  #define SDR0_PEGPLLSTS                0x000003A2      /* PE Pll LC Tank Status */
+ #endif /* CONFIG_440SPE */
  
+ #if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
  /*----------------------------------------------------------------------------+
  | SDRAM Controller
  +----------------------------------------------------------------------------*/
  /*-----------------------------------------------------------------------------+
  |  Memory Bank 0-7 configuration
  +-----------------------------------------------------------------------------*/
- #define SDRAM_RXBAS_SDBA_MASK         0xFF800000      /* Base address */
+ #if defined(CONFIG_440SPE)
+ #define SDRAM_RXBAS_SDBA_MASK         0xFFE00000      /* Base address */
  #define SDRAM_RXBAS_SDBA_ENCODE(n)    ((((unsigned long)(n))&0xFFE00000)>>2)
  #define SDRAM_RXBAS_SDBA_DECODE(n)    ((((unsigned long)(n))&0xFFE00000)<<2)
+ #endif /* CONFIG_440SPE */
+ #if defined(CONFIG_440SP)
+ #define SDRAM_RXBAS_SDBA_MASK         0xFF800000      /* Base address */
+ #define SDRAM_RXBAS_SDBA_ENCODE(n)    ((((unsigned long)(n))&0xFF800000))
+ #define SDRAM_RXBAS_SDBA_DECODE(n)    ((((unsigned long)(n))&0xFF800000))
+ #endif /* CONFIG_440SP */
  #define SDRAM_RXBAS_SDSZ_MASK         0x0000FFC0      /* Size         */
  #define SDRAM_RXBAS_SDSZ_ENCODE(n)    ((((unsigned long)(n))&0x3FF)<<6)
  #define SDRAM_RXBAS_SDSZ_DECODE(n)    ((((unsigned long)(n))>>6)&0x3FF)
  /*-----------------------------------------------------------------------------+
  |  SDR0 Bit Settings
  +-----------------------------------------------------------------------------*/
+ #if defined(CONFIG_440SP)
+ #define SDR0_SRST                     0x0200
+ #define SDR0_DDR0                     0x00E1
+ #define SDR0_DDR0_DPLLRST             0x80000000
+ #define SDR0_DDR0_DDRM_MASK           0x60000000
+ #define SDR0_DDR0_DDRM_DDR1           0x20000000
+ #define SDR0_DDR0_DDRM_DDR2           0x40000000
+ #define SDR0_DDR0_DDRM_ENCODE(n)      ((((unsigned long)(n))&0x03)<<29)
+ #define SDR0_DDR0_DDRM_DECODE(n)      ((((unsigned long)(n))>>29)&0x03)
+ #define SDR0_DDR0_TUNE_ENCODE(n)      ((((unsigned long)(n))&0x2FF)<<0)
+ #define SDR0_DDR0_TUNE_DECODE(n)      ((((unsigned long)(n))>>0)&0x2FF)
+ #endif
  #if defined(CONFIG_440SPE)
  #define SDR0_CP440                    0x0180
  #define SDR0_CP440_ERPN_MASK          0x30000000
@@@ -3293,26 -3316,26 +3316,26 @@@ typedef struct { unsigned long       add;    /* 
  /*
   * Macros for accessing the indirect EBC registers
   */
 -#define mtebc(reg, data)      { mtdcr(ebccfga,reg);mtdcr(ebccfgd,data); }
 -#define mfebc(reg, data)      { mtdcr(ebccfga,reg);data = mfdcr(ebccfgd); }
 +#define mtebc(reg, data)      do { mtdcr(ebccfga,reg);mtdcr(ebccfgd,data); } while (0)
 +#define mfebc(reg, data)      do { mtdcr(ebccfga,reg);data = mfdcr(ebccfgd); } while (0)
  
  /*
   * Macros for accessing the indirect SDRAM controller registers
   */
 -#define mtsdram(reg, data)    { mtdcr(memcfga,reg);mtdcr(memcfgd,data); }
 -#define mfsdram(reg, data)    { mtdcr(memcfga,reg);data = mfdcr(memcfgd); }
 +#define mtsdram(reg, data)    do { mtdcr(memcfga,reg);mtdcr(memcfgd,data); } while (0)
 +#define mfsdram(reg, data)    do { mtdcr(memcfga,reg);data = mfdcr(memcfgd); } while (0)
  
  /*
   * Macros for accessing the indirect clocking controller registers
   */
 -#define mtclk(reg, data)      { mtdcr(clkcfga,reg);mtdcr(clkcfgd,data); }
 -#define mfclk(reg, data)      { mtdcr(clkcfga,reg);data = mfdcr(clkcfgd); }
 +#define mtclk(reg, data)      do { mtdcr(clkcfga,reg);mtdcr(clkcfgd,data); } while (0)
 +#define mfclk(reg, data)      do { mtdcr(clkcfga,reg);data = mfdcr(clkcfgd); } while (0)
  
  /*
   * Macros for accessing the sdr controller registers
   */
 -#define mtsdr(reg, data)      { mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data); }
 -#define mfsdr(reg, data)      { mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd); }
 +#define mtsdr(reg, data)      do { mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data); } while (0)
 +#define mfsdr(reg, data)      do { mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd); } while (0)
  
  
  #ifndef __ASSEMBLY__