git: 1996360d7338 - stable/13 - qat: Add support for separate AAD and output buffers
Mark Johnston
markj at FreeBSD.org
Wed Feb 3 14:37:47 UTC 2021
The branch stable/13 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=1996360d7338db8f12b9bda9572d4e2d85c89170
commit 1996360d7338db8f12b9bda9572d4e2d85c89170
Author: Mark Johnston <markj at FreeBSD.org>
AuthorDate: 2021-01-27 20:30:58 +0000
Commit: Mark Johnston <markj at FreeBSD.org>
CommitDate: 2021-02-03 14:37:41 +0000
qat: Add support for separate AAD and output buffers
Sponsored by: Rubicon Communications, LLC ("Netgate")
(cherry picked from commit bd674d8b1fa808dff1afdcb6afc70226077ee78a)
---
sys/dev/qat/qat.c | 293 +++++++++++++++++++++++++++++++++++++------------
sys/dev/qat/qat_hw15.c | 20 +++-
sys/dev/qat/qat_hw17.c | 22 +++-
sys/dev/qat/qatreg.h | 3 +
sys/dev/qat/qatvar.h | 43 ++++----
5 files changed, 281 insertions(+), 100 deletions(-)
diff --git a/sys/dev/qat/qat.c b/sys/dev/qat/qat.c
index 1e533d1bebcc..acfe0c6a1e07 100644
--- a/sys/dev/qat/qat.c
+++ b/sys/dev/qat/qat.c
@@ -1172,9 +1172,8 @@ static void
qat_crypto_free_sym_cookie(struct qat_crypto_bank *qcb,
struct qat_sym_cookie *qsc)
{
-
- explicit_bzero(qsc->qsc_iv_buf, sizeof(qsc->qsc_iv_buf));
- explicit_bzero(qsc->qsc_auth_res, sizeof(qsc->qsc_auth_res));
+ explicit_bzero(qsc->qsc_iv_buf, EALG_MAX_BLOCK_LEN);
+ explicit_bzero(qsc->qsc_auth_res, QAT_SYM_HASH_BUFFER_LEN);
mtx_lock(&qcb->qcb_bank_mtx);
qcb->qcb_symck_free[qcb->qcb_symck_free_count++] = qsc;
@@ -1350,18 +1349,66 @@ struct qat_crypto_load_cb_arg {
int error;
};
+static int
+qat_crypto_populate_buf_list(struct buffer_list_desc *buffers,
+ bus_dma_segment_t *segs, int niseg, int noseg, int skip)
+{
+ struct flat_buffer_desc *flatbuf;
+ bus_addr_t addr;
+ bus_size_t len;
+ int iseg, oseg;
+
+ for (iseg = 0, oseg = noseg; iseg < niseg && oseg < QAT_MAXSEG;
+ iseg++) {
+ addr = segs[iseg].ds_addr;
+ len = segs[iseg].ds_len;
+
+ if (skip > 0) {
+ if (skip < len) {
+ addr += skip;
+ len -= skip;
+ skip = 0;
+ } else {
+ skip -= len;
+ continue;
+ }
+ }
+
+ flatbuf = &buffers->flat_bufs[oseg++];
+ flatbuf->data_len_in_bytes = (uint32_t)len;
+ flatbuf->phy_buffer = (uint64_t)addr;
+ }
+ buffers->num_buffers = oseg;
+ return iseg < niseg ? E2BIG : 0;
+}
+
static void
-qat_crypto_load_cb(void *_arg, bus_dma_segment_t *segs, int nseg,
+qat_crypto_load_aadbuf_cb(void *_arg, bus_dma_segment_t *segs, int nseg,
+ int error)
+{
+ struct qat_crypto_load_cb_arg *arg;
+ struct qat_sym_cookie *qsc;
+
+ arg = _arg;
+ if (error != 0) {
+ arg->error = error;
+ return;
+ }
+
+ qsc = arg->qsc;
+ arg->error = qat_crypto_populate_buf_list(&qsc->qsc_buf_list, segs,
+ nseg, 0, 0);
+}
+
+static void
+qat_crypto_load_buf_cb(void *_arg, bus_dma_segment_t *segs, int nseg,
int error)
{
struct cryptop *crp;
- struct flat_buffer_desc *flatbuf;
struct qat_crypto_load_cb_arg *arg;
struct qat_session *qs;
struct qat_sym_cookie *qsc;
- bus_addr_t addr;
- bus_size_t len;
- int iseg, oseg, skip;
+ int noseg, skip;
arg = _arg;
if (error != 0) {
@@ -1374,43 +1421,70 @@ qat_crypto_load_cb(void *_arg, bus_dma_segment_t *segs, int nseg,
qsc = arg->qsc;
if (qs->qs_auth_algo == HW_AUTH_ALGO_GALOIS_128) {
- /*
- * The firmware expects AAD to be in a contiguous buffer and
- * padded to a multiple of 16 bytes. To satisfy these
- * constraints we bounce the AAD into a per-request buffer.
- */
- crypto_copydata(crp, crp->crp_aad_start, crp->crp_aad_length,
- qsc->qsc_gcm_aad);
- memset(qsc->qsc_gcm_aad + crp->crp_aad_length, 0,
- roundup2(crp->crp_aad_length, QAT_AES_GCM_AAD_ALIGN) -
- crp->crp_aad_length);
+ /* AAD was handled in qat_crypto_load(). */
skip = crp->crp_payload_start;
- } else if (crp->crp_aad_length > 0) {
+ noseg = 0;
+ } else if (crp->crp_aad == NULL && crp->crp_aad_length > 0) {
skip = crp->crp_aad_start;
+ noseg = 0;
} else {
skip = crp->crp_payload_start;
+ noseg = crp->crp_aad == NULL ?
+ 0 : qsc->qsc_buf_list.num_buffers;
}
+ arg->error = qat_crypto_populate_buf_list(&qsc->qsc_buf_list, segs,
+ nseg, noseg, skip);
+}
- for (iseg = oseg = 0; iseg < nseg; iseg++) {
- addr = segs[iseg].ds_addr;
- len = segs[iseg].ds_len;
+static void
+qat_crypto_load_obuf_cb(void *_arg, bus_dma_segment_t *segs, int nseg,
+ int error)
+{
+ struct buffer_list_desc *ibufs, *obufs;
+ struct flat_buffer_desc *ibuf, *obuf;
+ struct cryptop *crp;
+ struct qat_crypto_load_cb_arg *arg;
+ struct qat_session *qs;
+ struct qat_sym_cookie *qsc;
+ int buflen, osegs, tocopy;
- if (skip > 0) {
- if (skip < len) {
- addr += skip;
- len -= skip;
- skip = 0;
- } else {
- skip -= len;
- continue;
- }
- }
+ arg = _arg;
+ if (error != 0) {
+ arg->error = error;
+ return;
+ }
- flatbuf = &qsc->qsc_flat_bufs[oseg++];
- flatbuf->data_len_in_bytes = (uint32_t)len;
- flatbuf->phy_buffer = (uint64_t)addr;
+ crp = arg->crp;
+ qs = arg->qs;
+ qsc = arg->qsc;
+
+ /*
+ * The payload must start at the same offset in the output SG list as in
+ * the input SG list. Copy over SG entries from the input corresponding
+ * to the AAD buffer.
+ */
+ osegs = 0;
+ if (qs->qs_auth_algo != HW_AUTH_ALGO_GALOIS_128 &&
+ crp->crp_aad_length > 0) {
+ tocopy = crp->crp_aad == NULL ?
+ crp->crp_payload_start - crp->crp_aad_start :
+ crp->crp_aad_length;
+
+ ibufs = &qsc->qsc_buf_list;
+ obufs = &qsc->qsc_obuf_list;
+ for (; osegs < ibufs->num_buffers && tocopy > 0; osegs++) {
+ ibuf = &ibufs->flat_bufs[osegs];
+ obuf = &obufs->flat_bufs[osegs];
+
+ obuf->phy_buffer = ibuf->phy_buffer;
+ buflen = imin(ibuf->data_len_in_bytes, tocopy);
+ obuf->data_len_in_bytes = buflen;
+ tocopy -= buflen;
+ }
}
- qsc->qsc_buf_list.num_buffers = oseg;
+
+ arg->error = qat_crypto_populate_buf_list(&qsc->qsc_obuf_list, segs,
+ nseg, osegs, crp->crp_payload_output_start);
}
static int
@@ -1426,10 +1500,52 @@ qat_crypto_load(struct qat_session *qs, struct qat_sym_cookie *qsc,
arg.qs = qs;
arg.qsc = qsc;
arg.error = 0;
- error = bus_dmamap_load_crp(qsc->qsc_buf_dma_tag, qsc->qsc_buf_dmamap,
- crp, qat_crypto_load_cb, &arg, BUS_DMA_NOWAIT);
- if (error == 0)
- error = arg.error;
+
+ error = 0;
+ if (qs->qs_auth_algo == HW_AUTH_ALGO_GALOIS_128 &&
+ crp->crp_aad_length > 0) {
+ /*
+ * The firmware expects AAD to be in a contiguous buffer and
+ * padded to a multiple of 16 bytes. To satisfy these
+ * constraints we bounce the AAD into a per-request buffer.
+ * There is a small limit on the AAD size so this is not too
+ * onerous.
+ */
+ memset(qsc->qsc_gcm_aad, 0, QAT_GCM_AAD_SIZE_MAX);
+ if (crp->crp_aad == NULL) {
+ crypto_copydata(crp, crp->crp_aad_start,
+ crp->crp_aad_length, qsc->qsc_gcm_aad);
+ } else {
+ memcpy(qsc->qsc_gcm_aad, crp->crp_aad,
+ crp->crp_aad_length);
+ }
+ } else if (crp->crp_aad != NULL) {
+ error = bus_dmamap_load(
+ qsc->qsc_dma[QAT_SYM_DMA_AADBUF].qsd_dma_tag,
+ qsc->qsc_dma[QAT_SYM_DMA_AADBUF].qsd_dmamap,
+ crp->crp_aad, crp->crp_aad_length,
+ qat_crypto_load_aadbuf_cb, &arg, BUS_DMA_NOWAIT);
+ if (error == 0)
+ error = arg.error;
+ }
+ if (error == 0) {
+ error = bus_dmamap_load_crp_buffer(
+ qsc->qsc_dma[QAT_SYM_DMA_BUF].qsd_dma_tag,
+ qsc->qsc_dma[QAT_SYM_DMA_BUF].qsd_dmamap,
+ &crp->crp_buf, qat_crypto_load_buf_cb, &arg,
+ BUS_DMA_NOWAIT);
+ if (error == 0)
+ error = arg.error;
+ }
+ if (error == 0 && CRYPTO_HAS_OUTPUT_BUFFER(crp)) {
+ error = bus_dmamap_load_crp_buffer(
+ qsc->qsc_dma[QAT_SYM_DMA_OBUF].qsd_dma_tag,
+ qsc->qsc_dma[QAT_SYM_DMA_OBUF].qsd_dmamap,
+ &crp->crp_obuf, qat_crypto_load_obuf_cb, &arg,
+ BUS_DMA_NOWAIT);
+ if (error == 0)
+ error = arg.error;
+ }
return error;
}
@@ -1444,11 +1560,11 @@ qat_crypto_select_bank(struct qat_crypto *qcy)
static int
qat_crypto_setup_ring(struct qat_softc *sc, struct qat_crypto_bank *qcb)
{
- int error, i, bank;
- int curname = 0;
char *name;
+ int bank, curname, error, i, j;
bank = qcb->qcb_bank;
+ curname = 0;
name = qcb->qcb_ring_names[curname++];
snprintf(name, QAT_RING_NAME_SIZE, "bank%d sym_tx", bank);
@@ -1480,10 +1596,16 @@ qat_crypto_setup_ring(struct qat_softc *sc, struct qat_crypto_bank *qcb)
qsc->qsc_self_dma_tag = qdm->qdm_dma_tag;
qsc->qsc_bulk_req_params_buf_paddr =
qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
- u.qsc_bulk_cookie.qsbc_req_params_buf);
+ qsc_bulk_cookie.qsbc_req_params_buf);
qsc->qsc_buffer_list_desc_paddr =
qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
qsc_buf_list);
+ qsc->qsc_obuffer_list_desc_paddr =
+ qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
+ qsc_obuf_list);
+ qsc->qsc_obuffer_list_desc_paddr =
+ qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
+ qsc_obuf_list);
qsc->qsc_iv_buf_paddr =
qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
qsc_iv_buf);
@@ -1499,24 +1621,25 @@ qat_crypto_setup_ring(struct qat_softc *sc, struct qat_crypto_bank *qcb)
qcb->qcb_symck_free[i] = qsc;
qcb->qcb_symck_free_count++;
- error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev),
- 1, 0, /* alignment, boundary */
- BUS_SPACE_MAXADDR, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- QAT_MAXLEN, /* maxsize */
- QAT_MAXSEG, /* nsegments */
- QAT_MAXLEN, /* maxsegsize */
- BUS_DMA_COHERENT, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &qsc->qsc_buf_dma_tag);
- if (error != 0)
- return error;
-
- error = bus_dmamap_create(qsc->qsc_buf_dma_tag,
- BUS_DMA_COHERENT, &qsc->qsc_buf_dmamap);
- if (error)
- return error;
+ for (j = 0; j < QAT_SYM_DMA_COUNT; j++) {
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev),
+ 1, 0, /* alignment, boundary */
+ BUS_SPACE_MAXADDR, /* lowaddr */
+ BUS_SPACE_MAXADDR, /* highaddr */
+ NULL, NULL, /* filter, filterarg */
+ QAT_MAXLEN, /* maxsize */
+ QAT_MAXSEG, /* nsegments */
+ QAT_MAXLEN, /* maxsegsize */
+ BUS_DMA_COHERENT, /* flags */
+ NULL, NULL, /* lockfunc, lockarg */
+ &qsc->qsc_dma[j].qsd_dma_tag);
+ if (error != 0)
+ return error;
+ error = bus_dmamap_create(qsc->qsc_dma[j].qsd_dma_tag,
+ BUS_DMA_COHERENT, &qsc->qsc_dma[j].qsd_dmamap);
+ if (error != 0)
+ return error;
+ }
}
return 0;
@@ -1534,10 +1657,17 @@ static void
qat_crypto_bank_deinit(struct qat_softc *sc, struct qat_crypto_bank *qcb)
{
struct qat_dmamem *qdm;
- int i;
+ struct qat_sym_cookie *qsc;
+ int i, j;
for (i = 0; i < QAT_NSYMCOOKIE; i++) {
qdm = &qcb->qcb_symck_dmamems[i];
+ qsc = qcb->qcb_symck_free[i];
+ for (j = 0; j < QAT_SYM_DMA_COUNT; j++) {
+ bus_dmamap_destroy(qsc->qsc_dma[j].qsd_dma_tag,
+ qsc->qsc_dma[j].qsd_dmamap);
+ bus_dma_tag_destroy(qsc->qsc_dma[j].qsd_dma_tag);
+ }
qat_free_dmamem(sc, qdm);
}
qat_free_dmamem(sc, &qcb->qcb_sym_tx->qr_dma);
@@ -1653,6 +1783,15 @@ qat_crypto_stop(struct qat_softc *sc)
(void)crypto_unregister_all(qcy->qcy_cid);
}
+static void
+qat_crypto_sym_dma_unload(struct qat_sym_cookie *qsc, enum qat_sym_dma i)
+{
+ bus_dmamap_sync(qsc->qsc_dma[i].qsd_dma_tag, qsc->qsc_dma[i].qsd_dmamap,
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(qsc->qsc_dma[i].qsd_dma_tag,
+ qsc->qsc_dma[i].qsd_dmamap);
+}
+
static int
qat_crypto_sym_rxintr(struct qat_softc *sc, void *arg, void *msg)
{
@@ -1669,16 +1808,19 @@ qat_crypto_sym_rxintr(struct qat_softc *sc, void *arg, void *msg)
qsc = *(void **)((uintptr_t)msg + sc->sc_hw.qhw_crypto_opaque_offset);
- qsbc = &qsc->u.qsc_bulk_cookie;
+ qsbc = &qsc->qsc_bulk_cookie;
qcy = qsbc->qsbc_crypto;
qs = qsbc->qsbc_session;
crp = qsbc->qsbc_cb_tag;
bus_dmamap_sync(qsc->qsc_self_dma_tag, qsc->qsc_self_dmamap,
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
- bus_dmamap_sync(qsc->qsc_buf_dma_tag, qsc->qsc_buf_dmamap,
- BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(qsc->qsc_buf_dma_tag, qsc->qsc_buf_dmamap);
+
+ if (crp->crp_aad != NULL)
+ qat_crypto_sym_dma_unload(qsc, QAT_SYM_DMA_AADBUF);
+ qat_crypto_sym_dma_unload(qsc, QAT_SYM_DMA_BUF);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp))
+ qat_crypto_sym_dma_unload(qsc, QAT_SYM_DMA_OBUF);
error = 0;
if ((auth_sz = qs->qs_auth_mlen) != 0) {
@@ -1719,6 +1861,10 @@ qat_crypto_sym_rxintr(struct qat_softc *sc, void *arg, void *msg)
static int
qat_probesession(device_t dev, const struct crypto_session_params *csp)
{
+ if ((csp->csp_flags & ~(CSP_F_SEPARATE_OUTPUT | CSP_F_SEPARATE_AAD)) !=
+ 0)
+ return EINVAL;
+
if (csp->csp_cipher_alg == CRYPTO_AES_XTS &&
qat_lookup(dev)->qatp_chip == QAT_CHIP_C2XXX) {
/*
@@ -2092,15 +2238,26 @@ qat_process(device_t dev, struct cryptop *crp, int hint)
if (error != 0)
goto fail2;
- qsbc = &qsc->u.qsc_bulk_cookie;
+ qsbc = &qsc->qsc_bulk_cookie;
qsbc->qsbc_crypto = qcy;
qsbc->qsbc_session = qs;
qsbc->qsbc_cb_tag = crp;
sc->sc_hw.qhw_crypto_setup_req_params(qcb, qs, desc, qsc, crp);
- bus_dmamap_sync(qsc->qsc_buf_dma_tag, qsc->qsc_buf_dmamap,
+ if (crp->crp_aad != NULL) {
+ bus_dmamap_sync(qsc->qsc_dma[QAT_SYM_DMA_AADBUF].qsd_dma_tag,
+ qsc->qsc_dma[QAT_SYM_DMA_AADBUF].qsd_dmamap,
+ BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+ }
+ bus_dmamap_sync(qsc->qsc_dma[QAT_SYM_DMA_BUF].qsd_dma_tag,
+ qsc->qsc_dma[QAT_SYM_DMA_BUF].qsd_dmamap,
BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) {
+ bus_dmamap_sync(qsc->qsc_dma[QAT_SYM_DMA_OBUF].qsd_dma_tag,
+ qsc->qsc_dma[QAT_SYM_DMA_OBUF].qsd_dmamap,
+ BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+ }
bus_dmamap_sync(qsc->qsc_self_dma_tag, qsc->qsc_self_dmamap,
BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
diff --git a/sys/dev/qat/qat_hw15.c b/sys/dev/qat/qat_hw15.c
index 4f823a0a9ae4..aab5be9b647d 100644
--- a/sys/dev/qat/qat_hw15.c
+++ b/sys/dev/qat/qat_hw15.c
@@ -818,7 +818,7 @@ qat_hw15_crypto_setup_req_params(struct qat_crypto_bank *qcb,
enum fw_la_cmd_id cmd_id = desc->qcd_cmd_id;
enum fw_slice next_slice;
- qsbc = &qsc->u.qsc_bulk_cookie;
+ qsbc = &qsc->qsc_bulk_cookie;
bulk_req = (struct fw_la_bulk_req *)qsbc->qsbc_msg;
memcpy(bulk_req, &desc->qcd_req_cache, QAT_HW15_SESSION_REQ_CACHE_SIZE);
@@ -826,7 +826,13 @@ qat_hw15_crypto_setup_req_params(struct qat_crypto_bank *qcb,
bulk_req->comn_hdr.comn_req_flags =
qat_hw15_get_comn_req_flags(qcb->qcb_bank % 2);
bulk_req->comn_mid.src_data_addr = qsc->qsc_buffer_list_desc_paddr;
- bulk_req->comn_mid.dest_data_addr = qsc->qsc_buffer_list_desc_paddr;
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) {
+ bulk_req->comn_mid.dest_data_addr =
+ qsc->qsc_obuffer_list_desc_paddr;
+ } else {
+ bulk_req->comn_mid.dest_data_addr =
+ qsc->qsc_buffer_list_desc_paddr;
+ }
bulk_req->req_params_addr = qsc->qsc_bulk_req_params_buf_paddr;
bulk_req->comn_ftr.next_request_addr = 0;
bulk_req->comn_mid.opaque_data = (uint64_t)(uintptr_t)qsc;
@@ -918,8 +924,14 @@ qat_hw15_crypto_setup_req_params(struct qat_crypto_bank *qcb,
cipher_req->curr_id = FW_SLICE_CIPHER;
cipher_req->next_id = next_slice;
- cipher_req->cipher_off = crp->crp_aad_length == 0 ? 0 :
- crp->crp_payload_start - crp->crp_aad_start;
+ if (crp->crp_aad_length == 0) {
+ cipher_req->cipher_off = 0;
+ } else if (crp->crp_aad == NULL) {
+ cipher_req->cipher_off =
+ crp->crp_payload_start - crp->crp_aad_start;
+ } else {
+ cipher_req->cipher_off = crp->crp_aad_length;
+ }
cipher_req->cipher_len = crp->crp_payload_length;
cipher_req->state_address = qsc->qsc_iv_buf_paddr;
}
diff --git a/sys/dev/qat/qat_hw17.c b/sys/dev/qat/qat_hw17.c
index 643b624ba840..92f2c1ee251d 100644
--- a/sys/dev/qat/qat_hw17.c
+++ b/sys/dev/qat/qat_hw17.c
@@ -581,13 +581,19 @@ qat_hw17_crypto_setup_req_params(struct qat_crypto_bank *qcb __unused,
uint8_t *req_params_ptr;
enum fw_la_cmd_id cmd_id = desc->qcd_cmd_id;
- qsbc = &qsc->u.qsc_bulk_cookie;
+ qsbc = &qsc->qsc_bulk_cookie;
bulk_req = (struct fw_la_bulk_req *)qsbc->qsbc_msg;
memcpy(bulk_req, desc->qcd_req_cache, sizeof(struct fw_la_bulk_req));
bulk_req->comn_mid.opaque_data = (uint64_t)(uintptr_t)qsc;
bulk_req->comn_mid.src_data_addr = qsc->qsc_buffer_list_desc_paddr;
- bulk_req->comn_mid.dest_data_addr = qsc->qsc_buffer_list_desc_paddr;
+ if (CRYPTO_HAS_OUTPUT_BUFFER(crp)) {
+ bulk_req->comn_mid.dest_data_addr =
+ qsc->qsc_obuffer_list_desc_paddr;
+ } else {
+ bulk_req->comn_mid.dest_data_addr =
+ qsc->qsc_buffer_list_desc_paddr;
+ }
if (__predict_false(crp->crp_cipher_key != NULL ||
crp->crp_auth_key != NULL))
qat_hw17_crypto_req_setkey(desc, qs, qsc, bulk_req, crp);
@@ -643,9 +649,15 @@ qat_hw17_crypto_setup_req_params(struct qat_crypto_bank *qcb __unused,
}
} else {
if (cmd_id != FW_LA_CMD_AUTH) {
- cipher_param->cipher_offset =
- crp->crp_aad_length == 0 ? 0 :
- crp->crp_payload_start - crp->crp_aad_start;
+ if (crp->crp_aad_length == 0) {
+ cipher_param->cipher_offset = 0;
+ } else if (crp->crp_aad == NULL) {
+ cipher_param->cipher_offset =
+ crp->crp_payload_start - crp->crp_aad_start;
+ } else {
+ cipher_param->cipher_offset =
+ crp->crp_aad_length;
+ }
cipher_param->cipher_length = crp->crp_payload_length;
}
if (cmd_id != FW_LA_CMD_CIPHER) {
diff --git a/sys/dev/qat/qatreg.h b/sys/dev/qat/qatreg.h
index 2a0be321b4f9..076354fc6108 100644
--- a/sys/dev/qat/qatreg.h
+++ b/sys/dev/qat/qatreg.h
@@ -1550,10 +1550,13 @@ struct flat_buffer_desc {
uint64_t phy_buffer;
};
+#define HW_MAXSEG 32
+
struct buffer_list_desc {
uint64_t resrvd;
uint32_t num_buffers;
uint32_t reserved;
+ struct flat_buffer_desc flat_bufs[HW_MAXSEG];
};
/* -------------------------------------------------------------------------- */
diff --git a/sys/dev/qat/qatvar.h b/sys/dev/qat/qatvar.h
index 3326dc268fc1..3f0ecd411874 100644
--- a/sys/dev/qat/qatvar.h
+++ b/sys/dev/qat/qatvar.h
@@ -69,13 +69,11 @@
#define QAT_NSYMREQ 256
#define QAT_NSYMCOOKIE ((QAT_NSYMREQ * 2 + 1) * 2)
-#define QAT_NASYMREQ 64
-#define QAT_BATCH_SUBMIT_FREE_SPACE 2
#define QAT_EV_NAME_SIZE 32
#define QAT_RING_NAME_SIZE 32
-#define QAT_MAXSEG 32 /* max segments for sg dma */
+#define QAT_MAXSEG HW_MAXSEG /* max segments for sg dma */
#define QAT_MAXLEN 65535 /* IP_MAXPACKET */
#define QAT_HB_INTERVAL 500 /* heartbeat msec */
@@ -519,7 +517,7 @@ struct qat_sym_hash_def {
struct qat_sym_bulk_cookie {
uint8_t qsbc_req_params_buf[QAT_SYM_REQ_PARAMS_SIZE_PADDED];
- /* memory block reserved for request params
+ /* memory block reserved for request params, QAT 1.5 only
* NOTE: Field must be correctly aligned in memory for access by QAT
* engine */
struct qat_crypto *qsbc_crypto;
@@ -539,25 +537,26 @@ struct qat_sym_bulk_cookie {
HASH_CONTENT_DESC_SIZE + CIPHER_CONTENT_DESC_SIZE, \
QAT_OPTIMAL_ALIGN)
+enum qat_sym_dma {
+ QAT_SYM_DMA_AADBUF = 0,
+ QAT_SYM_DMA_BUF,
+ QAT_SYM_DMA_OBUF,
+ QAT_SYM_DMA_COUNT,
+};
+
+struct qat_sym_dmamap {
+ bus_dmamap_t qsd_dmamap;
+ bus_dma_tag_t qsd_dma_tag;
+};
+
struct qat_sym_cookie {
- union qat_sym_cookie_u {
- /* should be 64byte aligned */
- struct qat_sym_bulk_cookie qsc_bulk_cookie;
- /* symmetric bulk cookie */
-#ifdef notyet
- struct qat_sym_key_cookie qsc_key_cookie;
- /* symmetric key cookie */
- struct qat_sym_nrbg_cookie qsc_nrbg_cookie;
- /* symmetric NRBG cookie */
-#endif
- } u;
+ struct qat_sym_bulk_cookie qsc_bulk_cookie;
/* should be 64-byte aligned */
struct buffer_list_desc qsc_buf_list;
- struct flat_buffer_desc qsc_flat_bufs[QAT_MAXSEG]; /* should be here */
+ struct buffer_list_desc qsc_obuf_list;
- bus_dmamap_t qsc_self_dmamap; /* self DMA mapping and
- end of DMA region */
+ bus_dmamap_t qsc_self_dmamap;
bus_dma_tag_t qsc_self_dma_tag;
uint8_t qsc_iv_buf[EALG_MAX_BLOCK_LEN];
@@ -565,12 +564,11 @@ struct qat_sym_cookie {
uint8_t qsc_gcm_aad[QAT_GCM_AAD_SIZE_MAX];
uint8_t qsc_content_desc[CONTENT_DESC_MAX_SIZE];
- bus_dmamap_t qsc_buf_dmamap; /* qsc_flat_bufs DMA mapping */
- bus_dma_tag_t qsc_buf_dma_tag;
- void *qsc_buf;
+ struct qat_sym_dmamap qsc_dma[QAT_SYM_DMA_COUNT];
bus_addr_t qsc_bulk_req_params_buf_paddr;
bus_addr_t qsc_buffer_list_desc_paddr;
+ bus_addr_t qsc_obuffer_list_desc_paddr;
bus_addr_t qsc_iv_buf_paddr;
bus_addr_t qsc_auth_res_paddr;
bus_addr_t qsc_gcm_aad_paddr;
@@ -578,7 +576,7 @@ struct qat_sym_cookie {
};
CTASSERT(offsetof(struct qat_sym_cookie,
- u.qsc_bulk_cookie.qsbc_req_params_buf) % QAT_OPTIMAL_ALIGN == 0);
+ qsc_bulk_cookie.qsbc_req_params_buf) % QAT_OPTIMAL_ALIGN == 0);
CTASSERT(offsetof(struct qat_sym_cookie, qsc_buf_list) % QAT_OPTIMAL_ALIGN == 0);
#define MAX_CIPHER_SETUP_BLK_SZ \
@@ -614,7 +612,6 @@ struct qat_crypto_desc {
uint8_t qcd_req_cache[QAT_MSG_SIZE_TO_BYTES(QAT_MAX_MSG_SIZE)];
} __aligned(QAT_OPTIMAL_ALIGN);
-/* should be aligned to 64bytes */
struct qat_session {
struct qat_crypto_desc *qs_dec_desc; /* should be at top of struct*/
/* decrypt or auth then decrypt or auth */
More information about the dev-commits-src-all
mailing list