1ee546289SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2ee546289SJens Wiklander /* 3ee546289SJens Wiklander * Copyright (c) 2019, Linaro Limited 4ee546289SJens Wiklander */ 5ee546289SJens Wiklander 6ee546289SJens Wiklander #ifndef __MM_FOBJ_H 7ee546289SJens Wiklander #define __MM_FOBJ_H 8ee546289SJens Wiklander 9ee546289SJens Wiklander #include <kernel/refcount.h> 10ee546289SJens Wiklander #include <kernel/panic.h> 11ee546289SJens Wiklander #include <tee_api_types.h> 12ee546289SJens Wiklander #include <types_ext.h> 13ee546289SJens Wiklander 14ee546289SJens Wiklander /* 15ee546289SJens Wiklander * struct fobj - file object storage abstraction 16ee546289SJens Wiklander * @ops: Operations pointer 17ee546289SJens Wiklander * @num_pages: Number of pages covered 18ee546289SJens Wiklander * @refc: Reference counter 19ee546289SJens Wiklander */ 20ee546289SJens Wiklander struct fobj { 21ee546289SJens Wiklander const struct fobj_ops *ops; 22ee546289SJens Wiklander unsigned int num_pages; 23ee546289SJens Wiklander struct refcount refc; 24ee546289SJens Wiklander }; 25ee546289SJens Wiklander 26ee546289SJens Wiklander /* 27ee546289SJens Wiklander * struct fobj_ops - operations struct for struct fobj 28ee546289SJens Wiklander * @free: Frees the @fobj 29ee546289SJens Wiklander * @load_page: Loads page with index @page_idx at address @va 30ee546289SJens Wiklander * @save_page: Saves page with index @page_idx from address @va 31*fbcaa411SJens Wiklander * @get_pa: Returns physical address of page at @page_idx if not paged 32ee546289SJens Wiklander */ 33ee546289SJens Wiklander struct fobj_ops { 34ee546289SJens Wiklander void (*free)(struct fobj *fobj); 35ee546289SJens Wiklander #ifdef CFG_WITH_PAGER 36ee546289SJens Wiklander TEE_Result (*load_page)(struct fobj *fobj, unsigned int page_idx, 37ee546289SJens Wiklander void *va); 38ee546289SJens Wiklander TEE_Result (*save_page)(struct fobj *fobj, unsigned int page_idx, 39ee546289SJens Wiklander const void *va); 40ee546289SJens Wiklander #endif 41*fbcaa411SJens Wiklander paddr_t (*get_pa)(struct fobj *fobj, unsigned int page_idx); 42ee546289SJens Wiklander }; 43ee546289SJens Wiklander 44ee546289SJens Wiklander #ifdef CFG_WITH_PAGER 45ee546289SJens Wiklander /* 46ee546289SJens Wiklander * fobj_locked_paged_alloc() - Allocate storage which is locked in memory 47ee546289SJens Wiklander * @num_pages: Number of pages covered 48ee546289SJens Wiklander * 49ee546289SJens Wiklander * This object only supports loading pages zero initialized. Saving a page 50ee546289SJens Wiklander * will result in an error. 51ee546289SJens Wiklander * 52ee546289SJens Wiklander * Returns a valid pointer on success or NULL on failure. 53ee546289SJens Wiklander */ 54ee546289SJens Wiklander struct fobj *fobj_locked_paged_alloc(unsigned int num_pages); 55ee546289SJens Wiklander 56ee546289SJens Wiklander /* 57ee546289SJens Wiklander * fobj_rw_paged_alloc() - Allocate read/write storage 58ee546289SJens Wiklander * @num_pages: Number of pages covered 59ee546289SJens Wiklander * 60ee546289SJens Wiklander * This object supports both load and saving of pages. Pages are zero 61ee546289SJens Wiklander * initialized the first time they are loaded. 62ee546289SJens Wiklander * 63ee546289SJens Wiklander * Returns a valid pointer on success or NULL on failure. 64ee546289SJens Wiklander */ 65ee546289SJens Wiklander struct fobj *fobj_rw_paged_alloc(unsigned int num_pages); 66ee546289SJens Wiklander 67ee546289SJens Wiklander /* 68ee546289SJens Wiklander * fobj_ro_paged_alloc() - Allocate initialized read-only storage 69ee546289SJens Wiklander * @num_pages: Number of pages covered 70ee546289SJens Wiklander * @hashes: Hashes to verify the pages 71ee546289SJens Wiklander * @store: Clear text data for all pages 72ee546289SJens Wiklander * 73ee546289SJens Wiklander * This object only support loading pages with an already provided content 74ee546289SJens Wiklander * in @store. When a page is loaded it will be verified against an hash in 75ee546289SJens Wiklander * @hash. Saving a page will result in an error. 76ee546289SJens Wiklander * 77ee546289SJens Wiklander * Returns a valid pointer on success or NULL on failure. 78ee546289SJens Wiklander */ 79ee546289SJens Wiklander struct fobj *fobj_ro_paged_alloc(unsigned int num_pages, void *hashes, 80ee546289SJens Wiklander void *store); 81ee546289SJens Wiklander 82ee546289SJens Wiklander /* 83ee546289SJens Wiklander * fobj_load_page() - Load a page into memory 84ee546289SJens Wiklander * @fobj: Fobj pointer 85ee546289SJens Wiklander * @page_index: Index of page in @fobj 86ee546289SJens Wiklander * @va: Address where content should be stored and verified 87ee546289SJens Wiklander * 88ee546289SJens Wiklander * Returns TEE_SUCCESS on success or TEE_ERROR_* on failure. 89ee546289SJens Wiklander */ 90ee546289SJens Wiklander static inline TEE_Result fobj_load_page(struct fobj *fobj, 91ee546289SJens Wiklander unsigned int page_idx, void *va) 92ee546289SJens Wiklander { 93ee546289SJens Wiklander if (fobj) 94ee546289SJens Wiklander return fobj->ops->load_page(fobj, page_idx, va); 95ee546289SJens Wiklander 96ee546289SJens Wiklander return TEE_ERROR_GENERIC; 97ee546289SJens Wiklander } 98ee546289SJens Wiklander 99ee546289SJens Wiklander /* 100ee546289SJens Wiklander * fobj_save_page() - Save a page into storage 101ee546289SJens Wiklander * @fobj: Fobj pointer 102ee546289SJens Wiklander * @page_index: Index of page in @fobj 103ee546289SJens Wiklander * @va: Address of the page to store. 104ee546289SJens Wiklander * 105ee546289SJens Wiklander * Returns TEE_SUCCESS on success or TEE_ERROR_* on failure. 106ee546289SJens Wiklander */ 107ee546289SJens Wiklander static inline TEE_Result fobj_save_page(struct fobj *fobj, 108ee546289SJens Wiklander unsigned int page_idx, const void *va) 109ee546289SJens Wiklander { 110ee546289SJens Wiklander if (fobj) 111ee546289SJens Wiklander return fobj->ops->save_page(fobj, page_idx, va); 112ee546289SJens Wiklander 113ee546289SJens Wiklander return TEE_ERROR_GENERIC; 114ee546289SJens Wiklander } 115ee546289SJens Wiklander #endif 116ee546289SJens Wiklander 117ee546289SJens Wiklander /* 118*fbcaa411SJens Wiklander * fobj_ta_mem_alloc() - Allocates TA memory 119*fbcaa411SJens Wiklander * @num_pages: Number of pages 120*fbcaa411SJens Wiklander * 121*fbcaa411SJens Wiklander * If paging of user TAs read/write paged fobj is allocated otherwise a 122*fbcaa411SJens Wiklander * fobj which uses unpaged secure memory directly. 123*fbcaa411SJens Wiklander * 124*fbcaa411SJens Wiklander * Returns a valid pointer on success or NULL on failure. 125*fbcaa411SJens Wiklander */ 126*fbcaa411SJens Wiklander #ifdef CFG_PAGED_USER_TA 127*fbcaa411SJens Wiklander #define fobj_ta_mem_alloc(num_pages) fobj_rw_paged_alloc(num_pages) 128*fbcaa411SJens Wiklander #else 129*fbcaa411SJens Wiklander /* 130*fbcaa411SJens Wiklander * fobj_sec_mem_alloc() - Allocates storage directly in secure memory 131*fbcaa411SJens Wiklander * @num_pages: Number of pages 132*fbcaa411SJens Wiklander * 133*fbcaa411SJens Wiklander * Returns a valid pointer on success or NULL on failure. 134*fbcaa411SJens Wiklander */ 135*fbcaa411SJens Wiklander struct fobj *fobj_sec_mem_alloc(unsigned int num_pages); 136*fbcaa411SJens Wiklander 137*fbcaa411SJens Wiklander #define fobj_ta_mem_alloc(num_pages) fobj_sec_mem_alloc(num_pages) 138*fbcaa411SJens Wiklander #endif 139*fbcaa411SJens Wiklander 140*fbcaa411SJens Wiklander /* 141ee546289SJens Wiklander * fobj_get() - Increase fobj reference count 142ee546289SJens Wiklander * @fobj: Fobj pointer 143ee546289SJens Wiklander * 144ee546289SJens Wiklander * Returns @fobj, if @fobj isn't NULL its reference counter is first 145ee546289SJens Wiklander * increased. 146ee546289SJens Wiklander */ 147ee546289SJens Wiklander static inline struct fobj *fobj_get(struct fobj *fobj) 148ee546289SJens Wiklander { 149ee546289SJens Wiklander if (fobj && !refcount_inc(&fobj->refc)) 150ee546289SJens Wiklander panic(); 151ee546289SJens Wiklander 152ee546289SJens Wiklander return fobj; 153ee546289SJens Wiklander } 154ee546289SJens Wiklander 155ee546289SJens Wiklander /* 156ee546289SJens Wiklander * fobj_put() - Decrease reference counter of fobj 157ee546289SJens Wiklander * @fobj: Fobj pointer 158ee546289SJens Wiklander * 159ee546289SJens Wiklander * If reference counter reaches 0, matching the numbers of fobj_alloc_*() + 160ee546289SJens Wiklander * fobj_get(), the fobj is freed. 161ee546289SJens Wiklander */ 162ee546289SJens Wiklander static inline void fobj_put(struct fobj *fobj) 163ee546289SJens Wiklander { 164ee546289SJens Wiklander if (fobj && refcount_dec(&fobj->refc)) 165ee546289SJens Wiklander fobj->ops->free(fobj); 166ee546289SJens Wiklander } 167ee546289SJens Wiklander 168ee546289SJens Wiklander #ifdef CFG_WITH_PAGER 169ee546289SJens Wiklander /* 170ee546289SJens Wiklander * fobj_generate_authenc_key() - Generate authentication key 171ee546289SJens Wiklander * 172ee546289SJens Wiklander * Generates the authentication key used in all fobjs allocated with 173ee546289SJens Wiklander * fobj_rw_paged_alloc(). 174ee546289SJens Wiklander */ 175ee546289SJens Wiklander void fobj_generate_authenc_key(void); 176ee546289SJens Wiklander #else 177ee546289SJens Wiklander static inline void fobj_generate_authenc_key(void) 178ee546289SJens Wiklander { 179ee546289SJens Wiklander } 180ee546289SJens Wiklander #endif 181ee546289SJens Wiklander 182ee546289SJens Wiklander #endif /*__MM_FOBJ_H*/ 183