Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
 1/*
 2 * common EDAC components that must be in kernel
 3 *
 4 * Author: Dave Jiang <djiang@mvista.com>
 5 *
 6 * 2007 (c) MontaVista Software, Inc.
 7 * 2010 (c) Advanced Micro Devices Inc.
 8 *	    Borislav Petkov <borislav.petkov@amd.com>
 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 <linux/atomic.h>
18#include <linux/device.h>
19#include <asm/edac.h>
20
21int edac_op_state = EDAC_OPSTATE_INVAL;
22EXPORT_SYMBOL_GPL(edac_op_state);
23
24atomic_t edac_handlers = ATOMIC_INIT(0);
25EXPORT_SYMBOL_GPL(edac_handlers);
26
27int edac_err_assert = 0;
28EXPORT_SYMBOL_GPL(edac_err_assert);
29
30static atomic_t edac_subsys_valid = ATOMIC_INIT(0);
31
32/*
33 * called to determine if there is an EDAC driver interested in
34 * knowing an event (such as NMI) occurred
35 */
36int edac_handler_set(void)
37{
38	if (edac_op_state == EDAC_OPSTATE_POLL)
39		return 0;
40
41	return atomic_read(&edac_handlers);
42}
43EXPORT_SYMBOL_GPL(edac_handler_set);
44
45/*
46 * handler for NMI type of interrupts to assert error
47 */
48void edac_atomic_assert_error(void)
49{
50	edac_err_assert++;
51}
52EXPORT_SYMBOL_GPL(edac_atomic_assert_error);
53
54/*
55 * sysfs object: /sys/devices/system/edac
56 *	need to export to other files
57 */
58struct bus_type edac_subsys = {
59	.name = "edac",
60	.dev_name = "edac",
61};
62EXPORT_SYMBOL_GPL(edac_subsys);
63
64/* return pointer to the 'edac' node in sysfs */
65struct bus_type *edac_get_sysfs_subsys(void)
66{
67	int err = 0;
68
69	if (atomic_read(&edac_subsys_valid))
70		goto out;
71
72	/* create the /sys/devices/system/edac directory */
73	err = subsys_system_register(&edac_subsys, NULL);
74	if (err) {
75		printk(KERN_ERR "Error registering toplevel EDAC sysfs dir\n");
76		return NULL;
77	}
78
79out:
80	atomic_inc(&edac_subsys_valid);
81	return &edac_subsys;
82}
83EXPORT_SYMBOL_GPL(edac_get_sysfs_subsys);
84
85void edac_put_sysfs_subsys(void)
86{
87	/* last user unregisters it */
88	if (atomic_dec_and_test(&edac_subsys_valid))
89		bus_unregister(&edac_subsys);
90}
91EXPORT_SYMBOL_GPL(edac_put_sysfs_subsys);