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
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
......@@ -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
......
# 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+
/*
* 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>
......@@ -18,6 +17,12 @@
#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,
......
// 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