blob: aaf96e8e62f8b74887198fed38e7233f1534f587 [file] [log] [blame]
Patrick Williams2194f502022-10-16 14:26:09 -05001From 5a2565d002084a4c6b80329a4a23cb6c98c4f344 Mon Sep 17 00:00:00 2001
Brad Bishopbec4ebc2022-08-03 09:55:16 -04002From: Jens Wiklander <jens.wiklander@linaro.org>
3Date: Thu, 25 Mar 2021 15:08:46 +0100
Patrick Williams2194f502022-10-16 14:26:09 -05004Subject: [PATCH 09/40] optee: simplify optee_release()
Brad Bishopbec4ebc2022-08-03 09:55:16 -04005
6Simplifies optee_release() with a new helper function,
7optee_close_session_helper() which has been factored out from
8optee_close_session().
9
10A separate optee_release_supp() is added for the supplicant device.
11
Patrick Williams2194f502022-10-16 14:26:09 -050012Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
Brad Bishopbec4ebc2022-08-03 09:55:16 -040013Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
Brad Bishopbec4ebc2022-08-03 09:55:16 -040014Upstream-Status: Pending [Not submitted to upstream yet]
Patrick Williams2194f502022-10-16 14:26:09 -050015Signed-off-by: Rupinderjit Singh <rupinderjit.singh@arm.com>
Brad Bishopbec4ebc2022-08-03 09:55:16 -040016---
17 drivers/tee/optee/call.c | 31 ++++++++++-------
Patrick Williams2194f502022-10-16 14:26:09 -050018 drivers/tee/optee/core.c | 56 +++++++++++--------------------
Brad Bishopbec4ebc2022-08-03 09:55:16 -040019 drivers/tee/optee/optee_private.h | 1 +
Patrick Williams2194f502022-10-16 14:26:09 -050020 3 files changed, 39 insertions(+), 49 deletions(-)
Brad Bishopbec4ebc2022-08-03 09:55:16 -040021
22diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c
Patrick Williams2194f502022-10-16 14:26:09 -050023index 945f03da0223..103976df2062 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -040024--- a/drivers/tee/optee/call.c
25+++ b/drivers/tee/optee/call.c
Patrick Williams2194f502022-10-16 14:26:09 -050026@@ -288,12 +288,28 @@ int optee_open_session(struct tee_context *ctx,
Brad Bishopbec4ebc2022-08-03 09:55:16 -040027 return rc;
28 }
29
30-int optee_close_session(struct tee_context *ctx, u32 session)
31+int optee_close_session_helper(struct tee_context *ctx, u32 session)
32 {
33- struct optee_context_data *ctxdata = ctx->data;
34 struct tee_shm *shm;
35 struct optee_msg_arg *msg_arg;
36 phys_addr_t msg_parg;
37+
38+ shm = get_msg_arg(ctx, 0, &msg_arg, &msg_parg);
39+ if (IS_ERR(shm))
40+ return PTR_ERR(shm);
41+
42+ msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
43+ msg_arg->session = session;
44+ optee_do_call_with_arg(ctx, msg_parg);
45+
46+ tee_shm_free(shm);
47+
48+ return 0;
49+}
50+
51+int optee_close_session(struct tee_context *ctx, u32 session)
52+{
53+ struct optee_context_data *ctxdata = ctx->data;
54 struct optee_session *sess;
55
56 /* Check that the session is valid and remove it from the list */
Patrick Williams2194f502022-10-16 14:26:09 -050057@@ -306,16 +322,7 @@ int optee_close_session(struct tee_context *ctx, u32 session)
Brad Bishopbec4ebc2022-08-03 09:55:16 -040058 return -EINVAL;
59 kfree(sess);
60
61- shm = get_msg_arg(ctx, 0, &msg_arg, &msg_parg);
62- if (IS_ERR(shm))
63- return PTR_ERR(shm);
64-
65- msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
66- msg_arg->session = session;
67- optee_do_call_with_arg(ctx, msg_parg);
68-
69- tee_shm_free(shm);
70- return 0;
71+ return optee_close_session_helper(ctx, session);
72 }
73
74 int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg,
75diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
Patrick Williams2194f502022-10-16 14:26:09 -050076index 5363ebebfc35..79f67a79e7b7 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -040077--- a/drivers/tee/optee/core.c
78+++ b/drivers/tee/optee/core.c
Patrick Williams2194f502022-10-16 14:26:09 -050079@@ -264,60 +264,42 @@ static int optee_open(struct tee_context *ctx)
Brad Bishopbec4ebc2022-08-03 09:55:16 -040080 return 0;
81 }
82
83-static void optee_release(struct tee_context *ctx)
84+static void optee_release_helper(struct tee_context *ctx,
85+ int (*close_session)(struct tee_context *ctx,
86+ u32 session))
87 {
88 struct optee_context_data *ctxdata = ctx->data;
89- struct tee_device *teedev = ctx->teedev;
90- struct optee *optee = tee_get_drvdata(teedev);
91- struct tee_shm *shm;
92- struct optee_msg_arg *arg = NULL;
93- phys_addr_t parg;
94 struct optee_session *sess;
95 struct optee_session *sess_tmp;
96
97 if (!ctxdata)
98 return;
99
Patrick Williams2194f502022-10-16 14:26:09 -0500100- shm = tee_shm_alloc(ctx, sizeof(struct optee_msg_arg),
101- TEE_SHM_MAPPED | TEE_SHM_PRIV);
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400102- if (!IS_ERR(shm)) {
103- arg = tee_shm_get_va(shm, 0);
104- /*
105- * If va2pa fails for some reason, we can't call into
106- * secure world, only free the memory. Secure OS will leak
107- * sessions and finally refuse more sessions, but we will
108- * at least let normal world reclaim its memory.
109- */
110- if (!IS_ERR(arg))
111- if (tee_shm_va2pa(shm, arg, &parg))
112- arg = NULL; /* prevent usage of parg below */
113- }
114-
115 list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list,
116 list_node) {
117 list_del(&sess->list_node);
118- if (!IS_ERR_OR_NULL(arg)) {
119- memset(arg, 0, sizeof(*arg));
120- arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
121- arg->session = sess->session_id;
122- optee_do_call_with_arg(ctx, parg);
123- }
124+ close_session(ctx, sess->session_id);
125 kfree(sess);
126 }
127 kfree(ctxdata);
128+ ctx->data = NULL;
129+}
130
131- if (!IS_ERR(shm))
132- tee_shm_free(shm);
133+static void optee_release(struct tee_context *ctx)
134+{
135+ optee_release_helper(ctx, optee_close_session_helper);
136+}
137
138- ctx->data = NULL;
139+static void optee_release_supp(struct tee_context *ctx)
140+{
141+ struct optee *optee = tee_get_drvdata(ctx->teedev);
142
143- if (teedev == optee->supp_teedev) {
144- if (optee->scan_bus_wq) {
145- destroy_workqueue(optee->scan_bus_wq);
146- optee->scan_bus_wq = NULL;
147- }
148- optee_supp_release(&optee->supp);
149+ optee_release_helper(ctx, optee_close_session_helper);
150+ if (optee->scan_bus_wq) {
151+ destroy_workqueue(optee->scan_bus_wq);
152+ optee->scan_bus_wq = NULL;
153 }
154+ optee_supp_release(&optee->supp);
155 }
156
157 static const struct tee_driver_ops optee_ops = {
Patrick Williams2194f502022-10-16 14:26:09 -0500158@@ -341,7 +323,7 @@ static const struct tee_desc optee_desc = {
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400159 static const struct tee_driver_ops optee_supp_ops = {
160 .get_version = optee_get_version,
161 .open = optee_open,
162- .release = optee_release,
163+ .release = optee_release_supp,
164 .supp_recv = optee_supp_recv,
165 .supp_send = optee_supp_send,
166 .shm_register = optee_shm_register_supp,
167diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
Patrick Williams2194f502022-10-16 14:26:09 -0500168index f6bb4a763ba9..a55793f9f6eb 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400169--- a/drivers/tee/optee/optee_private.h
170+++ b/drivers/tee/optee/optee_private.h
171@@ -152,6 +152,7 @@ u32 optee_do_call_with_arg(struct tee_context *ctx, phys_addr_t parg);
172 int optee_open_session(struct tee_context *ctx,
173 struct tee_ioctl_open_session_arg *arg,
174 struct tee_param *param);
175+int optee_close_session_helper(struct tee_context *ctx, u32 session);
176 int optee_close_session(struct tee_context *ctx, u32 session);
177 int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg,
178 struct tee_param *param);
179--
Patrick Williams2194f502022-10-16 14:26:09 -05001802.34.1
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400181