xref: /openbmc/u-boot/drivers/mtd/nand/raw/tegra_nand.h (revision 592cd5defd4f71d34ffcbd8dd3326bc10f662e20)
1*a430fa06SMiquel Raynal /* SPDX-License-Identifier: GPL-2.0+ */
2*a430fa06SMiquel Raynal /*
3*a430fa06SMiquel Raynal  * (C) Copyright 2011 NVIDIA Corporation <www.nvidia.com>
4*a430fa06SMiquel Raynal  */
5*a430fa06SMiquel Raynal 
6*a430fa06SMiquel Raynal /* register offset */
7*a430fa06SMiquel Raynal #define COMMAND_0		0x00
8*a430fa06SMiquel Raynal #define CMD_GO			(1 << 31)
9*a430fa06SMiquel Raynal #define CMD_CLE			(1 << 30)
10*a430fa06SMiquel Raynal #define CMD_ALE			(1 << 29)
11*a430fa06SMiquel Raynal #define CMD_PIO			(1 << 28)
12*a430fa06SMiquel Raynal #define CMD_TX			(1 << 27)
13*a430fa06SMiquel Raynal #define CMD_RX			(1 << 26)
14*a430fa06SMiquel Raynal #define CMD_SEC_CMD		(1 << 25)
15*a430fa06SMiquel Raynal #define CMD_AFT_DAT_MASK	(1 << 24)
16*a430fa06SMiquel Raynal #define CMD_AFT_DAT_DISABLE	0
17*a430fa06SMiquel Raynal #define CMD_AFT_DAT_ENABLE	(1 << 24)
18*a430fa06SMiquel Raynal #define CMD_TRANS_SIZE_SHIFT	20
19*a430fa06SMiquel Raynal #define CMD_TRANS_SIZE_PAGE	8
20*a430fa06SMiquel Raynal #define CMD_A_VALID		(1 << 19)
21*a430fa06SMiquel Raynal #define CMD_B_VALID		(1 << 18)
22*a430fa06SMiquel Raynal #define CMD_RD_STATUS_CHK	(1 << 17)
23*a430fa06SMiquel Raynal #define CMD_R_BSY_CHK		(1 << 16)
24*a430fa06SMiquel Raynal #define CMD_CE7			(1 << 15)
25*a430fa06SMiquel Raynal #define CMD_CE6			(1 << 14)
26*a430fa06SMiquel Raynal #define CMD_CE5			(1 << 13)
27*a430fa06SMiquel Raynal #define CMD_CE4			(1 << 12)
28*a430fa06SMiquel Raynal #define CMD_CE3			(1 << 11)
29*a430fa06SMiquel Raynal #define CMD_CE2			(1 << 10)
30*a430fa06SMiquel Raynal #define CMD_CE1			(1 << 9)
31*a430fa06SMiquel Raynal #define CMD_CE0			(1 << 8)
32*a430fa06SMiquel Raynal #define CMD_CLE_BYTE_SIZE_SHIFT	4
33*a430fa06SMiquel Raynal enum {
34*a430fa06SMiquel Raynal 	CMD_CLE_BYTES1 = 0,
35*a430fa06SMiquel Raynal 	CMD_CLE_BYTES2,
36*a430fa06SMiquel Raynal 	CMD_CLE_BYTES3,
37*a430fa06SMiquel Raynal 	CMD_CLE_BYTES4,
38*a430fa06SMiquel Raynal };
39*a430fa06SMiquel Raynal #define CMD_ALE_BYTE_SIZE_SHIFT	0
40*a430fa06SMiquel Raynal enum {
41*a430fa06SMiquel Raynal 	CMD_ALE_BYTES1 = 0,
42*a430fa06SMiquel Raynal 	CMD_ALE_BYTES2,
43*a430fa06SMiquel Raynal 	CMD_ALE_BYTES3,
44*a430fa06SMiquel Raynal 	CMD_ALE_BYTES4,
45*a430fa06SMiquel Raynal 	CMD_ALE_BYTES5,
46*a430fa06SMiquel Raynal 	CMD_ALE_BYTES6,
47*a430fa06SMiquel Raynal 	CMD_ALE_BYTES7,
48*a430fa06SMiquel Raynal 	CMD_ALE_BYTES8
49*a430fa06SMiquel Raynal };
50*a430fa06SMiquel Raynal 
51*a430fa06SMiquel Raynal #define STATUS_0			0x04
52*a430fa06SMiquel Raynal #define STATUS_RBSY0			(1 << 8)
53*a430fa06SMiquel Raynal 
54*a430fa06SMiquel Raynal #define ISR_0				0x08
55*a430fa06SMiquel Raynal #define ISR_IS_CMD_DONE			(1 << 5)
56*a430fa06SMiquel Raynal #define ISR_IS_ECC_ERR			(1 << 4)
57*a430fa06SMiquel Raynal 
58*a430fa06SMiquel Raynal #define IER_0				0x0C
59*a430fa06SMiquel Raynal 
60*a430fa06SMiquel Raynal #define CFG_0				0x10
61*a430fa06SMiquel Raynal #define CFG_HW_ECC_MASK			(1 << 31)
62*a430fa06SMiquel Raynal #define CFG_HW_ECC_DISABLE		0
63*a430fa06SMiquel Raynal #define CFG_HW_ECC_ENABLE		(1 << 31)
64*a430fa06SMiquel Raynal #define CFG_HW_ECC_SEL_MASK		(1 << 30)
65*a430fa06SMiquel Raynal #define CFG_HW_ECC_SEL_HAMMING		0
66*a430fa06SMiquel Raynal #define CFG_HW_ECC_SEL_RS		(1 << 30)
67*a430fa06SMiquel Raynal #define CFG_HW_ECC_CORRECTION_MASK	(1 << 29)
68*a430fa06SMiquel Raynal #define CFG_HW_ECC_CORRECTION_DISABLE	0
69*a430fa06SMiquel Raynal #define CFG_HW_ECC_CORRECTION_ENABLE	(1 << 29)
70*a430fa06SMiquel Raynal #define CFG_PIPELINE_EN_MASK		(1 << 28)
71*a430fa06SMiquel Raynal #define CFG_PIPELINE_EN_DISABLE		0
72*a430fa06SMiquel Raynal #define CFG_PIPELINE_EN_ENABLE		(1 << 28)
73*a430fa06SMiquel Raynal #define CFG_ECC_EN_TAG_MASK		(1 << 27)
74*a430fa06SMiquel Raynal #define CFG_ECC_EN_TAG_DISABLE		0
75*a430fa06SMiquel Raynal #define CFG_ECC_EN_TAG_ENABLE		(1 << 27)
76*a430fa06SMiquel Raynal #define CFG_TVALUE_MASK			(3 << 24)
77*a430fa06SMiquel Raynal enum {
78*a430fa06SMiquel Raynal 	CFG_TVAL4 = 0 << 24,
79*a430fa06SMiquel Raynal 	CFG_TVAL6 = 1 << 24,
80*a430fa06SMiquel Raynal 	CFG_TVAL8 = 2 << 24
81*a430fa06SMiquel Raynal };
82*a430fa06SMiquel Raynal #define CFG_SKIP_SPARE_MASK		(1 << 23)
83*a430fa06SMiquel Raynal #define CFG_SKIP_SPARE_DISABLE		0
84*a430fa06SMiquel Raynal #define CFG_SKIP_SPARE_ENABLE		(1 << 23)
85*a430fa06SMiquel Raynal #define CFG_COM_BSY_MASK		(1 << 22)
86*a430fa06SMiquel Raynal #define CFG_COM_BSY_DISABLE		0
87*a430fa06SMiquel Raynal #define CFG_COM_BSY_ENABLE		(1 << 22)
88*a430fa06SMiquel Raynal #define CFG_BUS_WIDTH_MASK		(1 << 21)
89*a430fa06SMiquel Raynal #define CFG_BUS_WIDTH_8BIT		0
90*a430fa06SMiquel Raynal #define CFG_BUS_WIDTH_16BIT		(1 << 21)
91*a430fa06SMiquel Raynal #define CFG_LPDDR1_MODE_MASK		(1 << 20)
92*a430fa06SMiquel Raynal #define CFG_LPDDR1_MODE_DISABLE		0
93*a430fa06SMiquel Raynal #define CFG_LPDDR1_MODE_ENABLE		(1 << 20)
94*a430fa06SMiquel Raynal #define CFG_EDO_MODE_MASK		(1 << 19)
95*a430fa06SMiquel Raynal #define CFG_EDO_MODE_DISABLE		0
96*a430fa06SMiquel Raynal #define CFG_EDO_MODE_ENABLE		(1 << 19)
97*a430fa06SMiquel Raynal #define CFG_PAGE_SIZE_SEL_MASK		(7 << 16)
98*a430fa06SMiquel Raynal enum {
99*a430fa06SMiquel Raynal 	CFG_PAGE_SIZE_256	= 0 << 16,
100*a430fa06SMiquel Raynal 	CFG_PAGE_SIZE_512	= 1 << 16,
101*a430fa06SMiquel Raynal 	CFG_PAGE_SIZE_1024	= 2 << 16,
102*a430fa06SMiquel Raynal 	CFG_PAGE_SIZE_2048	= 3 << 16,
103*a430fa06SMiquel Raynal 	CFG_PAGE_SIZE_4096	= 4 << 16
104*a430fa06SMiquel Raynal };
105*a430fa06SMiquel Raynal #define CFG_SKIP_SPARE_SEL_MASK		(3 << 14)
106*a430fa06SMiquel Raynal enum {
107*a430fa06SMiquel Raynal 	CFG_SKIP_SPARE_SEL_4	= 0 << 14,
108*a430fa06SMiquel Raynal 	CFG_SKIP_SPARE_SEL_8	= 1 << 14,
109*a430fa06SMiquel Raynal 	CFG_SKIP_SPARE_SEL_12	= 2 << 14,
110*a430fa06SMiquel Raynal 	CFG_SKIP_SPARE_SEL_16	= 3 << 14
111*a430fa06SMiquel Raynal };
112*a430fa06SMiquel Raynal #define CFG_TAG_BYTE_SIZE_MASK	0x1FF
113*a430fa06SMiquel Raynal 
114*a430fa06SMiquel Raynal #define TIMING_0			0x14
115*a430fa06SMiquel Raynal #define TIMING_TRP_RESP_CNT_SHIFT	28
116*a430fa06SMiquel Raynal #define TIMING_TRP_RESP_CNT_MASK	(0xf << TIMING_TRP_RESP_CNT_SHIFT)
117*a430fa06SMiquel Raynal #define TIMING_TWB_CNT_SHIFT		24
118*a430fa06SMiquel Raynal #define TIMING_TWB_CNT_MASK		(0xf << TIMING_TWB_CNT_SHIFT)
119*a430fa06SMiquel Raynal #define TIMING_TCR_TAR_TRR_CNT_SHIFT	20
120*a430fa06SMiquel Raynal #define TIMING_TCR_TAR_TRR_CNT_MASK	(0xf << TIMING_TCR_TAR_TRR_CNT_SHIFT)
121*a430fa06SMiquel Raynal #define TIMING_TWHR_CNT_SHIFT		16
122*a430fa06SMiquel Raynal #define TIMING_TWHR_CNT_MASK		(0xf << TIMING_TWHR_CNT_SHIFT)
123*a430fa06SMiquel Raynal #define TIMING_TCS_CNT_SHIFT		14
124*a430fa06SMiquel Raynal #define TIMING_TCS_CNT_MASK		(3 << TIMING_TCS_CNT_SHIFT)
125*a430fa06SMiquel Raynal #define TIMING_TWH_CNT_SHIFT		12
126*a430fa06SMiquel Raynal #define TIMING_TWH_CNT_MASK		(3 << TIMING_TWH_CNT_SHIFT)
127*a430fa06SMiquel Raynal #define TIMING_TWP_CNT_SHIFT		8
128*a430fa06SMiquel Raynal #define TIMING_TWP_CNT_MASK		(0xf << TIMING_TWP_CNT_SHIFT)
129*a430fa06SMiquel Raynal #define TIMING_TRH_CNT_SHIFT		4
130*a430fa06SMiquel Raynal #define TIMING_TRH_CNT_MASK		(3 << TIMING_TRH_CNT_SHIFT)
131*a430fa06SMiquel Raynal #define TIMING_TRP_CNT_SHIFT		0
132*a430fa06SMiquel Raynal #define TIMING_TRP_CNT_MASK		(0xf << TIMING_TRP_CNT_SHIFT)
133*a430fa06SMiquel Raynal 
134*a430fa06SMiquel Raynal #define RESP_0				0x18
135*a430fa06SMiquel Raynal 
136*a430fa06SMiquel Raynal #define TIMING2_0			0x1C
137*a430fa06SMiquel Raynal #define TIMING2_TADL_CNT_SHIFT		0
138*a430fa06SMiquel Raynal #define TIMING2_TADL_CNT_MASK		(0xf << TIMING2_TADL_CNT_SHIFT)
139*a430fa06SMiquel Raynal 
140*a430fa06SMiquel Raynal #define CMD_REG1_0			0x20
141*a430fa06SMiquel Raynal #define CMD_REG2_0			0x24
142*a430fa06SMiquel Raynal #define ADDR_REG1_0			0x28
143*a430fa06SMiquel Raynal #define ADDR_REG2_0			0x2C
144*a430fa06SMiquel Raynal 
145*a430fa06SMiquel Raynal #define DMA_MST_CTRL_0			0x30
146*a430fa06SMiquel Raynal #define DMA_MST_CTRL_GO_MASK		(1 << 31)
147*a430fa06SMiquel Raynal #define DMA_MST_CTRL_GO_DISABLE		0
148*a430fa06SMiquel Raynal #define DMA_MST_CTRL_GO_ENABLE		(1 << 31)
149*a430fa06SMiquel Raynal #define DMA_MST_CTRL_DIR_MASK		(1 << 30)
150*a430fa06SMiquel Raynal #define DMA_MST_CTRL_DIR_READ		0
151*a430fa06SMiquel Raynal #define DMA_MST_CTRL_DIR_WRITE		(1 << 30)
152*a430fa06SMiquel Raynal #define DMA_MST_CTRL_PERF_EN_MASK	(1 << 29)
153*a430fa06SMiquel Raynal #define DMA_MST_CTRL_PERF_EN_DISABLE	0
154*a430fa06SMiquel Raynal #define DMA_MST_CTRL_PERF_EN_ENABLE	(1 << 29)
155*a430fa06SMiquel Raynal #define DMA_MST_CTRL_REUSE_BUFFER_MASK	(1 << 27)
156*a430fa06SMiquel Raynal #define DMA_MST_CTRL_REUSE_BUFFER_DISABLE	0
157*a430fa06SMiquel Raynal #define DMA_MST_CTRL_REUSE_BUFFER_ENABLE	(1 << 27)
158*a430fa06SMiquel Raynal #define DMA_MST_CTRL_BURST_SIZE_SHIFT	24
159*a430fa06SMiquel Raynal #define DMA_MST_CTRL_BURST_SIZE_MASK	(7 << DMA_MST_CTRL_BURST_SIZE_SHIFT)
160*a430fa06SMiquel Raynal enum {
161*a430fa06SMiquel Raynal 	DMA_MST_CTRL_BURST_1WORDS	= 2 << DMA_MST_CTRL_BURST_SIZE_SHIFT,
162*a430fa06SMiquel Raynal 	DMA_MST_CTRL_BURST_4WORDS	= 3 << DMA_MST_CTRL_BURST_SIZE_SHIFT,
163*a430fa06SMiquel Raynal 	DMA_MST_CTRL_BURST_8WORDS	= 4 << DMA_MST_CTRL_BURST_SIZE_SHIFT,
164*a430fa06SMiquel Raynal 	DMA_MST_CTRL_BURST_16WORDS	= 5 << DMA_MST_CTRL_BURST_SIZE_SHIFT
165*a430fa06SMiquel Raynal };
166*a430fa06SMiquel Raynal #define DMA_MST_CTRL_IS_DMA_DONE	(1 << 20)
167*a430fa06SMiquel Raynal #define DMA_MST_CTRL_EN_A_MASK		(1 << 2)
168*a430fa06SMiquel Raynal #define DMA_MST_CTRL_EN_A_DISABLE	0
169*a430fa06SMiquel Raynal #define DMA_MST_CTRL_EN_A_ENABLE	(1 << 2)
170*a430fa06SMiquel Raynal #define DMA_MST_CTRL_EN_B_MASK		(1 << 1)
171*a430fa06SMiquel Raynal #define DMA_MST_CTRL_EN_B_DISABLE	0
172*a430fa06SMiquel Raynal #define DMA_MST_CTRL_EN_B_ENABLE	(1 << 1)
173*a430fa06SMiquel Raynal 
174*a430fa06SMiquel Raynal #define DMA_CFG_A_0			0x34
175*a430fa06SMiquel Raynal #define DMA_CFG_B_0			0x38
176*a430fa06SMiquel Raynal #define FIFO_CTRL_0			0x3C
177*a430fa06SMiquel Raynal #define DATA_BLOCK_PTR_0		0x40
178*a430fa06SMiquel Raynal #define TAG_PTR_0			0x44
179*a430fa06SMiquel Raynal #define ECC_PTR_0			0x48
180*a430fa06SMiquel Raynal 
181*a430fa06SMiquel Raynal #define DEC_STATUS_0			0x4C
182*a430fa06SMiquel Raynal #define DEC_STATUS_A_ECC_FAIL		(1 << 1)
183*a430fa06SMiquel Raynal #define DEC_STATUS_B_ECC_FAIL		(1 << 0)
184*a430fa06SMiquel Raynal 
185*a430fa06SMiquel Raynal #define BCH_CONFIG_0			0xCC
186*a430fa06SMiquel Raynal #define BCH_CONFIG_BCH_TVALUE_SHIFT	4
187*a430fa06SMiquel Raynal #define BCH_CONFIG_BCH_TVALUE_MASK	(3 << BCH_CONFIG_BCH_TVALUE_SHIFT)
188*a430fa06SMiquel Raynal enum {
189*a430fa06SMiquel Raynal 	BCH_CONFIG_BCH_TVAL4	= 0 << BCH_CONFIG_BCH_TVALUE_SHIFT,
190*a430fa06SMiquel Raynal 	BCH_CONFIG_BCH_TVAL8	= 1 << BCH_CONFIG_BCH_TVALUE_SHIFT,
191*a430fa06SMiquel Raynal 	BCH_CONFIG_BCH_TVAL14	= 2 << BCH_CONFIG_BCH_TVALUE_SHIFT,
192*a430fa06SMiquel Raynal 	BCH_CONFIG_BCH_TVAL16	= 3 << BCH_CONFIG_BCH_TVALUE_SHIFT
193*a430fa06SMiquel Raynal };
194*a430fa06SMiquel Raynal #define BCH_CONFIG_BCH_ECC_MASK		(1 << 0)
195*a430fa06SMiquel Raynal #define BCH_CONFIG_BCH_ECC_DISABLE	0
196*a430fa06SMiquel Raynal #define BCH_CONFIG_BCH_ECC_ENABLE	(1 << 0)
197*a430fa06SMiquel Raynal 
198*a430fa06SMiquel Raynal #define BCH_DEC_RESULT_0			0xD0
199*a430fa06SMiquel Raynal #define BCH_DEC_RESULT_CORRFAIL_ERR_MASK	(1 << 8)
200*a430fa06SMiquel Raynal #define BCH_DEC_RESULT_PAGE_COUNT_MASK		0xFF
201*a430fa06SMiquel Raynal 
202*a430fa06SMiquel Raynal #define BCH_DEC_STATUS_BUF_0			0xD4
203*a430fa06SMiquel Raynal #define BCH_DEC_STATUS_FAIL_SEC_FLAG_MASK	0xFF000000
204*a430fa06SMiquel Raynal #define BCH_DEC_STATUS_CORR_SEC_FLAG_MASK	0x00FF0000
205*a430fa06SMiquel Raynal #define BCH_DEC_STATUS_FAIL_TAG_MASK		(1 << 14)
206*a430fa06SMiquel Raynal #define BCH_DEC_STATUS_CORR_TAG_MASK		(1 << 13)
207*a430fa06SMiquel Raynal #define BCH_DEC_STATUS_MAX_CORR_CNT_MASK	(0x1f << 8)
208*a430fa06SMiquel Raynal #define BCH_DEC_STATUS_PAGE_NUMBER_MASK		0xFF
209*a430fa06SMiquel Raynal 
210*a430fa06SMiquel Raynal #define LP_OPTIONS	0
211*a430fa06SMiquel Raynal 
212*a430fa06SMiquel Raynal struct nand_ctlr {
213*a430fa06SMiquel Raynal 	u32	command;	/* offset 00h */
214*a430fa06SMiquel Raynal 	u32	status;		/* offset 04h */
215*a430fa06SMiquel Raynal 	u32	isr;		/* offset 08h */
216*a430fa06SMiquel Raynal 	u32	ier;		/* offset 0Ch */
217*a430fa06SMiquel Raynal 	u32	config;		/* offset 10h */
218*a430fa06SMiquel Raynal 	u32	timing;		/* offset 14h */
219*a430fa06SMiquel Raynal 	u32	resp;		/* offset 18h */
220*a430fa06SMiquel Raynal 	u32	timing2;	/* offset 1Ch */
221*a430fa06SMiquel Raynal 	u32	cmd_reg1;	/* offset 20h */
222*a430fa06SMiquel Raynal 	u32	cmd_reg2;	/* offset 24h */
223*a430fa06SMiquel Raynal 	u32	addr_reg1;	/* offset 28h */
224*a430fa06SMiquel Raynal 	u32	addr_reg2;	/* offset 2Ch */
225*a430fa06SMiquel Raynal 	u32	dma_mst_ctrl;	/* offset 30h */
226*a430fa06SMiquel Raynal 	u32	dma_cfg_a;	/* offset 34h */
227*a430fa06SMiquel Raynal 	u32	dma_cfg_b;	/* offset 38h */
228*a430fa06SMiquel Raynal 	u32	fifo_ctrl;	/* offset 3Ch */
229*a430fa06SMiquel Raynal 	u32	data_block_ptr;	/* offset 40h */
230*a430fa06SMiquel Raynal 	u32	tag_ptr;	/* offset 44h */
231*a430fa06SMiquel Raynal 	u32	resv1;		/* offset 48h */
232*a430fa06SMiquel Raynal 	u32	dec_status;	/* offset 4Ch */
233*a430fa06SMiquel Raynal 	u32	hwstatus_cmd;	/* offset 50h */
234*a430fa06SMiquel Raynal 	u32	hwstatus_mask;	/* offset 54h */
235*a430fa06SMiquel Raynal 	u32	resv2[29];
236*a430fa06SMiquel Raynal 	u32	bch_config;	/* offset CCh */
237*a430fa06SMiquel Raynal 	u32	bch_dec_result;	/* offset D0h */
238*a430fa06SMiquel Raynal 	u32	bch_dec_status_buf;
239*a430fa06SMiquel Raynal 				/* offset D4h */
240*a430fa06SMiquel Raynal };
241