Commit 10484c64 authored by Giovanni Cabiddu's avatar Giovanni Cabiddu Committed by Herbert Xu

crypto: qat - refactor fw config logic for 4xxx

The data structure adf_fw_config is used to select which firmware image
is loaded on a certain set of accelerator engines.
When support for 402xx was added, the adf_fw_config arrays were
duplicated in order to select different firmware images.

Since the configurations are the same regardless of the QAT GEN4
flavour, in preparation for adding support for multiple configurations,
refactor the logic that retrieves the firmware names in the 4xxx driver.
The structure adf_fw_config has been changed to contain a firmware object
id that is then mapped to a firmware name depending of the device type.
Signed-off-by: default avatarGiovanni Cabiddu <giovanni.cabiddu@intel.com>
Reviewed-by: default avatarAdam Guerin <adam.guerin@intel.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 52f9a284
...@@ -11,35 +11,46 @@ ...@@ -11,35 +11,46 @@
#include "adf_4xxx_hw_data.h" #include "adf_4xxx_hw_data.h"
#include "icp_qat_hw.h" #include "icp_qat_hw.h"
struct adf_fw_config { enum adf_fw_objs {
u32 ae_mask; ADF_FW_SYM_OBJ,
const char *obj_name; ADF_FW_ASYM_OBJ,
ADF_FW_DC_OBJ,
ADF_FW_ADMIN_OBJ,
};
static const char * const adf_4xxx_fw_objs[] = {
[ADF_FW_SYM_OBJ] = ADF_4XXX_SYM_OBJ,
[ADF_FW_ASYM_OBJ] = ADF_4XXX_ASYM_OBJ,
[ADF_FW_DC_OBJ] = ADF_4XXX_DC_OBJ,
[ADF_FW_ADMIN_OBJ] = ADF_4XXX_ADMIN_OBJ,
}; };
static struct adf_fw_config adf_4xxx_fw_cy_config[] = { static const char * const adf_402xx_fw_objs[] = {
{0xF0, ADF_4XXX_SYM_OBJ}, [ADF_FW_SYM_OBJ] = ADF_402XX_SYM_OBJ,
{0xF, ADF_4XXX_ASYM_OBJ}, [ADF_FW_ASYM_OBJ] = ADF_402XX_ASYM_OBJ,
{0x100, ADF_4XXX_ADMIN_OBJ}, [ADF_FW_DC_OBJ] = ADF_402XX_DC_OBJ,
[ADF_FW_ADMIN_OBJ] = ADF_402XX_ADMIN_OBJ,
}; };
static struct adf_fw_config adf_4xxx_fw_dc_config[] = { struct adf_fw_config {
{0xF0, ADF_4XXX_DC_OBJ}, u32 ae_mask;
{0xF, ADF_4XXX_DC_OBJ}, enum adf_fw_objs obj;
{0x100, ADF_4XXX_ADMIN_OBJ},
}; };
static struct adf_fw_config adf_402xx_fw_cy_config[] = { static const struct adf_fw_config adf_fw_cy_config[] = {
{0xF0, ADF_402XX_SYM_OBJ}, {0xF0, ADF_FW_SYM_OBJ},
{0xF, ADF_402XX_ASYM_OBJ}, {0xF, ADF_FW_ASYM_OBJ},
{0x100, ADF_402XX_ADMIN_OBJ}, {0x100, ADF_FW_ADMIN_OBJ},
}; };
static struct adf_fw_config adf_402xx_fw_dc_config[] = { static const struct adf_fw_config adf_fw_dc_config[] = {
{0xF0, ADF_402XX_DC_OBJ}, {0xF0, ADF_FW_DC_OBJ},
{0xF, ADF_402XX_DC_OBJ}, {0xF, ADF_FW_DC_OBJ},
{0x100, ADF_402XX_ADMIN_OBJ}, {0x100, ADF_FW_ADMIN_OBJ},
}; };
static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_dc_config));
/* Worker thread to service arbiter mappings */ /* Worker thread to service arbiter mappings */
static const u32 thrd_to_arb_map_cy[ADF_4XXX_MAX_ACCELENGINES] = { static const u32 thrd_to_arb_map_cy[ADF_4XXX_MAX_ACCELENGINES] = {
0x5555555, 0x5555555, 0x5555555, 0x5555555, 0x5555555, 0x5555555, 0x5555555, 0x5555555,
...@@ -304,44 +315,53 @@ static int adf_init_device(struct adf_accel_dev *accel_dev) ...@@ -304,44 +315,53 @@ static int adf_init_device(struct adf_accel_dev *accel_dev)
static u32 uof_get_num_objs(void) static u32 uof_get_num_objs(void)
{ {
BUILD_BUG_ON_MSG(ARRAY_SIZE(adf_4xxx_fw_cy_config) != return ARRAY_SIZE(adf_fw_cy_config);
ARRAY_SIZE(adf_4xxx_fw_dc_config),
"Size mismatch between adf_4xxx_fw_*_config arrays");
return ARRAY_SIZE(adf_4xxx_fw_cy_config);
} }
static const char *uof_get_name_4xxx(struct adf_accel_dev *accel_dev, u32 obj_num) static const char *uof_get_name(struct adf_accel_dev *accel_dev, u32 obj_num,
const char * const fw_objs[], int num_objs)
{ {
int id;
switch (get_service_enabled(accel_dev)) { switch (get_service_enabled(accel_dev)) {
case SVC_CY: case SVC_CY:
return adf_4xxx_fw_cy_config[obj_num].obj_name; id = adf_fw_cy_config[obj_num].obj;
break;
case SVC_DC: case SVC_DC:
return adf_4xxx_fw_dc_config[obj_num].obj_name; id = adf_fw_dc_config[obj_num].obj;
break;
default: default:
return NULL; id = -EINVAL;
break;
} }
if (id < 0 || id > num_objs)
return NULL;
return fw_objs[id];
}
static const char *uof_get_name_4xxx(struct adf_accel_dev *accel_dev, u32 obj_num)
{
int num_fw_objs = ARRAY_SIZE(adf_4xxx_fw_objs);
return uof_get_name(accel_dev, obj_num, adf_4xxx_fw_objs, num_fw_objs);
} }
static const char *uof_get_name_402xx(struct adf_accel_dev *accel_dev, u32 obj_num) static const char *uof_get_name_402xx(struct adf_accel_dev *accel_dev, u32 obj_num)
{ {
switch (get_service_enabled(accel_dev)) { int num_fw_objs = ARRAY_SIZE(adf_402xx_fw_objs);
case SVC_CY:
return adf_402xx_fw_cy_config[obj_num].obj_name; return uof_get_name(accel_dev, obj_num, adf_402xx_fw_objs, num_fw_objs);
case SVC_DC:
return adf_402xx_fw_dc_config[obj_num].obj_name;
default:
return NULL;
}
} }
static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num) static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num)
{ {
switch (get_service_enabled(accel_dev)) { switch (get_service_enabled(accel_dev)) {
case SVC_CY: case SVC_CY:
return adf_4xxx_fw_cy_config[obj_num].ae_mask; return adf_fw_cy_config[obj_num].ae_mask;
case SVC_DC: case SVC_DC:
return adf_4xxx_fw_dc_config[obj_num].ae_mask; return adf_fw_dc_config[obj_num].ae_mask;
default: default:
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment