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