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