1935db693SDan Handley /* 20a6e7e3bSLouis Mayencourt * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved. 3935db693SDan Handley * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5935db693SDan Handley */ 6935db693SDan Handley 7c3cf06f1SAntonio Nino Diaz #ifndef IO_STORAGE_H 8c3cf06f1SAntonio Nino Diaz #define IO_STORAGE_H 9935db693SDan Handley 107e26fe1fSJuan Castillo #include <errno.h> 11935db693SDan Handley #include <stdint.h> 12935db693SDan Handley #include <stdio.h> /* For ssize_t */ 13935db693SDan Handley 1409d40e0eSAntonio Nino Diaz #include <tools_share/uuid.h> 15935db693SDan Handley 16935db693SDan Handley /* Device type which can be used to enable policy decisions about which device 17935db693SDan Handley * to access */ 18935db693SDan Handley typedef enum { 19935db693SDan Handley IO_TYPE_INVALID, 20935db693SDan Handley IO_TYPE_SEMIHOSTING, 21935db693SDan Handley IO_TYPE_MEMMAP, 223385f412SGerald Lejeune IO_TYPE_DUMMY, 23935db693SDan Handley IO_TYPE_FIRMWARE_IMAGE_PACKAGE, 249da7a653SHaojian Zhuang IO_TYPE_BLOCK, 25b114abb6SLionel Debieve IO_TYPE_MTD, 266fe8b195SYann Gautier IO_TYPE_MMC, 276fe8b195SYann Gautier IO_TYPE_STM32IMAGE, 28*2be57b86SSumit Garg IO_TYPE_ENCRYPTED, 29935db693SDan Handley IO_TYPE_MAX 30935db693SDan Handley } io_type_t; 31935db693SDan Handley 32935db693SDan Handley 33935db693SDan Handley /* Modes used when seeking data on a supported device */ 34935db693SDan Handley typedef enum { 35935db693SDan Handley IO_SEEK_INVALID, 36935db693SDan Handley IO_SEEK_SET, 37935db693SDan Handley IO_SEEK_END, 38935db693SDan Handley IO_SEEK_CUR, 39935db693SDan Handley IO_SEEK_MAX 40935db693SDan Handley } io_seek_mode_t; 41935db693SDan Handley 42935db693SDan Handley 43935db693SDan Handley /* Connector type, providing a means of identifying a device to open */ 44935db693SDan Handley struct io_dev_connector; 45935db693SDan Handley 46935db693SDan Handley 47935db693SDan Handley /* File specification - used to refer to data on a device supporting file-like 48935db693SDan Handley * entities */ 49935db693SDan Handley typedef struct io_file_spec { 50935db693SDan Handley const char *path; 51935db693SDan Handley unsigned int mode; 52935db693SDan Handley } io_file_spec_t; 53935db693SDan Handley 5416948ae1SJuan Castillo /* UUID specification - used to refer to data accessed using UUIDs (i.e. FIP 5516948ae1SJuan Castillo * images) */ 5616948ae1SJuan Castillo typedef struct io_uuid_spec { 570a6e7e3bSLouis Mayencourt uuid_t uuid; 5816948ae1SJuan Castillo } io_uuid_spec_t; 59935db693SDan Handley 60935db693SDan Handley /* Block specification - used to refer to data on a device supporting 61935db693SDan Handley * block-like entities */ 62935db693SDan Handley typedef struct io_block_spec { 63935db693SDan Handley size_t offset; 64935db693SDan Handley size_t length; 65935db693SDan Handley } io_block_spec_t; 66935db693SDan Handley 67935db693SDan Handley 68935db693SDan Handley /* Access modes used when accessing data on a device */ 69935db693SDan Handley #define IO_MODE_INVALID (0) 70935db693SDan Handley #define IO_MODE_RO (1 << 0) 71935db693SDan Handley #define IO_MODE_RW (1 << 1) 72935db693SDan Handley 73935db693SDan Handley 74935db693SDan Handley /* Open a connection to a device */ 75935db693SDan Handley int io_dev_open(const struct io_dev_connector *dev_con, 76935db693SDan Handley const uintptr_t dev_spec, 77dc6aad2eSRoberto Vargas uintptr_t *handle); 78935db693SDan Handley 79935db693SDan Handley 80935db693SDan Handley /* Initialise a device explicitly - to permit lazy initialisation or 81935db693SDan Handley * re-initialisation */ 82935db693SDan Handley int io_dev_init(uintptr_t dev_handle, const uintptr_t init_params); 83935db693SDan Handley 84935db693SDan Handley /* Close a connection to a device */ 85935db693SDan Handley int io_dev_close(uintptr_t dev_handle); 86935db693SDan Handley 87935db693SDan Handley 88935db693SDan Handley /* Synchronous operations */ 89935db693SDan Handley int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle); 90935db693SDan Handley 9170cb0bffSYann Gautier int io_seek(uintptr_t handle, io_seek_mode_t mode, signed long long offset); 92935db693SDan Handley 93935db693SDan Handley int io_size(uintptr_t handle, size_t *length); 94935db693SDan Handley 95935db693SDan Handley int io_read(uintptr_t handle, uintptr_t buffer, size_t length, 96935db693SDan Handley size_t *length_read); 97935db693SDan Handley 98935db693SDan Handley int io_write(uintptr_t handle, const uintptr_t buffer, size_t length, 99935db693SDan Handley size_t *length_written); 100935db693SDan Handley 101935db693SDan Handley int io_close(uintptr_t handle); 102935db693SDan Handley 103935db693SDan Handley 104c3cf06f1SAntonio Nino Diaz #endif /* IO_STORAGE_H */ 105