xref: /optee_os/core/include/mm/file.h (revision 9f31ef5ae72a9cd592957fefde290cbc2f8891dd)
1*9f31ef5aSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
2*9f31ef5aSJens Wiklander /*
3*9f31ef5aSJens Wiklander  * Copyright (c) 2019, Linaro Limited
4*9f31ef5aSJens Wiklander  */
5*9f31ef5aSJens Wiklander 
6*9f31ef5aSJens Wiklander #ifndef __MM_FILE_H
7*9f31ef5aSJens Wiklander #define __MM_FILE_H
8*9f31ef5aSJens Wiklander 
9*9f31ef5aSJens Wiklander #include <types_ext.h>
10*9f31ef5aSJens Wiklander #include <utee_defines.h>
11*9f31ef5aSJens Wiklander 
12*9f31ef5aSJens Wiklander /* This is supposed to be large enough to hold any hash or tag used */
13*9f31ef5aSJens Wiklander #define FILE_TAG_SIZE	TEE_SHA256_HASH_SIZE
14*9f31ef5aSJens Wiklander 
15*9f31ef5aSJens Wiklander /*
16*9f31ef5aSJens Wiklander  * struct file_slice - one slice of a file
17*9f31ef5aSJens Wiklander  * @fobj:	 Fobj holding the data of this slice
18*9f31ef5aSJens Wiklander  * @page_offset: Offset in pages into the file where the @fobj is
19*9f31ef5aSJens Wiklander  *		 located.
20*9f31ef5aSJens Wiklander  */
21*9f31ef5aSJens Wiklander struct file_slice {
22*9f31ef5aSJens Wiklander 	struct fobj *fobj;
23*9f31ef5aSJens Wiklander 	unsigned int page_offset;
24*9f31ef5aSJens Wiklander };
25*9f31ef5aSJens Wiklander 
26*9f31ef5aSJens Wiklander struct file;
27*9f31ef5aSJens Wiklander 
28*9f31ef5aSJens Wiklander /*
29*9f31ef5aSJens Wiklander  * file_new() - allocate a new struct file
30*9f31ef5aSJens Wiklander  * @tag:	Tag of the file
31*9f31ef5aSJens Wiklander  * @taglen:	Length of @tag
32*9f31ef5aSJens Wiklander  * @slices:	An array of file slices
33*9f31ef5aSJens Wiklander  * @num_slices:	Number of elements in the @slices array
34*9f31ef5aSJens Wiklander  *
35*9f31ef5aSJens Wiklander  * Returns a newly allocated file with the reference counters of the fobjs
36*9f31ef5aSJens Wiklander  * in all the slices increased on success. Returns NULL on failure.
37*9f31ef5aSJens Wiklander  */
38*9f31ef5aSJens Wiklander struct file *file_new(uint8_t *tag, unsigned int taglen,
39*9f31ef5aSJens Wiklander 		      struct file_slice *slices, unsigned int num_slices);
40*9f31ef5aSJens Wiklander 
41*9f31ef5aSJens Wiklander /*
42*9f31ef5aSJens Wiklander  * file_get() - Increase file reference counter
43*9f31ef5aSJens Wiklander  * @f:		File pointer
44*9f31ef5aSJens Wiklander  *
45*9f31ef5aSJens Wiklander  * Returns @f, if @f isn't NULL its reference counter is first increased.
46*9f31ef5aSJens Wiklander  */
47*9f31ef5aSJens Wiklander struct file *file_get(struct file *f);
48*9f31ef5aSJens Wiklander 
49*9f31ef5aSJens Wiklander /*
50*9f31ef5aSJens Wiklander  * file_get_by_tag() - Finds a file based on tag and increase reference counter
51*9f31ef5aSJens Wiklander  * @tag:	Tag of the file
52*9f31ef5aSJens Wiklander  * @taglen:	Length of @tag
53*9f31ef5aSJens Wiklander  *
54*9f31ef5aSJens Wiklander  * Returns a file with an increased reference counter if found, or NULL if
55*9f31ef5aSJens Wiklander  * not found.
56*9f31ef5aSJens Wiklander  */
57*9f31ef5aSJens Wiklander struct file *file_get_by_tag(uint8_t *tag, unsigned int taglen);
58*9f31ef5aSJens Wiklander 
59*9f31ef5aSJens Wiklander /*
60*9f31ef5aSJens Wiklander  * file_put() - Decrease reference counter of file
61*9f31ef5aSJens Wiklander  * @f:		File pointer
62*9f31ef5aSJens Wiklander  *
63*9f31ef5aSJens Wiklander  * If reference counter reaches 0, matching the numbers of file_new() +
64*9f31ef5aSJens Wiklander  * file_get() + file_get_by_tag(), the file is removed with reference
65*9f31ef5aSJens Wiklander  * counters for all contained fobjs decreased.
66*9f31ef5aSJens Wiklander  */
67*9f31ef5aSJens Wiklander void file_put(struct file *f);
68*9f31ef5aSJens Wiklander 
69*9f31ef5aSJens Wiklander /*
70*9f31ef5aSJens Wiklander  * file_find_slice() - Find a slice covering the @page_offset
71*9f31ef5aSJens Wiklander  * @f:		 File pointer
72*9f31ef5aSJens Wiklander  * @page_offset: Offset that must be covered
73*9f31ef5aSJens Wiklander  *
74*9f31ef5aSJens Wiklander  * If a matching file slice is found it is returned, else NULL is returned.
75*9f31ef5aSJens Wiklander  */
76*9f31ef5aSJens Wiklander struct file_slice *file_find_slice(struct file *f, unsigned int page_offset);
77*9f31ef5aSJens Wiklander 
78*9f31ef5aSJens Wiklander #endif /*__MM_FILE_H*/
79*9f31ef5aSJens Wiklander 
80