32
32
/* Set this bit for if virtual address destination cannot be used for DMA. */
33
33
#define CRYPTO_ACOMP_REQ_DST_NONDMA 0x00000010
34
34
35
+ /* Set this bit if source is a folio. */
36
+ #define CRYPTO_ACOMP_REQ_SRC_FOLIO 0x00000020
37
+
38
+ /* Set this bit if destination is a folio. */
39
+ #define CRYPTO_ACOMP_REQ_DST_FOLIO 0x00000040
40
+
35
41
#define CRYPTO_ACOMP_DST_MAX 131072
36
42
37
43
#define MAX_SYNC_COMP_REQSIZE 0
43
49
__##name##_req, (tfm), (gfp), false)
44
50
45
51
struct acomp_req ;
52
+ struct folio ;
46
53
47
54
struct acomp_req_chain {
48
55
struct list_head head ;
@@ -53,16 +60,31 @@ struct acomp_req_chain {
53
60
void * data ;
54
61
struct scatterlist ssg ;
55
62
struct scatterlist dsg ;
56
- const u8 * src ;
57
- u8 * dst ;
63
+ union {
64
+ const u8 * src ;
65
+ struct folio * sfolio ;
66
+ };
67
+ union {
68
+ u8 * dst ;
69
+ struct folio * dfolio ;
70
+ };
71
+ size_t soff ;
72
+ size_t doff ;
73
+ u32 flags ;
58
74
};
59
75
60
76
/**
61
77
* struct acomp_req - asynchronous (de)compression request
62
78
*
63
79
* @base: Common attributes for asynchronous crypto requests
64
- * @src: Source Data
65
- * @dst: Destination data
80
+ * @src: Source scatterlist
81
+ * @dst: Destination scatterlist
82
+ * @svirt: Source virtual address
83
+ * @dvirt: Destination virtual address
84
+ * @sfolio: Source folio
85
+ * @soff: Source folio offset
86
+ * @dfolio: Destination folio
87
+ * @doff: Destination folio offset
66
88
* @slen: Size of the input buffer
67
89
* @dlen: Size of the output buffer and number of bytes produced
68
90
* @chain: Private API code data, do not use
@@ -73,11 +95,15 @@ struct acomp_req {
73
95
union {
74
96
struct scatterlist * src ;
75
97
const u8 * svirt ;
98
+ struct folio * sfolio ;
76
99
};
77
100
union {
78
101
struct scatterlist * dst ;
79
102
u8 * dvirt ;
103
+ struct folio * dfolio ;
80
104
};
105
+ size_t soff ;
106
+ size_t doff ;
81
107
unsigned int slen ;
82
108
unsigned int dlen ;
83
109
@@ -316,6 +342,7 @@ static inline void acomp_request_set_callback(struct acomp_req *req,
316
342
{
317
343
u32 keep = CRYPTO_ACOMP_REQ_SRC_VIRT | CRYPTO_ACOMP_REQ_SRC_NONDMA |
318
344
CRYPTO_ACOMP_REQ_DST_VIRT | CRYPTO_ACOMP_REQ_DST_NONDMA |
345
+ CRYPTO_ACOMP_REQ_SRC_FOLIO | CRYPTO_ACOMP_REQ_DST_FOLIO |
319
346
CRYPTO_TFM_REQ_ON_STACK ;
320
347
321
348
req -> base .complete = cmpl ;
@@ -352,6 +379,8 @@ static inline void acomp_request_set_params(struct acomp_req *req,
352
379
353
380
req -> base .flags &= ~(CRYPTO_ACOMP_REQ_SRC_VIRT |
354
381
CRYPTO_ACOMP_REQ_SRC_NONDMA |
382
+ CRYPTO_ACOMP_REQ_SRC_FOLIO |
383
+ CRYPTO_ACOMP_REQ_DST_FOLIO |
355
384
CRYPTO_ACOMP_REQ_DST_VIRT |
356
385
CRYPTO_ACOMP_REQ_DST_NONDMA );
357
386
}
@@ -374,6 +403,7 @@ static inline void acomp_request_set_src_sg(struct acomp_req *req,
374
403
375
404
req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_NONDMA ;
376
405
req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_VIRT ;
406
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_FOLIO ;
377
407
}
378
408
379
409
/**
@@ -393,6 +423,7 @@ static inline void acomp_request_set_src_dma(struct acomp_req *req,
393
423
req -> slen = slen ;
394
424
395
425
req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_NONDMA ;
426
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_FOLIO ;
396
427
req -> base .flags |= CRYPTO_ACOMP_REQ_SRC_VIRT ;
397
428
}
398
429
@@ -413,10 +444,34 @@ static inline void acomp_request_set_src_nondma(struct acomp_req *req,
413
444
req -> svirt = src ;
414
445
req -> slen = slen ;
415
446
447
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_FOLIO ;
416
448
req -> base .flags |= CRYPTO_ACOMP_REQ_SRC_NONDMA ;
417
449
req -> base .flags |= CRYPTO_ACOMP_REQ_SRC_VIRT ;
418
450
}
419
451
452
+ /**
453
+ * acomp_request_set_src_folio() -- Sets source folio
454
+ *
455
+ * Sets source folio required by an acomp operation.
456
+ *
457
+ * @req: asynchronous compress request
458
+ * @folio: pointer to input folio
459
+ * @off: input folio offset
460
+ * @len: size of the input buffer
461
+ */
462
+ static inline void acomp_request_set_src_folio (struct acomp_req * req ,
463
+ struct folio * folio , size_t off ,
464
+ unsigned int len )
465
+ {
466
+ req -> sfolio = folio ;
467
+ req -> soff = off ;
468
+ req -> slen = len ;
469
+
470
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_NONDMA ;
471
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_VIRT ;
472
+ req -> base .flags |= CRYPTO_ACOMP_REQ_SRC_FOLIO ;
473
+ }
474
+
420
475
/**
421
476
* acomp_request_set_dst_sg() -- Sets destination scatterlist
422
477
*
@@ -435,6 +490,7 @@ static inline void acomp_request_set_dst_sg(struct acomp_req *req,
435
490
436
491
req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_NONDMA ;
437
492
req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_VIRT ;
493
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_FOLIO ;
438
494
}
439
495
440
496
/**
@@ -454,6 +510,7 @@ static inline void acomp_request_set_dst_dma(struct acomp_req *req,
454
510
req -> dlen = dlen ;
455
511
456
512
req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_NONDMA ;
513
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_FOLIO ;
457
514
req -> base .flags |= CRYPTO_ACOMP_REQ_DST_VIRT ;
458
515
}
459
516
@@ -473,10 +530,34 @@ static inline void acomp_request_set_dst_nondma(struct acomp_req *req,
473
530
req -> dvirt = dst ;
474
531
req -> dlen = dlen ;
475
532
533
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_FOLIO ;
476
534
req -> base .flags |= CRYPTO_ACOMP_REQ_DST_NONDMA ;
477
535
req -> base .flags |= CRYPTO_ACOMP_REQ_DST_VIRT ;
478
536
}
479
537
538
+ /**
539
+ * acomp_request_set_dst_folio() -- Sets destination folio
540
+ *
541
+ * Sets destination folio required by an acomp operation.
542
+ *
543
+ * @req: asynchronous compress request
544
+ * @folio: pointer to input folio
545
+ * @off: input folio offset
546
+ * @len: size of the input buffer
547
+ */
548
+ static inline void acomp_request_set_dst_folio (struct acomp_req * req ,
549
+ struct folio * folio , size_t off ,
550
+ unsigned int len )
551
+ {
552
+ req -> dfolio = folio ;
553
+ req -> doff = off ;
554
+ req -> dlen = len ;
555
+
556
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_NONDMA ;
557
+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_VIRT ;
558
+ req -> base .flags |= CRYPTO_ACOMP_REQ_DST_FOLIO ;
559
+ }
560
+
480
561
static inline void acomp_request_chain (struct acomp_req * req ,
481
562
struct acomp_req * head )
482
563
{
0 commit comments