1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2019-2021, ARM Limited and Contributors. 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 IO_MTD_H 8*54fd6939SJiyong Park #define IO_MTD_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <stdint.h> 11*54fd6939SJiyong Park #include <stdio.h> 12*54fd6939SJiyong Park 13*54fd6939SJiyong Park #include <drivers/io/io_storage.h> 14*54fd6939SJiyong Park 15*54fd6939SJiyong Park /* MTD devices ops */ 16*54fd6939SJiyong Park typedef struct io_mtd_ops { 17*54fd6939SJiyong Park /* 18*54fd6939SJiyong Park * Initialize MTD framework and retrieve device information. 19*54fd6939SJiyong Park * 20*54fd6939SJiyong Park * @size: [out] MTD device size in bytes. 21*54fd6939SJiyong Park * @erase_size: [out] MTD erase size in bytes. 22*54fd6939SJiyong Park * Return 0 on success, a negative error code otherwise. 23*54fd6939SJiyong Park */ 24*54fd6939SJiyong Park int (*init)(unsigned long long *size, unsigned int *erase_size); 25*54fd6939SJiyong Park 26*54fd6939SJiyong Park /* 27*54fd6939SJiyong Park * Execute a read memory operation. 28*54fd6939SJiyong Park * 29*54fd6939SJiyong Park * @offset: Offset in bytes to start read operation. 30*54fd6939SJiyong Park * @buffer: [out] Buffer to store read data. 31*54fd6939SJiyong Park * @length: Required length to be read in bytes. 32*54fd6939SJiyong Park * @out_length: [out] Length read in bytes. 33*54fd6939SJiyong Park * Return 0 on success, a negative error code otherwise. 34*54fd6939SJiyong Park */ 35*54fd6939SJiyong Park int (*read)(unsigned int offset, uintptr_t buffer, size_t length, 36*54fd6939SJiyong Park size_t *out_length); 37*54fd6939SJiyong Park 38*54fd6939SJiyong Park /* 39*54fd6939SJiyong Park * Execute a write memory operation. 40*54fd6939SJiyong Park * 41*54fd6939SJiyong Park * @offset: Offset in bytes to start write operation. 42*54fd6939SJiyong Park * @buffer: Buffer to be written in device. 43*54fd6939SJiyong Park * @length: Required length to be written in bytes. 44*54fd6939SJiyong Park * Return 0 on success, a negative error code otherwise. 45*54fd6939SJiyong Park */ 46*54fd6939SJiyong Park int (*write)(unsigned int offset, uintptr_t buffer, size_t length); 47*54fd6939SJiyong Park 48*54fd6939SJiyong Park /* 49*54fd6939SJiyong Park * Look for an offset to be added to the given offset. 50*54fd6939SJiyong Park * 51*54fd6939SJiyong Park * @base: Base address of the area. 52*54fd6939SJiyong Park * @offset: Offset in bytes to start read operation. 53*54fd6939SJiyong Park * @extra_offset: [out] Offset to be added to the previous offset. 54*54fd6939SJiyong Park * Return 0 on success, a negative error code otherwise. 55*54fd6939SJiyong Park */ 56*54fd6939SJiyong Park int (*seek)(uintptr_t base, unsigned int offset, size_t *extra_offset); 57*54fd6939SJiyong Park } io_mtd_ops_t; 58*54fd6939SJiyong Park 59*54fd6939SJiyong Park typedef struct io_mtd_dev_spec { 60*54fd6939SJiyong Park unsigned long long device_size; 61*54fd6939SJiyong Park unsigned int erase_size; 62*54fd6939SJiyong Park size_t offset; 63*54fd6939SJiyong Park io_mtd_ops_t ops; 64*54fd6939SJiyong Park } io_mtd_dev_spec_t; 65*54fd6939SJiyong Park 66*54fd6939SJiyong Park struct io_dev_connector; 67*54fd6939SJiyong Park 68*54fd6939SJiyong Park int register_io_dev_mtd(const struct io_dev_connector **dev_con); 69*54fd6939SJiyong Park 70*54fd6939SJiyong Park #endif /* IO_MTD_H */ 71