blob: 340e12dc649ca05c4a5596c95a1bef966ef45c9f [file] [log] [blame]
Patrick Williams2194f502022-10-16 14:26:09 -05001From e7fe12a5a7e3eac7a7d549ef9a7d88e9baba1832 Mon Sep 17 00:00:00 2001
Brad Bishopbec4ebc2022-08-03 09:55:16 -04002From: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
3Date: Fri, 14 Jan 2022 17:52:33 +0000
Patrick Williams2194f502022-10-16 14:26:09 -05004Subject: [PATCH 32/40] ANDROID: trusty: Add transport descriptor
Brad Bishopbec4ebc2022-08-03 09:55:16 -04005
6Use transport descriptor to hold transport specific operations. This
7helps to add new transport to Trusty core.
8
9Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
10Change-Id: Ibbde50de0302f6d259a7d572f0910067ce712b37
11Upstream-Status: Pending [Not submitted to upstream yet]
Patrick Williams2194f502022-10-16 14:26:09 -050012Signed-off-by: Rupinderjit Singh <rupinderjit.singh@arm.com
Brad Bishopbec4ebc2022-08-03 09:55:16 -040013---
14 drivers/trusty/trusty-private.h | 20 +++++++++-
15 drivers/trusty/trusty-smc.c | 6 +++
16 drivers/trusty/trusty.c | 71 ++++++++++++++++++++++++++++++---
17 3 files changed, 90 insertions(+), 7 deletions(-)
18
19diff --git a/drivers/trusty/trusty-private.h b/drivers/trusty/trusty-private.h
20index 4d73c6ae35d4..74b88bb8f83b 100644
21--- a/drivers/trusty/trusty-private.h
22+++ b/drivers/trusty/trusty-private.h
23@@ -14,12 +14,14 @@ struct trusty_work {
24 };
25
26 struct trusty_msg_ops {
27+ const struct trusty_transport_desc *desc;
28 u32 (*send_direct_msg)(struct device *dev, unsigned long fid,
29 unsigned long a0, unsigned long a1,
30 unsigned long a2);
31 };
32
33 struct trusty_mem_ops {
34+ const struct trusty_transport_desc *desc;
35 int (*trusty_share_memory)(struct device *dev, u64 *id,
36 struct scatterlist *sglist,
37 unsigned int nents, pgprot_t pgprot, u64 tag);
38@@ -46,6 +48,19 @@ struct trusty_state {
39 struct device_dma_parameters dma_parms;
40 const struct trusty_msg_ops *msg_ops;
41 const struct trusty_mem_ops *mem_ops;
42+ struct trusty_ffa_state *ffa;
43+};
44+
45+struct trusty_ffa_state {
46+ struct device *dev; /* ffa device */
47+ const struct ffa_dev_ops *ops;
48+ struct mutex share_memory_msg_lock; /* protects share_memory_msg */
49+};
50+
51+struct trusty_transport_desc {
52+ const char *name;
53+ int (*setup)(struct device *dev);
54+ void (*cleanup)(struct device *dev);
55 };
56
57 int trusty_init_api_version(struct trusty_state *s, struct device *dev,
58@@ -55,7 +70,8 @@ int trusty_init_api_version(struct trusty_state *s, struct device *dev,
59 unsigned long a1,
60 unsigned long a2));
61
62-int trusty_smc_transport_setup(struct device *dev);
63-void trusty_smc_transport_cleanup(struct device *dev);
64+typedef const struct trusty_transport_desc *trusty_transports_t;
65+
66+extern const struct trusty_transport_desc trusty_smc_transport;
67
68 #endif /* _TRUSTY_PRIVATE_H */
69diff --git a/drivers/trusty/trusty-smc.c b/drivers/trusty/trusty-smc.c
70index 8fa841e0e253..62d1d7060744 100644
71--- a/drivers/trusty/trusty-smc.c
72+++ b/drivers/trusty/trusty-smc.c
73@@ -134,3 +134,9 @@ void trusty_smc_transport_cleanup(struct device *dev)
74 if (s->mem_ops == &trusty_smc_mem_ops)
75 s->mem_ops = NULL;
76 }
77+
78+const struct trusty_transport_desc trusty_smc_transport = {
79+ .name = "smc",
80+ .setup = trusty_smc_transport_setup,
81+ .cleanup = trusty_smc_transport_cleanup,
82+};
83diff --git a/drivers/trusty/trusty.c b/drivers/trusty/trusty.c
84index 757dd7b2c527..ec0fccfaa24c 100644
85--- a/drivers/trusty/trusty.c
86+++ b/drivers/trusty/trusty.c
87@@ -493,6 +493,46 @@ void trusty_dequeue_nop(struct device *dev, struct trusty_nop *nop)
88 }
89 EXPORT_SYMBOL(trusty_dequeue_nop);
90
91+static int
92+trusty_transports_setup(const trusty_transports_t *transports,
93+ struct device *dev)
94+{
95+ const struct trusty_transport_desc *transport;
96+ int ret;
97+ int transports_ret = -ENODEV;
98+
99+ if (!transports)
100+ return -EINVAL;
101+
102+ for (; (transport = *transports); transports++) {
103+ if (!transport->setup)
104+ return -EINVAL;
105+
106+ ret = transport->setup(dev);
107+ transports_ret &= ret;
108+ }
109+
110+ /* One transport needs to complete setup without error. */
111+ if (transports_ret < 0)
112+ return -ENODEV;
113+
114+ return 0;
115+}
116+
117+static void
118+trusty_transports_cleanup(const trusty_transports_t *transports,
119+ struct device *dev)
120+{
121+ const struct trusty_transport_desc *transport;
122+
123+ for (; (transport = *transports); transports++) {
124+ if (!transport->cleanup)
125+ continue;
126+
127+ transport->cleanup(dev);
128+ }
129+}
130+
131 static int trusty_probe(struct platform_device *pdev)
132 {
133 int ret;
134@@ -500,6 +540,7 @@ static int trusty_probe(struct platform_device *pdev)
135 work_func_t work_func;
136 struct trusty_state *s;
137 struct device_node *node = pdev->dev.of_node;
138+ const trusty_transports_t *descs;
139
140 if (!node) {
141 dev_err(&pdev->dev, "of_node required\n");
142@@ -529,8 +570,12 @@ static int trusty_probe(struct platform_device *pdev)
143
144 platform_set_drvdata(pdev, s);
145
146- /* Initialize SMC transport */
147- ret = trusty_smc_transport_setup(s->dev);
148+ /*
149+ * Initialize Trusty transport. Trusty msg and mem ops has to be
150+ * initialized as part of transport setup.
151+ */
152+ descs = of_device_get_match_data(&pdev->dev);
153+ ret = trusty_transports_setup(descs, s->dev);
154 if (ret != 0 || s->msg_ops == NULL || s->mem_ops == NULL)
155 goto err_transport_setup;
156
157@@ -581,7 +626,7 @@ static int trusty_probe(struct platform_device *pdev)
158 destroy_workqueue(s->nop_wq);
159 err_create_nop_wq:
160 kfree(s->version_str);
161- trusty_smc_transport_cleanup(s->dev);
162+ trusty_transports_cleanup(descs, s->dev);
163 err_transport_setup:
164 s->dev->dma_parms = NULL;
165 device_for_each_child(&pdev->dev, NULL, trusty_remove_child);
166@@ -595,6 +640,7 @@ static int trusty_remove(struct platform_device *pdev)
167 {
168 unsigned int cpu;
169 struct trusty_state *s = platform_get_drvdata(pdev);
170+ const trusty_transports_t *descs;
171
172 device_for_each_child(&pdev->dev, NULL, trusty_remove_child);
173
174@@ -606,7 +652,10 @@ static int trusty_remove(struct platform_device *pdev)
175 free_percpu(s->nop_works);
176 destroy_workqueue(s->nop_wq);
177
178- trusty_smc_transport_cleanup(s->dev);
179+ /* call transport cleanup */
180+ descs = of_device_get_match_data(&pdev->dev);
181+ trusty_transports_cleanup(descs, s->dev);
182+
183 mutex_destroy(&s->smc_lock);
184 s->dev->dma_parms = NULL;
185 kfree(s->version_str);
186@@ -614,8 +663,20 @@ static int trusty_remove(struct platform_device *pdev)
187 return 0;
188 }
189
190+/*
191+ * Trusty probe will try all compiled in transports and will use the transport
192+ * supported by the Trusty kernel.
193+ *
194+ * For Trusty API version < TRUSTY_API_VERSION_MEM_OBJ:
195+ * trusty_smc_transport used for messaging.
196+ */
197+static const trusty_transports_t trusty_transports[] = {
198+ &trusty_smc_transport,
199+ NULL,
200+};
201+
202 static const struct of_device_id trusty_of_match[] = {
203- { .compatible = "android,trusty-v1", },
204+ { .compatible = "android,trusty-v1", .data = trusty_transports },
205 {},
206 };
207
208--
Patrick Williams2194f502022-10-16 14:26:09 -05002092.34.1
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400210