Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/acpi/hed.c
15109 views
1
/*
2
* ACPI Hardware Error Device (PNP0C33) Driver
3
*
4
* Copyright (C) 2010, Intel Corp.
5
* Author: Huang Ying <[email protected]>
6
*
7
* ACPI Hardware Error Device is used to report some hardware errors
8
* notified via SCI, mainly the corrected errors.
9
*
10
* This program is free software; you can redistribute it and/or
11
* modify it under the terms of the GNU General Public License version
12
* 2 as published by the Free Software Foundation;
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
*/
23
24
#include <linux/kernel.h>
25
#include <linux/module.h>
26
#include <linux/init.h>
27
#include <linux/acpi.h>
28
#include <acpi/acpi_bus.h>
29
#include <acpi/acpi_drivers.h>
30
#include <acpi/hed.h>
31
32
static struct acpi_device_id acpi_hed_ids[] = {
33
{"PNP0C33", 0},
34
{"", 0},
35
};
36
MODULE_DEVICE_TABLE(acpi, acpi_hed_ids);
37
38
static acpi_handle hed_handle;
39
40
static BLOCKING_NOTIFIER_HEAD(acpi_hed_notify_list);
41
42
int register_acpi_hed_notifier(struct notifier_block *nb)
43
{
44
return blocking_notifier_chain_register(&acpi_hed_notify_list, nb);
45
}
46
EXPORT_SYMBOL_GPL(register_acpi_hed_notifier);
47
48
void unregister_acpi_hed_notifier(struct notifier_block *nb)
49
{
50
blocking_notifier_chain_unregister(&acpi_hed_notify_list, nb);
51
}
52
EXPORT_SYMBOL_GPL(unregister_acpi_hed_notifier);
53
54
/*
55
* SCI to report hardware error is forwarded to the listeners of HED,
56
* it is used by HEST Generic Hardware Error Source with notify type
57
* SCI.
58
*/
59
static void acpi_hed_notify(struct acpi_device *device, u32 event)
60
{
61
blocking_notifier_call_chain(&acpi_hed_notify_list, 0, NULL);
62
}
63
64
static int __devinit acpi_hed_add(struct acpi_device *device)
65
{
66
/* Only one hardware error device */
67
if (hed_handle)
68
return -EINVAL;
69
hed_handle = device->handle;
70
return 0;
71
}
72
73
static int __devexit acpi_hed_remove(struct acpi_device *device, int type)
74
{
75
hed_handle = NULL;
76
return 0;
77
}
78
79
static struct acpi_driver acpi_hed_driver = {
80
.name = "hardware_error_device",
81
.class = "hardware_error",
82
.ids = acpi_hed_ids,
83
.ops = {
84
.add = acpi_hed_add,
85
.remove = acpi_hed_remove,
86
.notify = acpi_hed_notify,
87
},
88
};
89
90
static int __init acpi_hed_init(void)
91
{
92
if (acpi_disabled)
93
return -ENODEV;
94
95
if (acpi_bus_register_driver(&acpi_hed_driver) < 0)
96
return -ENODEV;
97
98
return 0;
99
}
100
101
static void __exit acpi_hed_exit(void)
102
{
103
acpi_bus_unregister_driver(&acpi_hed_driver);
104
}
105
106
module_init(acpi_hed_init);
107
module_exit(acpi_hed_exit);
108
109
ACPI_MODULE_NAME("hed");
110
MODULE_AUTHOR("Huang Ying");
111
MODULE_DESCRIPTION("ACPI Hardware Error Device Driver");
112
MODULE_LICENSE("GPL");
113
114