blob: 10923505d6e112c9f3eff94c49c61e6b191bd5a3 [file] [log] [blame]
Kever Yang9228f282019-08-02 10:39:59 +03001/*
2 * Copyright (C) 2016-2017 Rockchip Electronics Co., Ltd
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7#ifndef _ASM_ARCH_SDRAM_RK3328_H
8#define _ASM_ARCH_SDRAM_RK3328_H
Kever Yang38a99b62019-11-15 11:04:34 +08009#include <asm/arch-rockchip/sdram_common.h>
YouMin Chenb9f7df32019-11-15 11:04:44 +080010#include <asm/arch-rockchip/sdram_pctl_px30.h>
11#include <asm/arch-rockchip/sdram_phy_px30.h>
12#include <asm/arch-rockchip/sdram_phy_ron_rtt_px30.h>
Kever Yang9228f282019-08-02 10:39:59 +030013
14#define SR_IDLE 93
15#define PD_IDLE 13
16#define SDRAM_ADDR 0x00000000
Kever Yang9228f282019-08-02 10:39:59 +030017
18/* noc registers define */
19#define DDRCONF 0x8
20#define DDRTIMING 0xc
21#define DDRMODE 0x10
22#define READLATENCY 0x14
23#define AGING0 0x18
24#define AGING1 0x1c
25#define AGING2 0x20
26#define AGING3 0x24
27#define AGING4 0x28
28#define AGING5 0x2c
29#define ACTIVATE 0x38
30#define DEVTODEV 0x3c
31#define DDR4TIMING 0x40
32
33/* DDR GRF */
34#define DDR_GRF_CON(n) (0 + (n) * 4)
35#define DDR_GRF_STATUS_BASE (0X100)
36#define DDR_GRF_STATUS(n) (DDR_GRF_STATUS_BASE + (n) * 4)
37
38/* CRU_SOFTRESET_CON5 */
YouMin Chenb9f7df32019-11-15 11:04:44 +080039#define ddrphy_psrstn_req(n) (((0x1 << 15) << 16) | ((n) << 15))
40#define ddrphy_srstn_req(n) (((0x1 << 14) << 16) | ((n) << 14))
41#define ddrctrl_psrstn_req(n) (((0x1 << 13) << 16) | ((n) << 13))
42#define ddrctrl_srstn_req(n) (((0x1 << 12) << 16) | ((n) << 12))
43#define ddrmsch_srstn_req(n) (((0x1 << 11) << 16) | ((n) << 11))
44#define msch_srstn_req(n) (((0x1 << 9) << 16) | ((n) << 9))
45#define dfimon_srstn_req(n) (((0x1 << 8) << 16) | ((n) << 8))
46#define grf_ddr_srstn_req(n) (((0x1 << 7) << 16) | ((n) << 7))
Kever Yang9228f282019-08-02 10:39:59 +030047/* CRU_SOFTRESET_CON9 */
YouMin Chenb9f7df32019-11-15 11:04:44 +080048#define ddrctrl_asrstn_req(n) (((0x1 << 9) << 16) | ((n) << 9))
Kever Yang9228f282019-08-02 10:39:59 +030049
50/* CRU register */
51#define CRU_PLL_CON(pll_id, n) ((pll_id) * 0x20 + (n) * 4)
52#define CRU_MODE (0x80)
53#define CRU_GLB_CNT_TH (0x90)
54#define CRU_CLKSEL_CON_BASE 0x100
55#define CRU_CLKSELS_CON(i) (CRU_CLKSEL_CON_BASE + ((i) * 4))
56#define CRU_CLKGATE_CON_BASE 0x200
57#define CRU_CLKGATE_CON(i) (CRU_CLKGATE_CON_BASE + ((i) * 4))
58#define CRU_CLKSFTRST_CON_BASE 0x300
59#define CRU_CLKSFTRST_CON(i) (CRU_CLKSFTRST_CON_BASE + ((i) * 4))
60
61/* CRU_PLL_CON0 */
62#define PB(n) ((0x1 << (15 + 16)) | ((n) << 15))
63#define POSTDIV1(n) ((0x7 << (12 + 16)) | ((n) << 12))
64#define FBDIV(n) ((0xFFF << 16) | (n))
65
66/* CRU_PLL_CON1 */
67#define RSTMODE(n) ((0x1 << (15 + 16)) | ((n) << 15))
68#define RST(n) ((0x1 << (14 + 16)) | ((n) << 14))
69#define PD(n) ((0x1 << (13 + 16)) | ((n) << 13))
70#define DSMPD(n) ((0x1 << (12 + 16)) | ((n) << 12))
71#define LOCK(n) (((n) >> 10) & 0x1)
72#define POSTDIV2(n) ((0x7 << (6 + 16)) | ((n) << 6))
73#define REFDIV(n) ((0x3F << 16) | (n))
74
YouMin Chenb9f7df32019-11-15 11:04:44 +080075u16 ddr_cfg_2_rbc[] = {
76 /*
77 * [5:4] row(13+n)
78 * [3] cs(0:0 cs, 1:2 cs)
79 * [2] bank(0:0bank,1:8bank)
80 * [1:0] col(11+n)
81 */
82 /* row, cs, bank, col */
83 ((3 << 4) | (0 << 3) | (1 << 2) | 0),
84 ((3 << 4) | (0 << 3) | (1 << 2) | 1),
85 ((2 << 4) | (0 << 3) | (1 << 2) | 2),
86 ((3 << 4) | (0 << 3) | (1 << 2) | 2),
87 ((2 << 4) | (0 << 3) | (1 << 2) | 3),
88 ((3 << 4) | (1 << 3) | (1 << 2) | 0),
89 ((3 << 4) | (1 << 3) | (1 << 2) | 1),
90 ((2 << 4) | (1 << 3) | (1 << 2) | 2),
91 ((3 << 4) | (0 << 3) | (0 << 2) | 1),
92 ((2 << 4) | (0 << 3) | (1 << 2) | 1),
Kever Yang9228f282019-08-02 10:39:59 +030093};
94
YouMin Chenb9f7df32019-11-15 11:04:44 +080095u16 ddr4_cfg_2_rbc[] = {
96 /***************************
97 * [6] cs 0:0cs 1:2 cs
98 * [5:3] row(13+n)
99 * [2] cs(0:0 cs, 1:2 cs)
100 * [1] bw 0: 16bit 1:32bit
101 * [0] diebw 0:8bit 1:16bit
102 ***************************/
103 /* cs, row, cs, bw, diebw */
104 ((0 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 0),
105 ((1 << 6) | (2 << 3) | (0 << 2) | (1 << 1) | 0),
106 ((0 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 0),
107 ((1 << 6) | (3 << 3) | (0 << 2) | (0 << 1) | 0),
108 ((0 << 6) | (4 << 3) | (0 << 2) | (1 << 1) | 1),
109 ((1 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 1),
110 ((1 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 1),
111 ((0 << 6) | (2 << 3) | (1 << 2) | (1 << 1) | 0),
112 ((0 << 6) | (3 << 3) | (1 << 2) | (0 << 1) | 0),
113 ((0 << 6) | (3 << 3) | (1 << 2) | (1 << 1) | 1),
114 ((0 << 6) | (4 << 3) | (1 << 2) | (0 << 1) | 1),
Kever Yang9228f282019-08-02 10:39:59 +0300115};
116
117u32 addrmap[21][9] = {
118 /* map0 map1 map2 map3 map4 map5 map6 map7 map8 */
119 {22, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x06060606,
120 0x06060606, 0x00000f0f, 0x3f3f},
121 {23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707,
122 0x07070707, 0x00000f0f, 0x3f3f},
123 {23, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808,
124 0x0f080808, 0x00000f0f, 0x3f3f},
125 {24, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808,
126 0x08080808, 0x00000f0f, 0x3f3f},
127 {24, 0x000a0a0a, 0x00000000, 0x00000000, 0x00000000, 0x09090909,
128 0x0f090909, 0x00000f0f, 0x3f3f},
129 {6, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x07070707,
130 0x07070707, 0x00000f0f, 0x3f3f},
131 {7, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x08080808,
132 0x08080808, 0x00000f0f, 0x3f3f},
133 {8, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x09090909,
134 0x0f090909, 0x00000f0f, 0x3f3f},
135 {22, 0x001f0808, 0x00000000, 0x00000000, 0x00001f1f, 0x06060606,
136 0x06060606, 0x00000f0f, 0x3f3f},
137 {23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707,
138 0x0f070707, 0x00000f0f, 0x3f3f},
139
140 {24, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
141 0x08080808, 0x00000f0f, 0x0801},
142 {23, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
143 0x0f080808, 0x00000f0f, 0x0801},
144 {24, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
145 0x07070707, 0x00000f07, 0x0700},
146 {23, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
147 0x07070707, 0x00000f0f, 0x0700},
148 {24, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707,
149 0x07070707, 0x00000f07, 0x3f01},
150 {23, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707,
151 0x07070707, 0x00000f0f, 0x3f01},
152 {24, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x06060606,
153 0x06060606, 0x00000f06, 0x3f00},
154 {8, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x09090909,
155 0x0f090909, 0x00000f0f, 0x0801},
156 {7, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x08080808,
157 0x08080808, 0x00000f0f, 0x0700},
158 {7, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808,
159 0x08080808, 0x00000f0f, 0x3f01},
160
161 {6, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707,
162 0x07070707, 0x00000f07, 0x3f00}
163};
164
YouMin Chenb9f7df32019-11-15 11:04:44 +0800165struct rk3328_ddr_grf_regs {
166 u32 ddr_grf_con[4];
167 u32 reserved[(0x100 - 0x10) / 4];
168 u32 ddr_grf_status[11];
Kever Yang9228f282019-08-02 10:39:59 +0300169};
170
YouMin Chenb9f7df32019-11-15 11:04:44 +0800171union noc_ddrtiming {
172 u32 d32;
173 struct {
174 unsigned acttoact:6;
175 unsigned rdtomiss:6;
176 unsigned wrtomiss:6;
177 unsigned burstlen:3;
178 unsigned rdtowr:5;
179 unsigned wrtord:5;
180 unsigned bwratio:1;
181 } b;
182};
183
184union noc_activate {
185 u32 d32;
186 struct {
187 unsigned rrd:4;
188 unsigned faw:6;
189 unsigned fawbank:1;
190 unsigned reserved1:21;
191 } b;
192};
193
194union noc_devtodev {
195 u32 d32;
196 struct {
197 unsigned busrdtord:2;
198 unsigned busrdtowr:2;
199 unsigned buswrtord:2;
200 unsigned reserved2:26;
201 } b;
202};
203
204union noc_ddr4timing {
205 u32 d32;
206 struct {
207 unsigned ccdl:3;
208 unsigned wrtordl:5;
209 unsigned rrdl:4;
210 unsigned reserved2:20;
211 } b;
212};
213
214union noc_ddrmode {
215 u32 d32;
216 struct {
217 unsigned autoprecharge:1;
218 unsigned bwratioextended:1;
219 unsigned reserved3:30;
220 } b;
221};
222
223struct msch_regs {
Kever Yang9228f282019-08-02 10:39:59 +0300224 u32 coreid;
225 u32 revisionid;
226 u32 ddrconf;
227 u32 ddrtiming;
228 u32 ddrmode;
229 u32 readlatency;
230 u32 aging0;
231 u32 aging1;
232 u32 aging2;
233 u32 aging3;
234 u32 aging4;
235 u32 aging5;
236 u32 reserved[2];
237 u32 activate;
238 u32 devtodev;
239 u32 ddr4_timing;
240};
241
YouMin Chenb9f7df32019-11-15 11:04:44 +0800242struct sdram_msch_timings {
243 union noc_ddrtiming ddrtiming;
244 union noc_ddrmode ddrmode;
245 u32 readlatency;
246 union noc_activate activate;
247 union noc_devtodev devtodev;
248 union noc_ddr4timing ddr4timing;
249 u32 agingx0;
Kever Yang9228f282019-08-02 10:39:59 +0300250};
251
252struct rk3328_sdram_channel {
YouMin Chenb9f7df32019-11-15 11:04:44 +0800253 struct sdram_cap_info cap_info;
254 struct sdram_msch_timings noc_timings;
Kever Yang9228f282019-08-02 10:39:59 +0300255};
256
257struct rk3328_sdram_params {
258 struct rk3328_sdram_channel ch;
YouMin Chenb9f7df32019-11-15 11:04:44 +0800259 struct sdram_base_params base;
260 struct ddr_pctl_regs pctl_regs;
261 struct ddr_phy_regs phy_regs;
262 struct ddr_phy_skew skew;
Kever Yang9228f282019-08-02 10:39:59 +0300263};
264
Kever Yang9228f282019-08-02 10:39:59 +0300265#endif