cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rpadlpar_sysfs.c (2553B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Interface for Dynamic Logical Partitioning of I/O Slots on
      4 * RPA-compliant PPC64 platform.
      5 *
      6 * John Rose <johnrose@austin.ibm.com>
      7 * October 2003
      8 *
      9 * Copyright (C) 2003 IBM.
     10 */
     11#include <linux/kobject.h>
     12#include <linux/string.h>
     13#include <linux/pci.h>
     14#include <linux/pci_hotplug.h>
     15#include "rpaphp.h"
     16#include "rpadlpar.h"
     17#include "../pci.h"
     18
     19#define DLPAR_KOBJ_NAME       "control"
     20
     21/* Those two have no quotes because they are passed to __ATTR() which
     22 * stringifies the argument (yuck !)
     23 */
     24#define ADD_SLOT_ATTR_NAME    add_slot
     25#define REMOVE_SLOT_ATTR_NAME remove_slot
     26
     27static ssize_t add_slot_store(struct kobject *kobj, struct kobj_attribute *attr,
     28			      const char *buf, size_t nbytes)
     29{
     30	char drc_name[MAX_DRC_NAME_LEN];
     31	char *end;
     32	int rc;
     33
     34	if (nbytes >= MAX_DRC_NAME_LEN)
     35		return 0;
     36
     37	strscpy(drc_name, buf, nbytes + 1);
     38
     39	end = strchr(drc_name, '\n');
     40	if (end)
     41		*end = '\0';
     42
     43	rc = dlpar_add_slot(drc_name);
     44	if (rc)
     45		return rc;
     46
     47	return nbytes;
     48}
     49
     50static ssize_t add_slot_show(struct kobject *kobj,
     51			     struct kobj_attribute *attr, char *buf)
     52{
     53	return sysfs_emit(buf, "0\n");
     54}
     55
     56static ssize_t remove_slot_store(struct kobject *kobj,
     57				 struct kobj_attribute *attr,
     58				 const char *buf, size_t nbytes)
     59{
     60	char drc_name[MAX_DRC_NAME_LEN];
     61	int rc;
     62	char *end;
     63
     64	if (nbytes >= MAX_DRC_NAME_LEN)
     65		return 0;
     66
     67	strscpy(drc_name, buf, nbytes + 1);
     68
     69	end = strchr(drc_name, '\n');
     70	if (end)
     71		*end = '\0';
     72
     73	rc = dlpar_remove_slot(drc_name);
     74	if (rc)
     75		return rc;
     76
     77	return nbytes;
     78}
     79
     80static ssize_t remove_slot_show(struct kobject *kobj,
     81				struct kobj_attribute *attr, char *buf)
     82{
     83	return sysfs_emit(buf, "0\n");
     84}
     85
     86static struct kobj_attribute add_slot_attr =
     87	__ATTR(ADD_SLOT_ATTR_NAME, 0644, add_slot_show, add_slot_store);
     88
     89static struct kobj_attribute remove_slot_attr =
     90	__ATTR(REMOVE_SLOT_ATTR_NAME, 0644, remove_slot_show, remove_slot_store);
     91
     92static struct attribute *default_attrs[] = {
     93	&add_slot_attr.attr,
     94	&remove_slot_attr.attr,
     95	NULL,
     96};
     97
     98static const struct attribute_group dlpar_attr_group = {
     99	.attrs = default_attrs,
    100};
    101
    102static struct kobject *dlpar_kobj;
    103
    104int dlpar_sysfs_init(void)
    105{
    106	int error;
    107
    108	dlpar_kobj = kobject_create_and_add(DLPAR_KOBJ_NAME,
    109					    &pci_slots_kset->kobj);
    110	if (!dlpar_kobj)
    111		return -EINVAL;
    112
    113	error = sysfs_create_group(dlpar_kobj, &dlpar_attr_group);
    114	if (error)
    115		kobject_put(dlpar_kobj);
    116	return error;
    117}
    118
    119void dlpar_sysfs_exit(void)
    120{
    121	sysfs_remove_group(dlpar_kobj, &dlpar_attr_group);
    122	kobject_put(dlpar_kobj);
    123}