288 lines
6.8 KiB
C
288 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);
|