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