~funderscore blog cgit wiki get in touch
aboutsummaryrefslogtreecommitdiff
blob: 3780dc6ea5b28186124500bab17ee5d813af4bb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/* SPDX-License-Identifier:     GPL-2.0+ */
/*
 * Copyright (C) 2018 Rockchip Electronics Co., Ltd
 */

#ifndef _ASM_ARCH_SDRAM_PCTL_PX30_H
#define _ASM_ARCH_SDRAM_PCTL_PX30_H
#include <asm/arch-rockchip/sdram_common.h>

#ifndef __ASSEMBLY__
#include <linux/bitops.h>
#endif

struct ddr_pctl_regs {
	u32 pctl[35][2];
};

/* ddr pctl registers define */
#define DDR_PCTL2_MSTR			0x0
#define DDR_PCTL2_STAT			0x4
#define DDR_PCTL2_MSTR1			0x8
#define DDR_PCTL2_MRCTRL0		0x10
#define DDR_PCTL2_MRCTRL1		0x14
#define DDR_PCTL2_MRSTAT		0x18
#define DDR_PCTL2_MRCTRL2		0x1c
#define DDR_PCTL2_DERATEEN		0x20
#define DDR_PCTL2_DERATEINT		0x24
#define DDR_PCTL2_MSTR2			0x28
#define DDR_PCTL2_PWRCTL		0x30
#define DDR_PCTL2_PWRTMG		0x34
#define DDR_PCTL2_HWLPCTL		0x38
#define DDR_PCTL2_RFSHCTL0		0x50
#define DDR_PCTL2_RFSHCTL1		0x54
#define DDR_PCTL2_RFSHCTL2		0x58
#define DDR_PCTL2_RFSHCTL4		0x5c
#define DDR_PCTL2_RFSHCTL3		0x60
#define DDR_PCTL2_RFSHTMG		0x64
#define DDR_PCTL2_RFSHTMG1		0x68
#define DDR_PCTL2_RFSHCTL5		0x6c
#define DDR_PCTL2_INIT0			0xd0
#define DDR_PCTL2_INIT1			0xd4
#define DDR_PCTL2_INIT2			0xd8
#define DDR_PCTL2_INIT3			0xdc
#define DDR_PCTL2_INIT4			0xe0
#define DDR_PCTL2_INIT5			0xe4
#define DDR_PCTL2_INIT6			0xe8
#define DDR_PCTL2_INIT7			0xec
#define DDR_PCTL2_DIMMCTL		0xf0
#define DDR_PCTL2_RANKCTL		0xf4
#define DDR_PCTL2_CHCTL			0xfc
#define DDR_PCTL2_DRAMTMG0		0x100
#define DDR_PCTL2_DRAMTMG1		0x104
#define DDR_PCTL2_DRAMTMG2		0x108
#define DDR_PCTL2_DRAMTMG3		0x10c
#define DDR_PCTL2_DRAMTMG4		0x110
#define DDR_PCTL2_DRAMTMG5		0x114
#define DDR_PCTL2_DRAMTMG6		0x118
#define DDR_PCTL2_DRAMTMG7		0x11c
#define DDR_PCTL2_DRAMTMG8		0x120
#define DDR_PCTL2_DRAMTMG9		0x124
#define DDR_PCTL2_DRAMTMG10		0x128
#define DDR_PCTL2_DRAMTMG11		0x12c
#define DDR_PCTL2_DRAMTMG12		0x130
#define DDR_PCTL2_DRAMTMG13		0x134
#define DDR_PCTL2_DRAMTMG14		0x138
#define DDR_PCTL2_DRAMTMG15		0x13c
#define DDR_PCTL2_DRAMTMG16		0x140
#define DDR_PCTL2_ZQCTL0		0x180
#define DDR_PCTL2_ZQCTL1		0x184
#define DDR_PCTL2_ZQCTL2		0x188
#define DDR_PCTL2_ZQSTAT		0x18c
#define DDR_PCTL2_DFITMG0		0x190
#define DDR_PCTL2_DFITMG1		0x194
#define DDR_PCTL2_DFILPCFG0		0x198
#define DDR_PCTL2_DFILPCFG1		0x19c
#define DDR_PCTL2_DFIUPD0		0x1a0
#define DDR_PCTL2_DFIUPD1		0x1a4
#define DDR_PCTL2_DFIUPD2		0x1a8
#define DDR_PCTL2_DFIMISC		0x1b0
#define DDR_PCTL2_DFITMG2		0x1b4
#define DDR_PCTL2_DFITMG3		0x1b8
#define DDR_PCTL2_DFISTAT		0x1bc
#define DDR_PCTL2_DBICTL		0x1c0
#define DDR_PCTL2_ADDRMAP0		0x200
#define DDR_PCTL2_ADDRMAP1		0x204
#define DDR_PCTL2_ADDRMAP2		0x208
#define DDR_PCTL2_ADDRMAP3		0x20c
#define DDR_PCTL2_ADDRMAP4		0x210
#define DDR_PCTL2_ADDRMAP5		0x214
#define DDR_PCTL2_ADDRMAP6		0x218
#define DDR_PCTL2_ADDRMAP7		0x21c
#define DDR_PCTL2_ADDRMAP8		0x220
#define DDR_PCTL2_ADDRMAP9		0x224
#define DDR_PCTL2_ADDRMAP10		0x228
#define DDR_PCTL2_ADDRMAP11		0x22c
#define DDR_PCTL2_ODTCFG		0x240
#define DDR_PCTL2_ODTMAP		0x244
#define DDR_PCTL2_SCHED			0x250
#define DDR_PCTL2_SCHED1		0x254
#define DDR_PCTL2_PERFHPR1		0x25c
#define DDR_PCTL2_PERFLPR1		0x264
#define DDR_PCTL2_PERFWR1		0x26c
#define DDR_PCTL2_DQMAP0		0x280
#define DDR_PCTL2_DQMAP1		0x284
#define DDR_PCTL2_DQMAP2		0x288
#define DDR_PCTL2_DQMAP3		0x28c
#define DDR_PCTL2_DQMAP4		0x290
#define DDR_PCTL2_DQMAP5		0x294
#define DDR_PCTL2_DBG0			0x300
#define DDR_PCTL2_DBG1			0x304
#define DDR_PCTL2_DBGCAM		0x308
#define DDR_PCTL2_DBGCMD		0x30c
#define DDR_PCTL2_DBGSTAT		0x310
#define DDR_PCTL2_SWCTL			0x320
#define DDR_PCTL2_SWSTAT		0x324
#define DDR_PCTL2_POISONCFG		0x36c
#define DDR_PCTL2_POISONSTAT		0x370
#define DDR_PCTL2_ADVECCINDEX		0x374
#define DDR_PCTL2_ADVECCSTAT		0x378
#define DDR_PCTL2_PSTAT			0x3fc
#define DDR_PCTL2_PCCFG			0x400
#define DDR_PCTL2_PCFGR_n		0x404
#define DDR_PCTL2_PCFGW_n		0x408
#define DDR_PCTL2_PCTRL_n		0x490

#define UMCTL2_REGS_FREQ(n)	\
	((0x1000 * (n) + (((n) > 0) ? 0x1000 : 0)))

/* PCTL2_MSTR */
#define PCTL2_FREQUENCY_MODE_MASK	(1)
#define PCTL2_FREQUENCY_MODE_SHIFT	(29)
#define PCTL2_DLL_OFF_MODE		BIT(15)
/* PCTL2_STAT */
#define PCTL2_SELFREF_TYPE_MASK		(3 << 4)
#define PCTL2_SELFREF_TYPE_SR_NOT_AUTO	(2 << 4)
#define PCTL2_OPERATING_MODE_MASK	(7)
#define PCTL2_OPERATING_MODE_INIT	(0)
#define PCTL2_OPERATING_MODE_NORMAL	(1)
#define PCTL2_OPERATING_MODE_PD		(2)
#define PCTL2_OPERATING_MODE_SR		(3)
/* PCTL2_MRCTRL0 */
#define PCTL2_MR_WR			BIT(31)
#define PCTL2_MR_ADDR_SHIFT		(12)
#define PCTL2_MR_RANK_SHIFT		(4)
#define PCTL2_MR_TYPE_WR		(0)
#define PCTL2_MR_TYPE_RD		(1)
/* PCTL2_MRCTRL1 */
#define PCTL2_MR_ADDRESS_SHIFT		(8)
#define PCTL2_MR_DATA_MASK		(0xff)
/* PCTL2_MRSTAT */
#define PCTL2_MR_WR_BUSY		BIT(0)
/* PCTL2_DERATEEN */
#define PCTL2_DERATE_ENABLE		(1)
/* PCTL2_PWRCTL */
#define PCTL2_SELFREF_SW		BIT(5)
#define PCTL2_POWERDOWN_EN		BIT(1)
#define PCTL2_SELFREF_EN		(1)
/* PCTL2_PWRTMG */
#define PCTL2_SELFREF_TO_X32_MASK	(0xFF)
#define PCTL2_SELFREF_TO_X32_SHIFT	(16)
#define PCTL2_POWERDOWN_TO_X32_MASK	(0x1F)
/* PCTL2_INIT3 */
#define PCTL2_DDR34_MR0_SHIFT		(16)
#define PCTL2_LPDDR234_MR1_SHIFT	(16)
#define PCTL2_DDR34_MR1_SHIFT		(0)
#define PCTL2_LPDDR234_MR2_SHIFT	(0)
/* PCTL2_INIT4 */
#define PCTL2_DDR34_MR2_SHIFT		(16)
#define PCTL2_LPDDR234_MR3_SHIFT	(16)
#define PCTL2_DDR34_MR3_SHIFT		(0)
#define PCTL2_LPDDR4_MR13_SHIFT		(0)

/* PCTL2_INIT6 */
#define PCTL2_DDR4_MR4_SHIFT		(16)
#define PCTL2_LPDDR4_MR11_SHIFT		(16)
#define PCTL2_DDR4_MR5_SHIFT		(0)
#define PCTL2_LPDDR4_MR12_SHIFT		(0)

/* PCTL2_INIT7 */
#define PCTL2_LPDDR4_MR22_SHIFT		(16)
#define PCTL2_DDR4_MR6_SHIFT		(0)
#define PCTL2_LPDDR4_MR14_SHIFT		(0)

#define PCTL2_MR_MASK			(0xffff)

/* PCTL2_RFSHCTL3 */
#define PCTL2_DIS_AUTO_REFRESH		(1)
/* PCTL2_ZQCTL0 */
#define PCTL2_DIS_AUTO_ZQ		BIT(31)
#define PCTL2_DIS_SRX_ZQCL		BIT(30)
/* PCTL2_DFILPCFG0 */
#define PCTL2_DFI_LP_EN_SR		BIT(8)
#define PCTL2_DFI_LP_EN_SR_MASK		BIT(8)
#define PCTL2_DFI_LP_EN_SR_SHIFT	(8)
/* PCTL2_DFIMISC */
#define PCTL2_DFI_INIT_COMPLETE_EN	(1)
/* PCTL2_DFISTAT */
#define PCTL2_DFI_LP_ACK		BIT(1)
#define PCTL2_DFI_INIT_COMPLETE		(1)
/* PCTL2_DBG1 */
#define PCTL2_DIS_HIF			BIT(1)
/* PCTL2_DBGCAM */
#define PCTL2_DBG_WR_Q_EMPTY		BIT(26)
#define PCTL2_DBG_RD_Q_EMPTY		BIT(25)
#define PCTL2_DBG_LPR_Q_DEPTH_MASK	(0xffff << 8)
#define PCTL2_DBG_LPR_Q_DEPTH_EMPTY	(0x0 << 8)
/* PCTL2_DBGCMD */
#define PCTL2_RANK1_REFRESH		BIT(1)
#define PCTL2_RANK0_REFRESH		(1)
/* PCTL2_DBGSTAT */
#define PCTL2_RANK1_REFRESH_BUSY	BIT(1)
#define PCTL2_RANK0_REFRESH_BUSY	(1)
/* PCTL2_SWCTL */
#define PCTL2_SW_DONE			(1)
#define PCTL2_SW_DONE_CLEAR		(0)
/* PCTL2_SWSTAT */
#define PCTL2_SW_DONE_ACK		(1)
/* PCTL2_PSTAT */
#define PCTL2_WR_PORT_BUSY_0		BIT(16)
#define PCTL2_RD_PORT_BUSY_0		(1)
/* PCTL2_PCTRLn */
#define PCTL2_PORT_EN			(1)

void pctl_read_mr(void __iomem *pctl_base, u32 rank, u32 mr_num);
int pctl_write_mr(void __iomem *pctl_base, u32 rank, u32 mr_num, u32 arg,
		  u32 dramtype);
int pctl_write_vrefdq(void __iomem *pctl_base, u32 rank, u32 vrefrate,
		      u32 dramtype);

u32 pctl_dis_zqcs_aref(void __iomem *pctl_base);
void pctl_rest_zqcs_aref(void __iomem *pctl_base, u32 dis_auto_zq);

u32 pctl_remodify_sdram_params(struct ddr_pctl_regs *pctl_regs,
			       struct sdram_cap_info *cap_info,
			       u32 dram_type);
int pctl_cfg(void __iomem *pctl_base, struct ddr_pctl_regs *pctl_regs,
	     u32 sr_idle, u32 pd_idle);

#endif