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