xref: /optee_os/core/include/mm/file.h (revision bae0f170e3217a9322f4c36879a65bc12f50e96a)
19f31ef5aSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
29f31ef5aSJens Wiklander /*
39f31ef5aSJens Wiklander  * Copyright (c) 2019, Linaro Limited
49f31ef5aSJens Wiklander  */
59f31ef5aSJens Wiklander 
69f31ef5aSJens Wiklander #ifndef __MM_FILE_H
79f31ef5aSJens Wiklander #define __MM_FILE_H
89f31ef5aSJens Wiklander 
9*bae0f170SJens Wiklander #include <tee_api_types.h>
109f31ef5aSJens Wiklander #include <types_ext.h>
119f31ef5aSJens Wiklander #include <utee_defines.h>
129f31ef5aSJens Wiklander 
139f31ef5aSJens Wiklander /* This is supposed to be large enough to hold any hash or tag used */
149f31ef5aSJens Wiklander #define FILE_TAG_SIZE	TEE_SHA256_HASH_SIZE
159f31ef5aSJens Wiklander 
169f31ef5aSJens Wiklander /*
179f31ef5aSJens Wiklander  * struct file_slice - one slice of a file
189f31ef5aSJens Wiklander  * @fobj:	 Fobj holding the data of this slice
199f31ef5aSJens Wiklander  * @page_offset: Offset in pages into the file where the @fobj is
209f31ef5aSJens Wiklander  *		 located.
219f31ef5aSJens Wiklander  */
229f31ef5aSJens Wiklander struct file_slice {
239f31ef5aSJens Wiklander 	struct fobj *fobj;
249f31ef5aSJens Wiklander 	unsigned int page_offset;
259f31ef5aSJens Wiklander };
269f31ef5aSJens Wiklander 
279f31ef5aSJens Wiklander struct file;
289f31ef5aSJens Wiklander 
299f31ef5aSJens Wiklander /*
30*bae0f170SJens Wiklander  * file_lock() - Lock the file
31*bae0f170SJens Wiklander  * @f:		File pointer
329f31ef5aSJens Wiklander  *
33*bae0f170SJens Wiklander  * Waits until the file can be locked and with the file put in locked state.
349f31ef5aSJens Wiklander  */
35*bae0f170SJens Wiklander void file_lock(struct file *f);
36*bae0f170SJens Wiklander 
37*bae0f170SJens Wiklander /*
38*bae0f170SJens Wiklander  * file_lock() - Try to lock the file without blocking
39*bae0f170SJens Wiklander  * @f:		File pointer
40*bae0f170SJens Wiklander  *
41*bae0f170SJens Wiklander  * Returns false if file cannot be locked without blocking.
42*bae0f170SJens Wiklander  * Returns true if the file has been put in locked state.
43*bae0f170SJens Wiklander  */
44*bae0f170SJens Wiklander bool file_trylock(struct file *f);
45*bae0f170SJens Wiklander 
46*bae0f170SJens Wiklander /*
47*bae0f170SJens Wiklander  * file_unlock() - Unlock the file
48*bae0f170SJens Wiklander  * @f:		File pointer
49*bae0f170SJens Wiklander  *
50*bae0f170SJens Wiklander  * File must be in locked state. Releases the previous lock and returns.
51*bae0f170SJens Wiklander  */
52*bae0f170SJens Wiklander void file_unlock(struct file *f);
53*bae0f170SJens Wiklander 
54*bae0f170SJens Wiklander /*
55*bae0f170SJens Wiklander  * file_add_slice() - Add a slice to a file
56*bae0f170SJens Wiklander  * @f:		 File pointer
57*bae0f170SJens Wiklander  * @fobj:	 Fobj holding the data of this slice
58*bae0f170SJens Wiklander  * @page_offset: Offset in pages into the file (@f) where the @fobj is
59*bae0f170SJens Wiklander  *		 located.
60*bae0f170SJens Wiklander  *
61*bae0f170SJens Wiklander  * File must be in locked state.
62*bae0f170SJens Wiklander  *
63*bae0f170SJens Wiklander  * Returns TEE_SUCCESS on success or a TEE_ERROR_* code on failure.
64*bae0f170SJens Wiklander  */
65*bae0f170SJens Wiklander TEE_Result file_add_slice(struct file *f, struct fobj *fobj,
66*bae0f170SJens Wiklander 			  unsigned int page_offset);
679f31ef5aSJens Wiklander 
689f31ef5aSJens Wiklander /*
699f31ef5aSJens Wiklander  * file_get() - Increase file reference counter
709f31ef5aSJens Wiklander  * @f:		File pointer
719f31ef5aSJens Wiklander  *
729f31ef5aSJens Wiklander  * Returns @f, if @f isn't NULL its reference counter is first increased.
739f31ef5aSJens Wiklander  */
749f31ef5aSJens Wiklander struct file *file_get(struct file *f);
759f31ef5aSJens Wiklander 
769f31ef5aSJens Wiklander /*
779f31ef5aSJens Wiklander  * file_get_by_tag() - Finds a file based on tag and increase reference counter
789f31ef5aSJens Wiklander  * @tag:	Tag of the file
799f31ef5aSJens Wiklander  * @taglen:	Length of @tag
809f31ef5aSJens Wiklander  *
81*bae0f170SJens Wiklander  * If a file doesn't exist it's created with the supplied tag.
82*bae0f170SJens Wiklander  *
83*bae0f170SJens Wiklander  * Returns a file with an increased reference counter, or NULL on failure.
849f31ef5aSJens Wiklander  */
85*bae0f170SJens Wiklander struct file *file_get_by_tag(const uint8_t *tag, unsigned int taglen);
869f31ef5aSJens Wiklander 
879f31ef5aSJens Wiklander /*
889f31ef5aSJens Wiklander  * file_put() - Decrease reference counter of file
899f31ef5aSJens Wiklander  * @f:		File pointer
909f31ef5aSJens Wiklander  *
919f31ef5aSJens Wiklander  * If reference counter reaches 0, matching the numbers of file_new() +
929f31ef5aSJens Wiklander  * file_get() + file_get_by_tag(), the file is removed with reference
939f31ef5aSJens Wiklander  * counters for all contained fobjs decreased.
949f31ef5aSJens Wiklander  */
959f31ef5aSJens Wiklander void file_put(struct file *f);
969f31ef5aSJens Wiklander 
979f31ef5aSJens Wiklander /*
989f31ef5aSJens Wiklander  * file_find_slice() - Find a slice covering the @page_offset
999f31ef5aSJens Wiklander  * @f:		 File pointer
1009f31ef5aSJens Wiklander  * @page_offset: Offset that must be covered
1019f31ef5aSJens Wiklander  *
102*bae0f170SJens Wiklander  * File must be in locked state.
103*bae0f170SJens Wiklander  *
1049f31ef5aSJens Wiklander  * If a matching file slice is found it is returned, else NULL is returned.
1059f31ef5aSJens Wiklander  */
1069f31ef5aSJens Wiklander struct file_slice *file_find_slice(struct file *f, unsigned int page_offset);
1079f31ef5aSJens Wiklander 
1089f31ef5aSJens Wiklander #endif /*__MM_FILE_H*/
1099f31ef5aSJens Wiklander 
110