Skip to content

Commit 5005327

Browse files
aguerinIntelherbertx
authored andcommitted
crypto: qat - extend configuration for 4xxx
A QAT GEN4 device can be currently configured for crypto (sym;asym) or compression (dc). This patch extends the configuration to support more variations of these services, download the correct FW images on the device and report the correct capabilities on the device based on the configured service. The device can now be configured with the following services: "sym", "asym", "dc", "sym;asym", "asym;sym", "sym;dc", "dc;sym", "asym;dc", "dc;asym". With this change, the configuration "sym", "asym", "sym;dc", "dc;sym", "asym;dc", "dc;asym" will be accessible only via userspace, i.e. the driver for those configurations will not register into the crypto framework. Support for such configurations in kernel will be enabled in a later patch. The pairs "sym;asym" and "asym;sym" result in identical device config. As do "sym;dc", "dc;sym", and "asym;dc", "dc;asym". Signed-off-by: Adam Guerin <[email protected]> Reviewed-by: Giovanni Cabiddu <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 10484c6 commit 5005327

File tree

5 files changed

+163
-22
lines changed

5 files changed

+163
-22
lines changed

Documentation/ABI/testing/sysfs-driver-qat

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,18 @@ Description: (RW) Reports the current configuration of the QAT device.
2727

2828
* sym;asym: the device is configured for running crypto
2929
services
30+
* asym;sym: identical to sym;asym
3031
* dc: the device is configured for running compression services
32+
* sym: the device is configured for running symmetric crypto
33+
services
34+
* asym: the device is configured for running asymmetric crypto
35+
services
36+
* asym;dc: the device is configured for running asymmetric
37+
crypto services and compression services
38+
* dc;asym: identical to asym;dc
39+
* sym;dc: the device is configured for running symmetric crypto
40+
services and compression services
41+
* dc;sym: identical to sym;dc
3142

3243
It is possible to set the configuration only if the device
3344
is in the `down` state (see /sys/bus/pci/devices/<BDF>/qat/state)

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

Lines changed: 105 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,38 @@ static const struct adf_fw_config adf_fw_dc_config[] = {
4949
{0x100, ADF_FW_ADMIN_OBJ},
5050
};
5151

52+
static const struct adf_fw_config adf_fw_sym_config[] = {
53+
{0xF0, ADF_FW_SYM_OBJ},
54+
{0xF, ADF_FW_SYM_OBJ},
55+
{0x100, ADF_FW_ADMIN_OBJ},
56+
};
57+
58+
static const struct adf_fw_config adf_fw_asym_config[] = {
59+
{0xF0, ADF_FW_ASYM_OBJ},
60+
{0xF, ADF_FW_ASYM_OBJ},
61+
{0x100, ADF_FW_ADMIN_OBJ},
62+
};
63+
64+
static const struct adf_fw_config adf_fw_asym_dc_config[] = {
65+
{0xF0, ADF_FW_ASYM_OBJ},
66+
{0xF, ADF_FW_DC_OBJ},
67+
{0x100, ADF_FW_ADMIN_OBJ},
68+
};
69+
70+
static const struct adf_fw_config adf_fw_sym_dc_config[] = {
71+
{0xF0, ADF_FW_SYM_OBJ},
72+
{0xF, ADF_FW_DC_OBJ},
73+
{0x100, ADF_FW_ADMIN_OBJ},
74+
};
75+
5276
static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_dc_config));
77+
static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_sym_config));
78+
static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_asym_config));
79+
static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_asym_dc_config));
80+
static_assert(ARRAY_SIZE(adf_fw_cy_config) == ARRAY_SIZE(adf_fw_sym_dc_config));
5381

5482
/* Worker thread to service arbiter mappings */
55-
static const u32 thrd_to_arb_map_cy[ADF_4XXX_MAX_ACCELENGINES] = {
83+
static const u32 default_thrd_to_arb_map[ADF_4XXX_MAX_ACCELENGINES] = {
5684
0x5555555, 0x5555555, 0x5555555, 0x5555555,
5785
0xAAAAAAA, 0xAAAAAAA, 0xAAAAAAA, 0xAAAAAAA,
5886
0x0
@@ -72,12 +100,26 @@ static struct adf_hw_device_class adf_4xxx_class = {
72100

73101
enum dev_services {
74102
SVC_CY = 0,
103+
SVC_CY2,
75104
SVC_DC,
105+
SVC_SYM,
106+
SVC_ASYM,
107+
SVC_DC_ASYM,
108+
SVC_ASYM_DC,
109+
SVC_DC_SYM,
110+
SVC_SYM_DC,
76111
};
77112

78113
static const char *const dev_cfg_services[] = {
79114
[SVC_CY] = ADF_CFG_CY,
115+
[SVC_CY2] = ADF_CFG_ASYM_SYM,
80116
[SVC_DC] = ADF_CFG_DC,
117+
[SVC_SYM] = ADF_CFG_SYM,
118+
[SVC_ASYM] = ADF_CFG_ASYM,
119+
[SVC_DC_ASYM] = ADF_CFG_DC_ASYM,
120+
[SVC_ASYM_DC] = ADF_CFG_ASYM_DC,
121+
[SVC_DC_SYM] = ADF_CFG_DC_SYM,
122+
[SVC_SYM_DC] = ADF_CFG_SYM_DC,
81123
};
82124

83125
static int get_service_enabled(struct adf_accel_dev *accel_dev)
@@ -167,45 +209,50 @@ static void set_msix_default_rttable(struct adf_accel_dev *accel_dev)
167209
static u32 get_accel_cap(struct adf_accel_dev *accel_dev)
168210
{
169211
struct pci_dev *pdev = accel_dev->accel_pci_dev.pci_dev;
170-
u32 capabilities_cy, capabilities_dc;
212+
u32 capabilities_sym, capabilities_asym, capabilities_dc;
171213
u32 fusectl1;
172214

173215
/* Read accelerator capabilities mask */
174216
pci_read_config_dword(pdev, ADF_4XXX_FUSECTL1_OFFSET, &fusectl1);
175217

176-
capabilities_cy = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC |
177-
ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC |
218+
capabilities_sym = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC |
178219
ICP_ACCEL_CAPABILITIES_CIPHER |
179220
ICP_ACCEL_CAPABILITIES_AUTHENTICATION |
180221
ICP_ACCEL_CAPABILITIES_SHA3 |
181222
ICP_ACCEL_CAPABILITIES_SHA3_EXT |
182223
ICP_ACCEL_CAPABILITIES_HKDF |
183-
ICP_ACCEL_CAPABILITIES_ECEDMONT |
184224
ICP_ACCEL_CAPABILITIES_CHACHA_POLY |
185225
ICP_ACCEL_CAPABILITIES_AESGCM_SPC |
186226
ICP_ACCEL_CAPABILITIES_AES_V2;
187227

188228
/* A set bit in fusectl1 means the feature is OFF in this SKU */
189229
if (fusectl1 & ICP_ACCEL_4XXX_MASK_CIPHER_SLICE) {
190-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
191-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_HKDF;
192-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_CIPHER;
230+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
231+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_HKDF;
232+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_CIPHER;
193233
}
234+
194235
if (fusectl1 & ICP_ACCEL_4XXX_MASK_UCS_SLICE) {
195-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_CHACHA_POLY;
196-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_AESGCM_SPC;
197-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_AES_V2;
198-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_CIPHER;
236+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_CHACHA_POLY;
237+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_AESGCM_SPC;
238+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_AES_V2;
239+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_CIPHER;
199240
}
241+
200242
if (fusectl1 & ICP_ACCEL_4XXX_MASK_AUTH_SLICE) {
201-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_AUTHENTICATION;
202-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_SHA3;
203-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_SHA3_EXT;
204-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_CIPHER;
243+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_AUTHENTICATION;
244+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_SHA3;
245+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_SHA3_EXT;
246+
capabilities_sym &= ~ICP_ACCEL_CAPABILITIES_CIPHER;
205247
}
248+
249+
capabilities_asym = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC |
250+
ICP_ACCEL_CAPABILITIES_CIPHER |
251+
ICP_ACCEL_CAPABILITIES_ECEDMONT;
252+
206253
if (fusectl1 & ICP_ACCEL_4XXX_MASK_PKE_SLICE) {
207-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
208-
capabilities_cy &= ~ICP_ACCEL_CAPABILITIES_ECEDMONT;
254+
capabilities_asym &= ~ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
255+
capabilities_asym &= ~ICP_ACCEL_CAPABILITIES_ECEDMONT;
209256
}
210257

211258
capabilities_dc = ICP_ACCEL_CAPABILITIES_COMPRESSION |
@@ -222,9 +269,20 @@ static u32 get_accel_cap(struct adf_accel_dev *accel_dev)
222269

223270
switch (get_service_enabled(accel_dev)) {
224271
case SVC_CY:
225-
return capabilities_cy;
272+
case SVC_CY2:
273+
return capabilities_sym | capabilities_asym;
226274
case SVC_DC:
227275
return capabilities_dc;
276+
case SVC_SYM:
277+
return capabilities_sym;
278+
case SVC_ASYM:
279+
return capabilities_asym;
280+
case SVC_ASYM_DC:
281+
case SVC_DC_ASYM:
282+
return capabilities_asym | capabilities_dc;
283+
case SVC_SYM_DC:
284+
case SVC_DC_SYM:
285+
return capabilities_sym | capabilities_dc;
228286
default:
229287
return 0;
230288
}
@@ -238,12 +296,10 @@ static enum dev_sku_info get_sku(struct adf_hw_device_data *self)
238296
static const u32 *adf_get_arbiter_mapping(struct adf_accel_dev *accel_dev)
239297
{
240298
switch (get_service_enabled(accel_dev)) {
241-
case SVC_CY:
242-
return thrd_to_arb_map_cy;
243299
case SVC_DC:
244300
return thrd_to_arb_map_dc;
245301
default:
246-
return NULL;
302+
return default_thrd_to_arb_map;
247303
}
248304
}
249305

@@ -325,11 +381,26 @@ static const char *uof_get_name(struct adf_accel_dev *accel_dev, u32 obj_num,
325381

326382
switch (get_service_enabled(accel_dev)) {
327383
case SVC_CY:
384+
case SVC_CY2:
328385
id = adf_fw_cy_config[obj_num].obj;
329386
break;
330387
case SVC_DC:
331388
id = adf_fw_dc_config[obj_num].obj;
332389
break;
390+
case SVC_SYM:
391+
id = adf_fw_sym_config[obj_num].obj;
392+
break;
393+
case SVC_ASYM:
394+
id = adf_fw_asym_config[obj_num].obj;
395+
break;
396+
case SVC_ASYM_DC:
397+
case SVC_DC_ASYM:
398+
id = adf_fw_asym_dc_config[obj_num].obj;
399+
break;
400+
case SVC_SYM_DC:
401+
case SVC_DC_SYM:
402+
id = adf_fw_sym_dc_config[obj_num].obj;
403+
break;
333404
default:
334405
id = -EINVAL;
335406
break;
@@ -362,6 +433,18 @@ static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num)
362433
return adf_fw_cy_config[obj_num].ae_mask;
363434
case SVC_DC:
364435
return adf_fw_dc_config[obj_num].ae_mask;
436+
case SVC_CY2:
437+
return adf_fw_cy_config[obj_num].ae_mask;
438+
case SVC_SYM:
439+
return adf_fw_sym_config[obj_num].ae_mask;
440+
case SVC_ASYM:
441+
return adf_fw_asym_config[obj_num].ae_mask;
442+
case SVC_ASYM_DC:
443+
case SVC_DC_ASYM:
444+
return adf_fw_asym_dc_config[obj_num].ae_mask;
445+
case SVC_SYM_DC:
446+
case SVC_DC_SYM:
447+
return adf_fw_sym_dc_config[obj_num].ae_mask;
365448
default:
366449
return 0;
367450
}

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,25 @@ MODULE_DEVICE_TABLE(pci, adf_pci_tbl);
2525
enum configs {
2626
DEV_CFG_CY = 0,
2727
DEV_CFG_DC,
28+
DEV_CFG_SYM,
29+
DEV_CFG_ASYM,
30+
DEV_CFG_ASYM_SYM,
31+
DEV_CFG_ASYM_DC,
32+
DEV_CFG_DC_ASYM,
33+
DEV_CFG_SYM_DC,
34+
DEV_CFG_DC_SYM,
2835
};
2936

3037
static const char * const services_operations[] = {
3138
ADF_CFG_CY,
3239
ADF_CFG_DC,
40+
ADF_CFG_SYM,
41+
ADF_CFG_ASYM,
42+
ADF_CFG_ASYM_SYM,
43+
ADF_CFG_ASYM_DC,
44+
ADF_CFG_DC_ASYM,
45+
ADF_CFG_SYM_DC,
46+
ADF_CFG_DC_SYM,
3347
};
3448

3549
static void adf_cleanup_accel(struct adf_accel_dev *accel_dev)
@@ -242,6 +256,21 @@ static int adf_comp_dev_config(struct adf_accel_dev *accel_dev)
242256
return ret;
243257
}
244258

259+
static int adf_no_dev_config(struct adf_accel_dev *accel_dev)
260+
{
261+
unsigned long val;
262+
int ret;
263+
264+
val = 0;
265+
ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
266+
&val, ADF_DEC);
267+
if (ret)
268+
return ret;
269+
270+
return adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
271+
&val, ADF_DEC);
272+
}
273+
245274
int adf_gen4_dev_config(struct adf_accel_dev *accel_dev)
246275
{
247276
char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
@@ -266,11 +295,15 @@ int adf_gen4_dev_config(struct adf_accel_dev *accel_dev)
266295

267296
switch (ret) {
268297
case DEV_CFG_CY:
298+
case DEV_CFG_ASYM_SYM:
269299
ret = adf_crypto_dev_config(accel_dev);
270300
break;
271301
case DEV_CFG_DC:
272302
ret = adf_comp_dev_config(accel_dev);
273303
break;
304+
default:
305+
ret = adf_no_dev_config(accel_dev);
306+
break;
274307
}
275308

276309
if (ret)

drivers/crypto/intel/qat/qat_common/adf_cfg_strings.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@
2525
#define ADF_DC "Dc"
2626
#define ADF_CFG_DC "dc"
2727
#define ADF_CFG_CY "sym;asym"
28+
#define ADF_CFG_SYM "sym"
29+
#define ADF_CFG_ASYM "asym"
30+
#define ADF_CFG_ASYM_SYM "asym;sym"
31+
#define ADF_CFG_ASYM_DC "asym;dc"
32+
#define ADF_CFG_DC_ASYM "dc;asym"
33+
#define ADF_CFG_SYM_DC "sym;dc"
34+
#define ADF_CFG_DC_SYM "dc;sym"
2835
#define ADF_SERVICES_ENABLED "ServicesEnabled"
2936
#define ADF_ETRMGR_COALESCING_ENABLED "InterruptCoalescingEnabled"
3037
#define ADF_ETRMGR_COALESCING_ENABLED_FORMAT \

drivers/crypto/intel/qat/qat_common/adf_sysfs.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
7878
static const char * const services_operations[] = {
7979
ADF_CFG_CY,
8080
ADF_CFG_DC,
81+
ADF_CFG_SYM,
82+
ADF_CFG_ASYM,
83+
ADF_CFG_ASYM_SYM,
84+
ADF_CFG_ASYM_DC,
85+
ADF_CFG_DC_ASYM,
86+
ADF_CFG_SYM_DC,
87+
ADF_CFG_DC_SYM,
8188
};
8289

8390
static ssize_t cfg_services_show(struct device *dev, struct device_attribute *attr,

0 commit comments

Comments
 (0)