0001
0002
0003 #include <linux/module.h>
0004 #include <linux/slab.h>
0005 #include "adf_accel_devices.h"
0006 #include "adf_common_drv.h"
0007 #include "adf_transport.h"
0008 #include "adf_transport_access_macros.h"
0009 #include "adf_cfg.h"
0010 #include "adf_cfg_strings.h"
0011 #include "adf_gen2_hw_data.h"
0012 #include "qat_crypto.h"
0013 #include "icp_qat_fw.h"
0014
0015 #define SEC ADF_KERNEL_SEC
0016
0017 static struct service_hndl qat_crypto;
0018
0019 void qat_crypto_put_instance(struct qat_crypto_instance *inst)
0020 {
0021 atomic_dec(&inst->refctr);
0022 adf_dev_put(inst->accel_dev);
0023 }
0024
0025 static int qat_crypto_free_instances(struct adf_accel_dev *accel_dev)
0026 {
0027 struct qat_crypto_instance *inst, *tmp;
0028 int i;
0029
0030 list_for_each_entry_safe(inst, tmp, &accel_dev->crypto_list, list) {
0031 for (i = 0; i < atomic_read(&inst->refctr); i++)
0032 qat_crypto_put_instance(inst);
0033
0034 if (inst->sym_tx)
0035 adf_remove_ring(inst->sym_tx);
0036
0037 if (inst->sym_rx)
0038 adf_remove_ring(inst->sym_rx);
0039
0040 if (inst->pke_tx)
0041 adf_remove_ring(inst->pke_tx);
0042
0043 if (inst->pke_rx)
0044 adf_remove_ring(inst->pke_rx);
0045
0046 list_del(&inst->list);
0047 kfree(inst);
0048 }
0049 return 0;
0050 }
0051
0052 struct qat_crypto_instance *qat_crypto_get_instance_node(int node)
0053 {
0054 struct adf_accel_dev *accel_dev = NULL, *tmp_dev;
0055 struct qat_crypto_instance *inst = NULL, *tmp_inst;
0056 unsigned long best = ~0;
0057
0058 list_for_each_entry(tmp_dev, adf_devmgr_get_head(), list) {
0059 unsigned long ctr;
0060
0061 if ((node == dev_to_node(&GET_DEV(tmp_dev)) ||
0062 dev_to_node(&GET_DEV(tmp_dev)) < 0) &&
0063 adf_dev_started(tmp_dev) &&
0064 !list_empty(&tmp_dev->crypto_list)) {
0065 ctr = atomic_read(&tmp_dev->ref_count);
0066 if (best > ctr) {
0067 accel_dev = tmp_dev;
0068 best = ctr;
0069 }
0070 }
0071 }
0072
0073 if (!accel_dev) {
0074 pr_info("QAT: Could not find a device on node %d\n", node);
0075
0076 list_for_each_entry(tmp_dev, adf_devmgr_get_head(), list) {
0077 if (adf_dev_started(tmp_dev) &&
0078 !list_empty(&tmp_dev->crypto_list)) {
0079 accel_dev = tmp_dev;
0080 break;
0081 }
0082 }
0083 }
0084
0085 if (!accel_dev)
0086 return NULL;
0087
0088 best = ~0;
0089 list_for_each_entry(tmp_inst, &accel_dev->crypto_list, list) {
0090 unsigned long ctr;
0091
0092 ctr = atomic_read(&tmp_inst->refctr);
0093 if (best > ctr) {
0094 inst = tmp_inst;
0095 best = ctr;
0096 }
0097 }
0098 if (inst) {
0099 if (adf_dev_get(accel_dev)) {
0100 dev_err(&GET_DEV(accel_dev), "Could not increment dev refctr\n");
0101 return NULL;
0102 }
0103 atomic_inc(&inst->refctr);
0104 }
0105 return inst;
0106 }
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119 int qat_crypto_vf_dev_config(struct adf_accel_dev *accel_dev)
0120 {
0121 u16 ring_to_svc_map = GET_HW_DATA(accel_dev)->ring_to_svc_map;
0122
0123 if (ring_to_svc_map != ADF_GEN2_DEFAULT_RING_TO_SRV_MAP) {
0124 dev_err(&GET_DEV(accel_dev),
0125 "Unsupported ring/service mapping present on PF");
0126 return -EFAULT;
0127 }
0128
0129 return qat_crypto_dev_config(accel_dev);
0130 }
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 int qat_crypto_dev_config(struct adf_accel_dev *accel_dev)
0142 {
0143 char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
0144 int banks = GET_MAX_BANKS(accel_dev);
0145 int cpus = num_online_cpus();
0146 unsigned long val;
0147 int instances;
0148 int ret;
0149 int i;
0150
0151 if (adf_hw_dev_has_crypto(accel_dev))
0152 instances = min(cpus, banks);
0153 else
0154 instances = 0;
0155
0156 ret = adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC);
0157 if (ret)
0158 goto err;
0159
0160 ret = adf_cfg_section_add(accel_dev, "Accelerator0");
0161 if (ret)
0162 goto err;
0163
0164 for (i = 0; i < instances; i++) {
0165 val = i;
0166 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_BANK_NUM, i);
0167 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0168 key, &val, ADF_DEC);
0169 if (ret)
0170 goto err;
0171
0172 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_BANK_NUM, i);
0173 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0174 key, &val, ADF_DEC);
0175 if (ret)
0176 goto err;
0177
0178 snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
0179 i);
0180 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0181 key, &val, ADF_DEC);
0182 if (ret)
0183 goto err;
0184
0185 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
0186 val = 128;
0187 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0188 key, &val, ADF_DEC);
0189 if (ret)
0190 goto err;
0191
0192 val = 512;
0193 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i);
0194 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0195 key, &val, ADF_DEC);
0196 if (ret)
0197 goto err;
0198
0199 val = 0;
0200 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
0201 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0202 key, &val, ADF_DEC);
0203 if (ret)
0204 goto err;
0205
0206 val = 2;
0207 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i);
0208 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0209 key, &val, ADF_DEC);
0210 if (ret)
0211 goto err;
0212
0213 val = 8;
0214 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
0215 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0216 key, &val, ADF_DEC);
0217 if (ret)
0218 goto err;
0219
0220 val = 10;
0221 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i);
0222 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
0223 key, &val, ADF_DEC);
0224 if (ret)
0225 goto err;
0226
0227 val = ADF_COALESCING_DEF_TIME;
0228 snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
0229 ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
0230 key, &val, ADF_DEC);
0231 if (ret)
0232 goto err;
0233 }
0234
0235 val = i;
0236 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
0237 &val, ADF_DEC);
0238 if (ret)
0239 goto err;
0240
0241 set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
0242 return 0;
0243 err:
0244 dev_err(&GET_DEV(accel_dev), "Failed to start QAT accel dev\n");
0245 return ret;
0246 }
0247 EXPORT_SYMBOL_GPL(qat_crypto_dev_config);
0248
0249 static int qat_crypto_create_instances(struct adf_accel_dev *accel_dev)
0250 {
0251 unsigned long num_inst, num_msg_sym, num_msg_asym;
0252 char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
0253 char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
0254 unsigned long sym_bank, asym_bank;
0255 struct qat_crypto_instance *inst;
0256 int msg_size;
0257 int ret;
0258 int i;
0259
0260 INIT_LIST_HEAD(&accel_dev->crypto_list);
0261 ret = adf_cfg_get_param_value(accel_dev, SEC, ADF_NUM_CY, val);
0262 if (ret)
0263 return ret;
0264
0265 ret = kstrtoul(val, 0, &num_inst);
0266 if (ret)
0267 return ret;
0268
0269 for (i = 0; i < num_inst; i++) {
0270 inst = kzalloc_node(sizeof(*inst), GFP_KERNEL,
0271 dev_to_node(&GET_DEV(accel_dev)));
0272 if (!inst) {
0273 ret = -ENOMEM;
0274 goto err;
0275 }
0276
0277 list_add_tail(&inst->list, &accel_dev->crypto_list);
0278 inst->id = i;
0279 atomic_set(&inst->refctr, 0);
0280 inst->accel_dev = accel_dev;
0281
0282 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_BANK_NUM, i);
0283 ret = adf_cfg_get_param_value(accel_dev, SEC, key, val);
0284 if (ret)
0285 goto err;
0286
0287 ret = kstrtoul(val, 10, &sym_bank);
0288 if (ret)
0289 goto err;
0290
0291 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_BANK_NUM, i);
0292 ret = adf_cfg_get_param_value(accel_dev, SEC, key, val);
0293 if (ret)
0294 goto err;
0295
0296 ret = kstrtoul(val, 10, &asym_bank);
0297 if (ret)
0298 goto err;
0299
0300 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i);
0301 ret = adf_cfg_get_param_value(accel_dev, SEC, key, val);
0302 if (ret)
0303 goto err;
0304
0305 ret = kstrtoul(val, 10, &num_msg_sym);
0306 if (ret)
0307 goto err;
0308
0309 num_msg_sym = num_msg_sym >> 1;
0310
0311 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
0312 ret = adf_cfg_get_param_value(accel_dev, SEC, key, val);
0313 if (ret)
0314 goto err;
0315
0316 ret = kstrtoul(val, 10, &num_msg_asym);
0317 if (ret)
0318 goto err;
0319 num_msg_asym = num_msg_asym >> 1;
0320
0321 msg_size = ICP_QAT_FW_REQ_DEFAULT_SZ;
0322 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i);
0323 ret = adf_create_ring(accel_dev, SEC, sym_bank, num_msg_sym,
0324 msg_size, key, NULL, 0, &inst->sym_tx);
0325 if (ret)
0326 goto err;
0327
0328 msg_size = msg_size >> 1;
0329 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
0330 ret = adf_create_ring(accel_dev, SEC, asym_bank, num_msg_asym,
0331 msg_size, key, NULL, 0, &inst->pke_tx);
0332 if (ret)
0333 goto err;
0334
0335 msg_size = ICP_QAT_FW_RESP_DEFAULT_SZ;
0336 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i);
0337 ret = adf_create_ring(accel_dev, SEC, sym_bank, num_msg_sym,
0338 msg_size, key, qat_alg_callback, 0,
0339 &inst->sym_rx);
0340 if (ret)
0341 goto err;
0342
0343 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
0344 ret = adf_create_ring(accel_dev, SEC, asym_bank, num_msg_asym,
0345 msg_size, key, qat_alg_asym_callback, 0,
0346 &inst->pke_rx);
0347 if (ret)
0348 goto err;
0349
0350 INIT_LIST_HEAD(&inst->backlog.list);
0351 spin_lock_init(&inst->backlog.lock);
0352 }
0353 return 0;
0354 err:
0355 qat_crypto_free_instances(accel_dev);
0356 return ret;
0357 }
0358
0359 static int qat_crypto_init(struct adf_accel_dev *accel_dev)
0360 {
0361 if (qat_crypto_create_instances(accel_dev))
0362 return -EFAULT;
0363
0364 return 0;
0365 }
0366
0367 static int qat_crypto_shutdown(struct adf_accel_dev *accel_dev)
0368 {
0369 return qat_crypto_free_instances(accel_dev);
0370 }
0371
0372 static int qat_crypto_event_handler(struct adf_accel_dev *accel_dev,
0373 enum adf_event event)
0374 {
0375 int ret;
0376
0377 switch (event) {
0378 case ADF_EVENT_INIT:
0379 ret = qat_crypto_init(accel_dev);
0380 break;
0381 case ADF_EVENT_SHUTDOWN:
0382 ret = qat_crypto_shutdown(accel_dev);
0383 break;
0384 case ADF_EVENT_RESTARTING:
0385 case ADF_EVENT_RESTARTED:
0386 case ADF_EVENT_START:
0387 case ADF_EVENT_STOP:
0388 default:
0389 ret = 0;
0390 }
0391 return ret;
0392 }
0393
0394 int qat_crypto_register(void)
0395 {
0396 memset(&qat_crypto, 0, sizeof(qat_crypto));
0397 qat_crypto.event_hld = qat_crypto_event_handler;
0398 qat_crypto.name = "qat_crypto";
0399 return adf_service_register(&qat_crypto);
0400 }
0401
0402 int qat_crypto_unregister(void)
0403 {
0404 return adf_service_unregister(&qat_crypto);
0405 }