Merge "qce: stability and performance improvements"

このコミットが含まれているのは:
qctecmdr
2022-06-08 23:23:09 -07:00
committed by Gerrit - the friendly Code Review server
コミット 4cc3edff47
2個のファイルの変更70行の追加28行の削除

ファイルの表示

@@ -36,7 +36,7 @@
#define CRYPTO_SMMU_IOVA_START 0x10000000
#define CRYPTO_SMMU_IOVA_SIZE 0x40000000
#define CRYPTO_CONFIG_RESET 0xE001F
#define CRYPTO_CONFIG_RESET 0xE01EF
#define MAX_SPS_DESC_FIFO_SIZE 0xfff0
#define QCE_MAX_NUM_DSCR 0x200
#define QCE_SECTOR_SIZE 0x200
@@ -2233,9 +2233,66 @@ static int _qce_unlock_other_pipes(struct qce_device *pce_dev, int req_info)
static inline void qce_free_req_info(struct qce_device *pce_dev, int req_info,
bool is_complete);
static int qce_sps_pipe_reset(struct qce_device *pce_dev, int op)
{
int rc = -1;
struct sps_pipe *sps_pipe_info = NULL;
struct sps_connect *sps_connect_info = NULL;
/* Reset both the pipe sets in the pipe group */
sps_pipe_reset(pce_dev->ce_bam_info.bam_handle,
pce_dev->ce_bam_info.dest_pipe_index[op]);
sps_pipe_reset(pce_dev->ce_bam_info.bam_handle,
pce_dev->ce_bam_info.src_pipe_index[op]);
/* Reconnect to consumer pipe */
sps_pipe_info = pce_dev->ce_bam_info.consumer[op].pipe;
sps_connect_info = &pce_dev->ce_bam_info.consumer[op].connect;
rc = sps_disconnect(sps_pipe_info);
if (rc) {
pr_err("sps_disconnect() fail pipe=0x%lx, rc = %d\n",
(uintptr_t)sps_pipe_info, rc);
goto exit;
}
memset(sps_connect_info->desc.base, 0x00,
sps_connect_info->desc.size);
rc = sps_connect(sps_pipe_info, sps_connect_info);
if (rc) {
pr_err("sps_connect() fail pipe=0x%lx, rc = %d\n",
(uintptr_t)sps_pipe_info, rc);
goto exit;
}
/* Reconnect to producer pipe */
sps_pipe_info = pce_dev->ce_bam_info.producer[op].pipe;
sps_connect_info = &pce_dev->ce_bam_info.producer[op].connect;
rc = sps_disconnect(sps_pipe_info);
if (rc) {
pr_err("sps_connect() fail pipe=0x%lx, rc = %d\n",
(uintptr_t)sps_pipe_info, rc);
goto exit;
}
memset(sps_connect_info->desc.base, 0x00,
sps_connect_info->desc.size);
rc = sps_connect(sps_pipe_info, sps_connect_info);
if (rc) {
pr_err("sps_connect() fail pipe=0x%lx, rc = %d\n",
(uintptr_t)sps_pipe_info, rc);
goto exit;
}
/* Register producer callback */
rc = sps_register_event(sps_pipe_info,
&pce_dev->ce_bam_info.producer[op].event);
if (rc)
pr_err("Producer cb registration failed rc = %d\n",
rc);
exit:
return rc;
}
int qce_manage_timeout(void *handle, int req_info)
{
int rc = 0;
struct qce_device *pce_dev = (struct qce_device *) handle;
struct skcipher_request *areq;
struct ce_request_info *preq_info;
@@ -2247,17 +2304,16 @@ int qce_manage_timeout(void *handle, int req_info)
areq = (struct skcipher_request *) preq_info->areq;
pr_info("%s: req info = %d, offload op = %d\n", __func__, req_info, op);
rc = _qce_unlock_other_pipes(pce_dev, req_info);
if (rc)
pr_err("%s: fail unlock other pipes, rc = %d", __func__, rc);
if (qce_sps_pipe_reset(pce_dev, op))
pr_err("%s: pipe reset failed\n", __func__);
if (_qce_unlock_other_pipes(pce_dev, req_info))
pr_err("%s: fail unlock other pipes\n", __func__);
qce_free_req_info(pce_dev, req_info, true);
qce_callback(areq, NULL, NULL, 0);
sps_pipe_reset(pce_dev->ce_bam_info.bam_handle,
pce_dev->ce_bam_info.dest_pipe_index[op]);
sps_pipe_reset(pce_dev->ce_bam_info.bam_handle,
pce_dev->ce_bam_info.src_pipe_index[op]);
return rc;
return 0;
}
EXPORT_SYMBOL(qce_manage_timeout);

ファイルの表示

@@ -273,6 +273,8 @@ static int qcedev_open(struct inode *inode, struct file *file)
handle->cntl = podev;
file->private_data = handle;
qcedev_ce_high_bw_req(podev, true);
mutex_init(&handle->registeredbufs.lock);
INIT_LIST_HEAD(&handle->registeredbufs.list);
return 0;
@@ -290,6 +292,7 @@ static int qcedev_release(struct inode *inode, struct file *file)
__func__, podev);
}
qcedev_ce_high_bw_req(podev, false);
if (qcedev_unmap_all_buffers(handle))
pr_err("%s: failed to unmap all ion buffers\n", __func__);
@@ -719,7 +722,6 @@ static void qcedev_check_crypto_status(
QCEDEV_OFFLOAD_GENERIC_ERROR;
return;
}
}
static int submit_req(struct qcedev_async_req *qcedev_areq,
@@ -736,10 +738,6 @@ static int submit_req(struct qcedev_async_req *qcedev_areq,
qcedev_areq->err = 0;
podev = handle->cntl;
qcedev_check_crypto_status(qcedev_areq, podev->qce, print_sts);
if (qcedev_areq->offload_cipher_op_req.err != QCEDEV_OFFLOAD_NO_ERROR)
return 0;
spin_lock_irqsave(&podev->lock, flags);
if (podev->active_command == NULL) {
@@ -783,10 +781,6 @@ static int submit_req(struct qcedev_async_req *qcedev_areq,
if (ret)
qcedev_areq->err = -EIO;
qcedev_check_crypto_status(qcedev_areq, podev->qce, print_sts);
if (qcedev_areq->offload_cipher_op_req.err != QCEDEV_OFFLOAD_NO_ERROR)
return 0;
pstat = &_qcedev_stat;
if (qcedev_areq->op_type == QCEDEV_CRYPTO_OPER_CIPHER) {
switch (qcedev_areq->cipher_op_req.op) {
@@ -2109,10 +2103,6 @@ long qcedev_ioctl(struct file *file,
init_completion(&qcedev_areq->complete);
pstat = &_qcedev_stat;
if (cmd != QCEDEV_IOCTL_MAP_BUF_REQ &&
cmd != QCEDEV_IOCTL_UNMAP_BUF_REQ)
qcedev_ce_high_bw_req(podev, true);
switch (cmd) {
case QCEDEV_IOCTL_ENC_REQ:
case QCEDEV_IOCTL_DEC_REQ:
@@ -2148,7 +2138,6 @@ long qcedev_ioctl(struct file *file,
err = -EFAULT;
goto exit_free_qcedev_areq;
}
qcedev_areq->op_type = QCEDEV_CRYPTO_OPER_OFFLOAD_CIPHER;
if (qcedev_check_offload_cipher_params(
&qcedev_areq->offload_cipher_op_req, podev)) {
@@ -2428,9 +2417,6 @@ long qcedev_ioctl(struct file *file,
}
exit_free_qcedev_areq:
if (cmd != QCEDEV_IOCTL_MAP_BUF_REQ &&
cmd != QCEDEV_IOCTL_UNMAP_BUF_REQ && podev != NULL)
qcedev_ce_high_bw_req(podev, false);
kfree(qcedev_areq);
return err;
}