xref: /optee_os/core/include/tee/tee_fs.h (revision dc2cf47a7607b4f7d1227c54524998216cba3f8e)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2b0104773SPascal Brand /*
3b0104773SPascal Brand  * Copyright (c) 2014, STMicroelectronics International N.V.
4b0104773SPascal Brand  */
5b0104773SPascal Brand 
6fbe66cf8SEtienne Carriere #ifndef __TEE_TEE_FS_H
7fbe66cf8SEtienne Carriere #define __TEE_TEE_FS_H
8b0104773SPascal Brand 
9*dc2cf47aSEtienne Carriere #include <pta_stats.h>
10*dc2cf47aSEtienne Carriere #include <stdbool.h>
11b0104773SPascal Brand #include <stddef.h>
12b0104773SPascal Brand #include <stdint.h>
133cc2413aSJerome Forissier #include <tee_api_defines_extensions.h>
14a2e9a830SCedric Chaumont #include <tee_api_types.h>
15b0104773SPascal Brand 
16b4bfc9a9SJens Wiklander #define TEE_FS_NAME_MAX U(350)
17b0104773SPascal Brand 
188b0894f5SJames Kung typedef int64_t tee_fs_off_t;
19b0104773SPascal Brand typedef uint32_t tee_fs_mode_t;
20b0104773SPascal Brand 
21b0104773SPascal Brand struct tee_fs_dirent {
22b2215adfSJens Wiklander 	uint8_t oid[TEE_OBJECT_ID_MAX_LEN];
23b2215adfSJens Wiklander 	size_t oidlen;
24b0104773SPascal Brand };
25b0104773SPascal Brand 
26b0311ad8SJens Wiklander struct tee_fs_dir;
27b0311ad8SJens Wiklander struct tee_file_handle;
28b2215adfSJens Wiklander struct tee_pobj;
29b0311ad8SJens Wiklander 
30b0104773SPascal Brand /*
31b0311ad8SJens Wiklander  * tee_fs implements a POSIX like secure file system with GP extension
32b0104773SPascal Brand  */
331fd927ebSJames Kung struct tee_file_operations {
34d5fe340fSJens Wiklander 	TEE_Result (*open)(struct tee_pobj *po, size_t *size,
35d5fe340fSJens Wiklander 			   struct tee_file_handle **fh);
3673ea1cdeSJens Wiklander 	TEE_Result (*create)(struct tee_pobj *po, bool overwrite,
3773ea1cdeSJens Wiklander 			     const void *head, size_t head_size,
3873ea1cdeSJens Wiklander 			     const void *attr, size_t attr_size,
39b2284b11SJens Wiklander 			     const void *data_core, const void *data_user,
40b2284b11SJens Wiklander 			     size_t data_size, struct tee_file_handle **fh);
41b0311ad8SJens Wiklander 	void (*close)(struct tee_file_handle **fh);
42879237aeSJens Wiklander 	TEE_Result (*read)(struct tee_file_handle *fh, size_t pos,
43b2284b11SJens Wiklander 			   void *buf_core, void *buf_user, size_t *len);
44879237aeSJens Wiklander 	TEE_Result (*write)(struct tee_file_handle *fh, size_t pos,
45b2284b11SJens Wiklander 			    const void *buf_core, const void *buf_user,
46b2284b11SJens Wiklander 			    size_t len);
47b2215adfSJens Wiklander 	TEE_Result (*rename)(struct tee_pobj *old_po, struct tee_pobj *new_po,
48822203a8SJens Wiklander 			     bool overwrite);
49b2215adfSJens Wiklander 	TEE_Result (*remove)(struct tee_pobj *po);
50b0311ad8SJens Wiklander 	TEE_Result (*truncate)(struct tee_file_handle *fh, size_t size);
51b0311ad8SJens Wiklander 
52b2215adfSJens Wiklander 	TEE_Result (*opendir)(const TEE_UUID *uuid, struct tee_fs_dir **d);
53b0311ad8SJens Wiklander 	TEE_Result (*readdir)(struct tee_fs_dir *d, struct tee_fs_dirent **ent);
54b0311ad8SJens Wiklander 	void (*closedir)(struct tee_fs_dir *d);
551fd927ebSJames Kung };
56b0104773SPascal Brand 
57b44708c1SJerome Forissier #ifdef CFG_REE_FS
58b44708c1SJerome Forissier extern const struct tee_file_operations ree_fs_ops;
59b44708c1SJerome Forissier #endif
60b44708c1SJerome Forissier #ifdef CFG_RPMB_FS
61b44708c1SJerome Forissier extern const struct tee_file_operations rpmb_fs_ops;
62078f18f8SJens Wiklander 
63078f18f8SJens Wiklander TEE_Result tee_rpmb_fs_raw_open(const char *fname, bool create,
64078f18f8SJens Wiklander 				struct tee_file_handle **fh);
658dfdf392SJens Wiklander TEE_Result tee_rpmb_reinit(void);
66b1042535SRouven Czerwinski 
67*dc2cf47aSEtienne Carriere /* Ger RPMB memory allocation statistics */
68*dc2cf47aSEtienne Carriere TEE_Result rpmb_mem_stats(struct pta_stats_alloc *stats, bool reset);
69*dc2cf47aSEtienne Carriere 
70b1042535SRouven Czerwinski /**
71b1042535SRouven Czerwinski  * Weak function which can be overridden by platforms to indicate that the RPMB
72b1042535SRouven Czerwinski  * key is ready to be written. Defaults to true, platforms can return false to
73b1042535SRouven Czerwinski  * prevent a RPMB key write in the wrong state.
74b1042535SRouven Czerwinski  */
75b1042535SRouven Czerwinski bool plat_rpmb_key_is_ready(void);
768dfdf392SJens Wiklander #else
tee_rpmb_reinit(void)778dfdf392SJens Wiklander static inline TEE_Result tee_rpmb_reinit(void)
788dfdf392SJens Wiklander {
798dfdf392SJens Wiklander 	return TEE_ERROR_STORAGE_NOT_AVAILABLE;
808dfdf392SJens Wiklander }
81*dc2cf47aSEtienne Carriere 
rpmb_mem_stats(struct pta_stats_alloc * stats __unused,bool reset __unused)82*dc2cf47aSEtienne Carriere static inline TEE_Result rpmb_mem_stats(struct pta_stats_alloc *stats __unused,
83*dc2cf47aSEtienne Carriere 					bool reset __unused)
84*dc2cf47aSEtienne Carriere {
85*dc2cf47aSEtienne Carriere 	return TEE_ERROR_STORAGE_NOT_AVAILABLE;
86*dc2cf47aSEtienne Carriere }
87b44708c1SJerome Forissier #endif
881fd927ebSJames Kung 
893cc2413aSJerome Forissier /*
903cc2413aSJerome Forissier  * Returns the appropriate tee_file_operations for the specified storage ID.
913cc2413aSJerome Forissier  * The value TEE_STORAGE_PRIVATE will select the REE FS if available, otherwise
923cc2413aSJerome Forissier  * RPMB.
933cc2413aSJerome Forissier  */
943cc2413aSJerome Forissier static inline const struct tee_file_operations *
tee_svc_storage_file_ops(uint32_t storage_id)953cc2413aSJerome Forissier tee_svc_storage_file_ops(uint32_t storage_id)
963cc2413aSJerome Forissier {
973cc2413aSJerome Forissier 	switch (storage_id) {
983cc2413aSJerome Forissier 	case TEE_STORAGE_PRIVATE:
993cc2413aSJerome Forissier #if defined(CFG_REE_FS)
1003cc2413aSJerome Forissier 		return &ree_fs_ops;
1013cc2413aSJerome Forissier #elif defined(CFG_RPMB_FS)
1023cc2413aSJerome Forissier 		return &rpmb_fs_ops;
1033cc2413aSJerome Forissier #else
1043cc2413aSJerome Forissier 		return NULL;
1053cc2413aSJerome Forissier #endif
1063cc2413aSJerome Forissier #ifdef CFG_REE_FS
1073cc2413aSJerome Forissier 	case TEE_STORAGE_PRIVATE_REE:
1083cc2413aSJerome Forissier 		return &ree_fs_ops;
1093cc2413aSJerome Forissier #endif
1103cc2413aSJerome Forissier #ifdef CFG_RPMB_FS
1113cc2413aSJerome Forissier 	case TEE_STORAGE_PRIVATE_RPMB:
1123cc2413aSJerome Forissier 		return &rpmb_fs_ops;
1133cc2413aSJerome Forissier #endif
1143cc2413aSJerome Forissier 	default:
1153cc2413aSJerome Forissier 		return NULL;
1163cc2413aSJerome Forissier 	}
1173cc2413aSJerome Forissier }
1183cc2413aSJerome Forissier 
119fbe66cf8SEtienne Carriere #endif /*__TEE_TEE_FS_H*/
120