Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/acpi/hed.c
26278 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* ACPI Hardware Error Device (PNP0C33) Driver
4
*
5
* Copyright (C) 2010, Intel Corp.
6
* Author: Huang Ying <[email protected]>
7
*
8
* ACPI Hardware Error Device is used to report some hardware errors
9
* notified via SCI, mainly the corrected errors.
10
*/
11
12
#include <linux/kernel.h>
13
#include <linux/module.h>
14
#include <linux/init.h>
15
#include <linux/acpi.h>
16
#include <acpi/hed.h>
17
18
static const struct acpi_device_id acpi_hed_ids[] = {
19
{"PNP0C33", 0},
20
{"", 0},
21
};
22
MODULE_DEVICE_TABLE(acpi, acpi_hed_ids);
23
24
static acpi_handle hed_handle;
25
26
static BLOCKING_NOTIFIER_HEAD(acpi_hed_notify_list);
27
28
int register_acpi_hed_notifier(struct notifier_block *nb)
29
{
30
return blocking_notifier_chain_register(&acpi_hed_notify_list, nb);
31
}
32
EXPORT_SYMBOL_GPL(register_acpi_hed_notifier);
33
34
void unregister_acpi_hed_notifier(struct notifier_block *nb)
35
{
36
blocking_notifier_chain_unregister(&acpi_hed_notify_list, nb);
37
}
38
EXPORT_SYMBOL_GPL(unregister_acpi_hed_notifier);
39
40
/*
41
* SCI to report hardware error is forwarded to the listeners of HED,
42
* it is used by HEST Generic Hardware Error Source with notify type
43
* SCI.
44
*/
45
static void acpi_hed_notify(acpi_handle handle, u32 event, void *data)
46
{
47
blocking_notifier_call_chain(&acpi_hed_notify_list, 0, NULL);
48
}
49
50
static int acpi_hed_add(struct acpi_device *device)
51
{
52
int err;
53
54
/* Only one hardware error device */
55
if (hed_handle)
56
return -EINVAL;
57
hed_handle = device->handle;
58
59
err = acpi_dev_install_notify_handler(device, ACPI_DEVICE_NOTIFY,
60
acpi_hed_notify, device);
61
if (err)
62
hed_handle = NULL;
63
64
return err;
65
}
66
67
static void acpi_hed_remove(struct acpi_device *device)
68
{
69
acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
70
acpi_hed_notify);
71
hed_handle = NULL;
72
}
73
74
static struct acpi_driver acpi_hed_driver = {
75
.name = "hardware_error_device",
76
.class = "hardware_error",
77
.ids = acpi_hed_ids,
78
.ops = {
79
.add = acpi_hed_add,
80
.remove = acpi_hed_remove,
81
},
82
};
83
84
static int __init acpi_hed_driver_init(void)
85
{
86
return acpi_bus_register_driver(&acpi_hed_driver);
87
}
88
subsys_initcall(acpi_hed_driver_init);
89
90
MODULE_AUTHOR("Huang Ying");
91
MODULE_DESCRIPTION("ACPI Hardware Error Device Driver");
92
MODULE_LICENSE("GPL");
93
94