提交 d4cfb144 编写于 作者: G Giovanni Cabiddu 提交者: Herbert Xu

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: NGiovanni Cabiddu <giovanni.cabiddu@intel.com>
Co-developed-by: NTomasz Kowallik <tomaszx.kowalik@intel.com>
Signed-off-by: NTomasz Kowallik <tomaszx.kowalik@intel.com>
Reviewed-by: NAdam Guerin <adam.guerin@intel.com>
Reviewed-by: NFiona Trahe <fiona.trahe@intel.com>
Reviewed-by: NWojciech Ziemba <wojciech.ziemba@intel.com>
Reviewed-by: NVladis Dronov <vdronov@redhat.com>
Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
上级 16c1ed95
...@@ -19,3 +19,42 @@ Description: Reports the current state of the QAT device and allows to ...@@ -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.
...@@ -58,8 +58,9 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr, ...@@ -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, ...@@ -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, ...@@ -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,
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册