xref: /rk3399_ARM-atf/include/drivers/nand.h (revision bc3eebb25d5ee340e56047d0e46b81d5af85ff17)
1b114abb6SLionel Debieve /*
2*bc3eebb2SYann Gautier  * Copyright (c) 2019-2021, STMicroelectronics - All Rights Reserved
3b114abb6SLionel Debieve  *
4b114abb6SLionel Debieve  * SPDX-License-Identifier: BSD-3-Clause
5b114abb6SLionel Debieve  */
6b114abb6SLionel Debieve 
7b114abb6SLionel Debieve #ifndef DRIVERS_NAND_H
8b114abb6SLionel Debieve #define DRIVERS_NAND_H
9b114abb6SLionel Debieve 
10b114abb6SLionel Debieve #include <stddef.h>
11b114abb6SLionel Debieve #include <stdint.h>
12b114abb6SLionel Debieve 
13b114abb6SLionel Debieve #include <lib/utils_def.h>
14b114abb6SLionel Debieve 
15b114abb6SLionel Debieve #define PSEC_TO_MSEC(x)	div_round_up((x), 1000000000ULL)
16b114abb6SLionel Debieve 
17b114abb6SLionel Debieve struct ecc {
18b114abb6SLionel Debieve 	unsigned int mode; /* ECC mode NAND_ECC_MODE_{NONE|HW|ONDIE} */
19b114abb6SLionel Debieve 	unsigned int size; /* Data byte per ECC step */
20b114abb6SLionel Debieve 	unsigned int bytes; /* ECC bytes per step */
21b114abb6SLionel Debieve 	unsigned int max_bit_corr; /* Max correctible bits per ECC steps */
22b114abb6SLionel Debieve };
23b114abb6SLionel Debieve 
24b114abb6SLionel Debieve struct nand_device {
25b114abb6SLionel Debieve 	unsigned int block_size;
26b114abb6SLionel Debieve 	unsigned int page_size;
27b114abb6SLionel Debieve 	unsigned long long size;
28b114abb6SLionel Debieve 	unsigned int nb_planes;
29b114abb6SLionel Debieve 	unsigned int buswidth;
30b114abb6SLionel Debieve 	struct ecc ecc;
31b114abb6SLionel Debieve 	int (*mtd_block_is_bad)(unsigned int block);
32b114abb6SLionel Debieve 	int (*mtd_read_page)(struct nand_device *nand, unsigned int page,
33b114abb6SLionel Debieve 			     uintptr_t buffer);
34b114abb6SLionel Debieve };
35b114abb6SLionel Debieve 
36b114abb6SLionel Debieve /*
37b114abb6SLionel Debieve  * Read bytes from NAND device
38b114abb6SLionel Debieve  *
39b114abb6SLionel Debieve  * @offset: Byte offset to read from in device
40b114abb6SLionel Debieve  * @buffer: [out] Bytes read from device
41b114abb6SLionel Debieve  * @length: Number of bytes to read
42b114abb6SLionel Debieve  * @length_read: [out] Number of bytes read from device
43b114abb6SLionel Debieve  * Return: 0 on success, a negative errno on failure
44b114abb6SLionel Debieve  */
45b114abb6SLionel Debieve int nand_read(unsigned int offset, uintptr_t buffer, size_t length,
46b114abb6SLionel Debieve 	      size_t *length_read);
47b114abb6SLionel Debieve 
48b114abb6SLionel Debieve /*
49*bc3eebb2SYann Gautier  * Look for an extra offset to be added in case of bad blocks
50*bc3eebb2SYann Gautier  *
51*bc3eebb2SYann Gautier  * @base: Base address of the area
52*bc3eebb2SYann Gautier  * @offset: Byte offset to read from in device
53*bc3eebb2SYann Gautier  * @extra_offset: [out] Extra offset to be added if bad blocks are found
54*bc3eebb2SYann Gautier  * Return: 0 on success, a negative errno on failure
55*bc3eebb2SYann Gautier  */
56*bc3eebb2SYann Gautier int nand_seek_bb(uintptr_t base, unsigned int offset, size_t *extra_offset);
57*bc3eebb2SYann Gautier 
58*bc3eebb2SYann Gautier /*
59b114abb6SLionel Debieve  * Get NAND device instance
60b114abb6SLionel Debieve  *
61b114abb6SLionel Debieve  * Return: NAND device instance reference
62b114abb6SLionel Debieve  */
63b114abb6SLionel Debieve struct nand_device *get_nand_device(void);
64b114abb6SLionel Debieve 
65b114abb6SLionel Debieve #endif	/* DRIVERS_NAND_H */
66