svn commit: r361484 - head/sys/dev/cxgbe/crypto
John Baldwin
jhb at FreeBSD.org
Mon May 25 22:23:14 UTC 2020
Author: jhb
Date: Mon May 25 22:23:13 2020
New Revision: 361484
URL: https://svnweb.freebsd.org/changeset/base/361484
Log:
Support separate output buffers in ccr(4).
Sponsored by: Netflix
Differential Revision: https://reviews.freebsd.org/D24545
Modified:
head/sys/dev/cxgbe/crypto/t4_crypto.c
Modified: head/sys/dev/cxgbe/crypto/t4_crypto.c
==============================================================================
--- head/sys/dev/cxgbe/crypto/t4_crypto.c Mon May 25 22:21:09 2020 (r361483)
+++ head/sys/dev/cxgbe/crypto/t4_crypto.c Mon May 25 22:23:13 2020 (r361484)
@@ -193,13 +193,16 @@ struct ccr_softc {
/*
* Pre-allocate S/G lists used when preparing a work request.
- * 'sg_crp' contains an sglist describing the entire buffer
- * for a 'struct cryptop'. 'sg_ulptx' is used to describe
- * the data the engine should DMA as input via ULPTX_SGL.
- * 'sg_dsgl' is used to describe the destination that cipher
- * text and a tag should be written to.
+ * 'sg_input' contains an sglist describing the entire input
+ * buffer for a 'struct cryptop'. 'sg_output' contains an
+ * sglist describing the entire output buffer. 'sg_ulptx' is
+ * used to describe the data the engine should DMA as input
+ * via ULPTX_SGL. 'sg_dsgl' is used to describe the
+ * destination that cipher text and a tag should be written
+ * to.
*/
- struct sglist *sg_crp;
+ struct sglist *sg_input;
+ struct sglist *sg_output;
struct sglist *sg_ulptx;
struct sglist *sg_dsgl;
@@ -495,7 +498,7 @@ ccr_hash(struct ccr_softc *sc, struct ccr_session *s,
} else {
imm_len = 0;
sglist_reset(sc->sg_ulptx);
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
@@ -617,10 +620,14 @@ ccr_blkcipher(struct ccr_softc *sc, struct ccr_session
op_type = CHCR_ENCRYPT_OP;
else
op_type = CHCR_DECRYPT_OP;
-
+
sglist_reset(sc->sg_dsgl);
- error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp,
- crp->crp_payload_start, crp->crp_payload_length);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output,
+ crp->crp_payload_output_start, crp->crp_payload_length);
+ else
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input,
+ crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
dsgl_nsegs = ccr_count_sgl(sc->sg_dsgl, DSGL_SGE_MAXLEN);
@@ -645,7 +652,7 @@ ccr_blkcipher(struct ccr_softc *sc, struct ccr_session
} else {
imm_len = 0;
sglist_reset(sc->sg_ulptx);
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
@@ -844,13 +851,21 @@ ccr_eta(struct ccr_softc *sc, struct ccr_session *s, s
iv_len + crp->crp_aad_length);
if (error)
return (error);
- error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp,
- crp->crp_payload_start, crp->crp_payload_length);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output,
+ crp->crp_payload_output_start, crp->crp_payload_length);
+ else
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input,
+ crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
if (op_type == CHCR_ENCRYPT_OP) {
- error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp,
- crp->crp_digest_start, hash_size_in_response);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output,
+ crp->crp_digest_start, hash_size_in_response);
+ else
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input,
+ crp->crp_digest_start, hash_size_in_response);
if (error)
return (error);
}
@@ -903,17 +918,17 @@ ccr_eta(struct ccr_softc *sc, struct ccr_session *s, s
imm_len = 0;
sglist_reset(sc->sg_ulptx);
if (crp->crp_aad_length != 0) {
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_aad_start, crp->crp_aad_length);
if (error)
return (error);
}
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
if (op_type == CHCR_DECRYPT_OP) {
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_digest_start, hash_size_in_response);
if (error)
return (error);
@@ -1153,13 +1168,21 @@ ccr_gcm(struct ccr_softc *sc, struct ccr_session *s, s
crp->crp_aad_length);
if (error)
return (error);
- error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp,
- crp->crp_payload_start, crp->crp_payload_length);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output,
+ crp->crp_payload_output_start, crp->crp_payload_length);
+ else
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input,
+ crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
if (op_type == CHCR_ENCRYPT_OP) {
- error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp,
- crp->crp_digest_start, hash_size_in_response);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output,
+ crp->crp_digest_start, hash_size_in_response);
+ else
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input,
+ crp->crp_digest_start, hash_size_in_response);
if (error)
return (error);
}
@@ -1199,17 +1222,17 @@ ccr_gcm(struct ccr_softc *sc, struct ccr_session *s, s
imm_len = 0;
sglist_reset(sc->sg_ulptx);
if (crp->crp_aad_length != 0) {
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_aad_start, crp->crp_aad_length);
if (error)
return (error);
}
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
if (op_type == CHCR_DECRYPT_OP) {
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_digest_start, hash_size_in_response);
if (error)
return (error);
@@ -1593,13 +1616,21 @@ ccr_ccm(struct ccr_softc *sc, struct ccr_session *s, s
aad_len);
if (error)
return (error);
- error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp,
- crp->crp_payload_start, crp->crp_payload_length);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output,
+ crp->crp_payload_output_start, crp->crp_payload_length);
+ else
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input,
+ crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
if (op_type == CHCR_ENCRYPT_OP) {
- error = sglist_append_sglist(sc->sg_dsgl, sc->sg_crp,
- crp->crp_digest_start, hash_size_in_response);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_output,
+ crp->crp_digest_start, hash_size_in_response);
+ else
+ error = sglist_append_sglist(sc->sg_dsgl, sc->sg_input,
+ crp->crp_digest_start, hash_size_in_response);
if (error)
return (error);
}
@@ -1641,17 +1672,17 @@ ccr_ccm(struct ccr_softc *sc, struct ccr_session *s, s
sglist_reset(sc->sg_ulptx);
if (crp->crp_aad_length != 0) {
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_aad_start, crp->crp_aad_length);
if (error)
return (error);
}
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_payload_start, crp->crp_payload_length);
if (error)
return (error);
if (op_type == CHCR_DECRYPT_OP) {
- error = sglist_append_sglist(sc->sg_ulptx, sc->sg_crp,
+ error = sglist_append_sglist(sc->sg_ulptx, sc->sg_input,
crp->crp_digest_start, hash_size_in_response);
if (error)
return (error);
@@ -2080,7 +2111,8 @@ ccr_attach(device_t dev)
sc->adapter->ccr_softc = sc;
mtx_init(&sc->lock, "ccr", NULL, MTX_DEF);
- sc->sg_crp = sglist_alloc(TX_SGL_SEGS, M_WAITOK);
+ sc->sg_input = sglist_alloc(TX_SGL_SEGS, M_WAITOK);
+ sc->sg_output = sglist_alloc(TX_SGL_SEGS, M_WAITOK);
sc->sg_ulptx = sglist_alloc(TX_SGL_SEGS, M_WAITOK);
sc->sg_dsgl = sglist_alloc(MAX_RX_PHYS_DSGL_SGE, M_WAITOK);
sc->iv_aad_buf = malloc(MAX_AAD_LEN, M_CCR, M_WAITOK);
@@ -2108,7 +2140,8 @@ ccr_detach(device_t dev)
free(sc->iv_aad_buf, M_CCR);
sglist_free(sc->sg_dsgl);
sglist_free(sc->sg_ulptx);
- sglist_free(sc->sg_crp);
+ sglist_free(sc->sg_output);
+ sglist_free(sc->sg_input);
sc->adapter->ccr_softc = NULL;
return (0);
}
@@ -2294,7 +2327,7 @@ ccr_probesession(device_t dev, const struct crypto_ses
{
unsigned int cipher_mode;
- if (csp->csp_flags != 0)
+ if ((csp->csp_flags & ~(CSP_F_SEPARATE_OUTPUT)) != 0)
return (EINVAL);
switch (csp->csp_mode) {
case CSP_MODE_DIGEST:
@@ -2576,7 +2609,9 @@ ccr_process(device_t dev, struct cryptop *crp, int hin
sc = device_get_softc(dev);
mtx_lock(&sc->lock);
- error = ccr_populate_sglist(sc->sg_crp, &crp->crp_buf);
+ error = ccr_populate_sglist(sc->sg_input, &crp->crp_buf);
+ if (error == 0 && CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ error = ccr_populate_sglist(sc->sg_output, &crp->crp_obuf);
if (error) {
sc->stats_sglist_error++;
goto out;
More information about the svn-src-all
mailing list