xref: /rk3399_ARM-atf/include/drivers/raw_nand.h (revision b114abb609d42a5e237a35f6e27852c9aa9ab963)
1*b114abb6SLionel Debieve /*
2*b114abb6SLionel Debieve  * Copyright (c) 2019, STMicroelectronics - All Rights Reserved
3*b114abb6SLionel Debieve  *
4*b114abb6SLionel Debieve  * SPDX-License-Identifier: BSD-3-Clause
5*b114abb6SLionel Debieve  */
6*b114abb6SLionel Debieve 
7*b114abb6SLionel Debieve #ifndef DRIVERS_RAW_NAND_H
8*b114abb6SLionel Debieve #define DRIVERS_RAW_NAND_H
9*b114abb6SLionel Debieve 
10*b114abb6SLionel Debieve #include <stdint.h>
11*b114abb6SLionel Debieve 
12*b114abb6SLionel Debieve #include <drivers/nand.h>
13*b114abb6SLionel Debieve 
14*b114abb6SLionel Debieve /* NAND ONFI default value mode 0 in picosecond */
15*b114abb6SLionel Debieve #define NAND_TADL_MIN			400000UL
16*b114abb6SLionel Debieve #define NAND_TALH_MIN			20000UL
17*b114abb6SLionel Debieve #define NAND_TALS_MIN			50000UL
18*b114abb6SLionel Debieve #define NAND_TAR_MIN			25000UL
19*b114abb6SLionel Debieve #define NAND_TCCS_MIN			500000UL
20*b114abb6SLionel Debieve #define NAND_TCEA_MIN			100000UL
21*b114abb6SLionel Debieve #define NAND_TCEH_MIN			20000UL
22*b114abb6SLionel Debieve #define NAND_TCH_MIN			20000UL
23*b114abb6SLionel Debieve #define NAND_TCHZ_MAX			100000UL
24*b114abb6SLionel Debieve #define NAND_TCLH_MIN			20000UL
25*b114abb6SLionel Debieve #define NAND_TCLR_MIN			20000UL
26*b114abb6SLionel Debieve #define NAND_TCLS_MIN			50000UL
27*b114abb6SLionel Debieve #define NAND_TCOH_MIN			0UL
28*b114abb6SLionel Debieve #define NAND_TCS_MIN			70000UL
29*b114abb6SLionel Debieve #define NAND_TDH_MIN			20000UL
30*b114abb6SLionel Debieve #define NAND_TDS_MIN			40000UL
31*b114abb6SLionel Debieve #define NAND_TFEAT_MAX			1000000UL
32*b114abb6SLionel Debieve #define NAND_TIR_MIN			10000UL
33*b114abb6SLionel Debieve #define NAND_TITC_MIN			1000000UL
34*b114abb6SLionel Debieve #define NAND_TR_MAX			200000000UL
35*b114abb6SLionel Debieve #define NAND_TRC_MIN			100000UL
36*b114abb6SLionel Debieve #define NAND_TREA_MAX			40000UL
37*b114abb6SLionel Debieve #define NAND_TREH_MIN			30000UL
38*b114abb6SLionel Debieve #define NAND_TRHOH_MIN			0UL
39*b114abb6SLionel Debieve #define NAND_TRHW_MIN			200000UL
40*b114abb6SLionel Debieve #define NAND_TRHZ_MAX			200000UL
41*b114abb6SLionel Debieve #define NAND_TRLOH_MIN			0UL
42*b114abb6SLionel Debieve #define NAND_TRP_MIN			50000UL
43*b114abb6SLionel Debieve #define NAND_TRR_MIN			40000UL
44*b114abb6SLionel Debieve #define NAND_TRST_MAX			250000000000ULL
45*b114abb6SLionel Debieve #define NAND_TWB_MAX			200000UL
46*b114abb6SLionel Debieve #define NAND_TWC_MIN			100000UL
47*b114abb6SLionel Debieve #define NAND_TWH_MIN			30000UL
48*b114abb6SLionel Debieve #define NAND_TWHR_MIN			120000UL
49*b114abb6SLionel Debieve #define NAND_TWP_MIN			50000UL
50*b114abb6SLionel Debieve #define NAND_TWW_MIN			100000UL
51*b114abb6SLionel Debieve 
52*b114abb6SLionel Debieve /* NAND request types */
53*b114abb6SLionel Debieve #define NAND_REQ_CMD			0x0000U
54*b114abb6SLionel Debieve #define NAND_REQ_ADDR			0x1000U
55*b114abb6SLionel Debieve #define NAND_REQ_DATAIN			0x2000U
56*b114abb6SLionel Debieve #define NAND_REQ_DATAOUT		0x3000U
57*b114abb6SLionel Debieve #define NAND_REQ_WAIT			0x4000U
58*b114abb6SLionel Debieve #define NAND_REQ_MASK			GENMASK(14, 12)
59*b114abb6SLionel Debieve #define NAND_REQ_BUS_WIDTH_8		BIT(15)
60*b114abb6SLionel Debieve 
61*b114abb6SLionel Debieve #define PARAM_PAGE_SIZE			256
62*b114abb6SLionel Debieve 
63*b114abb6SLionel Debieve /* NAND ONFI commands */
64*b114abb6SLionel Debieve #define NAND_CMD_READ_1ST		0x00U
65*b114abb6SLionel Debieve #define NAND_CMD_CHANGE_1ST		0x05U
66*b114abb6SLionel Debieve #define NAND_CMD_READID_SIG_ADDR	0x20U
67*b114abb6SLionel Debieve #define NAND_CMD_READ_2ND		0x30U
68*b114abb6SLionel Debieve #define NAND_CMD_STATUS			0x70U
69*b114abb6SLionel Debieve #define NAND_CMD_READID			0x90U
70*b114abb6SLionel Debieve #define NAND_CMD_CHANGE_2ND		0xE0U
71*b114abb6SLionel Debieve #define NAND_CMD_READ_PARAM_PAGE	0xECU
72*b114abb6SLionel Debieve #define NAND_CMD_RESET			0xFFU
73*b114abb6SLionel Debieve 
74*b114abb6SLionel Debieve #define ONFI_REV_21			BIT(3)
75*b114abb6SLionel Debieve #define ONFI_FEAT_BUS_WIDTH_16		BIT(0)
76*b114abb6SLionel Debieve #define ONFI_FEAT_EXTENDED_PARAM	BIT(7)
77*b114abb6SLionel Debieve 
78*b114abb6SLionel Debieve /* NAND ECC type */
79*b114abb6SLionel Debieve #define NAND_ECC_NONE			U(0)
80*b114abb6SLionel Debieve #define NAND_ECC_HW			U(1)
81*b114abb6SLionel Debieve #define NAND_ECC_ONDIE			U(2)
82*b114abb6SLionel Debieve 
83*b114abb6SLionel Debieve /* NAND bus width */
84*b114abb6SLionel Debieve #define NAND_BUS_WIDTH_8		U(0)
85*b114abb6SLionel Debieve #define NAND_BUS_WIDTH_16		U(1)
86*b114abb6SLionel Debieve 
87*b114abb6SLionel Debieve struct nand_req {
88*b114abb6SLionel Debieve 	struct nand_device *nand;
89*b114abb6SLionel Debieve 	uint16_t type;
90*b114abb6SLionel Debieve 	uint8_t *addr;
91*b114abb6SLionel Debieve 	unsigned int length;
92*b114abb6SLionel Debieve 	unsigned int delay_ms;
93*b114abb6SLionel Debieve 	unsigned int inst_delay;
94*b114abb6SLionel Debieve };
95*b114abb6SLionel Debieve 
96*b114abb6SLionel Debieve struct nand_param_page {
97*b114abb6SLionel Debieve 	/* Rev information and feature block */
98*b114abb6SLionel Debieve 	uint32_t page_sig;
99*b114abb6SLionel Debieve 	uint16_t rev;
100*b114abb6SLionel Debieve 	uint16_t features;
101*b114abb6SLionel Debieve 	uint16_t opt_cmd;
102*b114abb6SLionel Debieve 	uint8_t jtg;
103*b114abb6SLionel Debieve 	uint8_t train_cmd;
104*b114abb6SLionel Debieve 	uint16_t ext_param_length;
105*b114abb6SLionel Debieve 	uint8_t nb_param_pages;
106*b114abb6SLionel Debieve 	uint8_t reserved1[17];
107*b114abb6SLionel Debieve 	/* Manufacturer information */
108*b114abb6SLionel Debieve 	uint8_t manufacturer[12];
109*b114abb6SLionel Debieve 	uint8_t model[20];
110*b114abb6SLionel Debieve 	uint8_t manufacturer_id;
111*b114abb6SLionel Debieve 	uint16_t data_code;
112*b114abb6SLionel Debieve 	uint8_t reserved2[13];
113*b114abb6SLionel Debieve 	/* Memory organization */
114*b114abb6SLionel Debieve 	uint32_t bytes_per_page;
115*b114abb6SLionel Debieve 	uint16_t spare_per_page;
116*b114abb6SLionel Debieve 	uint32_t bytes_per_partial;
117*b114abb6SLionel Debieve 	uint16_t spare_per_partial;
118*b114abb6SLionel Debieve 	uint32_t num_pages_per_blk;
119*b114abb6SLionel Debieve 	uint32_t num_blk_in_lun;
120*b114abb6SLionel Debieve 	uint8_t num_lun;
121*b114abb6SLionel Debieve 	uint8_t num_addr_cycles;
122*b114abb6SLionel Debieve 	uint8_t bit_per_cell;
123*b114abb6SLionel Debieve 	uint16_t max_bb_per_lun;
124*b114abb6SLionel Debieve 	uint16_t blk_endur;
125*b114abb6SLionel Debieve 	uint8_t valid_blk_begin;
126*b114abb6SLionel Debieve 	uint16_t blk_enbur_valid;
127*b114abb6SLionel Debieve 	uint8_t nb_prog_page;
128*b114abb6SLionel Debieve 	uint8_t partial_prog_attr;
129*b114abb6SLionel Debieve 	uint8_t nb_ecc_bits;
130*b114abb6SLionel Debieve 	uint8_t plane_addr;
131*b114abb6SLionel Debieve 	uint8_t mplanes_ops;
132*b114abb6SLionel Debieve 	uint8_t ez_nand;
133*b114abb6SLionel Debieve 	uint8_t reserved3[12];
134*b114abb6SLionel Debieve 	/* Electrical parameters */
135*b114abb6SLionel Debieve 	uint8_t io_pin_cap_max;
136*b114abb6SLionel Debieve 	uint16_t sdr_timing_mode;
137*b114abb6SLionel Debieve 	uint16_t sdr_prog_cache_timing;
138*b114abb6SLionel Debieve 	uint16_t tprog;
139*b114abb6SLionel Debieve 	uint16_t tbers;
140*b114abb6SLionel Debieve 	uint16_t tr;
141*b114abb6SLionel Debieve 	uint16_t tccs;
142*b114abb6SLionel Debieve 	uint8_t nvddr_timing_mode;
143*b114abb6SLionel Debieve 	uint8_t nvddr2_timing_mode;
144*b114abb6SLionel Debieve 	uint8_t nvddr_features;
145*b114abb6SLionel Debieve 	uint16_t clk_input_cap_typ;
146*b114abb6SLionel Debieve 	uint16_t io_pin_cap_typ;
147*b114abb6SLionel Debieve 	uint16_t input_pin_cap_typ;
148*b114abb6SLionel Debieve 	uint8_t input_pin_cap_max;
149*b114abb6SLionel Debieve 	uint8_t drv_strength_support;
150*b114abb6SLionel Debieve 	uint16_t tr_max;
151*b114abb6SLionel Debieve 	uint16_t tadl;
152*b114abb6SLionel Debieve 	uint16_t tr_typ;
153*b114abb6SLionel Debieve 	uint8_t reserved4[6];
154*b114abb6SLionel Debieve 	/* Vendor block */
155*b114abb6SLionel Debieve 	uint16_t vendor_revision;
156*b114abb6SLionel Debieve 	uint8_t vendor[88];
157*b114abb6SLionel Debieve 	uint16_t crc16;
158*b114abb6SLionel Debieve } __packed;
159*b114abb6SLionel Debieve 
160*b114abb6SLionel Debieve struct nand_ctrl_ops {
161*b114abb6SLionel Debieve 	int (*exec)(struct nand_req *req);
162*b114abb6SLionel Debieve 	void (*setup)(struct nand_device *nand);
163*b114abb6SLionel Debieve };
164*b114abb6SLionel Debieve 
165*b114abb6SLionel Debieve struct rawnand_device {
166*b114abb6SLionel Debieve 	struct nand_device *nand_dev;
167*b114abb6SLionel Debieve 	const struct nand_ctrl_ops *ops;
168*b114abb6SLionel Debieve };
169*b114abb6SLionel Debieve 
170*b114abb6SLionel Debieve int nand_raw_init(unsigned long long *size, unsigned int *erase_size);
171*b114abb6SLionel Debieve int nand_wait_ready(unsigned long delay);
172*b114abb6SLionel Debieve int nand_read_page_cmd(unsigned int page, unsigned int offset,
173*b114abb6SLionel Debieve 		       uintptr_t buffer, unsigned int len);
174*b114abb6SLionel Debieve int nand_change_read_column_cmd(unsigned int offset, uintptr_t buffer,
175*b114abb6SLionel Debieve 				unsigned int len);
176*b114abb6SLionel Debieve void nand_raw_ctrl_init(const struct nand_ctrl_ops *ops);
177*b114abb6SLionel Debieve 
178*b114abb6SLionel Debieve /*
179*b114abb6SLionel Debieve  * Platform can implement this to override default raw NAND instance
180*b114abb6SLionel Debieve  * configuration.
181*b114abb6SLionel Debieve  *
182*b114abb6SLionel Debieve  * @device: target raw NAND instance.
183*b114abb6SLionel Debieve  * Return 0 on success, negative value otherwise.
184*b114abb6SLionel Debieve  */
185*b114abb6SLionel Debieve int plat_get_raw_nand_data(struct rawnand_device *device);
186*b114abb6SLionel Debieve 
187*b114abb6SLionel Debieve #endif	/* DRIVERS_RAW_NAND_H */
188