clear-pkgs-linux-iot-lts2018/0914-Modify-Trusty-drivers-...

232 lines
6.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: weideng <wei.a.deng@intel.com>
Date: Tue, 28 Mar 2017 01:40:53 +0000
Subject: [PATCH] Modify Trusty drivers so as to compatible with Kernel 4.11
Cpu_hotplug_register/unregister APIs are removed from Kernel
4.11. Add this patch to fix these issues for kernel change.
Change-Id: I0ecafaff20128dd53f80fbdc357918ef69a36da7
Signed-off-by: weideng <wei.a.deng@intel.com>
---
drivers/trusty/trusty-ipc.c | 3 +-
drivers/trusty/trusty-irq.c | 96 +++++++++++++++++++---------------
drivers/trusty/trusty-virtio.c | 3 +-
3 files changed, 58 insertions(+), 44 deletions(-)
diff --git a/drivers/trusty/trusty-ipc.c b/drivers/trusty/trusty-ipc.c
index d6765f1..363b023 100644
--- a/drivers/trusty/trusty-ipc.c
+++ b/drivers/trusty/trusty-ipc.c
@@ -21,6 +21,7 @@
#include <linux/poll.h>
#include <linux/idr.h>
#include <linux/completion.h>
+#include <linux/sched/signal.h>
#include <linux/sched.h>
#include <linux/compat.h>
#include <linux/uio.h>
@@ -1549,7 +1550,7 @@ static int tipc_virtio_probe(struct virtio_device *vdev)
vds->cdev_name[sizeof(vds->cdev_name)-1] = '\0';
/* find tx virtqueues (rx and tx and in this order) */
- err = vdev->config->find_vqs(vdev, 2, vqs, vq_cbs, vq_names);
+ err = vdev->config->find_vqs(vdev, 2, vqs, vq_cbs, vq_names, NULL);
if (err)
goto err_find_vqs;
diff --git a/drivers/trusty/trusty-irq.c b/drivers/trusty/trusty-irq.c
index 6c510a6..363b302 100644
--- a/drivers/trusty/trusty-irq.c
+++ b/drivers/trusty/trusty-irq.c
@@ -59,10 +59,13 @@ struct trusty_irq_state {
spinlock_t normal_irqs_lock;
struct trusty_irq_irqset __percpu *percpu_irqs;
struct notifier_block trusty_call_notifier;
- struct notifier_block cpu_notifier;
+ /* CPU hotplug instances for online */
+ struct hlist_node node;
struct workqueue_struct *wq;
};
+static enum cpuhp_state trusty_irq_online;
+
#define TRUSTY_VMCALL_PENDING_INTR 0x74727505
static inline void set_pending_intr_to_lk(uint8_t vector)
{
@@ -252,49 +255,30 @@ irqreturn_t trusty_irq_handler(int irq, void *data)
return IRQ_HANDLED;
}
-static void trusty_irq_cpu_up(void *info)
+static int trusty_irq_cpu_up(unsigned int cpu, struct hlist_node *node)
{
unsigned long irq_flags;
- struct trusty_irq_state *is = info;
+ struct trusty_irq_state *is = hlist_entry_safe(node, struct trusty_irq_state, node);
dev_dbg(is->dev, "%s: cpu %d\n", __func__, smp_processor_id());
local_irq_save(irq_flags);
trusty_irq_enable_irqset(is, this_cpu_ptr(is->percpu_irqs));
local_irq_restore(irq_flags);
+ return 0;
}
-static void trusty_irq_cpu_down(void *info)
+static int trusty_irq_cpu_down(unsigned int cpu, struct hlist_node *node)
{
unsigned long irq_flags;
- struct trusty_irq_state *is = info;
+ struct trusty_irq_state *is = hlist_entry_safe(node, struct trusty_irq_state, node);
dev_dbg(is->dev, "%s: cpu %d\n", __func__, smp_processor_id());
local_irq_save(irq_flags);
trusty_irq_disable_irqset(is, this_cpu_ptr(is->percpu_irqs));
local_irq_restore(irq_flags);
-}
-
-static int trusty_irq_cpu_notify(struct notifier_block *nb,
- unsigned long action, void *hcpu)
-{
- struct trusty_irq_state *is;
-
- is = container_of(nb, struct trusty_irq_state, cpu_notifier);
-
- dev_dbg(is->dev, "%s: 0x%lx\n", __func__, action);
-
- switch (action & ~CPU_TASKS_FROZEN) {
- case CPU_UP_PREPARE:
- trusty_irq_cpu_up(is);
- break;
- case CPU_DEAD:
- trusty_irq_cpu_down(is);
- break;
- }
-
- return NOTIFY_OK;
+ return 0;
}
static int trusty_irq_create_irq_mapping(struct trusty_irq_state *is, int irq)
@@ -580,6 +564,20 @@ static void trusty_irq_free_irqs(struct trusty_irq_state *is)
} */
}
+static int trusty_irq_cpu_notif_add(struct trusty_irq_state *is)
+{
+ int ret;
+
+ ret = cpuhp_state_add_instance(trusty_irq_online, &is->node);
+
+ return ret;
+}
+
+static void trusty_irq_cpu_notif_remove(struct trusty_irq_state *is)
+{
+ cpuhp_state_remove_instance(trusty_irq_online, &is->node);
+}
+
static int trusty_irq_probe(struct platform_device *pdev)
{
int ret;
@@ -646,23 +644,14 @@ static int trusty_irq_probe(struct platform_device *pdev)
for (irq = 0; irq >= 0;)
irq = trusty_irq_init_one(is, irq, false);
- is->cpu_notifier.notifier_call = trusty_irq_cpu_notify;
- ret = register_hotcpu_notifier(&is->cpu_notifier);
+ ret = trusty_irq_cpu_notif_add(is);
if (ret) {
dev_err(&pdev->dev, "register_cpu_notifier failed %d\n", ret);
goto err_register_hotcpu_notifier;
}
- ret = on_each_cpu(trusty_irq_cpu_up, is, 0);
- if (ret) {
- dev_err(&pdev->dev, "register_cpu_notifier failed %d\n", ret);
- goto err_on_each_cpu;
- }
return 0;
-err_on_each_cpu:
- unregister_hotcpu_notifier(&is->cpu_notifier);
- on_each_cpu(trusty_irq_cpu_down, is, 1);
err_register_hotcpu_notifier:
spin_lock_irqsave(&is->normal_irqs_lock, irq_flags);
trusty_irq_disable_irqset(is, &is->normal_irqs);
@@ -692,17 +681,13 @@ static int trusty_irq_probe(struct platform_device *pdev)
static int trusty_irq_remove(struct platform_device *pdev)
{
- int ret;
unsigned int cpu;
unsigned long irq_flags;
struct trusty_irq_state *is = platform_get_drvdata(pdev);
dev_dbg(&pdev->dev, "%s\n", __func__);
- unregister_hotcpu_notifier(&is->cpu_notifier);
- ret = on_each_cpu(trusty_irq_cpu_down, is, 1);
- if (ret)
- dev_err(&pdev->dev, "on_each_cpu failed %d\n", ret);
+ trusty_irq_cpu_notif_remove(is);
spin_lock_irqsave(&is->normal_irqs_lock, irq_flags);
trusty_irq_disable_irqset(is, &is->normal_irqs);
spin_unlock_irqrestore(&is->normal_irqs_lock, irq_flags);
@@ -742,8 +727,35 @@ static struct platform_driver trusty_irq_driver = {
},
};
-module_platform_driver(trusty_irq_driver);
+static int __init trusty_irq_driver_init(void)
+{
+ int ret;
+
+ ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "x86/trustyirq:online",
+ trusty_irq_cpu_up, trusty_irq_cpu_down);
+ if (ret < 0)
+ goto out;
+ trusty_irq_online = ret;
+
+ ret = platform_driver_register(&trusty_irq_driver);
+ if (ret)
+ goto err_dead;
+
+ return 0;
+err_dead:
+ cpuhp_remove_multi_state(trusty_irq_online);
+out:
+ return ret;
+}
+
+static void __exit trusty_irq_driver_exit(void)
+{
+ cpuhp_remove_multi_state(trusty_irq_online);
+ platform_driver_unregister(&trusty_irq_driver);
+}
+module_init(trusty_irq_driver_init);
+module_exit(trusty_irq_driver_exit);
MODULE_LICENSE("GPL v2");
diff --git a/drivers/trusty/trusty-virtio.c b/drivers/trusty/trusty-virtio.c
index eaeb020..3d1a9aa 100644
--- a/drivers/trusty/trusty-virtio.c
+++ b/drivers/trusty/trusty-virtio.c
@@ -349,7 +349,8 @@ static struct virtqueue *_find_vq(struct virtio_device *vdev,
static int trusty_virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[],
vq_callback_t *callbacks[],
- const char * const names[])
+ const char * const names[],
+ struct irq_affinity *desc)
{
uint i;
int ret;
--
https://clearlinux.org