2018-01-26 23:22:04 +03:00
// SPDX-License-Identifier: GPL-2.0+
2005-04-17 02:20:36 +04:00
/*
* Interface for Dynamic Logical Partitioning of I / O Slots on
* RPA - compliant PPC64 platform .
*
* John Rose < johnrose @ austin . ibm . com >
* October 2003
*
* Copyright ( C ) 2003 IBM .
*/
# include <linux/kobject.h>
# include <linux/string.h>
2008-06-11 01:28:50 +04:00
# include <linux/pci.h>
2006-10-14 07:05:19 +04:00
# include <linux/pci_hotplug.h>
hotplug/drc-info: Add code to search ibm,drc-info property
rpadlpar_core.c: Provide parallel routines to search the older device-
tree properties ("ibm,drc-indexes", "ibm,drc-names", "ibm,drc-types"
and "ibm,drc-power-domains"), or the new property "ibm,drc-info".
The interface to examine the DRC information is changed from a "get"
function that returns values for local verification elsewhere, to a
"check" function that validates the 'name' and/or 'type' of a device
node. This update hides the format of the underlying device-tree
properties, and concentrates the value checks into a single function
without requiring the user to verify whether a search was successful.
Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2017-12-02 02:19:48 +03:00
# include "rpaphp.h"
2005-04-17 02:20:36 +04:00
# include "rpadlpar.h"
2008-06-11 01:28:50 +04:00
# include "../pci.h"
2005-04-17 02:20:36 +04:00
# define DLPAR_KOBJ_NAME "control"
2008-05-30 07:39:12 +04:00
/* Those two have no quotes because they are passed to __ATTR() which
* stringifies the argument ( yuck ! )
*/
# define ADD_SLOT_ATTR_NAME add_slot
# define REMOVE_SLOT_ATTR_NAME remove_slot
2005-04-17 02:20:36 +04:00
2007-11-07 02:03:30 +03:00
static ssize_t add_slot_store ( struct kobject * kobj , struct kobj_attribute * attr ,
const char * buf , size_t nbytes )
2005-04-17 02:20:36 +04:00
{
char drc_name [ MAX_DRC_NAME_LEN ] ;
char * end ;
2007-11-07 02:03:30 +03:00
int rc ;
2005-04-17 02:20:36 +04:00
2005-09-22 11:48:24 +04:00
if ( nbytes > = MAX_DRC_NAME_LEN )
2005-04-17 02:20:36 +04:00
return 0 ;
memcpy ( drc_name , buf , nbytes ) ;
end = strchr ( drc_name , ' \n ' ) ;
if ( ! end )
end = & drc_name [ nbytes ] ;
* end = ' \0 ' ;
2007-11-07 02:03:30 +03:00
rc = dlpar_add_slot ( drc_name ) ;
if ( rc )
return rc ;
2005-04-17 02:20:36 +04:00
return nbytes ;
}
2007-11-07 02:03:30 +03:00
static ssize_t add_slot_show ( struct kobject * kobj ,
struct kobj_attribute * attr , char * buf )
{
return sprintf ( buf , " 0 \n " ) ;
}
static ssize_t remove_slot_store ( struct kobject * kobj ,
struct kobj_attribute * attr ,
const char * buf , size_t nbytes )
2005-04-17 02:20:36 +04:00
{
char drc_name [ MAX_DRC_NAME_LEN ] ;
2007-11-07 02:03:30 +03:00
int rc ;
2005-04-17 02:20:36 +04:00
char * end ;
2005-09-22 11:48:24 +04:00
if ( nbytes > = MAX_DRC_NAME_LEN )
2005-04-17 02:20:36 +04:00
return 0 ;
memcpy ( drc_name , buf , nbytes ) ;
end = strchr ( drc_name , ' \n ' ) ;
if ( ! end )
end = & drc_name [ nbytes ] ;
* end = ' \0 ' ;
2007-11-07 02:03:30 +03:00
rc = dlpar_remove_slot ( drc_name ) ;
if ( rc )
return rc ;
2005-04-17 02:20:36 +04:00
return nbytes ;
}
2007-11-07 02:03:30 +03:00
static ssize_t remove_slot_show ( struct kobject * kobj ,
struct kobj_attribute * attr , char * buf )
{
return sprintf ( buf , " 0 \n " ) ;
}
2005-04-17 02:20:36 +04:00
2007-11-07 02:03:30 +03:00
static struct kobj_attribute add_slot_attr =
__ATTR ( ADD_SLOT_ATTR_NAME , 0644 , add_slot_show , add_slot_store ) ;
static struct kobj_attribute remove_slot_attr =
__ATTR ( REMOVE_SLOT_ATTR_NAME , 0644 , remove_slot_show , remove_slot_store ) ;
2005-04-17 02:20:36 +04:00
static struct attribute * default_attrs [ ] = {
& add_slot_attr . attr ,
& remove_slot_attr . attr ,
NULL ,
} ;
2017-07-11 12:28:44 +03:00
static const struct attribute_group dlpar_attr_group = {
2007-11-07 02:03:30 +03:00
. attrs = default_attrs ,
2005-04-17 02:20:36 +04:00
} ;
2007-11-07 02:03:30 +03:00
static struct kobject * dlpar_kobj ;
2005-04-17 02:20:36 +04:00
int dlpar_sysfs_init ( void )
{
2007-11-07 02:03:30 +03:00
int error ;
dlpar_kobj = kobject_create_and_add ( DLPAR_KOBJ_NAME ,
2008-06-11 01:28:50 +04:00
& pci_slots_kset - > kobj ) ;
2007-11-07 02:03:30 +03:00
if ( ! dlpar_kobj )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
2007-11-07 02:03:30 +03:00
error = sysfs_create_group ( dlpar_kobj , & dlpar_attr_group ) ;
if ( error )
2007-12-20 19:13:05 +03:00
kobject_put ( dlpar_kobj ) ;
2007-11-07 02:03:30 +03:00
return error ;
2005-04-17 02:20:36 +04:00
}
void dlpar_sysfs_exit ( void )
{
2007-11-07 02:03:30 +03:00
sysfs_remove_group ( dlpar_kobj , & dlpar_attr_group ) ;
2007-12-20 19:13:05 +03:00
kobject_put ( dlpar_kobj ) ;
2005-04-17 02:20:36 +04:00
}