powerpc/8xxx: Add support for interactive DDR programming interface
PATCH v3 7/7 powerpc/8xxx: Add support for interactive DDR programming interface
Interactive DDR debugging provides a user interface to view and modify SPD, DIMM parameters, board options and DDR controller registers before DDR is initialized. With this feature, developers can fine-tune DDR for board bringup and other debugging without frequently having to reprogram the flash.
To enable this feature, define CONFIG_FSL_DDR_INTERACTIVE in board header file and set an environment variable to activate it. Syntax:
setenv ddr_interactive on
After reset, U-boot prompts before initializing DDR controllers FSL DDR>
The available commands are
print print SPD and intermediate computed data reset reboot machine recompute reload SPD and options to default and recompute regs edit modify spd, parameter, or option compute recompute registers from current next_step to end next_step shows current next_step help this message go program the memory controller and continue with u-boot
The first command should be "compute", which reads data from DIMM SPDs and board options, performs the calculation then stops before setting DDR controller. A user can use "print" and "edit" commands to view and modify anything. "Go" picks up from current step with any modification and compltes the calculation then enables the DDR controller to continue u-boot. "Recompute" does it over from fresh reading.
---
Change since v2:
Added CONFIG_FSL_DDR_INTERACTIVE in README.
README | 3 + arch/powerpc/cpu/mpc8xxx/ddr/Makefile | 3 +- arch/powerpc/cpu/mpc8xxx/ddr/ddr.h | 40 +- arch/powerpc/cpu/mpc8xxx/ddr/interactive.c | 1691 ++++++++++++++++++++++++++++ arch/powerpc/cpu/mpc8xxx/ddr/main.c | 9 +- doc/README.fsl-ddr | 18 + 6 files changed, 1747 insertions(+), 17 deletions(-) create mode 100644 arch/powerpc/cpu/mpc8xxx/ddr/interactive.c
README +3 -0
@@ -2952,6 +2952,9 @@ Low Level (hardware related) configuration options: parameters are extracted from datasheet and hard-coded into header files or board specific files. +- CONFIG_FSL_DDR_INTERACTIVE + Enable interactive DDR debugging. See doc/README.fsl-ddr. + - CONFIG_SYS_83XX_DDR_USES_CS0 Only for 83xx systems. If specified, then DDR should be configured using CS0 and CS1 instead of CS2 and CS3.
arch/powerpc/cpu/mpc8xxx/ddr/Makefile +2 -1
@@ -1,5 +1,5 @@ # -# Copyright 2008 Freescale Semiconductor, Inc. +# Copyright 2008-2011 Freescale Semiconductor, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License
@@ -30,6 +30,7 @@ COBJS-$(CONFIG_FSL_DDR2) += ddr2_dimm_params.o COBJS-$(CONFIG_FSL_DDR3) += ddr3_dimm_params.o endif +COBJS-$(CONFIG_FSL_DDR_INTERACTIVE) += interactive.o SRCS := $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
arch/powerpc/cpu/mpc8xxx/ddr/ddr.h +27 -13
@@ -56,32 +56,46 @@ typedef struct {#define STEP_PROGRAM_REGS (1 << 6)#define STEP_ALL 0xFFF -extern unsigned long long +unsigned long long fsl_ddr_compute (fsl_ddr_info_t *pinfo,unsigned int start_step,unsigned int size_only); -extern const char *step_to_string (unsigned int step); +const char *step_to_string (unsigned int step); -extern unsigned int -compute_fsl_memctl_config_regs (const memctl_options_t *popts, +unsigned int compute_fsl_memctl_config_regs (const memctl_options_t *popts,fsl_ddr_cfg_regs_t *ddr,const common_timing_params_t *common_dimm,const dimm_params_t *dimm_parameters,unsigned int dbw_capacity_adjust,unsigned int size_only); -extern unsigned int -compute_lowest_common_dimm_parameters (const dimm_params_t *dimm_params, -common_timing_params_t *outpdimm, -unsigned int number_of_dimms); -extern unsigned int populate_memctl_options (int all_DIMMs_registered, +unsigned int compute_lowest_common_dimm_parameters ( +const dimm_params_t *dimm_params, +common_timing_params_t *outpdimm, +unsigned int number_of_dimms); +unsigned int populate_memctl_options (int all_DIMMs_registered,memctl_options_t *popts,dimm_params_t *pdimm,unsigned int ctrl_num); -extern void check_interleaving_options (fsl_ddr_info_t *pinfo); +void check_interleaving_options (fsl_ddr_info_t *pinfo); -extern unsigned int mclk_to_picos (unsigned int mclk); -extern unsigned int get_memory_clk_period_ps (void ); -extern unsigned int picos_to_mclk (unsigned int picos); +unsigned int mclk_to_picos (unsigned int mclk); +unsigned int get_memory_clk_period_ps (void ); +unsigned int picos_to_mclk (unsigned int picos); +void fsl_ddr_set_lawbar ( +const common_timing_params_t *memctl_common_params, +unsigned int memctl_interleaved, +unsigned int ctrl_num); + +unsigned long long fsl_ddr_interactive (fsl_ddr_info_t *pinfo); +void fsl_ddr_get_spd (generic_spd_eeprom_t *ctrl_dimms_spd, +unsigned int ctrl_num); + +int do_reset (cmd_tbl_t *cmdtp,int flag,int argc,char *const argv[]); +unsigned int check_fsl_memctl_config_regs (const fsl_ddr_cfg_regs_t *ddr); + +/* processor specific function */ +void fsl_ddr_set_memctl_regs (const fsl_ddr_cfg_regs_t *regs, +unsigned int ctrl_num);/* board specific function */ int fsl_ddr_get_dimm_params(dimm_params_t *pdimm,
arch/powerpc/cpu/mpc8xxx/ddr/interactive.c new file +1691 -0
1,691 lines not on this page · raw message
arch/powerpc/cpu/mpc8xxx/ddr/main.c +6 -3
@@ -135,7 +135,6 @@ void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,* | interleaving */ -#ifdef DEBUG const char *step_string_tbl[] = {"STEP_GET_SPD" ,"STEP_COMPUTE_DIMM_PARMS" ,
@@ -156,7 +155,6 @@ const char * step_to_string(unsigned int step) {return step_string_tbl[s]; } -#endif int step_assign_addresses(fsl_ddr_info_t *pinfo, unsigned int dbw_cap_adj[],
@@ -499,7 +497,12 @@ phys_size_t fsl_ddr_sdram(void)memset (&info,0 ,sizeof (fsl_ddr_info_t));/* Compute it once normally. */ - total_memory =fsl_ddr_compute (&info,STEP_GET_SPD ,0 ); +#ifdef CONFIG_FSL_DDR_INTERACTIVE +if (getenv ("ddr_interactive" )) + total_memory =fsl_ddr_interactive (&info); + else +#endif + total_memory =fsl_ddr_compute (&info,STEP_GET_SPD ,0 );/* Check for memory controller interleaving. */ memctl_interleaved =0 ;
doc/README.fsl-ddr +18 -0
@@ -222,3 +222,21 @@ Single slot system Reference http://www.samsung.com/global/business/semiconductor/products/dram/downloads/applicationnote/ddr2_odt_control_200603.pdf + +Interactive DDR debugging +=========================== + +For DDR parameter tuning up and debugging, the interactive DDR debugging can +be activated by saving an environment variable "ddr_interactive". The value +doesn't matter. Once activated, U-boot prompts "FSL DDR>" before enabling DDR +controller. The available commands can be seen by typing "help". + +The example flow of using interactive debugging is +type command "compute" to calculate the parameters from the default +type command "print" with arguments to show SPD, options, registers +type command "edit" with arguments to change any if desired +type command "go" to continue calculation and enable DDR controller + +Note, check "next_step" to show the flow. For example, after editing registers, +DDR controller will be enabled with current setting without further +calculation.
Signature · 1 line
1.7.0.4
PATCH v3 7/7 powerpc/8xxx: Add support for interactive DDR programming interface
Quoted 7 lines · York Sun
doc/README.fsl-ddr +7
-0+Interactive DDR debugging +=========================== + +For DDR parameter tuning up and debugging, the interactive DDR debugging can +be activated by saving an environment variable "ddr_interactive". The value +doesn't matter. Once activated, U-boot prompts "FSL DDR>" before enabling DDR +controller. The available commands can be seen by typing "help".
doc/README.fsl-ddr Single slot system · line 242
Quoted 10 lines
doc/README.fsl-ddr +10
-0+ +The example flow of using interactive debugging is +type command "compute" to calculate the parameters from the default +type command "print" with arguments to show SPD, options, registers +type command "edit" with arguments to change any if desired +type command "go" to continue calculation and enable DDR controller + +Note, check "next_step" to show the flow. For example, after editing registers, +DDR controller will be enabled with current setting without further +calculation.
This is pretty skimpy for such a powerful feature. How about some examples and a detailed description of each command?
Signature · 2 lines
Timur Tabi Linux kernel developer at Freescale
PATCH v3 7/7 powerpc/8xxx: Add support for interactive DDR programming interface
Quoted 13 lines · Timur Tabi
Quoted 12 lines · York Sun
doc/README.fsl-ddr +12
-0+Interactive DDR debugging +=========================== + +For DDR parameter tuning up and debugging, the interactive DDR debugging can +be activated by saving an environment variable "ddr_interactive". The value +doesn't matter. Once activated, U-boot prompts "FSL DDR>" before enabling DDR +controller. The available commands can be seen by typing "help". + +The example flow of using interactive debugging is +type command "compute" to calculate the parameters from the default +type command "print" with arguments to show SPD, options, registers +type command "edit" with arguments to change any if desired
Quoted 9 lines
doc/README.fsl-ddr Single slot system · line 242
Quoted 5 lines
doc/README.fsl-ddr +5
-0+type command "go" to continue calculation and enable DDR controller + +Note, check "next_step" to show the flow. For example, after editing registers, +DDR controller will be enabled with current setting without further +calculation.This is pretty skimpy for such a powerful feature. How about some examples and a detailed description of each command?
I think the interactive command is self-explained. I can add some examples if needed. But I am afraid the example will be either too short or too long.
For example, I can add the following
First step, run "compute" command, it returns with the DIMM part number
FSL DDR>compute
Detected UDIMM UG51U6400N8SU-ACF
Second step, users can run 'print' command with arguments. Without argument, a help message will print out
FSL DDR>print
print [c<n>] [d<n>] [spd] [dimmparms] [commonparms] [opts] [addresses] [regs] FSL DDR>print dimmparms
DIMM parameters: Controller=0 DIMM=0
DIMM organization parameters:
module part name = UG51U6400N8SU-ACFrank_density = 2147483648 bytes (2048 megabytes)
capacity = 4294967296 bytes (4096 megabytes) burst_lengths_bitmask = 0Cbase_addresss = 0 (00000000 00000000)n_ranks = 2data_width = 64primary_sdram_width = 64ec_sdram_width = 0registered_dimm = 0n_row_addr = 15n_col_addr = 10edc_config = 0n_banks_per_sdram_device = 8tCKmin_X_ps = 1500tCKmin_X_minus_1_ps = 0tCKmin_X_minus_2_ps = 0tCKmax_ps = 0caslat_X = 960tAA_ps = 13125caslat_X_minus_1 = 0caslat_X_minus_2 = 0caslat_lowest_derated = 0tRCD_ps = 13125tRP_ps = 13125tRAS_ps = 36000tWR_ps = 15000tWTR_ps = 7500tRFC_ps = 160000tRRD_ps = 6000tRC_ps = 49125refresh_rate_ps = 7800000tIS_ps = 0tIH_ps = 0tDS_ps = 0tDH_ps = 0tRTP_ps = 7500tDQSQ_max_ps = 0tQHS_ps = 0
I can further show the examples of print/edit dimmparams, commonparams, opts, regs. It will be too long. It is not difficult to use the self-guided interface. Agree?
York
PATCH v3 7/7 powerpc/8xxx: Add support for interactive DDR programming interface
Quoted 1 line · York Sun
I think the interactive command is self-explained.
Why do people say things like that? If I say that it needs to be better documented, then obviously it isn't self-explanatory.
Quoted 6 lines
I can add some
examples if needed. But I am afraid the example will be either too short or too long.For example, I can add the following
Quoted 7 lines
First step, run "compute" command, it returns with the DIMM part number
FSL DDR>compute
Detected UDIMM UG51U6400N8SU-ACFSecond step, users can run 'print' command with arguments. Without argument, a help message will print out
This is not an example. This is a walk-through. An example shows how individual commands can be used, and what the output could look like.
Quoted 3 lines
I can further show the examples of print/edit dimmparams, commonparams, opts, regs. It will be too long. It is not difficult to use the self-guided interface. Agree?
How could it be too long? Is there not enough room on the git server to store a text file? This file could be 200KB is size, and that would be okay.
Signature · 2 lines
Timur Tabi Linux kernel developer at Freescale