3232/* Set this bit for if virtual address destination cannot be used for DMA. */
3333#define CRYPTO_ACOMP_REQ_DST_NONDMA 0x00000010
3434
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+
3541#define CRYPTO_ACOMP_DST_MAX 131072
3642
3743#define MAX_SYNC_COMP_REQSIZE 0
4349 __##name##_req, (tfm), (gfp), false)
4450
4551struct acomp_req ;
52+ struct folio ;
4653
4754struct acomp_req_chain {
4855 struct list_head head ;
@@ -53,16 +60,31 @@ struct acomp_req_chain {
5360 void * data ;
5461 struct scatterlist ssg ;
5562 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 ;
5874};
5975
6076/**
6177 * struct acomp_req - asynchronous (de)compression request
6278 *
6379 * @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
6688 * @slen: Size of the input buffer
6789 * @dlen: Size of the output buffer and number of bytes produced
6890 * @chain: Private API code data, do not use
@@ -73,11 +95,15 @@ struct acomp_req {
7395 union {
7496 struct scatterlist * src ;
7597 const u8 * svirt ;
98+ struct folio * sfolio ;
7699 };
77100 union {
78101 struct scatterlist * dst ;
79102 u8 * dvirt ;
103+ struct folio * dfolio ;
80104 };
105+ size_t soff ;
106+ size_t doff ;
81107 unsigned int slen ;
82108 unsigned int dlen ;
83109
@@ -316,6 +342,7 @@ static inline void acomp_request_set_callback(struct acomp_req *req,
316342{
317343 u32 keep = CRYPTO_ACOMP_REQ_SRC_VIRT | CRYPTO_ACOMP_REQ_SRC_NONDMA |
318344 CRYPTO_ACOMP_REQ_DST_VIRT | CRYPTO_ACOMP_REQ_DST_NONDMA |
345+ CRYPTO_ACOMP_REQ_SRC_FOLIO | CRYPTO_ACOMP_REQ_DST_FOLIO |
319346 CRYPTO_TFM_REQ_ON_STACK ;
320347
321348 req -> base .complete = cmpl ;
@@ -352,6 +379,8 @@ static inline void acomp_request_set_params(struct acomp_req *req,
352379
353380 req -> base .flags &= ~(CRYPTO_ACOMP_REQ_SRC_VIRT |
354381 CRYPTO_ACOMP_REQ_SRC_NONDMA |
382+ CRYPTO_ACOMP_REQ_SRC_FOLIO |
383+ CRYPTO_ACOMP_REQ_DST_FOLIO |
355384 CRYPTO_ACOMP_REQ_DST_VIRT |
356385 CRYPTO_ACOMP_REQ_DST_NONDMA );
357386}
@@ -374,6 +403,7 @@ static inline void acomp_request_set_src_sg(struct acomp_req *req,
374403
375404 req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_NONDMA ;
376405 req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_VIRT ;
406+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_FOLIO ;
377407}
378408
379409/**
@@ -393,6 +423,7 @@ static inline void acomp_request_set_src_dma(struct acomp_req *req,
393423 req -> slen = slen ;
394424
395425 req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_NONDMA ;
426+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_FOLIO ;
396427 req -> base .flags |= CRYPTO_ACOMP_REQ_SRC_VIRT ;
397428}
398429
@@ -413,10 +444,34 @@ static inline void acomp_request_set_src_nondma(struct acomp_req *req,
413444 req -> svirt = src ;
414445 req -> slen = slen ;
415446
447+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_SRC_FOLIO ;
416448 req -> base .flags |= CRYPTO_ACOMP_REQ_SRC_NONDMA ;
417449 req -> base .flags |= CRYPTO_ACOMP_REQ_SRC_VIRT ;
418450}
419451
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+
420475/**
421476 * acomp_request_set_dst_sg() -- Sets destination scatterlist
422477 *
@@ -435,6 +490,7 @@ static inline void acomp_request_set_dst_sg(struct acomp_req *req,
435490
436491 req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_NONDMA ;
437492 req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_VIRT ;
493+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_FOLIO ;
438494}
439495
440496/**
@@ -454,6 +510,7 @@ static inline void acomp_request_set_dst_dma(struct acomp_req *req,
454510 req -> dlen = dlen ;
455511
456512 req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_NONDMA ;
513+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_FOLIO ;
457514 req -> base .flags |= CRYPTO_ACOMP_REQ_DST_VIRT ;
458515}
459516
@@ -473,10 +530,34 @@ static inline void acomp_request_set_dst_nondma(struct acomp_req *req,
473530 req -> dvirt = dst ;
474531 req -> dlen = dlen ;
475532
533+ req -> base .flags &= ~CRYPTO_ACOMP_REQ_DST_FOLIO ;
476534 req -> base .flags |= CRYPTO_ACOMP_REQ_DST_NONDMA ;
477535 req -> base .flags |= CRYPTO_ACOMP_REQ_DST_VIRT ;
478536}
479537
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+
480561static inline void acomp_request_chain (struct acomp_req * req ,
481562 struct acomp_req * head )
482563{
0 commit comments