xref: /aosp_15_r20/external/arm-trusted-firmware/include/drivers/io/io_driver.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2014, 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_DRIVER_H
8*54fd6939SJiyong Park #define IO_DRIVER_H
9*54fd6939SJiyong Park 
10*54fd6939SJiyong Park #include <stdint.h>
11*54fd6939SJiyong Park 
12*54fd6939SJiyong Park #include <drivers/io/io_storage.h>
13*54fd6939SJiyong Park 
14*54fd6939SJiyong Park /* Generic IO entity structure,representing an accessible IO construct on the
15*54fd6939SJiyong Park  * device, such as a file */
16*54fd6939SJiyong Park typedef struct io_entity {
17*54fd6939SJiyong Park 	struct io_dev_info *dev_handle;
18*54fd6939SJiyong Park 	uintptr_t info;
19*54fd6939SJiyong Park } io_entity_t;
20*54fd6939SJiyong Park 
21*54fd6939SJiyong Park 
22*54fd6939SJiyong Park /* Device info structure, providing device-specific functions and a means of
23*54fd6939SJiyong Park  * adding driver-specific state */
24*54fd6939SJiyong Park typedef struct io_dev_info {
25*54fd6939SJiyong Park 	const struct io_dev_funcs *funcs;
26*54fd6939SJiyong Park 	uintptr_t info;
27*54fd6939SJiyong Park } io_dev_info_t;
28*54fd6939SJiyong Park 
29*54fd6939SJiyong Park 
30*54fd6939SJiyong Park /* Structure used to create a connection to a type of device */
31*54fd6939SJiyong Park typedef struct io_dev_connector {
32*54fd6939SJiyong Park 	/* dev_open opens a connection to a particular device driver */
33*54fd6939SJiyong Park 	int (*dev_open)(const uintptr_t dev_spec, io_dev_info_t **dev_info);
34*54fd6939SJiyong Park } io_dev_connector_t;
35*54fd6939SJiyong Park 
36*54fd6939SJiyong Park 
37*54fd6939SJiyong Park /* Structure to hold device driver function pointers */
38*54fd6939SJiyong Park typedef struct io_dev_funcs {
39*54fd6939SJiyong Park 	io_type_t (*type)(void);
40*54fd6939SJiyong Park 	int (*open)(io_dev_info_t *dev_info, const uintptr_t spec,
41*54fd6939SJiyong Park 			io_entity_t *entity);
42*54fd6939SJiyong Park 	int (*seek)(io_entity_t *entity, int mode, signed long long offset);
43*54fd6939SJiyong Park 	int (*size)(io_entity_t *entity, size_t *length);
44*54fd6939SJiyong Park 	int (*read)(io_entity_t *entity, uintptr_t buffer, size_t length,
45*54fd6939SJiyong Park 			size_t *length_read);
46*54fd6939SJiyong Park 	int (*write)(io_entity_t *entity, const uintptr_t buffer,
47*54fd6939SJiyong Park 			size_t length, size_t *length_written);
48*54fd6939SJiyong Park 	int (*close)(io_entity_t *entity);
49*54fd6939SJiyong Park 	int (*dev_init)(io_dev_info_t *dev_info, const uintptr_t init_params);
50*54fd6939SJiyong Park 	int (*dev_close)(io_dev_info_t *dev_info);
51*54fd6939SJiyong Park } io_dev_funcs_t;
52*54fd6939SJiyong Park 
53*54fd6939SJiyong Park 
54*54fd6939SJiyong Park /* Operations intended to be performed during platform initialisation */
55*54fd6939SJiyong Park 
56*54fd6939SJiyong Park /* Register an IO device */
57*54fd6939SJiyong Park int io_register_device(const io_dev_info_t *dev_info);
58*54fd6939SJiyong Park 
59*54fd6939SJiyong Park #endif /* IO_DRIVER_H */
60