1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

crypto: qat - expose device config through sysfs for 4xxx

qat_4xxx devices can be configured to allow either crypto or compression
operations. At the moment, devices are configured statically according to
the following rule:
- odd numbered devices assigned to compression services
- even numbered devices assigned to crypto services

Expose the sysfs attribute /sys/bus/pci/devices/<BDF>/qat/cfg_services
to allow to detect the configuration of a device and to change it.

The `cfg_service` attribute is only exposed for qat_4xxx devices and it
is limited to two configurations: (1) "sym;asym" for crypto services and
"dc" for compression services.

Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Co-developed-by: Tomasz Kowallik <tomaszx.kowalik@intel.com>
Signed-off-by: Tomasz Kowallik <tomaszx.kowalik@intel.com>
Reviewed-by: Adam Guerin <adam.guerin@intel.com>
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Reviewed-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Reviewed-by: Vladis Dronov <vdronov@redhat.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Giovanni Cabiddu 2022-06-27 09:36:52 +01:00 committed by Herbert Xu
parent 16c1ed95d1
commit d4cfb144f6
2 changed files with 115 additions and 4 deletions

View file

@ -19,3 +19,42 @@ Description: Reports the current state of the QAT device and allows to
if the device is up and vice versa. if the device is up and vice versa.
This attribute is only available for qat_4xxx devices. This attribute is only available for qat_4xxx devices.
What: /sys/bus/pci/devices/<BDF>/qat/cfg_services
Date: June 2022
KernelVersion: 5.20
Contact: qat-linux@intel.com
Description: Reports the current configuration of the QAT device and allows
to change it.
This attribute is RW.
Returned values:
sym;asym: the device is configured for running
crypto services
dc: the device is configured for running
compression services
Allowed values:
sym;asym: configure the device for running
crypto services
dc: configure the device for running
compression services
It is possible to set the configuration only if the device
is in the `down` state (see /sys/bus/pci/devices/<BDF>/qat/state)
The following example shows how to change the configuration of
a device configured for running crypto services in order to
run data compression:
# cat /sys/bus/pci/devices/<BDF>/qat/state
up
# cat /sys/bus/pci/devices/<BDF>/qat/cfg_services
sym;asym
# echo down > /sys/bus/pci/devices/<BDF>/qat/state
# echo dc > /sys/bus/pci/devices/<BDF>/qat/cfg_services
# echo up > /sys/bus/pci/devices/<BDF>/qat/state
# cat /sys/bus/pci/devices/<BDF>/qat/cfg_services
dc
This attribute is only available for qat_4xxx devices.

View file

@ -58,8 +58,9 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
dev_info(dev, "Stopping device qat_dev%d\n", accel_id); dev_info(dev, "Stopping device qat_dev%d\n", accel_id);
adf_dev_stop(accel_dev); ret = adf_dev_shutdown_cache_cfg(accel_dev);
adf_dev_shutdown(accel_dev); if (ret < 0)
return -EINVAL;
break; break;
case DEV_UP: case DEV_UP:
@ -80,8 +81,7 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
if (ret < 0) { if (ret < 0) {
dev_err(dev, "Failed to start device qat_dev%d\n", dev_err(dev, "Failed to start device qat_dev%d\n",
accel_id); accel_id);
adf_dev_stop(accel_dev); adf_dev_shutdown_cache_cfg(accel_dev);
adf_dev_shutdown(accel_dev);
return ret; return ret;
} }
break; break;
@ -92,10 +92,82 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
return count; return count;
} }
static const char * const services_operations[] = {
ADF_CFG_CY,
ADF_CFG_DC,
};
static ssize_t cfg_services_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
struct adf_accel_dev *accel_dev;
int ret;
accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
if (!accel_dev)
return -EINVAL;
ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
ADF_SERVICES_ENABLED, services);
if (ret)
return ret;
return sysfs_emit(buf, "%s\n", services);
}
static int adf_sysfs_update_dev_config(struct adf_accel_dev *accel_dev,
const char *services)
{
return adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
ADF_SERVICES_ENABLED, services,
ADF_STR);
}
static ssize_t cfg_services_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct adf_hw_device_data *hw_data;
struct adf_accel_dev *accel_dev;
int ret;
ret = sysfs_match_string(services_operations, buf);
if (ret < 0)
return ret;
accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
if (!accel_dev)
return -EINVAL;
if (adf_dev_started(accel_dev)) {
dev_info(dev, "Device qat_dev%d must be down to reconfigure the service.\n",
accel_dev->accel_id);
return -EINVAL;
}
ret = adf_sysfs_update_dev_config(accel_dev, services_operations[ret]);
if (ret < 0)
return ret;
hw_data = GET_HW_DATA(accel_dev);
/* Update capabilities mask after change in configuration.
* A call to this function is required as capabilities are, at the
* moment, tied to configuration
*/
hw_data->accel_capabilities_mask = hw_data->get_accel_cap(accel_dev);
if (!hw_data->accel_capabilities_mask)
return -EINVAL;
return count;
}
static DEVICE_ATTR_RW(state); static DEVICE_ATTR_RW(state);
static DEVICE_ATTR_RW(cfg_services);
static struct attribute *qat_attrs[] = { static struct attribute *qat_attrs[] = {
&dev_attr_state.attr, &dev_attr_state.attr,
&dev_attr_cfg_services.attr,
NULL, NULL,
}; };