1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2014 - 2022 Intel Corporation */
3 #include <linux/device.h>
4 #include <linux/dma-mapping.h>
5 #include <linux/pci.h>
6 #include <linux/scatterlist.h>
7 #include <linux/slab.h>
8 #include <linux/types.h>
9 #include "adf_accel_devices.h"
10 #include "qat_bl.h"
11 #include "qat_crypto.h"
12
qat_bl_free_bufl(struct adf_accel_dev * accel_dev,struct qat_request_buffs * buf)13 void qat_bl_free_bufl(struct adf_accel_dev *accel_dev,
14 struct qat_request_buffs *buf)
15 {
16 struct device *dev = &GET_DEV(accel_dev);
17 struct qat_alg_buf_list *bl = buf->bl;
18 struct qat_alg_buf_list *blout = buf->blout;
19 dma_addr_t blp = buf->blp;
20 dma_addr_t blpout = buf->bloutp;
21 size_t sz = buf->sz;
22 size_t sz_out = buf->sz_out;
23 int bl_dma_dir;
24 int i;
25
26 bl_dma_dir = blp != blpout ? DMA_TO_DEVICE : DMA_BIDIRECTIONAL;
27
28 for (i = 0; i < bl->num_bufs; i++)
29 dma_unmap_single(dev, bl->buffers[i].addr,
30 bl->buffers[i].len, bl_dma_dir);
31
32 dma_unmap_single(dev, blp, sz, DMA_TO_DEVICE);
33
34 if (!buf->sgl_src_valid)
35 kfree(bl);
36
37 if (blp != blpout) {
38 for (i = 0; i < blout->num_mapped_bufs; i++) {
39 dma_unmap_single(dev, blout->buffers[i].addr,
40 blout->buffers[i].len,
41 DMA_FROM_DEVICE);
42 }
43 dma_unmap_single(dev, blpout, sz_out, DMA_TO_DEVICE);
44
45 if (!buf->sgl_dst_valid)
46 kfree(blout);
47 }
48 }
49
__qat_bl_sgl_to_bufl(struct adf_accel_dev * accel_dev,struct scatterlist * sgl,struct scatterlist * sglout,struct qat_request_buffs * buf,dma_addr_t extra_dst_buff,size_t sz_extra_dst_buff,unsigned int sskip,unsigned int dskip,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 unsigned int sskip,
57 unsigned int dskip,
58 gfp_t flags)
59 {
60 struct device *dev = &GET_DEV(accel_dev);
61 int i, sg_nctr = 0;
62 int n = sg_nents(sgl);
63 struct qat_alg_buf_list *bufl;
64 struct qat_alg_buf_list *buflout = NULL;
65 dma_addr_t blp = DMA_MAPPING_ERROR;
66 dma_addr_t bloutp = DMA_MAPPING_ERROR;
67 struct scatterlist *sg;
68 size_t sz_out, sz = struct_size(bufl, buffers, n);
69 int node = dev_to_node(&GET_DEV(accel_dev));
70 unsigned int left;
71 int bufl_dma_dir;
72
73 if (unlikely(!n))
74 return -EINVAL;
75
76 buf->sgl_src_valid = false;
77 buf->sgl_dst_valid = false;
78
79 if (n > QAT_MAX_BUFF_DESC) {
80 bufl = kzalloc_node(sz, flags, node);
81 if (unlikely(!bufl))
82 return -ENOMEM;
83 } else {
84 bufl = &buf->sgl_src.sgl_hdr;
85 memset(bufl, 0, sizeof(struct qat_alg_buf_list));
86 buf->sgl_src_valid = true;
87 }
88
89 bufl_dma_dir = sgl != sglout ? DMA_TO_DEVICE : DMA_BIDIRECTIONAL;
90
91 for (i = 0; i < n; i++)
92 bufl->buffers[i].addr = DMA_MAPPING_ERROR;
93
94 left = sskip;
95
96 for_each_sg(sgl, sg, n, i) {
97 int y = sg_nctr;
98
99 if (!sg->length)
100 continue;
101
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,
108 bufl_dma_dir);
109 bufl->buffers[y].len = sg->length;
110 if (unlikely(dma_mapping_error(dev, bufl->buffers[y].addr)))
111 goto err_in;
112 sg_nctr++;
113 if (left) {
114 bufl->buffers[y].len -= left;
115 left = 0;
116 }
117 }
118 bufl->num_bufs = sg_nctr;
119 blp = dma_map_single(dev, bufl, sz, DMA_TO_DEVICE);
120 if (unlikely(dma_mapping_error(dev, blp)))
121 goto err_in;
122 buf->bl = bufl;
123 buf->blp = blp;
124 buf->sz = sz;
125 /* Handle out of place operation */
126 if (sgl != sglout) {
127 struct qat_alg_buf *buffers;
128 int extra_buff = extra_dst_buff ? 1 : 0;
129 int n_sglout = sg_nents(sglout);
130
131 n = n_sglout + extra_buff;
132 sz_out = struct_size(buflout, buffers, n);
133 left = dskip;
134
135 sg_nctr = 0;
136
137 if (n > QAT_MAX_BUFF_DESC) {
138 buflout = kzalloc_node(sz_out, flags, node);
139 if (unlikely(!buflout))
140 goto err_in;
141 } else {
142 buflout = &buf->sgl_dst.sgl_hdr;
143 memset(buflout, 0, sizeof(struct qat_alg_buf_list));
144 buf->sgl_dst_valid = true;
145 }
146
147 buffers = buflout->buffers;
148 for (i = 0; i < n; i++)
149 buffers[i].addr = DMA_MAPPING_ERROR;
150
151 for_each_sg(sglout, sg, n_sglout, i) {
152 int y = sg_nctr;
153
154 if (!sg->length)
155 continue;
156
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,
163 DMA_FROM_DEVICE);
164 if (unlikely(dma_mapping_error(dev, buffers[y].addr)))
165 goto err_out;
166 buffers[y].len = sg->length;
167 sg_nctr++;
168 if (left) {
169 buffers[y].len -= left;
170 left = 0;
171 }
172 }
173 if (extra_buff) {
174 buffers[sg_nctr].addr = extra_dst_buff;
175 buffers[sg_nctr].len = sz_extra_dst_buff;
176 }
177
178 buflout->num_bufs = sg_nctr;
179 buflout->num_bufs += extra_buff;
180 buflout->num_mapped_bufs = sg_nctr;
181 bloutp = dma_map_single(dev, buflout, sz_out, DMA_TO_DEVICE);
182 if (unlikely(dma_mapping_error(dev, bloutp)))
183 goto err_out;
184 buf->blout = buflout;
185 buf->bloutp = bloutp;
186 buf->sz_out = sz_out;
187 } else {
188 /* Otherwise set the src and dst to the same address */
189 buf->bloutp = buf->blp;
190 buf->sz_out = 0;
191 }
192 return 0;
193
194 err_out:
195 if (!dma_mapping_error(dev, bloutp))
196 dma_unmap_single(dev, bloutp, sz_out, DMA_TO_DEVICE);
197
198 n = sg_nents(sglout);
199 for (i = 0; i < n; i++) {
200 if (buflout->buffers[i].addr == extra_dst_buff)
201 break;
202 if (!dma_mapping_error(dev, buflout->buffers[i].addr))
203 dma_unmap_single(dev, buflout->buffers[i].addr,
204 buflout->buffers[i].len,
205 DMA_FROM_DEVICE);
206 }
207
208 if (!buf->sgl_dst_valid)
209 kfree(buflout);
210
211 err_in:
212 if (!dma_mapping_error(dev, blp))
213 dma_unmap_single(dev, blp, sz, DMA_TO_DEVICE);
214
215 n = sg_nents(sgl);
216 for (i = 0; i < n; i++)
217 if (!dma_mapping_error(dev, bufl->buffers[i].addr))
218 dma_unmap_single(dev, bufl->buffers[i].addr,
219 bufl->buffers[i].len,
220 bufl_dma_dir);
221
222 if (!buf->sgl_src_valid)
223 kfree(bufl);
224
225 dev_err(dev, "Failed to map buf for dma\n");
226 return -ENOMEM;
227 }
228
qat_bl_sgl_to_bufl(struct adf_accel_dev * accel_dev,struct scatterlist * sgl,struct scatterlist * sglout,struct qat_request_buffs * buf,struct qat_sgl_to_bufl_params * params,gfp_t flags)229 int qat_bl_sgl_to_bufl(struct adf_accel_dev *accel_dev,
230 struct scatterlist *sgl,
231 struct scatterlist *sglout,
232 struct qat_request_buffs *buf,
233 struct qat_sgl_to_bufl_params *params,
234 gfp_t flags)
235 {
236 dma_addr_t extra_dst_buff = 0;
237 size_t sz_extra_dst_buff = 0;
238 unsigned int sskip = 0;
239 unsigned int dskip = 0;
240
241 if (params) {
242 extra_dst_buff = params->extra_dst_buff;
243 sz_extra_dst_buff = params->sz_extra_dst_buff;
244 sskip = params->sskip;
245 dskip = params->dskip;
246 }
247
248 return __qat_bl_sgl_to_bufl(accel_dev, sgl, sglout, buf,
249 extra_dst_buff, sz_extra_dst_buff,
250 sskip, dskip, flags);
251 }
252
qat_bl_sgl_unmap(struct adf_accel_dev * accel_dev,struct qat_alg_buf_list * bl)253 static void qat_bl_sgl_unmap(struct adf_accel_dev *accel_dev,
254 struct qat_alg_buf_list *bl)
255 {
256 struct device *dev = &GET_DEV(accel_dev);
257 int n = bl->num_bufs;
258 int i;
259
260 for (i = 0; i < n; i++)
261 if (!dma_mapping_error(dev, bl->buffers[i].addr))
262 dma_unmap_single(dev, bl->buffers[i].addr,
263 bl->buffers[i].len, DMA_FROM_DEVICE);
264 }
265
qat_bl_sgl_map(struct adf_accel_dev * accel_dev,struct scatterlist * sgl,struct qat_alg_buf_list ** bl)266 static int qat_bl_sgl_map(struct adf_accel_dev *accel_dev,
267 struct scatterlist *sgl,
268 struct qat_alg_buf_list **bl)
269 {
270 struct device *dev = &GET_DEV(accel_dev);
271 struct qat_alg_buf_list *bufl;
272 int node = dev_to_node(dev);
273 struct scatterlist *sg;
274 int n, i, sg_nctr;
275 size_t sz;
276
277 n = sg_nents(sgl);
278 sz = struct_size(bufl, buffers, n);
279 bufl = kzalloc_node(sz, GFP_KERNEL, node);
280 if (unlikely(!bufl))
281 return -ENOMEM;
282
283 for (i = 0; i < n; i++)
284 bufl->buffers[i].addr = DMA_MAPPING_ERROR;
285
286 sg_nctr = 0;
287 for_each_sg(sgl, sg, n, i) {
288 int y = sg_nctr;
289
290 if (!sg->length)
291 continue;
292
293 bufl->buffers[y].addr = dma_map_single(dev, sg_virt(sg),
294 sg->length,
295 DMA_FROM_DEVICE);
296 bufl->buffers[y].len = sg->length;
297 if (unlikely(dma_mapping_error(dev, bufl->buffers[y].addr)))
298 goto err_map;
299 sg_nctr++;
300 }
301 bufl->num_bufs = sg_nctr;
302 bufl->num_mapped_bufs = sg_nctr;
303
304 *bl = bufl;
305
306 return 0;
307
308 err_map:
309 for (i = 0; i < n; i++)
310 if (!dma_mapping_error(dev, bufl->buffers[i].addr))
311 dma_unmap_single(dev, bufl->buffers[i].addr,
312 bufl->buffers[i].len,
313 DMA_FROM_DEVICE);
314 kfree(bufl);
315 *bl = NULL;
316
317 return -ENOMEM;
318 }
319
qat_bl_sgl_free_unmap(struct adf_accel_dev * accel_dev,struct scatterlist * sgl,struct qat_alg_buf_list * bl,bool free_bl)320 static void qat_bl_sgl_free_unmap(struct adf_accel_dev *accel_dev,
321 struct scatterlist *sgl,
322 struct qat_alg_buf_list *bl,
323 bool free_bl)
324 {
325 if (bl) {
326 qat_bl_sgl_unmap(accel_dev, bl);
327
328 if (free_bl)
329 kfree(bl);
330 }
331 if (sgl)
332 sgl_free(sgl);
333 }
334
qat_bl_sgl_alloc_map(struct adf_accel_dev * accel_dev,struct scatterlist ** sgl,struct qat_alg_buf_list ** bl,unsigned int dlen,gfp_t gfp)335 static int qat_bl_sgl_alloc_map(struct adf_accel_dev *accel_dev,
336 struct scatterlist **sgl,
337 struct qat_alg_buf_list **bl,
338 unsigned int dlen,
339 gfp_t gfp)
340 {
341 struct scatterlist *dst;
342 int ret;
343
344 dst = sgl_alloc(dlen, gfp, NULL);
345 if (!dst) {
346 dev_err(&GET_DEV(accel_dev), "sg_alloc failed\n");
347 return -ENOMEM;
348 }
349
350 ret = qat_bl_sgl_map(accel_dev, dst, bl);
351 if (ret)
352 goto err;
353
354 *sgl = dst;
355
356 return 0;
357
358 err:
359 sgl_free(dst);
360 *sgl = NULL;
361 return ret;
362 }
363
qat_bl_realloc_map_new_dst(struct adf_accel_dev * accel_dev,struct scatterlist ** sg,unsigned int dlen,struct qat_request_buffs * qat_bufs,gfp_t gfp)364 int qat_bl_realloc_map_new_dst(struct adf_accel_dev *accel_dev,
365 struct scatterlist **sg,
366 unsigned int dlen,
367 struct qat_request_buffs *qat_bufs,
368 gfp_t gfp)
369 {
370 struct device *dev = &GET_DEV(accel_dev);
371 dma_addr_t new_blp = DMA_MAPPING_ERROR;
372 struct qat_alg_buf_list *new_bl;
373 struct scatterlist *new_sg;
374 size_t new_bl_size;
375 int ret;
376
377 ret = qat_bl_sgl_alloc_map(accel_dev, &new_sg, &new_bl, dlen, gfp);
378 if (ret)
379 return ret;
380
381 new_bl_size = struct_size(new_bl, buffers, new_bl->num_bufs);
382
383 /* Map new firmware SGL descriptor */
384 new_blp = dma_map_single(dev, new_bl, new_bl_size, DMA_TO_DEVICE);
385 if (unlikely(dma_mapping_error(dev, new_blp)))
386 goto err;
387
388 /* Unmap old firmware SGL descriptor */
389 dma_unmap_single(dev, qat_bufs->bloutp, qat_bufs->sz_out, DMA_TO_DEVICE);
390
391 /* Free and unmap old scatterlist */
392 qat_bl_sgl_free_unmap(accel_dev, *sg, qat_bufs->blout,
393 !qat_bufs->sgl_dst_valid);
394
395 qat_bufs->sgl_dst_valid = false;
396 qat_bufs->blout = new_bl;
397 qat_bufs->bloutp = new_blp;
398 qat_bufs->sz_out = new_bl_size;
399
400 *sg = new_sg;
401
402 return 0;
403 err:
404 qat_bl_sgl_free_unmap(accel_dev, new_sg, new_bl, true);
405
406 if (!dma_mapping_error(dev, new_blp))
407 dma_unmap_single(dev, new_blp, new_bl_size, DMA_TO_DEVICE);
408
409 return -ENOMEM;
410 }
411