xref: /rk3399_ARM-atf/plat/imx/imx8m/include/dram.h (revision 0331b1c6111d198195298a2885dbd93cac1ad26a)
1 /*
2  * Copyright 2019-2023 NXP
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef DRAM_H
8 #define DRAM_H
9 
10 #include <assert.h>
11 
12 #include <arch_helpers.h>
13 #include <lib/utils_def.h>
14 
15 #include <ddrc.h>
16 #include <platform_def.h>
17 
18 #define DDRC_LPDDR4		BIT(5)
19 #define DDRC_DDR4		BIT(4)
20 #define DDRC_DDR3L		BIT(0)
21 #define DDR_TYPE_MASK		U(0x3f)
22 #define ACTIVE_RANK_MASK	U(0x3)
23 #define DDRC_ACTIVE_ONE_RANK	U(0x1)
24 #define DDRC_ACTIVE_TWO_RANK	U(0x2)
25 
26 #define MAX_FSP_NUM		U(3)
27 
28 /* reg & config param */
29 struct dram_cfg_param {
30 	unsigned int reg;
31 	unsigned int val;
32 };
33 
34 struct dram_timing_info {
35 	/* umctl2 config */
36 	struct dram_cfg_param *ddrc_cfg;
37 	unsigned int ddrc_cfg_num;
38 	/* ddrphy config */
39 	struct dram_cfg_param *ddrphy_cfg;
40 	unsigned int ddrphy_cfg_num;
41 	/* ddr fsp train info */
42 	struct dram_fsp_msg *fsp_msg;
43 	unsigned int fsp_msg_num;
44 	/* ddr phy trained CSR */
45 	struct dram_cfg_param *ddrphy_trained_csr;
46 	unsigned int ddrphy_trained_csr_num;
47 	/* ddr phy PIE */
48 	struct dram_cfg_param *ddrphy_pie;
49 	unsigned int ddrphy_pie_num;
50 	/* initialized fsp table */
51 	unsigned int fsp_table[4];
52 };
53 
54 struct dram_info {
55 	int dram_type;
56 	unsigned int num_rank;
57 	uint32_t num_fsp;
58 	int current_fsp;
59 	int boot_fsp;
60 	bool bypass_mode;
61 	struct dram_timing_info *timing_info;
62 	/* mr, emr, emr2, emr3, mr11, mr12, mr22, mr14 */
63 	uint32_t mr_table[3][8];
64 	/* used for workaround for rank to rank issue */
65 	uint32_t rank_setting[3][3];
66 };
67 
68 extern struct dram_info dram_info;
69 
70 void dram_info_init(unsigned long dram_timing_base);
71 void dram_umctl2_init(struct dram_timing_info *timing);
72 void dram_phy_init(struct dram_timing_info *timing);
73 
74 /* dram retention */
75 void dram_enter_retention(void);
76 void dram_exit_retention(void);
77 
78 void dram_clock_switch(unsigned int target_drate, bool bypass_mode);
79 
80 /* dram frequency change */
81 void lpddr4_swffc(struct dram_info *info, unsigned int init_fsp, unsigned int fsp_index);
82 void ddr4_swffc(struct dram_info *dram_info, unsigned int pstate);
83 
84 #endif /* DRAM_H */
85