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