Linux Audio

Check our new training course

Loading...
v6.8
 1// SPDX-License-Identifier: GPL-2.0+
 2/*
 3 *  Pvpanic PCI Device Support
 4 *
 5 *  Copyright (C) 2021 Oracle.
 6 */
 7
 8#include <linux/errno.h>
 9#include <linux/module.h>
10#include <linux/pci.h>
11#include <linux/types.h>
 
 
 
12
13#include "pvpanic.h"
14
 
15#define PCI_DEVICE_ID_REDHAT_PVPANIC     0x0011
16
17MODULE_AUTHOR("Mihai Carabas <mihai.carabas@oracle.com>");
18MODULE_DESCRIPTION("pvpanic device driver");
19MODULE_LICENSE("GPL");
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21static int pvpanic_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
22{
 
23	void __iomem *base;
24	int ret;
25
26	ret = pcim_enable_device(pdev);
27	if (ret < 0)
28		return ret;
29
30	base = pcim_iomap(pdev, 0, 0);
31	if (!base)
32		return -ENOMEM;
33
34	return devm_pvpanic_probe(&pdev->dev, base);
 
 
 
 
 
 
 
 
 
 
 
35}
36
37static const struct pci_device_id pvpanic_pci_id_tbl[]  = {
38	{ PCI_DEVICE(PCI_VENDOR_ID_REDHAT, PCI_DEVICE_ID_REDHAT_PVPANIC)},
39	{}
40};
41MODULE_DEVICE_TABLE(pci, pvpanic_pci_id_tbl);
42
43static struct pci_driver pvpanic_pci_driver = {
44	.name =         "pvpanic-pci",
45	.id_table =     pvpanic_pci_id_tbl,
46	.probe =        pvpanic_pci_probe,
47	.driver = {
48		.dev_groups = pvpanic_dev_groups,
49	},
50};
51module_pci_driver(pvpanic_pci_driver);
v6.2
  1// SPDX-License-Identifier: GPL-2.0+
  2/*
  3 *  Pvpanic PCI Device Support
  4 *
  5 *  Copyright (C) 2021 Oracle.
  6 */
  7
  8#include <linux/kernel.h>
  9#include <linux/module.h>
 10#include <linux/pci.h>
 11#include <linux/types.h>
 12#include <linux/slab.h>
 13
 14#include <uapi/misc/pvpanic.h>
 15
 16#include "pvpanic.h"
 17
 18#define PCI_VENDOR_ID_REDHAT             0x1b36
 19#define PCI_DEVICE_ID_REDHAT_PVPANIC     0x0011
 20
 21MODULE_AUTHOR("Mihai Carabas <mihai.carabas@oracle.com>");
 22MODULE_DESCRIPTION("pvpanic device driver");
 23MODULE_LICENSE("GPL");
 24
 25static ssize_t capability_show(struct device *dev, struct device_attribute *attr, char *buf)
 26{
 27	struct pvpanic_instance *pi = dev_get_drvdata(dev);
 28
 29	return sysfs_emit(buf, "%x\n", pi->capability);
 30}
 31static DEVICE_ATTR_RO(capability);
 32
 33static ssize_t events_show(struct device *dev, struct device_attribute *attr, char *buf)
 34{
 35	struct pvpanic_instance *pi = dev_get_drvdata(dev);
 36
 37	return sysfs_emit(buf, "%x\n", pi->events);
 38}
 39
 40static ssize_t events_store(struct device *dev, struct device_attribute *attr,
 41			    const char *buf, size_t count)
 42{
 43	struct pvpanic_instance *pi = dev_get_drvdata(dev);
 44	unsigned int tmp;
 45	int err;
 46
 47	err = kstrtouint(buf, 16, &tmp);
 48	if (err)
 49		return err;
 50
 51	if ((tmp & pi->capability) != tmp)
 52		return -EINVAL;
 53
 54	pi->events = tmp;
 55
 56	return count;
 57}
 58static DEVICE_ATTR_RW(events);
 59
 60static struct attribute *pvpanic_pci_dev_attrs[] = {
 61	&dev_attr_capability.attr,
 62	&dev_attr_events.attr,
 63	NULL
 64};
 65ATTRIBUTE_GROUPS(pvpanic_pci_dev);
 66
 67static int pvpanic_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 68{
 69	struct pvpanic_instance *pi;
 70	void __iomem *base;
 71	int ret;
 72
 73	ret = pcim_enable_device(pdev);
 74	if (ret < 0)
 75		return ret;
 76
 77	base = pcim_iomap(pdev, 0, 0);
 78	if (!base)
 79		return -ENOMEM;
 80
 81	pi = devm_kmalloc(&pdev->dev, sizeof(*pi), GFP_KERNEL);
 82	if (!pi)
 83		return -ENOMEM;
 84
 85	pi->base = base;
 86	pi->capability = PVPANIC_PANICKED | PVPANIC_CRASH_LOADED;
 87
 88	/* initlize capability by RDPT */
 89	pi->capability &= ioread8(base);
 90	pi->events = pi->capability;
 91
 92	return devm_pvpanic_probe(&pdev->dev, pi);
 93}
 94
 95static const struct pci_device_id pvpanic_pci_id_tbl[]  = {
 96	{ PCI_DEVICE(PCI_VENDOR_ID_REDHAT, PCI_DEVICE_ID_REDHAT_PVPANIC)},
 97	{}
 98};
 99MODULE_DEVICE_TABLE(pci, pvpanic_pci_id_tbl);
100
101static struct pci_driver pvpanic_pci_driver = {
102	.name =         "pvpanic-pci",
103	.id_table =     pvpanic_pci_id_tbl,
104	.probe =        pvpanic_pci_probe,
105	.driver = {
106		.dev_groups = pvpanic_pci_dev_groups,
107	},
108};
109module_pci_driver(pvpanic_pci_driver);