2007-05-23 21:16:46 +04:00
/*
* Sysfs entries for PCI Error Recovery for PAPR - compliant platform .
* Copyright IBM Corporation 2007
* Copyright Linas Vepstas < linas @ austin . ibm . com > 2007
*
* All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or ( at
* your option ) any later version .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE , GOOD TITLE or
* NON INFRINGEMENT . See the GNU General Public License for more
* details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
* Send comments and feedback to Linas Vepstas < linas @ austin . ibm . com >
*/
# include <linux/pci.h>
2011-05-27 21:27:45 +04:00
# include <linux/stat.h>
2007-05-23 21:16:46 +04:00
# include <asm/ppc-pci.h>
# include <asm/pci-bridge.h>
/**
2012-02-28 00:04:02 +04:00
* EEH_SHOW_ATTR - - Create sysfs entry for eeh statistic
2007-05-23 21:16:46 +04:00
* @ _name : name of file in sysfs directory
* @ _memb : name of member in struct pci_dn to access
* @ _format : printf format for display
*
* All of the attributes look very similar , so just
* auto - gen a cut - n - paste routine to display them .
*/
# define EEH_SHOW_ATTR(_name,_memb,_format) \
static ssize_t eeh_show_ # # _name ( struct device * dev , \
struct device_attribute * attr , char * buf ) \
{ \
struct pci_dev * pdev = to_pci_dev ( dev ) ; \
2012-02-28 00:04:05 +04:00
struct eeh_dev * edev = pci_dev_to_eeh_dev ( pdev ) ; \
2007-05-23 21:16:46 +04:00
\
2012-02-28 00:04:05 +04:00
if ( ! edev ) \
return 0 ; \
2007-05-23 21:16:46 +04:00
\
2012-02-28 00:04:05 +04:00
return sprintf ( buf , _format " \n " , edev - > _memb ) ; \
2007-05-23 21:16:46 +04:00
} \
static DEVICE_ATTR ( _name , S_IRUGO , eeh_show_ # # _name , NULL ) ;
2012-02-28 00:04:05 +04:00
EEH_SHOW_ATTR ( eeh_mode , mode , " 0x%x " ) ;
EEH_SHOW_ATTR ( eeh_config_addr , config_addr , " 0x%x " ) ;
EEH_SHOW_ATTR ( eeh_pe_config_addr , pe_config_addr , " 0x%x " ) ;
EEH_SHOW_ATTR ( eeh_check_count , check_count , " %d " ) ;
EEH_SHOW_ATTR ( eeh_freeze_count , freeze_count , " %d " ) ;
EEH_SHOW_ATTR ( eeh_false_positives , false_positives , " %d " ) ;
2007-05-23 21:16:46 +04:00
void eeh_sysfs_add_device ( struct pci_dev * pdev )
{
int rc = 0 ;
rc + = device_create_file ( & pdev - > dev , & dev_attr_eeh_mode ) ;
rc + = device_create_file ( & pdev - > dev , & dev_attr_eeh_config_addr ) ;
rc + = device_create_file ( & pdev - > dev , & dev_attr_eeh_pe_config_addr ) ;
rc + = device_create_file ( & pdev - > dev , & dev_attr_eeh_check_count ) ;
2007-05-23 21:20:51 +04:00
rc + = device_create_file ( & pdev - > dev , & dev_attr_eeh_false_positives ) ;
2007-05-23 21:16:46 +04:00
rc + = device_create_file ( & pdev - > dev , & dev_attr_eeh_freeze_count ) ;
if ( rc )
printk ( KERN_WARNING " EEH: Unable to create sysfs entries \n " ) ;
}
void eeh_sysfs_remove_device ( struct pci_dev * pdev )
{
device_remove_file ( & pdev - > dev , & dev_attr_eeh_mode ) ;
device_remove_file ( & pdev - > dev , & dev_attr_eeh_config_addr ) ;
device_remove_file ( & pdev - > dev , & dev_attr_eeh_pe_config_addr ) ;
device_remove_file ( & pdev - > dev , & dev_attr_eeh_check_count ) ;
2007-05-23 21:20:51 +04:00
device_remove_file ( & pdev - > dev , & dev_attr_eeh_false_positives ) ;
2007-05-23 21:16:46 +04:00
device_remove_file ( & pdev - > dev , & dev_attr_eeh_freeze_count ) ;
}