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