Commit 6861d27c authored by Mihai Carabas's avatar Mihai Carabas Committed by Greg Kroah-Hartman

misc/pvpanic: split-up generic and platform dependent code

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: default avatarMihai Carabas <mihai.carabas@oracle.com>
Link: https://lore.kernel.org/r/1616597356-20696-2-git-send-email-mihai.carabas@oracle.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6880149e
...@@ -427,14 +427,6 @@ config MISC_RTSX ...@@ -427,14 +427,6 @@ config MISC_RTSX
tristate tristate
default MISC_RTSX_PCI || MISC_RTSX_USB 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 config HISI_HIKEY_USB
tristate "USB GPIO Hub on HiSilicon Hikey 960/970 Platform" tristate "USB GPIO Hub on HiSilicon Hikey 960/970 Platform"
depends on (OF && GPIOLIB) || COMPILE_TEST depends on (OF && GPIOLIB) || COMPILE_TEST
...@@ -461,4 +453,5 @@ source "drivers/misc/bcm-vk/Kconfig" ...@@ -461,4 +453,5 @@ source "drivers/misc/bcm-vk/Kconfig"
source "drivers/misc/cardreader/Kconfig" source "drivers/misc/cardreader/Kconfig"
source "drivers/misc/habanalabs/Kconfig" source "drivers/misc/habanalabs/Kconfig"
source "drivers/misc/uacce/Kconfig" source "drivers/misc/uacce/Kconfig"
source "drivers/misc/pvpanic/Kconfig"
endmenu endmenu
...@@ -51,7 +51,7 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o ...@@ -51,7 +51,7 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o
obj-$(CONFIG_OCXL) += ocxl/ obj-$(CONFIG_OCXL) += ocxl/
obj-$(CONFIG_BCM_VK) += bcm-vk/ obj-$(CONFIG_BCM_VK) += bcm-vk/
obj-y += cardreader/ obj-y += cardreader/
obj-$(CONFIG_PVPANIC) += pvpanic.o obj-$(CONFIG_PVPANIC) += pvpanic/
obj-$(CONFIG_HABANA_AI) += habanalabs/ obj-$(CONFIG_HABANA_AI) += habanalabs/
obj-$(CONFIG_UACCE) += uacce/ obj-$(CONFIG_UACCE) += uacce/
obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o
......
# 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.
# SPDX-License-Identifier: GPL-2.0+
#
# Pvpanic Makefile
#
# Copyright (C) 2021 Oracle.
#
obj-$(CONFIG_PVPANIC_MMIO) += pvpanic.o pvpanic-mmio.o
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: GPL-2.0+
/* /*
* Pvpanic Device Support * Pvpanic MMIO Device Support
* *
* Copyright (C) 2013 Fujitsu. * Copyright (C) 2013 Fujitsu.
* Copyright (C) 2018 ZTE. * Copyright (C) 2018 ZTE.
* Copyright (C) 2021 Oracle.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/io.h> #include <linux/io.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kexec.h> #include <linux/kexec.h>
...@@ -18,6 +17,12 @@ ...@@ -18,6 +17,12 @@
#include <uapi/misc/pvpanic.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 void __iomem *base;
static unsigned int capability = PVPANIC_PANICKED | PVPANIC_CRASH_LOADED; static unsigned int capability = PVPANIC_PANICKED | PVPANIC_CRASH_LOADED;
static unsigned int events; static unsigned int events;
...@@ -49,47 +54,19 @@ static ssize_t events_store(struct device *dev, struct device_attribute *attr, ...@@ -49,47 +54,19 @@ static ssize_t events_store(struct device *dev, struct device_attribute *attr,
events = tmp; events = tmp;
pvpanic_set_events(events);
return count; return count;
} }
static DEVICE_ATTR_RW(events); static DEVICE_ATTR_RW(events);
static struct attribute *pvpanic_dev_attrs[] = { static struct attribute *pvpanic_mmio_dev_attrs[] = {
&dev_attr_capability.attr, &dev_attr_capability.attr,
&dev_attr_events.attr, &dev_attr_events.attr,
NULL NULL
}; };
ATTRIBUTE_GROUPS(pvpanic_dev); ATTRIBUTE_GROUPS(pvpanic_mmio_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 */
};
static int pvpanic_mmio_probe(struct platform_device *pdev) static int pvpanic_mmio_probe(struct platform_device *pdev)
{ {
...@@ -119,9 +96,7 @@ 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); capability &= ioread8(base);
events = capability; events = capability;
if (capability) pvpanic_probe(base, capability);
atomic_notifier_chain_register(&panic_notifier_list,
&pvpanic_panic_nb);
return 0; return 0;
} }
...@@ -129,9 +104,7 @@ static int pvpanic_mmio_probe(struct platform_device *pdev) ...@@ -129,9 +104,7 @@ static int pvpanic_mmio_probe(struct platform_device *pdev)
static int pvpanic_mmio_remove(struct platform_device *pdev) static int pvpanic_mmio_remove(struct platform_device *pdev)
{ {
if (capability) pvpanic_remove();
atomic_notifier_chain_unregister(&panic_notifier_list,
&pvpanic_panic_nb);
return 0; return 0;
} }
...@@ -153,7 +126,7 @@ static struct platform_driver pvpanic_mmio_driver = { ...@@ -153,7 +126,7 @@ static struct platform_driver pvpanic_mmio_driver = {
.name = "pvpanic-mmio", .name = "pvpanic-mmio",
.of_match_table = pvpanic_mmio_match, .of_match_table = pvpanic_mmio_match,
.acpi_match_table = pvpanic_device_ids, .acpi_match_table = pvpanic_device_ids,
.dev_groups = pvpanic_dev_groups, .dev_groups = pvpanic_mmio_dev_groups,
}, },
.probe = pvpanic_mmio_probe, .probe = pvpanic_mmio_probe,
.remove = pvpanic_mmio_remove, .remove = pvpanic_mmio_remove,
......
// 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);
// 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_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment