20
20
#include "caamalg_desc.h"
21
21
#include <crypto/xts.h>
22
22
#include <asm/unaligned.h>
23
+ #include <linux/device.h>
24
+ #include <linux/err.h>
23
25
#include <linux/dma-mapping.h>
24
26
#include <linux/kernel.h>
27
+ #include <linux/string.h>
25
28
26
29
/*
27
30
* crypto alg
@@ -1204,6 +1207,12 @@ static int ipsec_gcm_decrypt(struct aead_request *req)
1204
1207
false);
1205
1208
}
1206
1209
1210
+ static inline u8 * skcipher_edesc_iv (struct skcipher_edesc * edesc )
1211
+ {
1212
+ return PTR_ALIGN ((u8 * )& edesc -> sgt [0 ] + edesc -> qm_sg_bytes ,
1213
+ dma_get_cache_alignment ());
1214
+ }
1215
+
1207
1216
static void skcipher_done (struct caam_drv_req * drv_req , u32 status )
1208
1217
{
1209
1218
struct skcipher_edesc * edesc ;
@@ -1236,8 +1245,7 @@ static void skcipher_done(struct caam_drv_req *drv_req, u32 status)
1236
1245
* This is used e.g. by the CTS mode.
1237
1246
*/
1238
1247
if (!ecode )
1239
- memcpy (req -> iv , (u8 * )& edesc -> sgt [0 ] + edesc -> qm_sg_bytes ,
1240
- ivsize );
1248
+ memcpy (req -> iv , skcipher_edesc_iv (edesc ), ivsize );
1241
1249
1242
1250
qi_cache_free (edesc );
1243
1251
skcipher_request_complete (req , ecode );
@@ -1259,6 +1267,7 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
1259
1267
int dst_sg_idx , qm_sg_ents , qm_sg_bytes ;
1260
1268
struct qm_sg_entry * sg_table , * fd_sgt ;
1261
1269
struct caam_drv_ctx * drv_ctx ;
1270
+ unsigned int len ;
1262
1271
1263
1272
drv_ctx = get_drv_ctx (ctx , encrypt ? ENCRYPT : DECRYPT );
1264
1273
if (IS_ERR (drv_ctx ))
@@ -1319,9 +1328,12 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
1319
1328
qm_sg_ents = 1 + pad_sg_nents (qm_sg_ents );
1320
1329
1321
1330
qm_sg_bytes = qm_sg_ents * sizeof (struct qm_sg_entry );
1322
- if (unlikely (ALIGN (ivsize , __alignof__(* edesc )) +
1323
- offsetof(struct skcipher_edesc , sgt ) + qm_sg_bytes >
1324
- CAAM_QI_MEMCACHE_SIZE )) {
1331
+
1332
+ len = offsetof(struct skcipher_edesc , sgt ) + qm_sg_bytes ;
1333
+ len = ALIGN (len , dma_get_cache_alignment ());
1334
+ len += ivsize ;
1335
+
1336
+ if (unlikely (len > CAAM_QI_MEMCACHE_SIZE )) {
1325
1337
dev_err (qidev , "No space for %d S/G entries and/or %dB IV\n" ,
1326
1338
qm_sg_ents , ivsize );
1327
1339
caam_unmap (qidev , req -> src , req -> dst , src_nents , dst_nents , 0 ,
@@ -1330,18 +1342,24 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
1330
1342
}
1331
1343
1332
1344
/* allocate space for base edesc, link tables and IV */
1333
- iv = qi_cache_alloc (flags );
1334
- if (unlikely (!iv )) {
1345
+ edesc = qi_cache_alloc (flags );
1346
+ if (unlikely (!edesc )) {
1335
1347
dev_err (qidev , "could not allocate extended descriptor\n" );
1336
1348
caam_unmap (qidev , req -> src , req -> dst , src_nents , dst_nents , 0 ,
1337
1349
0 , DMA_NONE , 0 , 0 );
1338
1350
return ERR_PTR (- ENOMEM );
1339
1351
}
1340
1352
1341
- edesc = (void * )(iv + ALIGN (ivsize , __alignof__(* edesc )));
1353
+ edesc -> src_nents = src_nents ;
1354
+ edesc -> dst_nents = dst_nents ;
1355
+ edesc -> qm_sg_bytes = qm_sg_bytes ;
1356
+ edesc -> drv_req .app_ctx = req ;
1357
+ edesc -> drv_req .cbk = skcipher_done ;
1358
+ edesc -> drv_req .drv_ctx = drv_ctx ;
1342
1359
1343
1360
/* Make sure IV is located in a DMAable area */
1344
1361
sg_table = & edesc -> sgt [0 ];
1362
+ iv = skcipher_edesc_iv (edesc );
1345
1363
memcpy (iv , req -> iv , ivsize );
1346
1364
1347
1365
iv_dma = dma_map_single (qidev , iv , ivsize , DMA_BIDIRECTIONAL );
@@ -1353,13 +1371,7 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
1353
1371
return ERR_PTR (- ENOMEM );
1354
1372
}
1355
1373
1356
- edesc -> src_nents = src_nents ;
1357
- edesc -> dst_nents = dst_nents ;
1358
1374
edesc -> iv_dma = iv_dma ;
1359
- edesc -> qm_sg_bytes = qm_sg_bytes ;
1360
- edesc -> drv_req .app_ctx = req ;
1361
- edesc -> drv_req .cbk = skcipher_done ;
1362
- edesc -> drv_req .drv_ctx = drv_ctx ;
1363
1375
1364
1376
dma_to_qm_sg_one (sg_table , iv_dma , ivsize , 0 );
1365
1377
sg_to_qm_sg (req -> src , req -> cryptlen , sg_table + 1 , 0 );
0 commit comments