Add a page-based dynamic shared-memory pool for the RPMI backend using the common TEE allocation and free helpers.
Register allocated pages as RPMI parcels so OP-TEE can access them. Unregister the parcels before freeing their backing pages.
Signed-off-by: Amirreza Zarrabi amirreza.zarrabi@oss.qualcomm.com --- drivers/tee/optee/rpmi_abi.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
diff --git a/drivers/tee/optee/rpmi_abi.c b/drivers/tee/optee/rpmi_abi.c index e7fc853cfb15..c29b7ac4552a 100644 --- a/drivers/tee/optee/rpmi_abi.c +++ b/drivers/tee/optee/rpmi_abi.c @@ -282,6 +282,42 @@ static int optee_rpmi_shm_unregister_supp(struct tee_context *ctx, return ret; }
+static int optee_rpmi_pool_alloc(struct tee_shm_pool *pool, struct tee_shm *shm, + size_t size, size_t align) +{ + return tee_dyn_shm_alloc_helper(shm, size, align, + optee_rpmi_shm_register); +} + +static void optee_rpmi_pool_free(struct tee_shm_pool *pool, struct tee_shm *shm) +{ + tee_dyn_shm_free_helper(shm, optee_rpmi_shm_unregister); +} + +static void optee_rpmi_pool_destroy(struct tee_shm_pool *pool) +{ + kfree(pool); +} + +static const struct tee_shm_pool_ops optee_rpmi_pool_ops = { + .alloc = optee_rpmi_pool_alloc, + .free = optee_rpmi_pool_free, + .destroy_pool = optee_rpmi_pool_destroy, +}; + +static struct tee_shm_pool *optee_rpmi_shm_pool_alloc(void) +{ + struct tee_shm_pool *pool; + + pool = kzalloc_obj(*pool); + if (!pool) + return ERR_PTR(-ENOMEM); + + pool->ops = &optee_rpmi_pool_ops; + + return pool; +} + /* Convert a memory reference to an OP-TEE RPMI parcel reference. */ static int to_msg_param_rpmi_mem(struct optee_msg_param *mp, const struct tee_param *p)