Torsten Duwe b101f0
From d4cfb144f60551d80732c93c892fe76fc8df860d Mon Sep 17 00:00:00 2001
Torsten Duwe b101f0
From: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe b101f0
Date: Mon, 27 Jun 2022 09:36:52 +0100
Torsten Duwe b101f0
Subject: [PATCH] crypto: qat - expose device config through sysfs for 4xxx
Torsten Duwe b101f0
Git-commit: d4cfb144f60551d80732c93c892fe76fc8df860d
Torsten Duwe b101f0
Patch-mainline: v6.0-rc1
Torsten Duwe b101f0
References: jsc#PED-1073
Torsten Duwe b101f0
Torsten Duwe b101f0
qat_4xxx devices can be configured to allow either crypto or compression
Torsten Duwe b101f0
operations. At the moment, devices are configured statically according to
Torsten Duwe b101f0
the following rule:
Torsten Duwe b101f0
- odd numbered devices assigned to compression services
Torsten Duwe b101f0
- even numbered devices assigned to crypto services
Torsten Duwe b101f0
Torsten Duwe b101f0
Expose the sysfs attribute /sys/bus/pci/devices/<BDF>/qat/cfg_services
Torsten Duwe b101f0
to allow to detect the configuration of a device and to change it.
Torsten Duwe b101f0
Torsten Duwe b101f0
The `cfg_service` attribute is only exposed for qat_4xxx devices and it
Torsten Duwe b101f0
is limited to two configurations: (1) "sym;asym" for crypto services and
Torsten Duwe b101f0
"dc" for compression services.
Torsten Duwe b101f0
Torsten Duwe b101f0
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe b101f0
Co-developed-by: Tomasz Kowallik <tomaszx.kowalik@intel.com>
Torsten Duwe b101f0
Signed-off-by: Tomasz Kowallik <tomaszx.kowalik@intel.com>
Torsten Duwe b101f0
Reviewed-by: Adam Guerin <adam.guerin@intel.com>
Torsten Duwe b101f0
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe b101f0
Reviewed-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Torsten Duwe b101f0
Reviewed-by: Vladis Dronov <vdronov@redhat.com>
Torsten Duwe b101f0
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe b101f0
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe b101f0
Torsten Duwe b101f0
---
Torsten Duwe b101f0
 Documentation/ABI/testing/sysfs-driver-qat | 39 +++++++++++
Torsten Duwe b101f0
 drivers/crypto/qat/qat_common/adf_sysfs.c  | 80 ++++++++++++++++++++--
Torsten Duwe b101f0
 2 files changed, 115 insertions(+), 4 deletions(-)
Torsten Duwe b101f0
Torsten Duwe b101f0
diff --git a/Documentation/ABI/testing/sysfs-driver-qat b/Documentation/ABI/testing/sysfs-driver-qat
Torsten Duwe b101f0
index 769b09cefa897..a600531e95628 100644
Torsten Duwe b101f0
--- a/Documentation/ABI/testing/sysfs-driver-qat
Torsten Duwe b101f0
+++ b/Documentation/ABI/testing/sysfs-driver-qat
Torsten Duwe b101f0
@@ -19,3 +19,42 @@ Description:	Reports the current state of the QAT device and allows to
Torsten Duwe b101f0
 		if the device is up and vice versa.
Torsten Duwe b101f0
 
Torsten Duwe b101f0
 		This attribute is only available for qat_4xxx devices.
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+What:		/sys/bus/pci/devices/<BDF>/qat/cfg_services
Torsten Duwe b101f0
+Date:		June 2022
Torsten Duwe b101f0
+KernelVersion:	5.20
Torsten Duwe b101f0
+Contact:	qat-linux@intel.com
Torsten Duwe b101f0
+Description:	Reports the current configuration of the QAT device and allows
Torsten Duwe b101f0
+		to change it.
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+		This attribute is RW.
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+		Returned values:
Torsten Duwe b101f0
+			sym;asym:	the device is configured for running
Torsten Duwe b101f0
+					crypto services
Torsten Duwe b101f0
+			dc:		the device is configured for running
Torsten Duwe b101f0
+					compression services
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+		Allowed values:
Torsten Duwe b101f0
+			sym;asym:	configure the device for running
Torsten Duwe b101f0
+					crypto services
Torsten Duwe b101f0
+			dc:		configure the device for running
Torsten Duwe b101f0
+					compression services
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+		It is possible to set the configuration only if the device
Torsten Duwe b101f0
+		is in the `down` state (see /sys/bus/pci/devices/<BDF>/qat/state)
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+		The following example shows how to change the configuration of
Torsten Duwe b101f0
+		a device configured for running crypto services in order to
Torsten Duwe b101f0
+		run data compression:
Torsten Duwe b101f0
+			# cat /sys/bus/pci/devices/<BDF>/qat/state
Torsten Duwe b101f0
+			up
Torsten Duwe b101f0
+			# cat /sys/bus/pci/devices/<BDF>/qat/cfg_services
Torsten Duwe b101f0
+			sym;asym
Torsten Duwe b101f0
+			# echo down > /sys/bus/pci/devices/<BDF>/qat/state
Torsten Duwe b101f0
+			# echo dc > /sys/bus/pci/devices/<BDF>/qat/cfg_services
Torsten Duwe b101f0
+			# echo up > /sys/bus/pci/devices/<BDF>/qat/state
Torsten Duwe b101f0
+			# cat /sys/bus/pci/devices/<BDF>/qat/cfg_services
Torsten Duwe b101f0
+			dc
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+		This attribute is only available for qat_4xxx devices.
Torsten Duwe b101f0
diff --git a/drivers/crypto/qat/qat_common/adf_sysfs.c b/drivers/crypto/qat/qat_common/adf_sysfs.c
Torsten Duwe b101f0
index 8f47a5694dd70..e8b078e719c20 100644
Torsten Duwe b101f0
--- a/drivers/crypto/qat/qat_common/adf_sysfs.c
Torsten Duwe b101f0
+++ b/drivers/crypto/qat/qat_common/adf_sysfs.c
Torsten Duwe b101f0
@@ -58,8 +58,9 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
Torsten Duwe b101f0
 
Torsten Duwe b101f0
 		dev_info(dev, "Stopping device qat_dev%d\n", accel_id);
Torsten Duwe b101f0
 
Torsten Duwe b101f0
-		adf_dev_stop(accel_dev);
Torsten Duwe b101f0
-		adf_dev_shutdown(accel_dev);
Torsten Duwe b101f0
+		ret = adf_dev_shutdown_cache_cfg(accel_dev);
Torsten Duwe b101f0
+		if (ret < 0)
Torsten Duwe b101f0
+			return -EINVAL;
Torsten Duwe b101f0
 
Torsten Duwe b101f0
 		break;
Torsten Duwe b101f0
 	case DEV_UP:
Torsten Duwe b101f0
@@ -80,8 +81,7 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
Torsten Duwe b101f0
 		if (ret < 0) {
Torsten Duwe b101f0
 			dev_err(dev, "Failed to start device qat_dev%d\n",
Torsten Duwe b101f0
 				accel_id);
Torsten Duwe b101f0
-			adf_dev_stop(accel_dev);
Torsten Duwe b101f0
-			adf_dev_shutdown(accel_dev);
Torsten Duwe b101f0
+			adf_dev_shutdown_cache_cfg(accel_dev);
Torsten Duwe b101f0
 			return ret;
Torsten Duwe b101f0
 		}
Torsten Duwe b101f0
 		break;
Torsten Duwe b101f0
@@ -92,10 +92,82 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
Torsten Duwe b101f0
 	return count;
Torsten Duwe b101f0
 }
Torsten Duwe b101f0
 
Torsten Duwe b101f0
+static const char * const services_operations[] = {
Torsten Duwe b101f0
+	ADF_CFG_CY,
Torsten Duwe b101f0
+	ADF_CFG_DC,
Torsten Duwe b101f0
+};
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+static ssize_t cfg_services_show(struct device *dev, struct device_attribute *attr,
Torsten Duwe b101f0
+				 char *buf)
Torsten Duwe b101f0
+{
Torsten Duwe b101f0
+	char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
Torsten Duwe b101f0
+	struct adf_accel_dev *accel_dev;
Torsten Duwe b101f0
+	int ret;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
Torsten Duwe b101f0
+	if (!accel_dev)
Torsten Duwe b101f0
+		return -EINVAL;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
Torsten Duwe b101f0
+				      ADF_SERVICES_ENABLED, services);
Torsten Duwe b101f0
+	if (ret)
Torsten Duwe b101f0
+		return ret;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	return sysfs_emit(buf, "%s\n", services);
Torsten Duwe b101f0
+}
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+static int adf_sysfs_update_dev_config(struct adf_accel_dev *accel_dev,
Torsten Duwe b101f0
+				       const char *services)
Torsten Duwe b101f0
+{
Torsten Duwe b101f0
+	return adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
Torsten Duwe b101f0
+					   ADF_SERVICES_ENABLED, services,
Torsten Duwe b101f0
+					   ADF_STR);
Torsten Duwe b101f0
+}
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+static ssize_t cfg_services_store(struct device *dev, struct device_attribute *attr,
Torsten Duwe b101f0
+				  const char *buf, size_t count)
Torsten Duwe b101f0
+{
Torsten Duwe b101f0
+	struct adf_hw_device_data *hw_data;
Torsten Duwe b101f0
+	struct adf_accel_dev *accel_dev;
Torsten Duwe b101f0
+	int ret;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	ret = sysfs_match_string(services_operations, buf);
Torsten Duwe b101f0
+	if (ret < 0)
Torsten Duwe b101f0
+		return ret;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
Torsten Duwe b101f0
+	if (!accel_dev)
Torsten Duwe b101f0
+		return -EINVAL;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	if (adf_dev_started(accel_dev)) {
Torsten Duwe b101f0
+		dev_info(dev, "Device qat_dev%d must be down to reconfigure the service.\n",
Torsten Duwe b101f0
+			 accel_dev->accel_id);
Torsten Duwe b101f0
+		return -EINVAL;
Torsten Duwe b101f0
+	}
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	ret = adf_sysfs_update_dev_config(accel_dev, services_operations[ret]);
Torsten Duwe b101f0
+	if (ret < 0)
Torsten Duwe b101f0
+		return ret;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	hw_data = GET_HW_DATA(accel_dev);
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	/* Update capabilities mask after change in configuration.
Torsten Duwe b101f0
+	 * A call to this function is required as capabilities are, at the
Torsten Duwe b101f0
+	 * moment, tied to configuration
Torsten Duwe b101f0
+	 */
Torsten Duwe b101f0
+	hw_data->accel_capabilities_mask = hw_data->get_accel_cap(accel_dev);
Torsten Duwe b101f0
+	if (!hw_data->accel_capabilities_mask)
Torsten Duwe b101f0
+		return -EINVAL;
Torsten Duwe b101f0
+
Torsten Duwe b101f0
+	return count;
Torsten Duwe b101f0
+}
Torsten Duwe b101f0
+
Torsten Duwe b101f0
 static DEVICE_ATTR_RW(state);
Torsten Duwe b101f0
+static DEVICE_ATTR_RW(cfg_services);
Torsten Duwe b101f0
 
Torsten Duwe b101f0
 static struct attribute *qat_attrs[] = {
Torsten Duwe b101f0
 	&dev_attr_state.attr,
Torsten Duwe b101f0
+	&dev_attr_cfg_services.attr,
Torsten Duwe b101f0
 	NULL,
Torsten Duwe b101f0
 };
Torsten Duwe b101f0
 
Torsten Duwe b101f0
-- 
Torsten Duwe b101f0
2.35.3
Torsten Duwe b101f0