xref: /rk3399_ARM-atf/include/drivers/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_NAND_H
8*b114abb6SLionel Debieve #define DRIVERS_NAND_H
9*b114abb6SLionel Debieve 
10*b114abb6SLionel Debieve #include <stddef.h>
11*b114abb6SLionel Debieve #include <stdint.h>
12*b114abb6SLionel Debieve 
13*b114abb6SLionel Debieve #include <lib/utils_def.h>
14*b114abb6SLionel Debieve 
15*b114abb6SLionel Debieve #define PSEC_TO_MSEC(x)	div_round_up((x), 1000000000ULL)
16*b114abb6SLionel Debieve 
17*b114abb6SLionel Debieve struct ecc {
18*b114abb6SLionel Debieve 	unsigned int mode; /* ECC mode NAND_ECC_MODE_{NONE|HW|ONDIE} */
19*b114abb6SLionel Debieve 	unsigned int size; /* Data byte per ECC step */
20*b114abb6SLionel Debieve 	unsigned int bytes; /* ECC bytes per step */
21*b114abb6SLionel Debieve 	unsigned int max_bit_corr; /* Max correctible bits per ECC steps */
22*b114abb6SLionel Debieve };
23*b114abb6SLionel Debieve 
24*b114abb6SLionel Debieve struct nand_device {
25*b114abb6SLionel Debieve 	unsigned int block_size;
26*b114abb6SLionel Debieve 	unsigned int page_size;
27*b114abb6SLionel Debieve 	unsigned long long size;
28*b114abb6SLionel Debieve 	unsigned int nb_planes;
29*b114abb6SLionel Debieve 	unsigned int buswidth;
30*b114abb6SLionel Debieve 	struct ecc ecc;
31*b114abb6SLionel Debieve 	int (*mtd_block_is_bad)(unsigned int block);
32*b114abb6SLionel Debieve 	int (*mtd_read_page)(struct nand_device *nand, unsigned int page,
33*b114abb6SLionel Debieve 			     uintptr_t buffer);
34*b114abb6SLionel Debieve };
35*b114abb6SLionel Debieve 
36*b114abb6SLionel Debieve /*
37*b114abb6SLionel Debieve  * Read bytes from NAND device
38*b114abb6SLionel Debieve  *
39*b114abb6SLionel Debieve  * @offset: Byte offset to read from in device
40*b114abb6SLionel Debieve  * @buffer: [out] Bytes read from device
41*b114abb6SLionel Debieve  * @length: Number of bytes to read
42*b114abb6SLionel Debieve  * @length_read: [out] Number of bytes read from device
43*b114abb6SLionel Debieve  * Return: 0 on success, a negative errno on failure
44*b114abb6SLionel Debieve  */
45*b114abb6SLionel Debieve int nand_read(unsigned int offset, uintptr_t buffer, size_t length,
46*b114abb6SLionel Debieve 	      size_t *length_read);
47*b114abb6SLionel Debieve 
48*b114abb6SLionel Debieve /*
49*b114abb6SLionel Debieve  * Get NAND device instance
50*b114abb6SLionel Debieve  *
51*b114abb6SLionel Debieve  * Return: NAND device instance reference
52*b114abb6SLionel Debieve  */
53*b114abb6SLionel Debieve struct nand_device *get_nand_device(void);
54*b114abb6SLionel Debieve 
55*b114abb6SLionel Debieve #endif	/* DRIVERS_NAND_H */
56