]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
misc/pvpanic: split-up generic and platform dependent code
authorMihai Carabas <mihai.carabas@oracle.com>
Wed, 24 Mar 2021 14:49:14 +0000 (16:49 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 28 Mar 2021 12:56:13 +0000 (14:56 +0200)
Split-up generic and platform dependent code in order to be able to re-use
generic event handling code in pvpanic PCI device driver in the next patches.

The code from pvpanic.c was split in two new files:
- pvpanic.c: generic code that handles pvpanic events
- pvpanic-mmio.c: platform/bus dependent code

Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
Link: https://lore.kernel.org/r/1616597356-20696-2-git-send-email-mihai.carabas@oracle.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/pvpanic/Kconfig [new file with mode: 0644]
drivers/misc/pvpanic/Makefile [new file with mode: 0644]
drivers/misc/pvpanic/pvpanic-mmio.c [moved from drivers/misc/pvpanic.c with 72% similarity]
drivers/misc/pvpanic/pvpanic.c [new file with mode: 0644]
drivers/misc/pvpanic/pvpanic.h [new file with mode: 0644]

index f532c59bb59bca5f501fdfecde0d48242aafaf5f..c5f20e939ca30fbe1787f08c54226195513acf04 100644 (file)
@@ -427,14 +427,6 @@ config MISC_RTSX
        tristate
        default MISC_RTSX_PCI || MISC_RTSX_USB
 
-config PVPANIC
-       tristate "pvpanic device support"
-       depends on HAS_IOMEM && (ACPI || OF)
-       help
-         This driver provides support for the pvpanic device.  pvpanic is
-         a paravirtualized device provided by QEMU; it lets a virtual machine
-         (guest) communicate panic events to the host.
-
 config HISI_HIKEY_USB
        tristate "USB GPIO Hub on HiSilicon Hikey 960/970 Platform"
        depends on (OF && GPIOLIB) || COMPILE_TEST
@@ -461,4 +453,5 @@ source "drivers/misc/bcm-vk/Kconfig"
 source "drivers/misc/cardreader/Kconfig"
 source "drivers/misc/habanalabs/Kconfig"
 source "drivers/misc/uacce/Kconfig"
+source "drivers/misc/pvpanic/Kconfig"
 endmenu
index 99b6f15a3c707e2e3b02654a183146cf82b0b605..fd5f87e149c57c653e1de76677e88bb8e4137b9d 100644 (file)
@@ -51,7 +51,7 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST)       += pci_endpoint_test.o
 obj-$(CONFIG_OCXL)             += ocxl/
 obj-$(CONFIG_BCM_VK)           += bcm-vk/
 obj-y                          += cardreader/
-obj-$(CONFIG_PVPANIC)          += pvpanic.o
+obj-$(CONFIG_PVPANIC)          += pvpanic/
 obj-$(CONFIG_HABANA_AI)                += habanalabs/
 obj-$(CONFIG_UACCE)            += uacce/
 obj-$(CONFIG_XILINX_SDFEC)     += xilinx_sdfec.o
diff --git a/drivers/misc/pvpanic/Kconfig b/drivers/misc/pvpanic/Kconfig
new file mode 100644 (file)
index 0000000..454f1ee
--- /dev/null
@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Pvpanic Kconfig
+#
+# Copyright (C) 2021 Oracle.
+#
+
+config PVPANIC
+       bool "pvpanic device support"
+       help
+         This option allows to select a specific pvpanic device driver.
+         pvpanic is a paravirtualized device provided by QEMU; it lets
+         a virtual machine (guest) communicate panic events to the host.
+
+config PVPANIC_MMIO
+       tristate "pvpanic MMIO device support"
+       depends on HAS_IOMEM && (ACPI || OF) && PVPANIC
+       help
+         This driver provides support for the MMIO pvpanic device.
diff --git a/drivers/misc/pvpanic/Makefile b/drivers/misc/pvpanic/Makefile
new file mode 100644 (file)
index 0000000..e12a2dc
--- /dev/null
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Pvpanic Makefile
+#
+# Copyright (C) 2021 Oracle.
+#
+obj-$(CONFIG_PVPANIC_MMIO)     += pvpanic.o pvpanic-mmio.o
similarity index 72%
rename from drivers/misc/pvpanic.c
rename to drivers/misc/pvpanic/pvpanic-mmio.c
index f1655f5ca016dfd7f09b52885c3e6ebfa320e00f..d7bf7db6c19c392d38b02ea5072cb21964517893 100644 (file)
@@ -1,13 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- *  Pvpanic Device Support
+ *  Pvpanic MMIO Device Support
  *
  *  Copyright (C) 2013 Fujitsu.
  *  Copyright (C) 2018 ZTE.
+ *  Copyright (C) 2021 Oracle.
  */
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
 #include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/kexec.h>
 
 #include <uapi/misc/pvpanic.h>
 
+#include "pvpanic.h"
+
+MODULE_AUTHOR("Hu Tao <hutao@cn.fujitsu.com>");
+MODULE_DESCRIPTION("pvpanic-mmio device driver");
+MODULE_LICENSE("GPL");
+
 static void __iomem *base;
 static unsigned int capability = PVPANIC_PANICKED | PVPANIC_CRASH_LOADED;
 static unsigned int events;
@@ -49,47 +54,19 @@ static ssize_t events_store(struct device *dev,  struct device_attribute *attr,
 
        events = tmp;
 
+       pvpanic_set_events(events);
+
        return count;
 
 }
 static DEVICE_ATTR_RW(events);
 
-static struct attribute *pvpanic_dev_attrs[] = {
+static struct attribute *pvpanic_mmio_dev_attrs[] = {
        &dev_attr_capability.attr,
        &dev_attr_events.attr,
        NULL
 };
-ATTRIBUTE_GROUPS(pvpanic_dev);
-
-MODULE_AUTHOR("Hu Tao <hutao@cn.fujitsu.com>");
-MODULE_DESCRIPTION("pvpanic device driver");
-MODULE_LICENSE("GPL");
-
-static void
-pvpanic_send_event(unsigned int event)
-{
-       if (event & capability & events)
-               iowrite8(event, base);
-}
-
-static int
-pvpanic_panic_notify(struct notifier_block *nb, unsigned long code,
-                    void *unused)
-{
-       unsigned int event = PVPANIC_PANICKED;
-
-       if (kexec_crash_loaded())
-               event = PVPANIC_CRASH_LOADED;
-
-       pvpanic_send_event(event);
-
-       return NOTIFY_DONE;
-}
-
-static struct notifier_block pvpanic_panic_nb = {
-       .notifier_call = pvpanic_panic_notify,
-       .priority = 1, /* let this called before broken drm_fb_helper */
-};
+ATTRIBUTE_GROUPS(pvpanic_mmio_dev);
 
 static int pvpanic_mmio_probe(struct platform_device *pdev)
 {
@@ -119,9 +96,7 @@ static int pvpanic_mmio_probe(struct platform_device *pdev)
        capability &= ioread8(base);
        events = capability;
 
-       if (capability)
-               atomic_notifier_chain_register(&panic_notifier_list,
-                                              &pvpanic_panic_nb);
+       pvpanic_probe(base, capability);
 
        return 0;
 }
@@ -129,9 +104,7 @@ static int pvpanic_mmio_probe(struct platform_device *pdev)
 static int pvpanic_mmio_remove(struct platform_device *pdev)
 {
 
-       if (capability)
-               atomic_notifier_chain_unregister(&panic_notifier_list,
-                                                &pvpanic_panic_nb);
+       pvpanic_remove();
 
        return 0;
 }
@@ -153,7 +126,7 @@ static struct platform_driver pvpanic_mmio_driver = {
                .name = "pvpanic-mmio",
                .of_match_table = pvpanic_mmio_match,
                .acpi_match_table = pvpanic_device_ids,
-               .dev_groups = pvpanic_dev_groups,
+               .dev_groups = pvpanic_mmio_dev_groups,
        },
        .probe = pvpanic_mmio_probe,
        .remove = pvpanic_mmio_remove,
diff --git a/drivers/misc/pvpanic/pvpanic.c b/drivers/misc/pvpanic/pvpanic.c
new file mode 100644 (file)
index 0000000..a9605f9
--- /dev/null
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Pvpanic Device Support
+ *
+ *  Copyright (C) 2013 Fujitsu.
+ *  Copyright (C) 2018 ZTE.
+ *  Copyright (C) 2021 Oracle.
+ */
+
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/kexec.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+
+#include <uapi/misc/pvpanic.h>
+
+#include "pvpanic.h"
+
+MODULE_AUTHOR("Mihai Carabas <mihai.carabas@oracle.com>");
+MODULE_DESCRIPTION("pvpanic device driver ");
+MODULE_LICENSE("GPL");
+
+static void __iomem *base;
+static unsigned int capability;
+static unsigned int events;
+
+static void
+pvpanic_send_event(unsigned int event)
+{
+       if (event & capability & events)
+               iowrite8(event, base);
+}
+
+static int
+pvpanic_panic_notify(struct notifier_block *nb, unsigned long code,
+                    void *unused)
+{
+       unsigned int event = PVPANIC_PANICKED;
+
+       if (kexec_crash_loaded())
+               event = PVPANIC_CRASH_LOADED;
+
+       pvpanic_send_event(event);
+
+       return NOTIFY_DONE;
+}
+
+static struct notifier_block pvpanic_panic_nb = {
+       .notifier_call = pvpanic_panic_notify,
+       .priority = 1, /* let this called before broken drm_fb_helper */
+};
+
+void pvpanic_probe(void __iomem *pbase, unsigned int dev_cap)
+{
+       base = pbase;
+       capability = dev_cap;
+       events = capability;
+
+       if (capability)
+               atomic_notifier_chain_register(&panic_notifier_list,
+                                              &pvpanic_panic_nb);
+}
+EXPORT_SYMBOL_GPL(pvpanic_probe);
+
+void pvpanic_remove(void)
+{
+       if (capability)
+               atomic_notifier_chain_unregister(&panic_notifier_list,
+                                                &pvpanic_panic_nb);
+       base = NULL;
+}
+EXPORT_SYMBOL_GPL(pvpanic_remove);
+
+void pvpanic_set_events(unsigned int dev_events)
+{
+       events = dev_events;
+}
+EXPORT_SYMBOL_GPL(pvpanic_set_events);
diff --git a/drivers/misc/pvpanic/pvpanic.h b/drivers/misc/pvpanic/pvpanic.h
new file mode 100644 (file)
index 0000000..3abe15f
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  Pvpanic Device Support
+ *
+ *  Copyright (C) 2021 Oracle.
+ */
+
+#ifndef PVPANIC_H_
+#define PVPANIC_H_
+
+void pvpanic_probe(void __iomem *base, unsigned int dev_cap);
+void pvpanic_remove(void);
+void pvpanic_set_events(unsigned int dev_events);
+
+#endif /* PVPANIC_H_ */