diff options
Diffstat (limited to 'meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0042-ANDROID-trusty-ffa-Add-support-for-FFA-memory-operat.patch')
-rw-r--r-- | meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0042-ANDROID-trusty-ffa-Add-support-for-FFA-memory-operat.patch | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0042-ANDROID-trusty-ffa-Add-support-for-FFA-memory-operat.patch b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0042-ANDROID-trusty-ffa-Add-support-for-FFA-memory-operat.patch new file mode 100644 index 0000000000..2b1500987d --- /dev/null +++ b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.10/tc/0042-ANDROID-trusty-ffa-Add-support-for-FFA-memory-operat.patch @@ -0,0 +1,151 @@ +From c552f8ed6bbd68e838732598ca74055bb696dcb3 Mon Sep 17 00:00:00 2001 +From: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com> +Date: Tue, 18 Jan 2022 15:11:46 +0000 +Subject: [PATCH 29/32] ANDROID: trusty-ffa: Add support for FFA memory + operations + +Initializes Trusty mem_ops with FFA memory operations for share, +lend, reclaim. + +Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com> +Change-Id: Id3a1eb5ae8e4721cb983c624773d39bafe25a77d +Upstream-Status: Pending [Not submitted to upstream yet] +--- + drivers/trusty/trusty-ffa.c | 102 ++++++++++++++++++++++++++++++++++++ + drivers/trusty/trusty.c | 5 ++ + 2 files changed, 107 insertions(+) + +diff --git a/drivers/trusty/trusty-ffa.c b/drivers/trusty/trusty-ffa.c +index c8c16a1fc700..0655b3887b52 100644 +--- a/drivers/trusty/trusty-ffa.c ++++ b/drivers/trusty/trusty-ffa.c +@@ -15,8 +15,110 @@ + #include "trusty-ffa.h" + #include "trusty-private.h" + ++static int __trusty_ffa_share_memory(struct device *dev, u64 *id, ++ struct scatterlist *sglist, ++ unsigned int nents, pgprot_t pgprot, ++ u64 tag, bool share) ++{ ++ struct trusty_state *s = platform_get_drvdata(to_platform_device(dev)); ++ int ret; ++ struct scatterlist *sg; ++ size_t count; ++ struct ffa_device *ffa_dev = to_ffa_dev(s->ffa->dev); ++ const struct ffa_dev_ops *ffa_ops = s->ffa->ops; ++ struct ffa_mem_region_attributes ffa_mem_attr; ++ struct ffa_mem_ops_args ffa_mem_args; ++ ++ if (WARN_ON(nents < 1)) ++ return -EINVAL; ++ ++ count = dma_map_sg(dev, sglist, nents, DMA_BIDIRECTIONAL); ++ if (count != nents) { ++ dev_err(s->dev, "failed to dma map sg_table\n"); ++ return -EINVAL; ++ } ++ ++ sg = sglist; ++ ++ mutex_lock(&s->ffa->share_memory_msg_lock); ++ ++ ffa_mem_attr.receiver = ffa_dev->vm_id; ++ ffa_mem_attr.attrs = FFA_MEM_RW; ++ ++ ffa_mem_args.use_txbuf = 1; ++ ffa_mem_args.tag = tag; ++ ffa_mem_args.attrs = &ffa_mem_attr; ++ ffa_mem_args.nattrs = 1; ++ ffa_mem_args.sg = sg; ++ ffa_mem_args.flags = 0; ++ ++ if (share) { ++ ret = ffa_ops->memory_share(ffa_dev, &ffa_mem_args); ++ } else { ++ ret = ffa_ops->memory_lend(ffa_dev, &ffa_mem_args); ++ } ++ ++ mutex_unlock(&s->ffa->share_memory_msg_lock); ++ ++ if (!ret) { ++ *id = ffa_mem_args.g_handle; ++ dev_dbg(s->dev, "%s: done\n", __func__); ++ return 0; ++ } ++ ++ dev_err(s->dev, "%s: failed %d", __func__, ret); ++ ++ dma_unmap_sg(dev, sglist, nents, DMA_BIDIRECTIONAL); ++ return ret; ++} ++ ++static int trusty_ffa_share_memory(struct device *dev, u64 *id, ++ struct scatterlist *sglist, ++ unsigned int nents, pgprot_t pgprot, u64 tag) ++{ ++ return __trusty_ffa_share_memory(dev, id, sglist, nents, pgprot, tag, ++ true); ++} ++ ++static int trusty_ffa_lend_memory(struct device *dev, u64 *id, ++ struct scatterlist *sglist, ++ unsigned int nents, pgprot_t pgprot, u64 tag) ++{ ++ return __trusty_ffa_share_memory(dev, id, sglist, nents, pgprot, tag, ++ false); ++} ++ ++static int trusty_ffa_reclaim_memory(struct device *dev, u64 id, ++ struct scatterlist *sglist, ++ unsigned int nents) ++{ ++ struct trusty_state *s = platform_get_drvdata(to_platform_device(dev)); ++ int ret = 0; ++ const struct ffa_dev_ops *ffa_ops = s->ffa->ops; ++ ++ if (WARN_ON(nents < 1)) ++ return -EINVAL; ++ ++ mutex_lock(&s->ffa->share_memory_msg_lock); ++ ++ ret = ffa_ops->memory_reclaim(id, 0); ++ ++ mutex_unlock(&s->ffa->share_memory_msg_lock); ++ ++ if (ret != 0) ++ return ret; ++ ++ dma_unmap_sg(dev, sglist, nents, DMA_BIDIRECTIONAL); ++ ++ dev_dbg(s->dev, "%s: done\n", __func__); ++ return 0; ++} ++ + static const struct trusty_mem_ops trusty_ffa_mem_ops = { + .desc = &trusty_ffa_transport, ++ .trusty_share_memory = &trusty_ffa_share_memory, ++ .trusty_lend_memory = &trusty_ffa_lend_memory, ++ .trusty_reclaim_memory = &trusty_ffa_reclaim_memory, + }; + + static const struct ffa_device_id trusty_ffa_device_id[] = { +diff --git a/drivers/trusty/trusty.c b/drivers/trusty/trusty.c +index 4686b0d34f61..f91c255c9897 100644 +--- a/drivers/trusty/trusty.c ++++ b/drivers/trusty/trusty.c +@@ -674,6 +674,11 @@ static int trusty_remove(struct platform_device *pdev) + * + * For Trusty API version < TRUSTY_API_VERSION_MEM_OBJ: + * trusty_smc_transport used for messaging. ++ * ++ * For Trusty API version == TRUSTY_API_VERSION_MEM_OBJ: ++ * trusty_smc_transport used for messaging. ++ * trusty_ffa_transport used for memory sharing. ++ * + */ + static const trusty_transports_t trusty_transports[] = { + &trusty_smc_transport, +-- +2.30.2 + |