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