Skip to content
Snippets Groups Projects
Commit f6b6c458 authored by Adam Graham's avatar Adam Graham Committed by Stefan Roese
Browse files

ppc4xx: Update Kilauea to use PPC4xx DDR autocalibration routines


Signed-off-by: default avatarAdam Graham <agraham@amcc.com>
Signed-off-by: default avatarStefan Roese <sr@denx.de>
parent 075d0b81
No related branches found
No related tags found
No related merge requests found
...@@ -60,8 +60,6 @@ ...@@ -60,8 +60,6 @@
"SDRAM_" #mnemonic, SDRAM_##mnemonic, data); \ "SDRAM_" #mnemonic, SDRAM_##mnemonic, data); \
} while (0) } while (0)
static inline void ppc4xx_ibm_ddr2_register_dump(void);
#if defined(CONFIG_SPD_EEPROM) #if defined(CONFIG_SPD_EEPROM)
/*-----------------------------------------------------------------------------+ /*-----------------------------------------------------------------------------+
...@@ -260,62 +258,19 @@ static void program_ecc_addr(unsigned long start_address, ...@@ -260,62 +258,19 @@ static void program_ecc_addr(unsigned long start_address,
unsigned long num_bytes, unsigned long num_bytes,
unsigned long tlb_word2_i_value); unsigned long tlb_word2_i_value);
#endif #endif
#if !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
static void program_DQS_calibration(unsigned long *dimm_populated, static void program_DQS_calibration(unsigned long *dimm_populated,
unsigned char *iic0_dimm_addr, unsigned char *iic0_dimm_addr,
unsigned long num_dimm_banks); unsigned long num_dimm_banks);
#ifdef HARD_CODED_DQS /* calibration test with hardvalues */ #ifdef HARD_CODED_DQS /* calibration test with hardvalues */
static void test(void); static void test(void);
#else #else
static void DQS_calibration_process(void); static void DQS_calibration_process(void);
#endif #endif
#endif
int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
void dcbz_area(u32 start_address, u32 num_bytes); void dcbz_area(u32 start_address, u32 num_bytes);
static u32 mfdcr_any(u32 dcr)
{
u32 val;
switch (dcr) {
case SDRAM_R0BAS + 0:
val = mfdcr(SDRAM_R0BAS + 0);
break;
case SDRAM_R0BAS + 1:
val = mfdcr(SDRAM_R0BAS + 1);
break;
case SDRAM_R0BAS + 2:
val = mfdcr(SDRAM_R0BAS + 2);
break;
case SDRAM_R0BAS + 3:
val = mfdcr(SDRAM_R0BAS + 3);
break;
default:
printf("DCR %d not defined in case statement!!!\n", dcr);
val = 0; /* just to satisfy the compiler */
}
return val;
}
static void mtdcr_any(u32 dcr, u32 val)
{
switch (dcr) {
case SDRAM_R0BAS + 0:
mtdcr(SDRAM_R0BAS + 0, val);
break;
case SDRAM_R0BAS + 1:
mtdcr(SDRAM_R0BAS + 1, val);
break;
case SDRAM_R0BAS + 2:
mtdcr(SDRAM_R0BAS + 2, val);
break;
case SDRAM_R0BAS + 3:
mtdcr(SDRAM_R0BAS + 3, val);
break;
default:
printf("DCR %d not defined in case statement!!!\n", dcr);
}
}
static unsigned char spd_read(uchar chip, uint addr) static unsigned char spd_read(uchar chip, uint addr)
{ {
unsigned char data[2]; unsigned char data[2];
...@@ -609,7 +564,11 @@ phys_size_t initdram(int board_type) ...@@ -609,7 +564,11 @@ phys_size_t initdram(int board_type)
/*------------------------------------------------------------------ /*------------------------------------------------------------------
* DQS calibration. * DQS calibration.
*-----------------------------------------------------------------*/ *-----------------------------------------------------------------*/
#if defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
DQS_autocalibration();
#else
program_DQS_calibration(dimm_populated, iic0_dimm_addr, num_dimm_banks); program_DQS_calibration(dimm_populated, iic0_dimm_addr, num_dimm_banks);
#endif
#ifdef CONFIG_DDR_ECC #ifdef CONFIG_DDR_ECC
/*------------------------------------------------------------------ /*------------------------------------------------------------------
...@@ -2329,18 +2288,6 @@ static unsigned long is_ecc_enabled(void) ...@@ -2329,18 +2288,6 @@ static unsigned long is_ecc_enabled(void)
return ecc; return ecc;
} }
static void blank_string(int size)
{
int i;
for (i=0; i<size; i++)
putc('\b');
for (i=0; i<size; i++)
putc(' ');
for (i=0; i<size; i++)
putc('\b');
}
#ifdef CONFIG_DDR_ECC #ifdef CONFIG_DDR_ECC
/*-----------------------------------------------------------------------------+ /*-----------------------------------------------------------------------------+
* program_ecc. * program_ecc.
...@@ -2468,6 +2415,7 @@ static void program_ecc_addr(unsigned long start_address, ...@@ -2468,6 +2415,7 @@ static void program_ecc_addr(unsigned long start_address,
} }
#endif #endif
#if !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
/*-----------------------------------------------------------------------------+ /*-----------------------------------------------------------------------------+
* program_DQS_calibration. * program_DQS_calibration.
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
...@@ -3001,7 +2949,8 @@ static void test(void) ...@@ -3001,7 +2949,8 @@ static void test(void)
(ppcMfdcr_sdram(SDRAM_MCOPT1) & ~SDRAM_MCOPT1_MCHK_MASK) (ppcMfdcr_sdram(SDRAM_MCOPT1) & ~SDRAM_MCOPT1_MCHK_MASK)
| ecc_temp); | ecc_temp);
} }
#endif #endif /* !HARD_CODED_DQS */
#endif /* !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION) */
#else /* CONFIG_SPD_EEPROM */ #else /* CONFIG_SPD_EEPROM */
...@@ -3104,9 +3053,12 @@ phys_size_t initdram(int board_type) ...@@ -3104,9 +3053,12 @@ phys_size_t initdram(int board_type)
/* Set Delay Control Registers */ /* Set Delay Control Registers */
mtsdram(SDRAM_DLCR, CFG_SDRAM0_DLCR); mtsdram(SDRAM_DLCR, CFG_SDRAM0_DLCR);
#if !defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
mtsdram(SDRAM_RDCC, CFG_SDRAM0_RDCC); mtsdram(SDRAM_RDCC, CFG_SDRAM0_RDCC);
mtsdram(SDRAM_RQDC, CFG_SDRAM0_RQDC); mtsdram(SDRAM_RQDC, CFG_SDRAM0_RQDC);
mtsdram(SDRAM_RFDC, CFG_SDRAM0_RFDC); mtsdram(SDRAM_RFDC, CFG_SDRAM0_RFDC);
#endif /* !CONFIG_PPC4xx_DDR_AUTOCALIBRATION */
/* /*
* Enable Controller by SDRAM0_MCOPT2[DCEN] = 1: * Enable Controller by SDRAM0_MCOPT2[DCEN] = 1:
...@@ -3115,18 +3067,98 @@ phys_size_t initdram(int board_type) ...@@ -3115,18 +3067,98 @@ phys_size_t initdram(int board_type)
mfsdram(SDRAM_MCOPT2, val); mfsdram(SDRAM_MCOPT2, val);
mtsdram(SDRAM_MCOPT2, val | SDRAM_MCOPT2_DCEN_ENABLE); mtsdram(SDRAM_MCOPT2, val | SDRAM_MCOPT2_DCEN_ENABLE);
#if defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
/*------------------------------------------------------------------
| DQS calibration.
+-----------------------------------------------------------------*/
DQS_autocalibration();
#endif /* !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL) */
#endif /* CONFIG_PPC4xx_DDR_AUTOCALIBRATION */
#if defined(CONFIG_DDR_ECC) #if defined(CONFIG_DDR_ECC)
ecc_init(CFG_SDRAM_BASE, CFG_MBYTES_SDRAM << 20); ecc_init(CFG_SDRAM_BASE, CFG_MBYTES_SDRAM << 20);
#endif /* defined(CONFIG_DDR_ECC) */ #endif /* defined(CONFIG_DDR_ECC) */
ppc4xx_ibm_ddr2_register_dump(); ppc4xx_ibm_ddr2_register_dump();
#if defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
/*
* Clear potential errors resulting from auto-calibration.
* If not done, then we could get an interrupt later on when
* exceptions are enabled.
*/
set_mcsr(get_mcsr());
#endif /* CONFIG_PPC4xx_DDR_AUTOCALIBRATION */
#endif /* !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL) */ #endif /* !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL) */
return (CFG_MBYTES_SDRAM << 20); return (CFG_MBYTES_SDRAM << 20);
} }
#endif /* CONFIG_SPD_EEPROM */ #endif /* CONFIG_SPD_EEPROM */
static inline void ppc4xx_ibm_ddr2_register_dump(void) #if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
#if defined(CONFIG_440)
u32 mfdcr_any(u32 dcr)
{
u32 val;
switch (dcr) {
case SDRAM_R0BAS + 0:
val = mfdcr(SDRAM_R0BAS + 0);
break;
case SDRAM_R0BAS + 1:
val = mfdcr(SDRAM_R0BAS + 1);
break;
case SDRAM_R0BAS + 2:
val = mfdcr(SDRAM_R0BAS + 2);
break;
case SDRAM_R0BAS + 3:
val = mfdcr(SDRAM_R0BAS + 3);
break;
default:
printf("DCR %d not defined in case statement!!!\n", dcr);
val = 0; /* just to satisfy the compiler */
}
return val;
}
void mtdcr_any(u32 dcr, u32 val)
{
switch (dcr) {
case SDRAM_R0BAS + 0:
mtdcr(SDRAM_R0BAS + 0, val);
break;
case SDRAM_R0BAS + 1:
mtdcr(SDRAM_R0BAS + 1, val);
break;
case SDRAM_R0BAS + 2:
mtdcr(SDRAM_R0BAS + 2, val);
break;
case SDRAM_R0BAS + 3:
mtdcr(SDRAM_R0BAS + 3, val);
break;
default:
printf("DCR %d not defined in case statement!!!\n", dcr);
}
}
#endif /* defined(CONFIG_440) */
void blank_string(int size)
{
int i;
for (i = 0; i < size; i++)
putc('\b');
for (i = 0; i < size; i++)
putc(' ');
for (i = 0; i < size; i++)
putc('\b');
}
#endif /* !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL) */
inline void ppc4xx_ibm_ddr2_register_dump(void)
{ {
#if defined(DEBUG) #if defined(DEBUG)
printf("\nPPC4xx IBM DDR2 Register Dump:\n"); printf("\nPPC4xx IBM DDR2 Register Dump:\n");
......
...@@ -35,6 +35,9 @@ SOBJS += kgdb.o ...@@ -35,6 +35,9 @@ SOBJS += kgdb.o
COBJS := 40x_spd_sdram.o COBJS := 40x_spd_sdram.o
COBJS += 44x_spd_ddr.o COBJS += 44x_spd_ddr.o
COBJS += 44x_spd_ddr2.o COBJS += 44x_spd_ddr2.o
ifdef CONFIG_PPC4xx_DDR_AUTOCALIBRATION
COBJS += 4xx_ibm_ddr2_autocalib.o
endif
COBJS += 4xx_pci.o COBJS += 4xx_pci.o
COBJS += 4xx_pcie.o COBJS += 4xx_pcie.o
COBJS += bedbug_405.o COBJS += bedbug_405.o
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
/* /*
* SDRAM Controller * SDRAM Controller
*/ */
/* /*
* XXX - ToDo: Revisit file to change all these lower case defines into * XXX - ToDo: Revisit file to change all these lower case defines into
* upper case. Also needs to be done in the controller setup code too * upper case. Also needs to be done in the controller setup code too
...@@ -256,6 +257,7 @@ ...@@ -256,6 +257,7 @@
#define SDRAM_DLYCAL_DLCV_ENCODE(x) (((x)<<2) & SDRAM_DLYCAL_DLCV_MASK) #define SDRAM_DLYCAL_DLCV_ENCODE(x) (((x)<<2) & SDRAM_DLYCAL_DLCV_MASK)
#define SDRAM_DLYCAL_DLCV_DECODE(x) (((x) & SDRAM_DLYCAL_DLCV_MASK)>>2) #define SDRAM_DLYCAL_DLCV_DECODE(x) (((x) & SDRAM_DLYCAL_DLCV_MASK)>>2)
#if !defined(CONFIG_405EX)
/* /*
* Memory queue defines * Memory queue defines
*/ */
...@@ -293,7 +295,6 @@ ...@@ -293,7 +295,6 @@
#define SDRAM_PLBADDUHB (SDRAMQ_DCR_BASE+0x10) /* PLB base address upper 32 LL */ #define SDRAM_PLBADDUHB (SDRAMQ_DCR_BASE+0x10) /* PLB base address upper 32 LL */
#if !defined(CONFIG_405EX)
/* /*
* Memory Bank 0-7 configuration * Memory Bank 0-7 configuration
*/ */
......
...@@ -287,6 +287,27 @@ void pciinfo (int, int); ...@@ -287,6 +287,27 @@ void pciinfo (int, int);
#endif #endif
#endif #endif
/*
* Prototypes
*/
#if defined(CONFIG_SDRAM_PPC4xx_IBM_DDR2)
void blank_string(int);
inline void ppc4xx_ibm_ddr2_register_dump(void);
#if defined(CONFIG_440)
u32 mfdcr_any(u32);
void mtdcr_any(u32, u32);
#endif
#if defined(CONFIG_SPD_EEPROM)
u32 ddr_wrdtr(u32);
u32 ddr_clktr(u32);
void spd_ddr_init_hang(void);
#endif
#endif /* defined(CONFIG_SDRAM_PPC4xx_IBM_DDR2) */
#if defined(CONFIG_PPC4xx_DDR_AUTOCALIBRATION)
u32 DQS_autocalibration(void);
#endif /* CONFIG_PPC4xx_DDR_AUTOCALIBRATION */
int misc_init_f (void); int misc_init_f (void);
int misc_init_r (void); int misc_init_r (void);
......
...@@ -223,6 +223,22 @@ ...@@ -223,6 +223,22 @@
*----------------------------------------------------------------------*/ *----------------------------------------------------------------------*/
#define CFG_MBYTES_SDRAM (256) /* 256MB */ #define CFG_MBYTES_SDRAM (256) /* 256MB */
/*
* CONFIG_PPC4xx_DDR_AUTOCALIBRATION
*
* Note: DDR Autocalibration Method_A scans the full range of possible PPC4xx
* SDRAM Controller DDR autocalibration values and takes a lot longer
* to run than Method_B.
* (See the Method_A and Method_B algorithm discription in the file:
* cpu/ppc4xx/4xx_ibm_ddr2_autocalib.c)
* Define CONFIG_PPC4xx_DDR_METHOD_A to use DDR autocalibration Method_A
*
* DDR Autocalibration Method_B is the default.
*/
#define CONFIG_PPC4xx_DDR_AUTOCALIBRATION /* IBM DDR autocalibration */
#define DEBUG_PPC4xx_DDR_AUTOCALIBRATION /* dynamic DDR autocal debug */
#undef CONFIG_PPC4xx_DDR_METHOD_A
#define CFG_SDRAM0_MB0CF_BASE (( 0 << 20) + CFG_SDRAM_BASE) #define CFG_SDRAM0_MB0CF_BASE (( 0 << 20) + CFG_SDRAM_BASE)
/* DDR1/2 SDRAM Device Control Register Data Values */ /* DDR1/2 SDRAM Device Control Register Data Values */
...@@ -386,6 +402,9 @@ ...@@ -386,6 +402,9 @@
#define CONFIG_HAS_ETH1 1 /* add support for "eth1addr" */ #define CONFIG_HAS_ETH1 1 /* add support for "eth1addr" */
#define CONFIG_PHY1_ADDR 2 #define CONFIG_PHY1_ADDR 2
/* Debug messages for the DDR autocalibration */
#define CONFIG_AUTOCALIB "silent\0" /* default is non-verbose */
/* /*
* Default environment variables * Default environment variables
*/ */
......
...@@ -2064,19 +2064,6 @@ ...@@ -2064,19 +2064,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
static inline u32 get_mcsr(void)
{
u32 val;
asm volatile("mfspr %0, 0x23c" : "=r" (val) :);
return val;
}
static inline void set_mcsr(u32 val)
{
asm volatile("mtspr 0x23c, %0" : "=r" (val) :);
}
#endif /* _ASMLANGUAGE */ #endif /* _ASMLANGUAGE */
#endif /* __PPC440_H__ */ #endif /* __PPC440_H__ */
...@@ -203,6 +203,19 @@ typedef struct ...@@ -203,6 +203,19 @@ typedef struct
unsigned long pllPlbDiv; unsigned long pllPlbDiv;
} PPC4xx_SYS_INFO; } PPC4xx_SYS_INFO;
static inline u32 get_mcsr(void)
{
u32 val;
asm volatile("mfspr %0, 0x23c" : "=r" (val) :);
return val;
}
static inline void set_mcsr(u32 val)
{
asm volatile("mtspr 0x23c, %0" : "=r" (val) :);
}
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __PPC4XX_H__ */ #endif /* __PPC4XX_H__ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment