1935db693SDan Handley /* 2935db693SDan Handley * Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. 3935db693SDan Handley * 4935db693SDan Handley * Redistribution and use in source and binary forms, with or without 5935db693SDan Handley * modification, are permitted provided that the following conditions are met: 6935db693SDan Handley * 7935db693SDan Handley * Redistributions of source code must retain the above copyright notice, this 8935db693SDan Handley * list of conditions and the following disclaimer. 9935db693SDan Handley * 10935db693SDan Handley * Redistributions in binary form must reproduce the above copyright notice, 11935db693SDan Handley * this list of conditions and the following disclaimer in the documentation 12935db693SDan Handley * and/or other materials provided with the distribution. 13935db693SDan Handley * 14935db693SDan Handley * Neither the name of ARM nor the names of its contributors may be used 15935db693SDan Handley * to endorse or promote products derived from this software without specific 16935db693SDan Handley * prior written permission. 17935db693SDan Handley * 18935db693SDan Handley * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19935db693SDan Handley * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20935db693SDan Handley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21935db693SDan Handley * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22935db693SDan Handley * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23935db693SDan Handley * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24935db693SDan Handley * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25935db693SDan Handley * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26935db693SDan Handley * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27935db693SDan Handley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28935db693SDan Handley * POSSIBILITY OF SUCH DAMAGE. 29935db693SDan Handley */ 30935db693SDan Handley 31935db693SDan Handley #ifndef __IO_H__ 32935db693SDan Handley #define __IO_H__ 33935db693SDan Handley 34*7e26fe1fSJuan Castillo #include <errno.h> 35935db693SDan Handley #include <stdint.h> 36935db693SDan Handley #include <stdio.h> /* For ssize_t */ 3716948ae1SJuan Castillo #include <uuid.h> 38935db693SDan Handley 39935db693SDan Handley 40935db693SDan Handley /* Device type which can be used to enable policy decisions about which device 41935db693SDan Handley * to access */ 42935db693SDan Handley typedef enum { 43935db693SDan Handley IO_TYPE_INVALID, 44935db693SDan Handley IO_TYPE_SEMIHOSTING, 45935db693SDan Handley IO_TYPE_MEMMAP, 46935db693SDan Handley IO_TYPE_FIRMWARE_IMAGE_PACKAGE, 47935db693SDan Handley IO_TYPE_MAX 48935db693SDan Handley } io_type_t; 49935db693SDan Handley 50935db693SDan Handley 51935db693SDan Handley /* Modes used when seeking data on a supported device */ 52935db693SDan Handley typedef enum { 53935db693SDan Handley IO_SEEK_INVALID, 54935db693SDan Handley IO_SEEK_SET, 55935db693SDan Handley IO_SEEK_END, 56935db693SDan Handley IO_SEEK_CUR, 57935db693SDan Handley IO_SEEK_MAX 58935db693SDan Handley } io_seek_mode_t; 59935db693SDan Handley 60935db693SDan Handley 61935db693SDan Handley /* Connector type, providing a means of identifying a device to open */ 62935db693SDan Handley struct io_dev_connector; 63935db693SDan Handley 64935db693SDan Handley 65935db693SDan Handley /* File specification - used to refer to data on a device supporting file-like 66935db693SDan Handley * entities */ 67935db693SDan Handley typedef struct io_file_spec { 68935db693SDan Handley const char *path; 69935db693SDan Handley unsigned int mode; 70935db693SDan Handley } io_file_spec_t; 71935db693SDan Handley 7216948ae1SJuan Castillo /* UUID specification - used to refer to data accessed using UUIDs (i.e. FIP 7316948ae1SJuan Castillo * images) */ 7416948ae1SJuan Castillo typedef struct io_uuid_spec { 7516948ae1SJuan Castillo const uuid_t uuid; 7616948ae1SJuan Castillo } io_uuid_spec_t; 77935db693SDan Handley 78935db693SDan Handley /* Block specification - used to refer to data on a device supporting 79935db693SDan Handley * block-like entities */ 80935db693SDan Handley typedef struct io_block_spec { 81935db693SDan Handley size_t offset; 82935db693SDan Handley size_t length; 83935db693SDan Handley } io_block_spec_t; 84935db693SDan Handley 85935db693SDan Handley 86935db693SDan Handley /* Access modes used when accessing data on a device */ 87935db693SDan Handley #define IO_MODE_INVALID (0) 88935db693SDan Handley #define IO_MODE_RO (1 << 0) 89935db693SDan Handley #define IO_MODE_RW (1 << 1) 90935db693SDan Handley 91935db693SDan Handley 92*7e26fe1fSJuan Castillo /* Return codes reported by 'io_*' APIs. 93*7e26fe1fSJuan Castillo * IMPORTANT: these definitions are deprecated. Callers should use standard 94*7e26fe1fSJuan Castillo * errno definitions when checking the return value of io_* APIs. */ 95935db693SDan Handley #define IO_SUCCESS (0) 96*7e26fe1fSJuan Castillo #define IO_FAIL (-ENOENT) 97*7e26fe1fSJuan Castillo #define IO_NOT_SUPPORTED (-ENODEV) 98*7e26fe1fSJuan Castillo #define IO_RESOURCES_EXHAUSTED (-ENOMEM) 99935db693SDan Handley 100935db693SDan Handley 101935db693SDan Handley /* Open a connection to a device */ 102935db693SDan Handley int io_dev_open(const struct io_dev_connector *dev_con, 103935db693SDan Handley const uintptr_t dev_spec, 104935db693SDan Handley uintptr_t *dev_handle); 105935db693SDan Handley 106935db693SDan Handley 107935db693SDan Handley /* Initialise a device explicitly - to permit lazy initialisation or 108935db693SDan Handley * re-initialisation */ 109935db693SDan Handley int io_dev_init(uintptr_t dev_handle, const uintptr_t init_params); 110935db693SDan Handley 111935db693SDan Handley /* TODO: Consider whether an explicit "shutdown" API should be included */ 112935db693SDan Handley 113935db693SDan Handley /* Close a connection to a device */ 114935db693SDan Handley int io_dev_close(uintptr_t dev_handle); 115935db693SDan Handley 116935db693SDan Handley 117935db693SDan Handley /* Synchronous operations */ 118935db693SDan Handley int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle); 119935db693SDan Handley 120935db693SDan Handley int io_seek(uintptr_t handle, io_seek_mode_t mode, ssize_t offset); 121935db693SDan Handley 122935db693SDan Handley int io_size(uintptr_t handle, size_t *length); 123935db693SDan Handley 124935db693SDan Handley int io_read(uintptr_t handle, uintptr_t buffer, size_t length, 125935db693SDan Handley size_t *length_read); 126935db693SDan Handley 127935db693SDan Handley int io_write(uintptr_t handle, const uintptr_t buffer, size_t length, 128935db693SDan Handley size_t *length_written); 129935db693SDan Handley 130935db693SDan Handley int io_close(uintptr_t handle); 131935db693SDan Handley 132935db693SDan Handley 133935db693SDan Handley #endif /* __IO_H__ */ 134