1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 /* Copyright(c) 2007-2022 Intel Corporation */ 3 /* $FreeBSD$ */ 4 5 /** 6 *************************************************************************** 7 * @file sal_crypto.c Instance handling functions for crypto 8 * 9 * @ingroup SalCtrl 10 * 11 ***************************************************************************/ 12 13 /* 14 ******************************************************************************* 15 * Include public/global header files 16 ******************************************************************************* 17 */ 18 19 /* QAT-API includes */ 20 #include "cpa.h" 21 #include "cpa_types.h" 22 #include "cpa_cy_common.h" 23 #include "cpa_cy_im.h" 24 #include "cpa_cy_key.h" 25 #include "cpa_cy_sym.h" 26 27 #include "qat_utils.h" 28 29 /* ADF includes */ 30 #include "icp_adf_init.h" 31 #include "icp_adf_transport.h" 32 #include "icp_accel_devices.h" 33 #include "icp_adf_cfg.h" 34 #include "icp_adf_accel_mgr.h" 35 #include "icp_adf_poll.h" 36 #include "icp_adf_debug.h" 37 38 /* SAL includes */ 39 #include "lac_log.h" 40 #include "lac_mem.h" 41 #include "lac_mem_pools.h" 42 #include "sal_statistics.h" 43 #include "lac_common.h" 44 #include "lac_list.h" 45 #include "lac_hooks.h" 46 #include "lac_sym_qat_hash_defs_lookup.h" 47 #include "lac_sym.h" 48 #include "lac_sym_key.h" 49 #include "lac_sym_hash.h" 50 #include "lac_sym_cb.h" 51 #include "lac_sym_stats.h" 52 #include "lac_sal_types_crypto.h" 53 #include "lac_sal.h" 54 #include "lac_sal_ctrl.h" 55 #include "sal_string_parse.h" 56 #include "sal_service_state.h" 57 #include "icp_sal_poll.h" 58 #include "lac_sync.h" 59 #include "lac_sym_qat.h" 60 #include "icp_sal_versions.h" 61 #include "icp_sal_user.h" 62 #include "sal_hw_gen.h" 63 64 #define HMAC_MODE_1 1 65 #define HMAC_MODE_2 2 66 #define TH_CY_RX_0 0 67 #define TH_CY_RX_1 1 68 #define MAX_CY_RX_RINGS 2 69 70 #define DOUBLE_INCR 2 71 72 #define TH_SINGLE_RX 0 73 #define NUM_CRYPTO_SYM_RX_RINGS 1 74 #define NUM_CRYPTO_ASYM_RX_RINGS 1 75 #define NUM_CRYPTO_NRBG_RX_RINGS 1 76 77 static CpaInstanceHandle 78 Lac_CryptoGetFirstHandle(void) 79 { 80 CpaInstanceHandle instHandle; 81 instHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO); 82 if (!instHandle) { 83 instHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_SYM); 84 if (!instHandle) { 85 instHandle = 86 Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_ASYM); 87 } 88 } 89 return instHandle; 90 } 91 92 93 /* Function to release the sym handles. */ 94 static CpaStatus 95 SalCtrl_SymReleaseTransHandle(sal_service_t *service) 96 { 97 98 CpaStatus status = CPA_STATUS_SUCCESS; 99 CpaStatus ret_status = CPA_STATUS_SUCCESS; 100 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 101 102 if (NULL != pCryptoService->trans_handle_sym_tx) { 103 status = icp_adf_transReleaseHandle( 104 pCryptoService->trans_handle_sym_tx); 105 if (CPA_STATUS_SUCCESS != status) { 106 ret_status = status; 107 } 108 } 109 if (NULL != pCryptoService->trans_handle_sym_rx) { 110 status = icp_adf_transReleaseHandle( 111 pCryptoService->trans_handle_sym_rx); 112 if (CPA_STATUS_SUCCESS != status) { 113 ret_status = status; 114 } 115 } 116 117 return ret_status; 118 } 119 120 121 /* 122 * @ingroup sal_crypto 123 * Frees resources (memory and transhandles) if allocated 124 * 125 * @param[in] pCryptoService Pointer to sym service instance 126 * @retval SUCCESS if transhandles released 127 * successfully. 128 */ 129 static CpaStatus 130 SalCtrl_SymFreeResources(sal_crypto_service_t *pCryptoService) 131 { 132 133 CpaStatus status = CPA_STATUS_SUCCESS; 134 135 /* Free memory pools if not NULL */ 136 Lac_MemPoolDestroy(pCryptoService->lac_sym_cookie_pool); 137 138 /* Free misc memory if allocated */ 139 /* Frees memory allocated for Hmac precomputes */ 140 LacSymHash_HmacPrecompShutdown(pCryptoService); 141 /* Free memory allocated for key labels 142 Also clears key stats */ 143 LacSymKey_Shutdown(pCryptoService); 144 /* Free hash lookup table if allocated */ 145 if (NULL != pCryptoService->pLacHashLookupDefs) { 146 LAC_OS_FREE(pCryptoService->pLacHashLookupDefs); 147 } 148 149 /* Free statistics */ 150 LacSym_StatsFree(pCryptoService); 151 152 /* Free transport handles */ 153 status = SalCtrl_SymReleaseTransHandle((sal_service_t *)pCryptoService); 154 return status; 155 } 156 157 158 /** 159 *********************************************************************** 160 * @ingroup SalCtrl 161 * This macro verifies that the status is _SUCCESS 162 * If status is not _SUCCESS then Sym Instance resources are 163 * freed before the function returns the error 164 * 165 * @param[in] status status we are checking 166 * 167 * @return void status is ok (CPA_STATUS_SUCCESS) 168 * @return status The value in the status parameter is an error one 169 * 170 ****************************************************************************/ 171 #define LAC_CHECK_STATUS_SYM_INIT(status) \ 172 do { \ 173 if (CPA_STATUS_SUCCESS != status) { \ 174 SalCtrl_SymFreeResources(pCryptoService); \ 175 return status; \ 176 } \ 177 } while (0) 178 179 180 /* Function that creates the Sym Handles. */ 181 static CpaStatus 182 SalCtrl_SymCreateTransHandle(icp_accel_dev_t *device, 183 sal_service_t *service, 184 Cpa32U numSymRequests, 185 char *section) 186 { 187 CpaStatus status = CPA_STATUS_SUCCESS; 188 char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 189 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 190 icp_resp_deliv_method rx_resp_type = ICP_RESP_TYPE_IRQ; 191 Cpa32U msgSize = 0; 192 193 if (SAL_RESP_POLL_CFG_FILE == pCryptoService->isPolled) { 194 rx_resp_type = ICP_RESP_TYPE_POLL; 195 } 196 197 if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) { 198 section = icpGetProcessName(); 199 } 200 201 /* Parse Sym ring details */ 202 status = 203 Sal_StringParsing("Cy", 204 pCryptoService->generic_service_info.instance, 205 "RingSymTx", 206 temp_string); 207 208 /* Need to free resources in case not _SUCCESS from here */ 209 LAC_CHECK_STATUS_SYM_INIT(status); 210 211 msgSize = LAC_QAT_SYM_REQ_SZ_LW * LAC_LONG_WORD_IN_BYTES; 212 status = 213 icp_adf_transCreateHandle(device, 214 ICP_TRANS_TYPE_ETR, 215 section, 216 pCryptoService->acceleratorNum, 217 pCryptoService->bankNumSym, 218 temp_string, 219 lac_getRingType(SAL_RING_TYPE_A_SYM_HI), 220 NULL, 221 ICP_RESP_TYPE_NONE, 222 numSymRequests, 223 msgSize, 224 (icp_comms_trans_handle *)&( 225 pCryptoService->trans_handle_sym_tx)); 226 LAC_CHECK_STATUS_SYM_INIT(status); 227 228 status = 229 Sal_StringParsing("Cy", 230 pCryptoService->generic_service_info.instance, 231 "RingSymRx", 232 temp_string); 233 LAC_CHECK_STATUS_SYM_INIT(status); 234 235 msgSize = LAC_QAT_SYM_RESP_SZ_LW * LAC_LONG_WORD_IN_BYTES; 236 status = icp_adf_transCreateHandle( 237 device, 238 ICP_TRANS_TYPE_ETR, 239 section, 240 pCryptoService->acceleratorNum, 241 pCryptoService->bankNumSym, 242 temp_string, 243 lac_getRingType(SAL_RING_TYPE_NONE), 244 (icp_trans_callback)LacSymQat_SymRespHandler, 245 rx_resp_type, 246 numSymRequests, 247 msgSize, 248 (icp_comms_trans_handle *)&(pCryptoService->trans_handle_sym_rx)); 249 LAC_CHECK_STATUS_SYM_INIT(status); 250 251 return status; 252 } 253 254 static int 255 SalCtrl_CryptoDebug(void *private_data, char *data, int size, int offset) 256 { 257 CpaStatus status = CPA_STATUS_SUCCESS; 258 Cpa32U len = 0; 259 sal_crypto_service_t *pCryptoService = 260 (sal_crypto_service_t *)private_data; 261 262 switch (offset) { 263 case SAL_STATS_SYM: { 264 CpaCySymStats64 symStats = { 0 }; 265 if (CPA_TRUE != 266 pCryptoService->generic_service_info.stats 267 ->bSymStatsEnabled) { 268 break; 269 } 270 status = cpaCySymQueryStats64(pCryptoService, &symStats); 271 if (status != CPA_STATUS_SUCCESS) { 272 LAC_LOG_ERROR("cpaCySymQueryStats64 returned error\n"); 273 return 0; 274 } 275 276 /* Engine Info */ 277 len += snprintf( 278 data + len, 279 size - len, 280 SEPARATOR BORDER 281 " Statistics for Instance %24s |\n" BORDER 282 " Symmetric Stats " BORDER 283 "\n" SEPARATOR, 284 pCryptoService->debug_file->name); 285 286 /* Session Info */ 287 len += snprintf( 288 data + len, 289 size - len, 290 BORDER " Sessions Initialized: %16llu " BORDER 291 "\n" BORDER 292 " Sessions Removed: %16llu " BORDER 293 "\n" BORDER 294 " Session Errors: %16llu " BORDER 295 "\n" SEPARATOR, 296 (long long unsigned int)symStats.numSessionsInitialized, 297 (long long unsigned int)symStats.numSessionsRemoved, 298 (long long unsigned int)symStats.numSessionErrors); 299 300 /* Session info */ 301 len += snprintf( 302 data + len, 303 size - len, 304 BORDER " Symmetric Requests: %16llu " BORDER 305 "\n" BORDER 306 " Symmetric Request Errors: %16llu " BORDER 307 "\n" BORDER 308 " Symmetric Completed: %16llu " BORDER 309 "\n" BORDER 310 " Symmetric Completed Errors: %16llu " BORDER 311 "\n" BORDER 312 " Symmetric Verify Failures: %16llu " BORDER 313 "\n", 314 (long long unsigned int)symStats.numSymOpRequests, 315 (long long unsigned int)symStats.numSymOpRequestErrors, 316 (long long unsigned int)symStats.numSymOpCompleted, 317 (long long unsigned int)symStats.numSymOpCompletedErrors, 318 (long long unsigned int)symStats.numSymOpVerifyFailures); 319 break; 320 } 321 default: { 322 len += snprintf(data + len, size - len, SEPARATOR); 323 return 0; 324 } 325 } 326 return ++offset; 327 } 328 329 330 static CpaStatus 331 SalCtrl_SymInit(icp_accel_dev_t *device, sal_service_t *service) 332 { 333 CpaStatus status = CPA_STATUS_SUCCESS; 334 Cpa32U qatHmacMode = 0; 335 Cpa32U numSymConcurrentReq = 0; 336 char adfGetParam[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 337 char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 338 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 339 char *section = DYN_SEC; 340 341 /*Instance may not in the DYN section*/ 342 if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) { 343 section = icpGetProcessName(); 344 } 345 346 347 /* Register callbacks for the symmetric services 348 * (Hash, Cipher, Algorithm-Chaining) (returns void)*/ 349 LacSymCb_CallbacksRegister(); 350 351 qatHmacMode = (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC); 352 switch (qatHmacMode) { 353 case HMAC_MODE_1: 354 pCryptoService->qatHmacMode = ICP_QAT_HW_AUTH_MODE1; 355 break; 356 case HMAC_MODE_2: 357 pCryptoService->qatHmacMode = ICP_QAT_HW_AUTH_MODE2; 358 break; 359 default: 360 pCryptoService->qatHmacMode = ICP_QAT_HW_AUTH_MODE1; 361 break; 362 } 363 364 /* Get num concurrent requests from config file */ 365 status = 366 Sal_StringParsing("Cy", 367 pCryptoService->generic_service_info.instance, 368 "NumConcurrentSymRequests", 369 temp_string); 370 LAC_CHECK_STATUS(status); 371 status = 372 icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam); 373 if (CPA_STATUS_SUCCESS != status) { 374 QAT_UTILS_LOG("Failed to get %s from configuration file\n", 375 temp_string); 376 return status; 377 } 378 379 numSymConcurrentReq = 380 (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC); 381 if (CPA_STATUS_FAIL == validateConcurrRequest(numSymConcurrentReq)) { 382 LAC_LOG_ERROR("Invalid NumConcurrentSymRequests, valid " 383 "values {64, 128, 256, ... 32768, 65536}"); 384 return CPA_STATUS_FAIL; 385 } 386 387 /* ADF does not allow us to completely fill the ring for batch requests 388 */ 389 pCryptoService->maxNumSymReqBatch = 390 (numSymConcurrentReq - SAL_BATCH_SUBMIT_FREE_SPACE); 391 392 /* Create transport handles */ 393 status = SalCtrl_SymCreateTransHandle(device, 394 service, 395 numSymConcurrentReq, 396 section); 397 LAC_CHECK_STATUS(status); 398 399 /* Allocates memory pools */ 400 401 /* Create and initialise symmetric cookie memory pool */ 402 pCryptoService->lac_sym_cookie_pool = LAC_MEM_POOL_INIT_POOL_ID; 403 status = 404 Sal_StringParsing("Cy", 405 pCryptoService->generic_service_info.instance, 406 "SymPool", 407 temp_string); 408 LAC_CHECK_STATUS_SYM_INIT(status); 409 /* Note we need twice (i.e. <<1) the number of sym cookies to 410 support sym ring pairs (and some, for partials) */ 411 status = 412 Lac_MemPoolCreate(&pCryptoService->lac_sym_cookie_pool, 413 temp_string, 414 ((numSymConcurrentReq + numSymConcurrentReq + 1) 415 << 1), 416 sizeof(lac_sym_cookie_t), 417 LAC_64BYTE_ALIGNMENT, 418 CPA_FALSE, 419 pCryptoService->nodeAffinity); 420 LAC_CHECK_STATUS_SYM_INIT(status); 421 /* For all sym cookies fill out the physical address of data that 422 will be set to QAT */ 423 Lac_MemPoolInitSymCookiesPhyAddr(pCryptoService->lac_sym_cookie_pool); 424 425 /* Clear stats */ 426 /* Clears Key stats and allocate memory of SSL and TLS labels 427 These labels are initialised to standard values */ 428 status = LacSymKey_Init(pCryptoService); 429 LAC_CHECK_STATUS_SYM_INIT(status); 430 431 /* Initialises the hash lookup table*/ 432 status = LacSymQat_Init(pCryptoService); 433 LAC_CHECK_STATUS_SYM_INIT(status); 434 435 /* Fills out content descriptor for precomputes and registers the 436 hash precompute callback */ 437 status = LacSymHash_HmacPrecompInit(pCryptoService); 438 LAC_CHECK_STATUS_SYM_INIT(status); 439 440 /* Init the Sym stats */ 441 status = LacSym_StatsInit(pCryptoService); 442 LAC_CHECK_STATUS_SYM_INIT(status); 443 444 return status; 445 } 446 447 static void 448 SalCtrl_DebugShutdown(icp_accel_dev_t *device, sal_service_t *service) 449 { 450 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 451 sal_statistics_collection_t *pStatsCollection = 452 (sal_statistics_collection_t *)device->pQatStats; 453 454 if (CPA_TRUE == pStatsCollection->bStatsEnabled) { 455 /* Clean stats */ 456 if (NULL != pCryptoService->debug_file) { 457 icp_adf_debugRemoveFile(pCryptoService->debug_file); 458 LAC_OS_FREE(pCryptoService->debug_file->name); 459 LAC_OS_FREE(pCryptoService->debug_file); 460 pCryptoService->debug_file = NULL; 461 } 462 } 463 pCryptoService->generic_service_info.stats = NULL; 464 } 465 466 static CpaStatus 467 SalCtrl_DebugInit(icp_accel_dev_t *device, sal_service_t *service) 468 { 469 char adfGetParam[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 470 char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 471 char *instance_name = NULL; 472 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 473 sal_statistics_collection_t *pStatsCollection = 474 (sal_statistics_collection_t *)device->pQatStats; 475 CpaStatus status = CPA_STATUS_SUCCESS; 476 char *section = DYN_SEC; 477 478 /*Instance may not in the DYN section*/ 479 if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) { 480 section = icpGetProcessName(); 481 } 482 483 if (CPA_TRUE == pStatsCollection->bStatsEnabled) { 484 /* Get instance name for stats */ 485 instance_name = LAC_OS_MALLOC(ADF_CFG_MAX_VAL_LEN_IN_BYTES); 486 if (NULL == instance_name) { 487 return CPA_STATUS_RESOURCE; 488 } 489 490 status = Sal_StringParsing( 491 "Cy", 492 pCryptoService->generic_service_info.instance, 493 "Name", 494 temp_string); 495 if (CPA_STATUS_SUCCESS != status) { 496 LAC_OS_FREE(instance_name); 497 return status; 498 } 499 status = icp_adf_cfgGetParamValue(device, 500 section, 501 temp_string, 502 adfGetParam); 503 if (CPA_STATUS_SUCCESS != status) { 504 QAT_UTILS_LOG( 505 "Failed to get %s from configuration file\n", 506 temp_string); 507 LAC_OS_FREE(instance_name); 508 return status; 509 } 510 snprintf(instance_name, 511 ADF_CFG_MAX_VAL_LEN_IN_BYTES, 512 "%s", 513 adfGetParam); 514 515 pCryptoService->debug_file = 516 LAC_OS_MALLOC(sizeof(debug_file_info_t)); 517 if (NULL == pCryptoService->debug_file) { 518 LAC_OS_FREE(instance_name); 519 return CPA_STATUS_RESOURCE; 520 } 521 522 memset(pCryptoService->debug_file, 523 0, 524 sizeof(debug_file_info_t)); 525 pCryptoService->debug_file->name = instance_name; 526 pCryptoService->debug_file->seq_read = SalCtrl_CryptoDebug; 527 pCryptoService->debug_file->private_data = pCryptoService; 528 pCryptoService->debug_file->parent = 529 pCryptoService->generic_service_info.debug_parent_dir; 530 531 status = 532 icp_adf_debugAddFile(device, pCryptoService->debug_file); 533 if (CPA_STATUS_SUCCESS != status) { 534 LAC_OS_FREE(instance_name); 535 LAC_OS_FREE(pCryptoService->debug_file); 536 return status; 537 } 538 } 539 pCryptoService->generic_service_info.stats = pStatsCollection; 540 541 return status; 542 } 543 544 static CpaStatus 545 SalCtrl_GetBankNum(icp_accel_dev_t *device, 546 Cpa32U inst, 547 char *section, 548 char *bank_name, 549 Cpa16U *bank) 550 { 551 char adfParamValue[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 552 char adfParamName[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 553 CpaStatus status = CPA_STATUS_SUCCESS; 554 555 status = Sal_StringParsing("Cy", inst, bank_name, adfParamName); 556 LAC_CHECK_STATUS(status); 557 status = icp_adf_cfgGetParamValue(device, 558 section, 559 adfParamName, 560 adfParamValue); 561 if (CPA_STATUS_SUCCESS != status) { 562 QAT_UTILS_LOG("Failed to get %s from configuration file\n", 563 adfParamName); 564 return status; 565 } 566 *bank = (Cpa16U)Sal_Strtoul(adfParamValue, NULL, SAL_CFG_BASE_DEC); 567 return status; 568 } 569 570 static CpaStatus 571 SalCtr_InstInit(icp_accel_dev_t *device, sal_service_t *service) 572 { 573 char adfGetParam[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 574 char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 575 char temp_string2[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 576 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 577 CpaStatus status = CPA_STATUS_SUCCESS; 578 char *section = DYN_SEC; 579 580 /*Instance may not in the DYN section*/ 581 if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) { 582 section = icpGetProcessName(); 583 } 584 585 586 /* Get Config Info: Accel Num, bank Num, packageID, 587 coreAffinity, nodeAffinity and response mode */ 588 589 pCryptoService->acceleratorNum = 0; 590 591 /* Gen4, a bank only has 2 rings (1 ring pair), only one type of service 592 can be assigned one time. asym and sym will be in different bank*/ 593 if (isCyGen4x(pCryptoService)) { 594 switch (service->type) { 595 case SAL_SERVICE_TYPE_CRYPTO_ASYM: 596 status = SalCtrl_GetBankNum( 597 device, 598 pCryptoService->generic_service_info.instance, 599 section, 600 "BankNumberAsym", 601 &pCryptoService->bankNumAsym); 602 if (CPA_STATUS_SUCCESS != status) 603 return status; 604 break; 605 case SAL_SERVICE_TYPE_CRYPTO_SYM: 606 status = SalCtrl_GetBankNum( 607 device, 608 pCryptoService->generic_service_info.instance, 609 section, 610 "BankNumberSym", 611 &pCryptoService->bankNumSym); 612 if (CPA_STATUS_SUCCESS != status) 613 return status; 614 break; 615 case SAL_SERVICE_TYPE_CRYPTO: 616 status = SalCtrl_GetBankNum( 617 device, 618 pCryptoService->generic_service_info.instance, 619 section, 620 "BankNumberAsym", 621 &pCryptoService->bankNumAsym); 622 if (CPA_STATUS_SUCCESS != status) 623 return status; 624 status = SalCtrl_GetBankNum( 625 device, 626 pCryptoService->generic_service_info.instance, 627 section, 628 "BankNumberSym", 629 &pCryptoService->bankNumSym); 630 if (CPA_STATUS_SUCCESS != status) 631 return status; 632 break; 633 default: 634 return CPA_STATUS_FAIL; 635 } 636 } else { 637 status = SalCtrl_GetBankNum( 638 device, 639 pCryptoService->generic_service_info.instance, 640 section, 641 "BankNumber", 642 &pCryptoService->bankNumSym); 643 if (CPA_STATUS_SUCCESS != status) 644 return status; 645 pCryptoService->bankNumAsym = pCryptoService->bankNumSym; 646 } 647 648 status = 649 Sal_StringParsing("Cy", 650 pCryptoService->generic_service_info.instance, 651 "IsPolled", 652 temp_string); 653 LAC_CHECK_STATUS(status); 654 status = 655 icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam); 656 if (CPA_STATUS_SUCCESS != status) { 657 QAT_UTILS_LOG("Failed to get %s from configuration file\n", 658 temp_string); 659 return status; 660 } 661 pCryptoService->isPolled = 662 (Cpa8U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC); 663 664 /* Kernel instances do not support epoll mode */ 665 if (SAL_RESP_EPOLL_CFG_FILE == pCryptoService->isPolled) { 666 QAT_UTILS_LOG( 667 "IsPolled %u is not supported for kernel instance %s", 668 pCryptoService->isPolled, 669 temp_string); 670 return CPA_STATUS_FAIL; 671 } 672 673 status = icp_adf_cfgGetParamValue(device, 674 LAC_CFG_SECTION_GENERAL, 675 ADF_DEV_PKG_ID, 676 adfGetParam); 677 if (CPA_STATUS_SUCCESS != status) { 678 QAT_UTILS_LOG("Failed to get %s from configuration file\n", 679 ADF_DEV_PKG_ID); 680 return status; 681 } 682 pCryptoService->pkgID = 683 (Cpa16U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC); 684 685 status = icp_adf_cfgGetParamValue(device, 686 LAC_CFG_SECTION_GENERAL, 687 ADF_DEV_NODE_ID, 688 adfGetParam); 689 if (CPA_STATUS_SUCCESS != status) { 690 QAT_UTILS_LOG("Failed to get %s from configuration file\n", 691 ADF_DEV_NODE_ID); 692 return status; 693 } 694 pCryptoService->nodeAffinity = 695 (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC); 696 /* In case of interrupt instance, use the bank affinity set by adf_ctl 697 * Otherwise, use the instance affinity for backwards compatibility */ 698 if (SAL_RESP_POLL_CFG_FILE != pCryptoService->isPolled) { 699 /* Next need to read the [AcceleratorX] section of the config 700 * file */ 701 status = Sal_StringParsing("Accelerator", 702 pCryptoService->acceleratorNum, 703 "", 704 temp_string2); 705 LAC_CHECK_STATUS(status); 706 if (service->type == SAL_SERVICE_TYPE_CRYPTO_ASYM) 707 status = Sal_StringParsing("Bank", 708 pCryptoService->bankNumAsym, 709 "CoreAffinity", 710 temp_string); 711 else 712 /* For cy service, asym bank and sym bank will set the 713 same core affinity. So Just read one*/ 714 status = Sal_StringParsing("Bank", 715 pCryptoService->bankNumSym, 716 "CoreAffinity", 717 temp_string); 718 LAC_CHECK_STATUS(status); 719 } else { 720 strncpy(temp_string2, section, (strlen(section) + 1)); 721 status = Sal_StringParsing( 722 "Cy", 723 pCryptoService->generic_service_info.instance, 724 "CoreAffinity", 725 temp_string); 726 LAC_CHECK_STATUS(status); 727 } 728 729 status = icp_adf_cfgGetParamValue(device, 730 temp_string2, 731 temp_string, 732 adfGetParam); 733 if (CPA_STATUS_SUCCESS != status) { 734 QAT_UTILS_LOG("Failed to get %s from configuration file\n", 735 temp_string); 736 return status; 737 } 738 pCryptoService->coreAffinity = 739 (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC); 740 741 /*No Execution Engine in DH895xcc, so make sure it is zero*/ 742 pCryptoService->executionEngine = 0; 743 744 return status; 745 } 746 747 /* This function: 748 * 1. Creates sym and asym transport handles 749 * 2. Allocates memory pools required by sym and asym services 750 .* 3. Clears the sym and asym stats counters 751 * 4. In case service asym or sym is enabled then this function 752 * only allocates resources for these services. i.e if the 753 * service asym is enabled then only asym transport handles 754 * are created and vice versa. 755 */ 756 CpaStatus 757 SalCtrl_CryptoInit(icp_accel_dev_t *device, sal_service_t *service) 758 { 759 CpaStatus status = CPA_STATUS_SUCCESS; 760 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 761 sal_service_type_t svc_type = service->type; 762 763 SAL_SERVICE_GOOD_FOR_INIT(pCryptoService); 764 pCryptoService->generic_service_info.state = 765 SAL_SERVICE_STATE_INITIALIZING; 766 767 /* Set up the instance parameters such as bank number, 768 * coreAffinity, pkgId and node affinity etc 769 */ 770 status = SalCtr_InstInit(device, service); 771 LAC_CHECK_STATUS(status); 772 /* Create debug directory for service */ 773 status = SalCtrl_DebugInit(device, service); 774 LAC_CHECK_STATUS(status); 775 776 switch (svc_type) { 777 case SAL_SERVICE_TYPE_CRYPTO_ASYM: 778 break; 779 case SAL_SERVICE_TYPE_CRYPTO_SYM: 780 status = SalCtrl_SymInit(device, service); 781 if (CPA_STATUS_SUCCESS != status) { 782 SalCtrl_DebugShutdown(device, service); 783 return status; 784 } 785 break; 786 case SAL_SERVICE_TYPE_CRYPTO: 787 status = SalCtrl_SymInit(device, service); 788 if (CPA_STATUS_SUCCESS != status) { 789 SalCtrl_DebugShutdown(device, service); 790 return status; 791 } 792 break; 793 default: 794 LAC_LOG_ERROR("Invalid service type\n"); 795 status = CPA_STATUS_FAIL; 796 break; 797 } 798 799 pCryptoService->generic_service_info.state = 800 SAL_SERVICE_STATE_INITIALIZED; 801 802 return status; 803 } 804 805 CpaStatus 806 SalCtrl_CryptoStart(icp_accel_dev_t *device, sal_service_t *service) 807 { 808 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 809 CpaStatus status = CPA_STATUS_SUCCESS; 810 811 if (pCryptoService->generic_service_info.state != 812 SAL_SERVICE_STATE_INITIALIZED) { 813 LAC_LOG_ERROR("Not in the correct state to call start\n"); 814 return CPA_STATUS_FAIL; 815 } 816 817 pCryptoService->generic_service_info.state = SAL_SERVICE_STATE_RUNNING; 818 return status; 819 } 820 821 CpaStatus 822 SalCtrl_CryptoStop(icp_accel_dev_t *device, sal_service_t *service) 823 { 824 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 825 826 if (SAL_SERVICE_STATE_RUNNING != 827 pCryptoService->generic_service_info.state) { 828 LAC_LOG_ERROR("Not in the correct state to call stop"); 829 } 830 831 pCryptoService->generic_service_info.state = 832 SAL_SERVICE_STATE_SHUTTING_DOWN; 833 return CPA_STATUS_SUCCESS; 834 } 835 836 CpaStatus 837 SalCtrl_CryptoShutdown(icp_accel_dev_t *device, sal_service_t *service) 838 { 839 sal_crypto_service_t *pCryptoService = (sal_crypto_service_t *)service; 840 CpaStatus status = CPA_STATUS_SUCCESS; 841 sal_service_type_t svc_type = service->type; 842 843 if ((SAL_SERVICE_STATE_INITIALIZED != 844 pCryptoService->generic_service_info.state) && 845 (SAL_SERVICE_STATE_SHUTTING_DOWN != 846 pCryptoService->generic_service_info.state)) { 847 LAC_LOG_ERROR("Not in the correct state to call shutdown \n"); 848 return CPA_STATUS_FAIL; 849 } 850 851 852 /* Free memory and transhandles */ 853 switch (svc_type) { 854 case SAL_SERVICE_TYPE_CRYPTO_ASYM: 855 break; 856 case SAL_SERVICE_TYPE_CRYPTO_SYM: 857 if (SalCtrl_SymFreeResources(pCryptoService)) { 858 status = CPA_STATUS_FAIL; 859 } 860 break; 861 case SAL_SERVICE_TYPE_CRYPTO: 862 if (SalCtrl_SymFreeResources(pCryptoService)) { 863 status = CPA_STATUS_FAIL; 864 } 865 break; 866 default: 867 LAC_LOG_ERROR("Invalid service type\n"); 868 status = CPA_STATUS_FAIL; 869 break; 870 } 871 872 SalCtrl_DebugShutdown(device, service); 873 874 pCryptoService->generic_service_info.state = SAL_SERVICE_STATE_SHUTDOWN; 875 876 return status; 877 } 878 879 /** 880 ****************************************************************************** 881 * @ingroup cpaCyCommon 882 *****************************************************************************/ 883 CpaStatus 884 cpaCyGetStatusText(const CpaInstanceHandle instanceHandle, 885 CpaStatus errStatus, 886 Cpa8S *pStatusText) 887 { 888 CpaStatus status = CPA_STATUS_SUCCESS; 889 890 891 LAC_CHECK_NULL_PARAM(pStatusText); 892 893 switch (errStatus) { 894 case CPA_STATUS_SUCCESS: 895 LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_SUCCESS); 896 break; 897 case CPA_STATUS_FAIL: 898 LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FAIL); 899 break; 900 case CPA_STATUS_RETRY: 901 LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RETRY); 902 break; 903 case CPA_STATUS_RESOURCE: 904 LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RESOURCE); 905 break; 906 case CPA_STATUS_INVALID_PARAM: 907 LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_INVALID_PARAM); 908 break; 909 case CPA_STATUS_FATAL: 910 LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FATAL); 911 break; 912 case CPA_STATUS_UNSUPPORTED: 913 LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_UNSUPPORTED); 914 break; 915 default: 916 status = CPA_STATUS_INVALID_PARAM; 917 break; 918 } 919 return status; 920 } 921 922 void 923 SalCtrl_CyQueryCapabilities(sal_service_t *pGenericService, 924 CpaCyCapabilitiesInfo *pCapInfo) 925 { 926 memset(pCapInfo, 0, sizeof(CpaCyCapabilitiesInfo)); 927 928 if (SAL_SERVICE_TYPE_CRYPTO == pGenericService->type || 929 SAL_SERVICE_TYPE_CRYPTO_SYM == pGenericService->type) { 930 pCapInfo->symSupported = CPA_TRUE; 931 if (pGenericService->capabilitiesMask & 932 ICP_ACCEL_CAPABILITIES_EXT_ALGCHAIN) { 933 pCapInfo->extAlgchainSupported = CPA_TRUE; 934 } 935 936 if (pGenericService->capabilitiesMask & 937 ICP_ACCEL_CAPABILITIES_HKDF) { 938 pCapInfo->hkdfSupported = CPA_TRUE; 939 } 940 } 941 942 if (pGenericService->capabilitiesMask & 943 ICP_ACCEL_CAPABILITIES_ECEDMONT) { 944 pCapInfo->ecEdMontSupported = CPA_TRUE; 945 } 946 947 if (pGenericService->capabilitiesMask & 948 ICP_ACCEL_CAPABILITIES_RANDOM_NUMBER) { 949 pCapInfo->nrbgSupported = CPA_TRUE; 950 } 951 952 pCapInfo->drbgSupported = CPA_FALSE; 953 pCapInfo->randSupported = CPA_FALSE; 954 pCapInfo->nrbgSupported = CPA_FALSE; 955 } 956 957 /** 958 ****************************************************************************** 959 * @ingroup cpaCyCommon 960 *****************************************************************************/ 961 CpaStatus 962 cpaCyStartInstance(CpaInstanceHandle instanceHandle_in) 963 { 964 CpaInstanceHandle instanceHandle = NULL; 965 /* Structure initializer is supported by C99, but it is 966 * not supported by some former Intel compilers. 967 */ 968 CpaInstanceInfo2 info = { 0 }; 969 icp_accel_dev_t *dev = NULL; 970 CpaStatus status = CPA_STATUS_SUCCESS; 971 sal_crypto_service_t *pService = NULL; 972 973 974 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 975 instanceHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO); 976 if (!instanceHandle) { 977 instanceHandle = 978 Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_SYM); 979 } 980 } else { 981 instanceHandle = instanceHandle_in; 982 } 983 LAC_CHECK_NULL_PARAM(instanceHandle); 984 SAL_CHECK_INSTANCE_TYPE(instanceHandle, 985 (SAL_SERVICE_TYPE_CRYPTO | 986 SAL_SERVICE_TYPE_CRYPTO_ASYM | 987 SAL_SERVICE_TYPE_CRYPTO_SYM)); 988 989 pService = (sal_crypto_service_t *)instanceHandle; 990 991 status = cpaCyInstanceGetInfo2(instanceHandle, &info); 992 if (CPA_STATUS_SUCCESS != status) { 993 LAC_LOG_ERROR("Can not get instance info\n"); 994 return status; 995 } 996 dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId); 997 if (NULL == dev) { 998 LAC_LOG_ERROR("Can not find device for the instance\n"); 999 return CPA_STATUS_FAIL; 1000 } 1001 1002 pService->generic_service_info.isInstanceStarted = CPA_TRUE; 1003 1004 /* Increment dev ref counter */ 1005 icp_qa_dev_get(dev); 1006 return CPA_STATUS_SUCCESS; 1007 } 1008 1009 /** 1010 ****************************************************************************** 1011 * @ingroup cpaCyCommon 1012 *****************************************************************************/ 1013 CpaStatus 1014 cpaCyStopInstance(CpaInstanceHandle instanceHandle_in) 1015 { 1016 CpaInstanceHandle instanceHandle = NULL; 1017 /* Structure initializer is supported by C99, but it is 1018 * not supported by some former Intel compilers. 1019 */ 1020 CpaInstanceInfo2 info = { 0 }; 1021 icp_accel_dev_t *dev = NULL; 1022 CpaStatus status = CPA_STATUS_SUCCESS; 1023 sal_crypto_service_t *pService = NULL; 1024 1025 1026 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1027 instanceHandle = Lac_CryptoGetFirstHandle(); 1028 } else { 1029 instanceHandle = instanceHandle_in; 1030 } 1031 LAC_CHECK_NULL_PARAM(instanceHandle); 1032 SAL_CHECK_INSTANCE_TYPE(instanceHandle, 1033 (SAL_SERVICE_TYPE_CRYPTO | 1034 SAL_SERVICE_TYPE_CRYPTO_ASYM | 1035 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1036 1037 status = cpaCyInstanceGetInfo2(instanceHandle, &info); 1038 if (CPA_STATUS_SUCCESS != status) { 1039 LAC_LOG_ERROR("Can not get instance info\n"); 1040 return status; 1041 } 1042 dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId); 1043 if (NULL == dev) { 1044 LAC_LOG_ERROR("Can not find device for the instance\n"); 1045 return CPA_STATUS_FAIL; 1046 } 1047 1048 pService = (sal_crypto_service_t *)instanceHandle; 1049 1050 pService->generic_service_info.isInstanceStarted = CPA_FALSE; 1051 1052 /* Decrement dev ref counter */ 1053 icp_qa_dev_put(dev); 1054 return CPA_STATUS_SUCCESS; 1055 } 1056 1057 /** 1058 ****************************************************************************** 1059 * @ingroup cpaCyCommon 1060 *****************************************************************************/ 1061 CpaStatus 1062 cpaCyInstanceSetNotificationCb( 1063 const CpaInstanceHandle instanceHandle, 1064 const CpaCyInstanceNotificationCbFunc pInstanceNotificationCb, 1065 void *pCallbackTag) 1066 { 1067 CpaStatus status = CPA_STATUS_SUCCESS; 1068 sal_service_t *gen_handle = instanceHandle; 1069 1070 1071 LAC_CHECK_NULL_PARAM(gen_handle); 1072 gen_handle->notification_cb = pInstanceNotificationCb; 1073 gen_handle->cb_tag = pCallbackTag; 1074 return status; 1075 } 1076 1077 /** 1078 ****************************************************************************** 1079 * @ingroup cpaCyCommon 1080 *****************************************************************************/ 1081 CpaStatus 1082 cpaCyGetNumInstances(Cpa16U *pNumInstances) 1083 { 1084 CpaStatus status = CPA_STATUS_SUCCESS; 1085 CpaInstanceHandle cyInstanceHandle; 1086 CpaInstanceInfo2 info; 1087 icp_accel_dev_t **pAdfInsts = NULL; 1088 icp_accel_dev_t *dev_addr = NULL; 1089 sal_t *base_addr = NULL; 1090 sal_list_t *list_temp = NULL; 1091 Cpa16U num_accel_dev = 0; 1092 Cpa16U num_inst = 0; 1093 Cpa16U i = 0; 1094 1095 LAC_CHECK_NULL_PARAM(pNumInstances); 1096 1097 /* Get the number of accel_dev in the system */ 1098 status = icp_amgr_getNumInstances(&num_accel_dev); 1099 LAC_CHECK_STATUS(status); 1100 1101 /* Allocate memory to store addr of accel_devs */ 1102 pAdfInsts = 1103 malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK); 1104 num_accel_dev = 0; 1105 /* Get ADF to return all accel_devs that support either 1106 * symmetric or asymmetric crypto */ 1107 status = icp_amgr_getAllAccelDevByCapabilities( 1108 (ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC | 1109 ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC), 1110 pAdfInsts, 1111 &num_accel_dev); 1112 if (CPA_STATUS_SUCCESS != status) { 1113 LAC_LOG_ERROR("No support for crypto\n"); 1114 *pNumInstances = 0; 1115 free(pAdfInsts, M_QAT); 1116 return status; 1117 } 1118 1119 for (i = 0; i < num_accel_dev; i++) { 1120 dev_addr = (icp_accel_dev_t *)pAdfInsts[i]; 1121 if (NULL == dev_addr || NULL == dev_addr->pSalHandle) { 1122 continue; 1123 } 1124 1125 base_addr = dev_addr->pSalHandle; 1126 list_temp = base_addr->crypto_services; 1127 while (NULL != list_temp) { 1128 cyInstanceHandle = SalList_getObject(list_temp); 1129 status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info); 1130 if (CPA_STATUS_SUCCESS == status && 1131 CPA_TRUE == info.isPolled) { 1132 num_inst++; 1133 } 1134 list_temp = SalList_next(list_temp); 1135 } 1136 list_temp = base_addr->asym_services; 1137 while (NULL != list_temp) { 1138 cyInstanceHandle = SalList_getObject(list_temp); 1139 status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info); 1140 if (CPA_STATUS_SUCCESS == status && 1141 CPA_TRUE == info.isPolled) { 1142 num_inst++; 1143 } 1144 list_temp = SalList_next(list_temp); 1145 } 1146 list_temp = base_addr->sym_services; 1147 while (NULL != list_temp) { 1148 cyInstanceHandle = SalList_getObject(list_temp); 1149 status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info); 1150 if (CPA_STATUS_SUCCESS == status && 1151 CPA_TRUE == info.isPolled) { 1152 num_inst++; 1153 } 1154 list_temp = SalList_next(list_temp); 1155 } 1156 } 1157 *pNumInstances = num_inst; 1158 free(pAdfInsts, M_QAT); 1159 1160 1161 return status; 1162 } 1163 1164 /** 1165 ****************************************************************************** 1166 * @ingroup cpaCyCommon 1167 *****************************************************************************/ 1168 CpaStatus 1169 cpaCyGetInstances(Cpa16U numInstances, CpaInstanceHandle *pCyInstances) 1170 { 1171 CpaStatus status = CPA_STATUS_SUCCESS; 1172 CpaInstanceHandle cyInstanceHandle; 1173 CpaInstanceInfo2 info; 1174 icp_accel_dev_t **pAdfInsts = NULL; 1175 icp_accel_dev_t *dev_addr = NULL; 1176 sal_t *base_addr = NULL; 1177 sal_list_t *list_temp = NULL; 1178 Cpa16U num_accel_dev = 0; 1179 Cpa16U num_allocated_instances = 0; 1180 Cpa16U index = 0; 1181 Cpa16U i = 0; 1182 1183 1184 LAC_CHECK_NULL_PARAM(pCyInstances); 1185 if (0 == numInstances) { 1186 LAC_INVALID_PARAM_LOG("NumInstances is 0"); 1187 return CPA_STATUS_INVALID_PARAM; 1188 } 1189 1190 /* Get the number of crypto instances */ 1191 status = cpaCyGetNumInstances(&num_allocated_instances); 1192 if (CPA_STATUS_SUCCESS != status) { 1193 return status; 1194 } 1195 1196 if (numInstances > num_allocated_instances) { 1197 QAT_UTILS_LOG("Only %d crypto instances available\n", 1198 num_allocated_instances); 1199 return CPA_STATUS_RESOURCE; 1200 } 1201 1202 /* Get the number of accel devices in the system */ 1203 status = icp_amgr_getNumInstances(&num_accel_dev); 1204 LAC_CHECK_STATUS(status); 1205 1206 /* Allocate memory to store addr of accel_devs */ 1207 pAdfInsts = 1208 malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK); 1209 1210 num_accel_dev = 0; 1211 /* Get ADF to return all accel_devs that support either 1212 * symmetric or asymmetric crypto */ 1213 status = icp_amgr_getAllAccelDevByCapabilities( 1214 (ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC | 1215 ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC), 1216 pAdfInsts, 1217 &num_accel_dev); 1218 if (CPA_STATUS_SUCCESS != status) { 1219 LAC_LOG_ERROR("No support for crypto\n"); 1220 free(pAdfInsts, M_QAT); 1221 return status; 1222 } 1223 1224 for (i = 0; i < num_accel_dev; i++) { 1225 dev_addr = (icp_accel_dev_t *)pAdfInsts[i]; 1226 /* Note dev_addr cannot be NULL here as numInstances = 0 1227 * is not valid and if dev_addr = NULL then index = 0 (which 1228 * is less than numInstances and status is set to _RESOURCE 1229 * above 1230 */ 1231 base_addr = dev_addr->pSalHandle; 1232 if (NULL == base_addr) { 1233 continue; 1234 } 1235 list_temp = base_addr->crypto_services; 1236 while (NULL != list_temp) { 1237 if (index > (numInstances - 1)) { 1238 break; 1239 } 1240 cyInstanceHandle = SalList_getObject(list_temp); 1241 status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info); 1242 list_temp = SalList_next(list_temp); 1243 if (CPA_STATUS_SUCCESS != status || 1244 CPA_TRUE != info.isPolled) { 1245 continue; 1246 } 1247 pCyInstances[index] = cyInstanceHandle; 1248 index++; 1249 } 1250 list_temp = base_addr->asym_services; 1251 while (NULL != list_temp) { 1252 if (index > (numInstances - 1)) { 1253 break; 1254 } 1255 cyInstanceHandle = SalList_getObject(list_temp); 1256 status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info); 1257 list_temp = SalList_next(list_temp); 1258 if (CPA_STATUS_SUCCESS != status || 1259 CPA_TRUE != info.isPolled) { 1260 continue; 1261 } 1262 pCyInstances[index] = cyInstanceHandle; 1263 index++; 1264 } 1265 list_temp = base_addr->sym_services; 1266 while (NULL != list_temp) { 1267 if (index > (numInstances - 1)) { 1268 break; 1269 } 1270 cyInstanceHandle = SalList_getObject(list_temp); 1271 status = cpaCyInstanceGetInfo2(cyInstanceHandle, &info); 1272 list_temp = SalList_next(list_temp); 1273 if (CPA_STATUS_SUCCESS != status || 1274 CPA_TRUE != info.isPolled) { 1275 continue; 1276 } 1277 pCyInstances[index] = cyInstanceHandle; 1278 index++; 1279 } 1280 } 1281 free(pAdfInsts, M_QAT); 1282 1283 return status; 1284 } 1285 1286 /** 1287 ****************************************************************************** 1288 * @ingroup cpaCyCommon 1289 *****************************************************************************/ 1290 CpaStatus 1291 cpaCyInstanceGetInfo(const CpaInstanceHandle instanceHandle_in, 1292 struct _CpaInstanceInfo *pInstanceInfo) 1293 { 1294 CpaInstanceHandle instanceHandle = NULL; 1295 sal_crypto_service_t *pCryptoService = NULL; 1296 sal_service_t *pGenericService = NULL; 1297 1298 Cpa8U name[CPA_INST_NAME_SIZE] = 1299 "Intel(R) DH89XXCC instance number: %02x, type: Crypto"; 1300 1301 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1302 instanceHandle = Lac_CryptoGetFirstHandle(); 1303 } else { 1304 instanceHandle = instanceHandle_in; 1305 } 1306 1307 LAC_CHECK_NULL_PARAM(instanceHandle); 1308 LAC_CHECK_NULL_PARAM(pInstanceInfo); 1309 SAL_CHECK_INSTANCE_TYPE(instanceHandle, 1310 (SAL_SERVICE_TYPE_CRYPTO | 1311 SAL_SERVICE_TYPE_CRYPTO_ASYM | 1312 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1313 1314 pCryptoService = (sal_crypto_service_t *)instanceHandle; 1315 1316 pInstanceInfo->type = CPA_INSTANCE_TYPE_CRYPTO; 1317 1318 /* According to cpa.h instance state is initialized and ready for use 1319 * or shutdown. Therefore need to map our running state to initialised 1320 * or shutdown */ 1321 if (SAL_SERVICE_STATE_RUNNING == 1322 pCryptoService->generic_service_info.state) { 1323 pInstanceInfo->state = CPA_INSTANCE_STATE_INITIALISED; 1324 } else { 1325 pInstanceInfo->state = CPA_INSTANCE_STATE_SHUTDOWN; 1326 } 1327 1328 pGenericService = (sal_service_t *)instanceHandle; 1329 snprintf((char *)pInstanceInfo->name, 1330 CPA_INST_NAME_SIZE, 1331 (char *)name, 1332 pGenericService->instance); 1333 1334 pInstanceInfo->name[CPA_INST_NAME_SIZE - 1] = '\0'; 1335 1336 snprintf((char *)pInstanceInfo->version, 1337 CPA_INSTANCE_MAX_NAME_SIZE_IN_BYTES, 1338 "%d.%d", 1339 CPA_CY_API_VERSION_NUM_MAJOR, 1340 CPA_CY_API_VERSION_NUM_MINOR); 1341 1342 pInstanceInfo->version[CPA_INSTANCE_MAX_VERSION_SIZE_IN_BYTES - 1] = 1343 '\0'; 1344 return CPA_STATUS_SUCCESS; 1345 } 1346 1347 /** 1348 ****************************************************************************** 1349 * @ingroup cpaCyCommon 1350 *****************************************************************************/ 1351 CpaStatus 1352 cpaCyInstanceGetInfo2(const CpaInstanceHandle instanceHandle_in, 1353 CpaInstanceInfo2 *pInstanceInfo2) 1354 { 1355 CpaInstanceHandle instanceHandle = NULL; 1356 sal_crypto_service_t *pCryptoService = NULL; 1357 icp_accel_dev_t *dev = NULL; 1358 CpaStatus status = CPA_STATUS_SUCCESS; 1359 char keyStr[ADF_CFG_MAX_KEY_LEN_IN_BYTES] = { 0 }; 1360 char valStr[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 }; 1361 char *section = DYN_SEC; 1362 1363 1364 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1365 instanceHandle = Lac_CryptoGetFirstHandle(); 1366 } else { 1367 instanceHandle = instanceHandle_in; 1368 } 1369 1370 LAC_CHECK_NULL_PARAM(instanceHandle); 1371 LAC_CHECK_NULL_PARAM(pInstanceInfo2); 1372 SAL_CHECK_INSTANCE_TYPE(instanceHandle, 1373 (SAL_SERVICE_TYPE_CRYPTO | 1374 SAL_SERVICE_TYPE_CRYPTO_ASYM | 1375 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1376 1377 LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2)); 1378 pInstanceInfo2->accelerationServiceType = CPA_ACC_SVC_TYPE_CRYPTO; 1379 snprintf((char *)pInstanceInfo2->vendorName, 1380 CPA_INST_VENDOR_NAME_SIZE, 1381 "%s", 1382 SAL_INFO2_VENDOR_NAME); 1383 pInstanceInfo2->vendorName[CPA_INST_VENDOR_NAME_SIZE - 1] = '\0'; 1384 1385 snprintf((char *)pInstanceInfo2->swVersion, 1386 CPA_INST_SW_VERSION_SIZE, 1387 "Version %d.%d", 1388 SAL_INFO2_DRIVER_SW_VERSION_MAJ_NUMBER, 1389 SAL_INFO2_DRIVER_SW_VERSION_MIN_NUMBER); 1390 pInstanceInfo2->swVersion[CPA_INST_SW_VERSION_SIZE - 1] = '\0'; 1391 1392 /* Note we can safely read the contents of the crypto service instance 1393 here because icp_amgr_getAllAccelDevByCapabilities() only returns 1394 devs 1395 that have started */ 1396 pCryptoService = (sal_crypto_service_t *)instanceHandle; 1397 pInstanceInfo2->physInstId.packageId = pCryptoService->pkgID; 1398 pInstanceInfo2->physInstId.acceleratorId = 1399 pCryptoService->acceleratorNum; 1400 pInstanceInfo2->physInstId.executionEngineId = 1401 pCryptoService->executionEngine; 1402 pInstanceInfo2->physInstId.busAddress = 1403 icp_adf_get_busAddress(pInstanceInfo2->physInstId.packageId); 1404 1405 /*set coreAffinity to zero before use */ 1406 LAC_OS_BZERO(pInstanceInfo2->coreAffinity, 1407 sizeof(pInstanceInfo2->coreAffinity)); 1408 CPA_BITMAP_BIT_SET(pInstanceInfo2->coreAffinity, 1409 pCryptoService->coreAffinity); 1410 pInstanceInfo2->nodeAffinity = pCryptoService->nodeAffinity; 1411 1412 if (SAL_SERVICE_STATE_RUNNING == 1413 pCryptoService->generic_service_info.state) { 1414 pInstanceInfo2->operState = CPA_OPER_STATE_UP; 1415 } else { 1416 pInstanceInfo2->operState = CPA_OPER_STATE_DOWN; 1417 } 1418 1419 pInstanceInfo2->requiresPhysicallyContiguousMemory = CPA_TRUE; 1420 if (SAL_RESP_POLL_CFG_FILE == pCryptoService->isPolled) { 1421 pInstanceInfo2->isPolled = CPA_TRUE; 1422 } else { 1423 pInstanceInfo2->isPolled = CPA_FALSE; 1424 } 1425 pInstanceInfo2->isOffloaded = CPA_TRUE; 1426 1427 /* Get the instance name and part name*/ 1428 dev = icp_adf_getAccelDevByAccelId(pCryptoService->pkgID); 1429 if (NULL == dev) { 1430 LAC_LOG_ERROR("Can not find device for the instance\n"); 1431 LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2)); 1432 return CPA_STATUS_FAIL; 1433 } 1434 snprintf((char *)pInstanceInfo2->partName, 1435 CPA_INST_PART_NAME_SIZE, 1436 SAL_INFO2_PART_NAME, 1437 dev->deviceName); 1438 pInstanceInfo2->partName[CPA_INST_PART_NAME_SIZE - 1] = '\0'; 1439 1440 status = 1441 Sal_StringParsing("Cy", 1442 pCryptoService->generic_service_info.instance, 1443 "Name", 1444 keyStr); 1445 LAC_CHECK_STATUS(status); 1446 1447 if (CPA_FALSE == pCryptoService->generic_service_info.is_dyn) { 1448 section = icpGetProcessName(); 1449 } 1450 1451 status = icp_adf_cfgGetParamValue(dev, section, keyStr, valStr); 1452 LAC_CHECK_STATUS(status); 1453 1454 snprintf((char *)pInstanceInfo2->instName, 1455 CPA_INST_NAME_SIZE, 1456 "%s", 1457 valStr); 1458 snprintf((char *)pInstanceInfo2->instID, 1459 CPA_INST_ID_SIZE, 1460 "%s_%s", 1461 section, 1462 valStr); 1463 return CPA_STATUS_SUCCESS; 1464 } 1465 1466 /** 1467 ****************************************************************************** 1468 * @ingroup cpaCyCommon 1469 *****************************************************************************/ 1470 1471 CpaStatus 1472 cpaCyQueryCapabilities(const CpaInstanceHandle instanceHandle_in, 1473 CpaCyCapabilitiesInfo *pCapInfo) 1474 { 1475 /* Verify Instance exists */ 1476 CpaInstanceHandle instanceHandle = NULL; 1477 1478 1479 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1480 instanceHandle = Lac_CryptoGetFirstHandle(); 1481 } else { 1482 instanceHandle = instanceHandle_in; 1483 } 1484 1485 LAC_CHECK_NULL_PARAM(instanceHandle); 1486 SAL_CHECK_INSTANCE_TYPE(instanceHandle, 1487 (SAL_SERVICE_TYPE_CRYPTO | 1488 SAL_SERVICE_TYPE_CRYPTO_ASYM | 1489 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1490 LAC_CHECK_NULL_PARAM(pCapInfo); 1491 1492 SalCtrl_CyQueryCapabilities((sal_service_t *)instanceHandle, pCapInfo); 1493 1494 return CPA_STATUS_SUCCESS; 1495 } 1496 1497 /** 1498 ****************************************************************************** 1499 * @ingroup cpaCySym 1500 *****************************************************************************/ 1501 CpaStatus 1502 cpaCySymQueryCapabilities(const CpaInstanceHandle instanceHandle_in, 1503 CpaCySymCapabilitiesInfo *pCapInfo) 1504 { 1505 sal_crypto_service_t *pCryptoService = NULL; 1506 sal_service_t *pGenericService = NULL; 1507 CpaInstanceHandle instanceHandle = NULL; 1508 1509 /* Verify Instance exists */ 1510 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1511 instanceHandle = Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO); 1512 if (!instanceHandle) { 1513 instanceHandle = 1514 Lac_GetFirstHandle(SAL_SERVICE_TYPE_CRYPTO_SYM); 1515 } 1516 } else { 1517 instanceHandle = instanceHandle_in; 1518 } 1519 1520 LAC_CHECK_NULL_PARAM(instanceHandle); 1521 SAL_CHECK_INSTANCE_TYPE(instanceHandle, 1522 (SAL_SERVICE_TYPE_CRYPTO | 1523 SAL_SERVICE_TYPE_CRYPTO_ASYM | 1524 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1525 LAC_CHECK_NULL_PARAM(pCapInfo); 1526 1527 pCryptoService = (sal_crypto_service_t *)instanceHandle; 1528 pGenericService = &(pCryptoService->generic_service_info); 1529 1530 memset(pCapInfo, '\0', sizeof(CpaCySymCapabilitiesInfo)); 1531 /* An asym crypto instance does not support sym service */ 1532 if (SAL_SERVICE_TYPE_CRYPTO_ASYM == pGenericService->type) { 1533 return CPA_STATUS_SUCCESS; 1534 } 1535 1536 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_NULL); 1537 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_ECB); 1538 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_CBC); 1539 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_CTR); 1540 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_CCM); 1541 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_GCM); 1542 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_XTS); 1543 if (isCyGen2x(pCryptoService)) { 1544 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_ARC4); 1545 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1546 CPA_CY_SYM_CIPHER_DES_ECB); 1547 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1548 CPA_CY_SYM_CIPHER_DES_CBC); 1549 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1550 CPA_CY_SYM_CIPHER_3DES_ECB); 1551 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1552 CPA_CY_SYM_CIPHER_3DES_CBC); 1553 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1554 CPA_CY_SYM_CIPHER_3DES_CTR); 1555 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1556 CPA_CY_SYM_CIPHER_KASUMI_F8); 1557 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1558 CPA_CY_SYM_CIPHER_SNOW3G_UEA2); 1559 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_AES_F8); 1560 } 1561 1562 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA1); 1563 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA224); 1564 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA256); 1565 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA384); 1566 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA512); 1567 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_XCBC); 1568 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_CCM); 1569 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_GCM); 1570 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_CMAC); 1571 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_GMAC); 1572 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_AES_CBC_MAC); 1573 if (isCyGen2x(pCryptoService)) { 1574 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_MD5); 1575 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_KASUMI_F9); 1576 CPA_BITMAP_BIT_SET(pCapInfo->hashes, 1577 CPA_CY_SYM_HASH_SNOW3G_UIA2); 1578 } 1579 1580 if (pGenericService->capabilitiesMask & 1581 ICP_ACCEL_CAPABILITIES_CRYPTO_ZUC) { 1582 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1583 CPA_CY_SYM_CIPHER_ZUC_EEA3); 1584 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_ZUC_EIA3); 1585 } 1586 1587 if (pGenericService->capabilitiesMask & 1588 ICP_ACCEL_CAPABILITIES_CHACHA_POLY) { 1589 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_POLY); 1590 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, CPA_CY_SYM_CIPHER_CHACHA); 1591 } 1592 1593 if (pGenericService->capabilitiesMask & ICP_ACCEL_CAPABILITIES_SM3) { 1594 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SM3); 1595 } 1596 1597 pCapInfo->partialPacketSupported = CPA_TRUE; 1598 1599 if (pGenericService->capabilitiesMask & ICP_ACCEL_CAPABILITIES_SHA3) { 1600 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_256); 1601 pCapInfo->partialPacketSupported = CPA_FALSE; 1602 } 1603 1604 if (pGenericService->capabilitiesMask & 1605 ICP_ACCEL_CAPABILITIES_SHA3_EXT) { 1606 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_224); 1607 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_256); 1608 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_384); 1609 CPA_BITMAP_BIT_SET(pCapInfo->hashes, CPA_CY_SYM_HASH_SHA3_512); 1610 pCapInfo->partialPacketSupported = CPA_FALSE; 1611 } 1612 1613 if (pGenericService->capabilitiesMask & ICP_ACCEL_CAPABILITIES_SM4) { 1614 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1615 CPA_CY_SYM_CIPHER_SM4_ECB); 1616 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1617 CPA_CY_SYM_CIPHER_SM4_CBC); 1618 CPA_BITMAP_BIT_SET(pCapInfo->ciphers, 1619 CPA_CY_SYM_CIPHER_SM4_CTR); 1620 pCapInfo->partialPacketSupported = CPA_FALSE; 1621 } 1622 1623 return CPA_STATUS_SUCCESS; 1624 } 1625 1626 /** 1627 ****************************************************************************** 1628 * @ingroup cpaCyCommon 1629 *****************************************************************************/ 1630 CpaStatus 1631 cpaCySetAddressTranslation(const CpaInstanceHandle instanceHandle_in, 1632 CpaVirtualToPhysical virtual2physical) 1633 { 1634 1635 CpaInstanceHandle instanceHandle = NULL; 1636 sal_service_t *pService = NULL; 1637 1638 1639 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1640 instanceHandle = Lac_CryptoGetFirstHandle(); 1641 } else { 1642 instanceHandle = instanceHandle_in; 1643 } 1644 1645 LAC_CHECK_NULL_PARAM(instanceHandle); 1646 SAL_CHECK_INSTANCE_TYPE(instanceHandle, 1647 (SAL_SERVICE_TYPE_CRYPTO | 1648 SAL_SERVICE_TYPE_CRYPTO_ASYM | 1649 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1650 LAC_CHECK_NULL_PARAM(virtual2physical); 1651 1652 pService = (sal_service_t *)instanceHandle; 1653 1654 pService->virt2PhysClient = virtual2physical; 1655 1656 return CPA_STATUS_SUCCESS; 1657 } 1658 1659 /** 1660 ****************************************************************************** 1661 * @ingroup cpaCyCommon 1662 * Crypto specific polling function which polls a crypto instance. 1663 *****************************************************************************/ 1664 CpaStatus 1665 icp_sal_CyPollInstance(CpaInstanceHandle instanceHandle_in, 1666 Cpa32U response_quota) 1667 { 1668 CpaStatus status = CPA_STATUS_SUCCESS; 1669 sal_crypto_service_t *crypto_handle = NULL; 1670 sal_service_t *gen_handle = NULL; 1671 icp_comms_trans_handle trans_hndTable[MAX_CY_RX_RINGS] = { 0 }; 1672 Cpa32U num_rx_rings = 0; 1673 1674 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1675 crypto_handle = 1676 (sal_crypto_service_t *)Lac_CryptoGetFirstHandle(); 1677 } else { 1678 crypto_handle = (sal_crypto_service_t *)instanceHandle_in; 1679 } 1680 LAC_CHECK_NULL_PARAM(crypto_handle); 1681 SAL_RUNNING_CHECK(crypto_handle); 1682 SAL_CHECK_INSTANCE_TYPE(crypto_handle, 1683 (SAL_SERVICE_TYPE_CRYPTO | 1684 SAL_SERVICE_TYPE_CRYPTO_ASYM | 1685 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1686 1687 gen_handle = &(crypto_handle->generic_service_info); 1688 1689 /* 1690 * From the instanceHandle we must get the trans_handle and send 1691 * down to adf for polling. 1692 * Populate our trans handle table with the appropriate handles. 1693 */ 1694 1695 switch (gen_handle->type) { 1696 case SAL_SERVICE_TYPE_CRYPTO_ASYM: 1697 trans_hndTable[TH_CY_RX_0] = 1698 crypto_handle->trans_handle_asym_rx; 1699 num_rx_rings = 1; 1700 break; 1701 case SAL_SERVICE_TYPE_CRYPTO_SYM: 1702 trans_hndTable[TH_CY_RX_0] = crypto_handle->trans_handle_sym_rx; 1703 num_rx_rings = 1; 1704 break; 1705 case SAL_SERVICE_TYPE_CRYPTO: 1706 trans_hndTable[TH_CY_RX_0] = crypto_handle->trans_handle_sym_rx; 1707 trans_hndTable[TH_CY_RX_1] = 1708 crypto_handle->trans_handle_asym_rx; 1709 num_rx_rings = MAX_CY_RX_RINGS; 1710 break; 1711 default: 1712 break; 1713 } 1714 1715 /* Call adf to do the polling. */ 1716 status = 1717 icp_adf_pollInstance(trans_hndTable, num_rx_rings, response_quota); 1718 1719 return status; 1720 } 1721 1722 /** 1723 ****************************************************************************** 1724 * @ingroup cpaCyCommon 1725 * Crypto specific polling function which polls sym crypto ring. 1726 *****************************************************************************/ 1727 CpaStatus 1728 icp_sal_CyPollSymRing(CpaInstanceHandle instanceHandle_in, 1729 Cpa32U response_quota) 1730 { 1731 CpaStatus status = CPA_STATUS_SUCCESS; 1732 sal_crypto_service_t *crypto_handle = NULL; 1733 icp_comms_trans_handle trans_hndTable[NUM_CRYPTO_SYM_RX_RINGS] = { 0 }; 1734 1735 if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) { 1736 crypto_handle = (sal_crypto_service_t *)Lac_GetFirstHandle( 1737 SAL_SERVICE_TYPE_CRYPTO_SYM); 1738 } else { 1739 crypto_handle = (sal_crypto_service_t *)instanceHandle_in; 1740 } 1741 LAC_CHECK_NULL_PARAM(crypto_handle); 1742 SAL_CHECK_INSTANCE_TYPE(crypto_handle, 1743 (SAL_SERVICE_TYPE_CRYPTO | 1744 SAL_SERVICE_TYPE_CRYPTO_SYM)); 1745 SAL_RUNNING_CHECK(crypto_handle); 1746 1747 /* 1748 * From the instanceHandle we must get the trans_handle and send 1749 * down to adf for polling. 1750 * Populate our trans handle table with the appropriate handles. 1751 */ 1752 trans_hndTable[TH_SINGLE_RX] = crypto_handle->trans_handle_sym_rx; 1753 /* Call adf to do the polling. */ 1754 status = icp_adf_pollInstance(trans_hndTable, 1755 NUM_CRYPTO_SYM_RX_RINGS, 1756 response_quota); 1757 return status; 1758 } 1759 1760 1761 /** 1762 ****************************************************************************** 1763 * @ingroup cpaCyCommon 1764 * Crypto specific polling function which polls an nrbg crypto ring. 1765 *****************************************************************************/ 1766 CpaStatus 1767 icp_sal_CyPollNRBGRing(CpaInstanceHandle instanceHandle_in, 1768 Cpa32U response_quota) 1769 { 1770 return CPA_STATUS_UNSUPPORTED; 1771 } 1772 1773 /* Returns the handle to the first asym crypto instance */ 1774 static CpaInstanceHandle 1775 Lac_GetFirstAsymHandle(icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES], 1776 Cpa16U num_dev) 1777 { 1778 CpaStatus status = CPA_STATUS_SUCCESS; 1779 icp_accel_dev_t *dev_addr = NULL; 1780 sal_t *base_addr = NULL; 1781 sal_list_t *list_temp = NULL; 1782 CpaInstanceHandle cyInst = NULL; 1783 CpaInstanceInfo2 info; 1784 Cpa16U i = 0; 1785 1786 for (i = 0; i < num_dev; i++) { 1787 dev_addr = (icp_accel_dev_t *)adfInsts[i]; 1788 base_addr = dev_addr->pSalHandle; 1789 if (NULL == base_addr) { 1790 continue; 1791 } 1792 list_temp = base_addr->asym_services; 1793 while (NULL != list_temp) { 1794 cyInst = SalList_getObject(list_temp); 1795 status = cpaCyInstanceGetInfo2(cyInst, &info); 1796 list_temp = SalList_next(list_temp); 1797 if (CPA_STATUS_SUCCESS != status || 1798 CPA_TRUE != info.isPolled) { 1799 cyInst = NULL; 1800 continue; 1801 } 1802 break; 1803 } 1804 if (cyInst) { 1805 break; 1806 } 1807 } 1808 1809 return cyInst; 1810 } 1811 1812 /* Returns the handle to the first sym crypto instance */ 1813 static CpaInstanceHandle 1814 Lac_GetFirstSymHandle(icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES], 1815 Cpa16U num_dev) 1816 { 1817 CpaStatus status = CPA_STATUS_SUCCESS; 1818 icp_accel_dev_t *dev_addr = NULL; 1819 sal_t *base_addr = NULL; 1820 sal_list_t *list_temp = NULL; 1821 CpaInstanceHandle cyInst = NULL; 1822 CpaInstanceInfo2 info; 1823 Cpa16U i = 0; 1824 1825 for (i = 0; i < num_dev; i++) { 1826 dev_addr = (icp_accel_dev_t *)adfInsts[i]; 1827 base_addr = dev_addr->pSalHandle; 1828 if (NULL == base_addr) { 1829 continue; 1830 } 1831 list_temp = base_addr->sym_services; 1832 while (NULL != list_temp) { 1833 cyInst = SalList_getObject(list_temp); 1834 status = cpaCyInstanceGetInfo2(cyInst, &info); 1835 list_temp = SalList_next(list_temp); 1836 if (CPA_STATUS_SUCCESS != status || 1837 CPA_TRUE != info.isPolled) { 1838 cyInst = NULL; 1839 continue; 1840 } 1841 break; 1842 } 1843 if (cyInst) { 1844 break; 1845 } 1846 } 1847 1848 return cyInst; 1849 } 1850 1851 /* Returns the handle to the first crypto instance 1852 * Note that the crypto instance in this case supports 1853 * both asym and sym services */ 1854 static CpaInstanceHandle 1855 Lac_GetFirstCyHandle(icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES], Cpa16U num_dev) 1856 { 1857 CpaStatus status = CPA_STATUS_SUCCESS; 1858 icp_accel_dev_t *dev_addr = NULL; 1859 sal_t *base_addr = NULL; 1860 sal_list_t *list_temp = NULL; 1861 CpaInstanceHandle cyInst = NULL; 1862 CpaInstanceInfo2 info; 1863 Cpa16U i = 0; 1864 1865 for (i = 0; i < num_dev; i++) { 1866 dev_addr = (icp_accel_dev_t *)adfInsts[i]; 1867 base_addr = dev_addr->pSalHandle; 1868 if (NULL == base_addr) { 1869 continue; 1870 } 1871 list_temp = base_addr->crypto_services; 1872 while (NULL != list_temp) { 1873 cyInst = SalList_getObject(list_temp); 1874 status = cpaCyInstanceGetInfo2(cyInst, &info); 1875 list_temp = SalList_next(list_temp); 1876 if (CPA_STATUS_SUCCESS != status || 1877 CPA_TRUE != info.isPolled) { 1878 cyInst = NULL; 1879 continue; 1880 } 1881 break; 1882 } 1883 if (cyInst) { 1884 break; 1885 } 1886 } 1887 1888 return cyInst; 1889 } 1890 1891 CpaInstanceHandle 1892 Lac_GetFirstHandle(sal_service_type_t svc_type) 1893 { 1894 CpaStatus status = CPA_STATUS_SUCCESS; 1895 static icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES] = { 0 }; 1896 CpaInstanceHandle cyInst = NULL; 1897 Cpa16U num_cy_dev = 0; 1898 Cpa32U capabilities = 0; 1899 1900 switch (svc_type) { 1901 case SAL_SERVICE_TYPE_CRYPTO_ASYM: 1902 capabilities = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC; 1903 break; 1904 case SAL_SERVICE_TYPE_CRYPTO_SYM: 1905 capabilities = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC; 1906 break; 1907 case SAL_SERVICE_TYPE_CRYPTO: 1908 capabilities = ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC; 1909 capabilities |= ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC; 1910 break; 1911 default: 1912 LAC_LOG_ERROR("Invalid service type\n"); 1913 return NULL; 1914 break; 1915 } 1916 /* Only need 1 dev with crypto enabled - so check all devices*/ 1917 status = icp_amgr_getAllAccelDevByEachCapability(capabilities, 1918 adfInsts, 1919 &num_cy_dev); 1920 if ((0 == num_cy_dev) || (CPA_STATUS_SUCCESS != status)) { 1921 LAC_LOG_ERROR("No crypto devices enabled in the system\n"); 1922 return NULL; 1923 } 1924 1925 switch (svc_type) { 1926 case SAL_SERVICE_TYPE_CRYPTO_ASYM: 1927 /* Try to find an asym only instance first */ 1928 cyInst = Lac_GetFirstAsymHandle(adfInsts, num_cy_dev); 1929 /* Try to find a cy instance since it also supports asym */ 1930 if (NULL == cyInst) { 1931 cyInst = Lac_GetFirstCyHandle(adfInsts, num_cy_dev); 1932 } 1933 break; 1934 case SAL_SERVICE_TYPE_CRYPTO_SYM: 1935 /* Try to find a sym only instance first */ 1936 cyInst = Lac_GetFirstSymHandle(adfInsts, num_cy_dev); 1937 /* Try to find a cy instance since it also supports sym */ 1938 if (NULL == cyInst) { 1939 cyInst = Lac_GetFirstCyHandle(adfInsts, num_cy_dev); 1940 } 1941 break; 1942 case SAL_SERVICE_TYPE_CRYPTO: 1943 /* Try to find a cy instance */ 1944 cyInst = Lac_GetFirstCyHandle(adfInsts, num_cy_dev); 1945 break; 1946 default: 1947 break; 1948 } 1949 if (NULL == cyInst) { 1950 LAC_LOG_ERROR("No remaining crypto instances available\n"); 1951 } 1952 return cyInst; 1953 } 1954 1955 CpaStatus 1956 icp_sal_NrbgGetInflightRequests(CpaInstanceHandle instanceHandle_in, 1957 Cpa32U *maxInflightRequests, 1958 Cpa32U *numInflightRequests) 1959 { 1960 return CPA_STATUS_UNSUPPORTED; 1961 } 1962 1963 CpaStatus 1964 icp_sal_SymGetInflightRequests(CpaInstanceHandle instanceHandle, 1965 Cpa32U *maxInflightRequests, 1966 Cpa32U *numInflightRequests) 1967 { 1968 sal_crypto_service_t *crypto_handle = NULL; 1969 1970 crypto_handle = (sal_crypto_service_t *)instanceHandle; 1971 1972 LAC_CHECK_NULL_PARAM(crypto_handle); 1973 LAC_CHECK_NULL_PARAM(maxInflightRequests); 1974 LAC_CHECK_NULL_PARAM(numInflightRequests); 1975 SAL_RUNNING_CHECK(crypto_handle); 1976 1977 return icp_adf_getInflightRequests(crypto_handle->trans_handle_sym_tx, 1978 maxInflightRequests, 1979 numInflightRequests); 1980 } 1981 1982 1983 CpaStatus 1984 icp_sal_dp_SymGetInflightRequests(CpaInstanceHandle instanceHandle, 1985 Cpa32U *maxInflightRequests, 1986 Cpa32U *numInflightRequests) 1987 { 1988 sal_crypto_service_t *crypto_handle = NULL; 1989 1990 crypto_handle = (sal_crypto_service_t *)instanceHandle; 1991 1992 return icp_adf_dp_getInflightRequests( 1993 crypto_handle->trans_handle_sym_tx, 1994 maxInflightRequests, 1995 numInflightRequests); 1996 } 1997 1998 1999 CpaStatus 2000 icp_sal_setForceAEADMACVerify(CpaInstanceHandle instanceHandle, 2001 CpaBoolean forceAEADMacVerify) 2002 { 2003 sal_crypto_service_t *crypto_handle = NULL; 2004 2005 crypto_handle = (sal_crypto_service_t *)instanceHandle; 2006 LAC_CHECK_NULL_PARAM(crypto_handle); 2007 crypto_handle->forceAEADMacVerify = forceAEADMacVerify; 2008 2009 return CPA_STATUS_SUCCESS; 2010 } 2011