Skip to content

Commit 843ea0b

Browse files
committed
crypto: qat - extend buffer list interface
jira LE-1907 Rebuild_History Non-Buildable kernel-rt-5.14.0-284.30.1.rt14.315.el9_2 commit-author Giovanni Cabiddu <[email protected]> commit cf69290 The compression service requires an additional pre-allocated buffer for each destination scatter list. Extend the function qat_alg_sgl_to_bufl() to take an additional structure that contains the dma address and the size of the extra buffer which will be appended in the destination FW SGL. The logic that unmaps buffers in qat_alg_free_bufl() has been changed to start unmapping from buffer 0 instead of skipping the initial buffers num_buff - num_mapped_bufs as that functionality was not used in the code. Signed-off-by: Giovanni Cabiddu <[email protected]> Reviewed-by: Wojciech Ziemba <[email protected]> Reviewed-by: Adam Guerin <[email protected]> Signed-off-by: Herbert Xu <[email protected]> (cherry picked from commit cf69290) Signed-off-by: Jonathan Maple <[email protected]>
1 parent c563eae commit 843ea0b

File tree

3 files changed

+54
-18
lines changed

3 files changed

+54
-18
lines changed

drivers/crypto/qat/qat_common/qat_algs.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ static int qat_alg_aead_dec(struct aead_request *areq)
800800
return -EINVAL;
801801

802802
ret = qat_bl_sgl_to_bufl(ctx->inst->accel_dev, areq->src, areq->dst,
803-
&qat_req->buf, f);
803+
&qat_req->buf, NULL, f);
804804
if (unlikely(ret))
805805
return ret;
806806

@@ -844,7 +844,7 @@ static int qat_alg_aead_enc(struct aead_request *areq)
844844
return -EINVAL;
845845

846846
ret = qat_bl_sgl_to_bufl(ctx->inst->accel_dev, areq->src, areq->dst,
847-
&qat_req->buf, f);
847+
&qat_req->buf, NULL, f);
848848
if (unlikely(ret))
849849
return ret;
850850

@@ -1030,7 +1030,7 @@ static int qat_alg_skcipher_encrypt(struct skcipher_request *req)
10301030
return 0;
10311031

10321032
ret = qat_bl_sgl_to_bufl(ctx->inst->accel_dev, req->src, req->dst,
1033-
&qat_req->buf, f);
1033+
&qat_req->buf, NULL, f);
10341034
if (unlikely(ret))
10351035
return ret;
10361036

@@ -1097,7 +1097,7 @@ static int qat_alg_skcipher_decrypt(struct skcipher_request *req)
10971097
return 0;
10981098

10991099
ret = qat_bl_sgl_to_bufl(ctx->inst->accel_dev, req->src, req->dst,
1100-
&qat_req->buf, f);
1100+
&qat_req->buf, NULL, f);
11011101
if (unlikely(ret))
11021102
return ret;
11031103

drivers/crypto/qat/qat_common/qat_bl.c

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ void qat_bl_free_bufl(struct adf_accel_dev *accel_dev,
3535
kfree(bl);
3636

3737
if (blp != blpout) {
38-
/* If out of place operation dma unmap only data */
39-
int bufless = blout->num_bufs - blout->num_mapped_bufs;
40-
41-
for (i = bufless; i < blout->num_bufs; i++) {
38+
for (i = 0; i < blout->num_mapped_bufs; i++) {
4239
dma_unmap_single(dev, blout->bufers[i].addr,
4340
blout->bufers[i].len,
4441
DMA_FROM_DEVICE);
@@ -50,11 +47,13 @@ void qat_bl_free_bufl(struct adf_accel_dev *accel_dev,
5047
}
5148
}
5249

53-
int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
54-
struct scatterlist *sgl,
55-
struct scatterlist *sglout,
56-
struct qat_request_buffs *buf,
57-
gfp_t flags)
50+
static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
51+
struct scatterlist *sgl,
52+
struct scatterlist *sglout,
53+
struct qat_request_buffs *buf,
54+
dma_addr_t extra_dst_buff,
55+
size_t sz_extra_dst_buff,
56+
gfp_t flags)
5857
{
5958
struct device *dev = &GET_DEV(accel_dev);
6059
int i, sg_nctr = 0;
@@ -86,7 +85,7 @@ int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
8685

8786
bufl_dma_dir = sgl != sglout ? DMA_TO_DEVICE : DMA_BIDIRECTIONAL;
8887

89-
for_each_sg(sgl, sg, n, i)
88+
for (i = 0; i < n; i++)
9089
bufl->bufers[i].addr = DMA_MAPPING_ERROR;
9190

9291
for_each_sg(sgl, sg, n, i) {
@@ -113,8 +112,10 @@ int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
113112
/* Handle out of place operation */
114113
if (sgl != sglout) {
115114
struct qat_alg_buf *bufers;
115+
int extra_buff = extra_dst_buff ? 1 : 0;
116+
int n_sglout = sg_nents(sglout);
116117

117-
n = sg_nents(sglout);
118+
n = n_sglout + extra_buff;
118119
sz_out = struct_size(buflout, bufers, n);
119120
sg_nctr = 0;
120121

@@ -129,10 +130,10 @@ int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
129130
}
130131

131132
bufers = buflout->bufers;
132-
for_each_sg(sglout, sg, n, i)
133+
for (i = 0; i < n; i++)
133134
bufers[i].addr = DMA_MAPPING_ERROR;
134135

135-
for_each_sg(sglout, sg, n, i) {
136+
for_each_sg(sglout, sg, n_sglout, i) {
136137
int y = sg_nctr;
137138

138139
if (!sg->length)
@@ -146,7 +147,13 @@ int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
146147
bufers[y].len = sg->length;
147148
sg_nctr++;
148149
}
150+
if (extra_buff) {
151+
bufers[sg_nctr].addr = extra_dst_buff;
152+
bufers[sg_nctr].len = sz_extra_dst_buff;
153+
}
154+
149155
buflout->num_bufs = sg_nctr;
156+
buflout->num_bufs += extra_buff;
150157
buflout->num_mapped_bufs = sg_nctr;
151158
bloutp = dma_map_single(dev, buflout, sz_out, DMA_TO_DEVICE);
152159
if (unlikely(dma_mapping_error(dev, bloutp)))
@@ -166,11 +173,14 @@ int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
166173
dma_unmap_single(dev, bloutp, sz_out, DMA_TO_DEVICE);
167174

168175
n = sg_nents(sglout);
169-
for (i = 0; i < n; i++)
176+
for (i = 0; i < n; i++) {
177+
if (buflout->bufers[i].addr == extra_dst_buff)
178+
break;
170179
if (!dma_mapping_error(dev, buflout->bufers[i].addr))
171180
dma_unmap_single(dev, buflout->bufers[i].addr,
172181
buflout->bufers[i].len,
173182
DMA_FROM_DEVICE);
183+
}
174184

175185
if (!buf->sgl_dst_valid)
176186
kfree(buflout);
@@ -192,3 +202,23 @@ int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
192202
dev_err(dev, "Failed to map buf for dma\n");
193203
return -ENOMEM;
194204
}
205+
206+
int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
207+
struct scatterlist *sgl,
208+
struct scatterlist *sglout,
209+
struct qat_request_buffs *buf,
210+
struct qat_sgl_to_bufl_params *params,
211+
gfp_t flags)
212+
{
213+
dma_addr_t extra_dst_buff = 0;
214+
size_t sz_extra_dst_buff = 0;
215+
216+
if (params) {
217+
extra_dst_buff = params->extra_dst_buff;
218+
sz_extra_dst_buff = params->sz_extra_dst_buff;
219+
}
220+
221+
return __qat_bl_sgl_to_bufl(accel_dev, sgl, sglout, buf,
222+
extra_dst_buff, sz_extra_dst_buff,
223+
flags);
224+
}

drivers/crypto/qat/qat_common/qat_bl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,18 @@ struct qat_request_buffs {
3838
struct qat_alg_fixed_buf_list sgl_dst;
3939
};
4040

41+
struct qat_sgl_to_bufl_params {
42+
dma_addr_t extra_dst_buff;
43+
size_t sz_extra_dst_buff;
44+
};
45+
4146
void qat_bl_free_bufl(struct adf_accel_dev *accel_dev,
4247
struct qat_request_buffs *buf);
4348
int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
4449
struct scatterlist *sgl,
4550
struct scatterlist *sglout,
4651
struct qat_request_buffs *buf,
52+
struct qat_sgl_to_bufl_params *params,
4753
gfp_t flags);
4854

4955
#endif

0 commit comments

Comments
 (0)