xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/sdram_rk3308.h (revision 355cdcf34508d6ed289df7581f2c562b32e87d25)
1*8ec8d58eSZhihuan He /* SPDX-License-Identifier:     GPL-2.0+ */
2*8ec8d58eSZhihuan He /*
3*8ec8d58eSZhihuan He  * Copyright (C) 2020 Rockchip Electronics Co., Ltd
4*8ec8d58eSZhihuan He  */
5*8ec8d58eSZhihuan He 
6*8ec8d58eSZhihuan He #ifndef _ASM_ARCH_SDRAM_RK3308_H
7*8ec8d58eSZhihuan He #define _ASM_ARCH_SDRAM_RK3308_H
8*8ec8d58eSZhihuan He 
9*8ec8d58eSZhihuan He #include <ram.h>
10*8ec8d58eSZhihuan He #include <asm/arch/cru_rk3308.h>
11*8ec8d58eSZhihuan He #include <asm/arch/grf_rk3308.h>
12*8ec8d58eSZhihuan He #include <asm/arch/pmu_rk3308.h>
13*8ec8d58eSZhihuan He #include <asm/arch/sdram_common.h>
14*8ec8d58eSZhihuan He #include <asm/arch/sdram_rv1108_pctl_phy.h>
15*8ec8d58eSZhihuan He 
16*8ec8d58eSZhihuan He #define CG_EXIT_TH		(250)
17*8ec8d58eSZhihuan He 
18*8ec8d58eSZhihuan He #define PATTERN			(0x5aa5f00f)
19*8ec8d58eSZhihuan He 
20*8ec8d58eSZhihuan He struct rk3308_ddr_standby {
21*8ec8d58eSZhihuan He 	u32 con0;
22*8ec8d58eSZhihuan He 	u32 con1;
23*8ec8d58eSZhihuan He 	u32 status0;
24*8ec8d58eSZhihuan He };
25*8ec8d58eSZhihuan He 
26*8ec8d58eSZhihuan He struct rk3308_service_msch {
27*8ec8d58eSZhihuan He 	u32 id_coreid;
28*8ec8d58eSZhihuan He 	u32 id_revisionid;
29*8ec8d58eSZhihuan He 	u32 ddrconf;
30*8ec8d58eSZhihuan He 	u32 ddrtiming;
31*8ec8d58eSZhihuan He 	u32 ddrmode;
32*8ec8d58eSZhihuan He 	u32 readlatency;
33*8ec8d58eSZhihuan He };
34*8ec8d58eSZhihuan He 
35*8ec8d58eSZhihuan He enum {
36*8ec8d58eSZhihuan He 	/* ddr standby */
37*8ec8d58eSZhihuan He 	IDLE_TH_SHIFT				= 16,
38*8ec8d58eSZhihuan He 	/* can not gate msch clk */
39*8ec8d58eSZhihuan He 	MSCH_GATE_CLK_SHIFT			= 7,
40*8ec8d58eSZhihuan He 	MSCH_GATE_CLK_EN			= 1,
41*8ec8d58eSZhihuan He 
42*8ec8d58eSZhihuan He 	DDRPHY4X_GATE_SHIFT			= 6,
43*8ec8d58eSZhihuan He 	DDRPHY4X_GATE_EN			= 1,
44*8ec8d58eSZhihuan He 
45*8ec8d58eSZhihuan He 	UPCTL_CORE_CLK_GATE_SHIFT		= 5,
46*8ec8d58eSZhihuan He 	UPCTL_CORE_CLK_GATE_EN			= 1,
47*8ec8d58eSZhihuan He 
48*8ec8d58eSZhihuan He 	UPCTL_ACLK_GATE_SHIFT			= 4,
49*8ec8d58eSZhihuan He 	UPCTL_ACLK_GATE_EN			= 1,
50*8ec8d58eSZhihuan He 
51*8ec8d58eSZhihuan He 	CTL_IDLR_SHIFT				= 1,
52*8ec8d58eSZhihuan He 	CTL_IDLR_EN				= 1,
53*8ec8d58eSZhihuan He 
54*8ec8d58eSZhihuan He 	STDBY_EN_SHIFT				= 0,
55*8ec8d58eSZhihuan He 	STDBY_EN				= 1,
56*8ec8d58eSZhihuan He 
57*8ec8d58eSZhihuan He 	CG_EXIT_TH_SHIFT			= 16,
58*8ec8d58eSZhihuan He 
59*8ec8d58eSZhihuan He 	STDBY_STATUS_SHIFT			= 0,
60*8ec8d58eSZhihuan He 	STDBY_STATUS_MASK			= 0x7f << STDBY_STATUS_SHIFT,
61*8ec8d58eSZhihuan He 	ST_STDBY				= 0x10,
62*8ec8d58eSZhihuan He };
63*8ec8d58eSZhihuan He 
64*8ec8d58eSZhihuan He enum {
65*8ec8d58eSZhihuan He 	/* memory scheduler ddrtiming */
66*8ec8d58eSZhihuan He 	BWRATIO_HALF_BW				= 0x80000000,
67*8ec8d58eSZhihuan He 	BWRATIO_HALF_BW_DIS			= 0x0,
68*8ec8d58eSZhihuan He 
69*8ec8d58eSZhihuan He 	PHY_TX_DE_SKEW_SHIFT			= 3,
70*8ec8d58eSZhihuan He 	PHY_TX_DE_SKEW_EN			= 1,
71*8ec8d58eSZhihuan He };
72*8ec8d58eSZhihuan He 
73*8ec8d58eSZhihuan He struct dram_info {
74*8ec8d58eSZhihuan He 	struct rk3308_cru *cru;
75*8ec8d58eSZhihuan He 	struct rk3308_grf *grf;
76*8ec8d58eSZhihuan He 	struct rk3308_sgrf *sgrf;
77*8ec8d58eSZhihuan He 	struct rk3308_pmu *pmu;
78*8ec8d58eSZhihuan He 	struct ddr_phy *phy;
79*8ec8d58eSZhihuan He 	struct ddr_pctl *pctl;
80*8ec8d58eSZhihuan He 	struct rk3308_ddr_standby *standby;
81*8ec8d58eSZhihuan He 	struct rk3308_service_msch *service_msch;
82*8ec8d58eSZhihuan He 	struct ram_info info;
83*8ec8d58eSZhihuan He };
84*8ec8d58eSZhihuan He 
85*8ec8d58eSZhihuan He struct sdram_params {
86*8ec8d58eSZhihuan He 	u32 idle_pd;
87*8ec8d58eSZhihuan He 	u32 idle_sr;
88*8ec8d58eSZhihuan He 	u32 ddr_2t_en;
89*8ec8d58eSZhihuan He 	u32 stdby_idle;
90*8ec8d58eSZhihuan He 	struct ddr_config ddr_config_t;
91*8ec8d58eSZhihuan He 	struct ddr_timing ddr_timing_t;
92*8ec8d58eSZhihuan He };
93*8ec8d58eSZhihuan He 
94*8ec8d58eSZhihuan He struct rk3308_ddr_skew {
95*8ec8d58eSZhihuan He 	u32 a0_a1_skew[14];
96*8ec8d58eSZhihuan He 	u32 cs0_dm0_skew[22];
97*8ec8d58eSZhihuan He };
98*8ec8d58eSZhihuan He 
99*8ec8d58eSZhihuan He struct rk3308_ddr_gd {
100*8ec8d58eSZhihuan He 	struct sdram_head_info_v0 head_info;
101*8ec8d58eSZhihuan He 	struct rk3308_ddr_skew ddr_skew;
102*8ec8d58eSZhihuan He };
103*8ec8d58eSZhihuan He 
104*8ec8d58eSZhihuan He int check_rd_gate(struct dram_info *priv);
105*8ec8d58eSZhihuan He void copy_to_reg(u32 *dest, const u32 *src, u32 n);
106*8ec8d58eSZhihuan He void enable_low_power(struct dram_info *priv,
107*8ec8d58eSZhihuan He 		      struct sdram_params *params_priv);
108*8ec8d58eSZhihuan He void ddr_cap_info(size_t size);
109*8ec8d58eSZhihuan He void ddr_msch_cfg(struct dram_info *priv,
110*8ec8d58eSZhihuan He 		  struct sdram_params *params_priv);
111*8ec8d58eSZhihuan He void ddr_msch_cfg_rbc(struct sdram_params *params_priv,
112*8ec8d58eSZhihuan He 		      struct dram_info *priv);
113*8ec8d58eSZhihuan He void ddr_msch_get_max_col(struct dram_info *priv,
114*8ec8d58eSZhihuan He 			  struct ddr_schedule *sch_priv);
115*8ec8d58eSZhihuan He void ddr_msch_get_max_row(struct dram_info *priv,
116*8ec8d58eSZhihuan He 			  struct ddr_schedule *sch_priv);
117*8ec8d58eSZhihuan He void ddr_phy_skew_cfg(struct dram_info *priv);
118*8ec8d58eSZhihuan He void ddr_phy_dqs_rx_dll_cfg(struct dram_info *priv, u32 freq);
119*8ec8d58eSZhihuan He void enable_ddr_io_ret(struct dram_info *priv);
120*8ec8d58eSZhihuan He void modify_data_training(struct dram_info *priv,
121*8ec8d58eSZhihuan He 			  struct sdram_params *params_priv);
122*8ec8d58eSZhihuan He void move_to_config_state(struct dram_info *priv);
123*8ec8d58eSZhihuan He void move_to_access_state(struct dram_info *priv);
124*8ec8d58eSZhihuan He void pctl_cfg_grf(struct dram_info *priv,
125*8ec8d58eSZhihuan He 		  struct sdram_params *params_priv);
126*8ec8d58eSZhihuan He void phy_pctrl_reset_cru(struct dram_info *priv);
127*8ec8d58eSZhihuan He void print_dec(u32 n);
128*8ec8d58eSZhihuan He void rkdclk_init(struct dram_info *priv,
129*8ec8d58eSZhihuan He 		 struct sdram_params *params_priv);
130*8ec8d58eSZhihuan He int rv1108_sdram_init(struct dram_info *sdram_priv,
131*8ec8d58eSZhihuan He 		      struct sdram_params *params_priv);
132*8ec8d58eSZhihuan He void set_bw_grf(struct dram_info *priv);
133*8ec8d58eSZhihuan He void set_ds_odt(struct dram_info *priv,
134*8ec8d58eSZhihuan He 		struct sdram_params *params_priv);
135*8ec8d58eSZhihuan He 
136*8ec8d58eSZhihuan He #endif
137