xref: /rk3399_ARM-atf/include/drivers/cadence/cdns_nand.h (revision 6f7f8b18e9641d34c5b02b5f5e050d6e0fae12fc)
1ddaf02d1SJit Loon Lim /*
2ddaf02d1SJit Loon Lim  * Copyright (c) 2022-2023, Intel Corporation. All rights reserved.
3*6f7f8b18SGirisha Dengi  * Copyright (c) 2025, Altera Corporation. All rights reserved.
4ddaf02d1SJit Loon Lim  *
5ddaf02d1SJit Loon Lim  * SPDX-License-Identifier: BSD-3-Clause
6ddaf02d1SJit Loon Lim  */
7ddaf02d1SJit Loon Lim 
8ddaf02d1SJit Loon Lim #ifndef CDN_NAND_H
9ddaf02d1SJit Loon Lim #define CDN_NAND_H
10ddaf02d1SJit Loon Lim 
11ddaf02d1SJit Loon Lim #include <drivers/cadence/cdns_combo_phy.h>
12ddaf02d1SJit Loon Lim 
13*6f7f8b18SGirisha Dengi // TBD: Move to common place
14*6f7f8b18SGirisha Dengi #define __bf_shf(x)			(__builtin_ffsll(x) - 1U)
15*6f7f8b18SGirisha Dengi #define FIELD_GET(_mask, _reg)						\
16*6f7f8b18SGirisha Dengi 	({								\
17*6f7f8b18SGirisha Dengi 		(typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask));	\
18*6f7f8b18SGirisha Dengi 	})
19*6f7f8b18SGirisha Dengi 
20*6f7f8b18SGirisha Dengi #define FIELD_PREP(_mask, _val)						\
21*6f7f8b18SGirisha Dengi 	({ \
22*6f7f8b18SGirisha Dengi 		((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask);	\
23*6f7f8b18SGirisha Dengi 	})
24*6f7f8b18SGirisha Dengi 
25ddaf02d1SJit Loon Lim /* NAND flash device information */
26ddaf02d1SJit Loon Lim typedef struct cnf_dev_info {
27*6f7f8b18SGirisha Dengi 	uint8_t mfr_id;
28*6f7f8b18SGirisha Dengi 	uint8_t dev_id;
29ddaf02d1SJit Loon Lim 	uint8_t type;
30ddaf02d1SJit Loon Lim 	uint8_t nluns;
31ddaf02d1SJit Loon Lim 	uint8_t sector_cnt;
32ddaf02d1SJit Loon Lim 	uint16_t npages_per_block;
33ddaf02d1SJit Loon Lim 	uint16_t sector_size;
34ddaf02d1SJit Loon Lim 	uint16_t last_sector_size;
35ddaf02d1SJit Loon Lim 	uint16_t page_size;
36ddaf02d1SJit Loon Lim 	uint16_t spare_size;
37ddaf02d1SJit Loon Lim 	uint32_t nblocks_per_lun;
38ddaf02d1SJit Loon Lim 	uint32_t block_size;
39ddaf02d1SJit Loon Lim 	unsigned long long total_size;
40ddaf02d1SJit Loon Lim } cnf_dev_info_t;
41ddaf02d1SJit Loon Lim 
42ddaf02d1SJit Loon Lim /* Shared Macros */
43ddaf02d1SJit Loon Lim 
44ddaf02d1SJit Loon Lim /* Default values */
45ddaf02d1SJit Loon Lim #define CNF_DEF_VOL_ID			0
46ddaf02d1SJit Loon Lim #define CNF_DEF_DEVICE			0
47ddaf02d1SJit Loon Lim #define CNF_DEF_TRD			0
48*6f7f8b18SGirisha Dengi #define CNF_READ_SINGLE_PAGE		1U
49*6f7f8b18SGirisha Dengi #define CNF_DEF_DELAY_US		500U
50*6f7f8b18SGirisha Dengi #define CNF_READ_INT_DELAY_US		10U
51*6f7f8b18SGirisha Dengi 
52*6f7f8b18SGirisha Dengi /* Number of micro seconds to complete the Device Discovery Process. */
53*6f7f8b18SGirisha Dengi #define CNF_DD_INIT_COMP_US		2000000U
54ddaf02d1SJit Loon Lim 
55ddaf02d1SJit Loon Lim /* Work modes */
56*6f7f8b18SGirisha Dengi #define CNF_WORK_MODE_CDMA		0U
57*6f7f8b18SGirisha Dengi #define CNF_WORK_MODE_PIO		1U
58ddaf02d1SJit Loon Lim 
59ddaf02d1SJit Loon Lim /* Command types */
60ddaf02d1SJit Loon Lim #define CNF_CT_SET_FEATURE		0x0100
61ddaf02d1SJit Loon Lim #define CNF_CT_RESET_ASYNC		0x1100
62ddaf02d1SJit Loon Lim #define CNF_CT_RESET_SYNC		0x1101
63ddaf02d1SJit Loon Lim #define CNF_CT_RESET_LUN		0x1102
64ddaf02d1SJit Loon Lim #define CNF_CT_ERASE			0x1000
65ddaf02d1SJit Loon Lim #define CNF_CT_PAGE_PROGRAM		0x2100
66ddaf02d1SJit Loon Lim #define CNF_CT_PAGE_READ		0x2200
67ddaf02d1SJit Loon Lim 
68ddaf02d1SJit Loon Lim /* Interrupts enable or disable */
69*6f7f8b18SGirisha Dengi #define CNF_INT_EN			1U
70*6f7f8b18SGirisha Dengi #define CNF_INT_DIS			0U
71ddaf02d1SJit Loon Lim 
72ddaf02d1SJit Loon Lim /* Device types */
73ddaf02d1SJit Loon Lim #define CNF_DT_UNKNOWN			0x00
74ddaf02d1SJit Loon Lim #define CNF_DT_ONFI			0x01
75ddaf02d1SJit Loon Lim #define CNF_DT_JEDEC			0x02
76ddaf02d1SJit Loon Lim #define CNF_DT_LEGACY			0x03
77ddaf02d1SJit Loon Lim 
78ddaf02d1SJit Loon Lim /* Command and status registers */
79ddaf02d1SJit Loon Lim #define CNF_CMDREG_REG_BASE		SOCFPGA_NAND_REG_BASE
80ddaf02d1SJit Loon Lim 
81ddaf02d1SJit Loon Lim /* DMA maximum burst size 0-127*/
82*6f7f8b18SGirisha Dengi #define CNF_DMA_BURST_SIZE_MAX		127U
83ddaf02d1SJit Loon Lim 
84ddaf02d1SJit Loon Lim /* DMA settings register field offsets */
85*6f7f8b18SGirisha Dengi #define CNF_DMA_SETTINGS_BURST		0U
86*6f7f8b18SGirisha Dengi #define CNF_DMA_SETTINGS_OTE		16U
87*6f7f8b18SGirisha Dengi #define CNF_DMA_SETTINGS_SDMA_ER	17U
88ddaf02d1SJit Loon Lim 
89*6f7f8b18SGirisha Dengi #define CNF_DMA_MASTER_SEL		1U
90*6f7f8b18SGirisha Dengi #define CNF_DMA_SLAVE_SEL		0U
91ddaf02d1SJit Loon Lim 
92ddaf02d1SJit Loon Lim /* DMA FIFO trigger level register field offsets */
93*6f7f8b18SGirisha Dengi #define CNF_FIFO_TLEVEL_POS		0U
94*6f7f8b18SGirisha Dengi #define CNF_FIFO_TLEVEL_DMA_SIZE	16U
95ddaf02d1SJit Loon Lim #define CNF_DMA_PREFETCH_SIZE		(1024 / 8)
96ddaf02d1SJit Loon Lim 
97ddaf02d1SJit Loon Lim #define CNF_GET_CTRL_BUSY(x)		(x & (1 << 8))
98ddaf02d1SJit Loon Lim #define CNF_GET_INIT_COMP(x)		(x & (1 << 9))
99ddaf02d1SJit Loon Lim 
100ddaf02d1SJit Loon Lim /* Command register0 field offsets */
101*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_CT			30U
102*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_TRD			24U
103*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_INTR		20U
104*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_DMA			21U
105*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_VOL			16U
106*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_CMD			0U
107*6f7f8b18SGirisha Dengi #define CNF_CMDREG4_MEM			24U
108ddaf02d1SJit Loon Lim 
109ddaf02d1SJit Loon Lim /* Command status register field offsets */
110ddaf02d1SJit Loon Lim #define CNF_ECMD			BIT(0)
111ddaf02d1SJit Loon Lim #define CNF_EECC			BIT(1)
112ddaf02d1SJit Loon Lim #define CNF_EMAX			BIT(2)
113ddaf02d1SJit Loon Lim #define CNF_EDEV			BIT(12)
114ddaf02d1SJit Loon Lim #define CNF_EDQS			BIT(13)
115ddaf02d1SJit Loon Lim #define CNF_EFAIL			BIT(14)
116ddaf02d1SJit Loon Lim #define CNF_CMPLT			BIT(15)
117ddaf02d1SJit Loon Lim #define CNF_EBUS			BIT(16)
118ddaf02d1SJit Loon Lim #define CNF_EDI				BIT(17)
119ddaf02d1SJit Loon Lim #define CNF_EPAR			BIT(18)
120ddaf02d1SJit Loon Lim #define CNF_ECTX			BIT(19)
121ddaf02d1SJit Loon Lim #define CNF_EPRO			BIT(20)
122ddaf02d1SJit Loon Lim #define CNF_EIDX			BIT(24)
123ddaf02d1SJit Loon Lim 
124ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG0		0x00
125ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG1		0x04
126ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG2		0x08
127ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG3		0x0C
128ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_STAT_PTR		0x10
129ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_STAT		0x14
130ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG4		0x20
131ddaf02d1SJit Loon Lim #define CNF_CMDREG_CTRL_STATUS		0x118
132ddaf02d1SJit Loon Lim #define CNF_CMDREG_TRD_STATUS		0x120
133ddaf02d1SJit Loon Lim 
134ddaf02d1SJit Loon Lim #define CNF_CMDREG(_reg)		(CNF_CMDREG_REG_BASE \
135ddaf02d1SJit Loon Lim 						+ (CNF_CMDREG_##_reg))
136ddaf02d1SJit Loon Lim 
137ddaf02d1SJit Loon Lim /* Controller configuration registers */
138ddaf02d1SJit Loon Lim #define CNF_LSB16_MASK			0xFFFF
139ddaf02d1SJit Loon Lim #define CNF_GET_NPAGES_PER_BLOCK(x)	(x & CNF_LSB16_MASK)
140ddaf02d1SJit Loon Lim 
141ddaf02d1SJit Loon Lim #define CNF_GET_SCTR_SIZE(x)		(x & CNF_LSB16_MASK)
142ddaf02d1SJit Loon Lim #define CNF_GET_LAST_SCTR_SIZE(x)	((x >> 16) & CNF_LSB16_MASK)
143ddaf02d1SJit Loon Lim 
144ddaf02d1SJit Loon Lim #define CNF_GET_PAGE_SIZE(x)		(x & CNF_LSB16_MASK)
145ddaf02d1SJit Loon Lim #define CNF_GET_SPARE_SIZE(x)		((x >> 16) & CNF_LSB16_MASK)
146ddaf02d1SJit Loon Lim 
147ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_REG_BASE		0x10B80400
148ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_TRANS_CFG0		0x00
149ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_TRANS_CFG1		0x04
150ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_LONG_POLL		0x08
151ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_SHORT_POLL		0x0C
152*6f7f8b18SGirisha Dengi #define CNF_CTRLCFG_RDST_CTRL_0		0x10
153ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_DEV_LAYOUT		0x24
154ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_ECC_CFG0		0x28
155ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_ECC_CFG1		0x2C
156ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_MULTIPLANE_CFG	0x34
157ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_CACHE_CFG		0x38
158ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_DMA_SETTINGS	0x3C
159ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_FIFO_TLEVEL		0x54
160ddaf02d1SJit Loon Lim 
161*6f7f8b18SGirisha Dengi #define CNF_ECC_EN			BIT(0)
162*6f7f8b18SGirisha Dengi #define CNF_ECC_ERASE_DET_EN		BIT(1)
163*6f7f8b18SGirisha Dengi #define CNF_ECC_CORR_STR_MASK		GENMASK(10, 8)
164*6f7f8b18SGirisha Dengi #define CNF_ECC_CORR_STR		0x02
165*6f7f8b18SGirisha Dengi 
166*6f7f8b18SGirisha Dengi #define CNF_ECC_CFG0_VAL		((CNF_ECC_EN) | \
167*6f7f8b18SGirisha Dengi 					 (CNF_ECC_ERASE_DET_EN) | \
168*6f7f8b18SGirisha Dengi 					 (FIELD_PREP(CNF_ECC_CORR_STR_MASK, CNF_ECC_CORR_STR)))
169*6f7f8b18SGirisha Dengi 
170*6f7f8b18SGirisha Dengi /* Transfer configuration 0 and 1 register settings. */
171*6f7f8b18SGirisha Dengi #define CNF_SECTOR_CNT			0x04
172*6f7f8b18SGirisha Dengi #define CNF_SECTOR_OFFSET_MASK		GENMASK(31, 16)
173*6f7f8b18SGirisha Dengi #define CNF_SECTOR_OFFSET		0x00
174*6f7f8b18SGirisha Dengi 
175*6f7f8b18SGirisha Dengi #define CNF_TRANS_CFG0_VAL		((CNF_SECTOR_CNT) | \
176*6f7f8b18SGirisha Dengi 					 (FIELD_PREP(CNF_SECTOR_OFFSET_MASK, CNF_SECTOR_OFFSET)))
177*6f7f8b18SGirisha Dengi 
178*6f7f8b18SGirisha Dengi #define CNF_SECTOR_SIZE			0x0800
179*6f7f8b18SGirisha Dengi #define CNF_LAST_SECTOR_MASK		GENMASK(31, 16)
180*6f7f8b18SGirisha Dengi #define CNF_LAST_SECTOR_SIZE		0x0828
181*6f7f8b18SGirisha Dengi 
182*6f7f8b18SGirisha Dengi #define CNF_TRANS_CFG1_VAL		((CNF_SECTOR_SIZE) | \
183*6f7f8b18SGirisha Dengi 					 (FIELD_PREP(CNF_LAST_SECTOR_MASK, CNF_LAST_SECTOR_SIZE)))
184*6f7f8b18SGirisha Dengi 
185*6f7f8b18SGirisha Dengi 
186ddaf02d1SJit Loon Lim #define CNF_CTRLCFG(_reg)		(CNF_CTRLCFG_REG_BASE \
187ddaf02d1SJit Loon Lim 					+ (CNF_CTRLCFG_##_reg))
188ddaf02d1SJit Loon Lim 
189ddaf02d1SJit Loon Lim /* Data integrity registers */
190*6f7f8b18SGirisha Dengi #define CNF_DI_PAR_EN			0U
191*6f7f8b18SGirisha Dengi #define CNF_DI_CRC_EN			1U
192ddaf02d1SJit Loon Lim 
193ddaf02d1SJit Loon Lim #define CNF_DI_REG_BASE			0x10B80700
194ddaf02d1SJit Loon Lim #define CNF_DI_CONTROL			0x00
195ddaf02d1SJit Loon Lim #define CNF_DI_INJECT0			0x04
196ddaf02d1SJit Loon Lim #define CNF_DI_INJECT1			0x08
197ddaf02d1SJit Loon Lim #define CNF_DI_ERR_REG_ADDR		0x0C
198ddaf02d1SJit Loon Lim #define CNF_DI_INJECT2			0x10
199ddaf02d1SJit Loon Lim 
200ddaf02d1SJit Loon Lim #define CNF_DI(_reg)			(CNF_DI_REG_BASE \
201ddaf02d1SJit Loon Lim 					+ (CNF_DI_##_reg))
202ddaf02d1SJit Loon Lim 
203ddaf02d1SJit Loon Lim /* Controller parameter registers */
204ddaf02d1SJit Loon Lim #define CNF_NTHREADS_MASK		0x07
205ddaf02d1SJit Loon Lim #define CNF_GET_NLUNS(x)		(x & 0xFF)
206ddaf02d1SJit Loon Lim #define CNF_GET_DEV_TYPE(x)		((x >> 30) & 0x03)
207ddaf02d1SJit Loon Lim #define CNF_GET_NTHREADS(x)		(1 << (x & CNF_NTHREADS_MASK))
208ddaf02d1SJit Loon Lim 
209ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_REG_BASE		0x10B80800
210ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_VERSION		0x00
211ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_FEATURE		0x04
212ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_MFR_ID		0x08
213ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_AREA		0x0C
214ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_PARAMS0	0x10
215ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_PARAMS1	0x14
216ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_FEATUERS	0x18
217ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_BLOCKS_PLUN	0x1C
218ddaf02d1SJit Loon Lim 
219*6f7f8b18SGirisha Dengi #define CNF_MFR_ID_MASK			GENMASK(7, 0)
220*6f7f8b18SGirisha Dengi #define CNF_DEV_ID_MASK			GENMASK(23, 16)
221*6f7f8b18SGirisha Dengi 
222ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM(_reg)		(CNF_CTRLPARAM_REG_BASE \
223ddaf02d1SJit Loon Lim 					+ (CNF_CTRLPARAM_##_reg))
224ddaf02d1SJit Loon Lim 
225ddaf02d1SJit Loon Lim /* Protection mechanism registers */
226ddaf02d1SJit Loon Lim #define CNF_PROT_REG_BASE		0x10B80900
227ddaf02d1SJit Loon Lim #define CNF_PROT_CTRL0			0x00
228ddaf02d1SJit Loon Lim #define CNF_PROT_DOWN0			0x04
229ddaf02d1SJit Loon Lim #define CNF_PROT_UP0			0x08
230ddaf02d1SJit Loon Lim #define CNF_PROT_CTRL1			0x10
231ddaf02d1SJit Loon Lim #define CNF_PROT_DOWN1			0x14
232ddaf02d1SJit Loon Lim #define CNF_PROT_UP1			0x18
233ddaf02d1SJit Loon Lim 
234ddaf02d1SJit Loon Lim #define CNF_PROT(_reg)			(CNF_PROT_REG_BASE \
235ddaf02d1SJit Loon Lim 					+ (CNF_PROT_##_reg))
236ddaf02d1SJit Loon Lim 
237ddaf02d1SJit Loon Lim /* Mini controller registers */
238ddaf02d1SJit Loon Lim #define CNF_MINICTRL_REG_BASE		0x10B81000
239ddaf02d1SJit Loon Lim 
240ddaf02d1SJit Loon Lim /* Operation work modes */
241*6f7f8b18SGirisha Dengi #define CNF_OPR_WORK_MODE_SDR		0U
242*6f7f8b18SGirisha Dengi #define CNF_OPR_WORK_MODE_NVDDR		1U
243*6f7f8b18SGirisha Dengi #define CNF_OPR_WORK_MODE_RES		3U
244ddaf02d1SJit Loon Lim 
245ddaf02d1SJit Loon Lim /* Mini controller common settings register field offsets */
246a773f412SGirisha Dengi #define CNF_CMN_SETTINGS_OPR_MASK	0x00000003
247*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_WR_WUP		20U
248*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_RD_WUP		16U
249*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_DEV16		8U
250*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_OPR		0U
251ddaf02d1SJit Loon Lim 
252ddaf02d1SJit Loon Lim /* Async mode register field offsets */
253*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TRH		24U
254*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TRP		16U
255*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TWH		8U
256*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TWP		0U
257*6f7f8b18SGirisha Dengi 
258*6f7f8b18SGirisha Dengi /*
259*6f7f8b18SGirisha Dengi  * The number of clock cycles (nf_clk) the mini controller needs to
260*6f7f8b18SGirisha Dengi  * assert/de-assert WE# and assert/de-assert RE# signals in SDR asynchronous mode.
261*6f7f8b18SGirisha Dengi  */
262*6f7f8b18SGirisha Dengi #define CNF_ASYNC_NCLOCK_CYCLES		0x09
263*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TOGGLE_TIMINGS_VAL	((CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TRH) | \
264*6f7f8b18SGirisha Dengi 					(CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TRP)  | \
265*6f7f8b18SGirisha Dengi 					(CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TWH)  | \
266*6f7f8b18SGirisha Dengi 					(CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TWP))
267*6f7f8b18SGirisha Dengi 
268*6f7f8b18SGirisha Dengi /*
269*6f7f8b18SGirisha Dengi  * Default value from the datasheet: The number of clock cycles (nf_clk) between
270*6f7f8b18SGirisha Dengi  * the de-assertion of the DLL update request and resuming traffic to the PHY.
271*6f7f8b18SGirisha Dengi  */
272*6f7f8b18SGirisha Dengi #define RESYNC_IDLE_CNT			0x07
273*6f7f8b18SGirisha Dengi #define RESYNC_IDLE_CNT_MASK		GENMASK(7, 0)
274*6f7f8b18SGirisha Dengi 
275*6f7f8b18SGirisha Dengi /*
276*6f7f8b18SGirisha Dengi  * Default value from the datasheet: The number of clock cycles (nf_clk) for which
277*6f7f8b18SGirisha Dengi  * the DLL update request has to be asserted, to resynchronize the DLLs and read
278*6f7f8b18SGirisha Dengi  * and write FIFO pointers.
279*6f7f8b18SGirisha Dengi  */
280*6f7f8b18SGirisha Dengi #define RESYNC_HIGH_CNT			0x07
281*6f7f8b18SGirisha Dengi #define RESYNC_HIGH_CNT_MASK		GENMASK(11, 8)
282*6f7f8b18SGirisha Dengi 
283*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_RST_N		BIT(24)
284*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_EXT_WR_MODE		BIT(17)
285*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_EXT_RD_MODE		BIT(16)
286*6f7f8b18SGirisha Dengi 
287*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_CTRL_VAL		((CNF_DLL_PHY_RST_N) | \
288*6f7f8b18SGirisha Dengi 					(CNF_DLL_PHY_EXT_WR_MODE) | \
289*6f7f8b18SGirisha Dengi 					(CNF_DLL_PHY_EXT_RD_MODE) | \
290*6f7f8b18SGirisha Dengi 					(FIELD_PREP(RESYNC_IDLE_CNT_MASK, RESYNC_IDLE_CNT)) | \
291*6f7f8b18SGirisha Dengi 					(FIELD_PREP(RESYNC_HIGH_CNT_MASK, RESYNC_HIGH_CNT)))
292*6f7f8b18SGirisha Dengi 
293*6f7f8b18SGirisha Dengi /* Global timings configurations */
294*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS0_VAL	0x4f631727
295*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS1_VAL	0x28300063
296*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS2_VAL	0x00c7030d
297ddaf02d1SJit Loon Lim 
298ddaf02d1SJit Loon Lim /* Mini controller DLL PHY controller register field offsets */
299ddaf02d1SJit Loon Lim #define CNF_MINICTRL_WP_SETTINGS	0x00
300ddaf02d1SJit Loon Lim #define CNF_MINICTRL_RBN_SETTINGS	0x04
301ddaf02d1SJit Loon Lim #define CNF_MINICTRL_CMN_SETTINGS	0x08
302ddaf02d1SJit Loon Lim #define CNF_MINICTRL_SKIP_BYTES_CFG	0x0C
303ddaf02d1SJit Loon Lim #define CNF_MINICTRL_SKIP_BYTES_OFFSET	0x10
304ddaf02d1SJit Loon Lim #define CNF_MINICTRL_TOGGLE_TIMINGS0	0x14
305ddaf02d1SJit Loon Lim #define CNF_MINICTRL_TOGGLE_TIMINGS1	0x18
306ddaf02d1SJit Loon Lim #define CNF_MINICTRL_ASYNC_TOGGLE_TIMINGS 0x1C
307ddaf02d1SJit Loon Lim #define CNF_MINICTRL_SYNC_TIMINGS	0x20
308*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS0		0x24
309*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS1		0x28
310*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS2		0x2C
311*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_DLL_PHY_UPDATE_CNT	0x30
312ddaf02d1SJit Loon Lim #define CNF_MINICTRL_DLL_PHY_CTRL	0x34
313ddaf02d1SJit Loon Lim 
314*6f7f8b18SGirisha Dengi /*
315*6f7f8b18SGirisha Dengi  * Number of bytes to skip from offset of block.
316*6f7f8b18SGirisha Dengi  * The bytes are written with the value programmed in the marker field.
317*6f7f8b18SGirisha Dengi  */
318*6f7f8b18SGirisha Dengi #define CNF_NSKIP_BYTES			0x02
319*6f7f8b18SGirisha Dengi #define CNF_MARKER_VAL			0xFFFF
320*6f7f8b18SGirisha Dengi #define CNF_MARKER_MASK			GENMASK(31, 16)
321*6f7f8b18SGirisha Dengi #define CNF_SKIP_BYTES_CFG_VAL		((CNF_NSKIP_BYTES) | \
322*6f7f8b18SGirisha Dengi 					(FIELD_PREP(CNF_MARKER_MASK, CNF_MARKER_VAL)))
323*6f7f8b18SGirisha Dengi 
324*6f7f8b18SGirisha Dengi /* Offset after which the controller starts sending the dummy bytest to the device. */
325*6f7f8b18SGirisha Dengi #define CNF_SKIP_BYTES_OFFSET_VAL	(0x00002000)
326*6f7f8b18SGirisha Dengi 
327ddaf02d1SJit Loon Lim #define CNF_MINICTRL(_reg)		(CNF_MINICTRL_REG_BASE \
328ddaf02d1SJit Loon Lim 					+ (CNF_MINICTRL_##_reg))
329ddaf02d1SJit Loon Lim 
330ddaf02d1SJit Loon Lim /*
331ddaf02d1SJit Loon Lim  * @brief Nand IO MTD initialization routine
332ddaf02d1SJit Loon Lim  *
333ddaf02d1SJit Loon Lim  * @total_size: [out] Total size of the NAND flash device
334ddaf02d1SJit Loon Lim  * @erase_size: [out] Minimum erase size of the NAND flash device
335ddaf02d1SJit Loon Lim  * Return: 0 on success, a negative errno on failure
336ddaf02d1SJit Loon Lim  */
337*6f7f8b18SGirisha Dengi int cdns_nand_init_mtd(unsigned long long *total_size, unsigned int *erase_size);
338ddaf02d1SJit Loon Lim 
339ddaf02d1SJit Loon Lim /*
340ddaf02d1SJit Loon Lim  * @brief Read bytes from the NAND flash device
341ddaf02d1SJit Loon Lim  *
342ddaf02d1SJit Loon Lim  * @offset: Byte offset to read from in device
343ddaf02d1SJit Loon Lim  * @buffer: [out] Bytes read from device
344ddaf02d1SJit Loon Lim  * @length: Number of bytes to read
345ddaf02d1SJit Loon Lim  * @out_length: [out] Number of bytes read from device
346ddaf02d1SJit Loon Lim  * Return: 0 on success, a negative errno on failure
347ddaf02d1SJit Loon Lim  */
348*6f7f8b18SGirisha Dengi int cdns_nand_read(unsigned int offset, uintptr_t buffer, size_t length, size_t *out_length);
349ddaf02d1SJit Loon Lim 
350*6f7f8b18SGirisha Dengi /*
351*6f7f8b18SGirisha Dengi  * @brief NAND Flash Controller/Host initialization
352*6f7f8b18SGirisha Dengi  * Return: 0 on success, a negative errno on failure
353*6f7f8b18SGirisha Dengi  */
354ddaf02d1SJit Loon Lim int cdns_nand_host_init(void);
355ddaf02d1SJit Loon Lim 
356ddaf02d1SJit Loon Lim #endif
357