2018-01-26 23:22:04 +03:00
// SPDX-License-Identifier: GPL-2.0+
2005-04-17 02:20:36 +04:00
/*
* Compaq Hot Plug Controller Driver
*
* Copyright ( c ) 1995 , 2001 Compaq Computer Corporation
* Copyright ( c ) 2001 , 2003 Greg Kroah - Hartman ( greg @ kroah . com )
* Copyright ( c ) 2001 IBM Corp .
*
* All rights reserved .
*
* Send feedback to < greg @ kroah . com >
*
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/types.h>
# include <linux/pci.h>
# include "shpchp.h"
/* A few routines that create sysfs entries for the hot plug controller */
2015-12-28 00:21:11 +03:00
static ssize_t show_ctrl ( struct device * dev , struct device_attribute * attr , char * buf )
2005-04-17 02:20:36 +04:00
{
2005-10-13 23:05:36 +04:00
struct pci_dev * pdev ;
int index , busnr ;
struct resource * res ;
struct pci_bus * bus ;
2021-06-03 03:01:07 +03:00
size_t len = 0 ;
2005-04-17 02:20:36 +04:00
2016-01-08 21:05:39 +03:00
pdev = to_pci_dev ( dev ) ;
2005-10-13 23:05:36 +04:00
bus = pdev - > subordinate ;
2005-04-17 02:20:36 +04:00
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len , " Free resources: memory \n " ) ;
2010-02-23 20:24:31 +03:00
pci_bus_for_each_resource ( bus , res , index ) {
2005-10-13 23:05:36 +04:00
if ( res & & ( res - > flags & IORESOURCE_MEM ) & &
! ( res - > flags & IORESOURCE_PREFETCH ) ) {
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len ,
" start = %8.8llx, length = %8.8llx \n " ,
( unsigned long long ) res - > start ,
( unsigned long long ) resource_size ( res ) ) ;
2005-10-13 23:05:36 +04:00
}
2005-04-17 02:20:36 +04:00
}
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len , " Free resources: prefetchable memory \n " ) ;
2010-02-23 20:24:31 +03:00
pci_bus_for_each_resource ( bus , res , index ) {
2005-10-13 23:05:36 +04:00
if ( res & & ( res - > flags & IORESOURCE_MEM ) & &
( res - > flags & IORESOURCE_PREFETCH ) ) {
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len ,
" start = %8.8llx, length = %8.8llx \n " ,
( unsigned long long ) res - > start ,
( unsigned long long ) resource_size ( res ) ) ;
2005-10-13 23:05:36 +04:00
}
2005-04-17 02:20:36 +04:00
}
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len , " Free resources: IO \n " ) ;
2010-02-23 20:24:31 +03:00
pci_bus_for_each_resource ( bus , res , index ) {
2005-10-13 23:05:36 +04:00
if ( res & & ( res - > flags & IORESOURCE_IO ) ) {
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len ,
" start = %8.8llx, length = %8.8llx \n " ,
( unsigned long long ) res - > start ,
( unsigned long long ) resource_size ( res ) ) ;
2005-10-13 23:05:36 +04:00
}
2005-04-17 02:20:36 +04:00
}
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len , " Free resources: bus numbers \n " ) ;
2012-05-18 05:51:11 +04:00
for ( busnr = bus - > busn_res . start ; busnr < = bus - > busn_res . end ; busnr + + ) {
2005-10-13 23:05:36 +04:00
if ( ! pci_find_bus ( pci_domain_nr ( bus ) , busnr ) )
break ;
2005-04-17 02:20:36 +04:00
}
2012-05-18 05:51:11 +04:00
if ( busnr < bus - > busn_res . end )
2021-06-03 03:01:07 +03:00
len + = sysfs_emit_at ( buf , len ,
" start = %8.8x, length = %8.8x \n " ,
busnr , ( int ) ( bus - > busn_res . end - busnr ) ) ;
2005-04-17 02:20:36 +04:00
2021-06-03 03:01:07 +03:00
return len ;
2005-04-17 02:20:36 +04:00
}
2015-12-28 00:21:11 +03:00
static DEVICE_ATTR ( ctrl , S_IRUGO , show_ctrl , NULL ) ;
2005-04-17 02:20:36 +04:00
2015-12-28 00:21:11 +03:00
int shpchp_create_ctrl_files ( struct controller * ctrl )
2005-04-17 02:20:36 +04:00
{
2015-12-28 00:21:11 +03:00
return device_create_file ( & ctrl - > pci_dev - > dev , & dev_attr_ctrl ) ;
2005-04-17 02:20:36 +04:00
}
2005-10-13 23:05:44 +04:00
void shpchp_remove_ctrl_files ( struct controller * ctrl )
{
device_remove_file ( & ctrl - > pci_dev - > dev , & dev_attr_ctrl ) ;
}