15614e71bSYork Sun /* 25614e71bSYork Sun * Copyright 2008-2011 Freescale Semiconductor, Inc. 35614e71bSYork Sun * 45614e71bSYork Sun * This program is free software; you can redistribute it and/or 55614e71bSYork Sun * modify it under the terms of the GNU General Public License 65614e71bSYork Sun * Version 2 as published by the Free Software Foundation. 75614e71bSYork Sun */ 85614e71bSYork Sun 95614e71bSYork Sun #ifndef FSL_DDR_MAIN_H 105614e71bSYork Sun #define FSL_DDR_MAIN_H 115614e71bSYork Sun 125614e71bSYork Sun #include <fsl_ddr_sdram.h> 135614e71bSYork Sun #include <fsl_ddr_dimm_params.h> 145614e71bSYork Sun 155614e71bSYork Sun #include <common_timing_params.h> 165614e71bSYork Sun 17*4e5b1bd0SYork Sun #ifdef CONFIG_SYS_FSL_DDR_LE 18*4e5b1bd0SYork Sun #define ddr_in32(a) in_le32(a) 19*4e5b1bd0SYork Sun #define ddr_out32(a, v) out_le32(a, v) 20*4e5b1bd0SYork Sun #else 21*4e5b1bd0SYork Sun #define ddr_in32(a) in_be32(a) 22*4e5b1bd0SYork Sun #define ddr_out32(a, v) out_be32(a, v) 23*4e5b1bd0SYork Sun #endif 24*4e5b1bd0SYork Sun 255614e71bSYork Sun #if defined(CONFIG_DDR_SPD) || defined(CONFIG_SPD_EEPROM) 265614e71bSYork Sun /* 275614e71bSYork Sun * Bind the main DDR setup driver's generic names 285614e71bSYork Sun * to this specific DDR technology. 295614e71bSYork Sun */ 305614e71bSYork Sun static __inline__ int 315614e71bSYork Sun compute_dimm_parameters(const generic_spd_eeprom_t *spd, 325614e71bSYork Sun dimm_params_t *pdimm, 335614e71bSYork Sun unsigned int dimm_number) 345614e71bSYork Sun { 355614e71bSYork Sun return ddr_compute_dimm_parameters(spd, pdimm, dimm_number); 365614e71bSYork Sun } 375614e71bSYork Sun #endif 385614e71bSYork Sun 395614e71bSYork Sun /* 405614e71bSYork Sun * Data Structures 415614e71bSYork Sun * 425614e71bSYork Sun * All data structures have to be on the stack 435614e71bSYork Sun */ 445614e71bSYork Sun #define CONFIG_SYS_NUM_DDR_CTLRS CONFIG_NUM_DDR_CONTROLLERS 455614e71bSYork Sun #define CONFIG_SYS_DIMM_SLOTS_PER_CTLR CONFIG_DIMM_SLOTS_PER_CTLR 465614e71bSYork Sun 475614e71bSYork Sun typedef struct { 485614e71bSYork Sun generic_spd_eeprom_t 495614e71bSYork Sun spd_installed_dimms[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_SYS_DIMM_SLOTS_PER_CTLR]; 505614e71bSYork Sun struct dimm_params_s 515614e71bSYork Sun dimm_params[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_SYS_DIMM_SLOTS_PER_CTLR]; 525614e71bSYork Sun memctl_options_t memctl_opts[CONFIG_SYS_NUM_DDR_CTLRS]; 535614e71bSYork Sun common_timing_params_t common_timing_params[CONFIG_SYS_NUM_DDR_CTLRS]; 545614e71bSYork Sun fsl_ddr_cfg_regs_t fsl_ddr_config_reg[CONFIG_SYS_NUM_DDR_CTLRS]; 555614e71bSYork Sun } fsl_ddr_info_t; 565614e71bSYork Sun 575614e71bSYork Sun /* Compute steps */ 585614e71bSYork Sun #define STEP_GET_SPD (1 << 0) 595614e71bSYork Sun #define STEP_COMPUTE_DIMM_PARMS (1 << 1) 605614e71bSYork Sun #define STEP_COMPUTE_COMMON_PARMS (1 << 2) 615614e71bSYork Sun #define STEP_GATHER_OPTS (1 << 3) 625614e71bSYork Sun #define STEP_ASSIGN_ADDRESSES (1 << 4) 635614e71bSYork Sun #define STEP_COMPUTE_REGS (1 << 5) 645614e71bSYork Sun #define STEP_PROGRAM_REGS (1 << 6) 655614e71bSYork Sun #define STEP_ALL 0xFFF 665614e71bSYork Sun 675614e71bSYork Sun unsigned long long 685614e71bSYork Sun fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step, 695614e71bSYork Sun unsigned int size_only); 705614e71bSYork Sun 715614e71bSYork Sun const char *step_to_string(unsigned int step); 725614e71bSYork Sun 735614e71bSYork Sun unsigned int compute_fsl_memctl_config_regs(const memctl_options_t *popts, 745614e71bSYork Sun fsl_ddr_cfg_regs_t *ddr, 755614e71bSYork Sun const common_timing_params_t *common_dimm, 765614e71bSYork Sun const dimm_params_t *dimm_parameters, 775614e71bSYork Sun unsigned int dbw_capacity_adjust, 785614e71bSYork Sun unsigned int size_only); 795614e71bSYork Sun unsigned int compute_lowest_common_dimm_parameters( 805614e71bSYork Sun const dimm_params_t *dimm_params, 815614e71bSYork Sun common_timing_params_t *outpdimm, 825614e71bSYork Sun unsigned int number_of_dimms); 835614e71bSYork Sun unsigned int populate_memctl_options(int all_dimms_registered, 845614e71bSYork Sun memctl_options_t *popts, 855614e71bSYork Sun dimm_params_t *pdimm, 865614e71bSYork Sun unsigned int ctrl_num); 875614e71bSYork Sun void check_interleaving_options(fsl_ddr_info_t *pinfo); 885614e71bSYork Sun 895614e71bSYork Sun unsigned int mclk_to_picos(unsigned int mclk); 905614e71bSYork Sun unsigned int get_memory_clk_period_ps(void); 915614e71bSYork Sun unsigned int picos_to_mclk(unsigned int picos); 925614e71bSYork Sun void fsl_ddr_set_lawbar( 935614e71bSYork Sun const common_timing_params_t *memctl_common_params, 945614e71bSYork Sun unsigned int memctl_interleaved, 955614e71bSYork Sun unsigned int ctrl_num); 965614e71bSYork Sun 975614e71bSYork Sun int fsl_ddr_interactive_env_var_exists(void); 985614e71bSYork Sun unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo, int var_is_set); 995614e71bSYork Sun void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd, 1005614e71bSYork Sun unsigned int ctrl_num); 1015614e71bSYork Sun 1025614e71bSYork Sun int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); 1035614e71bSYork Sun unsigned int check_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr); 104*4e5b1bd0SYork Sun void board_add_ram_info(int use_default); 1055614e71bSYork Sun 1065614e71bSYork Sun /* processor specific function */ 1075614e71bSYork Sun void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, 1085614e71bSYork Sun unsigned int ctrl_num, int step); 1095614e71bSYork Sun 1105614e71bSYork Sun /* board specific function */ 1115614e71bSYork Sun int fsl_ddr_get_dimm_params(dimm_params_t *pdimm, 1125614e71bSYork Sun unsigned int controller_number, 1135614e71bSYork Sun unsigned int dimm_number); 1145614e71bSYork Sun #endif 115