Commit 6010ddf1 authored by Yabin Li's avatar Yabin Li Committed by yangdepei
Browse files

crypto: ccp: Process multiple VQ commands once for SM4/SM4-CTR ccp.

hygon inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I99ZNA



--------------------------------

optimize sm4 processing performance by starting ccp only after
all cmd has been prepared

Signed-off-by: default avatarYabin Li <liyabin@hygon.cn>
Signed-off-by: default avataryangdepei <yangdepei@hygon.cn>
parent 519c3481
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -812,7 +812,7 @@ static int ccp5_perform_sm4(struct ccp_op *op)
	CCP5_CMD_KEY_HI(&desc) = 0;
	CCP5_CMD_KEY_MEM(&desc) = CCP_MEMTYPE_SB;

	return ccp5_do_cmd(&desc, op->cmd_q);
	return ccp5_do_multi_cmds(&desc, op->cmd_q);
}

static int ccp5_perform_sm4_ctr(struct ccp_op *op)
@@ -854,7 +854,7 @@ static int ccp5_perform_sm4_ctr(struct ccp_op *op)
	CCP5_CMD_KEY_HI(&desc) = 0;
	CCP5_CMD_KEY_MEM(&desc) = CCP_MEMTYPE_SB;

	return ccp5_do_cmd(&desc, op->cmd_q);
	return ccp5_do_multi_cmds(&desc, op->cmd_q);
}

static int ccp_find_lsb_regions(struct ccp_cmd_queue *cmd_q, u64 status)
+26 −0
Original line number Diff line number Diff line
@@ -2807,12 +2807,25 @@ static int ccp_run_sm4_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
		if (!src.sg_wa.bytes_left)
			op.eom = 1;

		if (!src.sg_wa.bytes_left || op.soc)
			op.ioc = 1;
		else
			op.ioc = 0;

		ret = cmd_q->ccp->vdata->perform->sm4(&op);
		if (ret) {
			cmd->engine_error = cmd_q->cmd_error;
			goto e_iv_key;
		}

		if (!src.sg_wa.bytes_left || op.soc) {
			ret = cmd_q->ccp->vdata->perform->run_cmd(&op);
			if (ret) {
				cmd->engine_error = cmd_q->cmd_error;
				goto e_iv_key;
			}
		}

		ccp_process_data(&src, &dst, &op);
	}

@@ -2918,12 +2931,25 @@ static int ccp_run_sm4_ctr_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
		if (!src.sg_wa.bytes_left)
			op.eom = 1;

		if (!src.sg_wa.bytes_left || op.soc)
			op.ioc = 1;
		else
			op.ioc = 0;

		ret = cmd_q->ccp->vdata->perform->sm4_ctr(&op);
		if (ret) {
			cmd->engine_error = cmd_q->cmd_error;
			goto e_iv_key;
		}

		if (!src.sg_wa.bytes_left || op.soc) {
			ret = cmd_q->ccp->vdata->perform->run_cmd(&op);
			if (ret) {
				cmd->engine_error = cmd_q->cmd_error;
				goto e_iv_key;
			}
		}

		ccp_process_data(&src, &dst, &op);
	}