The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=cabd847e400f2c738e15cf6760939f80e24cf8a9
commit cabd847e400f2c738e15cf6760939f80e24cf8a9 Author: Hareshx Sankar Raj <hareshx.sankar....@intel.com> AuthorDate: 2025-05-07 09:38:21 +0000 Commit: Mark Johnston <ma...@freebsd.org> CommitDate: 2025-06-20 12:47:28 +0000 qat: driver updates to improve code and fix bugs Bug fixes and improvements are done for the qat code base to improve code quality. Reviewed by: markj, ziaee MFC after: 2 weeks Sponsored by: Intel Corporation Differential Revision: https://reviews.freebsd.org/D50379 (cherry picked from commit ded037e65e5239671b1292ec987a2e0894b217b5) --- sys/dev/qat/include/adf_cfg_device.h | 4 +- sys/dev/qat/include/adf_gen4vf_hw_csr_data.h | 4 +- sys/dev/qat/include/adf_pfvf_vf_msg.h | 3 +- sys/dev/qat/include/common/adf_accel_devices.h | 2 + sys/dev/qat/include/common/adf_cfg_common.h | 4 +- sys/dev/qat/include/common/adf_common_drv.h | 3 +- sys/dev/qat/include/common/adf_gen4_hw_data.h | 6 +- sys/dev/qat/include/common/adf_pfvf_msg.h | 8 ++- sys/dev/qat/include/icp_qat_fw_init_admin.h | 2 +- .../qat/qat_api/common/compression/dc_datapath.c | 11 +++- .../qat_api/common/crypto/sym/key/lac_sym_key.c | 8 +++ .../qat/qat_api/common/crypto/sym/lac_sym_hash.c | 11 ++-- .../common/crypto/sym/qat/lac_sym_qat_cipher.c | 35 +++++++++--- sys/dev/qat/qat_api/common/ctrl/sal_compression.c | 8 +-- sys/dev/qat/qat_api/common/ctrl/sal_crypto.c | 4 +- .../qat_api/common/include/sal_types_compression.h | 4 +- sys/dev/qat/qat_api/include/icp_sal_versions.h | 4 +- sys/dev/qat/qat_common/adf_aer.c | 11 +++- sys/dev/qat/qat_common/adf_cfg_device.c | 14 ++++- .../qat/qat_common/adf_freebsd_cnvnr_ctrs_dbg.c | 1 + sys/dev/qat/qat_common/adf_freebsd_dev_processes.c | 20 ++----- sys/dev/qat/qat_common/adf_gen2_hw_data.c | 6 +- sys/dev/qat/qat_common/adf_gen4_pfvf.c | 3 +- sys/dev/qat/qat_common/adf_gen4vf_hw_csr_data.c | 8 +-- sys/dev/qat/qat_common/adf_init.c | 66 +++++++++++++++++++++- sys/dev/qat/qat_common/adf_pfvf_vf_msg.c | 20 ++++++- sys/dev/qat/qat_common/adf_pfvf_vf_proto.c | 17 ++++-- sys/dev/qat/qat_common/adf_vf_isr.c | 15 ++++- sys/dev/qat/qat_common/qat_hal.c | 17 ++++-- sys/dev/qat/qat_common/qat_uclo.c | 12 ++-- sys/dev/qat/qat_hw/qat_200xx/adf_200xx_hw_data.h | 6 +- sys/dev/qat/qat_hw/qat_4xxx/adf_4xxx_hw_data.c | 3 + sys/dev/qat/qat_hw/qat_4xxx/adf_drv.c | 5 -- sys/dev/qat/qat_hw/qat_4xxxvf/adf_4xxxvf_hw_data.c | 3 + sys/dev/qat/qat_hw/qat_c3xxx/adf_c3xxx_hw_data.h | 6 +- sys/dev/qat/qat_hw/qat_c4xxx/adf_c4xxx_hw_data.c | 6 +- 36 files changed, 262 insertions(+), 98 deletions(-) diff --git a/sys/dev/qat/include/adf_cfg_device.h b/sys/dev/qat/include/adf_cfg_device.h index f2891e4eb805..1419292a262f 100644 --- a/sys/dev/qat/include/adf_cfg_device.h +++ b/sys/dev/qat/include/adf_cfg_device.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #ifndef ADF_CFG_DEVICE_H_ #define ADF_CFG_DEVICE_H_ @@ -79,4 +79,6 @@ int adf_cfg_device_init(struct adf_cfg_device *device, void adf_cfg_device_clear(struct adf_cfg_device *device, struct adf_accel_dev *accel_dev); +void adf_cfg_device_clear_all(struct adf_accel_dev *accel_dev); + #endif diff --git a/sys/dev/qat/include/adf_gen4vf_hw_csr_data.h b/sys/dev/qat/include/adf_gen4vf_hw_csr_data.h index ed78ab54ec4e..5143b88907ba 100644 --- a/sys/dev/qat/include/adf_gen4vf_hw_csr_data.h +++ b/sys/dev/qat/include/adf_gen4vf_hw_csr_data.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #ifndef ADF_GEN4VF_HW_CSR_DATA_H_ #define ADF_GEN4VF_HW_CSR_DATA_H_ @@ -51,7 +51,7 @@ struct resource *_csr_base_addr = csr_base_addr; \ u32 _bank = bank; \ u32 _ring = ring; \ - dma_addr_t _value = value; \ + bus_addr_t _value = value; \ u32 l_base = 0, u_base = 0; \ l_base = (u32)((_value)&0xFFFFFFFF); \ u_base = (u32)(((_value)&0xFFFFFFFF00000000ULL) >> 32); \ diff --git a/sys/dev/qat/include/adf_pfvf_vf_msg.h b/sys/dev/qat/include/adf_pfvf_vf_msg.h index 3cf6d5ed0815..44066ca1fe85 100644 --- a/sys/dev/qat/include/adf_pfvf_vf_msg.h +++ b/sys/dev/qat/include/adf_pfvf_vf_msg.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #ifndef ADF_PFVF_VF_MSG_H #define ADF_PFVF_VF_MSG_H @@ -8,5 +8,6 @@ void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev); int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev); int adf_vf2pf_get_capabilities(struct adf_accel_dev *accel_dev); int adf_vf2pf_get_ring_to_svc(struct adf_accel_dev *accel_dev); +void adf_vf2pf_restarting_complete(struct adf_accel_dev *accel_dev); #endif /* ADF_PFVF_VF_MSG_H */ diff --git a/sys/dev/qat/include/common/adf_accel_devices.h b/sys/dev/qat/include/common/adf_accel_devices.h index b3f82234bc2b..c09aee8ea4bd 100644 --- a/sys/dev/qat/include/common/adf_accel_devices.h +++ b/sys/dev/qat/include/common/adf_accel_devices.h @@ -448,6 +448,7 @@ struct adf_hw_device_data { uint8_t num_accel; uint8_t num_logical_accel; uint8_t num_engines; + bool get_ring_to_svc_done; int (*get_storage_enabled)(struct adf_accel_dev *accel_dev, uint32_t *storage_enabled); u8 query_storage_cap; @@ -721,5 +722,6 @@ struct adf_accel_dev { bool is_vf; u32 accel_id; void *lac_dev; + struct mutex lock; /* protect accel_dev during start/stop e.t.c */ }; #endif diff --git a/sys/dev/qat/include/common/adf_cfg_common.h b/sys/dev/qat/include/common/adf_cfg_common.h index 4a85e021aeb7..eb3edec41742 100644 --- a/sys/dev/qat/include/common/adf_cfg_common.h +++ b/sys/dev/qat/include/common/adf_cfg_common.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #ifndef ADF_CFG_COMMON_H_ #define ADF_CFG_COMMON_H_ @@ -62,7 +62,7 @@ struct adf_pci_address { unsigned char bus; unsigned char dev; unsigned char func; -} __packed; +}; #define ADF_CFG_SERV_RING_PAIR_0_SHIFT 0 #define ADF_CFG_SERV_RING_PAIR_1_SHIFT 3 diff --git a/sys/dev/qat/include/common/adf_common_drv.h b/sys/dev/qat/include/common/adf_common_drv.h index b6bc2511bfba..f9f4463f69c3 100644 --- a/sys/dev/qat/include/common/adf_common_drv.h +++ b/sys/dev/qat/include/common/adf_common_drv.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #ifndef ADF_DRV_H #define ADF_DRV_H @@ -304,6 +304,7 @@ void adf_flush_vf_wq(struct adf_accel_dev *accel_dev); int adf_pf2vf_handle_pf_restarting(struct adf_accel_dev *accel_dev); int adf_pf2vf_handle_pf_rp_reset(struct adf_accel_dev *accel_dev, struct pfvf_message msg); +int adf_pf2vf_handle_pf_error(struct adf_accel_dev *accel_dev); bool adf_recv_and_handle_pf2vf_msg(struct adf_accel_dev *accel_dev); static inline int adf_sriov_configure(device_t *pdev, int numvfs) diff --git a/sys/dev/qat/include/common/adf_gen4_hw_data.h b/sys/dev/qat/include/common/adf_gen4_hw_data.h index d0423eaa17cf..cde5ae1f4e10 100644 --- a/sys/dev/qat/include/common/adf_gen4_hw_data.h +++ b/sys/dev/qat/include/common/adf_gen4_hw_data.h @@ -1,5 +1,5 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2021 Intel Corporation */ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* Copyright(c) 2007-2025 Intel Corporation */ #ifndef ADF_GEN4_HW_CSR_DATA_H_ #define ADF_GEN4_HW_CSR_DATA_H_ @@ -62,7 +62,7 @@ struct resource *_csr_base_addr = csr_base_addr; \ u32 _bank = bank; \ u32 _ring = ring; \ - dma_addr_t _value = value; \ + bus_addr_t _value = value; \ u32 l_base = 0, u_base = 0; \ l_base = lower_32_bits(_value); \ u_base = upper_32_bits(_value); \ diff --git a/sys/dev/qat/include/common/adf_pfvf_msg.h b/sys/dev/qat/include/common/adf_pfvf_msg.h index 349db9a13b22..abd9cd46014f 100644 --- a/sys/dev/qat/include/common/adf_pfvf_msg.h +++ b/sys/dev/qat/include/common/adf_pfvf_msg.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #ifndef ADF_PFVF_MSG_H #define ADF_PFVF_MSG_H @@ -97,6 +97,7 @@ enum pf2vf_msgtype { ADF_PF2VF_MSGTYPE_RESTARTING = 0x01, ADF_PF2VF_MSGTYPE_VERSION_RESP = 0x02, ADF_PF2VF_MSGTYPE_BLKMSG_RESP = 0x03, + ADF_PF2VF_MSGTYPE_FATAL_ERROR = 0x04, /* Values from 0x10 are Gen4 specific, message type is only 4 bits in Gen2 devices. */ ADF_PF2VF_MSGTYPE_RP_RESET_RESP = 0x10, @@ -111,6 +112,7 @@ enum vf2pf_msgtype { ADF_VF2PF_MSGTYPE_LARGE_BLOCK_REQ = 0x07, ADF_VF2PF_MSGTYPE_MEDIUM_BLOCK_REQ = 0x08, ADF_VF2PF_MSGTYPE_SMALL_BLOCK_REQ = 0x09, + ADF_VF2PF_MSGTYPE_RESTARTING_COMPLETE = 0x0a, /* Values from 0x10 are Gen4 specific, message type is only 4 bits in Gen2 devices. */ ADF_VF2PF_MSGTYPE_RP_RESET = 0x10, @@ -124,8 +126,10 @@ enum pfvf_compatibility_version { ADF_PFVF_COMPAT_FAST_ACK = 0x03, /* Ring to service mapping support for non-standard mappings */ ADF_PFVF_COMPAT_RING_TO_SVC_MAP = 0x04, + /* Fallback compat */ + ADF_PFVF_COMPAT_FALLBACK = 0x05, /* Reference to the latest version */ - ADF_PFVF_COMPAT_THIS_VERSION = 0x04, + ADF_PFVF_COMPAT_THIS_VERSION = 0x05, }; /* PF->VF Version Response */ diff --git a/sys/dev/qat/include/icp_qat_fw_init_admin.h b/sys/dev/qat/include/icp_qat_fw_init_admin.h index cd4edbdbc93b..f3e0ff9d0064 100644 --- a/sys/dev/qat/include/icp_qat_fw_init_admin.h +++ b/sys/dev/qat/include/icp_qat_fw_init_admin.h @@ -198,8 +198,8 @@ struct icp_qat_fw_init_admin_resp { enum icp_qat_fw_init_admin_init_flag { ICP_QAT_FW_INIT_FLAG_PKE_DISABLED = 0 }; struct icp_qat_fw_init_admin_hb_cnt { - u16 resp_heartbeat_cnt; u16 req_heartbeat_cnt; + u16 resp_heartbeat_cnt; }; #define ICP_QAT_FW_COMN_HEARTBEAT_OK 0 diff --git a/sys/dev/qat/qat_api/common/compression/dc_datapath.c b/sys/dev/qat/qat_api/common/compression/dc_datapath.c index f5a8600eadfa..312b2d6749cc 100644 --- a/sys/dev/qat/qat_api/common/compression/dc_datapath.c +++ b/sys/dev/qat/qat_api/common/compression/dc_datapath.c @@ -118,14 +118,19 @@ dcCompression_ProcessCallback(void *pRespMsg) /* Cast response message to compression response message type */ pCompRespMsg = (icp_qat_fw_comp_resp_t *)pRespMsg; - + if (!(pCompRespMsg)) { + QAT_UTILS_LOG("pCompRespMsg is NULL\n"); + return; + } /* Extract request data pointer from the opaque data */ LAC_MEM_SHARED_READ_TO_PTR(pCompRespMsg->opaque_data, pReqData); + if (!(pReqData)) { + QAT_UTILS_LOG("pReqData is NULL\n"); + return; + } /* Extract fields from the request data structure */ pCookie = (dc_compression_cookie_t *)pReqData; - if (!pCookie) - return; pSessionDesc = DC_SESSION_DESC_FROM_CTX_GET(pCookie->pSessionHandle); pService = (sal_compression_service_t *)(pCookie->dcInstance); diff --git a/sys/dev/qat/qat_api/common/crypto/sym/key/lac_sym_key.c b/sys/dev/qat/qat_api/common/crypto/sym/key/lac_sym_key.c index 965874e7466f..36e0175f988a 100644 --- a/sys/dev/qat/qat_api/common/crypto/sym/key/lac_sym_key.c +++ b/sys/dev/qat/qat_api/common/crypto/sym/key/lac_sym_key.c @@ -2160,6 +2160,14 @@ LacSymKey_CheckParamSslTls(const void *pKeyGenOpData, } } + /* check 0 secret length as it is not valid for SSL3 Key Gen + * request */ + if (0 == uSecretLen) { + LAC_INVALID_PARAM_LOG1("%u secret.dataLenInBytes", + uSecretLen); + return CPA_STATUS_INVALID_PARAM; + } + /* Only seed length for SSL3 Key Gen request */ if (maxSeedLen != uSeedLen) { LAC_INVALID_PARAM_LOG("seed.dataLenInBytes"); diff --git a/sys/dev/qat/qat_api/common/crypto/sym/lac_sym_hash.c b/sys/dev/qat/qat_api/common/crypto/sym/lac_sym_hash.c index 5ad64ca09a0b..46f652cfd5c6 100644 --- a/sys/dev/qat/qat_api/common/crypto/sym/lac_sym_hash.c +++ b/sys/dev/qat/qat_api/common/crypto/sym/lac_sym_hash.c @@ -751,10 +751,13 @@ LacHash_PerformParamCheck(CpaInstanceHandle instanceHandle, &pHashAlgInfo); /* check if the message is a multiple of the block size. */ - if ((pOpData->messageLenToHashInBytes % - pHashAlgInfo->blockLength) != 0) { - LAC_INVALID_PARAM_LOG( - "messageLenToHashInBytes not block size"); + if (pOpData->messageLenToHashInBytes % + pHashAlgInfo->blockLength != + 0) { + LAC_INVALID_PARAM_LOG2( + "message(%d) not block-size(%d) multiple", + pOpData->messageLenToHashInBytes, + pHashAlgInfo->blockLength); return CPA_STATUS_INVALID_PARAM; } } diff --git a/sys/dev/qat/qat_api/common/crypto/sym/qat/lac_sym_qat_cipher.c b/sys/dev/qat/qat_api/common/crypto/sym/qat/lac_sym_qat_cipher.c index c6fbeb1b888a..d8a7ac75aec1 100644 --- a/sys/dev/qat/qat_api/common/crypto/sym/qat/lac_sym_qat_cipher.c +++ b/sys/dev/qat/qat_api/common/crypto/sym/qat/lac_sym_qat_cipher.c @@ -214,6 +214,11 @@ static const uint8_t key_size_f8[] = { ICP_QAT_HW_CIPHER_ALGO_AES256 /* ICP_QAT_HW_AES_256_F8_KEY_SZ */ }; +/* This array must be kept aligned with CpaCySymCipherAlgorithm enum but + * offset by -1 as that enum starts at 1. LacSymQat_CipherGetCfgData() + * below relies on that alignment and uses that enum -1 to index into this + * array. + */ typedef struct _icp_qat_hw_cipher_info { icp_qat_hw_cipher_algo_t algorithm; icp_qat_hw_cipher_mode_t mode; @@ -542,7 +547,7 @@ LacSymQat_CipherGetCfgData(lac_session_desc_t *pSession, sal_crypto_service_t *pService = (sal_crypto_service_t *)pSession->pInstance; - CpaCySymCipherAlgorithm cipherAlgorithm = 0; + int cipherIdx = 0; icp_qat_hw_cipher_dir_t cipherDirection = 0; /* Set defaults */ @@ -551,21 +556,33 @@ LacSymQat_CipherGetCfgData(lac_session_desc_t *pSession, *pMode = ICP_QAT_HW_CIPHER_ECB_MODE; *pDir = ICP_QAT_HW_CIPHER_ENCRYPT; - /* decrease since it's numbered from 1 instead of 0 */ - cipherAlgorithm = pSession->cipherAlgorithm - 1; + /* offset index as CpaCySymCipherAlgorithm enum starts from 1, not from + * 0 */ + cipherIdx = pSession->cipherAlgorithm - 1; cipherDirection = pSession->cipherDirection == CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ? ICP_QAT_HW_CIPHER_ENCRYPT : ICP_QAT_HW_CIPHER_DECRYPT; - *pAlgorithm = icp_qat_alg_info[cipherAlgorithm].algorithm; - *pMode = icp_qat_alg_info[cipherAlgorithm].mode; - *pDir = icp_qat_alg_info[cipherAlgorithm].dir[cipherDirection]; + /* Boundary check against the last value in the algorithm enum */ + if (!(pSession->cipherAlgorithm <= CPA_CY_SYM_CIPHER_SM4_CTR)) { + QAT_UTILS_LOG("Invalid cipherAlgorithm value\n"); + return; + } + + if (!(cipherDirection <= ICP_QAT_HW_CIPHER_DECRYPT)) { + QAT_UTILS_LOG("Invalid cipherDirection value\n"); + return; + } + + *pAlgorithm = icp_qat_alg_info[cipherIdx].algorithm; + *pMode = icp_qat_alg_info[cipherIdx].mode; + *pDir = icp_qat_alg_info[cipherIdx].dir[cipherDirection]; *pKey_convert = - icp_qat_alg_info[cipherAlgorithm].key_convert[cipherDirection]; + icp_qat_alg_info[cipherIdx].key_convert[cipherDirection]; - if (IS_KEY_DEP_NO != icp_qat_alg_info[cipherAlgorithm].isKeyLenDepend) { - *pAlgorithm = icp_qat_alg_info[cipherAlgorithm] + if (IS_KEY_DEP_NO != icp_qat_alg_info[cipherIdx].isKeyLenDepend) { + *pAlgorithm = icp_qat_alg_info[cipherIdx] .pAlgByKeySize[pSession->cipherKeyLenInBytes]; } diff --git a/sys/dev/qat/qat_api/common/ctrl/sal_compression.c b/sys/dev/qat/qat_api/common/ctrl/sal_compression.c index c0f5a411d87e..e8ae47f0f0d3 100644 --- a/sys/dev/qat/qat_api/common/ctrl/sal_compression.c +++ b/sys/dev/qat/qat_api/common/ctrl/sal_compression.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ /** ***************************************************************************** * @file sal_compression.c @@ -371,9 +371,6 @@ SalCtrl_CompressionInit(icp_accel_dev_t *device, sal_service_t *service) SAL_SERVICE_GOOD_FOR_INIT(pCompressionService); - pCompressionService->generic_service_info.state = - SAL_SERVICE_STATE_INITIALIZING; - if (CPA_FALSE == pCompressionService->generic_service_info.is_dyn) { section = icpGetProcessName(); } @@ -1438,7 +1435,8 @@ cpaDcInstanceGetInfo2(const CpaInstanceHandle instanceHandle, pInstanceInfo2->isOffloaded = CPA_TRUE; /* Get the instance name and part name from the config file */ dev = icp_adf_getAccelDevByAccelId(pCompressionService->pkgID); - if (NULL == dev) { + if (NULL == dev || + 0 == strnlen(dev->deviceName, ADF_DEVICE_TYPE_LENGTH + 1)) { QAT_UTILS_LOG("Can not find device for the instance.\n"); LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2)); return CPA_STATUS_FAIL; diff --git a/sys/dev/qat/qat_api/common/ctrl/sal_crypto.c b/sys/dev/qat/qat_api/common/ctrl/sal_crypto.c index 7bfc5ec3ba10..3e134f43af6e 100644 --- a/sys/dev/qat/qat_api/common/ctrl/sal_crypto.c +++ b/sys/dev/qat/qat_api/common/ctrl/sal_crypto.c @@ -1235,7 +1235,8 @@ cpaCyInstanceGetInfo2(const CpaInstanceHandle instanceHandle_in, /* Get the instance name and part name */ dev = icp_adf_getAccelDevByAccelId(pCryptoService->pkgID); - if (NULL == dev) { + if (NULL == dev || + 0 == strnlen(dev->deviceName, ADF_DEVICE_TYPE_LENGTH + 1)) { LAC_LOG_ERROR("Can not find device for the instance\n"); LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2)); return CPA_STATUS_FAIL; @@ -1717,7 +1718,6 @@ Lac_GetFirstHandle(sal_service_type_t svc_type) default: LAC_LOG_ERROR("Invalid service type\n"); return NULL; - break; } /* Only need 1 dev with crypto enabled - so check all devices*/ status = icp_amgr_getAllAccelDevByEachCapability(capabilities, diff --git a/sys/dev/qat/qat_api/common/include/sal_types_compression.h b/sys/dev/qat/qat_api/common/include/sal_types_compression.h index d7bfe33cab08..4b17438b3258 100644 --- a/sys/dev/qat/qat_api/common/include/sal_types_compression.h +++ b/sys/dev/qat/qat_api/common/include/sal_types_compression.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ /** *************************************************************************** * @file sal_types_compression.h @@ -24,6 +24,8 @@ #define DC_NUM_RX_RINGS (1) #define DC_NUM_COMPRESSION_LEVELS (CPA_DC_L12) +#define MAX_SGL_NUM 0x10000 + /** ***************************************************************************** * @ingroup SalCtrl diff --git a/sys/dev/qat/qat_api/include/icp_sal_versions.h b/sys/dev/qat/qat_api/include/icp_sal_versions.h index db1ba297adc6..03bcef4fcbbb 100644 --- a/sys/dev/qat/qat_api/include/icp_sal_versions.h +++ b/sys/dev/qat/qat_api/include/icp_sal_versions.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ /** *************************************************************************** * @file icp_sal_versions.h @@ -26,7 +26,7 @@ /* Part name and number of the accelerator device */ #define SAL_INFO2_DRIVER_SW_VERSION_MAJ_NUMBER 3 -#define SAL_INFO2_DRIVER_SW_VERSION_MIN_NUMBER 14 +#define SAL_INFO2_DRIVER_SW_VERSION_MIN_NUMBER 15 #define SAL_INFO2_DRIVER_SW_VERSION_PATCH_NUMBER 0 /** diff --git a/sys/dev/qat/qat_common/adf_aer.c b/sys/dev/qat/qat_common/adf_aer.c index 7fdeba873420..123baaa244c3 100644 --- a/sys/dev/qat/qat_common/adf_aer.c +++ b/sys/dev/qat/qat_common/adf_aer.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include "qat_freebsd.h" #include "adf_cfg.h" #include "adf_common_drv.h" @@ -280,6 +280,15 @@ adf_notify_fatal_error_work(struct work_struct *work) struct adf_fatal_error_data *wq_data = container_of(work, struct adf_fatal_error_data, work); struct adf_accel_dev *accel_dev = wq_data->accel_dev; + struct adf_hw_device_data *hw_device = accel_dev->hw_device; + + if (adf_dev_in_use(accel_dev)) { + if (hw_device->pre_reset) { + device_printf(GET_DEV(accel_dev), + "Performing pre reset save\n"); + hw_device->pre_reset(accel_dev); + } + } adf_error_notifier((uintptr_t)accel_dev); if (!accel_dev->is_vf) { diff --git a/sys/dev/qat/qat_common/adf_cfg_device.c b/sys/dev/qat/qat_common/adf_cfg_device.c index a26d2fdfd32e..4860a4064b97 100644 --- a/sys/dev/qat/qat_common/adf_cfg_device.c +++ b/sys/dev/qat/qat_common/adf_cfg_device.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include "adf_cfg_instance.h" #include "adf_cfg_section.h" #include "adf_cfg_device.h" @@ -677,6 +677,18 @@ adf_cfg_device_clear(struct adf_cfg_device *device, device->instances = NULL; } +void +adf_cfg_device_clear_all(struct adf_accel_dev *accel_dev) +{ + sx_xlock(&accel_dev->cfg->lock); + if (accel_dev->cfg->dev) { + adf_cfg_device_clear(accel_dev->cfg->dev, accel_dev); + free(accel_dev->cfg->dev, M_QAT); + accel_dev->cfg->dev = NULL; + } + sx_xunlock(&accel_dev->cfg->lock); +} + /* * Static configuration for userspace */ diff --git a/sys/dev/qat/qat_common/adf_freebsd_cnvnr_ctrs_dbg.c b/sys/dev/qat/qat_common/adf_freebsd_cnvnr_ctrs_dbg.c index 539059589bc8..e4ddbf489192 100644 --- a/sys/dev/qat/qat_common/adf_freebsd_cnvnr_ctrs_dbg.c +++ b/sys/dev/qat/qat_common/adf_freebsd_cnvnr_ctrs_dbg.c @@ -93,6 +93,7 @@ static int qat_cnvnr_ctrs_dbg_read(SYSCTL_HANDLER_ARGS) /* Extracting number of Acceleration Engines */ num_aes = hw_device->get_num_aes(hw_device); + explicit_bzero(&request, sizeof(struct icp_qat_fw_init_admin_req)); for (ae = 0; ae < num_aes; ae++) { if (accel_dev->au_info && !test_bit(ae, &dc_ae_msk)) continue; diff --git a/sys/dev/qat/qat_common/adf_freebsd_dev_processes.c b/sys/dev/qat/qat_common/adf_freebsd_dev_processes.c index 661d5bd0f14e..67e1d4ad2cab 100644 --- a/sys/dev/qat/qat_common/adf_freebsd_dev_processes.c +++ b/sys/dev/qat/qat_common/adf_freebsd_dev_processes.c @@ -1,6 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ - +/* Copyright(c) 2007-2025 Intel Corporation */ #include "qat_freebsd.h" #include "adf_cfg.h" #include "adf_common_drv.h" @@ -85,7 +84,7 @@ static struct cdevsw adf_state_cdevsw = { .d_name = ADF_DEV_STATE_NAME, }; -static const struct filterops adf_state_read_filterops = { +static struct filterops adf_state_read_filterops = { .f_isfd = 1, .f_attach = NULL, .f_detach = adf_state_kqread_detach, @@ -410,17 +409,6 @@ adf_state_set(int dev, enum adf_event event) state->state.dev_state = event; state->state.dev_id = dev; STAILQ_INSERT_TAIL(head, state, entries_state); - if (event == ADF_EVENT_STOP) { - state = NULL; - state = malloc(sizeof(struct entry_state), - M_QAT, - M_NOWAIT | M_ZERO); - if (!state) - continue; - state->state.dev_state = ADF_EVENT_SHUTDOWN; - state->state.dev_id = dev; - STAILQ_INSERT_TAIL(head, state, entries_state); - } } mtx_unlock(&mtx); callout_schedule(&callout, ADF_STATE_CALLOUT_TIME); @@ -451,7 +439,7 @@ adf_state_event_handler(struct adf_accel_dev *accel_dev, enum adf_event event) case ADF_EVENT_START: return ret; case ADF_EVENT_STOP: - break; + return ret; case ADF_EVENT_ERROR: break; #if defined(QAT_UIO) && defined(QAT_DBG) @@ -548,6 +536,7 @@ adf_state_destroy(void) struct entry_proc_events *proc_events = NULL; adf_service_unregister(&adf_state_hndl); + destroy_dev(adf_state_dev); mtx_lock(&callout_mtx); callout_stop(&callout); mtx_unlock(&callout_mtx); @@ -560,7 +549,6 @@ adf_state_destroy(void) } mtx_unlock(&mtx); mtx_destroy(&mtx); - destroy_dev(adf_state_dev); } static int diff --git a/sys/dev/qat/qat_common/adf_gen2_hw_data.c b/sys/dev/qat/qat_common/adf_gen2_hw_data.c index 10e86f8cd218..92fd2b9bc8e5 100644 --- a/sys/dev/qat/qat_common/adf_gen2_hw_data.c +++ b/sys/dev/qat/qat_common/adf_gen2_hw_data.c @@ -1,5 +1,5 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2021 Intel Corporation */ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include "adf_gen2_hw_data.h" #include "icp_qat_hw.h" @@ -54,7 +54,7 @@ write_csr_ring_config(struct resource *csr_base_addr, WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value); } -static dma_addr_t +static bus_addr_t read_csr_ring_base(struct resource *csr_base_addr, u32 bank, u32 ring) { return READ_CSR_RING_BASE(csr_base_addr, bank, ring); diff --git a/sys/dev/qat/qat_common/adf_gen4_pfvf.c b/sys/dev/qat/qat_common/adf_gen4_pfvf.c index 03bb90938e85..122abb301d31 100644 --- a/sys/dev/qat/qat_common/adf_gen4_pfvf.c +++ b/sys/dev/qat/qat_common/adf_gen4_pfvf.c @@ -1,7 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include <linux/iopoll.h> -#include <linux/mutex.h> #include <linux/types.h> #include "adf_accel_devices.h" #include "adf_common_drv.h" diff --git a/sys/dev/qat/qat_common/adf_gen4vf_hw_csr_data.c b/sys/dev/qat/qat_common/adf_gen4vf_hw_csr_data.c index 5c06b413b528..bfa778ea301b 100644 --- a/sys/dev/qat/qat_common/adf_gen4vf_hw_csr_data.c +++ b/sys/dev/qat/qat_common/adf_gen4vf_hw_csr_data.c @@ -1,10 +1,10 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include "adf_accel_devices.h" #include "adf_gen4vf_hw_csr_data.h" static u64 -build_csr_ring_base_addr(dma_addr_t addr, u32 size) +build_csr_ring_base_addr(bus_addr_t addr, u32 size) { return BUILD_RING_BASE_ADDR_GEN4(addr, size); } @@ -54,7 +54,7 @@ write_csr_ring_config(struct resource *csr_base_addr, WRITE_CSR_RING_CONFIG_GEN4VF(csr_base_addr, bank, ring, value); } -static dma_addr_t +static bus_addr_t read_csr_ring_base(struct resource *csr_base_addr, u32 bank, u32 ring) { return READ_CSR_RING_BASE_GEN4VF(csr_base_addr, bank, ring); @@ -64,7 +64,7 @@ static void write_csr_ring_base(struct resource *csr_base_addr, u32 bank, u32 ring, - dma_addr_t addr) + bus_addr_t addr) { WRITE_CSR_RING_BASE_GEN4VF(csr_base_addr, bank, ring, addr); } diff --git a/sys/dev/qat/qat_common/adf_init.c b/sys/dev/qat/qat_common/adf_init.c index 9f239b8f63d3..6bd0d85aae69 100644 --- a/sys/dev/qat/qat_common/adf_init.c +++ b/sys/dev/qat/qat_common/adf_init.c @@ -20,6 +20,10 @@ #include "adf_common_drv.h" #include "icp_qat_fw.h" +#if defined(QAT_UIO) +#include "adf_cfg_device.h" +#endif /* QAT_UIO*/ + /* Mask used to check the CompressAndVerify capability bit */ #define DC_CNV_EXTENDED_CAPABILITY (0x01) @@ -29,6 +33,11 @@ static LIST_HEAD(service_table); static DEFINE_MUTEX(service_lock); +static int adf_dev_init_locked(struct adf_accel_dev *accel_dev); +static int adf_dev_start_locked(struct adf_accel_dev *accel_dev); +static int adf_dev_stop_locked(struct adf_accel_dev *accel_dev); +static void adf_dev_shutdown_locked(struct adf_accel_dev *accel_dev); + static void adf_service_add(struct service_hndl *service) { @@ -261,6 +270,18 @@ adf_set_ssm_wdtimer(struct adf_accel_dev *accel_dev) */ int adf_dev_init(struct adf_accel_dev *accel_dev) +{ + int ret = 0; + + mutex_lock(&accel_dev->lock); + ret = adf_dev_init_locked(accel_dev); + mutex_unlock(&accel_dev->lock); + + return ret; +} + +static int +adf_dev_init_locked(struct adf_accel_dev *accel_dev) { struct service_hndl *service; struct list_head *list_itr; @@ -410,6 +431,18 @@ adf_dev_init(struct adf_accel_dev *accel_dev) */ int adf_dev_start(struct adf_accel_dev *accel_dev) +{ + int ret = 0; + + mutex_lock(&accel_dev->lock); + ret = adf_dev_start_locked(accel_dev); + mutex_unlock(&accel_dev->lock); + + return ret; +} + +static int +adf_dev_start_locked(struct adf_accel_dev *accel_dev) { struct adf_hw_device_data *hw_data = accel_dev->hw_device; struct service_hndl *service; @@ -507,6 +540,18 @@ adf_dev_start(struct adf_accel_dev *accel_dev) */ int adf_dev_stop(struct adf_accel_dev *accel_dev) +{ + int ret = 0; + + mutex_lock(&accel_dev->lock); + ret = adf_dev_stop_locked(accel_dev); + mutex_unlock(&accel_dev->lock); + + return ret; +} + +static int +adf_dev_stop_locked(struct adf_accel_dev *accel_dev) { struct service_hndl *service; struct list_head *list_itr; @@ -517,6 +562,10 @@ adf_dev_stop(struct adf_accel_dev *accel_dev) accel_dev->accel_id); return ENODEV; } + + if (!test_bit(ADF_STATUS_CONFIGURED, &accel_dev->status)) + return 0; + if (!adf_dev_started(accel_dev) && !test_bit(ADF_STATUS_STARTING, &accel_dev->status)) { return 0; @@ -570,11 +619,22 @@ adf_dev_stop(struct adf_accel_dev *accel_dev) */ void adf_dev_shutdown(struct adf_accel_dev *accel_dev) +{ + mutex_lock(&accel_dev->lock); + adf_dev_shutdown_locked(accel_dev); + mutex_unlock(&accel_dev->lock); +} + +static void +adf_dev_shutdown_locked(struct adf_accel_dev *accel_dev) { struct adf_hw_device_data *hw_data = accel_dev->hw_device; struct service_hndl *service; struct list_head *list_itr; + if (!test_bit(ADF_STATUS_CONFIGURED, &accel_dev->status)) + return; + if (test_bit(ADF_STATUS_SYSCTL_CTX_INITIALISED, &accel_dev->status)) { sysctl_ctx_free(&accel_dev->sysctl_ctx); clear_bit(ADF_STATUS_SYSCTL_CTX_INITIALISED, @@ -623,8 +683,12 @@ adf_dev_shutdown(struct adf_accel_dev *accel_dev) } /* Delete configuration only if not restarting */ - if (!test_bit(ADF_STATUS_RESTARTING, &accel_dev->status)) + if (!test_bit(ADF_STATUS_RESTARTING, &accel_dev->status)) { adf_cfg_del_all(accel_dev); +#ifdef QAT_UIO + adf_cfg_device_clear_all(accel_dev); +#endif + } if (hw_data->remove_pke_stats) hw_data->remove_pke_stats(accel_dev); diff --git a/sys/dev/qat/qat_common/adf_pfvf_vf_msg.c b/sys/dev/qat/qat_common/adf_pfvf_vf_msg.c index dc0cb0110ec3..8c0221d344ff 100644 --- a/sys/dev/qat/qat_common/adf_pfvf_vf_msg.c +++ b/sys/dev/qat/qat_common/adf_pfvf_vf_msg.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include <linux/bitfield.h> #include "adf_accel_devices.h" #include "adf_common_drv.h" @@ -98,6 +98,22 @@ adf_vf2pf_request_version(struct adf_accel_dev *accel_dev) return 0; } +void +adf_vf2pf_restarting_complete(struct adf_accel_dev *accel_dev) +{ + struct pfvf_message msg = { .type = + ADF_VF2PF_MSGTYPE_RESTARTING_COMPLETE }; + + if (accel_dev->u1.vf.pf_compat_ver < ADF_PFVF_COMPAT_FALLBACK) + return; + + if (adf_send_vf2pf_msg(accel_dev, msg)) { + device_printf( + GET_DEV(accel_dev), + "Failed to send Restarting complete event to PF\n"); + } +} + int adf_vf2pf_get_capabilities(struct adf_accel_dev *accel_dev) { @@ -180,5 +196,7 @@ adf_vf2pf_get_ring_to_svc(struct adf_accel_dev *accel_dev) /* Only v1 at present */ accel_dev->hw_device->ring_to_svc_map = rts_map_msg.map; + accel_dev->hw_device->get_ring_to_svc_done = true; + return 0; } diff --git a/sys/dev/qat/qat_common/adf_pfvf_vf_proto.c b/sys/dev/qat/qat_common/adf_pfvf_vf_proto.c index a09ddb819831..2a338b96a5f3 100644 --- a/sys/dev/qat/qat_common/adf_pfvf_vf_proto.c +++ b/sys/dev/qat/qat_common/adf_pfvf_vf_proto.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include <linux/kernel.h> #include "adf_accel_devices.h" #include "adf_common_drv.h" @@ -89,9 +89,15 @@ adf_send_vf2pf_req(struct adf_accel_dev *accel_dev, } /* Wait for response, if it times out retry */ - ret = - wait_for_completion_timeout(&accel_dev->u1.vf.msg_received, - timeout); + if (!cold) { + ret = wait_for_completion_timeout( + &accel_dev->u1.vf.msg_received, timeout); + } else { + /* In cold start timers may not be initialized yet */ + DELAY(ADF_PFVF_MSG_RESP_TIMEOUT * 1000); + ret = try_wait_for_completion( + &accel_dev->u1.vf.msg_received); + } if (ret) { if (likely(resp)) *resp = accel_dev->u1.vf.response; @@ -346,6 +352,9 @@ adf_handle_pf2vf_msg(struct adf_accel_dev *accel_dev, struct pfvf_message msg) case ADF_PF2VF_MSGTYPE_RP_RESET_RESP: adf_pf2vf_handle_pf_rp_reset(accel_dev, msg); return true; + case ADF_PF2VF_MSGTYPE_FATAL_ERROR: + adf_pf2vf_handle_pf_error(accel_dev); + return true; case ADF_PF2VF_MSGTYPE_VERSION_RESP: case ADF_PF2VF_MSGTYPE_BLKMSG_RESP: accel_dev->u1.vf.response = msg; diff --git a/sys/dev/qat/qat_common/adf_vf_isr.c b/sys/dev/qat/qat_common/adf_vf_isr.c index 10eaf9d8da1b..e61f8a57d9b8 100644 --- a/sys/dev/qat/qat_common/adf_vf_isr.c +++ b/sys/dev/qat/qat_common/adf_vf_isr.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include "qat_freebsd.h" #include <sys/kernel.h> #include <sys/systm.h> @@ -17,6 +17,7 @@ #include "adf_transport_access_macros.h" #include "adf_transport_internal.h" #include "adf_pfvf_utils.h" +#include "adf_pfvf_vf_msg.h" static TASKQUEUE_DEFINE_THREAD(qat_vf); static TASKQUEUE_DEFINE_THREAD(qat_bank_handler); @@ -65,6 +66,7 @@ adf_dev_stop_async(struct work_struct *work) /* Re-enable PF2VF interrupts */ hw_data->enable_pf2vf_interrupt(accel_dev); + adf_vf2pf_restarting_complete(accel_dev); kfree(stop_data); } @@ -123,6 +125,17 @@ adf_pf2vf_handle_pf_rp_reset(struct adf_accel_dev *accel_dev, return 0; } +int +adf_pf2vf_handle_pf_error(struct adf_accel_dev *accel_dev) +{ + device_printf(GET_DEV(accel_dev), "Fatal error received from PF\n"); + + if (adf_notify_fatal_error(accel_dev)) + device_printf(GET_DEV(accel_dev), "Couldn't notify fatal error\n"); + + return 0; +} + static void adf_pf2vf_bh_handler(void *data, int pending) { diff --git a/sys/dev/qat/qat_common/qat_hal.c b/sys/dev/qat/qat_common/qat_hal.c index b1e35e77272a..75190246ee1d 100644 --- a/sys/dev/qat/qat_common/qat_hal.c +++ b/sys/dev/qat/qat_common/qat_hal.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause */ -/* Copyright(c) 2007-2022 Intel Corporation */ +/* Copyright(c) 2007-2025 Intel Corporation */ #include "qat_freebsd.h" #include "adf_cfg.h" #include "adf_common_drv.h" @@ -1052,8 +1052,7 @@ qat_hal_init(struct adf_accel_dev *accel_dev) handle->hal_cap_ae_xfer_csr_addr_v = ae_offset; handle->hal_ep_csr_addr_v = ep_offset; handle->hal_cap_ae_local_csr_addr_v = - ((uintptr_t)handle->hal_cap_ae_xfer_csr_addr_v + - LOCAL_TO_XFER_REG_OFFSET); + ((uintptr_t)handle->hal_cap_ae_xfer_csr_addr_v + LOCAL_TO_XFER_REG_OFFSET); handle->fw_auth = (pci_get_device(GET_DEV(handle->accel_dev)) == ADF_DH895XCC_PCI_DEVICE_ID) ? false : @@ -1283,7 +1282,7 @@ qat_hal_exec_micro_inst(struct icp_qat_fw_loader_handle *handle, unsigned int max_cycle, unsigned int *endpc) { - uint64_t savuwords[MAX_EXEC_INST]; + u64 *savuwords = NULL; unsigned int ind_lm_addr0, ind_lm_addr1; unsigned int ind_lm_addr2, ind_lm_addr3; unsigned int ind_lm_addr_byte0, ind_lm_addr_byte1; @@ -1300,6 +1299,11 @@ qat_hal_exec_micro_inst(struct icp_qat_fw_loader_handle *handle, pr_err("QAT: invalid instruction num %d\n", inst_num); return EINVAL; } + + savuwords = kzalloc(sizeof(u64) * MAX_EXEC_INST, GFP_KERNEL); + if (!savuwords) + return ENOMEM; + /* save current context */ qat_hal_rd_indr_csr(handle, ae, ctx, LM_ADDR_0_INDIRECT, &ind_lm_addr0); qat_hal_rd_indr_csr(handle, ae, ctx, LM_ADDR_1_INDIRECT, &ind_lm_addr1); @@ -1360,8 +1364,10 @@ qat_hal_exec_micro_inst(struct icp_qat_fw_loader_handle *handle, qat_hal_wr_ae_csr(handle, ae, CTX_SIG_EVENTS_ACTIVE, 0); qat_hal_enable_ctx(handle, ae, (1 << ctx)); /* wait for micro codes to finish */ - if (qat_hal_wait_cycles(handle, ae, max_cycle, 1) != 0) + if (qat_hal_wait_cycles(handle, ae, max_cycle, 1) != 0) { + kfree(savuwords); *** 154 LINES SKIPPED ***