Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/edac/edac_stub.c
15109 views
1
/*
2
* common EDAC components that must be in kernel
3
*
4
* Author: Dave Jiang <[email protected]>
5
*
6
* 2007 (c) MontaVista Software, Inc.
7
* 2010 (c) Advanced Micro Devices Inc.
8
* Borislav Petkov <[email protected]>
9
*
10
* This file is licensed under the terms of the GNU General Public
11
* License version 2. This program is licensed "as is" without any
12
* warranty of any kind, whether express or implied.
13
*
14
*/
15
#include <linux/module.h>
16
#include <linux/edac.h>
17
#include <asm/atomic.h>
18
#include <asm/edac.h>
19
20
int edac_op_state = EDAC_OPSTATE_INVAL;
21
EXPORT_SYMBOL_GPL(edac_op_state);
22
23
atomic_t edac_handlers = ATOMIC_INIT(0);
24
EXPORT_SYMBOL_GPL(edac_handlers);
25
26
int edac_err_assert = 0;
27
EXPORT_SYMBOL_GPL(edac_err_assert);
28
29
static atomic_t edac_class_valid = ATOMIC_INIT(0);
30
31
/*
32
* called to determine if there is an EDAC driver interested in
33
* knowing an event (such as NMI) occurred
34
*/
35
int edac_handler_set(void)
36
{
37
if (edac_op_state == EDAC_OPSTATE_POLL)
38
return 0;
39
40
return atomic_read(&edac_handlers);
41
}
42
EXPORT_SYMBOL_GPL(edac_handler_set);
43
44
/*
45
* handler for NMI type of interrupts to assert error
46
*/
47
void edac_atomic_assert_error(void)
48
{
49
edac_err_assert++;
50
}
51
EXPORT_SYMBOL_GPL(edac_atomic_assert_error);
52
53
/*
54
* sysfs object: /sys/devices/system/edac
55
* need to export to other files
56
*/
57
struct sysdev_class edac_class = {
58
.name = "edac",
59
};
60
EXPORT_SYMBOL_GPL(edac_class);
61
62
/* return pointer to the 'edac' node in sysfs */
63
struct sysdev_class *edac_get_sysfs_class(void)
64
{
65
int err = 0;
66
67
if (atomic_read(&edac_class_valid))
68
goto out;
69
70
/* create the /sys/devices/system/edac directory */
71
err = sysdev_class_register(&edac_class);
72
if (err) {
73
printk(KERN_ERR "Error registering toplevel EDAC sysfs dir\n");
74
return NULL;
75
}
76
77
out:
78
atomic_inc(&edac_class_valid);
79
return &edac_class;
80
}
81
EXPORT_SYMBOL_GPL(edac_get_sysfs_class);
82
83
void edac_put_sysfs_class(void)
84
{
85
/* last user unregisters it */
86
if (atomic_dec_and_test(&edac_class_valid))
87
sysdev_class_unregister(&edac_class);
88
}
89
EXPORT_SYMBOL_GPL(edac_put_sysfs_class);
90
91