15614e71bSYork Sun /* 234e026f9SYork Sun * Copyright 2008-2014 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 1234e026f9SYork Sun #include <fsl_ddrc_version.h> 135614e71bSYork Sun #include <fsl_ddr_sdram.h> 145614e71bSYork Sun #include <fsl_ddr_dimm_params.h> 155614e71bSYork Sun 165614e71bSYork Sun #include <common_timing_params.h> 175614e71bSYork Sun 18*1d71efbbSYork Sun #ifndef CONFIG_SYS_FSL_DDR_MAIN_NUM_CTRLS 19*1d71efbbSYork Sun /* All controllers are for main memory */ 20*1d71efbbSYork Sun #define CONFIG_SYS_FSL_DDR_MAIN_NUM_CTRLS CONFIG_NUM_DDR_CONTROLLERS 21*1d71efbbSYork Sun #endif 22*1d71efbbSYork Sun 234e5b1bd0SYork Sun #ifdef CONFIG_SYS_FSL_DDR_LE 244e5b1bd0SYork Sun #define ddr_in32(a) in_le32(a) 254e5b1bd0SYork Sun #define ddr_out32(a, v) out_le32(a, v) 264e5b1bd0SYork Sun #else 274e5b1bd0SYork Sun #define ddr_in32(a) in_be32(a) 284e5b1bd0SYork Sun #define ddr_out32(a, v) out_be32(a, v) 294e5b1bd0SYork Sun #endif 304e5b1bd0SYork Sun 3134e026f9SYork Sun #define _DDR_ADDR CONFIG_SYS_FSL_DDR_ADDR 3234e026f9SYork Sun 3334e026f9SYork Sun u32 fsl_ddr_get_version(void); 3434e026f9SYork Sun 355614e71bSYork Sun #if defined(CONFIG_DDR_SPD) || defined(CONFIG_SPD_EEPROM) 365614e71bSYork Sun /* 375614e71bSYork Sun * Bind the main DDR setup driver's generic names 385614e71bSYork Sun * to this specific DDR technology. 395614e71bSYork Sun */ 405614e71bSYork Sun static __inline__ int 415614e71bSYork Sun compute_dimm_parameters(const generic_spd_eeprom_t *spd, 425614e71bSYork Sun dimm_params_t *pdimm, 435614e71bSYork Sun unsigned int dimm_number) 445614e71bSYork Sun { 455614e71bSYork Sun return ddr_compute_dimm_parameters(spd, pdimm, dimm_number); 465614e71bSYork Sun } 475614e71bSYork Sun #endif 485614e71bSYork Sun 495614e71bSYork Sun /* 505614e71bSYork Sun * Data Structures 515614e71bSYork Sun * 525614e71bSYork Sun * All data structures have to be on the stack 535614e71bSYork Sun */ 545614e71bSYork Sun #define CONFIG_SYS_NUM_DDR_CTLRS CONFIG_NUM_DDR_CONTROLLERS 555614e71bSYork Sun #define CONFIG_SYS_DIMM_SLOTS_PER_CTLR CONFIG_DIMM_SLOTS_PER_CTLR 565614e71bSYork Sun 575614e71bSYork Sun typedef struct { 585614e71bSYork Sun generic_spd_eeprom_t 595614e71bSYork Sun spd_installed_dimms[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_SYS_DIMM_SLOTS_PER_CTLR]; 605614e71bSYork Sun struct dimm_params_s 615614e71bSYork Sun dimm_params[CONFIG_SYS_NUM_DDR_CTLRS][CONFIG_SYS_DIMM_SLOTS_PER_CTLR]; 625614e71bSYork Sun memctl_options_t memctl_opts[CONFIG_SYS_NUM_DDR_CTLRS]; 635614e71bSYork Sun common_timing_params_t common_timing_params[CONFIG_SYS_NUM_DDR_CTLRS]; 645614e71bSYork Sun fsl_ddr_cfg_regs_t fsl_ddr_config_reg[CONFIG_SYS_NUM_DDR_CTLRS]; 65*1d71efbbSYork Sun unsigned int first_ctrl; 66*1d71efbbSYork Sun unsigned int num_ctrls; 67*1d71efbbSYork Sun unsigned long long mem_base; 68*1d71efbbSYork Sun unsigned int dimm_slots_per_ctrl; 69*1d71efbbSYork Sun int (*board_need_mem_reset)(void); 70*1d71efbbSYork Sun void (*board_mem_reset)(void); 71*1d71efbbSYork Sun void (*board_mem_de_reset)(void); 725614e71bSYork Sun } fsl_ddr_info_t; 735614e71bSYork Sun 745614e71bSYork Sun /* Compute steps */ 755614e71bSYork Sun #define STEP_GET_SPD (1 << 0) 765614e71bSYork Sun #define STEP_COMPUTE_DIMM_PARMS (1 << 1) 775614e71bSYork Sun #define STEP_COMPUTE_COMMON_PARMS (1 << 2) 785614e71bSYork Sun #define STEP_GATHER_OPTS (1 << 3) 795614e71bSYork Sun #define STEP_ASSIGN_ADDRESSES (1 << 4) 805614e71bSYork Sun #define STEP_COMPUTE_REGS (1 << 5) 815614e71bSYork Sun #define STEP_PROGRAM_REGS (1 << 6) 825614e71bSYork Sun #define STEP_ALL 0xFFF 835614e71bSYork Sun 845614e71bSYork Sun unsigned long long 855614e71bSYork Sun fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step, 865614e71bSYork Sun unsigned int size_only); 875614e71bSYork Sun const char *step_to_string(unsigned int step); 885614e71bSYork Sun 895614e71bSYork Sun unsigned int compute_fsl_memctl_config_regs(const memctl_options_t *popts, 905614e71bSYork Sun fsl_ddr_cfg_regs_t *ddr, 915614e71bSYork Sun const common_timing_params_t *common_dimm, 925614e71bSYork Sun const dimm_params_t *dimm_parameters, 935614e71bSYork Sun unsigned int dbw_capacity_adjust, 945614e71bSYork Sun unsigned int size_only); 955614e71bSYork Sun unsigned int compute_lowest_common_dimm_parameters( 965614e71bSYork Sun const dimm_params_t *dimm_params, 975614e71bSYork Sun common_timing_params_t *outpdimm, 985614e71bSYork Sun unsigned int number_of_dimms); 995614e71bSYork Sun unsigned int populate_memctl_options(int all_dimms_registered, 1005614e71bSYork Sun memctl_options_t *popts, 1015614e71bSYork Sun dimm_params_t *pdimm, 1025614e71bSYork Sun unsigned int ctrl_num); 1035614e71bSYork Sun void check_interleaving_options(fsl_ddr_info_t *pinfo); 1045614e71bSYork Sun 1055614e71bSYork Sun unsigned int mclk_to_picos(unsigned int mclk); 1065614e71bSYork Sun unsigned int get_memory_clk_period_ps(void); 1075614e71bSYork Sun unsigned int picos_to_mclk(unsigned int picos); 1085614e71bSYork Sun void fsl_ddr_set_lawbar( 1095614e71bSYork Sun const common_timing_params_t *memctl_common_params, 1105614e71bSYork Sun unsigned int memctl_interleaved, 1115614e71bSYork Sun unsigned int ctrl_num); 1125614e71bSYork Sun 1135614e71bSYork Sun int fsl_ddr_interactive_env_var_exists(void); 1145614e71bSYork Sun unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo, int var_is_set); 1155614e71bSYork Sun void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd, 116*1d71efbbSYork Sun unsigned int ctrl_num, unsigned int dimm_slots_per_ctrl); 1175614e71bSYork Sun 1185614e71bSYork Sun int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); 1195614e71bSYork Sun unsigned int check_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr); 1204e5b1bd0SYork Sun void board_add_ram_info(int use_default); 1215614e71bSYork Sun 1225614e71bSYork Sun /* processor specific function */ 1235614e71bSYork Sun void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs, 1245614e71bSYork Sun unsigned int ctrl_num, int step); 1255614e71bSYork Sun 1265614e71bSYork Sun /* board specific function */ 1275614e71bSYork Sun int fsl_ddr_get_dimm_params(dimm_params_t *pdimm, 1285614e71bSYork Sun unsigned int controller_number, 1295614e71bSYork Sun unsigned int dimm_number); 1305614e71bSYork Sun #endif 131