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