xref: /arm-trusted-firmware/include/drivers/io/io_storage.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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