Messages in this thread | | | From | Rouven Czerwinski <> | Subject | Re: [Tee-dev] [PATCH] optee: allow to work without static shared memory | Date | Tue, 19 Jun 2018 07:37:56 +0200 |
| |
Volodymyr Babchuk <volodymyr_babchuk@epam.com> writes:
> From: Volodymyr Babchuk <vlad.babchuk@gmail.com> > > On virtualized systems it is possible that OP-TEE will provide > only dynamic shared memory support. So it is fine to boot > without static SHM enabled if dymanic one is supported. > > Signed-off-by: Volodymyr Babchuk <vlad.babchuk@gmail.com> > --- > drivers/tee/optee/core.c | 83 ++++++++++++++++++++++++++++-------------------- > 1 file changed, 49 insertions(+), 34 deletions(-) > > diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c > index 4a2c420..d80da29 100644 > --- a/drivers/tee/optee/core.c > +++ b/drivers/tee/optee/core.c > @@ -420,9 +420,35 @@ static bool optee_msg_exchange_capabilities(optee_invoke_fn *invoke_fn, > return true; > } > > +static struct tee_shm_pool *optee_config_dyn_shm(void) > +{ > + struct tee_shm_pool_mgr *priv_mgr; > + struct tee_shm_pool_mgr *dmabuf_mgr; > + void *rc; > + > + rc = optee_shm_pool_alloc_pages(); > + if (IS_ERR(rc)) > + return rc; > + priv_mgr = rc; > + > + rc = optee_shm_pool_alloc_pages(); > + if (IS_ERR(rc)) { > + tee_shm_pool_mgr_destroy(priv_mgr); > + return rc; > + } > + dmabuf_mgr = rc; > + > + rc = tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); > + if (IS_ERR(rc)) { > + tee_shm_pool_mgr_destroy(priv_mgr); > + tee_shm_pool_mgr_destroy(dmabuf_mgr); > + } > + > + return rc; > +} > + > static struct tee_shm_pool * > -optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm, > - u32 sec_caps) > +optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm) > { > union { > struct arm_smccc_res smccc; > @@ -437,10 +463,11 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm, > struct tee_shm_pool_mgr *priv_mgr; > struct tee_shm_pool_mgr *dmabuf_mgr; > void *rc; > + const int sz = OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; > > invoke_fn(OPTEE_SMC_GET_SHM_CONFIG, 0, 0, 0, 0, 0, 0, 0, &res.smccc); > if (res.result.status != OPTEE_SMC_RETURN_OK) { > - pr_info("shm service not available\n"); > + pr_err("static shm service not available\n"); > return ERR_PTR(-ENOENT); > } > > @@ -466,28 +493,15 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm, > } > vaddr = (unsigned long)va; > > - /* > - * If OP-TEE can work with unregistered SHM, we will use own pool > - * for private shm > - */ > - if (sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) { > - rc = optee_shm_pool_alloc_pages(); > - if (IS_ERR(rc)) > - goto err_memunmap; > - priv_mgr = rc; > - } else { > - const size_t sz = OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; > - > - rc = tee_shm_pool_mgr_alloc_res_mem(vaddr, paddr, sz, > - 3 /* 8 bytes aligned */); > - if (IS_ERR(rc)) > - goto err_memunmap; > - priv_mgr = rc; > - > - vaddr += sz; > - paddr += sz; > - size -= sz; > - } > + rc = tee_shm_pool_mgr_alloc_res_mem(vaddr, paddr, sz, > + 3 /* 8 bytes aligned */); > + if (IS_ERR(rc)) > + goto err_memunmap; > + priv_mgr = rc; > + > + vaddr += sz; > + paddr += sz; > + size -= sz; > > rc = tee_shm_pool_mgr_alloc_res_mem(vaddr, paddr, size, PAGE_SHIFT); > if (IS_ERR(rc)) > @@ -553,7 +567,7 @@ static optee_invoke_fn *get_invoke_func(struct device_node *np) > static struct optee *optee_probe(struct device_node *np) > { > optee_invoke_fn *invoke_fn; > - struct tee_shm_pool *pool; > + struct tee_shm_pool *pool = ERR_PTR(-EINVAL); > struct optee *optee = NULL; > void *memremaped_shm = NULL; > struct tee_device *teedev; > @@ -582,13 +596,17 @@ static struct optee *optee_probe(struct device_node *np) > } > > /* > - * We have no other option for shared memory, if secure world > - * doesn't have any reserved memory we can use we can't continue. > + * Try to use dynamic shared memory if possible > */ > - if (!(sec_caps & OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM)) > - return ERR_PTR(-EINVAL); > + if (sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) > + pool = optee_config_dyn_shm(); > + > + /* > + * If dynamic shared memory is not available or failed - try static one > + */ > + if (IS_ERR(pool) && (sec_caps & OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM)) > + pool = optee_config_shm_memremap(invoke_fn, &memremaped_shm); > > - pool = optee_config_shm_memremap(invoke_fn, &memremaped_shm, sec_caps); > if (IS_ERR(pool)) > return (void *)pool; >
-- BEGIN -- > @@ -632,9 +650,6 @@ static struct optee *optee_probe(struct device_node *np) > > optee_enable_shm_cache(optee); > > - if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) > - pr_info("dynamic shared memory is enabled\n"); > - > pr_info("initialized driver\n"); > return optee; > err: -- END --
This part does not apply against upstream.
Greetings
Rouven
| |