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

sysfs.c (37981B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
      3#include <linux/init.h>
      4#include <linux/kernel.h>
      5#include <linux/module.h>
      6#include <linux/pci.h>
      7#include <linux/device.h>
      8#include <linux/io-64-nonatomic-lo-hi.h>
      9#include <uapi/linux/idxd.h>
     10#include "registers.h"
     11#include "idxd.h"
     12
     13static char *idxd_wq_type_names[] = {
     14	[IDXD_WQT_NONE]		= "none",
     15	[IDXD_WQT_KERNEL]	= "kernel",
     16	[IDXD_WQT_USER]		= "user",
     17};
     18
     19/* IDXD engine attributes */
     20static ssize_t engine_group_id_show(struct device *dev,
     21				    struct device_attribute *attr, char *buf)
     22{
     23	struct idxd_engine *engine = confdev_to_engine(dev);
     24
     25	if (engine->group)
     26		return sysfs_emit(buf, "%d\n", engine->group->id);
     27	else
     28		return sysfs_emit(buf, "%d\n", -1);
     29}
     30
     31static ssize_t engine_group_id_store(struct device *dev,
     32				     struct device_attribute *attr,
     33				     const char *buf, size_t count)
     34{
     35	struct idxd_engine *engine = confdev_to_engine(dev);
     36	struct idxd_device *idxd = engine->idxd;
     37	long id;
     38	int rc;
     39	struct idxd_group *prevg;
     40
     41	rc = kstrtol(buf, 10, &id);
     42	if (rc < 0)
     43		return -EINVAL;
     44
     45	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
     46		return -EPERM;
     47
     48	if (id > idxd->max_groups - 1 || id < -1)
     49		return -EINVAL;
     50
     51	if (id == -1) {
     52		if (engine->group) {
     53			engine->group->num_engines--;
     54			engine->group = NULL;
     55		}
     56		return count;
     57	}
     58
     59	prevg = engine->group;
     60
     61	if (prevg)
     62		prevg->num_engines--;
     63	engine->group = idxd->groups[id];
     64	engine->group->num_engines++;
     65
     66	return count;
     67}
     68
     69static struct device_attribute dev_attr_engine_group =
     70		__ATTR(group_id, 0644, engine_group_id_show,
     71		       engine_group_id_store);
     72
     73static struct attribute *idxd_engine_attributes[] = {
     74	&dev_attr_engine_group.attr,
     75	NULL,
     76};
     77
     78static const struct attribute_group idxd_engine_attribute_group = {
     79	.attrs = idxd_engine_attributes,
     80};
     81
     82static const struct attribute_group *idxd_engine_attribute_groups[] = {
     83	&idxd_engine_attribute_group,
     84	NULL,
     85};
     86
     87static void idxd_conf_engine_release(struct device *dev)
     88{
     89	struct idxd_engine *engine = confdev_to_engine(dev);
     90
     91	kfree(engine);
     92}
     93
     94struct device_type idxd_engine_device_type = {
     95	.name = "engine",
     96	.release = idxd_conf_engine_release,
     97	.groups = idxd_engine_attribute_groups,
     98};
     99
    100/* Group attributes */
    101
    102static void idxd_set_free_rdbufs(struct idxd_device *idxd)
    103{
    104	int i, rdbufs;
    105
    106	for (i = 0, rdbufs = 0; i < idxd->max_groups; i++) {
    107		struct idxd_group *g = idxd->groups[i];
    108
    109		rdbufs += g->rdbufs_reserved;
    110	}
    111
    112	idxd->nr_rdbufs = idxd->max_rdbufs - rdbufs;
    113}
    114
    115static ssize_t group_read_buffers_reserved_show(struct device *dev,
    116						struct device_attribute *attr,
    117						char *buf)
    118{
    119	struct idxd_group *group = confdev_to_group(dev);
    120
    121	return sysfs_emit(buf, "%u\n", group->rdbufs_reserved);
    122}
    123
    124static ssize_t group_tokens_reserved_show(struct device *dev,
    125					  struct device_attribute *attr,
    126					  char *buf)
    127{
    128	dev_warn_once(dev, "attribute deprecated, see read_buffers_reserved.\n");
    129	return group_read_buffers_reserved_show(dev, attr, buf);
    130}
    131
    132static ssize_t group_read_buffers_reserved_store(struct device *dev,
    133						 struct device_attribute *attr,
    134						 const char *buf, size_t count)
    135{
    136	struct idxd_group *group = confdev_to_group(dev);
    137	struct idxd_device *idxd = group->idxd;
    138	unsigned long val;
    139	int rc;
    140
    141	rc = kstrtoul(buf, 10, &val);
    142	if (rc < 0)
    143		return -EINVAL;
    144
    145	if (idxd->data->type == IDXD_TYPE_IAX)
    146		return -EOPNOTSUPP;
    147
    148	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    149		return -EPERM;
    150
    151	if (idxd->state == IDXD_DEV_ENABLED)
    152		return -EPERM;
    153
    154	if (val > idxd->max_rdbufs)
    155		return -EINVAL;
    156
    157	if (val > idxd->nr_rdbufs + group->rdbufs_reserved)
    158		return -EINVAL;
    159
    160	group->rdbufs_reserved = val;
    161	idxd_set_free_rdbufs(idxd);
    162	return count;
    163}
    164
    165static ssize_t group_tokens_reserved_store(struct device *dev,
    166					   struct device_attribute *attr,
    167					   const char *buf, size_t count)
    168{
    169	dev_warn_once(dev, "attribute deprecated, see read_buffers_reserved.\n");
    170	return group_read_buffers_reserved_store(dev, attr, buf, count);
    171}
    172
    173static struct device_attribute dev_attr_group_tokens_reserved =
    174		__ATTR(tokens_reserved, 0644, group_tokens_reserved_show,
    175		       group_tokens_reserved_store);
    176
    177static struct device_attribute dev_attr_group_read_buffers_reserved =
    178		__ATTR(read_buffers_reserved, 0644, group_read_buffers_reserved_show,
    179		       group_read_buffers_reserved_store);
    180
    181static ssize_t group_read_buffers_allowed_show(struct device *dev,
    182					       struct device_attribute *attr,
    183					       char *buf)
    184{
    185	struct idxd_group *group = confdev_to_group(dev);
    186
    187	return sysfs_emit(buf, "%u\n", group->rdbufs_allowed);
    188}
    189
    190static ssize_t group_tokens_allowed_show(struct device *dev,
    191					 struct device_attribute *attr,
    192					 char *buf)
    193{
    194	dev_warn_once(dev, "attribute deprecated, see read_buffers_allowed.\n");
    195	return group_read_buffers_allowed_show(dev, attr, buf);
    196}
    197
    198static ssize_t group_read_buffers_allowed_store(struct device *dev,
    199						struct device_attribute *attr,
    200						const char *buf, size_t count)
    201{
    202	struct idxd_group *group = confdev_to_group(dev);
    203	struct idxd_device *idxd = group->idxd;
    204	unsigned long val;
    205	int rc;
    206
    207	rc = kstrtoul(buf, 10, &val);
    208	if (rc < 0)
    209		return -EINVAL;
    210
    211	if (idxd->data->type == IDXD_TYPE_IAX)
    212		return -EOPNOTSUPP;
    213
    214	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    215		return -EPERM;
    216
    217	if (idxd->state == IDXD_DEV_ENABLED)
    218		return -EPERM;
    219
    220	if (val < 4 * group->num_engines ||
    221	    val > group->rdbufs_reserved + idxd->nr_rdbufs)
    222		return -EINVAL;
    223
    224	group->rdbufs_allowed = val;
    225	return count;
    226}
    227
    228static ssize_t group_tokens_allowed_store(struct device *dev,
    229					  struct device_attribute *attr,
    230					  const char *buf, size_t count)
    231{
    232	dev_warn_once(dev, "attribute deprecated, see read_buffers_allowed.\n");
    233	return group_read_buffers_allowed_store(dev, attr, buf, count);
    234}
    235
    236static struct device_attribute dev_attr_group_tokens_allowed =
    237		__ATTR(tokens_allowed, 0644, group_tokens_allowed_show,
    238		       group_tokens_allowed_store);
    239
    240static struct device_attribute dev_attr_group_read_buffers_allowed =
    241		__ATTR(read_buffers_allowed, 0644, group_read_buffers_allowed_show,
    242		       group_read_buffers_allowed_store);
    243
    244static ssize_t group_use_read_buffer_limit_show(struct device *dev,
    245						struct device_attribute *attr,
    246						char *buf)
    247{
    248	struct idxd_group *group = confdev_to_group(dev);
    249
    250	return sysfs_emit(buf, "%u\n", group->use_rdbuf_limit);
    251}
    252
    253static ssize_t group_use_token_limit_show(struct device *dev,
    254					  struct device_attribute *attr,
    255					  char *buf)
    256{
    257	dev_warn_once(dev, "attribute deprecated, see use_read_buffer_limit.\n");
    258	return group_use_read_buffer_limit_show(dev, attr, buf);
    259}
    260
    261static ssize_t group_use_read_buffer_limit_store(struct device *dev,
    262						 struct device_attribute *attr,
    263						 const char *buf, size_t count)
    264{
    265	struct idxd_group *group = confdev_to_group(dev);
    266	struct idxd_device *idxd = group->idxd;
    267	unsigned long val;
    268	int rc;
    269
    270	rc = kstrtoul(buf, 10, &val);
    271	if (rc < 0)
    272		return -EINVAL;
    273
    274	if (idxd->data->type == IDXD_TYPE_IAX)
    275		return -EOPNOTSUPP;
    276
    277	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    278		return -EPERM;
    279
    280	if (idxd->state == IDXD_DEV_ENABLED)
    281		return -EPERM;
    282
    283	if (idxd->rdbuf_limit == 0)
    284		return -EPERM;
    285
    286	group->use_rdbuf_limit = !!val;
    287	return count;
    288}
    289
    290static ssize_t group_use_token_limit_store(struct device *dev,
    291					   struct device_attribute *attr,
    292					   const char *buf, size_t count)
    293{
    294	dev_warn_once(dev, "attribute deprecated, see use_read_buffer_limit.\n");
    295	return group_use_read_buffer_limit_store(dev, attr, buf, count);
    296}
    297
    298static struct device_attribute dev_attr_group_use_token_limit =
    299		__ATTR(use_token_limit, 0644, group_use_token_limit_show,
    300		       group_use_token_limit_store);
    301
    302static struct device_attribute dev_attr_group_use_read_buffer_limit =
    303		__ATTR(use_read_buffer_limit, 0644, group_use_read_buffer_limit_show,
    304		       group_use_read_buffer_limit_store);
    305
    306static ssize_t group_engines_show(struct device *dev,
    307				  struct device_attribute *attr, char *buf)
    308{
    309	struct idxd_group *group = confdev_to_group(dev);
    310	int i, rc = 0;
    311	struct idxd_device *idxd = group->idxd;
    312
    313	for (i = 0; i < idxd->max_engines; i++) {
    314		struct idxd_engine *engine = idxd->engines[i];
    315
    316		if (!engine->group)
    317			continue;
    318
    319		if (engine->group->id == group->id)
    320			rc += sysfs_emit_at(buf, rc, "engine%d.%d ", idxd->id, engine->id);
    321	}
    322
    323	if (!rc)
    324		return 0;
    325	rc--;
    326	rc += sysfs_emit_at(buf, rc, "\n");
    327
    328	return rc;
    329}
    330
    331static struct device_attribute dev_attr_group_engines =
    332		__ATTR(engines, 0444, group_engines_show, NULL);
    333
    334static ssize_t group_work_queues_show(struct device *dev,
    335				      struct device_attribute *attr, char *buf)
    336{
    337	struct idxd_group *group = confdev_to_group(dev);
    338	int i, rc = 0;
    339	struct idxd_device *idxd = group->idxd;
    340
    341	for (i = 0; i < idxd->max_wqs; i++) {
    342		struct idxd_wq *wq = idxd->wqs[i];
    343
    344		if (!wq->group)
    345			continue;
    346
    347		if (wq->group->id == group->id)
    348			rc += sysfs_emit_at(buf, rc, "wq%d.%d ", idxd->id, wq->id);
    349	}
    350
    351	if (!rc)
    352		return 0;
    353	rc--;
    354	rc += sysfs_emit_at(buf, rc, "\n");
    355
    356	return rc;
    357}
    358
    359static struct device_attribute dev_attr_group_work_queues =
    360		__ATTR(work_queues, 0444, group_work_queues_show, NULL);
    361
    362static ssize_t group_traffic_class_a_show(struct device *dev,
    363					  struct device_attribute *attr,
    364					  char *buf)
    365{
    366	struct idxd_group *group = confdev_to_group(dev);
    367
    368	return sysfs_emit(buf, "%d\n", group->tc_a);
    369}
    370
    371static ssize_t group_traffic_class_a_store(struct device *dev,
    372					   struct device_attribute *attr,
    373					   const char *buf, size_t count)
    374{
    375	struct idxd_group *group = confdev_to_group(dev);
    376	struct idxd_device *idxd = group->idxd;
    377	long val;
    378	int rc;
    379
    380	rc = kstrtol(buf, 10, &val);
    381	if (rc < 0)
    382		return -EINVAL;
    383
    384	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    385		return -EPERM;
    386
    387	if (idxd->state == IDXD_DEV_ENABLED)
    388		return -EPERM;
    389
    390	if (idxd->hw.version < DEVICE_VERSION_2 && !tc_override)
    391		return -EPERM;
    392
    393	if (val < 0 || val > 7)
    394		return -EINVAL;
    395
    396	group->tc_a = val;
    397	return count;
    398}
    399
    400static struct device_attribute dev_attr_group_traffic_class_a =
    401		__ATTR(traffic_class_a, 0644, group_traffic_class_a_show,
    402		       group_traffic_class_a_store);
    403
    404static ssize_t group_traffic_class_b_show(struct device *dev,
    405					  struct device_attribute *attr,
    406					  char *buf)
    407{
    408	struct idxd_group *group = confdev_to_group(dev);
    409
    410	return sysfs_emit(buf, "%d\n", group->tc_b);
    411}
    412
    413static ssize_t group_traffic_class_b_store(struct device *dev,
    414					   struct device_attribute *attr,
    415					   const char *buf, size_t count)
    416{
    417	struct idxd_group *group = confdev_to_group(dev);
    418	struct idxd_device *idxd = group->idxd;
    419	long val;
    420	int rc;
    421
    422	rc = kstrtol(buf, 10, &val);
    423	if (rc < 0)
    424		return -EINVAL;
    425
    426	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    427		return -EPERM;
    428
    429	if (idxd->state == IDXD_DEV_ENABLED)
    430		return -EPERM;
    431
    432	if (idxd->hw.version < DEVICE_VERSION_2 && !tc_override)
    433		return -EPERM;
    434
    435	if (val < 0 || val > 7)
    436		return -EINVAL;
    437
    438	group->tc_b = val;
    439	return count;
    440}
    441
    442static struct device_attribute dev_attr_group_traffic_class_b =
    443		__ATTR(traffic_class_b, 0644, group_traffic_class_b_show,
    444		       group_traffic_class_b_store);
    445
    446static struct attribute *idxd_group_attributes[] = {
    447	&dev_attr_group_work_queues.attr,
    448	&dev_attr_group_engines.attr,
    449	&dev_attr_group_use_token_limit.attr,
    450	&dev_attr_group_use_read_buffer_limit.attr,
    451	&dev_attr_group_tokens_allowed.attr,
    452	&dev_attr_group_read_buffers_allowed.attr,
    453	&dev_attr_group_tokens_reserved.attr,
    454	&dev_attr_group_read_buffers_reserved.attr,
    455	&dev_attr_group_traffic_class_a.attr,
    456	&dev_attr_group_traffic_class_b.attr,
    457	NULL,
    458};
    459
    460static const struct attribute_group idxd_group_attribute_group = {
    461	.attrs = idxd_group_attributes,
    462};
    463
    464static const struct attribute_group *idxd_group_attribute_groups[] = {
    465	&idxd_group_attribute_group,
    466	NULL,
    467};
    468
    469static void idxd_conf_group_release(struct device *dev)
    470{
    471	struct idxd_group *group = confdev_to_group(dev);
    472
    473	kfree(group);
    474}
    475
    476struct device_type idxd_group_device_type = {
    477	.name = "group",
    478	.release = idxd_conf_group_release,
    479	.groups = idxd_group_attribute_groups,
    480};
    481
    482/* IDXD work queue attribs */
    483static ssize_t wq_clients_show(struct device *dev,
    484			       struct device_attribute *attr, char *buf)
    485{
    486	struct idxd_wq *wq = confdev_to_wq(dev);
    487
    488	return sysfs_emit(buf, "%d\n", wq->client_count);
    489}
    490
    491static struct device_attribute dev_attr_wq_clients =
    492		__ATTR(clients, 0444, wq_clients_show, NULL);
    493
    494static ssize_t wq_state_show(struct device *dev,
    495			     struct device_attribute *attr, char *buf)
    496{
    497	struct idxd_wq *wq = confdev_to_wq(dev);
    498
    499	switch (wq->state) {
    500	case IDXD_WQ_DISABLED:
    501		return sysfs_emit(buf, "disabled\n");
    502	case IDXD_WQ_ENABLED:
    503		return sysfs_emit(buf, "enabled\n");
    504	}
    505
    506	return sysfs_emit(buf, "unknown\n");
    507}
    508
    509static struct device_attribute dev_attr_wq_state =
    510		__ATTR(state, 0444, wq_state_show, NULL);
    511
    512static ssize_t wq_group_id_show(struct device *dev,
    513				struct device_attribute *attr, char *buf)
    514{
    515	struct idxd_wq *wq = confdev_to_wq(dev);
    516
    517	if (wq->group)
    518		return sysfs_emit(buf, "%u\n", wq->group->id);
    519	else
    520		return sysfs_emit(buf, "-1\n");
    521}
    522
    523static ssize_t wq_group_id_store(struct device *dev,
    524				 struct device_attribute *attr,
    525				 const char *buf, size_t count)
    526{
    527	struct idxd_wq *wq = confdev_to_wq(dev);
    528	struct idxd_device *idxd = wq->idxd;
    529	long id;
    530	int rc;
    531	struct idxd_group *prevg, *group;
    532
    533	rc = kstrtol(buf, 10, &id);
    534	if (rc < 0)
    535		return -EINVAL;
    536
    537	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    538		return -EPERM;
    539
    540	if (wq->state != IDXD_WQ_DISABLED)
    541		return -EPERM;
    542
    543	if (id > idxd->max_groups - 1 || id < -1)
    544		return -EINVAL;
    545
    546	if (id == -1) {
    547		if (wq->group) {
    548			wq->group->num_wqs--;
    549			wq->group = NULL;
    550		}
    551		return count;
    552	}
    553
    554	group = idxd->groups[id];
    555	prevg = wq->group;
    556
    557	if (prevg)
    558		prevg->num_wqs--;
    559	wq->group = group;
    560	group->num_wqs++;
    561	return count;
    562}
    563
    564static struct device_attribute dev_attr_wq_group_id =
    565		__ATTR(group_id, 0644, wq_group_id_show, wq_group_id_store);
    566
    567static ssize_t wq_mode_show(struct device *dev, struct device_attribute *attr,
    568			    char *buf)
    569{
    570	struct idxd_wq *wq = confdev_to_wq(dev);
    571
    572	return sysfs_emit(buf, "%s\n", wq_dedicated(wq) ? "dedicated" : "shared");
    573}
    574
    575static ssize_t wq_mode_store(struct device *dev,
    576			     struct device_attribute *attr, const char *buf,
    577			     size_t count)
    578{
    579	struct idxd_wq *wq = confdev_to_wq(dev);
    580	struct idxd_device *idxd = wq->idxd;
    581
    582	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    583		return -EPERM;
    584
    585	if (wq->state != IDXD_WQ_DISABLED)
    586		return -EPERM;
    587
    588	if (sysfs_streq(buf, "dedicated")) {
    589		set_bit(WQ_FLAG_DEDICATED, &wq->flags);
    590		wq->threshold = 0;
    591	} else if (sysfs_streq(buf, "shared")) {
    592		clear_bit(WQ_FLAG_DEDICATED, &wq->flags);
    593	} else {
    594		return -EINVAL;
    595	}
    596
    597	return count;
    598}
    599
    600static struct device_attribute dev_attr_wq_mode =
    601		__ATTR(mode, 0644, wq_mode_show, wq_mode_store);
    602
    603static ssize_t wq_size_show(struct device *dev, struct device_attribute *attr,
    604			    char *buf)
    605{
    606	struct idxd_wq *wq = confdev_to_wq(dev);
    607
    608	return sysfs_emit(buf, "%u\n", wq->size);
    609}
    610
    611static int total_claimed_wq_size(struct idxd_device *idxd)
    612{
    613	int i;
    614	int wq_size = 0;
    615
    616	for (i = 0; i < idxd->max_wqs; i++) {
    617		struct idxd_wq *wq = idxd->wqs[i];
    618
    619		wq_size += wq->size;
    620	}
    621
    622	return wq_size;
    623}
    624
    625static ssize_t wq_size_store(struct device *dev,
    626			     struct device_attribute *attr, const char *buf,
    627			     size_t count)
    628{
    629	struct idxd_wq *wq = confdev_to_wq(dev);
    630	unsigned long size;
    631	struct idxd_device *idxd = wq->idxd;
    632	int rc;
    633
    634	rc = kstrtoul(buf, 10, &size);
    635	if (rc < 0)
    636		return -EINVAL;
    637
    638	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    639		return -EPERM;
    640
    641	if (idxd->state == IDXD_DEV_ENABLED)
    642		return -EPERM;
    643
    644	if (size + total_claimed_wq_size(idxd) - wq->size > idxd->max_wq_size)
    645		return -EINVAL;
    646
    647	wq->size = size;
    648	return count;
    649}
    650
    651static struct device_attribute dev_attr_wq_size =
    652		__ATTR(size, 0644, wq_size_show, wq_size_store);
    653
    654static ssize_t wq_priority_show(struct device *dev,
    655				struct device_attribute *attr, char *buf)
    656{
    657	struct idxd_wq *wq = confdev_to_wq(dev);
    658
    659	return sysfs_emit(buf, "%u\n", wq->priority);
    660}
    661
    662static ssize_t wq_priority_store(struct device *dev,
    663				 struct device_attribute *attr,
    664				 const char *buf, size_t count)
    665{
    666	struct idxd_wq *wq = confdev_to_wq(dev);
    667	unsigned long prio;
    668	struct idxd_device *idxd = wq->idxd;
    669	int rc;
    670
    671	rc = kstrtoul(buf, 10, &prio);
    672	if (rc < 0)
    673		return -EINVAL;
    674
    675	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    676		return -EPERM;
    677
    678	if (wq->state != IDXD_WQ_DISABLED)
    679		return -EPERM;
    680
    681	if (prio > IDXD_MAX_PRIORITY)
    682		return -EINVAL;
    683
    684	wq->priority = prio;
    685	return count;
    686}
    687
    688static struct device_attribute dev_attr_wq_priority =
    689		__ATTR(priority, 0644, wq_priority_show, wq_priority_store);
    690
    691static ssize_t wq_block_on_fault_show(struct device *dev,
    692				      struct device_attribute *attr, char *buf)
    693{
    694	struct idxd_wq *wq = confdev_to_wq(dev);
    695
    696	return sysfs_emit(buf, "%u\n", test_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags));
    697}
    698
    699static ssize_t wq_block_on_fault_store(struct device *dev,
    700				       struct device_attribute *attr,
    701				       const char *buf, size_t count)
    702{
    703	struct idxd_wq *wq = confdev_to_wq(dev);
    704	struct idxd_device *idxd = wq->idxd;
    705	bool bof;
    706	int rc;
    707
    708	if (!idxd->hw.gen_cap.block_on_fault)
    709		return -EOPNOTSUPP;
    710
    711	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    712		return -EPERM;
    713
    714	if (wq->state != IDXD_WQ_DISABLED)
    715		return -ENXIO;
    716
    717	rc = kstrtobool(buf, &bof);
    718	if (rc < 0)
    719		return rc;
    720
    721	if (bof)
    722		set_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags);
    723	else
    724		clear_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags);
    725
    726	return count;
    727}
    728
    729static struct device_attribute dev_attr_wq_block_on_fault =
    730		__ATTR(block_on_fault, 0644, wq_block_on_fault_show,
    731		       wq_block_on_fault_store);
    732
    733static ssize_t wq_threshold_show(struct device *dev,
    734				 struct device_attribute *attr, char *buf)
    735{
    736	struct idxd_wq *wq = confdev_to_wq(dev);
    737
    738	return sysfs_emit(buf, "%u\n", wq->threshold);
    739}
    740
    741static ssize_t wq_threshold_store(struct device *dev,
    742				  struct device_attribute *attr,
    743				  const char *buf, size_t count)
    744{
    745	struct idxd_wq *wq = confdev_to_wq(dev);
    746	struct idxd_device *idxd = wq->idxd;
    747	unsigned int val;
    748	int rc;
    749
    750	rc = kstrtouint(buf, 0, &val);
    751	if (rc < 0)
    752		return -EINVAL;
    753
    754	if (val > wq->size || val <= 0)
    755		return -EINVAL;
    756
    757	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    758		return -EPERM;
    759
    760	if (wq->state != IDXD_WQ_DISABLED)
    761		return -ENXIO;
    762
    763	if (test_bit(WQ_FLAG_DEDICATED, &wq->flags))
    764		return -EINVAL;
    765
    766	wq->threshold = val;
    767
    768	return count;
    769}
    770
    771static struct device_attribute dev_attr_wq_threshold =
    772		__ATTR(threshold, 0644, wq_threshold_show, wq_threshold_store);
    773
    774static ssize_t wq_type_show(struct device *dev,
    775			    struct device_attribute *attr, char *buf)
    776{
    777	struct idxd_wq *wq = confdev_to_wq(dev);
    778
    779	switch (wq->type) {
    780	case IDXD_WQT_KERNEL:
    781		return sysfs_emit(buf, "%s\n", idxd_wq_type_names[IDXD_WQT_KERNEL]);
    782	case IDXD_WQT_USER:
    783		return sysfs_emit(buf, "%s\n", idxd_wq_type_names[IDXD_WQT_USER]);
    784	case IDXD_WQT_NONE:
    785	default:
    786		return sysfs_emit(buf, "%s\n", idxd_wq_type_names[IDXD_WQT_NONE]);
    787	}
    788
    789	return -EINVAL;
    790}
    791
    792static ssize_t wq_type_store(struct device *dev,
    793			     struct device_attribute *attr, const char *buf,
    794			     size_t count)
    795{
    796	struct idxd_wq *wq = confdev_to_wq(dev);
    797	enum idxd_wq_type old_type;
    798
    799	if (wq->state != IDXD_WQ_DISABLED)
    800		return -EPERM;
    801
    802	old_type = wq->type;
    803	if (sysfs_streq(buf, idxd_wq_type_names[IDXD_WQT_NONE]))
    804		wq->type = IDXD_WQT_NONE;
    805	else if (sysfs_streq(buf, idxd_wq_type_names[IDXD_WQT_KERNEL]))
    806		wq->type = IDXD_WQT_KERNEL;
    807	else if (sysfs_streq(buf, idxd_wq_type_names[IDXD_WQT_USER]))
    808		wq->type = IDXD_WQT_USER;
    809	else
    810		return -EINVAL;
    811
    812	/* If we are changing queue type, clear the name */
    813	if (wq->type != old_type)
    814		memset(wq->name, 0, WQ_NAME_SIZE + 1);
    815
    816	return count;
    817}
    818
    819static struct device_attribute dev_attr_wq_type =
    820		__ATTR(type, 0644, wq_type_show, wq_type_store);
    821
    822static ssize_t wq_name_show(struct device *dev,
    823			    struct device_attribute *attr, char *buf)
    824{
    825	struct idxd_wq *wq = confdev_to_wq(dev);
    826
    827	return sysfs_emit(buf, "%s\n", wq->name);
    828}
    829
    830static ssize_t wq_name_store(struct device *dev,
    831			     struct device_attribute *attr, const char *buf,
    832			     size_t count)
    833{
    834	struct idxd_wq *wq = confdev_to_wq(dev);
    835	char *input, *pos;
    836
    837	if (wq->state != IDXD_WQ_DISABLED)
    838		return -EPERM;
    839
    840	if (strlen(buf) > WQ_NAME_SIZE || strlen(buf) == 0)
    841		return -EINVAL;
    842
    843	/*
    844	 * This is temporarily placed here until we have SVM support for
    845	 * dmaengine.
    846	 */
    847	if (wq->type == IDXD_WQT_KERNEL && device_pasid_enabled(wq->idxd))
    848		return -EOPNOTSUPP;
    849
    850	input = kstrndup(buf, count, GFP_KERNEL);
    851	if (!input)
    852		return -ENOMEM;
    853
    854	pos = strim(input);
    855	memset(wq->name, 0, WQ_NAME_SIZE + 1);
    856	sprintf(wq->name, "%s", pos);
    857	kfree(input);
    858	return count;
    859}
    860
    861static struct device_attribute dev_attr_wq_name =
    862		__ATTR(name, 0644, wq_name_show, wq_name_store);
    863
    864static ssize_t wq_cdev_minor_show(struct device *dev,
    865				  struct device_attribute *attr, char *buf)
    866{
    867	struct idxd_wq *wq = confdev_to_wq(dev);
    868	int minor = -1;
    869
    870	mutex_lock(&wq->wq_lock);
    871	if (wq->idxd_cdev)
    872		minor = wq->idxd_cdev->minor;
    873	mutex_unlock(&wq->wq_lock);
    874
    875	if (minor == -1)
    876		return -ENXIO;
    877	return sysfs_emit(buf, "%d\n", minor);
    878}
    879
    880static struct device_attribute dev_attr_wq_cdev_minor =
    881		__ATTR(cdev_minor, 0444, wq_cdev_minor_show, NULL);
    882
    883static int __get_sysfs_u64(const char *buf, u64 *val)
    884{
    885	int rc;
    886
    887	rc = kstrtou64(buf, 0, val);
    888	if (rc < 0)
    889		return -EINVAL;
    890
    891	if (*val == 0)
    892		return -EINVAL;
    893
    894	*val = roundup_pow_of_two(*val);
    895	return 0;
    896}
    897
    898static ssize_t wq_max_transfer_size_show(struct device *dev, struct device_attribute *attr,
    899					 char *buf)
    900{
    901	struct idxd_wq *wq = confdev_to_wq(dev);
    902
    903	return sysfs_emit(buf, "%llu\n", wq->max_xfer_bytes);
    904}
    905
    906static ssize_t wq_max_transfer_size_store(struct device *dev, struct device_attribute *attr,
    907					  const char *buf, size_t count)
    908{
    909	struct idxd_wq *wq = confdev_to_wq(dev);
    910	struct idxd_device *idxd = wq->idxd;
    911	u64 xfer_size;
    912	int rc;
    913
    914	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    915		return -EPERM;
    916
    917	if (wq->state != IDXD_WQ_DISABLED)
    918		return -EPERM;
    919
    920	rc = __get_sysfs_u64(buf, &xfer_size);
    921	if (rc < 0)
    922		return rc;
    923
    924	if (xfer_size > idxd->max_xfer_bytes)
    925		return -EINVAL;
    926
    927	wq->max_xfer_bytes = xfer_size;
    928
    929	return count;
    930}
    931
    932static struct device_attribute dev_attr_wq_max_transfer_size =
    933		__ATTR(max_transfer_size, 0644,
    934		       wq_max_transfer_size_show, wq_max_transfer_size_store);
    935
    936static ssize_t wq_max_batch_size_show(struct device *dev, struct device_attribute *attr, char *buf)
    937{
    938	struct idxd_wq *wq = confdev_to_wq(dev);
    939
    940	return sysfs_emit(buf, "%u\n", wq->max_batch_size);
    941}
    942
    943static ssize_t wq_max_batch_size_store(struct device *dev, struct device_attribute *attr,
    944				       const char *buf, size_t count)
    945{
    946	struct idxd_wq *wq = confdev_to_wq(dev);
    947	struct idxd_device *idxd = wq->idxd;
    948	u64 batch_size;
    949	int rc;
    950
    951	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
    952		return -EPERM;
    953
    954	if (wq->state != IDXD_WQ_DISABLED)
    955		return -EPERM;
    956
    957	rc = __get_sysfs_u64(buf, &batch_size);
    958	if (rc < 0)
    959		return rc;
    960
    961	if (batch_size > idxd->max_batch_size)
    962		return -EINVAL;
    963
    964	wq->max_batch_size = (u32)batch_size;
    965
    966	return count;
    967}
    968
    969static struct device_attribute dev_attr_wq_max_batch_size =
    970		__ATTR(max_batch_size, 0644, wq_max_batch_size_show, wq_max_batch_size_store);
    971
    972static ssize_t wq_ats_disable_show(struct device *dev, struct device_attribute *attr, char *buf)
    973{
    974	struct idxd_wq *wq = confdev_to_wq(dev);
    975
    976	return sysfs_emit(buf, "%u\n", wq->ats_dis);
    977}
    978
    979static ssize_t wq_ats_disable_store(struct device *dev, struct device_attribute *attr,
    980				    const char *buf, size_t count)
    981{
    982	struct idxd_wq *wq = confdev_to_wq(dev);
    983	struct idxd_device *idxd = wq->idxd;
    984	bool ats_dis;
    985	int rc;
    986
    987	if (wq->state != IDXD_WQ_DISABLED)
    988		return -EPERM;
    989
    990	if (!idxd->hw.wq_cap.wq_ats_support)
    991		return -EOPNOTSUPP;
    992
    993	rc = kstrtobool(buf, &ats_dis);
    994	if (rc < 0)
    995		return rc;
    996
    997	wq->ats_dis = ats_dis;
    998
    999	return count;
   1000}
   1001
   1002static struct device_attribute dev_attr_wq_ats_disable =
   1003		__ATTR(ats_disable, 0644, wq_ats_disable_show, wq_ats_disable_store);
   1004
   1005static ssize_t wq_occupancy_show(struct device *dev, struct device_attribute *attr, char *buf)
   1006{
   1007	struct idxd_wq *wq = confdev_to_wq(dev);
   1008	struct idxd_device *idxd = wq->idxd;
   1009	u32 occup, offset;
   1010
   1011	if (!idxd->hw.wq_cap.occupancy)
   1012		return -EOPNOTSUPP;
   1013
   1014	offset = WQCFG_OFFSET(idxd, wq->id, WQCFG_OCCUP_IDX);
   1015	occup = ioread32(idxd->reg_base + offset) & WQCFG_OCCUP_MASK;
   1016
   1017	return sysfs_emit(buf, "%u\n", occup);
   1018}
   1019
   1020static struct device_attribute dev_attr_wq_occupancy =
   1021		__ATTR(occupancy, 0444, wq_occupancy_show, NULL);
   1022
   1023static ssize_t wq_enqcmds_retries_show(struct device *dev,
   1024				       struct device_attribute *attr, char *buf)
   1025{
   1026	struct idxd_wq *wq = confdev_to_wq(dev);
   1027
   1028	if (wq_dedicated(wq))
   1029		return -EOPNOTSUPP;
   1030
   1031	return sysfs_emit(buf, "%u\n", wq->enqcmds_retries);
   1032}
   1033
   1034static ssize_t wq_enqcmds_retries_store(struct device *dev, struct device_attribute *attr,
   1035					const char *buf, size_t count)
   1036{
   1037	struct idxd_wq *wq = confdev_to_wq(dev);
   1038	int rc;
   1039	unsigned int retries;
   1040
   1041	if (wq_dedicated(wq))
   1042		return -EOPNOTSUPP;
   1043
   1044	rc = kstrtouint(buf, 10, &retries);
   1045	if (rc < 0)
   1046		return rc;
   1047
   1048	if (retries > IDXD_ENQCMDS_MAX_RETRIES)
   1049		retries = IDXD_ENQCMDS_MAX_RETRIES;
   1050
   1051	wq->enqcmds_retries = retries;
   1052	return count;
   1053}
   1054
   1055static struct device_attribute dev_attr_wq_enqcmds_retries =
   1056		__ATTR(enqcmds_retries, 0644, wq_enqcmds_retries_show, wq_enqcmds_retries_store);
   1057
   1058static struct attribute *idxd_wq_attributes[] = {
   1059	&dev_attr_wq_clients.attr,
   1060	&dev_attr_wq_state.attr,
   1061	&dev_attr_wq_group_id.attr,
   1062	&dev_attr_wq_mode.attr,
   1063	&dev_attr_wq_size.attr,
   1064	&dev_attr_wq_priority.attr,
   1065	&dev_attr_wq_block_on_fault.attr,
   1066	&dev_attr_wq_threshold.attr,
   1067	&dev_attr_wq_type.attr,
   1068	&dev_attr_wq_name.attr,
   1069	&dev_attr_wq_cdev_minor.attr,
   1070	&dev_attr_wq_max_transfer_size.attr,
   1071	&dev_attr_wq_max_batch_size.attr,
   1072	&dev_attr_wq_ats_disable.attr,
   1073	&dev_attr_wq_occupancy.attr,
   1074	&dev_attr_wq_enqcmds_retries.attr,
   1075	NULL,
   1076};
   1077
   1078static const struct attribute_group idxd_wq_attribute_group = {
   1079	.attrs = idxd_wq_attributes,
   1080};
   1081
   1082static const struct attribute_group *idxd_wq_attribute_groups[] = {
   1083	&idxd_wq_attribute_group,
   1084	NULL,
   1085};
   1086
   1087static void idxd_conf_wq_release(struct device *dev)
   1088{
   1089	struct idxd_wq *wq = confdev_to_wq(dev);
   1090
   1091	kfree(wq->wqcfg);
   1092	kfree(wq);
   1093}
   1094
   1095struct device_type idxd_wq_device_type = {
   1096	.name = "wq",
   1097	.release = idxd_conf_wq_release,
   1098	.groups = idxd_wq_attribute_groups,
   1099};
   1100
   1101/* IDXD device attribs */
   1102static ssize_t version_show(struct device *dev, struct device_attribute *attr,
   1103			    char *buf)
   1104{
   1105	struct idxd_device *idxd = confdev_to_idxd(dev);
   1106
   1107	return sysfs_emit(buf, "%#x\n", idxd->hw.version);
   1108}
   1109static DEVICE_ATTR_RO(version);
   1110
   1111static ssize_t max_work_queues_size_show(struct device *dev,
   1112					 struct device_attribute *attr,
   1113					 char *buf)
   1114{
   1115	struct idxd_device *idxd = confdev_to_idxd(dev);
   1116
   1117	return sysfs_emit(buf, "%u\n", idxd->max_wq_size);
   1118}
   1119static DEVICE_ATTR_RO(max_work_queues_size);
   1120
   1121static ssize_t max_groups_show(struct device *dev,
   1122			       struct device_attribute *attr, char *buf)
   1123{
   1124	struct idxd_device *idxd = confdev_to_idxd(dev);
   1125
   1126	return sysfs_emit(buf, "%u\n", idxd->max_groups);
   1127}
   1128static DEVICE_ATTR_RO(max_groups);
   1129
   1130static ssize_t max_work_queues_show(struct device *dev,
   1131				    struct device_attribute *attr, char *buf)
   1132{
   1133	struct idxd_device *idxd = confdev_to_idxd(dev);
   1134
   1135	return sysfs_emit(buf, "%u\n", idxd->max_wqs);
   1136}
   1137static DEVICE_ATTR_RO(max_work_queues);
   1138
   1139static ssize_t max_engines_show(struct device *dev,
   1140				struct device_attribute *attr, char *buf)
   1141{
   1142	struct idxd_device *idxd = confdev_to_idxd(dev);
   1143
   1144	return sysfs_emit(buf, "%u\n", idxd->max_engines);
   1145}
   1146static DEVICE_ATTR_RO(max_engines);
   1147
   1148static ssize_t numa_node_show(struct device *dev,
   1149			      struct device_attribute *attr, char *buf)
   1150{
   1151	struct idxd_device *idxd = confdev_to_idxd(dev);
   1152
   1153	return sysfs_emit(buf, "%d\n", dev_to_node(&idxd->pdev->dev));
   1154}
   1155static DEVICE_ATTR_RO(numa_node);
   1156
   1157static ssize_t max_batch_size_show(struct device *dev,
   1158				   struct device_attribute *attr, char *buf)
   1159{
   1160	struct idxd_device *idxd = confdev_to_idxd(dev);
   1161
   1162	return sysfs_emit(buf, "%u\n", idxd->max_batch_size);
   1163}
   1164static DEVICE_ATTR_RO(max_batch_size);
   1165
   1166static ssize_t max_transfer_size_show(struct device *dev,
   1167				      struct device_attribute *attr,
   1168				      char *buf)
   1169{
   1170	struct idxd_device *idxd = confdev_to_idxd(dev);
   1171
   1172	return sysfs_emit(buf, "%llu\n", idxd->max_xfer_bytes);
   1173}
   1174static DEVICE_ATTR_RO(max_transfer_size);
   1175
   1176static ssize_t op_cap_show(struct device *dev,
   1177			   struct device_attribute *attr, char *buf)
   1178{
   1179	struct idxd_device *idxd = confdev_to_idxd(dev);
   1180	int i, rc = 0;
   1181
   1182	for (i = 0; i < 4; i++)
   1183		rc += sysfs_emit_at(buf, rc, "%#llx ", idxd->hw.opcap.bits[i]);
   1184
   1185	rc--;
   1186	rc += sysfs_emit_at(buf, rc, "\n");
   1187	return rc;
   1188}
   1189static DEVICE_ATTR_RO(op_cap);
   1190
   1191static ssize_t gen_cap_show(struct device *dev,
   1192			    struct device_attribute *attr, char *buf)
   1193{
   1194	struct idxd_device *idxd = confdev_to_idxd(dev);
   1195
   1196	return sysfs_emit(buf, "%#llx\n", idxd->hw.gen_cap.bits);
   1197}
   1198static DEVICE_ATTR_RO(gen_cap);
   1199
   1200static ssize_t configurable_show(struct device *dev,
   1201				 struct device_attribute *attr, char *buf)
   1202{
   1203	struct idxd_device *idxd = confdev_to_idxd(dev);
   1204
   1205	return sysfs_emit(buf, "%u\n", test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags));
   1206}
   1207static DEVICE_ATTR_RO(configurable);
   1208
   1209static ssize_t clients_show(struct device *dev,
   1210			    struct device_attribute *attr, char *buf)
   1211{
   1212	struct idxd_device *idxd = confdev_to_idxd(dev);
   1213	int count = 0, i;
   1214
   1215	spin_lock(&idxd->dev_lock);
   1216	for (i = 0; i < idxd->max_wqs; i++) {
   1217		struct idxd_wq *wq = idxd->wqs[i];
   1218
   1219		count += wq->client_count;
   1220	}
   1221	spin_unlock(&idxd->dev_lock);
   1222
   1223	return sysfs_emit(buf, "%d\n", count);
   1224}
   1225static DEVICE_ATTR_RO(clients);
   1226
   1227static ssize_t pasid_enabled_show(struct device *dev,
   1228				  struct device_attribute *attr, char *buf)
   1229{
   1230	struct idxd_device *idxd = confdev_to_idxd(dev);
   1231
   1232	return sysfs_emit(buf, "%u\n", device_pasid_enabled(idxd));
   1233}
   1234static DEVICE_ATTR_RO(pasid_enabled);
   1235
   1236static ssize_t state_show(struct device *dev,
   1237			  struct device_attribute *attr, char *buf)
   1238{
   1239	struct idxd_device *idxd = confdev_to_idxd(dev);
   1240
   1241	switch (idxd->state) {
   1242	case IDXD_DEV_DISABLED:
   1243		return sysfs_emit(buf, "disabled\n");
   1244	case IDXD_DEV_ENABLED:
   1245		return sysfs_emit(buf, "enabled\n");
   1246	case IDXD_DEV_HALTED:
   1247		return sysfs_emit(buf, "halted\n");
   1248	}
   1249
   1250	return sysfs_emit(buf, "unknown\n");
   1251}
   1252static DEVICE_ATTR_RO(state);
   1253
   1254static ssize_t errors_show(struct device *dev,
   1255			   struct device_attribute *attr, char *buf)
   1256{
   1257	struct idxd_device *idxd = confdev_to_idxd(dev);
   1258	int i, out = 0;
   1259
   1260	spin_lock(&idxd->dev_lock);
   1261	for (i = 0; i < 4; i++)
   1262		out += sysfs_emit_at(buf, out, "%#018llx ", idxd->sw_err.bits[i]);
   1263	spin_unlock(&idxd->dev_lock);
   1264	out--;
   1265	out += sysfs_emit_at(buf, out, "\n");
   1266	return out;
   1267}
   1268static DEVICE_ATTR_RO(errors);
   1269
   1270static ssize_t max_read_buffers_show(struct device *dev,
   1271				     struct device_attribute *attr, char *buf)
   1272{
   1273	struct idxd_device *idxd = confdev_to_idxd(dev);
   1274
   1275	return sysfs_emit(buf, "%u\n", idxd->max_rdbufs);
   1276}
   1277
   1278static ssize_t max_tokens_show(struct device *dev,
   1279			       struct device_attribute *attr, char *buf)
   1280{
   1281	dev_warn_once(dev, "attribute deprecated, see max_read_buffers.\n");
   1282	return max_read_buffers_show(dev, attr, buf);
   1283}
   1284
   1285static DEVICE_ATTR_RO(max_tokens);	/* deprecated */
   1286static DEVICE_ATTR_RO(max_read_buffers);
   1287
   1288static ssize_t read_buffer_limit_show(struct device *dev,
   1289				      struct device_attribute *attr, char *buf)
   1290{
   1291	struct idxd_device *idxd = confdev_to_idxd(dev);
   1292
   1293	return sysfs_emit(buf, "%u\n", idxd->rdbuf_limit);
   1294}
   1295
   1296static ssize_t token_limit_show(struct device *dev,
   1297				struct device_attribute *attr, char *buf)
   1298{
   1299	dev_warn_once(dev, "attribute deprecated, see read_buffer_limit.\n");
   1300	return read_buffer_limit_show(dev, attr, buf);
   1301}
   1302
   1303static ssize_t read_buffer_limit_store(struct device *dev,
   1304				       struct device_attribute *attr,
   1305				       const char *buf, size_t count)
   1306{
   1307	struct idxd_device *idxd = confdev_to_idxd(dev);
   1308	unsigned long val;
   1309	int rc;
   1310
   1311	rc = kstrtoul(buf, 10, &val);
   1312	if (rc < 0)
   1313		return -EINVAL;
   1314
   1315	if (idxd->state == IDXD_DEV_ENABLED)
   1316		return -EPERM;
   1317
   1318	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
   1319		return -EPERM;
   1320
   1321	if (!idxd->hw.group_cap.rdbuf_limit)
   1322		return -EPERM;
   1323
   1324	if (val > idxd->hw.group_cap.total_rdbufs)
   1325		return -EINVAL;
   1326
   1327	idxd->rdbuf_limit = val;
   1328	return count;
   1329}
   1330
   1331static ssize_t token_limit_store(struct device *dev,
   1332				 struct device_attribute *attr,
   1333				 const char *buf, size_t count)
   1334{
   1335	dev_warn_once(dev, "attribute deprecated, see read_buffer_limit\n");
   1336	return read_buffer_limit_store(dev, attr, buf, count);
   1337}
   1338
   1339static DEVICE_ATTR_RW(token_limit);	/* deprecated */
   1340static DEVICE_ATTR_RW(read_buffer_limit);
   1341
   1342static ssize_t cdev_major_show(struct device *dev,
   1343			       struct device_attribute *attr, char *buf)
   1344{
   1345	struct idxd_device *idxd = confdev_to_idxd(dev);
   1346
   1347	return sysfs_emit(buf, "%u\n", idxd->major);
   1348}
   1349static DEVICE_ATTR_RO(cdev_major);
   1350
   1351static ssize_t cmd_status_show(struct device *dev,
   1352			       struct device_attribute *attr, char *buf)
   1353{
   1354	struct idxd_device *idxd = confdev_to_idxd(dev);
   1355
   1356	return sysfs_emit(buf, "%#x\n", idxd->cmd_status);
   1357}
   1358
   1359static ssize_t cmd_status_store(struct device *dev, struct device_attribute *attr,
   1360				const char *buf, size_t count)
   1361{
   1362	struct idxd_device *idxd = confdev_to_idxd(dev);
   1363
   1364	idxd->cmd_status = 0;
   1365	return count;
   1366}
   1367static DEVICE_ATTR_RW(cmd_status);
   1368
   1369static struct attribute *idxd_device_attributes[] = {
   1370	&dev_attr_version.attr,
   1371	&dev_attr_max_groups.attr,
   1372	&dev_attr_max_work_queues.attr,
   1373	&dev_attr_max_work_queues_size.attr,
   1374	&dev_attr_max_engines.attr,
   1375	&dev_attr_numa_node.attr,
   1376	&dev_attr_max_batch_size.attr,
   1377	&dev_attr_max_transfer_size.attr,
   1378	&dev_attr_op_cap.attr,
   1379	&dev_attr_gen_cap.attr,
   1380	&dev_attr_configurable.attr,
   1381	&dev_attr_clients.attr,
   1382	&dev_attr_pasid_enabled.attr,
   1383	&dev_attr_state.attr,
   1384	&dev_attr_errors.attr,
   1385	&dev_attr_max_tokens.attr,
   1386	&dev_attr_max_read_buffers.attr,
   1387	&dev_attr_token_limit.attr,
   1388	&dev_attr_read_buffer_limit.attr,
   1389	&dev_attr_cdev_major.attr,
   1390	&dev_attr_cmd_status.attr,
   1391	NULL,
   1392};
   1393
   1394static const struct attribute_group idxd_device_attribute_group = {
   1395	.attrs = idxd_device_attributes,
   1396};
   1397
   1398static const struct attribute_group *idxd_attribute_groups[] = {
   1399	&idxd_device_attribute_group,
   1400	NULL,
   1401};
   1402
   1403static void idxd_conf_device_release(struct device *dev)
   1404{
   1405	struct idxd_device *idxd = confdev_to_idxd(dev);
   1406
   1407	kfree(idxd->groups);
   1408	kfree(idxd->wqs);
   1409	kfree(idxd->engines);
   1410	ida_free(&idxd_ida, idxd->id);
   1411	kfree(idxd);
   1412}
   1413
   1414struct device_type dsa_device_type = {
   1415	.name = "dsa",
   1416	.release = idxd_conf_device_release,
   1417	.groups = idxd_attribute_groups,
   1418};
   1419
   1420struct device_type iax_device_type = {
   1421	.name = "iax",
   1422	.release = idxd_conf_device_release,
   1423	.groups = idxd_attribute_groups,
   1424};
   1425
   1426static int idxd_register_engine_devices(struct idxd_device *idxd)
   1427{
   1428	struct idxd_engine *engine;
   1429	int i, j, rc;
   1430
   1431	for (i = 0; i < idxd->max_engines; i++) {
   1432		engine = idxd->engines[i];
   1433		rc = device_add(engine_confdev(engine));
   1434		if (rc < 0)
   1435			goto cleanup;
   1436	}
   1437
   1438	return 0;
   1439
   1440cleanup:
   1441	j = i - 1;
   1442	for (; i < idxd->max_engines; i++) {
   1443		engine = idxd->engines[i];
   1444		put_device(engine_confdev(engine));
   1445	}
   1446
   1447	while (j--) {
   1448		engine = idxd->engines[j];
   1449		device_unregister(engine_confdev(engine));
   1450	}
   1451	return rc;
   1452}
   1453
   1454static int idxd_register_group_devices(struct idxd_device *idxd)
   1455{
   1456	struct idxd_group *group;
   1457	int i, j, rc;
   1458
   1459	for (i = 0; i < idxd->max_groups; i++) {
   1460		group = idxd->groups[i];
   1461		rc = device_add(group_confdev(group));
   1462		if (rc < 0)
   1463			goto cleanup;
   1464	}
   1465
   1466	return 0;
   1467
   1468cleanup:
   1469	j = i - 1;
   1470	for (; i < idxd->max_groups; i++) {
   1471		group = idxd->groups[i];
   1472		put_device(group_confdev(group));
   1473	}
   1474
   1475	while (j--) {
   1476		group = idxd->groups[j];
   1477		device_unregister(group_confdev(group));
   1478	}
   1479	return rc;
   1480}
   1481
   1482static int idxd_register_wq_devices(struct idxd_device *idxd)
   1483{
   1484	struct idxd_wq *wq;
   1485	int i, rc, j;
   1486
   1487	for (i = 0; i < idxd->max_wqs; i++) {
   1488		wq = idxd->wqs[i];
   1489		rc = device_add(wq_confdev(wq));
   1490		if (rc < 0)
   1491			goto cleanup;
   1492	}
   1493
   1494	return 0;
   1495
   1496cleanup:
   1497	j = i - 1;
   1498	for (; i < idxd->max_wqs; i++) {
   1499		wq = idxd->wqs[i];
   1500		put_device(wq_confdev(wq));
   1501	}
   1502
   1503	while (j--) {
   1504		wq = idxd->wqs[j];
   1505		device_unregister(wq_confdev(wq));
   1506	}
   1507	return rc;
   1508}
   1509
   1510int idxd_register_devices(struct idxd_device *idxd)
   1511{
   1512	struct device *dev = &idxd->pdev->dev;
   1513	int rc, i;
   1514
   1515	rc = device_add(idxd_confdev(idxd));
   1516	if (rc < 0)
   1517		return rc;
   1518
   1519	rc = idxd_register_wq_devices(idxd);
   1520	if (rc < 0) {
   1521		dev_dbg(dev, "WQ devices registering failed: %d\n", rc);
   1522		goto err_wq;
   1523	}
   1524
   1525	rc = idxd_register_engine_devices(idxd);
   1526	if (rc < 0) {
   1527		dev_dbg(dev, "Engine devices registering failed: %d\n", rc);
   1528		goto err_engine;
   1529	}
   1530
   1531	rc = idxd_register_group_devices(idxd);
   1532	if (rc < 0) {
   1533		dev_dbg(dev, "Group device registering failed: %d\n", rc);
   1534		goto err_group;
   1535	}
   1536
   1537	return 0;
   1538
   1539 err_group:
   1540	for (i = 0; i < idxd->max_engines; i++)
   1541		device_unregister(engine_confdev(idxd->engines[i]));
   1542 err_engine:
   1543	for (i = 0; i < idxd->max_wqs; i++)
   1544		device_unregister(wq_confdev(idxd->wqs[i]));
   1545 err_wq:
   1546	device_del(idxd_confdev(idxd));
   1547	return rc;
   1548}
   1549
   1550void idxd_unregister_devices(struct idxd_device *idxd)
   1551{
   1552	int i;
   1553
   1554	for (i = 0; i < idxd->max_wqs; i++) {
   1555		struct idxd_wq *wq = idxd->wqs[i];
   1556
   1557		device_unregister(wq_confdev(wq));
   1558	}
   1559
   1560	for (i = 0; i < idxd->max_engines; i++) {
   1561		struct idxd_engine *engine = idxd->engines[i];
   1562
   1563		device_unregister(engine_confdev(engine));
   1564	}
   1565
   1566	for (i = 0; i < idxd->max_groups; i++) {
   1567		struct idxd_group *group = idxd->groups[i];
   1568
   1569		device_unregister(group_confdev(group));
   1570	}
   1571}
   1572
   1573int idxd_register_bus_type(void)
   1574{
   1575	return bus_register(&dsa_bus_type);
   1576}
   1577
   1578void idxd_unregister_bus_type(void)
   1579{
   1580	bus_unregister(&dsa_bus_type);
   1581}