This source file includes following definitions.
- cc_dma_buf_type
- cc_copy_mac
- cc_get_sgl_nents
- cc_copy_sg_portion
- cc_render_buff_to_mlli
- cc_render_sg_to_mlli
- cc_generate_mlli
- cc_add_buffer_entry
- cc_add_sg_entry
- cc_map_sg
- cc_set_aead_conf_buf
- cc_set_hash_buf
- cc_unmap_cipher_request
- cc_map_cipher_request
- cc_unmap_aead_request
- cc_is_icv_frag
- cc_aead_chain_iv
- cc_aead_chain_assoc
- cc_prepare_aead_data_dlli
- cc_prepare_aead_data_mlli
- cc_aead_chain_data
- cc_update_aead_mlli_nents
- cc_map_aead_request
- cc_map_hash_request_final
- cc_map_hash_request_update
- cc_unmap_hash_request
- cc_buffer_mgr_init
- cc_buffer_mgr_fini
1
2
3
4 #include <crypto/internal/aead.h>
5 #include <crypto/authenc.h>
6 #include <crypto/scatterwalk.h>
7 #include <linux/dmapool.h>
8 #include <linux/dma-mapping.h>
9
10 #include "cc_buffer_mgr.h"
11 #include "cc_lli_defs.h"
12 #include "cc_cipher.h"
13 #include "cc_hash.h"
14 #include "cc_aead.h"
15
16 enum dma_buffer_type {
17 DMA_NULL_TYPE = -1,
18 DMA_SGL_TYPE = 1,
19 DMA_BUFF_TYPE = 2,
20 };
21
22 struct buff_mgr_handle {
23 struct dma_pool *mlli_buffs_pool;
24 };
25
26 union buffer_array_entry {
27 struct scatterlist *sgl;
28 dma_addr_t buffer_dma;
29 };
30
31 struct buffer_array {
32 unsigned int num_of_buffers;
33 union buffer_array_entry entry[MAX_NUM_OF_BUFFERS_IN_MLLI];
34 unsigned int offset[MAX_NUM_OF_BUFFERS_IN_MLLI];
35 int nents[MAX_NUM_OF_BUFFERS_IN_MLLI];
36 int total_data_len[MAX_NUM_OF_BUFFERS_IN_MLLI];
37 enum dma_buffer_type type[MAX_NUM_OF_BUFFERS_IN_MLLI];
38 bool is_last[MAX_NUM_OF_BUFFERS_IN_MLLI];
39 u32 *mlli_nents[MAX_NUM_OF_BUFFERS_IN_MLLI];
40 };
41
42 static inline char *cc_dma_buf_type(enum cc_req_dma_buf_type type)
43 {
44 switch (type) {
45 case CC_DMA_BUF_NULL:
46 return "BUF_NULL";
47 case CC_DMA_BUF_DLLI:
48 return "BUF_DLLI";
49 case CC_DMA_BUF_MLLI:
50 return "BUF_MLLI";
51 default:
52 return "BUF_INVALID";
53 }
54 }
55
56
57
58
59
60
61
62
63 static void cc_copy_mac(struct device *dev, struct aead_request *req,
64 enum cc_sg_cpy_direct dir)
65 {
66 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
67 struct crypto_aead *tfm = crypto_aead_reqtfm(req);
68 u32 skip = areq_ctx->assoclen + req->cryptlen;
69
70 if (areq_ctx->is_gcm4543)
71 skip += crypto_aead_ivsize(tfm);
72
73 cc_copy_sg_portion(dev, areq_ctx->backup_mac, req->src,
74 (skip - areq_ctx->req_authsize), skip, dir);
75 }
76
77
78
79
80
81
82
83
84 static unsigned int cc_get_sgl_nents(struct device *dev,
85 struct scatterlist *sg_list,
86 unsigned int nbytes, u32 *lbytes)
87 {
88 unsigned int nents = 0;
89
90 *lbytes = 0;
91
92 while (nbytes && sg_list) {
93 nents++;
94
95 *lbytes = nbytes;
96 nbytes -= (sg_list->length > nbytes) ?
97 nbytes : sg_list->length;
98 sg_list = sg_next(sg_list);
99 }
100
101 dev_dbg(dev, "nents %d last bytes %d\n", nents, *lbytes);
102 return nents;
103 }
104
105
106
107
108
109
110
111
112
113
114
115 void cc_copy_sg_portion(struct device *dev, u8 *dest, struct scatterlist *sg,
116 u32 to_skip, u32 end, enum cc_sg_cpy_direct direct)
117 {
118 u32 nents;
119
120 nents = sg_nents_for_len(sg, end);
121 sg_copy_buffer(sg, nents, (void *)dest, (end - to_skip + 1), to_skip,
122 (direct == CC_SG_TO_BUF));
123 }
124
125 static int cc_render_buff_to_mlli(struct device *dev, dma_addr_t buff_dma,
126 u32 buff_size, u32 *curr_nents,
127 u32 **mlli_entry_pp)
128 {
129 u32 *mlli_entry_p = *mlli_entry_pp;
130 u32 new_nents;
131
132
133 new_nents = (*curr_nents + buff_size / CC_MAX_MLLI_ENTRY_SIZE + 1);
134 if (new_nents > MAX_NUM_OF_TOTAL_MLLI_ENTRIES) {
135 dev_err(dev, "Too many mlli entries. current %d max %d\n",
136 new_nents, MAX_NUM_OF_TOTAL_MLLI_ENTRIES);
137 return -ENOMEM;
138 }
139
140
141 while (buff_size > CC_MAX_MLLI_ENTRY_SIZE) {
142 cc_lli_set_addr(mlli_entry_p, buff_dma);
143 cc_lli_set_size(mlli_entry_p, CC_MAX_MLLI_ENTRY_SIZE);
144 dev_dbg(dev, "entry[%d]: single_buff=0x%08X size=%08X\n",
145 *curr_nents, mlli_entry_p[LLI_WORD0_OFFSET],
146 mlli_entry_p[LLI_WORD1_OFFSET]);
147 buff_dma += CC_MAX_MLLI_ENTRY_SIZE;
148 buff_size -= CC_MAX_MLLI_ENTRY_SIZE;
149 mlli_entry_p = mlli_entry_p + 2;
150 (*curr_nents)++;
151 }
152
153 cc_lli_set_addr(mlli_entry_p, buff_dma);
154 cc_lli_set_size(mlli_entry_p, buff_size);
155 dev_dbg(dev, "entry[%d]: single_buff=0x%08X size=%08X\n",
156 *curr_nents, mlli_entry_p[LLI_WORD0_OFFSET],
157 mlli_entry_p[LLI_WORD1_OFFSET]);
158 mlli_entry_p = mlli_entry_p + 2;
159 *mlli_entry_pp = mlli_entry_p;
160 (*curr_nents)++;
161 return 0;
162 }
163
164 static int cc_render_sg_to_mlli(struct device *dev, struct scatterlist *sgl,
165 u32 sgl_data_len, u32 sgl_offset,
166 u32 *curr_nents, u32 **mlli_entry_pp)
167 {
168 struct scatterlist *curr_sgl = sgl;
169 u32 *mlli_entry_p = *mlli_entry_pp;
170 s32 rc = 0;
171
172 for ( ; (curr_sgl && sgl_data_len);
173 curr_sgl = sg_next(curr_sgl)) {
174 u32 entry_data_len =
175 (sgl_data_len > sg_dma_len(curr_sgl) - sgl_offset) ?
176 sg_dma_len(curr_sgl) - sgl_offset :
177 sgl_data_len;
178 sgl_data_len -= entry_data_len;
179 rc = cc_render_buff_to_mlli(dev, sg_dma_address(curr_sgl) +
180 sgl_offset, entry_data_len,
181 curr_nents, &mlli_entry_p);
182 if (rc)
183 return rc;
184
185 sgl_offset = 0;
186 }
187 *mlli_entry_pp = mlli_entry_p;
188 return 0;
189 }
190
191 static int cc_generate_mlli(struct device *dev, struct buffer_array *sg_data,
192 struct mlli_params *mlli_params, gfp_t flags)
193 {
194 u32 *mlli_p;
195 u32 total_nents = 0, prev_total_nents = 0;
196 int rc = 0, i;
197
198 dev_dbg(dev, "NUM of SG's = %d\n", sg_data->num_of_buffers);
199
200
201 mlli_params->mlli_virt_addr =
202 dma_pool_alloc(mlli_params->curr_pool, flags,
203 &mlli_params->mlli_dma_addr);
204 if (!mlli_params->mlli_virt_addr) {
205 dev_err(dev, "dma_pool_alloc() failed\n");
206 rc = -ENOMEM;
207 goto build_mlli_exit;
208 }
209
210 mlli_p = (u32 *)mlli_params->mlli_virt_addr;
211
212 for (i = 0; i < sg_data->num_of_buffers; i++) {
213 union buffer_array_entry *entry = &sg_data->entry[i];
214 u32 tot_len = sg_data->total_data_len[i];
215 u32 offset = sg_data->offset[i];
216
217 if (sg_data->type[i] == DMA_SGL_TYPE)
218 rc = cc_render_sg_to_mlli(dev, entry->sgl, tot_len,
219 offset, &total_nents,
220 &mlli_p);
221 else
222 rc = cc_render_buff_to_mlli(dev, entry->buffer_dma,
223 tot_len, &total_nents,
224 &mlli_p);
225 if (rc)
226 return rc;
227
228
229 if (sg_data->mlli_nents[i]) {
230
231
232
233 *sg_data->mlli_nents[i] +=
234 (total_nents - prev_total_nents);
235 prev_total_nents = total_nents;
236 }
237 }
238
239
240 mlli_params->mlli_len = (total_nents * LLI_ENTRY_BYTE_SIZE);
241
242 dev_dbg(dev, "MLLI params: virt_addr=%pK dma_addr=%pad mlli_len=0x%X\n",
243 mlli_params->mlli_virt_addr, &mlli_params->mlli_dma_addr,
244 mlli_params->mlli_len);
245
246 build_mlli_exit:
247 return rc;
248 }
249
250 static void cc_add_buffer_entry(struct device *dev,
251 struct buffer_array *sgl_data,
252 dma_addr_t buffer_dma, unsigned int buffer_len,
253 bool is_last_entry, u32 *mlli_nents)
254 {
255 unsigned int index = sgl_data->num_of_buffers;
256
257 dev_dbg(dev, "index=%u single_buff=%pad buffer_len=0x%08X is_last=%d\n",
258 index, &buffer_dma, buffer_len, is_last_entry);
259 sgl_data->nents[index] = 1;
260 sgl_data->entry[index].buffer_dma = buffer_dma;
261 sgl_data->offset[index] = 0;
262 sgl_data->total_data_len[index] = buffer_len;
263 sgl_data->type[index] = DMA_BUFF_TYPE;
264 sgl_data->is_last[index] = is_last_entry;
265 sgl_data->mlli_nents[index] = mlli_nents;
266 if (sgl_data->mlli_nents[index])
267 *sgl_data->mlli_nents[index] = 0;
268 sgl_data->num_of_buffers++;
269 }
270
271 static void cc_add_sg_entry(struct device *dev, struct buffer_array *sgl_data,
272 unsigned int nents, struct scatterlist *sgl,
273 unsigned int data_len, unsigned int data_offset,
274 bool is_last_table, u32 *mlli_nents)
275 {
276 unsigned int index = sgl_data->num_of_buffers;
277
278 dev_dbg(dev, "index=%u nents=%u sgl=%pK data_len=0x%08X is_last=%d\n",
279 index, nents, sgl, data_len, is_last_table);
280 sgl_data->nents[index] = nents;
281 sgl_data->entry[index].sgl = sgl;
282 sgl_data->offset[index] = data_offset;
283 sgl_data->total_data_len[index] = data_len;
284 sgl_data->type[index] = DMA_SGL_TYPE;
285 sgl_data->is_last[index] = is_last_table;
286 sgl_data->mlli_nents[index] = mlli_nents;
287 if (sgl_data->mlli_nents[index])
288 *sgl_data->mlli_nents[index] = 0;
289 sgl_data->num_of_buffers++;
290 }
291
292 static int cc_map_sg(struct device *dev, struct scatterlist *sg,
293 unsigned int nbytes, int direction, u32 *nents,
294 u32 max_sg_nents, u32 *lbytes, u32 *mapped_nents)
295 {
296 int ret = 0;
297
298 *nents = cc_get_sgl_nents(dev, sg, nbytes, lbytes);
299 if (*nents > max_sg_nents) {
300 *nents = 0;
301 dev_err(dev, "Too many fragments. current %d max %d\n",
302 *nents, max_sg_nents);
303 return -ENOMEM;
304 }
305
306 ret = dma_map_sg(dev, sg, *nents, direction);
307 if (dma_mapping_error(dev, ret)) {
308 *nents = 0;
309 dev_err(dev, "dma_map_sg() sg buffer failed %d\n", ret);
310 return -ENOMEM;
311 }
312
313 *mapped_nents = ret;
314
315 return 0;
316 }
317
318 static int
319 cc_set_aead_conf_buf(struct device *dev, struct aead_req_ctx *areq_ctx,
320 u8 *config_data, struct buffer_array *sg_data,
321 unsigned int assoclen)
322 {
323 dev_dbg(dev, " handle additional data config set to DLLI\n");
324
325 sg_init_one(&areq_ctx->ccm_adata_sg, config_data,
326 AES_BLOCK_SIZE + areq_ctx->ccm_hdr_size);
327 if (dma_map_sg(dev, &areq_ctx->ccm_adata_sg, 1, DMA_TO_DEVICE) != 1) {
328 dev_err(dev, "dma_map_sg() config buffer failed\n");
329 return -ENOMEM;
330 }
331 dev_dbg(dev, "Mapped curr_buff: dma_address=%pad page=%p addr=%pK offset=%u length=%u\n",
332 &sg_dma_address(&areq_ctx->ccm_adata_sg),
333 sg_page(&areq_ctx->ccm_adata_sg),
334 sg_virt(&areq_ctx->ccm_adata_sg),
335 areq_ctx->ccm_adata_sg.offset, areq_ctx->ccm_adata_sg.length);
336
337 if (assoclen > 0) {
338 cc_add_sg_entry(dev, sg_data, 1, &areq_ctx->ccm_adata_sg,
339 (AES_BLOCK_SIZE + areq_ctx->ccm_hdr_size),
340 0, false, NULL);
341 }
342 return 0;
343 }
344
345 static int cc_set_hash_buf(struct device *dev, struct ahash_req_ctx *areq_ctx,
346 u8 *curr_buff, u32 curr_buff_cnt,
347 struct buffer_array *sg_data)
348 {
349 dev_dbg(dev, " handle curr buff %x set to DLLI\n", curr_buff_cnt);
350
351 sg_init_one(areq_ctx->buff_sg, curr_buff, curr_buff_cnt);
352 if (dma_map_sg(dev, areq_ctx->buff_sg, 1, DMA_TO_DEVICE) != 1) {
353 dev_err(dev, "dma_map_sg() src buffer failed\n");
354 return -ENOMEM;
355 }
356 dev_dbg(dev, "Mapped curr_buff: dma_address=%pad page=%p addr=%pK offset=%u length=%u\n",
357 &sg_dma_address(areq_ctx->buff_sg), sg_page(areq_ctx->buff_sg),
358 sg_virt(areq_ctx->buff_sg), areq_ctx->buff_sg->offset,
359 areq_ctx->buff_sg->length);
360 areq_ctx->data_dma_buf_type = CC_DMA_BUF_DLLI;
361 areq_ctx->curr_sg = areq_ctx->buff_sg;
362 areq_ctx->in_nents = 0;
363
364 cc_add_sg_entry(dev, sg_data, 1, areq_ctx->buff_sg, curr_buff_cnt, 0,
365 false, NULL);
366 return 0;
367 }
368
369 void cc_unmap_cipher_request(struct device *dev, void *ctx,
370 unsigned int ivsize, struct scatterlist *src,
371 struct scatterlist *dst)
372 {
373 struct cipher_req_ctx *req_ctx = (struct cipher_req_ctx *)ctx;
374
375 if (req_ctx->gen_ctx.iv_dma_addr) {
376 dev_dbg(dev, "Unmapped iv: iv_dma_addr=%pad iv_size=%u\n",
377 &req_ctx->gen_ctx.iv_dma_addr, ivsize);
378 dma_unmap_single(dev, req_ctx->gen_ctx.iv_dma_addr,
379 ivsize, DMA_BIDIRECTIONAL);
380 }
381
382 if (req_ctx->dma_buf_type == CC_DMA_BUF_MLLI &&
383 req_ctx->mlli_params.mlli_virt_addr) {
384 dma_pool_free(req_ctx->mlli_params.curr_pool,
385 req_ctx->mlli_params.mlli_virt_addr,
386 req_ctx->mlli_params.mlli_dma_addr);
387 }
388
389 dma_unmap_sg(dev, src, req_ctx->in_nents, DMA_BIDIRECTIONAL);
390 dev_dbg(dev, "Unmapped req->src=%pK\n", sg_virt(src));
391
392 if (src != dst) {
393 dma_unmap_sg(dev, dst, req_ctx->out_nents, DMA_BIDIRECTIONAL);
394 dev_dbg(dev, "Unmapped req->dst=%pK\n", sg_virt(dst));
395 }
396 }
397
398 int cc_map_cipher_request(struct cc_drvdata *drvdata, void *ctx,
399 unsigned int ivsize, unsigned int nbytes,
400 void *info, struct scatterlist *src,
401 struct scatterlist *dst, gfp_t flags)
402 {
403 struct cipher_req_ctx *req_ctx = (struct cipher_req_ctx *)ctx;
404 struct mlli_params *mlli_params = &req_ctx->mlli_params;
405 struct buff_mgr_handle *buff_mgr = drvdata->buff_mgr_handle;
406 struct device *dev = drvdata_to_dev(drvdata);
407 struct buffer_array sg_data;
408 u32 dummy = 0;
409 int rc = 0;
410 u32 mapped_nents = 0;
411
412 req_ctx->dma_buf_type = CC_DMA_BUF_DLLI;
413 mlli_params->curr_pool = NULL;
414 sg_data.num_of_buffers = 0;
415
416
417 if (ivsize) {
418 dump_byte_array("iv", (u8 *)info, ivsize);
419 req_ctx->gen_ctx.iv_dma_addr =
420 dma_map_single(dev, (void *)info,
421 ivsize, DMA_BIDIRECTIONAL);
422 if (dma_mapping_error(dev, req_ctx->gen_ctx.iv_dma_addr)) {
423 dev_err(dev, "Mapping iv %u B at va=%pK for DMA failed\n",
424 ivsize, info);
425 return -ENOMEM;
426 }
427 dev_dbg(dev, "Mapped iv %u B at va=%pK to dma=%pad\n",
428 ivsize, info, &req_ctx->gen_ctx.iv_dma_addr);
429 } else {
430 req_ctx->gen_ctx.iv_dma_addr = 0;
431 }
432
433
434 rc = cc_map_sg(dev, src, nbytes, DMA_BIDIRECTIONAL, &req_ctx->in_nents,
435 LLI_MAX_NUM_OF_DATA_ENTRIES, &dummy, &mapped_nents);
436 if (rc)
437 goto cipher_exit;
438 if (mapped_nents > 1)
439 req_ctx->dma_buf_type = CC_DMA_BUF_MLLI;
440
441 if (src == dst) {
442
443 if (req_ctx->dma_buf_type == CC_DMA_BUF_MLLI) {
444 req_ctx->out_nents = 0;
445 cc_add_sg_entry(dev, &sg_data, req_ctx->in_nents, src,
446 nbytes, 0, true,
447 &req_ctx->in_mlli_nents);
448 }
449 } else {
450
451 rc = cc_map_sg(dev, dst, nbytes, DMA_BIDIRECTIONAL,
452 &req_ctx->out_nents, LLI_MAX_NUM_OF_DATA_ENTRIES,
453 &dummy, &mapped_nents);
454 if (rc)
455 goto cipher_exit;
456 if (mapped_nents > 1)
457 req_ctx->dma_buf_type = CC_DMA_BUF_MLLI;
458
459 if (req_ctx->dma_buf_type == CC_DMA_BUF_MLLI) {
460 cc_add_sg_entry(dev, &sg_data, req_ctx->in_nents, src,
461 nbytes, 0, true,
462 &req_ctx->in_mlli_nents);
463 cc_add_sg_entry(dev, &sg_data, req_ctx->out_nents, dst,
464 nbytes, 0, true,
465 &req_ctx->out_mlli_nents);
466 }
467 }
468
469 if (req_ctx->dma_buf_type == CC_DMA_BUF_MLLI) {
470 mlli_params->curr_pool = buff_mgr->mlli_buffs_pool;
471 rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags);
472 if (rc)
473 goto cipher_exit;
474 }
475
476 dev_dbg(dev, "areq_ctx->dma_buf_type = %s\n",
477 cc_dma_buf_type(req_ctx->dma_buf_type));
478
479 return 0;
480
481 cipher_exit:
482 cc_unmap_cipher_request(dev, req_ctx, ivsize, src, dst);
483 return rc;
484 }
485
486 void cc_unmap_aead_request(struct device *dev, struct aead_request *req)
487 {
488 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
489 unsigned int hw_iv_size = areq_ctx->hw_iv_size;
490 struct cc_drvdata *drvdata = dev_get_drvdata(dev);
491
492 if (areq_ctx->mac_buf_dma_addr) {
493 dma_unmap_single(dev, areq_ctx->mac_buf_dma_addr,
494 MAX_MAC_SIZE, DMA_BIDIRECTIONAL);
495 }
496
497 if (areq_ctx->cipher_mode == DRV_CIPHER_GCTR) {
498 if (areq_ctx->hkey_dma_addr) {
499 dma_unmap_single(dev, areq_ctx->hkey_dma_addr,
500 AES_BLOCK_SIZE, DMA_BIDIRECTIONAL);
501 }
502
503 if (areq_ctx->gcm_block_len_dma_addr) {
504 dma_unmap_single(dev, areq_ctx->gcm_block_len_dma_addr,
505 AES_BLOCK_SIZE, DMA_TO_DEVICE);
506 }
507
508 if (areq_ctx->gcm_iv_inc1_dma_addr) {
509 dma_unmap_single(dev, areq_ctx->gcm_iv_inc1_dma_addr,
510 AES_BLOCK_SIZE, DMA_TO_DEVICE);
511 }
512
513 if (areq_ctx->gcm_iv_inc2_dma_addr) {
514 dma_unmap_single(dev, areq_ctx->gcm_iv_inc2_dma_addr,
515 AES_BLOCK_SIZE, DMA_TO_DEVICE);
516 }
517 }
518
519 if (areq_ctx->ccm_hdr_size != ccm_header_size_null) {
520 if (areq_ctx->ccm_iv0_dma_addr) {
521 dma_unmap_single(dev, areq_ctx->ccm_iv0_dma_addr,
522 AES_BLOCK_SIZE, DMA_TO_DEVICE);
523 }
524
525 dma_unmap_sg(dev, &areq_ctx->ccm_adata_sg, 1, DMA_TO_DEVICE);
526 }
527 if (areq_ctx->gen_ctx.iv_dma_addr) {
528 dma_unmap_single(dev, areq_ctx->gen_ctx.iv_dma_addr,
529 hw_iv_size, DMA_BIDIRECTIONAL);
530 kzfree(areq_ctx->gen_ctx.iv);
531 }
532
533
534 if ((areq_ctx->assoc_buff_type == CC_DMA_BUF_MLLI ||
535 areq_ctx->data_buff_type == CC_DMA_BUF_MLLI) &&
536 (areq_ctx->mlli_params.mlli_virt_addr)) {
537 dev_dbg(dev, "free MLLI buffer: dma=%pad virt=%pK\n",
538 &areq_ctx->mlli_params.mlli_dma_addr,
539 areq_ctx->mlli_params.mlli_virt_addr);
540 dma_pool_free(areq_ctx->mlli_params.curr_pool,
541 areq_ctx->mlli_params.mlli_virt_addr,
542 areq_ctx->mlli_params.mlli_dma_addr);
543 }
544
545 dev_dbg(dev, "Unmapping src sgl: req->src=%pK areq_ctx->src.nents=%u areq_ctx->assoc.nents=%u assoclen:%u cryptlen=%u\n",
546 sg_virt(req->src), areq_ctx->src.nents, areq_ctx->assoc.nents,
547 areq_ctx->assoclen, req->cryptlen);
548
549 dma_unmap_sg(dev, req->src, areq_ctx->src.mapped_nents,
550 DMA_BIDIRECTIONAL);
551 if (req->src != req->dst) {
552 dev_dbg(dev, "Unmapping dst sgl: req->dst=%pK\n",
553 sg_virt(req->dst));
554 dma_unmap_sg(dev, req->dst, areq_ctx->dst.mapped_nents,
555 DMA_BIDIRECTIONAL);
556 }
557 if (drvdata->coherent &&
558 areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_DECRYPT &&
559 req->src == req->dst) {
560
561
562
563
564 cc_copy_mac(dev, req, CC_SG_FROM_BUF);
565 }
566 }
567
568 static bool cc_is_icv_frag(unsigned int sgl_nents, unsigned int authsize,
569 u32 last_entry_data_size)
570 {
571 return ((sgl_nents > 1) && (last_entry_data_size < authsize));
572 }
573
574 static int cc_aead_chain_iv(struct cc_drvdata *drvdata,
575 struct aead_request *req,
576 struct buffer_array *sg_data,
577 bool is_last, bool do_chain)
578 {
579 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
580 unsigned int hw_iv_size = areq_ctx->hw_iv_size;
581 struct device *dev = drvdata_to_dev(drvdata);
582 gfp_t flags = cc_gfp_flags(&req->base);
583 int rc = 0;
584
585 if (!req->iv) {
586 areq_ctx->gen_ctx.iv_dma_addr = 0;
587 areq_ctx->gen_ctx.iv = NULL;
588 goto chain_iv_exit;
589 }
590
591 areq_ctx->gen_ctx.iv = kmemdup(req->iv, hw_iv_size, flags);
592 if (!areq_ctx->gen_ctx.iv)
593 return -ENOMEM;
594
595 areq_ctx->gen_ctx.iv_dma_addr =
596 dma_map_single(dev, areq_ctx->gen_ctx.iv, hw_iv_size,
597 DMA_BIDIRECTIONAL);
598 if (dma_mapping_error(dev, areq_ctx->gen_ctx.iv_dma_addr)) {
599 dev_err(dev, "Mapping iv %u B at va=%pK for DMA failed\n",
600 hw_iv_size, req->iv);
601 kzfree(areq_ctx->gen_ctx.iv);
602 areq_ctx->gen_ctx.iv = NULL;
603 rc = -ENOMEM;
604 goto chain_iv_exit;
605 }
606
607 dev_dbg(dev, "Mapped iv %u B at va=%pK to dma=%pad\n",
608 hw_iv_size, req->iv, &areq_ctx->gen_ctx.iv_dma_addr);
609
610 if (do_chain && areq_ctx->plaintext_authenticate_only) {
611 struct crypto_aead *tfm = crypto_aead_reqtfm(req);
612 unsigned int iv_size_to_authenc = crypto_aead_ivsize(tfm);
613 unsigned int iv_ofs = GCM_BLOCK_RFC4_IV_OFFSET;
614
615 cc_add_buffer_entry(dev, sg_data,
616 (areq_ctx->gen_ctx.iv_dma_addr + iv_ofs),
617 iv_size_to_authenc, is_last,
618 &areq_ctx->assoc.mlli_nents);
619 areq_ctx->assoc_buff_type = CC_DMA_BUF_MLLI;
620 }
621
622 chain_iv_exit:
623 return rc;
624 }
625
626 static int cc_aead_chain_assoc(struct cc_drvdata *drvdata,
627 struct aead_request *req,
628 struct buffer_array *sg_data,
629 bool is_last, bool do_chain)
630 {
631 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
632 int rc = 0;
633 int mapped_nents = 0;
634 struct crypto_aead *tfm = crypto_aead_reqtfm(req);
635 unsigned int size_of_assoc = areq_ctx->assoclen;
636 struct device *dev = drvdata_to_dev(drvdata);
637
638 if (areq_ctx->is_gcm4543)
639 size_of_assoc += crypto_aead_ivsize(tfm);
640
641 if (!sg_data) {
642 rc = -EINVAL;
643 goto chain_assoc_exit;
644 }
645
646 if (areq_ctx->assoclen == 0) {
647 areq_ctx->assoc_buff_type = CC_DMA_BUF_NULL;
648 areq_ctx->assoc.nents = 0;
649 areq_ctx->assoc.mlli_nents = 0;
650 dev_dbg(dev, "Chain assoc of length 0: buff_type=%s nents=%u\n",
651 cc_dma_buf_type(areq_ctx->assoc_buff_type),
652 areq_ctx->assoc.nents);
653 goto chain_assoc_exit;
654 }
655
656 mapped_nents = sg_nents_for_len(req->src, size_of_assoc);
657 if (mapped_nents < 0)
658 return mapped_nents;
659
660 if (mapped_nents > LLI_MAX_NUM_OF_ASSOC_DATA_ENTRIES) {
661 dev_err(dev, "Too many fragments. current %d max %d\n",
662 mapped_nents, LLI_MAX_NUM_OF_ASSOC_DATA_ENTRIES);
663 return -ENOMEM;
664 }
665 areq_ctx->assoc.nents = mapped_nents;
666
667
668
669
670 if (areq_ctx->ccm_hdr_size != ccm_header_size_null) {
671 if ((mapped_nents + 1) > LLI_MAX_NUM_OF_ASSOC_DATA_ENTRIES) {
672 dev_err(dev, "CCM case.Too many fragments. Current %d max %d\n",
673 (areq_ctx->assoc.nents + 1),
674 LLI_MAX_NUM_OF_ASSOC_DATA_ENTRIES);
675 rc = -ENOMEM;
676 goto chain_assoc_exit;
677 }
678 }
679
680 if (mapped_nents == 1 && areq_ctx->ccm_hdr_size == ccm_header_size_null)
681 areq_ctx->assoc_buff_type = CC_DMA_BUF_DLLI;
682 else
683 areq_ctx->assoc_buff_type = CC_DMA_BUF_MLLI;
684
685 if (do_chain || areq_ctx->assoc_buff_type == CC_DMA_BUF_MLLI) {
686 dev_dbg(dev, "Chain assoc: buff_type=%s nents=%u\n",
687 cc_dma_buf_type(areq_ctx->assoc_buff_type),
688 areq_ctx->assoc.nents);
689 cc_add_sg_entry(dev, sg_data, areq_ctx->assoc.nents, req->src,
690 areq_ctx->assoclen, 0, is_last,
691 &areq_ctx->assoc.mlli_nents);
692 areq_ctx->assoc_buff_type = CC_DMA_BUF_MLLI;
693 }
694
695 chain_assoc_exit:
696 return rc;
697 }
698
699 static void cc_prepare_aead_data_dlli(struct aead_request *req,
700 u32 *src_last_bytes, u32 *dst_last_bytes)
701 {
702 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
703 enum drv_crypto_direction direct = areq_ctx->gen_ctx.op_type;
704 unsigned int authsize = areq_ctx->req_authsize;
705 struct scatterlist *sg;
706 ssize_t offset;
707
708 areq_ctx->is_icv_fragmented = false;
709
710 if ((req->src == req->dst) || direct == DRV_CRYPTO_DIRECTION_DECRYPT) {
711 sg = areq_ctx->src_sgl;
712 offset = *src_last_bytes - authsize;
713 } else {
714 sg = areq_ctx->dst_sgl;
715 offset = *dst_last_bytes - authsize;
716 }
717
718 areq_ctx->icv_dma_addr = sg_dma_address(sg) + offset;
719 areq_ctx->icv_virt_addr = sg_virt(sg) + offset;
720 }
721
722 static void cc_prepare_aead_data_mlli(struct cc_drvdata *drvdata,
723 struct aead_request *req,
724 struct buffer_array *sg_data,
725 u32 *src_last_bytes, u32 *dst_last_bytes,
726 bool is_last_table)
727 {
728 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
729 enum drv_crypto_direction direct = areq_ctx->gen_ctx.op_type;
730 unsigned int authsize = areq_ctx->req_authsize;
731 struct device *dev = drvdata_to_dev(drvdata);
732 struct scatterlist *sg;
733
734 if (req->src == req->dst) {
735
736 cc_add_sg_entry(dev, sg_data, areq_ctx->src.nents,
737 areq_ctx->src_sgl, areq_ctx->cryptlen,
738 areq_ctx->src_offset, is_last_table,
739 &areq_ctx->src.mlli_nents);
740
741 areq_ctx->is_icv_fragmented =
742 cc_is_icv_frag(areq_ctx->src.nents, authsize,
743 *src_last_bytes);
744
745 if (areq_ctx->is_icv_fragmented) {
746
747
748
749
750 if (direct == DRV_CRYPTO_DIRECTION_DECRYPT) {
751
752
753
754
755
756 if (!drvdata->coherent)
757 cc_copy_mac(dev, req, CC_SG_TO_BUF);
758
759 areq_ctx->icv_virt_addr = areq_ctx->backup_mac;
760 } else {
761 areq_ctx->icv_virt_addr = areq_ctx->mac_buf;
762 areq_ctx->icv_dma_addr =
763 areq_ctx->mac_buf_dma_addr;
764 }
765 } else {
766 sg = &areq_ctx->src_sgl[areq_ctx->src.nents - 1];
767
768 areq_ctx->icv_dma_addr = sg_dma_address(sg) +
769 (*src_last_bytes - authsize);
770 areq_ctx->icv_virt_addr = sg_virt(sg) +
771 (*src_last_bytes - authsize);
772 }
773
774 } else if (direct == DRV_CRYPTO_DIRECTION_DECRYPT) {
775
776 cc_add_sg_entry(dev, sg_data, areq_ctx->src.nents,
777 areq_ctx->src_sgl, areq_ctx->cryptlen,
778 areq_ctx->src_offset, is_last_table,
779 &areq_ctx->src.mlli_nents);
780 cc_add_sg_entry(dev, sg_data, areq_ctx->dst.nents,
781 areq_ctx->dst_sgl, areq_ctx->cryptlen,
782 areq_ctx->dst_offset, is_last_table,
783 &areq_ctx->dst.mlli_nents);
784
785 areq_ctx->is_icv_fragmented =
786 cc_is_icv_frag(areq_ctx->src.nents, authsize,
787 *src_last_bytes);
788
789
790
791
792
793 if (areq_ctx->is_icv_fragmented) {
794 cc_copy_mac(dev, req, CC_SG_TO_BUF);
795 areq_ctx->icv_virt_addr = areq_ctx->backup_mac;
796
797 } else {
798 sg = &areq_ctx->src_sgl[areq_ctx->src.nents - 1];
799
800 areq_ctx->icv_dma_addr = sg_dma_address(sg) +
801 (*src_last_bytes - authsize);
802 areq_ctx->icv_virt_addr = sg_virt(sg) +
803 (*src_last_bytes - authsize);
804 }
805
806 } else {
807
808 cc_add_sg_entry(dev, sg_data, areq_ctx->dst.nents,
809 areq_ctx->dst_sgl, areq_ctx->cryptlen,
810 areq_ctx->dst_offset, is_last_table,
811 &areq_ctx->dst.mlli_nents);
812 cc_add_sg_entry(dev, sg_data, areq_ctx->src.nents,
813 areq_ctx->src_sgl, areq_ctx->cryptlen,
814 areq_ctx->src_offset, is_last_table,
815 &areq_ctx->src.mlli_nents);
816
817 areq_ctx->is_icv_fragmented =
818 cc_is_icv_frag(areq_ctx->dst.nents, authsize,
819 *dst_last_bytes);
820
821 if (!areq_ctx->is_icv_fragmented) {
822 sg = &areq_ctx->dst_sgl[areq_ctx->dst.nents - 1];
823
824 areq_ctx->icv_dma_addr = sg_dma_address(sg) +
825 (*dst_last_bytes - authsize);
826 areq_ctx->icv_virt_addr = sg_virt(sg) +
827 (*dst_last_bytes - authsize);
828 } else {
829 areq_ctx->icv_dma_addr = areq_ctx->mac_buf_dma_addr;
830 areq_ctx->icv_virt_addr = areq_ctx->mac_buf;
831 }
832 }
833 }
834
835 static int cc_aead_chain_data(struct cc_drvdata *drvdata,
836 struct aead_request *req,
837 struct buffer_array *sg_data,
838 bool is_last_table, bool do_chain)
839 {
840 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
841 struct device *dev = drvdata_to_dev(drvdata);
842 enum drv_crypto_direction direct = areq_ctx->gen_ctx.op_type;
843 unsigned int authsize = areq_ctx->req_authsize;
844 unsigned int src_last_bytes = 0, dst_last_bytes = 0;
845 int rc = 0;
846 u32 src_mapped_nents = 0, dst_mapped_nents = 0;
847 u32 offset = 0;
848
849 unsigned int size_for_map = areq_ctx->assoclen + req->cryptlen;
850 struct crypto_aead *tfm = crypto_aead_reqtfm(req);
851 u32 sg_index = 0;
852 bool is_gcm4543 = areq_ctx->is_gcm4543;
853 u32 size_to_skip = areq_ctx->assoclen;
854 struct scatterlist *sgl;
855
856 if (is_gcm4543)
857 size_to_skip += crypto_aead_ivsize(tfm);
858
859 offset = size_to_skip;
860
861 if (!sg_data)
862 return -EINVAL;
863
864 areq_ctx->src_sgl = req->src;
865 areq_ctx->dst_sgl = req->dst;
866
867 if (is_gcm4543)
868 size_for_map += crypto_aead_ivsize(tfm);
869
870 size_for_map += (direct == DRV_CRYPTO_DIRECTION_ENCRYPT) ?
871 authsize : 0;
872 src_mapped_nents = cc_get_sgl_nents(dev, req->src, size_for_map,
873 &src_last_bytes);
874 sg_index = areq_ctx->src_sgl->length;
875
876 while (src_mapped_nents && (sg_index <= size_to_skip)) {
877 src_mapped_nents--;
878 offset -= areq_ctx->src_sgl->length;
879 sgl = sg_next(areq_ctx->src_sgl);
880 if (!sgl)
881 break;
882 areq_ctx->src_sgl = sgl;
883 sg_index += areq_ctx->src_sgl->length;
884 }
885 if (src_mapped_nents > LLI_MAX_NUM_OF_DATA_ENTRIES) {
886 dev_err(dev, "Too many fragments. current %d max %d\n",
887 src_mapped_nents, LLI_MAX_NUM_OF_DATA_ENTRIES);
888 return -ENOMEM;
889 }
890
891 areq_ctx->src.nents = src_mapped_nents;
892
893 areq_ctx->src_offset = offset;
894
895 if (req->src != req->dst) {
896 size_for_map = areq_ctx->assoclen + req->cryptlen;
897
898 if (direct == DRV_CRYPTO_DIRECTION_ENCRYPT)
899 size_for_map += authsize;
900 else
901 size_for_map -= authsize;
902
903 if (is_gcm4543)
904 size_for_map += crypto_aead_ivsize(tfm);
905
906 rc = cc_map_sg(dev, req->dst, size_for_map, DMA_BIDIRECTIONAL,
907 &areq_ctx->dst.mapped_nents,
908 LLI_MAX_NUM_OF_DATA_ENTRIES, &dst_last_bytes,
909 &dst_mapped_nents);
910 if (rc)
911 goto chain_data_exit;
912 }
913
914 dst_mapped_nents = cc_get_sgl_nents(dev, req->dst, size_for_map,
915 &dst_last_bytes);
916 sg_index = areq_ctx->dst_sgl->length;
917 offset = size_to_skip;
918
919
920 while (dst_mapped_nents && sg_index <= size_to_skip) {
921 dst_mapped_nents--;
922 offset -= areq_ctx->dst_sgl->length;
923 sgl = sg_next(areq_ctx->dst_sgl);
924 if (!sgl)
925 break;
926 areq_ctx->dst_sgl = sgl;
927 sg_index += areq_ctx->dst_sgl->length;
928 }
929 if (dst_mapped_nents > LLI_MAX_NUM_OF_DATA_ENTRIES) {
930 dev_err(dev, "Too many fragments. current %d max %d\n",
931 dst_mapped_nents, LLI_MAX_NUM_OF_DATA_ENTRIES);
932 return -ENOMEM;
933 }
934 areq_ctx->dst.nents = dst_mapped_nents;
935 areq_ctx->dst_offset = offset;
936 if (src_mapped_nents > 1 ||
937 dst_mapped_nents > 1 ||
938 do_chain) {
939 areq_ctx->data_buff_type = CC_DMA_BUF_MLLI;
940 cc_prepare_aead_data_mlli(drvdata, req, sg_data,
941 &src_last_bytes, &dst_last_bytes,
942 is_last_table);
943 } else {
944 areq_ctx->data_buff_type = CC_DMA_BUF_DLLI;
945 cc_prepare_aead_data_dlli(req, &src_last_bytes,
946 &dst_last_bytes);
947 }
948
949 chain_data_exit:
950 return rc;
951 }
952
953 static void cc_update_aead_mlli_nents(struct cc_drvdata *drvdata,
954 struct aead_request *req)
955 {
956 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
957 u32 curr_mlli_size = 0;
958
959 if (areq_ctx->assoc_buff_type == CC_DMA_BUF_MLLI) {
960 areq_ctx->assoc.sram_addr = drvdata->mlli_sram_addr;
961 curr_mlli_size = areq_ctx->assoc.mlli_nents *
962 LLI_ENTRY_BYTE_SIZE;
963 }
964
965 if (areq_ctx->data_buff_type == CC_DMA_BUF_MLLI) {
966
967 if (req->src == req->dst) {
968 areq_ctx->dst.mlli_nents = areq_ctx->src.mlli_nents;
969 areq_ctx->src.sram_addr = drvdata->mlli_sram_addr +
970 curr_mlli_size;
971 areq_ctx->dst.sram_addr = areq_ctx->src.sram_addr;
972 if (!areq_ctx->is_single_pass)
973 areq_ctx->assoc.mlli_nents +=
974 areq_ctx->src.mlli_nents;
975 } else {
976 if (areq_ctx->gen_ctx.op_type ==
977 DRV_CRYPTO_DIRECTION_DECRYPT) {
978 areq_ctx->src.sram_addr =
979 drvdata->mlli_sram_addr +
980 curr_mlli_size;
981 areq_ctx->dst.sram_addr =
982 areq_ctx->src.sram_addr +
983 areq_ctx->src.mlli_nents *
984 LLI_ENTRY_BYTE_SIZE;
985 if (!areq_ctx->is_single_pass)
986 areq_ctx->assoc.mlli_nents +=
987 areq_ctx->src.mlli_nents;
988 } else {
989 areq_ctx->dst.sram_addr =
990 drvdata->mlli_sram_addr +
991 curr_mlli_size;
992 areq_ctx->src.sram_addr =
993 areq_ctx->dst.sram_addr +
994 areq_ctx->dst.mlli_nents *
995 LLI_ENTRY_BYTE_SIZE;
996 if (!areq_ctx->is_single_pass)
997 areq_ctx->assoc.mlli_nents +=
998 areq_ctx->dst.mlli_nents;
999 }
1000 }
1001 }
1002 }
1003
1004 int cc_map_aead_request(struct cc_drvdata *drvdata, struct aead_request *req)
1005 {
1006 struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
1007 struct mlli_params *mlli_params = &areq_ctx->mlli_params;
1008 struct device *dev = drvdata_to_dev(drvdata);
1009 struct buffer_array sg_data;
1010 unsigned int authsize = areq_ctx->req_authsize;
1011 struct buff_mgr_handle *buff_mgr = drvdata->buff_mgr_handle;
1012 int rc = 0;
1013 struct crypto_aead *tfm = crypto_aead_reqtfm(req);
1014 bool is_gcm4543 = areq_ctx->is_gcm4543;
1015 dma_addr_t dma_addr;
1016 u32 mapped_nents = 0;
1017 u32 dummy = 0;
1018 u32 size_to_map = 0;
1019 gfp_t flags = cc_gfp_flags(&req->base);
1020
1021 mlli_params->curr_pool = NULL;
1022 sg_data.num_of_buffers = 0;
1023
1024
1025
1026
1027 if (drvdata->coherent &&
1028 areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_DECRYPT &&
1029 req->src == req->dst)
1030 cc_copy_mac(dev, req, CC_SG_TO_BUF);
1031
1032
1033 areq_ctx->cryptlen = (areq_ctx->gen_ctx.op_type ==
1034 DRV_CRYPTO_DIRECTION_ENCRYPT) ?
1035 req->cryptlen :
1036 (req->cryptlen - authsize);
1037
1038 dma_addr = dma_map_single(dev, areq_ctx->mac_buf, MAX_MAC_SIZE,
1039 DMA_BIDIRECTIONAL);
1040 if (dma_mapping_error(dev, dma_addr)) {
1041 dev_err(dev, "Mapping mac_buf %u B at va=%pK for DMA failed\n",
1042 MAX_MAC_SIZE, areq_ctx->mac_buf);
1043 rc = -ENOMEM;
1044 goto aead_map_failure;
1045 }
1046 areq_ctx->mac_buf_dma_addr = dma_addr;
1047
1048 if (areq_ctx->ccm_hdr_size != ccm_header_size_null) {
1049 void *addr = areq_ctx->ccm_config + CCM_CTR_COUNT_0_OFFSET;
1050
1051 dma_addr = dma_map_single(dev, addr, AES_BLOCK_SIZE,
1052 DMA_TO_DEVICE);
1053
1054 if (dma_mapping_error(dev, dma_addr)) {
1055 dev_err(dev, "Mapping mac_buf %u B at va=%pK for DMA failed\n",
1056 AES_BLOCK_SIZE, addr);
1057 areq_ctx->ccm_iv0_dma_addr = 0;
1058 rc = -ENOMEM;
1059 goto aead_map_failure;
1060 }
1061 areq_ctx->ccm_iv0_dma_addr = dma_addr;
1062
1063 rc = cc_set_aead_conf_buf(dev, areq_ctx, areq_ctx->ccm_config,
1064 &sg_data, areq_ctx->assoclen);
1065 if (rc)
1066 goto aead_map_failure;
1067 }
1068
1069 if (areq_ctx->cipher_mode == DRV_CIPHER_GCTR) {
1070 dma_addr = dma_map_single(dev, areq_ctx->hkey, AES_BLOCK_SIZE,
1071 DMA_BIDIRECTIONAL);
1072 if (dma_mapping_error(dev, dma_addr)) {
1073 dev_err(dev, "Mapping hkey %u B at va=%pK for DMA failed\n",
1074 AES_BLOCK_SIZE, areq_ctx->hkey);
1075 rc = -ENOMEM;
1076 goto aead_map_failure;
1077 }
1078 areq_ctx->hkey_dma_addr = dma_addr;
1079
1080 dma_addr = dma_map_single(dev, &areq_ctx->gcm_len_block,
1081 AES_BLOCK_SIZE, DMA_TO_DEVICE);
1082 if (dma_mapping_error(dev, dma_addr)) {
1083 dev_err(dev, "Mapping gcm_len_block %u B at va=%pK for DMA failed\n",
1084 AES_BLOCK_SIZE, &areq_ctx->gcm_len_block);
1085 rc = -ENOMEM;
1086 goto aead_map_failure;
1087 }
1088 areq_ctx->gcm_block_len_dma_addr = dma_addr;
1089
1090 dma_addr = dma_map_single(dev, areq_ctx->gcm_iv_inc1,
1091 AES_BLOCK_SIZE, DMA_TO_DEVICE);
1092
1093 if (dma_mapping_error(dev, dma_addr)) {
1094 dev_err(dev, "Mapping gcm_iv_inc1 %u B at va=%pK for DMA failed\n",
1095 AES_BLOCK_SIZE, (areq_ctx->gcm_iv_inc1));
1096 areq_ctx->gcm_iv_inc1_dma_addr = 0;
1097 rc = -ENOMEM;
1098 goto aead_map_failure;
1099 }
1100 areq_ctx->gcm_iv_inc1_dma_addr = dma_addr;
1101
1102 dma_addr = dma_map_single(dev, areq_ctx->gcm_iv_inc2,
1103 AES_BLOCK_SIZE, DMA_TO_DEVICE);
1104
1105 if (dma_mapping_error(dev, dma_addr)) {
1106 dev_err(dev, "Mapping gcm_iv_inc2 %u B at va=%pK for DMA failed\n",
1107 AES_BLOCK_SIZE, (areq_ctx->gcm_iv_inc2));
1108 areq_ctx->gcm_iv_inc2_dma_addr = 0;
1109 rc = -ENOMEM;
1110 goto aead_map_failure;
1111 }
1112 areq_ctx->gcm_iv_inc2_dma_addr = dma_addr;
1113 }
1114
1115 size_to_map = req->cryptlen + areq_ctx->assoclen;
1116
1117 if ((areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_ENCRYPT) &&
1118 (req->src == req->dst)) {
1119 size_to_map += authsize;
1120 }
1121 if (is_gcm4543)
1122 size_to_map += crypto_aead_ivsize(tfm);
1123 rc = cc_map_sg(dev, req->src, size_to_map, DMA_BIDIRECTIONAL,
1124 &areq_ctx->src.mapped_nents,
1125 (LLI_MAX_NUM_OF_ASSOC_DATA_ENTRIES +
1126 LLI_MAX_NUM_OF_DATA_ENTRIES),
1127 &dummy, &mapped_nents);
1128 if (rc)
1129 goto aead_map_failure;
1130
1131 if (areq_ctx->is_single_pass) {
1132
1133
1134
1135
1136
1137
1138 rc = cc_aead_chain_assoc(drvdata, req, &sg_data, true, false);
1139 if (rc)
1140 goto aead_map_failure;
1141 rc = cc_aead_chain_iv(drvdata, req, &sg_data, true, false);
1142 if (rc)
1143 goto aead_map_failure;
1144 rc = cc_aead_chain_data(drvdata, req, &sg_data, true, false);
1145 if (rc)
1146 goto aead_map_failure;
1147 } else {
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168 rc = cc_aead_chain_assoc(drvdata, req, &sg_data, false, true);
1169 if (rc)
1170 goto aead_map_failure;
1171 rc = cc_aead_chain_iv(drvdata, req, &sg_data, false, true);
1172 if (rc)
1173 goto aead_map_failure;
1174 rc = cc_aead_chain_data(drvdata, req, &sg_data, true, true);
1175 if (rc)
1176 goto aead_map_failure;
1177 }
1178
1179
1180
1181
1182 if (areq_ctx->assoc_buff_type == CC_DMA_BUF_MLLI ||
1183 areq_ctx->data_buff_type == CC_DMA_BUF_MLLI) {
1184 mlli_params->curr_pool = buff_mgr->mlli_buffs_pool;
1185 rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags);
1186 if (rc)
1187 goto aead_map_failure;
1188
1189 cc_update_aead_mlli_nents(drvdata, req);
1190 dev_dbg(dev, "assoc params mn %d\n",
1191 areq_ctx->assoc.mlli_nents);
1192 dev_dbg(dev, "src params mn %d\n", areq_ctx->src.mlli_nents);
1193 dev_dbg(dev, "dst params mn %d\n", areq_ctx->dst.mlli_nents);
1194 }
1195 return 0;
1196
1197 aead_map_failure:
1198 cc_unmap_aead_request(dev, req);
1199 return rc;
1200 }
1201
1202 int cc_map_hash_request_final(struct cc_drvdata *drvdata, void *ctx,
1203 struct scatterlist *src, unsigned int nbytes,
1204 bool do_update, gfp_t flags)
1205 {
1206 struct ahash_req_ctx *areq_ctx = (struct ahash_req_ctx *)ctx;
1207 struct device *dev = drvdata_to_dev(drvdata);
1208 u8 *curr_buff = cc_hash_buf(areq_ctx);
1209 u32 *curr_buff_cnt = cc_hash_buf_cnt(areq_ctx);
1210 struct mlli_params *mlli_params = &areq_ctx->mlli_params;
1211 struct buffer_array sg_data;
1212 struct buff_mgr_handle *buff_mgr = drvdata->buff_mgr_handle;
1213 int rc = 0;
1214 u32 dummy = 0;
1215 u32 mapped_nents = 0;
1216
1217 dev_dbg(dev, "final params : curr_buff=%pK curr_buff_cnt=0x%X nbytes = 0x%X src=%pK curr_index=%u\n",
1218 curr_buff, *curr_buff_cnt, nbytes, src, areq_ctx->buff_index);
1219
1220 areq_ctx->data_dma_buf_type = CC_DMA_BUF_NULL;
1221 mlli_params->curr_pool = NULL;
1222 sg_data.num_of_buffers = 0;
1223 areq_ctx->in_nents = 0;
1224
1225 if (nbytes == 0 && *curr_buff_cnt == 0) {
1226
1227 return 0;
1228 }
1229
1230
1231
1232 if (*curr_buff_cnt) {
1233 rc = cc_set_hash_buf(dev, areq_ctx, curr_buff, *curr_buff_cnt,
1234 &sg_data);
1235 if (rc)
1236 return rc;
1237 }
1238
1239 if (src && nbytes > 0 && do_update) {
1240 rc = cc_map_sg(dev, src, nbytes, DMA_TO_DEVICE,
1241 &areq_ctx->in_nents, LLI_MAX_NUM_OF_DATA_ENTRIES,
1242 &dummy, &mapped_nents);
1243 if (rc)
1244 goto unmap_curr_buff;
1245 if (src && mapped_nents == 1 &&
1246 areq_ctx->data_dma_buf_type == CC_DMA_BUF_NULL) {
1247 memcpy(areq_ctx->buff_sg, src,
1248 sizeof(struct scatterlist));
1249 areq_ctx->buff_sg->length = nbytes;
1250 areq_ctx->curr_sg = areq_ctx->buff_sg;
1251 areq_ctx->data_dma_buf_type = CC_DMA_BUF_DLLI;
1252 } else {
1253 areq_ctx->data_dma_buf_type = CC_DMA_BUF_MLLI;
1254 }
1255 }
1256
1257
1258 if (areq_ctx->data_dma_buf_type == CC_DMA_BUF_MLLI) {
1259 mlli_params->curr_pool = buff_mgr->mlli_buffs_pool;
1260
1261 cc_add_sg_entry(dev, &sg_data, areq_ctx->in_nents, src, nbytes,
1262 0, true, &areq_ctx->mlli_nents);
1263 rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags);
1264 if (rc)
1265 goto fail_unmap_din;
1266 }
1267
1268 areq_ctx->buff_index = (areq_ctx->buff_index ^ 1);
1269 dev_dbg(dev, "areq_ctx->data_dma_buf_type = %s\n",
1270 cc_dma_buf_type(areq_ctx->data_dma_buf_type));
1271 return 0;
1272
1273 fail_unmap_din:
1274 dma_unmap_sg(dev, src, areq_ctx->in_nents, DMA_TO_DEVICE);
1275
1276 unmap_curr_buff:
1277 if (*curr_buff_cnt)
1278 dma_unmap_sg(dev, areq_ctx->buff_sg, 1, DMA_TO_DEVICE);
1279
1280 return rc;
1281 }
1282
1283 int cc_map_hash_request_update(struct cc_drvdata *drvdata, void *ctx,
1284 struct scatterlist *src, unsigned int nbytes,
1285 unsigned int block_size, gfp_t flags)
1286 {
1287 struct ahash_req_ctx *areq_ctx = (struct ahash_req_ctx *)ctx;
1288 struct device *dev = drvdata_to_dev(drvdata);
1289 u8 *curr_buff = cc_hash_buf(areq_ctx);
1290 u32 *curr_buff_cnt = cc_hash_buf_cnt(areq_ctx);
1291 u8 *next_buff = cc_next_buf(areq_ctx);
1292 u32 *next_buff_cnt = cc_next_buf_cnt(areq_ctx);
1293 struct mlli_params *mlli_params = &areq_ctx->mlli_params;
1294 unsigned int update_data_len;
1295 u32 total_in_len = nbytes + *curr_buff_cnt;
1296 struct buffer_array sg_data;
1297 struct buff_mgr_handle *buff_mgr = drvdata->buff_mgr_handle;
1298 unsigned int swap_index = 0;
1299 int rc = 0;
1300 u32 dummy = 0;
1301 u32 mapped_nents = 0;
1302
1303 dev_dbg(dev, " update params : curr_buff=%pK curr_buff_cnt=0x%X nbytes=0x%X src=%pK curr_index=%u\n",
1304 curr_buff, *curr_buff_cnt, nbytes, src, areq_ctx->buff_index);
1305
1306 areq_ctx->data_dma_buf_type = CC_DMA_BUF_NULL;
1307 mlli_params->curr_pool = NULL;
1308 areq_ctx->curr_sg = NULL;
1309 sg_data.num_of_buffers = 0;
1310 areq_ctx->in_nents = 0;
1311
1312 if (total_in_len < block_size) {
1313 dev_dbg(dev, " less than one block: curr_buff=%pK *curr_buff_cnt=0x%X copy_to=%pK\n",
1314 curr_buff, *curr_buff_cnt, &curr_buff[*curr_buff_cnt]);
1315 areq_ctx->in_nents = sg_nents_for_len(src, nbytes);
1316 sg_copy_to_buffer(src, areq_ctx->in_nents,
1317 &curr_buff[*curr_buff_cnt], nbytes);
1318 *curr_buff_cnt += nbytes;
1319 return 1;
1320 }
1321
1322
1323 *next_buff_cnt = total_in_len & (block_size - 1);
1324
1325 update_data_len = total_in_len - *next_buff_cnt;
1326
1327 dev_dbg(dev, " temp length : *next_buff_cnt=0x%X update_data_len=0x%X\n",
1328 *next_buff_cnt, update_data_len);
1329
1330
1331 if (*next_buff_cnt) {
1332 dev_dbg(dev, " handle residue: next buff %pK skip data %u residue %u\n",
1333 next_buff, (update_data_len - *curr_buff_cnt),
1334 *next_buff_cnt);
1335 cc_copy_sg_portion(dev, next_buff, src,
1336 (update_data_len - *curr_buff_cnt),
1337 nbytes, CC_SG_TO_BUF);
1338
1339 swap_index = 1;
1340 }
1341
1342 if (*curr_buff_cnt) {
1343 rc = cc_set_hash_buf(dev, areq_ctx, curr_buff, *curr_buff_cnt,
1344 &sg_data);
1345 if (rc)
1346 return rc;
1347
1348 swap_index = 1;
1349 }
1350
1351 if (update_data_len > *curr_buff_cnt) {
1352 rc = cc_map_sg(dev, src, (update_data_len - *curr_buff_cnt),
1353 DMA_TO_DEVICE, &areq_ctx->in_nents,
1354 LLI_MAX_NUM_OF_DATA_ENTRIES, &dummy,
1355 &mapped_nents);
1356 if (rc)
1357 goto unmap_curr_buff;
1358 if (mapped_nents == 1 &&
1359 areq_ctx->data_dma_buf_type == CC_DMA_BUF_NULL) {
1360
1361 memcpy(areq_ctx->buff_sg, src,
1362 sizeof(struct scatterlist));
1363 areq_ctx->buff_sg->length = update_data_len;
1364 areq_ctx->data_dma_buf_type = CC_DMA_BUF_DLLI;
1365 areq_ctx->curr_sg = areq_ctx->buff_sg;
1366 } else {
1367 areq_ctx->data_dma_buf_type = CC_DMA_BUF_MLLI;
1368 }
1369 }
1370
1371 if (areq_ctx->data_dma_buf_type == CC_DMA_BUF_MLLI) {
1372 mlli_params->curr_pool = buff_mgr->mlli_buffs_pool;
1373
1374 cc_add_sg_entry(dev, &sg_data, areq_ctx->in_nents, src,
1375 (update_data_len - *curr_buff_cnt), 0, true,
1376 &areq_ctx->mlli_nents);
1377 rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags);
1378 if (rc)
1379 goto fail_unmap_din;
1380 }
1381 areq_ctx->buff_index = (areq_ctx->buff_index ^ swap_index);
1382
1383 return 0;
1384
1385 fail_unmap_din:
1386 dma_unmap_sg(dev, src, areq_ctx->in_nents, DMA_TO_DEVICE);
1387
1388 unmap_curr_buff:
1389 if (*curr_buff_cnt)
1390 dma_unmap_sg(dev, areq_ctx->buff_sg, 1, DMA_TO_DEVICE);
1391
1392 return rc;
1393 }
1394
1395 void cc_unmap_hash_request(struct device *dev, void *ctx,
1396 struct scatterlist *src, bool do_revert)
1397 {
1398 struct ahash_req_ctx *areq_ctx = (struct ahash_req_ctx *)ctx;
1399 u32 *prev_len = cc_next_buf_cnt(areq_ctx);
1400
1401
1402
1403
1404 if (areq_ctx->mlli_params.curr_pool) {
1405 dev_dbg(dev, "free MLLI buffer: dma=%pad virt=%pK\n",
1406 &areq_ctx->mlli_params.mlli_dma_addr,
1407 areq_ctx->mlli_params.mlli_virt_addr);
1408 dma_pool_free(areq_ctx->mlli_params.curr_pool,
1409 areq_ctx->mlli_params.mlli_virt_addr,
1410 areq_ctx->mlli_params.mlli_dma_addr);
1411 }
1412
1413 if (src && areq_ctx->in_nents) {
1414 dev_dbg(dev, "Unmapped sg src: virt=%pK dma=%pad len=0x%X\n",
1415 sg_virt(src), &sg_dma_address(src), sg_dma_len(src));
1416 dma_unmap_sg(dev, src,
1417 areq_ctx->in_nents, DMA_TO_DEVICE);
1418 }
1419
1420 if (*prev_len) {
1421 dev_dbg(dev, "Unmapped buffer: areq_ctx->buff_sg=%pK dma=%pad len 0x%X\n",
1422 sg_virt(areq_ctx->buff_sg),
1423 &sg_dma_address(areq_ctx->buff_sg),
1424 sg_dma_len(areq_ctx->buff_sg));
1425 dma_unmap_sg(dev, areq_ctx->buff_sg, 1, DMA_TO_DEVICE);
1426 if (!do_revert) {
1427
1428
1429
1430 *prev_len = 0;
1431 } else {
1432 areq_ctx->buff_index ^= 1;
1433 }
1434 }
1435 }
1436
1437 int cc_buffer_mgr_init(struct cc_drvdata *drvdata)
1438 {
1439 struct buff_mgr_handle *buff_mgr_handle;
1440 struct device *dev = drvdata_to_dev(drvdata);
1441
1442 buff_mgr_handle = kmalloc(sizeof(*buff_mgr_handle), GFP_KERNEL);
1443 if (!buff_mgr_handle)
1444 return -ENOMEM;
1445
1446 drvdata->buff_mgr_handle = buff_mgr_handle;
1447
1448 buff_mgr_handle->mlli_buffs_pool =
1449 dma_pool_create("dx_single_mlli_tables", dev,
1450 MAX_NUM_OF_TOTAL_MLLI_ENTRIES *
1451 LLI_ENTRY_BYTE_SIZE,
1452 MLLI_TABLE_MIN_ALIGNMENT, 0);
1453
1454 if (!buff_mgr_handle->mlli_buffs_pool)
1455 goto error;
1456
1457 return 0;
1458
1459 error:
1460 cc_buffer_mgr_fini(drvdata);
1461 return -ENOMEM;
1462 }
1463
1464 int cc_buffer_mgr_fini(struct cc_drvdata *drvdata)
1465 {
1466 struct buff_mgr_handle *buff_mgr_handle = drvdata->buff_mgr_handle;
1467
1468 if (buff_mgr_handle) {
1469 dma_pool_destroy(buff_mgr_handle->mlli_buffs_pool);
1470 kfree(drvdata->buff_mgr_handle);
1471 drvdata->buff_mgr_handle = NULL;
1472 }
1473 return 0;
1474 }