xref: /rk3399_ARM-atf/include/drivers/nand.h (revision 7805999e645da500ccd971c2ab9a60c763b299e8)
1b114abb6SLionel Debieve /*
2*f29c0702SLionel Debieve  * Copyright (c) 2019-2022, 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 
36*f29c0702SLionel Debieve void plat_get_scratch_buffer(void **buffer_addr, size_t *buf_size);
37*f29c0702SLionel Debieve 
38b114abb6SLionel Debieve /*
39b114abb6SLionel Debieve  * Read bytes from NAND device
40b114abb6SLionel Debieve  *
41b114abb6SLionel Debieve  * @offset: Byte offset to read from in device
42b114abb6SLionel Debieve  * @buffer: [out] Bytes read from device
43b114abb6SLionel Debieve  * @length: Number of bytes to read
44b114abb6SLionel Debieve  * @length_read: [out] Number of bytes read from device
45b114abb6SLionel Debieve  * Return: 0 on success, a negative errno on failure
46b114abb6SLionel Debieve  */
47b114abb6SLionel Debieve int nand_read(unsigned int offset, uintptr_t buffer, size_t length,
48b114abb6SLionel Debieve 	      size_t *length_read);
49b114abb6SLionel Debieve 
50b114abb6SLionel Debieve /*
51bc3eebb2SYann Gautier  * Look for an extra offset to be added in case of bad blocks
52bc3eebb2SYann Gautier  *
53bc3eebb2SYann Gautier  * @base: Base address of the area
54bc3eebb2SYann Gautier  * @offset: Byte offset to read from in device
55bc3eebb2SYann Gautier  * @extra_offset: [out] Extra offset to be added if bad blocks are found
56bc3eebb2SYann Gautier  * Return: 0 on success, a negative errno on failure
57bc3eebb2SYann Gautier  */
58bc3eebb2SYann Gautier int nand_seek_bb(uintptr_t base, unsigned int offset, size_t *extra_offset);
59bc3eebb2SYann Gautier 
60bc3eebb2SYann Gautier /*
61b114abb6SLionel Debieve  * Get NAND device instance
62b114abb6SLionel Debieve  *
63b114abb6SLionel Debieve  * Return: NAND device instance reference
64b114abb6SLionel Debieve  */
65b114abb6SLionel Debieve struct nand_device *get_nand_device(void);
66b114abb6SLionel Debieve 
67b114abb6SLionel Debieve #endif	/* DRIVERS_NAND_H */
68