Move logic that is common between QAT GEN4 accelerators to the qat_common folder. This includes addresses of CSRs, setters and configuration logic. When moved, functions and defines have been renamed from 4XXX to GEN4. Code specific to the device is moved to the file adf_gen4_hw_data.c. Code related to configuration is moved to the newly created adf_gen4_config.c. This does not introduce any functional change. Signed-off-by: Jie Wang <jie.wang@intel.com> Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
287 lines
6.8 KiB
C
287 lines
6.8 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/* Copyright(c) 2023 Intel Corporation */
|
|
#include "adf_accel_devices.h"
|
|
#include "adf_cfg.h"
|
|
#include "adf_cfg_services.h"
|
|
#include "adf_cfg_strings.h"
|
|
#include "adf_common_drv.h"
|
|
#include "adf_gen4_config.h"
|
|
#include "adf_heartbeat.h"
|
|
#include "adf_transport_access_macros.h"
|
|
#include "qat_compression.h"
|
|
#include "qat_crypto.h"
|
|
|
|
static int adf_crypto_dev_config(struct adf_accel_dev *accel_dev)
|
|
{
|
|
char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
|
|
int banks = GET_MAX_BANKS(accel_dev);
|
|
int cpus = num_online_cpus();
|
|
unsigned long bank, val;
|
|
int instances;
|
|
int ret;
|
|
int i;
|
|
|
|
if (adf_hw_dev_has_crypto(accel_dev))
|
|
instances = min(cpus, banks / 2);
|
|
else
|
|
instances = 0;
|
|
|
|
for (i = 0; i < instances; i++) {
|
|
val = i;
|
|
bank = i * 2;
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_BANK_NUM, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &bank, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
bank += 1;
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_BANK_NUM, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &bank, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
|
|
i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
|
|
val = 128;
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 512;
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 0;
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 0;
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 1;
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 1;
|
|
snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = ADF_COALESCING_DEF_TIME;
|
|
snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
}
|
|
|
|
val = i;
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
|
|
&val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 0;
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
|
|
&val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
return 0;
|
|
err:
|
|
dev_err(&GET_DEV(accel_dev), "Failed to add configuration for crypto\n");
|
|
return ret;
|
|
}
|
|
|
|
static int adf_comp_dev_config(struct adf_accel_dev *accel_dev)
|
|
{
|
|
char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
|
|
int banks = GET_MAX_BANKS(accel_dev);
|
|
int cpus = num_online_cpus();
|
|
unsigned long val;
|
|
int instances;
|
|
int ret;
|
|
int i;
|
|
|
|
if (adf_hw_dev_has_compression(accel_dev))
|
|
instances = min(cpus, banks);
|
|
else
|
|
instances = 0;
|
|
|
|
for (i = 0; i < instances; i++) {
|
|
val = i;
|
|
snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_BANK_NUM, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 512;
|
|
snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_SIZE, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 0;
|
|
snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_TX, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 1;
|
|
snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_RX, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = ADF_COALESCING_DEF_TIME;
|
|
snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
|
|
ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
|
|
key, &val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
}
|
|
|
|
val = i;
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
|
|
&val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
val = 0;
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
|
|
&val, ADF_DEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
return 0;
|
|
err:
|
|
dev_err(&GET_DEV(accel_dev), "Failed to add configuration for compression\n");
|
|
return ret;
|
|
}
|
|
|
|
static int adf_no_dev_config(struct adf_accel_dev *accel_dev)
|
|
{
|
|
unsigned long val;
|
|
int ret;
|
|
|
|
val = 0;
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
|
|
&val, ADF_DEC);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
|
|
&val, ADF_DEC);
|
|
}
|
|
|
|
/**
|
|
* adf_gen4_dev_config() - create dev config required to create instances
|
|
*
|
|
* @accel_dev: Pointer to acceleration device.
|
|
*
|
|
* Function creates device configuration required to create instances
|
|
*
|
|
* Return: 0 on success, error code otherwise.
|
|
*/
|
|
int adf_gen4_dev_config(struct adf_accel_dev *accel_dev)
|
|
{
|
|
char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
|
|
int ret;
|
|
|
|
ret = adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC);
|
|
if (ret)
|
|
goto err;
|
|
|
|
ret = adf_cfg_section_add(accel_dev, "Accelerator0");
|
|
if (ret)
|
|
goto err;
|
|
|
|
ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
|
|
ADF_SERVICES_ENABLED, services);
|
|
if (ret)
|
|
goto err;
|
|
|
|
ret = sysfs_match_string(adf_cfg_services, services);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
switch (ret) {
|
|
case SVC_CY:
|
|
case SVC_CY2:
|
|
ret = adf_crypto_dev_config(accel_dev);
|
|
break;
|
|
case SVC_DC:
|
|
case SVC_DCC:
|
|
ret = adf_comp_dev_config(accel_dev);
|
|
break;
|
|
default:
|
|
ret = adf_no_dev_config(accel_dev);
|
|
break;
|
|
}
|
|
|
|
if (ret)
|
|
goto err;
|
|
|
|
set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
|
|
|
|
return ret;
|
|
|
|
err:
|
|
dev_err(&GET_DEV(accel_dev), "Failed to configure QAT driver\n");
|
|
return ret;
|
|
}
|
|
EXPORT_SYMBOL_GPL(adf_gen4_dev_config);
|
|
|
|
int adf_gen4_cfg_dev_init(struct adf_accel_dev *accel_dev)
|
|
{
|
|
const char *config;
|
|
int ret;
|
|
|
|
config = accel_dev->accel_id % 2 ? ADF_CFG_DC : ADF_CFG_CY;
|
|
|
|
ret = adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
|
|
if (ret)
|
|
return ret;
|
|
|
|
/* Default configuration is crypto only for even devices
|
|
* and compression for odd devices
|
|
*/
|
|
ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
|
|
ADF_SERVICES_ENABLED, config,
|
|
ADF_STR);
|
|
if (ret)
|
|
return ret;
|
|
|
|
adf_heartbeat_save_cfg_param(accel_dev, ADF_CFG_HB_TIMER_MIN_MS);
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(adf_gen4_cfg_dev_init);
|