xref: /rk3399_ARM-atf/include/drivers/nxp/ddr/ddr.h (revision 87311b4c16730b884c7e4ff01e3faea83f2731be)
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