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