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