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