• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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