blob: 2b1500987daca4f32ed955dabca4b3aec2207a94 [file] [log] [blame]
Brad Bishopbec4ebc2022-08-03 09:55:16 -04001From c552f8ed6bbd68e838732598ca74055bb696dcb3 Mon Sep 17 00:00:00 2001
2From: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
3Date: Tue, 18 Jan 2022 15:11:46 +0000
4Subject: [PATCH 29/32] ANDROID: trusty-ffa: Add support for FFA memory
5 operations
6
7Initializes Trusty mem_ops with FFA memory operations for share,
8lend, reclaim.
9
10Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
11Change-Id: Id3a1eb5ae8e4721cb983c624773d39bafe25a77d
12Upstream-Status: Pending [Not submitted to upstream yet]
13---
14 drivers/trusty/trusty-ffa.c | 102 ++++++++++++++++++++++++++++++++++++
15 drivers/trusty/trusty.c | 5 ++
16 2 files changed, 107 insertions(+)
17
18diff --git a/drivers/trusty/trusty-ffa.c b/drivers/trusty/trusty-ffa.c
19index c8c16a1fc700..0655b3887b52 100644
20--- a/drivers/trusty/trusty-ffa.c
21+++ b/drivers/trusty/trusty-ffa.c
22@@ -15,8 +15,110 @@
23 #include "trusty-ffa.h"
24 #include "trusty-private.h"
25
26+static int __trusty_ffa_share_memory(struct device *dev, u64 *id,
27+ struct scatterlist *sglist,
28+ unsigned int nents, pgprot_t pgprot,
29+ u64 tag, bool share)
30+{
31+ struct trusty_state *s = platform_get_drvdata(to_platform_device(dev));
32+ int ret;
33+ struct scatterlist *sg;
34+ size_t count;
35+ struct ffa_device *ffa_dev = to_ffa_dev(s->ffa->dev);
36+ const struct ffa_dev_ops *ffa_ops = s->ffa->ops;
37+ struct ffa_mem_region_attributes ffa_mem_attr;
38+ struct ffa_mem_ops_args ffa_mem_args;
39+
40+ if (WARN_ON(nents < 1))
41+ return -EINVAL;
42+
43+ count = dma_map_sg(dev, sglist, nents, DMA_BIDIRECTIONAL);
44+ if (count != nents) {
45+ dev_err(s->dev, "failed to dma map sg_table\n");
46+ return -EINVAL;
47+ }
48+
49+ sg = sglist;
50+
51+ mutex_lock(&s->ffa->share_memory_msg_lock);
52+
53+ ffa_mem_attr.receiver = ffa_dev->vm_id;
54+ ffa_mem_attr.attrs = FFA_MEM_RW;
55+
56+ ffa_mem_args.use_txbuf = 1;
57+ ffa_mem_args.tag = tag;
58+ ffa_mem_args.attrs = &ffa_mem_attr;
59+ ffa_mem_args.nattrs = 1;
60+ ffa_mem_args.sg = sg;
61+ ffa_mem_args.flags = 0;
62+
63+ if (share) {
64+ ret = ffa_ops->memory_share(ffa_dev, &ffa_mem_args);
65+ } else {
66+ ret = ffa_ops->memory_lend(ffa_dev, &ffa_mem_args);
67+ }
68+
69+ mutex_unlock(&s->ffa->share_memory_msg_lock);
70+
71+ if (!ret) {
72+ *id = ffa_mem_args.g_handle;
73+ dev_dbg(s->dev, "%s: done\n", __func__);
74+ return 0;
75+ }
76+
77+ dev_err(s->dev, "%s: failed %d", __func__, ret);
78+
79+ dma_unmap_sg(dev, sglist, nents, DMA_BIDIRECTIONAL);
80+ return ret;
81+}
82+
83+static int trusty_ffa_share_memory(struct device *dev, u64 *id,
84+ struct scatterlist *sglist,
85+ unsigned int nents, pgprot_t pgprot, u64 tag)
86+{
87+ return __trusty_ffa_share_memory(dev, id, sglist, nents, pgprot, tag,
88+ true);
89+}
90+
91+static int trusty_ffa_lend_memory(struct device *dev, u64 *id,
92+ struct scatterlist *sglist,
93+ unsigned int nents, pgprot_t pgprot, u64 tag)
94+{
95+ return __trusty_ffa_share_memory(dev, id, sglist, nents, pgprot, tag,
96+ false);
97+}
98+
99+static int trusty_ffa_reclaim_memory(struct device *dev, u64 id,
100+ struct scatterlist *sglist,
101+ unsigned int nents)
102+{
103+ struct trusty_state *s = platform_get_drvdata(to_platform_device(dev));
104+ int ret = 0;
105+ const struct ffa_dev_ops *ffa_ops = s->ffa->ops;
106+
107+ if (WARN_ON(nents < 1))
108+ return -EINVAL;
109+
110+ mutex_lock(&s->ffa->share_memory_msg_lock);
111+
112+ ret = ffa_ops->memory_reclaim(id, 0);
113+
114+ mutex_unlock(&s->ffa->share_memory_msg_lock);
115+
116+ if (ret != 0)
117+ return ret;
118+
119+ dma_unmap_sg(dev, sglist, nents, DMA_BIDIRECTIONAL);
120+
121+ dev_dbg(s->dev, "%s: done\n", __func__);
122+ return 0;
123+}
124+
125 static const struct trusty_mem_ops trusty_ffa_mem_ops = {
126 .desc = &trusty_ffa_transport,
127+ .trusty_share_memory = &trusty_ffa_share_memory,
128+ .trusty_lend_memory = &trusty_ffa_lend_memory,
129+ .trusty_reclaim_memory = &trusty_ffa_reclaim_memory,
130 };
131
132 static const struct ffa_device_id trusty_ffa_device_id[] = {
133diff --git a/drivers/trusty/trusty.c b/drivers/trusty/trusty.c
134index 4686b0d34f61..f91c255c9897 100644
135--- a/drivers/trusty/trusty.c
136+++ b/drivers/trusty/trusty.c
137@@ -674,6 +674,11 @@ static int trusty_remove(struct platform_device *pdev)
138 *
139 * For Trusty API version < TRUSTY_API_VERSION_MEM_OBJ:
140 * trusty_smc_transport used for messaging.
141+ *
142+ * For Trusty API version == TRUSTY_API_VERSION_MEM_OBJ:
143+ * trusty_smc_transport used for messaging.
144+ * trusty_ffa_transport used for memory sharing.
145+ *
146 */
147 static const trusty_transports_t trusty_transports[] = {
148 &trusty_smc_transport,
149--
1502.30.2
151