Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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 <giovanni.cabiddu@intel.com>
Reviewed-by: Adam Guerin <adam.guerin@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Giovanni Cabiddu and committed by
Herbert Xu
10484c64 52f9a284

+62 -42
+62 -42
drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
··· 11 11 #include "adf_4xxx_hw_data.h" 12 12 #include "icp_qat_hw.h" 13 13 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, 26 + }; 27 + 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, 33 + }; 34 + 14 35 struct adf_fw_config { 15 36 u32 ae_mask; 16 - const char *obj_name; 37 + enum adf_fw_objs obj; 17 38 }; 18 39 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}, 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}, 23 44 }; 24 45 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}, 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}, 29 50 }; 30 51 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}, 35 - }; 36 - 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}, 41 - }; 52 + static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_dc_config)); 42 53 43 54 /* Worker thread to service arbiter mappings */ 44 55 static const u32 thrd_to_arb_map_cy[ADF_4XXX_MAX_ACCELENGINES] = { ··· 315 304 316 305 static u32 uof_get_num_objs(void) 317 306 { 318 - BUILD_BUG_ON_MSG(ARRAY_SIZE(adf_4xxx_fw_cy_config) != 319 - ARRAY_SIZE(adf_4xxx_fw_dc_config), 320 - "Size mismatch between adf_4xxx_fw_*_config arrays"); 307 + return ARRAY_SIZE(adf_fw_cy_config); 308 + } 321 309 322 - return ARRAY_SIZE(adf_4xxx_fw_cy_config); 310 + static const char *uof_get_name(struct adf_accel_dev *accel_dev, u32 obj_num, 311 + const char * const fw_objs[], int num_objs) 312 + { 313 + int id; 314 + 315 + switch (get_service_enabled(accel_dev)) { 316 + case SVC_CY: 317 + id = adf_fw_cy_config[obj_num].obj; 318 + break; 319 + case SVC_DC: 320 + id = adf_fw_dc_config[obj_num].obj; 321 + break; 322 + default: 323 + id = -EINVAL; 324 + break; 325 + } 326 + 327 + if (id < 0 || id > num_objs) 328 + return NULL; 329 + 330 + return fw_objs[id]; 323 331 } 324 332 325 333 static const char *uof_get_name_4xxx(struct adf_accel_dev *accel_dev, u32 obj_num) 326 334 { 327 - switch (get_service_enabled(accel_dev)) { 328 - case SVC_CY: 329 - return adf_4xxx_fw_cy_config[obj_num].obj_name; 330 - case SVC_DC: 331 - return adf_4xxx_fw_dc_config[obj_num].obj_name; 332 - default: 333 - return NULL; 334 - } 335 + int num_fw_objs = ARRAY_SIZE(adf_4xxx_fw_objs); 336 + 337 + return uof_get_name(accel_dev, obj_num, adf_4xxx_fw_objs, num_fw_objs); 335 338 } 336 339 337 340 static const char *uof_get_name_402xx(struct adf_accel_dev *accel_dev, u32 obj_num) 338 341 { 339 - switch (get_service_enabled(accel_dev)) { 340 - case SVC_CY: 341 - return adf_402xx_fw_cy_config[obj_num].obj_name; 342 - case SVC_DC: 343 - return adf_402xx_fw_dc_config[obj_num].obj_name; 344 - default: 345 - return NULL; 346 - } 342 + int num_fw_objs = ARRAY_SIZE(adf_402xx_fw_objs); 343 + 344 + return uof_get_name(accel_dev, obj_num, adf_402xx_fw_objs, num_fw_objs); 347 345 } 348 346 349 347 static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num) 350 348 { 351 349 switch (get_service_enabled(accel_dev)) { 352 350 case SVC_CY: 353 - return adf_4xxx_fw_cy_config[obj_num].ae_mask; 351 + return adf_fw_cy_config[obj_num].ae_mask; 354 352 case SVC_DC: 355 - return adf_4xxx_fw_dc_config[obj_num].ae_mask; 353 + return adf_fw_dc_config[obj_num].ae_mask; 356 354 default: 357 355 return 0; 358 356 }