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