mirror of
https://github.com/torvalds/linux.git
synced 2026-04-19 15:24:02 -04:00
The acomp API allows to send requests with a NULL destination buffer. In this case, the algorithm implementation needs to allocate the destination scatter list, perform the operation and return the buffer to the user. For decompression, data is likely to expand and be bigger than the allocated buffer. This implements a re-submission mechanism for decompression requests that is triggered if the destination buffer, allocated by the driver, is not sufficiently big to store the output from decompression. If an overflow is detected when processing the callback for a decompression request with a NULL destination buffer, a workqueue is scheduled. This allocates a new scatter list of size CRYPTO_ACOMP_DST_MAX, now 128KB, creates a new firmware scatter list and resubmits the job to the hardware accelerator. Suggested-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
124 lines
3.2 KiB
C
124 lines
3.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/* Copyright(c) 2022 Intel Corporation */
|
|
#ifndef _QAT_COMP_REQ_H_
|
|
#define _QAT_COMP_REQ_H_
|
|
|
|
#include "icp_qat_fw_comp.h"
|
|
|
|
#define QAT_COMP_REQ_SIZE (sizeof(struct icp_qat_fw_comp_req))
|
|
#define QAT_COMP_CTX_SIZE (QAT_COMP_REQ_SIZE * 2)
|
|
|
|
static inline void qat_comp_create_req(void *ctx, void *req, u64 src, u32 slen,
|
|
u64 dst, u32 dlen, u64 opaque)
|
|
{
|
|
struct icp_qat_fw_comp_req *fw_tmpl = ctx;
|
|
struct icp_qat_fw_comp_req *fw_req = req;
|
|
struct icp_qat_fw_comp_req_params *req_pars = &fw_req->comp_pars;
|
|
|
|
memcpy(fw_req, fw_tmpl, sizeof(*fw_req));
|
|
fw_req->comn_mid.src_data_addr = src;
|
|
fw_req->comn_mid.src_length = slen;
|
|
fw_req->comn_mid.dest_data_addr = dst;
|
|
fw_req->comn_mid.dst_length = dlen;
|
|
fw_req->comn_mid.opaque_data = opaque;
|
|
req_pars->comp_len = slen;
|
|
req_pars->out_buffer_sz = dlen;
|
|
}
|
|
|
|
static inline void qat_comp_override_dst(void *req, u64 dst, u32 dlen)
|
|
{
|
|
struct icp_qat_fw_comp_req *fw_req = req;
|
|
struct icp_qat_fw_comp_req_params *req_pars = &fw_req->comp_pars;
|
|
|
|
fw_req->comn_mid.dest_data_addr = dst;
|
|
fw_req->comn_mid.dst_length = dlen;
|
|
req_pars->out_buffer_sz = dlen;
|
|
}
|
|
|
|
static inline void qat_comp_create_compression_req(void *ctx, void *req,
|
|
u64 src, u32 slen,
|
|
u64 dst, u32 dlen,
|
|
u64 opaque)
|
|
{
|
|
qat_comp_create_req(ctx, req, src, slen, dst, dlen, opaque);
|
|
}
|
|
|
|
static inline void qat_comp_create_decompression_req(void *ctx, void *req,
|
|
u64 src, u32 slen,
|
|
u64 dst, u32 dlen,
|
|
u64 opaque)
|
|
{
|
|
struct icp_qat_fw_comp_req *fw_tmpl = ctx;
|
|
|
|
fw_tmpl++;
|
|
qat_comp_create_req(fw_tmpl, req, src, slen, dst, dlen, opaque);
|
|
}
|
|
|
|
static inline u32 qat_comp_get_consumed_ctr(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
|
|
return qat_resp->comp_resp_pars.input_byte_counter;
|
|
}
|
|
|
|
static inline u32 qat_comp_get_produced_ctr(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
|
|
return qat_resp->comp_resp_pars.output_byte_counter;
|
|
}
|
|
|
|
static inline u32 qat_comp_get_produced_adler32(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
|
|
return qat_resp->comp_resp_pars.crc.legacy.curr_adler_32;
|
|
}
|
|
|
|
static inline u64 qat_comp_get_opaque(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
|
|
return qat_resp->opaque_data;
|
|
}
|
|
|
|
static inline s8 qat_comp_get_cmp_err(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
|
|
return qat_resp->comn_resp.comn_error.cmp_err_code;
|
|
}
|
|
|
|
static inline s8 qat_comp_get_xlt_err(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
|
|
return qat_resp->comn_resp.comn_error.xlat_err_code;
|
|
}
|
|
|
|
static inline s8 qat_comp_get_cmp_status(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
u8 stat_filed = qat_resp->comn_resp.comn_status;
|
|
|
|
return ICP_QAT_FW_COMN_RESP_CMP_STAT_GET(stat_filed);
|
|
}
|
|
|
|
static inline s8 qat_comp_get_xlt_status(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
u8 stat_filed = qat_resp->comn_resp.comn_status;
|
|
|
|
return ICP_QAT_FW_COMN_RESP_XLAT_STAT_GET(stat_filed);
|
|
}
|
|
|
|
static inline u8 qat_comp_get_cmp_cnv_flag(void *resp)
|
|
{
|
|
struct icp_qat_fw_comp_resp *qat_resp = resp;
|
|
u8 flags = qat_resp->comn_resp.hdr_flags;
|
|
|
|
return ICP_QAT_FW_COMN_HDR_CNV_FLAG_GET(flags);
|
|
}
|
|
|
|
#endif
|