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