1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2014-2022, 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_STORAGE_H 8*91f16700Schasinglulu #define IO_STORAGE_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <errno.h> 11*91f16700Schasinglulu #include <stdint.h> 12*91f16700Schasinglulu #include <stdio.h> /* For ssize_t */ 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include <tools_share/uuid.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu /* Device type which can be used to enable policy decisions about which device 17*91f16700Schasinglulu * to access */ 18*91f16700Schasinglulu typedef enum { 19*91f16700Schasinglulu IO_TYPE_INVALID, 20*91f16700Schasinglulu IO_TYPE_SEMIHOSTING, 21*91f16700Schasinglulu IO_TYPE_MEMMAP, 22*91f16700Schasinglulu IO_TYPE_FIRMWARE_IMAGE_PACKAGE, 23*91f16700Schasinglulu IO_TYPE_BLOCK, 24*91f16700Schasinglulu IO_TYPE_MTD, 25*91f16700Schasinglulu IO_TYPE_MMC, 26*91f16700Schasinglulu IO_TYPE_ENCRYPTED, 27*91f16700Schasinglulu IO_TYPE_MAX 28*91f16700Schasinglulu } io_type_t; 29*91f16700Schasinglulu 30*91f16700Schasinglulu 31*91f16700Schasinglulu /* Modes used when seeking data on a supported device */ 32*91f16700Schasinglulu typedef enum { 33*91f16700Schasinglulu IO_SEEK_INVALID, 34*91f16700Schasinglulu IO_SEEK_SET, 35*91f16700Schasinglulu IO_SEEK_END, 36*91f16700Schasinglulu IO_SEEK_CUR, 37*91f16700Schasinglulu IO_SEEK_MAX 38*91f16700Schasinglulu } io_seek_mode_t; 39*91f16700Schasinglulu 40*91f16700Schasinglulu 41*91f16700Schasinglulu /* Connector type, providing a means of identifying a device to open */ 42*91f16700Schasinglulu struct io_dev_connector; 43*91f16700Schasinglulu 44*91f16700Schasinglulu 45*91f16700Schasinglulu /* File specification - used to refer to data on a device supporting file-like 46*91f16700Schasinglulu * entities */ 47*91f16700Schasinglulu typedef struct io_file_spec { 48*91f16700Schasinglulu const char *path; 49*91f16700Schasinglulu unsigned int mode; 50*91f16700Schasinglulu } io_file_spec_t; 51*91f16700Schasinglulu 52*91f16700Schasinglulu /* UUID specification - used to refer to data accessed using UUIDs (i.e. FIP 53*91f16700Schasinglulu * images) */ 54*91f16700Schasinglulu typedef struct io_uuid_spec { 55*91f16700Schasinglulu uuid_t uuid; 56*91f16700Schasinglulu } io_uuid_spec_t; 57*91f16700Schasinglulu 58*91f16700Schasinglulu /* Block specification - used to refer to data on a device supporting 59*91f16700Schasinglulu * block-like entities */ 60*91f16700Schasinglulu typedef struct io_block_spec { 61*91f16700Schasinglulu size_t offset; 62*91f16700Schasinglulu size_t length; 63*91f16700Schasinglulu } io_block_spec_t; 64*91f16700Schasinglulu 65*91f16700Schasinglulu 66*91f16700Schasinglulu /* Access modes used when accessing data on a device */ 67*91f16700Schasinglulu #define IO_MODE_INVALID (0) 68*91f16700Schasinglulu #define IO_MODE_RO (1 << 0) 69*91f16700Schasinglulu #define IO_MODE_RW (1 << 1) 70*91f16700Schasinglulu 71*91f16700Schasinglulu 72*91f16700Schasinglulu /* Open a connection to a device */ 73*91f16700Schasinglulu int io_dev_open(const struct io_dev_connector *dev_con, 74*91f16700Schasinglulu const uintptr_t dev_spec, 75*91f16700Schasinglulu uintptr_t *handle); 76*91f16700Schasinglulu 77*91f16700Schasinglulu 78*91f16700Schasinglulu /* Initialise a device explicitly - to permit lazy initialisation or 79*91f16700Schasinglulu * re-initialisation */ 80*91f16700Schasinglulu int io_dev_init(uintptr_t dev_handle, const uintptr_t init_params); 81*91f16700Schasinglulu 82*91f16700Schasinglulu /* Close a connection to a device */ 83*91f16700Schasinglulu int io_dev_close(uintptr_t dev_handle); 84*91f16700Schasinglulu 85*91f16700Schasinglulu 86*91f16700Schasinglulu /* Synchronous operations */ 87*91f16700Schasinglulu int io_open(uintptr_t dev_handle, const uintptr_t spec, uintptr_t *handle); 88*91f16700Schasinglulu 89*91f16700Schasinglulu int io_seek(uintptr_t handle, io_seek_mode_t mode, signed long long offset); 90*91f16700Schasinglulu 91*91f16700Schasinglulu int io_size(uintptr_t handle, size_t *length); 92*91f16700Schasinglulu 93*91f16700Schasinglulu int io_read(uintptr_t handle, uintptr_t buffer, size_t length, 94*91f16700Schasinglulu size_t *length_read); 95*91f16700Schasinglulu 96*91f16700Schasinglulu int io_write(uintptr_t handle, const uintptr_t buffer, size_t length, 97*91f16700Schasinglulu size_t *length_written); 98*91f16700Schasinglulu 99*91f16700Schasinglulu int io_close(uintptr_t handle); 100*91f16700Schasinglulu 101*91f16700Schasinglulu 102*91f16700Schasinglulu #endif /* IO_STORAGE_H */ 103