Lines Matching refs:walk
40 struct blkcipher_walk *walk);
42 struct blkcipher_walk *walk);
44 static inline void blkcipher_map_src(struct blkcipher_walk *walk) in blkcipher_map_src() argument
46 walk->src.virt.addr = scatterwalk_map(&walk->in); in blkcipher_map_src()
49 static inline void blkcipher_map_dst(struct blkcipher_walk *walk) in blkcipher_map_dst() argument
51 walk->dst.virt.addr = scatterwalk_map(&walk->out); in blkcipher_map_dst()
54 static inline void blkcipher_unmap_src(struct blkcipher_walk *walk) in blkcipher_unmap_src() argument
56 scatterwalk_unmap(walk->src.virt.addr); in blkcipher_unmap_src()
59 static inline void blkcipher_unmap_dst(struct blkcipher_walk *walk) in blkcipher_unmap_dst() argument
61 scatterwalk_unmap(walk->dst.virt.addr); in blkcipher_unmap_dst()
73 static inline unsigned int blkcipher_done_slow(struct blkcipher_walk *walk, in blkcipher_done_slow() argument
78 addr = (u8 *)ALIGN((unsigned long)walk->buffer, walk->alignmask + 1); in blkcipher_done_slow()
80 scatterwalk_copychunks(addr, &walk->out, bsize, 1); in blkcipher_done_slow()
84 static inline unsigned int blkcipher_done_fast(struct blkcipher_walk *walk, in blkcipher_done_fast() argument
87 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_done_fast()
88 blkcipher_map_dst(walk); in blkcipher_done_fast()
89 memcpy(walk->dst.virt.addr, walk->page, n); in blkcipher_done_fast()
90 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
91 } else if (!(walk->flags & BLKCIPHER_WALK_PHYS)) { in blkcipher_done_fast()
92 if (walk->flags & BLKCIPHER_WALK_DIFF) in blkcipher_done_fast()
93 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
94 blkcipher_unmap_src(walk); in blkcipher_done_fast()
97 scatterwalk_advance(&walk->in, n); in blkcipher_done_fast()
98 scatterwalk_advance(&walk->out, n); in blkcipher_done_fast()
104 struct blkcipher_walk *walk, int err) in blkcipher_walk_done() argument
109 unsigned int n = walk->nbytes - err; in blkcipher_walk_done()
111 if (likely(!(walk->flags & BLKCIPHER_WALK_SLOW))) in blkcipher_walk_done()
112 n = blkcipher_done_fast(walk, n); in blkcipher_walk_done()
117 n = blkcipher_done_slow(walk, n); in blkcipher_walk_done()
119 nbytes = walk->total - n; in blkcipher_walk_done()
123 scatterwalk_done(&walk->in, 0, nbytes); in blkcipher_walk_done()
124 scatterwalk_done(&walk->out, 1, nbytes); in blkcipher_walk_done()
127 walk->total = nbytes; in blkcipher_walk_done()
128 walk->nbytes = nbytes; in blkcipher_walk_done()
132 return blkcipher_walk_next(desc, walk); in blkcipher_walk_done()
135 if (walk->iv != desc->info) in blkcipher_walk_done()
136 memcpy(desc->info, walk->iv, walk->ivsize); in blkcipher_walk_done()
137 if (walk->buffer != walk->page) in blkcipher_walk_done()
138 kfree(walk->buffer); in blkcipher_walk_done()
139 if (walk->page) in blkcipher_walk_done()
140 free_page((unsigned long)walk->page); in blkcipher_walk_done()
147 struct blkcipher_walk *walk, in blkcipher_next_slow() argument
154 if (walk->buffer) in blkcipher_next_slow()
157 walk->buffer = walk->page; in blkcipher_next_slow()
158 if (walk->buffer) in blkcipher_next_slow()
163 walk->buffer = kmalloc(n, GFP_ATOMIC); in blkcipher_next_slow()
164 if (!walk->buffer) in blkcipher_next_slow()
165 return blkcipher_walk_done(desc, walk, -ENOMEM); in blkcipher_next_slow()
168 walk->dst.virt.addr = (u8 *)ALIGN((unsigned long)walk->buffer, in blkcipher_next_slow()
170 walk->dst.virt.addr = blkcipher_get_spot(walk->dst.virt.addr, bsize); in blkcipher_next_slow()
171 walk->src.virt.addr = blkcipher_get_spot(walk->dst.virt.addr + in blkcipher_next_slow()
174 scatterwalk_copychunks(walk->src.virt.addr, &walk->in, bsize, 0); in blkcipher_next_slow()
176 walk->nbytes = bsize; in blkcipher_next_slow()
177 walk->flags |= BLKCIPHER_WALK_SLOW; in blkcipher_next_slow()
182 static inline int blkcipher_next_copy(struct blkcipher_walk *walk) in blkcipher_next_copy() argument
184 u8 *tmp = walk->page; in blkcipher_next_copy()
186 blkcipher_map_src(walk); in blkcipher_next_copy()
187 memcpy(tmp, walk->src.virt.addr, walk->nbytes); in blkcipher_next_copy()
188 blkcipher_unmap_src(walk); in blkcipher_next_copy()
190 walk->src.virt.addr = tmp; in blkcipher_next_copy()
191 walk->dst.virt.addr = tmp; in blkcipher_next_copy()
197 struct blkcipher_walk *walk) in blkcipher_next_fast() argument
201 walk->src.phys.page = scatterwalk_page(&walk->in); in blkcipher_next_fast()
202 walk->src.phys.offset = offset_in_page(walk->in.offset); in blkcipher_next_fast()
203 walk->dst.phys.page = scatterwalk_page(&walk->out); in blkcipher_next_fast()
204 walk->dst.phys.offset = offset_in_page(walk->out.offset); in blkcipher_next_fast()
206 if (walk->flags & BLKCIPHER_WALK_PHYS) in blkcipher_next_fast()
209 diff = walk->src.phys.offset - walk->dst.phys.offset; in blkcipher_next_fast()
210 diff |= walk->src.virt.page - walk->dst.virt.page; in blkcipher_next_fast()
212 blkcipher_map_src(walk); in blkcipher_next_fast()
213 walk->dst.virt.addr = walk->src.virt.addr; in blkcipher_next_fast()
216 walk->flags |= BLKCIPHER_WALK_DIFF; in blkcipher_next_fast()
217 blkcipher_map_dst(walk); in blkcipher_next_fast()
224 struct blkcipher_walk *walk) in blkcipher_walk_next() argument
230 n = walk->total; in blkcipher_walk_next()
231 if (unlikely(n < walk->cipher_blocksize)) { in blkcipher_walk_next()
233 return blkcipher_walk_done(desc, walk, -EINVAL); in blkcipher_walk_next()
236 walk->flags &= ~(BLKCIPHER_WALK_SLOW | BLKCIPHER_WALK_COPY | in blkcipher_walk_next()
238 if (!scatterwalk_aligned(&walk->in, walk->alignmask) || in blkcipher_walk_next()
239 !scatterwalk_aligned(&walk->out, walk->alignmask)) { in blkcipher_walk_next()
240 walk->flags |= BLKCIPHER_WALK_COPY; in blkcipher_walk_next()
241 if (!walk->page) { in blkcipher_walk_next()
242 walk->page = (void *)__get_free_page(GFP_ATOMIC); in blkcipher_walk_next()
243 if (!walk->page) in blkcipher_walk_next()
248 bsize = min(walk->walk_blocksize, n); in blkcipher_walk_next()
249 n = scatterwalk_clamp(&walk->in, n); in blkcipher_walk_next()
250 n = scatterwalk_clamp(&walk->out, n); in blkcipher_walk_next()
253 err = blkcipher_next_slow(desc, walk, bsize, walk->alignmask); in blkcipher_walk_next()
257 walk->nbytes = n; in blkcipher_walk_next()
258 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_walk_next()
259 err = blkcipher_next_copy(walk); in blkcipher_walk_next()
263 return blkcipher_next_fast(desc, walk); in blkcipher_walk_next()
266 if (walk->flags & BLKCIPHER_WALK_PHYS) { in blkcipher_walk_next()
267 walk->src.phys.page = virt_to_page(walk->src.virt.addr); in blkcipher_walk_next()
268 walk->dst.phys.page = virt_to_page(walk->dst.virt.addr); in blkcipher_walk_next()
269 walk->src.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
270 walk->dst.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
275 static inline int blkcipher_copy_iv(struct blkcipher_walk *walk) in blkcipher_copy_iv() argument
277 unsigned bs = walk->walk_blocksize; in blkcipher_copy_iv()
278 unsigned aligned_bs = ALIGN(bs, walk->alignmask + 1); in blkcipher_copy_iv()
280 walk->ivsize + max(aligned_bs, walk->ivsize) - in blkcipher_copy_iv()
281 (walk->alignmask + 1); in blkcipher_copy_iv()
284 size += walk->alignmask & ~(crypto_tfm_ctx_alignment() - 1); in blkcipher_copy_iv()
285 walk->buffer = kmalloc(size, GFP_ATOMIC); in blkcipher_copy_iv()
286 if (!walk->buffer) in blkcipher_copy_iv()
289 iv = (u8 *)ALIGN((unsigned long)walk->buffer, walk->alignmask + 1); in blkcipher_copy_iv()
292 iv = blkcipher_get_spot(iv, walk->ivsize); in blkcipher_copy_iv()
294 walk->iv = memcpy(iv, walk->iv, walk->ivsize); in blkcipher_copy_iv()
299 struct blkcipher_walk *walk) in blkcipher_walk_virt() argument
301 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt()
302 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt()
303 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_virt()
304 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt()
305 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt()
306 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt()
311 struct blkcipher_walk *walk) in blkcipher_walk_phys() argument
313 walk->flags |= BLKCIPHER_WALK_PHYS; in blkcipher_walk_phys()
314 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_phys()
315 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_phys()
316 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_phys()
317 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_phys()
318 return blkcipher_walk_first(desc, walk); in blkcipher_walk_phys()
323 struct blkcipher_walk *walk) in blkcipher_walk_first() argument
328 walk->nbytes = walk->total; in blkcipher_walk_first()
329 if (unlikely(!walk->total)) in blkcipher_walk_first()
332 walk->buffer = NULL; in blkcipher_walk_first()
333 walk->iv = desc->info; in blkcipher_walk_first()
334 if (unlikely(((unsigned long)walk->iv & walk->alignmask))) { in blkcipher_walk_first()
335 int err = blkcipher_copy_iv(walk); in blkcipher_walk_first()
340 scatterwalk_start(&walk->in, walk->in.sg); in blkcipher_walk_first()
341 scatterwalk_start(&walk->out, walk->out.sg); in blkcipher_walk_first()
342 walk->page = NULL; in blkcipher_walk_first()
344 return blkcipher_walk_next(desc, walk); in blkcipher_walk_first()
348 struct blkcipher_walk *walk, in blkcipher_walk_virt_block() argument
351 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt_block()
352 walk->walk_blocksize = blocksize; in blkcipher_walk_virt_block()
353 walk->cipher_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt_block()
354 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt_block()
355 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt_block()
356 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt_block()
361 struct blkcipher_walk *walk, in blkcipher_aead_walk_virt_block() argument
365 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_aead_walk_virt_block()
366 walk->walk_blocksize = blocksize; in blkcipher_aead_walk_virt_block()
367 walk->cipher_blocksize = crypto_aead_blocksize(tfm); in blkcipher_aead_walk_virt_block()
368 walk->ivsize = crypto_aead_ivsize(tfm); in blkcipher_aead_walk_virt_block()
369 walk->alignmask = crypto_aead_alignmask(tfm); in blkcipher_aead_walk_virt_block()
370 return blkcipher_walk_first(desc, walk); in blkcipher_aead_walk_virt_block()