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