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

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.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6880149e
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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
+19 −0
Original line number Diff line number Diff line
# 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.
+7 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0+
#
# Pvpanic Makefile
#
# Copyright (C) 2021 Oracle.
#
obj-$(CONFIG_PVPANIC_MMIO)	+= pvpanic.o pvpanic-mmio.o
+15 −42
Original line number Diff line number Diff line
// 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,
Loading