On Wed, Oct 13, 2021 at 9:15 AM Sumit Garg sumit.garg@linaro.org wrote:
On Wed, 6 Oct 2021 at 12:46, Jens Wiklander jens.wiklander@linaro.org wrote:
Renames struct optee_wait_queue to struct optee_notif and all related functions to optee_notif_*().
The implementation is changed to allow sending a notification from an atomic state, that is from the top half of an interrupt handler.
Waiting for keys is currently only used when secure world is waiting for a mutex or condition variable. The old implementation could handle any 32-bit key while this new implementation is restricted to only 8 bits or the maximum value 255. A upper value is needed since a bitmap is allocated to allow an interrupt handler to only set a bit in case the waiter hasn't had the time yet to allocate and register a completion.
The keys are currently only representing secure world threads which number usually are never even close to 255 so it should be safe for now. In future ABI updates the maximum value of the key will be communicated while the driver is initializing.
Signed-off-by: Jens Wiklander jens.wiklander@linaro.org
drivers/tee/optee/Makefile | 1 + drivers/tee/optee/core.c | 12 ++- drivers/tee/optee/notif.c | 125 ++++++++++++++++++++++++++++++ drivers/tee/optee/optee_private.h | 19 +++-- drivers/tee/optee/optee_rpc_cmd.h | 31 ++++---- drivers/tee/optee/rpc.c | 73 ++--------------- 6 files changed, 170 insertions(+), 91 deletions(-) create mode 100644 drivers/tee/optee/notif.c
Apart from minor nit below:
Reviewed-by: Sumit Garg sumit.garg@linaro.org
diff --git a/drivers/tee/optee/Makefile b/drivers/tee/optee/Makefile index 3aa33ea9e6a6..df55e4ad5370 100644 --- a/drivers/tee/optee/Makefile +++ b/drivers/tee/optee/Makefile @@ -2,6 +2,7 @@ obj-$(CONFIG_OPTEE) += optee.o optee-objs += core.o optee-objs += call.o +optee-objs += notif.o optee-objs += rpc.o optee-objs += supp.o optee-objs += shm_pool.o diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 5ce13b099d7d..8531184f98f4 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -592,6 +592,7 @@ static int optee_remove(struct platform_device *pdev) */ optee_disable_shm_cache(optee);
optee_notif_uninit(optee); /* * The two devices have to be unregistered before we can free the * other resources.
@@ -602,7 +603,6 @@ static int optee_remove(struct platform_device *pdev) tee_shm_pool_free(optee->pool); if (optee->memremaped_shm) memunmap(optee->memremaped_shm);
optee_wait_queue_exit(&optee->wait_queue); optee_supp_uninit(&optee->supp); mutex_destroy(&optee->call_queue.mutex);
@@ -712,11 +712,17 @@ static int optee_probe(struct platform_device *pdev)
mutex_init(&optee->call_queue.mutex); INIT_LIST_HEAD(&optee->call_queue.waiters);
optee_wait_queue_init(&optee->wait_queue); optee_supp_init(&optee->supp); optee->memremaped_shm = memremaped_shm; optee->pool = pool;
platform_set_drvdata(pdev, optee);
rc = optee_notif_init(optee, 255);
nit: Can you use a macro here instead of a constant with a proper comment similar to the one in commit description?
OK, I'll fix.
Thanks, Jens