/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (c) 2019, Linaro Limited */ #ifndef __MM_FILE_H #define __MM_FILE_H #include #include #include /* This is supposed to be large enough to hold any hash or tag used */ #define FILE_TAG_SIZE TEE_SHA256_HASH_SIZE /* * struct file_slice - one slice of a file * @fobj: Fobj holding the data of this slice * @page_offset: Offset in pages into the file where the @fobj is * located. */ struct file_slice { struct fobj *fobj; unsigned int page_offset; }; struct file; /* * file_lock() - Lock the file * @f: File pointer * * Waits until the file can be locked and with the file put in locked state. */ void file_lock(struct file *f); /* * file_lock() - Try to lock the file without blocking * @f: File pointer * * Returns false if file cannot be locked without blocking. * Returns true if the file has been put in locked state. */ bool file_trylock(struct file *f); /* * file_unlock() - Unlock the file * @f: File pointer * * File must be in locked state. Releases the previous lock and returns. */ void file_unlock(struct file *f); /* * file_add_slice() - Add a slice to a file * @f: File pointer * @fobj: Fobj holding the data of this slice * @page_offset: Offset in pages into the file (@f) where the @fobj is * located. * * File must be in locked state. * * Returns TEE_SUCCESS on success or a TEE_ERROR_* code on failure. */ TEE_Result file_add_slice(struct file *f, struct fobj *fobj, unsigned int page_offset); /* * file_get() - Increase file reference counter * @f: File pointer * * Returns @f, if @f isn't NULL its reference counter is first increased. */ struct file *file_get(struct file *f); /* * file_get_by_tag() - Finds a file based on tag and increase reference counter * @tag: Tag of the file * @taglen: Length of @tag * * If a file doesn't exist it's created with the supplied tag. * * Returns a file with an increased reference counter, or NULL on failure. */ struct file *file_get_by_tag(const uint8_t *tag, unsigned int taglen); /* * file_put() - Decrease reference counter of file * @f: File pointer * * If reference counter reaches 0, matching the numbers of file_new() + * file_get() + file_get_by_tag(), the file is removed with reference * counters for all contained fobjs decreased. */ void file_put(struct file *f); /* * file_find_slice() - Find a slice covering the @page_offset * @f: File pointer * @page_offset: Offset that must be covered * * File must be in locked state. * * If a matching file slice is found it is returned, else NULL is returned. */ struct file_slice *file_find_slice(struct file *f, unsigned int page_offset); #endif /*__MM_FILE_H*/