xref: /aosp_15_r20/external/arm-trusted-firmware/include/drivers/io/io_mtd.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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