1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright 2021 NXP 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #ifndef DDR_H 9*91f16700Schasinglulu #define DDR_H 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include "ddr_io.h" 12*91f16700Schasinglulu #include "dimm.h" 13*91f16700Schasinglulu #include "immap.h" 14*91f16700Schasinglulu 15*91f16700Schasinglulu #ifndef DDRC_NUM_CS 16*91f16700Schasinglulu #define DDRC_NUM_CS 4 17*91f16700Schasinglulu #endif 18*91f16700Schasinglulu 19*91f16700Schasinglulu /* 20*91f16700Schasinglulu * This is irrespective of what is the number of DDR controller, 21*91f16700Schasinglulu * number of DIMM used. This is set to maximum 22*91f16700Schasinglulu * Max controllers = 2 23*91f16700Schasinglulu * Max num of DIMM per controlle = 2 24*91f16700Schasinglulu * MAX NUM CS = 4 25*91f16700Schasinglulu * Not to be changed. 26*91f16700Schasinglulu */ 27*91f16700Schasinglulu #define MAX_DDRC_NUM 2 28*91f16700Schasinglulu #define MAX_DIMM_NUM 2 29*91f16700Schasinglulu #define MAX_CS_NUM 4 30*91f16700Schasinglulu 31*91f16700Schasinglulu #include "opts.h" 32*91f16700Schasinglulu #include "regs.h" 33*91f16700Schasinglulu #include "utility.h" 34*91f16700Schasinglulu 35*91f16700Schasinglulu #ifdef DDR_DEBUG 36*91f16700Schasinglulu #define debug(...) INFO(__VA_ARGS__) 37*91f16700Schasinglulu #else 38*91f16700Schasinglulu #define debug(...) VERBOSE(__VA_ARGS__) 39*91f16700Schasinglulu #endif 40*91f16700Schasinglulu 41*91f16700Schasinglulu #ifndef DDRC_NUM_DIMM 42*91f16700Schasinglulu #define DDRC_NUM_DIMM 1 43*91f16700Schasinglulu #endif 44*91f16700Schasinglulu 45*91f16700Schasinglulu #define CONFIG_CS_PER_SLOT \ 46*91f16700Schasinglulu (DDRC_NUM_CS / DDRC_NUM_DIMM) 47*91f16700Schasinglulu 48*91f16700Schasinglulu /* Record of register values computed */ 49*91f16700Schasinglulu struct ddr_cfg_regs { 50*91f16700Schasinglulu struct { 51*91f16700Schasinglulu unsigned int bnds; 52*91f16700Schasinglulu unsigned int config; 53*91f16700Schasinglulu unsigned int config_2; 54*91f16700Schasinglulu } cs[MAX_CS_NUM]; 55*91f16700Schasinglulu unsigned int dec[10]; 56*91f16700Schasinglulu unsigned int timing_cfg[10]; 57*91f16700Schasinglulu unsigned int sdram_cfg[3]; 58*91f16700Schasinglulu unsigned int sdram_mode[16]; 59*91f16700Schasinglulu unsigned int md_cntl; 60*91f16700Schasinglulu unsigned int interval; 61*91f16700Schasinglulu unsigned int data_init; 62*91f16700Schasinglulu unsigned int clk_cntl; 63*91f16700Schasinglulu unsigned int init_addr; 64*91f16700Schasinglulu unsigned int init_ext_addr; 65*91f16700Schasinglulu unsigned int zq_cntl; 66*91f16700Schasinglulu unsigned int wrlvl_cntl[3]; 67*91f16700Schasinglulu unsigned int ddr_sr_cntr; 68*91f16700Schasinglulu unsigned int sdram_rcw[6]; 69*91f16700Schasinglulu unsigned int dq_map[4]; 70*91f16700Schasinglulu unsigned int eor; 71*91f16700Schasinglulu unsigned int cdr[2]; 72*91f16700Schasinglulu unsigned int err_disable; 73*91f16700Schasinglulu unsigned int err_int_en; 74*91f16700Schasinglulu unsigned int tx_cfg[4]; 75*91f16700Schasinglulu unsigned int debug[64]; 76*91f16700Schasinglulu }; 77*91f16700Schasinglulu 78*91f16700Schasinglulu struct ddr_conf { 79*91f16700Schasinglulu int dimm_in_use[MAX_DIMM_NUM]; 80*91f16700Schasinglulu int cs_in_use; /* bitmask, bit 0 for cs0, bit 1 for cs1, etc. */ 81*91f16700Schasinglulu int cs_on_dimm[MAX_DIMM_NUM]; /* bitmask */ 82*91f16700Schasinglulu unsigned long long cs_base_addr[MAX_CS_NUM]; 83*91f16700Schasinglulu unsigned long long cs_size[MAX_CS_NUM]; 84*91f16700Schasinglulu unsigned long long base_addr; 85*91f16700Schasinglulu unsigned long long total_mem; 86*91f16700Schasinglulu }; 87*91f16700Schasinglulu 88*91f16700Schasinglulu struct ddr_info { 89*91f16700Schasinglulu unsigned long clk; 90*91f16700Schasinglulu unsigned long long mem_base; 91*91f16700Schasinglulu unsigned int num_ctlrs; 92*91f16700Schasinglulu unsigned int dimm_on_ctlr; 93*91f16700Schasinglulu struct dimm_params dimm; 94*91f16700Schasinglulu struct memctl_opt opt; 95*91f16700Schasinglulu struct ddr_conf conf; 96*91f16700Schasinglulu struct ddr_cfg_regs ddr_reg; 97*91f16700Schasinglulu struct ccsr_ddr *ddr[MAX_DDRC_NUM]; 98*91f16700Schasinglulu uint16_t *phy[MAX_DDRC_NUM]; 99*91f16700Schasinglulu int *spd_addr; 100*91f16700Schasinglulu unsigned int ip_rev; 101*91f16700Schasinglulu uintptr_t phy_gen2_fw_img_buf; 102*91f16700Schasinglulu void *img_loadr; 103*91f16700Schasinglulu int warm_boot_flag; 104*91f16700Schasinglulu }; 105*91f16700Schasinglulu 106*91f16700Schasinglulu struct rc_timing { 107*91f16700Schasinglulu unsigned int speed_bin; 108*91f16700Schasinglulu unsigned int clk_adj; 109*91f16700Schasinglulu unsigned int wrlvl; 110*91f16700Schasinglulu }; 111*91f16700Schasinglulu 112*91f16700Schasinglulu struct board_timing { 113*91f16700Schasinglulu unsigned int rc; 114*91f16700Schasinglulu struct rc_timing const *p; 115*91f16700Schasinglulu unsigned int add1; 116*91f16700Schasinglulu unsigned int add2; 117*91f16700Schasinglulu }; 118*91f16700Schasinglulu 119*91f16700Schasinglulu enum warm_boot { 120*91f16700Schasinglulu DDR_COLD_BOOT = 0, 121*91f16700Schasinglulu DDR_WARM_BOOT = 1, 122*91f16700Schasinglulu DDR_WRM_BOOT_NT_SUPPORTED = -1, 123*91f16700Schasinglulu }; 124*91f16700Schasinglulu 125*91f16700Schasinglulu int disable_unused_ddrc(struct ddr_info *priv, int mask, 126*91f16700Schasinglulu uintptr_t nxp_ccn_hn_f0_addr); 127*91f16700Schasinglulu int ddr_board_options(struct ddr_info *priv); 128*91f16700Schasinglulu int compute_ddrc(const unsigned long clk, 129*91f16700Schasinglulu const struct memctl_opt *popts, 130*91f16700Schasinglulu const struct ddr_conf *conf, 131*91f16700Schasinglulu struct ddr_cfg_regs *ddr, 132*91f16700Schasinglulu const struct dimm_params *dimm_params, 133*91f16700Schasinglulu const unsigned int ip_rev); 134*91f16700Schasinglulu int compute_ddr_phy(struct ddr_info *priv); 135*91f16700Schasinglulu int ddrc_set_regs(const unsigned long clk, 136*91f16700Schasinglulu const struct ddr_cfg_regs *regs, 137*91f16700Schasinglulu const struct ccsr_ddr *ddr, 138*91f16700Schasinglulu int twopass); 139*91f16700Schasinglulu int cal_board_params(struct ddr_info *priv, 140*91f16700Schasinglulu const struct board_timing *dimm, 141*91f16700Schasinglulu int len); 142*91f16700Schasinglulu /* return bit mask of used DIMM(s) */ 143*91f16700Schasinglulu int ddr_get_ddr_params(struct dimm_params *pdimm, struct ddr_conf *conf); 144*91f16700Schasinglulu long long dram_init(struct ddr_info *priv 145*91f16700Schasinglulu #if defined(NXP_HAS_CCN504) || defined(NXP_HAS_CCN508) 146*91f16700Schasinglulu , uintptr_t nxp_ccn_hn_f0_addr 147*91f16700Schasinglulu #endif 148*91f16700Schasinglulu ); 149*91f16700Schasinglulu long long board_static_ddr(struct ddr_info *info); 150*91f16700Schasinglulu 151*91f16700Schasinglulu #endif /* DDR_H */ 152