/* * Copyright 2021 NXP * * SPDX-License-Identifier: BSD-3-Clause * */ #ifndef DDR_H #define DDR_H #include "ddr_io.h" #include "dimm.h" #include "immap.h" #ifndef DDRC_NUM_CS #define DDRC_NUM_CS 4 #endif /* * This is irrespective of what is the number of DDR controller, * number of DIMM used. This is set to maximum * Max controllers = 2 * Max num of DIMM per controlle = 2 * MAX NUM CS = 4 * Not to be changed. */ #define MAX_DDRC_NUM 2 #define MAX_DIMM_NUM 2 #define MAX_CS_NUM 4 #include "opts.h" #include "regs.h" #include "utility.h" #ifdef DDR_DEBUG #define debug(...) INFO(__VA_ARGS__) #else #define debug(...) VERBOSE(__VA_ARGS__) #endif #ifndef DDRC_NUM_DIMM #define DDRC_NUM_DIMM 1 #endif #define CONFIG_CS_PER_SLOT \ (DDRC_NUM_CS / DDRC_NUM_DIMM) /* Record of register values computed */ struct ddr_cfg_regs { struct { unsigned int bnds; unsigned int config; unsigned int config_2; } cs[MAX_CS_NUM]; unsigned int dec[10]; unsigned int timing_cfg[10]; unsigned int sdram_cfg[3]; unsigned int sdram_mode[16]; unsigned int md_cntl; unsigned int interval; unsigned int data_init; unsigned int clk_cntl; unsigned int init_addr; unsigned int init_ext_addr; unsigned int zq_cntl; unsigned int wrlvl_cntl[3]; unsigned int ddr_sr_cntr; unsigned int sdram_rcw[6]; unsigned int dq_map[4]; unsigned int eor; unsigned int cdr[2]; unsigned int err_disable; unsigned int err_int_en; unsigned int tx_cfg[4]; unsigned int debug[64]; }; struct ddr_conf { int dimm_in_use[MAX_DIMM_NUM]; int cs_in_use; /* bitmask, bit 0 for cs0, bit 1 for cs1, etc. */ int cs_on_dimm[MAX_DIMM_NUM]; /* bitmask */ unsigned long long cs_base_addr[MAX_CS_NUM]; unsigned long long cs_size[MAX_CS_NUM]; unsigned long long base_addr; unsigned long long total_mem; }; struct ddr_info { unsigned long clk; unsigned long long mem_base; unsigned int num_ctlrs; unsigned int dimm_on_ctlr; struct dimm_params dimm; struct memctl_opt opt; struct ddr_conf conf; struct ddr_cfg_regs ddr_reg; struct ccsr_ddr *ddr[MAX_DDRC_NUM]; uint16_t *phy[MAX_DDRC_NUM]; int *spd_addr; unsigned int ip_rev; uintptr_t phy_gen2_fw_img_buf; void *img_loadr; int warm_boot_flag; }; struct rc_timing { unsigned int speed_bin; unsigned int clk_adj; unsigned int wrlvl; }; struct board_timing { unsigned int rc; struct rc_timing const *p; unsigned int add1; unsigned int add2; }; enum warm_boot { DDR_COLD_BOOT = 0, DDR_WARM_BOOT = 1, DDR_WRM_BOOT_NT_SUPPORTED = -1, }; int disable_unused_ddrc(struct ddr_info *priv, int mask, uintptr_t nxp_ccn_hn_f0_addr); int ddr_board_options(struct ddr_info *priv); int compute_ddrc(const unsigned long clk, const struct memctl_opt *popts, const struct ddr_conf *conf, struct ddr_cfg_regs *ddr, const struct dimm_params *dimm_params, const unsigned int ip_rev); int compute_ddr_phy(struct ddr_info *priv); int ddrc_set_regs(const unsigned long clk, const struct ddr_cfg_regs *regs, const struct ccsr_ddr *ddr, int twopass); int cal_board_params(struct ddr_info *priv, const struct board_timing *dimm, int len); /* return bit mask of used DIMM(s) */ int ddr_get_ddr_params(struct dimm_params *pdimm, struct ddr_conf *conf); long long dram_init(struct ddr_info *priv #if defined(NXP_HAS_CCN504) || defined(NXP_HAS_CCN508) , uintptr_t nxp_ccn_hn_f0_addr #endif ); long long board_static_ddr(struct ddr_info *info); #endif /* DDR_H */