crypto/nx: Add sysfs interface to export NX capabilities

Export NX-GZIP capabilities to usrespace in sysfs
/sys/devices/vio/ibm,compression-v1/nx_gzip_caps directory.
These are queried by userspace accelerator libraries to set
minimum length heuristics and maximum limits on request sizes.

NX-GZIP capabilities:
min_compress_len  /*Recommended minimum compress length in bytes*/
min_decompress_len /*Recommended minimum decompress length in bytes*/
req_max_processed_len /* Maximum number of bytes processed in one
			request */

NX will return RMA_Reject if the request buffer size is greater
than req_max_processed_len.

Signed-off-by: Haren Myneni <haren@linux.ibm.com>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Acked-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/510da86abbd904878d5f13d74aba72603c37d783.camel@linux.ibm.com
This commit is contained in:
Haren Myneni 2021-06-17 13:39:08 -07:00 committed by Michael Ellerman
parent b4ba22114c
commit 8c099490fd

View file

@ -967,6 +967,36 @@ static struct attribute_group nx842_attribute_group = {
.attrs = nx842_sysfs_entries,
};
#define nxcop_caps_read(_name) \
static ssize_t nxcop_##_name##_show(struct device *dev, \
struct device_attribute *attr, char *buf) \
{ \
return sprintf(buf, "%lld\n", nx_cop_caps._name); \
}
#define NXCT_ATTR_RO(_name) \
nxcop_caps_read(_name); \
static struct device_attribute dev_attr_##_name = __ATTR(_name, \
0444, \
nxcop_##_name##_show, \
NULL);
NXCT_ATTR_RO(req_max_processed_len);
NXCT_ATTR_RO(min_compress_len);
NXCT_ATTR_RO(min_decompress_len);
static struct attribute *nxcop_caps_sysfs_entries[] = {
&dev_attr_req_max_processed_len.attr,
&dev_attr_min_compress_len.attr,
&dev_attr_min_decompress_len.attr,
NULL,
};
static struct attribute_group nxcop_caps_attr_group = {
.name = "nx_gzip_caps",
.attrs = nxcop_caps_sysfs_entries,
};
static struct nx842_driver nx842_pseries_driver = {
.name = KBUILD_MODNAME,
.owner = THIS_MODULE,
@ -1056,6 +1086,16 @@ static int nx842_probe(struct vio_dev *viodev,
goto error;
}
if (caps_feat) {
if (sysfs_create_group(&viodev->dev.kobj,
&nxcop_caps_attr_group)) {
dev_err(&viodev->dev,
"Could not create sysfs NX capability entries\n");
ret = -1;
goto error;
}
}
return 0;
error_unlock:
@ -1075,6 +1115,9 @@ static void nx842_remove(struct vio_dev *viodev)
pr_info("Removing IBM Power 842 compression device\n");
sysfs_remove_group(&viodev->dev.kobj, &nx842_attribute_group);
if (caps_feat)
sysfs_remove_group(&viodev->dev.kobj, &nxcop_caps_attr_group);
crypto_unregister_alg(&nx842_pseries_alg);
spin_lock_irqsave(&devdata_mutex, flags);