diff options
Diffstat (limited to 'meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.15/tc/0033-ANDROID-trusty-Add-trusty-ffa-driver.patch')
-rw-r--r-- | meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.15/tc/0033-ANDROID-trusty-Add-trusty-ffa-driver.patch | 313 |
1 files changed, 0 insertions, 313 deletions
diff --git a/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.15/tc/0033-ANDROID-trusty-Add-trusty-ffa-driver.patch b/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.15/tc/0033-ANDROID-trusty-Add-trusty-ffa-driver.patch deleted file mode 100644 index 4c70e34d12..0000000000 --- a/meta-arm/meta-arm-bsp/recipes-kernel/linux/linux-arm64-ack-5.15/tc/0033-ANDROID-trusty-Add-trusty-ffa-driver.patch +++ /dev/null @@ -1,313 +0,0 @@ -From 34236d8df51d00d1167481760fda5abb56850765 Mon Sep 17 00:00:00 2001 -From: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com> -Date: Fri, 14 Jan 2022 18:47:08 +0000 -Subject: [PATCH 33/40] ANDROID: trusty: Add trusty-ffa driver - -Initial changes related to FFA transport support - - Adds FFA transport descriptor - - Defines Trusty UUID - - Initializes FFA transport does probe, sets ffa_ops - - Defers Trusty probe if ARM FF-A driver is not initialized or - Trusty SP not found. - - Link FF-A device as the supplier for Trusty platform device. - -Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com> -Change-Id: I78f72b85c20e4bad4c24cf0826e96f27dcf2ee1d -Upstream-Status: Pending [Not submitted to upstream yet] -Signed-off-by: Rupinderjit Singh <rupinderjit.singh@arm.com ---- - drivers/trusty/Makefile | 1 + - drivers/trusty/trusty-ffa.c | 196 ++++++++++++++++++++++++++++++++ - drivers/trusty/trusty-ffa.h | 28 +++++ - drivers/trusty/trusty-private.h | 1 + - drivers/trusty/trusty.c | 6 + - 5 files changed, 232 insertions(+) - create mode 100644 drivers/trusty/trusty-ffa.c - create mode 100644 drivers/trusty/trusty-ffa.h - -diff --git a/drivers/trusty/Makefile b/drivers/trusty/Makefile -index fbb53ee93003..797d61bf68ef 100644 ---- a/drivers/trusty/Makefile -+++ b/drivers/trusty/Makefile -@@ -6,6 +6,7 @@ - obj-$(CONFIG_TRUSTY) += trusty-core.o - trusty-core-objs += trusty.o trusty-mem.o - trusty-core-objs += trusty-smc.o -+trusty-core-objs += trusty-ffa.o - trusty-core-$(CONFIG_ARM) += trusty-smc-arm.o - trusty-core-$(CONFIG_ARM64) += trusty-smc-arm64.o - obj-$(CONFIG_TRUSTY_IRQ) += trusty-irq.o -diff --git a/drivers/trusty/trusty-ffa.c b/drivers/trusty/trusty-ffa.c -new file mode 100644 -index 000000000000..c8c16a1fc700 ---- /dev/null -+++ b/drivers/trusty/trusty-ffa.c -@@ -0,0 +1,196 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+/* -+ * Copyright (C) 2022 ARM Ltd. -+ */ -+ -+#include <linux/platform_device.h> -+#include <linux/slab.h> -+#include <linux/trusty/smcall.h> -+#include <linux/arm_ffa.h> -+#include <linux/trusty/trusty.h> -+ -+#include <linux/scatterlist.h> -+#include <linux/dma-mapping.h> -+ -+#include "trusty-ffa.h" -+#include "trusty-private.h" -+ -+static const struct trusty_mem_ops trusty_ffa_mem_ops = { -+ .desc = &trusty_ffa_transport, -+}; -+ -+static const struct ffa_device_id trusty_ffa_device_id[] = { -+ /* -+ * Trusty UID: RFC-4122 compliant UUID version 4 -+ * 40ee25f0-a2bc-304c-8c4ca173c57d8af1 -+ */ -+ { UUID_INIT(0x40ee25f0, 0xa2bc, 0x304c, -+ 0x8c, 0x4c, 0xa1, 0x73, 0xc5, 0x7d, 0x8a, 0xf1) }, -+ {} -+}; -+ -+static int trusty_ffa_dev_match(struct device *dev, const void *uuid) -+{ -+ struct ffa_device *ffa_dev; -+ -+ ffa_dev = to_ffa_dev(dev); -+ if (uuid_equal(&ffa_dev->uuid, uuid)) -+ return 1; -+ -+ return 0; -+} -+ -+static struct ffa_device *trusty_ffa_dev_find(void) -+{ -+ const void *data; -+ struct device *dev; -+ -+ /* currently only one trusty instance is probed */ -+ data = &trusty_ffa_device_id[0].uuid; -+ -+ dev = bus_find_device(&ffa_bus_type, NULL, data, trusty_ffa_dev_match); -+ if (dev) { -+ /* drop reference count */ -+ put_device(dev); -+ return to_ffa_dev(dev); -+ } -+ -+ return NULL; -+} -+ -+static int trusty_ffa_link_supplier(struct device *c_dev, struct device *s_dev) -+{ -+ if (!c_dev || !s_dev) -+ return -EINVAL; -+ -+ if (!device_link_add(c_dev, s_dev, DL_FLAG_AUTOREMOVE_CONSUMER)) { -+ return -ENODEV; -+ } -+ -+ return 0; -+} -+ -+/* -+ * called from trusty probe -+ */ -+static int trusty_ffa_transport_setup(struct device *dev) -+{ -+ int rc; -+ struct trusty_state *s = platform_get_drvdata(to_platform_device(dev)); -+ struct trusty_ffa_state *ffa_state; -+ struct ffa_device *ffa_dev; -+ -+ /* ffa transport not required for lower api versions */ -+ if (s->api_version != 0 && s->api_version < TRUSTY_API_VERSION_MEM_OBJ) { -+ return -EINVAL; -+ } -+ -+ ffa_dev = trusty_ffa_dev_find(); -+ if (!ffa_dev) { -+ dev_dbg(dev, "FFA: Trusty device not found defer probe\n"); -+ return -EPROBE_DEFER; -+ } -+ -+ ffa_state = ffa_dev_get_drvdata(ffa_dev); -+ if (!ffa_state) -+ return -EINVAL; -+ -+ rc = trusty_ffa_link_supplier(dev, &ffa_dev->dev); -+ if (rc != 0) -+ return rc; -+ -+ /* FFA used only for memory sharing operations */ -+ if (s->api_version == TRUSTY_API_VERSION_MEM_OBJ) { -+ s->ffa = ffa_state; -+ s->mem_ops = &trusty_ffa_mem_ops; -+ return 0; -+ } -+ -+ return -EINVAL; -+} -+ -+static void trusty_ffa_transport_cleanup(struct device *dev) -+{ -+ struct trusty_state *s = platform_get_drvdata(to_platform_device(dev)); -+ -+ /* ffa transport not setup for lower api versions */ -+ if (s->api_version < TRUSTY_API_VERSION_MEM_OBJ) { -+ return; -+ } -+ -+ s->ffa = NULL; -+ s->mem_ops = NULL; -+} -+ -+static int trusty_ffa_probe(struct ffa_device *ffa_dev) -+{ -+ const struct ffa_dev_ops *ffa_ops; -+ struct trusty_ffa_state *s; -+ u32 ffa_drv_version; -+ -+ ffa_ops = ffa_dev_ops_get(ffa_dev); -+ if (!ffa_ops) { -+ dev_dbg(&ffa_dev->dev, "ffa_dev_ops_get: failed\n"); -+ return -ENOENT; -+ } -+ -+ /* check ffa driver version compatibility */ -+ ffa_drv_version = ffa_ops->api_version_get(); -+ if (TO_TRUSTY_FFA_MAJOR(ffa_drv_version) != TRUSTY_FFA_VERSION_MAJOR || -+ TO_TRUSTY_FFA_MINOR(ffa_drv_version) < TRUSTY_FFA_VERSION_MINOR) -+ return -EINVAL; -+ -+ s = kzalloc(sizeof(*s), GFP_KERNEL); -+ if (!s) -+ return -ENOMEM; -+ -+ s->dev = &ffa_dev->dev; -+ s->ops = ffa_ops; -+ mutex_init(&s->share_memory_msg_lock); -+ ffa_dev_set_drvdata(ffa_dev, s); -+ -+ ffa_ops->mode_32bit_set(ffa_dev); -+ -+ return 0; -+} -+ -+static void trusty_ffa_remove(struct ffa_device *ffa_dev) -+{ -+ struct trusty_ffa_state *s; -+ -+ s = ffa_dev_get_drvdata(ffa_dev); -+ -+ mutex_destroy(&s->share_memory_msg_lock); -+ memset(s, 0, sizeof(struct trusty_ffa_state)); -+ kfree(s); -+} -+ -+static struct ffa_driver trusty_ffa_driver = { -+ .name = "trusty-ffa", -+ .probe = trusty_ffa_probe, -+ .remove = trusty_ffa_remove, -+ .id_table = trusty_ffa_device_id, -+}; -+ -+static int __init trusty_ffa_transport_init(void) -+{ -+ if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)) { -+ return ffa_register(&trusty_ffa_driver); -+ } else -+ return -ENODEV; -+} -+ -+static void __exit trusty_ffa_transport_exit(void) -+{ -+ if (IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT)) -+ ffa_unregister(&trusty_ffa_driver); -+} -+ -+const struct trusty_transport_desc trusty_ffa_transport = { -+ .name = "ffa", -+ .setup = trusty_ffa_transport_setup, -+ .cleanup = trusty_ffa_transport_cleanup, -+}; -+ -+module_init(trusty_ffa_transport_init); -+module_exit(trusty_ffa_transport_exit); -diff --git a/drivers/trusty/trusty-ffa.h b/drivers/trusty/trusty-ffa.h -new file mode 100644 -index 000000000000..267ca2c5db29 ---- /dev/null -+++ b/drivers/trusty/trusty-ffa.h -@@ -0,0 +1,28 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+/* -+ * Copyright (C) 2022 ARM Ltd. -+ */ -+ -+#ifndef __LINUX_TRUSTY_FFA_H -+#define __LINUX_TRUSTY_FFA_H -+ -+#include <linux/types.h> -+#include <linux/uuid.h> -+#include <linux/arm_ffa.h> -+ -+#define TRUSTY_FFA_VERSION_MAJOR (1U) -+#define TRUSTY_FFA_VERSION_MINOR (0U) -+#define TRUSTY_FFA_VERSION_MAJOR_SHIFT (16U) -+#define TRUSTY_FFA_VERSION_MAJOR_MASK (0x7fffU) -+#define TRUSTY_FFA_VERSION_MINOR_SHIFT (0U) -+#define TRUSTY_FFA_VERSION_MINOR_MASK (0U) -+ -+#define TO_TRUSTY_FFA_MAJOR(v) \ -+ ((u16)((v >> TRUSTY_FFA_VERSION_MAJOR_SHIFT) & \ -+ TRUSTY_FFA_VERSION_MAJOR_MASK)) -+ -+#define TO_TRUSTY_FFA_MINOR(v) \ -+ ((u16)((v >> TRUSTY_FFA_VERSION_MINOR_SHIFT) & \ -+ TRUSTY_FFA_VERSION_MINOR_MASK)) -+ -+#endif /* __LINUX_TRUSTY_FFA_H */ -diff --git a/drivers/trusty/trusty-private.h b/drivers/trusty/trusty-private.h -index 74b88bb8f83b..2496f397e5d2 100644 ---- a/drivers/trusty/trusty-private.h -+++ b/drivers/trusty/trusty-private.h -@@ -73,5 +73,6 @@ int trusty_init_api_version(struct trusty_state *s, struct device *dev, - typedef const struct trusty_transport_desc *trusty_transports_t; - - extern const struct trusty_transport_desc trusty_smc_transport; -+extern const struct trusty_transport_desc trusty_ffa_transport; - - #endif /* _TRUSTY_PRIVATE_H */ -diff --git a/drivers/trusty/trusty.c b/drivers/trusty/trusty.c -index ec0fccfaa24c..4686b0d34f61 100644 ---- a/drivers/trusty/trusty.c -+++ b/drivers/trusty/trusty.c -@@ -509,6 +509,11 @@ trusty_transports_setup(const trusty_transports_t *transports, - return -EINVAL; - - ret = transport->setup(dev); -+ if (ret == -EPROBE_DEFER) { -+ dev_notice(dev, "transport %s: defer probe\n", -+ transport->name); -+ return ret; -+ } - transports_ret &= ret; - } - -@@ -672,6 +677,7 @@ static int trusty_remove(struct platform_device *pdev) - */ - static const trusty_transports_t trusty_transports[] = { - &trusty_smc_transport, -+ &trusty_ffa_transport, - NULL, - }; - --- -2.34.1 - |