lkml.org 
[lkml]   [2021]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 1/3] misc/pvpanic: split-up generic and platform dependent code
    Date
    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>
    ---
    drivers/misc/Kconfig | 9 +-
    drivers/misc/Makefile | 2 +-
    drivers/misc/pvpanic.c | 161 ------------------------------------
    drivers/misc/pvpanic/Kconfig | 19 +++++
    drivers/misc/pvpanic/Makefile | 7 ++
    drivers/misc/pvpanic/pvpanic-mmio.c | 134 ++++++++++++++++++++++++++++++
    drivers/misc/pvpanic/pvpanic.c | 81 ++++++++++++++++++
    drivers/misc/pvpanic/pvpanic.h | 15 ++++
    8 files changed, 258 insertions(+), 170 deletions(-)
    delete mode 100644 drivers/misc/pvpanic.c
    create mode 100644 drivers/misc/pvpanic/Kconfig
    create mode 100644 drivers/misc/pvpanic/Makefile
    create mode 100644 drivers/misc/pvpanic/pvpanic-mmio.c
    create mode 100644 drivers/misc/pvpanic/pvpanic.c
    create mode 100644 drivers/misc/pvpanic/pvpanic.h

    diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
    index f532c59..c5f20e9 100644
    --- a/drivers/misc/Kconfig
    +++ b/drivers/misc/Kconfig
    @@ -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
    diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
    index 99b6f15..fd5f87e 100644
    --- a/drivers/misc/Makefile
    +++ b/drivers/misc/Makefile
    @@ -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.c b/drivers/misc/pvpanic.c
    deleted file mode 100644
    index f1655f5..00000000
    --- a/drivers/misc/pvpanic.c
    +++ /dev/null
    @@ -1,161 +0,0 @@
    -// SPDX-License-Identifier: GPL-2.0+
    -/*
    - * Pvpanic Device Support
    - *
    - * Copyright (C) 2013 Fujitsu.
    - * Copyright (C) 2018 ZTE.
    - */
    -
    -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
    -
    -#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>
    -
    -static void __iomem *base;
    -static unsigned int capability = PVPANIC_PANICKED | PVPANIC_CRASH_LOADED;
    -static unsigned int events;
    -
    -static ssize_t capability_show(struct device *dev,
    - struct device_attribute *attr, char *buf)
    -{
    - return sysfs_emit(buf, "%x\n", capability);
    -}
    -static DEVICE_ATTR_RO(capability);
    -
    -static ssize_t events_show(struct device *dev, struct device_attribute *attr, char *buf)
    -{
    - return sysfs_emit(buf, "%x\n", events);
    -}
    -
    -static ssize_t events_store(struct device *dev, struct device_attribute *attr,
    - const char *buf, size_t count)
    -{
    - unsigned int tmp;
    - int err;
    -
    - err = kstrtouint(buf, 16, &tmp);
    - if (err)
    - return err;
    -
    - if ((tmp & capability) != tmp)
    - return -EINVAL;
    -
    - events = tmp;
    -
    - return count;
    -
    -}
    -static DEVICE_ATTR_RW(events);
    -
    -static struct attribute *pvpanic_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 */
    -};
    -
    -static int pvpanic_mmio_probe(struct platform_device *pdev)
    -{
    - struct device *dev = &pdev->dev;
    - struct resource *res;
    -
    - res = platform_get_mem_or_io(pdev, 0);
    - if (!res)
    - return -EINVAL;
    -
    - switch (resource_type(res)) {
    - case IORESOURCE_IO:
    - base = devm_ioport_map(dev, res->start, resource_size(res));
    - if (!base)
    - return -ENOMEM;
    - break;
    - case IORESOURCE_MEM:
    - base = devm_ioremap_resource(dev, res);
    - if (IS_ERR(base))
    - return PTR_ERR(base);
    - break;
    - default:
    - return -EINVAL;
    - }
    -
    - /* initlize capability by RDPT */
    - capability &= ioread8(base);
    - events = capability;
    -
    - if (capability)
    - atomic_notifier_chain_register(&panic_notifier_list,
    - &pvpanic_panic_nb);
    -
    - return 0;
    -}
    -
    -static int pvpanic_mmio_remove(struct platform_device *pdev)
    -{
    -
    - if (capability)
    - atomic_notifier_chain_unregister(&panic_notifier_list,
    - &pvpanic_panic_nb);
    -
    - return 0;
    -}
    -
    -static const struct of_device_id pvpanic_mmio_match[] = {
    - { .compatible = "qemu,pvpanic-mmio", },
    - {}
    -};
    -MODULE_DEVICE_TABLE(of, pvpanic_mmio_match);
    -
    -static const struct acpi_device_id pvpanic_device_ids[] = {
    - { "QEMU0001", 0 },
    - { "", 0 }
    -};
    -MODULE_DEVICE_TABLE(acpi, pvpanic_device_ids);
    -
    -static struct platform_driver pvpanic_mmio_driver = {
    - .driver = {
    - .name = "pvpanic-mmio",
    - .of_match_table = pvpanic_mmio_match,
    - .acpi_match_table = pvpanic_device_ids,
    - .dev_groups = pvpanic_dev_groups,
    - },
    - .probe = pvpanic_mmio_probe,
    - .remove = pvpanic_mmio_remove,
    -};
    -module_platform_driver(pvpanic_mmio_driver);
    diff --git a/drivers/misc/pvpanic/Kconfig b/drivers/misc/pvpanic/Kconfig
    new file mode 100644
    index 00000000..454f1ee
    --- /dev/null
    +++ b/drivers/misc/pvpanic/Kconfig
    @@ -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
    index 00000000..e12a2dc
    --- /dev/null
    +++ b/drivers/misc/pvpanic/Makefile
    @@ -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
    diff --git a/drivers/misc/pvpanic/pvpanic-mmio.c b/drivers/misc/pvpanic/pvpanic-mmio.c
    new file mode 100644
    index 00000000..d7bf7db
    --- /dev/null
    +++ b/drivers/misc/pvpanic/pvpanic-mmio.c
    @@ -0,0 +1,134 @@
    +// SPDX-License-Identifier: GPL-2.0+
    +/*
    + * Pvpanic MMIO 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("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;
    +
    +static ssize_t capability_show(struct device *dev,
    + struct device_attribute *attr, char *buf)
    +{
    + return sysfs_emit(buf, "%x\n", capability);
    +}
    +static DEVICE_ATTR_RO(capability);
    +
    +static ssize_t events_show(struct device *dev, struct device_attribute *attr, char *buf)
    +{
    + return sysfs_emit(buf, "%x\n", events);
    +}
    +
    +static ssize_t events_store(struct device *dev, struct device_attribute *attr,
    + const char *buf, size_t count)
    +{
    + unsigned int tmp;
    + int err;
    +
    + err = kstrtouint(buf, 16, &tmp);
    + if (err)
    + return err;
    +
    + if ((tmp & capability) != tmp)
    + return -EINVAL;
    +
    + events = tmp;
    +
    + pvpanic_set_events(events);
    +
    + return count;
    +
    +}
    +static DEVICE_ATTR_RW(events);
    +
    +static struct attribute *pvpanic_mmio_dev_attrs[] = {
    + &dev_attr_capability.attr,
    + &dev_attr_events.attr,
    + NULL
    +};
    +ATTRIBUTE_GROUPS(pvpanic_mmio_dev);
    +
    +static int pvpanic_mmio_probe(struct platform_device *pdev)
    +{
    + struct device *dev = &pdev->dev;
    + struct resource *res;
    +
    + res = platform_get_mem_or_io(pdev, 0);
    + if (!res)
    + return -EINVAL;
    +
    + switch (resource_type(res)) {
    + case IORESOURCE_IO:
    + base = devm_ioport_map(dev, res->start, resource_size(res));
    + if (!base)
    + return -ENOMEM;
    + break;
    + case IORESOURCE_MEM:
    + base = devm_ioremap_resource(dev, res);
    + if (IS_ERR(base))
    + return PTR_ERR(base);
    + break;
    + default:
    + return -EINVAL;
    + }
    +
    + /* initlize capability by RDPT */
    + capability &= ioread8(base);
    + events = capability;
    +
    + pvpanic_probe(base, capability);
    +
    + return 0;
    +}
    +
    +static int pvpanic_mmio_remove(struct platform_device *pdev)
    +{
    +
    + pvpanic_remove();
    +
    + return 0;
    +}
    +
    +static const struct of_device_id pvpanic_mmio_match[] = {
    + { .compatible = "qemu,pvpanic-mmio", },
    + {}
    +};
    +MODULE_DEVICE_TABLE(of, pvpanic_mmio_match);
    +
    +static const struct acpi_device_id pvpanic_device_ids[] = {
    + { "QEMU0001", 0 },
    + { "", 0 }
    +};
    +MODULE_DEVICE_TABLE(acpi, pvpanic_device_ids);
    +
    +static struct platform_driver pvpanic_mmio_driver = {
    + .driver = {
    + .name = "pvpanic-mmio",
    + .of_match_table = pvpanic_mmio_match,
    + .acpi_match_table = pvpanic_device_ids,
    + .dev_groups = pvpanic_mmio_dev_groups,
    + },
    + .probe = pvpanic_mmio_probe,
    + .remove = pvpanic_mmio_remove,
    +};
    +module_platform_driver(pvpanic_mmio_driver);
    diff --git a/drivers/misc/pvpanic/pvpanic.c b/drivers/misc/pvpanic/pvpanic.c
    new file mode 100644
    index 00000000..a9605f9
    --- /dev/null
    +++ b/drivers/misc/pvpanic/pvpanic.c
    @@ -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
    index 00000000..3abe15f
    --- /dev/null
    +++ b/drivers/misc/pvpanic/pvpanic.h
    @@ -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_ */
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2021-03-24 16:38    [W:2.714 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site