Skip to content

Commit 10484c6

Browse files
gcabidduherbertx
authored andcommitted
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: Giovanni Cabiddu <[email protected]> Reviewed-by: Adam Guerin <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 52f9a28 commit 10484c6

File tree

1 file changed

+58
-38
lines changed

1 file changed

+58
-38
lines changed

drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c

Lines changed: 58 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,46 @@
1111
#include "adf_4xxx_hw_data.h"
1212
#include "icp_qat_hw.h"
1313

14-
struct adf_fw_config {
15-
u32 ae_mask;
16-
const char *obj_name;
14+
enum adf_fw_objs {
15+
ADF_FW_SYM_OBJ,
16+
ADF_FW_ASYM_OBJ,
17+
ADF_FW_DC_OBJ,
18+
ADF_FW_ADMIN_OBJ,
19+
};
20+
21+
static const char * const adf_4xxx_fw_objs[] = {
22+
[ADF_FW_SYM_OBJ] = ADF_4XXX_SYM_OBJ,
23+
[ADF_FW_ASYM_OBJ] = ADF_4XXX_ASYM_OBJ,
24+
[ADF_FW_DC_OBJ] = ADF_4XXX_DC_OBJ,
25+
[ADF_FW_ADMIN_OBJ] = ADF_4XXX_ADMIN_OBJ,
1726
};
1827

19-
static struct adf_fw_config adf_4xxx_fw_cy_config[] = {
20-
{0xF0, ADF_4XXX_SYM_OBJ},
21-
{0xF, ADF_4XXX_ASYM_OBJ},
22-
{0x100, ADF_4XXX_ADMIN_OBJ},
28+
static const char * const adf_402xx_fw_objs[] = {
29+
[ADF_FW_SYM_OBJ] = ADF_402XX_SYM_OBJ,
30+
[ADF_FW_ASYM_OBJ] = ADF_402XX_ASYM_OBJ,
31+
[ADF_FW_DC_OBJ] = ADF_402XX_DC_OBJ,
32+
[ADF_FW_ADMIN_OBJ] = ADF_402XX_ADMIN_OBJ,
2333
};
2434

25-
static struct adf_fw_config adf_4xxx_fw_dc_config[] = {
26-
{0xF0, ADF_4XXX_DC_OBJ},
27-
{0xF, ADF_4XXX_DC_OBJ},
28-
{0x100, ADF_4XXX_ADMIN_OBJ},
35+
struct adf_fw_config {
36+
u32 ae_mask;
37+
enum adf_fw_objs obj;
2938
};
3039

31-
static struct adf_fw_config adf_402xx_fw_cy_config[] = {
32-
{0xF0, ADF_402XX_SYM_OBJ},
33-
{0xF, ADF_402XX_ASYM_OBJ},
34-
{0x100, ADF_402XX_ADMIN_OBJ},
40+
static const struct adf_fw_config adf_fw_cy_config[] = {
41+
{0xF0, ADF_FW_SYM_OBJ},
42+
{0xF, ADF_FW_ASYM_OBJ},
43+
{0x100, ADF_FW_ADMIN_OBJ},
3544
};
3645

37-
static struct adf_fw_config adf_402xx_fw_dc_config[] = {
38-
{0xF0, ADF_402XX_DC_OBJ},
39-
{0xF, ADF_402XX_DC_OBJ},
40-
{0x100, ADF_402XX_ADMIN_OBJ},
46+
static const struct adf_fw_config adf_fw_dc_config[] = {
47+
{0xF0, ADF_FW_DC_OBJ},
48+
{0xF, ADF_FW_DC_OBJ},
49+
{0x100, ADF_FW_ADMIN_OBJ},
4150
};
4251

52+
static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_dc_config));
53+
4354
/* Worker thread to service arbiter mappings */
4455
static const u32 thrd_to_arb_map_cy[ADF_4XXX_MAX_ACCELENGINES] = {
4556
0x5555555, 0x5555555, 0x5555555, 0x5555555,
@@ -304,44 +315,53 @@ static int adf_init_device(struct adf_accel_dev *accel_dev)
304315

305316
static u32 uof_get_num_objs(void)
306317
{
307-
BUILD_BUG_ON_MSG(ARRAY_SIZE(adf_4xxx_fw_cy_config) !=
308-
ARRAY_SIZE(adf_4xxx_fw_dc_config),
309-
"Size mismatch between adf_4xxx_fw_*_config arrays");
310-
311-
return ARRAY_SIZE(adf_4xxx_fw_cy_config);
318+
return ARRAY_SIZE(adf_fw_cy_config);
312319
}
313320

314-
static const char *uof_get_name_4xxx(struct adf_accel_dev *accel_dev, u32 obj_num)
321+
static const char *uof_get_name(struct adf_accel_dev *accel_dev, u32 obj_num,
322+
const char * const fw_objs[], int num_objs)
315323
{
324+
int id;
325+
316326
switch (get_service_enabled(accel_dev)) {
317327
case SVC_CY:
318-
return adf_4xxx_fw_cy_config[obj_num].obj_name;
328+
id = adf_fw_cy_config[obj_num].obj;
329+
break;
319330
case SVC_DC:
320-
return adf_4xxx_fw_dc_config[obj_num].obj_name;
331+
id = adf_fw_dc_config[obj_num].obj;
332+
break;
321333
default:
322-
return NULL;
334+
id = -EINVAL;
335+
break;
323336
}
337+
338+
if (id < 0 || id > num_objs)
339+
return NULL;
340+
341+
return fw_objs[id];
342+
}
343+
344+
static const char *uof_get_name_4xxx(struct adf_accel_dev *accel_dev, u32 obj_num)
345+
{
346+
int num_fw_objs = ARRAY_SIZE(adf_4xxx_fw_objs);
347+
348+
return uof_get_name(accel_dev, obj_num, adf_4xxx_fw_objs, num_fw_objs);
324349
}
325350

326351
static const char *uof_get_name_402xx(struct adf_accel_dev *accel_dev, u32 obj_num)
327352
{
328-
switch (get_service_enabled(accel_dev)) {
329-
case SVC_CY:
330-
return adf_402xx_fw_cy_config[obj_num].obj_name;
331-
case SVC_DC:
332-
return adf_402xx_fw_dc_config[obj_num].obj_name;
333-
default:
334-
return NULL;
335-
}
353+
int num_fw_objs = ARRAY_SIZE(adf_402xx_fw_objs);
354+
355+
return uof_get_name(accel_dev, obj_num, adf_402xx_fw_objs, num_fw_objs);
336356
}
337357

338358
static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num)
339359
{
340360
switch (get_service_enabled(accel_dev)) {
341361
case SVC_CY:
342-
return adf_4xxx_fw_cy_config[obj_num].ae_mask;
362+
return adf_fw_cy_config[obj_num].ae_mask;
343363
case SVC_DC:
344-
return adf_4xxx_fw_dc_config[obj_num].ae_mask;
364+
return adf_fw_dc_config[obj_num].ae_mask;
345365
default:
346366
return 0;
347367
}

0 commit comments

Comments
 (0)