|  | /* Provides edac interface to mcelog events | 
|  | * | 
|  | * This file may be distributed under the terms of the | 
|  | * GNU General Public License version 2. | 
|  | * | 
|  | * Copyright (c) 2009 by: | 
|  | *	 Mauro Carvalho Chehab <mchehab@redhat.com> | 
|  | * | 
|  | * Red Hat Inc. http://www.redhat.com | 
|  | */ | 
|  |  | 
|  | #include <linux/module.h> | 
|  | #include <linux/edac_mce.h> | 
|  | #include <asm/mce.h> | 
|  |  | 
|  | int edac_mce_enabled; | 
|  | EXPORT_SYMBOL_GPL(edac_mce_enabled); | 
|  |  | 
|  |  | 
|  | /* | 
|  | * Extension interface | 
|  | */ | 
|  |  | 
|  | static LIST_HEAD(edac_mce_list); | 
|  | static DEFINE_MUTEX(edac_mce_lock); | 
|  |  | 
|  | int edac_mce_register(struct edac_mce *edac_mce) | 
|  | { | 
|  | mutex_lock(&edac_mce_lock); | 
|  | list_add_tail(&edac_mce->list, &edac_mce_list); | 
|  | mutex_unlock(&edac_mce_lock); | 
|  | return 0; | 
|  | } | 
|  | EXPORT_SYMBOL(edac_mce_register); | 
|  |  | 
|  | void edac_mce_unregister(struct edac_mce *edac_mce) | 
|  | { | 
|  | mutex_lock(&edac_mce_lock); | 
|  | list_del(&edac_mce->list); | 
|  | mutex_unlock(&edac_mce_lock); | 
|  | } | 
|  | EXPORT_SYMBOL(edac_mce_unregister); | 
|  |  | 
|  | int edac_mce_parse(struct mce *mce) | 
|  | { | 
|  | struct edac_mce *edac_mce; | 
|  |  | 
|  | list_for_each_entry(edac_mce, &edac_mce_list, list) { | 
|  | if (edac_mce->check_error(edac_mce->priv, mce)) | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | /* Nobody queued the error */ | 
|  | return 0; | 
|  | } | 
|  | EXPORT_SYMBOL_GPL(edac_mce_parse); | 
|  |  | 
|  | MODULE_LICENSE("GPL"); | 
|  | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>"); | 
|  | MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)"); | 
|  | MODULE_DESCRIPTION("EDAC Driver for mcelog captured errors"); |