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