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