Skip to content

Commit 9ad644a

Browse files
committed
crypto: qat - extend buffer list logic interface
jira LE-1907 Rebuild_History Non-Buildable kernel-rt-5.14.0-284.30.1.rt14.315.el9_2 commit-author Lucas Segarra Fernandez <[email protected]> commit c1e9880 Extend qat_bl_sgl_to_bufl() to allow skipping the mapping of a region of the source and the destination scatter lists starting from byte zero. This is to support the ZLIB format (RFC 1950) in the qat driver. The ZLIB format is made of deflate compressed data surrounded by a header and a footer. The QAT accelerators support only the deflate algorithm, therefore the header should not be mapped since it is inserted in software. Signed-off-by: Lucas Segarra Fernandez <[email protected]> Reviewed-by: Giovanni Cabiddu <[email protected]> Signed-off-by: Herbert Xu <[email protected]> (cherry picked from commit c1e9880) Signed-off-by: Jonathan Maple <[email protected]>
1 parent 076f2cf commit 9ad644a

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

drivers/crypto/qat/qat_common/qat_bl.c

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
5353
struct qat_request_buffs *buf,
5454
dma_addr_t extra_dst_buff,
5555
size_t sz_extra_dst_buff,
56+
unsigned int sskip,
57+
unsigned int dskip,
5658
gfp_t flags)
5759
{
5860
struct device *dev = &GET_DEV(accel_dev);
@@ -65,6 +67,7 @@ static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
6567
struct scatterlist *sg;
6668
size_t sz_out, sz = struct_size(bufl, buffers, n);
6769
int node = dev_to_node(&GET_DEV(accel_dev));
70+
unsigned int left;
6871
int bufl_dma_dir;
6972

7073
if (unlikely(!n))
@@ -88,19 +91,29 @@ static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
8891
for (i = 0; i < n; i++)
8992
bufl->buffers[i].addr = DMA_MAPPING_ERROR;
9093

94+
left = sskip;
95+
9196
for_each_sg(sgl, sg, n, i) {
9297
int y = sg_nctr;
9398

9499
if (!sg->length)
95100
continue;
96101

97-
bufl->buffers[y].addr = dma_map_single(dev, sg_virt(sg),
98-
sg->length,
102+
if (left >= sg->length) {
103+
left -= sg->length;
104+
continue;
105+
}
106+
bufl->buffers[y].addr = dma_map_single(dev, sg_virt(sg) + left,
107+
sg->length - left,
99108
bufl_dma_dir);
100109
bufl->buffers[y].len = sg->length;
101110
if (unlikely(dma_mapping_error(dev, bufl->buffers[y].addr)))
102111
goto err_in;
103112
sg_nctr++;
113+
if (left) {
114+
bufl->buffers[y].len -= left;
115+
left = 0;
116+
}
104117
}
105118
bufl->num_bufs = sg_nctr;
106119
blp = dma_map_single(dev, bufl, sz, DMA_TO_DEVICE);
@@ -117,6 +130,8 @@ static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
117130

118131
n = n_sglout + extra_buff;
119132
sz_out = struct_size(buflout, buffers, n);
133+
left = dskip;
134+
120135
sg_nctr = 0;
121136

122137
if (n > QAT_MAX_BUFF_DESC) {
@@ -139,13 +154,21 @@ static int __qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
139154
if (!sg->length)
140155
continue;
141156

142-
buffers[y].addr = dma_map_single(dev, sg_virt(sg),
143-
sg->length,
157+
if (left >= sg->length) {
158+
left -= sg->length;
159+
continue;
160+
}
161+
buffers[y].addr = dma_map_single(dev, sg_virt(sg) + left,
162+
sg->length - left,
144163
DMA_FROM_DEVICE);
145164
if (unlikely(dma_mapping_error(dev, buffers[y].addr)))
146165
goto err_out;
147166
buffers[y].len = sg->length;
148167
sg_nctr++;
168+
if (left) {
169+
buffers[y].len -= left;
170+
left = 0;
171+
}
149172
}
150173
if (extra_buff) {
151174
buffers[sg_nctr].addr = extra_dst_buff;
@@ -212,15 +235,19 @@ int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
212235
{
213236
dma_addr_t extra_dst_buff = 0;
214237
size_t sz_extra_dst_buff = 0;
238+
unsigned int sskip = 0;
239+
unsigned int dskip = 0;
215240

216241
if (params) {
217242
extra_dst_buff = params->extra_dst_buff;
218243
sz_extra_dst_buff = params->sz_extra_dst_buff;
244+
sskip = params->sskip;
245+
dskip = params->dskip;
219246
}
220247

221248
return __qat_bl_sgl_to_bufl(accel_dev, sgl, sglout, buf,
222249
extra_dst_buff, sz_extra_dst_buff,
223-
flags);
250+
sskip, dskip, flags);
224251
}
225252

226253
static void qat_bl_sgl_unmap(struct adf_accel_dev *accel_dev,

drivers/crypto/qat/qat_common/qat_bl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ struct qat_request_buffs {
4242
struct qat_sgl_to_bufl_params {
4343
dma_addr_t extra_dst_buff;
4444
size_t sz_extra_dst_buff;
45+
unsigned int sskip;
46+
unsigned int dskip;
4547
};
4648

4749
void qat_bl_free_bufl(struct adf_accel_dev *accel_dev,

drivers/crypto/qat/qat_common/qat_comp_algs.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ static int qat_comp_alg_compress_decompress(struct acomp_req *areq,
233233
size_t ovf_buff_sz;
234234
int ret;
235235

236+
params.sskip = 0;
237+
params.dskip = 0;
238+
236239
if (!areq->src || !slen)
237240
return -EINVAL;
238241

0 commit comments

Comments
 (0)