18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only) 28c2ecf20Sopenharmony_ci/* Copyright(c) 2014 - 2020 Intel Corporation */ 38c2ecf20Sopenharmony_ci#include <linux/module.h> 48c2ecf20Sopenharmony_ci#include <linux/slab.h> 58c2ecf20Sopenharmony_ci#include "adf_accel_devices.h" 68c2ecf20Sopenharmony_ci#include "adf_common_drv.h" 78c2ecf20Sopenharmony_ci#include "adf_transport.h" 88c2ecf20Sopenharmony_ci#include "adf_transport_access_macros.h" 98c2ecf20Sopenharmony_ci#include "adf_cfg.h" 108c2ecf20Sopenharmony_ci#include "adf_cfg_strings.h" 118c2ecf20Sopenharmony_ci#include "qat_crypto.h" 128c2ecf20Sopenharmony_ci#include "icp_qat_fw.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define SEC ADF_KERNEL_SEC 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic struct service_hndl qat_crypto; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_civoid qat_crypto_put_instance(struct qat_crypto_instance *inst) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci atomic_dec(&inst->refctr); 218c2ecf20Sopenharmony_ci adf_dev_put(inst->accel_dev); 228c2ecf20Sopenharmony_ci} 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic int qat_crypto_free_instances(struct adf_accel_dev *accel_dev) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci struct qat_crypto_instance *inst, *tmp; 278c2ecf20Sopenharmony_ci int i; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci list_for_each_entry_safe(inst, tmp, &accel_dev->crypto_list, list) { 308c2ecf20Sopenharmony_ci for (i = 0; i < atomic_read(&inst->refctr); i++) 318c2ecf20Sopenharmony_ci qat_crypto_put_instance(inst); 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci if (inst->sym_tx) 348c2ecf20Sopenharmony_ci adf_remove_ring(inst->sym_tx); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci if (inst->sym_rx) 378c2ecf20Sopenharmony_ci adf_remove_ring(inst->sym_rx); 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci if (inst->pke_tx) 408c2ecf20Sopenharmony_ci adf_remove_ring(inst->pke_tx); 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci if (inst->pke_rx) 438c2ecf20Sopenharmony_ci adf_remove_ring(inst->pke_rx); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci list_del(&inst->list); 468c2ecf20Sopenharmony_ci kfree(inst); 478c2ecf20Sopenharmony_ci } 488c2ecf20Sopenharmony_ci return 0; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistruct qat_crypto_instance *qat_crypto_get_instance_node(int node) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci struct adf_accel_dev *accel_dev = NULL, *tmp_dev; 548c2ecf20Sopenharmony_ci struct qat_crypto_instance *inst = NULL, *tmp_inst; 558c2ecf20Sopenharmony_ci unsigned long best = ~0; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci list_for_each_entry(tmp_dev, adf_devmgr_get_head(), list) { 588c2ecf20Sopenharmony_ci unsigned long ctr; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci if ((node == dev_to_node(&GET_DEV(tmp_dev)) || 618c2ecf20Sopenharmony_ci dev_to_node(&GET_DEV(tmp_dev)) < 0) && 628c2ecf20Sopenharmony_ci adf_dev_started(tmp_dev) && 638c2ecf20Sopenharmony_ci !list_empty(&tmp_dev->crypto_list)) { 648c2ecf20Sopenharmony_ci ctr = atomic_read(&tmp_dev->ref_count); 658c2ecf20Sopenharmony_ci if (best > ctr) { 668c2ecf20Sopenharmony_ci accel_dev = tmp_dev; 678c2ecf20Sopenharmony_ci best = ctr; 688c2ecf20Sopenharmony_ci } 698c2ecf20Sopenharmony_ci } 708c2ecf20Sopenharmony_ci } 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci if (!accel_dev) { 738c2ecf20Sopenharmony_ci pr_info("QAT: Could not find a device on node %d\n", node); 748c2ecf20Sopenharmony_ci /* Get any started device */ 758c2ecf20Sopenharmony_ci list_for_each_entry(tmp_dev, adf_devmgr_get_head(), list) { 768c2ecf20Sopenharmony_ci if (adf_dev_started(tmp_dev) && 778c2ecf20Sopenharmony_ci !list_empty(&tmp_dev->crypto_list)) { 788c2ecf20Sopenharmony_ci accel_dev = tmp_dev; 798c2ecf20Sopenharmony_ci break; 808c2ecf20Sopenharmony_ci } 818c2ecf20Sopenharmony_ci } 828c2ecf20Sopenharmony_ci } 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci if (!accel_dev) 858c2ecf20Sopenharmony_ci return NULL; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci best = ~0; 888c2ecf20Sopenharmony_ci list_for_each_entry(tmp_inst, &accel_dev->crypto_list, list) { 898c2ecf20Sopenharmony_ci unsigned long ctr; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci ctr = atomic_read(&tmp_inst->refctr); 928c2ecf20Sopenharmony_ci if (best > ctr) { 938c2ecf20Sopenharmony_ci inst = tmp_inst; 948c2ecf20Sopenharmony_ci best = ctr; 958c2ecf20Sopenharmony_ci } 968c2ecf20Sopenharmony_ci } 978c2ecf20Sopenharmony_ci if (inst) { 988c2ecf20Sopenharmony_ci if (adf_dev_get(accel_dev)) { 998c2ecf20Sopenharmony_ci dev_err(&GET_DEV(accel_dev), "Could not increment dev refctr\n"); 1008c2ecf20Sopenharmony_ci return NULL; 1018c2ecf20Sopenharmony_ci } 1028c2ecf20Sopenharmony_ci atomic_inc(&inst->refctr); 1038c2ecf20Sopenharmony_ci } 1048c2ecf20Sopenharmony_ci return inst; 1058c2ecf20Sopenharmony_ci} 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/** 1088c2ecf20Sopenharmony_ci * qat_crypto_dev_config() - create dev config required to create crypto inst. 1098c2ecf20Sopenharmony_ci * 1108c2ecf20Sopenharmony_ci * @accel_dev: Pointer to acceleration device. 1118c2ecf20Sopenharmony_ci * 1128c2ecf20Sopenharmony_ci * Function creates device configuration required to create crypto instances 1138c2ecf20Sopenharmony_ci * 1148c2ecf20Sopenharmony_ci * Return: 0 on success, error code otherwise. 1158c2ecf20Sopenharmony_ci */ 1168c2ecf20Sopenharmony_ciint qat_crypto_dev_config(struct adf_accel_dev *accel_dev) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci int cpus = num_online_cpus(); 1198c2ecf20Sopenharmony_ci int banks = GET_MAX_BANKS(accel_dev); 1208c2ecf20Sopenharmony_ci int instances = min(cpus, banks); 1218c2ecf20Sopenharmony_ci char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES]; 1228c2ecf20Sopenharmony_ci int i; 1238c2ecf20Sopenharmony_ci unsigned long val; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci if (adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC)) 1268c2ecf20Sopenharmony_ci goto err; 1278c2ecf20Sopenharmony_ci if (adf_cfg_section_add(accel_dev, "Accelerator0")) 1288c2ecf20Sopenharmony_ci goto err; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci /* Temporarily set the number of crypto instances to zero to avoid 1318c2ecf20Sopenharmony_ci * registering the crypto algorithms. 1328c2ecf20Sopenharmony_ci * This will be removed when the algorithms will support the 1338c2ecf20Sopenharmony_ci * CRYPTO_TFM_REQ_MAY_BACKLOG flag 1348c2ecf20Sopenharmony_ci */ 1358c2ecf20Sopenharmony_ci instances = 0; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci for (i = 0; i < instances; i++) { 1388c2ecf20Sopenharmony_ci val = i; 1398c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_BANK_NUM, i); 1408c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1418c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1428c2ecf20Sopenharmony_ci goto err; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY, 1458c2ecf20Sopenharmony_ci i); 1468c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1478c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1488c2ecf20Sopenharmony_ci goto err; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i); 1518c2ecf20Sopenharmony_ci val = 128; 1528c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1538c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1548c2ecf20Sopenharmony_ci goto err; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci val = 512; 1578c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i); 1588c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1598c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1608c2ecf20Sopenharmony_ci goto err; 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci val = 0; 1638c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i); 1648c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1658c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1668c2ecf20Sopenharmony_ci goto err; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci val = 2; 1698c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i); 1708c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1718c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1728c2ecf20Sopenharmony_ci goto err; 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci val = 8; 1758c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i); 1768c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1778c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1788c2ecf20Sopenharmony_ci goto err; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci val = 10; 1818c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i); 1828c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1838c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1848c2ecf20Sopenharmony_ci goto err; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci val = ADF_COALESCING_DEF_TIME; 1878c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i); 1888c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, "Accelerator0", 1898c2ecf20Sopenharmony_ci key, (void *)&val, ADF_DEC)) 1908c2ecf20Sopenharmony_ci goto err; 1918c2ecf20Sopenharmony_ci } 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci val = i; 1948c2ecf20Sopenharmony_ci if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 1958c2ecf20Sopenharmony_ci ADF_NUM_CY, (void *)&val, ADF_DEC)) 1968c2ecf20Sopenharmony_ci goto err; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status); 1998c2ecf20Sopenharmony_ci return 0; 2008c2ecf20Sopenharmony_cierr: 2018c2ecf20Sopenharmony_ci dev_err(&GET_DEV(accel_dev), "Failed to start QAT accel dev\n"); 2028c2ecf20Sopenharmony_ci return -EINVAL; 2038c2ecf20Sopenharmony_ci} 2048c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(qat_crypto_dev_config); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cistatic int qat_crypto_create_instances(struct adf_accel_dev *accel_dev) 2078c2ecf20Sopenharmony_ci{ 2088c2ecf20Sopenharmony_ci int i; 2098c2ecf20Sopenharmony_ci unsigned long bank; 2108c2ecf20Sopenharmony_ci unsigned long num_inst, num_msg_sym, num_msg_asym; 2118c2ecf20Sopenharmony_ci int msg_size; 2128c2ecf20Sopenharmony_ci struct qat_crypto_instance *inst; 2138c2ecf20Sopenharmony_ci char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES]; 2148c2ecf20Sopenharmony_ci char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES]; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&accel_dev->crypto_list); 2178c2ecf20Sopenharmony_ci if (adf_cfg_get_param_value(accel_dev, SEC, ADF_NUM_CY, val)) 2188c2ecf20Sopenharmony_ci return -EFAULT; 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci if (kstrtoul(val, 0, &num_inst)) 2218c2ecf20Sopenharmony_ci return -EFAULT; 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci for (i = 0; i < num_inst; i++) { 2248c2ecf20Sopenharmony_ci inst = kzalloc_node(sizeof(*inst), GFP_KERNEL, 2258c2ecf20Sopenharmony_ci dev_to_node(&GET_DEV(accel_dev))); 2268c2ecf20Sopenharmony_ci if (!inst) 2278c2ecf20Sopenharmony_ci goto err; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci list_add_tail(&inst->list, &accel_dev->crypto_list); 2308c2ecf20Sopenharmony_ci inst->id = i; 2318c2ecf20Sopenharmony_ci atomic_set(&inst->refctr, 0); 2328c2ecf20Sopenharmony_ci inst->accel_dev = accel_dev; 2338c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_BANK_NUM, i); 2348c2ecf20Sopenharmony_ci if (adf_cfg_get_param_value(accel_dev, SEC, key, val)) 2358c2ecf20Sopenharmony_ci goto err; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci if (kstrtoul(val, 10, &bank)) 2388c2ecf20Sopenharmony_ci goto err; 2398c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i); 2408c2ecf20Sopenharmony_ci if (adf_cfg_get_param_value(accel_dev, SEC, key, val)) 2418c2ecf20Sopenharmony_ci goto err; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci if (kstrtoul(val, 10, &num_msg_sym)) 2448c2ecf20Sopenharmony_ci goto err; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci num_msg_sym = num_msg_sym >> 1; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i); 2498c2ecf20Sopenharmony_ci if (adf_cfg_get_param_value(accel_dev, SEC, key, val)) 2508c2ecf20Sopenharmony_ci goto err; 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci if (kstrtoul(val, 10, &num_msg_asym)) 2538c2ecf20Sopenharmony_ci goto err; 2548c2ecf20Sopenharmony_ci num_msg_asym = num_msg_asym >> 1; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci msg_size = ICP_QAT_FW_REQ_DEFAULT_SZ; 2578c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i); 2588c2ecf20Sopenharmony_ci if (adf_create_ring(accel_dev, SEC, bank, num_msg_sym, 2598c2ecf20Sopenharmony_ci msg_size, key, NULL, 0, &inst->sym_tx)) 2608c2ecf20Sopenharmony_ci goto err; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci msg_size = msg_size >> 1; 2638c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i); 2648c2ecf20Sopenharmony_ci if (adf_create_ring(accel_dev, SEC, bank, num_msg_asym, 2658c2ecf20Sopenharmony_ci msg_size, key, NULL, 0, &inst->pke_tx)) 2668c2ecf20Sopenharmony_ci goto err; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci msg_size = ICP_QAT_FW_RESP_DEFAULT_SZ; 2698c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i); 2708c2ecf20Sopenharmony_ci if (adf_create_ring(accel_dev, SEC, bank, num_msg_sym, 2718c2ecf20Sopenharmony_ci msg_size, key, qat_alg_callback, 0, 2728c2ecf20Sopenharmony_ci &inst->sym_rx)) 2738c2ecf20Sopenharmony_ci goto err; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i); 2768c2ecf20Sopenharmony_ci if (adf_create_ring(accel_dev, SEC, bank, num_msg_asym, 2778c2ecf20Sopenharmony_ci msg_size, key, qat_alg_asym_callback, 0, 2788c2ecf20Sopenharmony_ci &inst->pke_rx)) 2798c2ecf20Sopenharmony_ci goto err; 2808c2ecf20Sopenharmony_ci } 2818c2ecf20Sopenharmony_ci return 0; 2828c2ecf20Sopenharmony_cierr: 2838c2ecf20Sopenharmony_ci qat_crypto_free_instances(accel_dev); 2848c2ecf20Sopenharmony_ci return -ENOMEM; 2858c2ecf20Sopenharmony_ci} 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_cistatic int qat_crypto_init(struct adf_accel_dev *accel_dev) 2888c2ecf20Sopenharmony_ci{ 2898c2ecf20Sopenharmony_ci if (qat_crypto_create_instances(accel_dev)) 2908c2ecf20Sopenharmony_ci return -EFAULT; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci return 0; 2938c2ecf20Sopenharmony_ci} 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_cistatic int qat_crypto_shutdown(struct adf_accel_dev *accel_dev) 2968c2ecf20Sopenharmony_ci{ 2978c2ecf20Sopenharmony_ci return qat_crypto_free_instances(accel_dev); 2988c2ecf20Sopenharmony_ci} 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_cistatic int qat_crypto_event_handler(struct adf_accel_dev *accel_dev, 3018c2ecf20Sopenharmony_ci enum adf_event event) 3028c2ecf20Sopenharmony_ci{ 3038c2ecf20Sopenharmony_ci int ret; 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci switch (event) { 3068c2ecf20Sopenharmony_ci case ADF_EVENT_INIT: 3078c2ecf20Sopenharmony_ci ret = qat_crypto_init(accel_dev); 3088c2ecf20Sopenharmony_ci break; 3098c2ecf20Sopenharmony_ci case ADF_EVENT_SHUTDOWN: 3108c2ecf20Sopenharmony_ci ret = qat_crypto_shutdown(accel_dev); 3118c2ecf20Sopenharmony_ci break; 3128c2ecf20Sopenharmony_ci case ADF_EVENT_RESTARTING: 3138c2ecf20Sopenharmony_ci case ADF_EVENT_RESTARTED: 3148c2ecf20Sopenharmony_ci case ADF_EVENT_START: 3158c2ecf20Sopenharmony_ci case ADF_EVENT_STOP: 3168c2ecf20Sopenharmony_ci default: 3178c2ecf20Sopenharmony_ci ret = 0; 3188c2ecf20Sopenharmony_ci } 3198c2ecf20Sopenharmony_ci return ret; 3208c2ecf20Sopenharmony_ci} 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ciint qat_crypto_register(void) 3238c2ecf20Sopenharmony_ci{ 3248c2ecf20Sopenharmony_ci memset(&qat_crypto, 0, sizeof(qat_crypto)); 3258c2ecf20Sopenharmony_ci qat_crypto.event_hld = qat_crypto_event_handler; 3268c2ecf20Sopenharmony_ci qat_crypto.name = "qat_crypto"; 3278c2ecf20Sopenharmony_ci return adf_service_register(&qat_crypto); 3288c2ecf20Sopenharmony_ci} 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ciint qat_crypto_unregister(void) 3318c2ecf20Sopenharmony_ci{ 3328c2ecf20Sopenharmony_ci return adf_service_unregister(&qat_crypto); 3338c2ecf20Sopenharmony_ci} 334