Lines Matching refs:walk
35 struct blkcipher_walk *walk);
37 struct blkcipher_walk *walk);
39 static inline void blkcipher_map_src(struct blkcipher_walk *walk) in blkcipher_map_src() argument
41 walk->src.virt.addr = scatterwalk_map(&walk->in); in blkcipher_map_src()
44 static inline void blkcipher_map_dst(struct blkcipher_walk *walk) in blkcipher_map_dst() argument
46 walk->dst.virt.addr = scatterwalk_map(&walk->out); in blkcipher_map_dst()
49 static inline void blkcipher_unmap_src(struct blkcipher_walk *walk) in blkcipher_unmap_src() argument
51 scatterwalk_unmap(walk->src.virt.addr); in blkcipher_unmap_src()
54 static inline void blkcipher_unmap_dst(struct blkcipher_walk *walk) in blkcipher_unmap_dst() argument
56 scatterwalk_unmap(walk->dst.virt.addr); in blkcipher_unmap_dst()
68 static inline void blkcipher_done_slow(struct blkcipher_walk *walk, in blkcipher_done_slow() argument
73 addr = (u8 *)ALIGN((unsigned long)walk->buffer, walk->alignmask + 1); in blkcipher_done_slow()
75 scatterwalk_copychunks(addr, &walk->out, bsize, 1); in blkcipher_done_slow()
78 static inline void blkcipher_done_fast(struct blkcipher_walk *walk, in blkcipher_done_fast() argument
81 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_done_fast()
82 blkcipher_map_dst(walk); in blkcipher_done_fast()
83 memcpy(walk->dst.virt.addr, walk->page, n); in blkcipher_done_fast()
84 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
85 } else if (!(walk->flags & BLKCIPHER_WALK_PHYS)) { in blkcipher_done_fast()
86 if (walk->flags & BLKCIPHER_WALK_DIFF) in blkcipher_done_fast()
87 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
88 blkcipher_unmap_src(walk); in blkcipher_done_fast()
91 scatterwalk_advance(&walk->in, n); in blkcipher_done_fast()
92 scatterwalk_advance(&walk->out, n); in blkcipher_done_fast()
96 struct blkcipher_walk *walk, int err) in blkcipher_walk_done() argument
104 n = walk->nbytes - err; in blkcipher_walk_done()
105 walk->total -= n; in blkcipher_walk_done()
106 more = (walk->total != 0); in blkcipher_walk_done()
108 if (likely(!(walk->flags & BLKCIPHER_WALK_SLOW))) { in blkcipher_walk_done()
109 blkcipher_done_fast(walk, n); in blkcipher_walk_done()
116 blkcipher_done_slow(walk, n); in blkcipher_walk_done()
119 scatterwalk_done(&walk->in, 0, more); in blkcipher_walk_done()
120 scatterwalk_done(&walk->out, 1, more); in blkcipher_walk_done()
124 return blkcipher_walk_next(desc, walk); in blkcipher_walk_done()
128 walk->nbytes = 0; in blkcipher_walk_done()
129 if (walk->iv != desc->info) in blkcipher_walk_done()
130 memcpy(desc->info, walk->iv, walk->ivsize); in blkcipher_walk_done()
131 if (walk->buffer != walk->page) in blkcipher_walk_done()
132 kfree(walk->buffer); in blkcipher_walk_done()
133 if (walk->page) in blkcipher_walk_done()
134 free_page((unsigned long)walk->page); in blkcipher_walk_done()
140 struct blkcipher_walk *walk, in blkcipher_next_slow() argument
147 if (walk->buffer) in blkcipher_next_slow()
150 walk->buffer = walk->page; in blkcipher_next_slow()
151 if (walk->buffer) in blkcipher_next_slow()
156 walk->buffer = kmalloc(n, GFP_ATOMIC); in blkcipher_next_slow()
157 if (!walk->buffer) in blkcipher_next_slow()
158 return blkcipher_walk_done(desc, walk, -ENOMEM); in blkcipher_next_slow()
161 walk->dst.virt.addr = (u8 *)ALIGN((unsigned long)walk->buffer, in blkcipher_next_slow()
163 walk->dst.virt.addr = blkcipher_get_spot(walk->dst.virt.addr, bsize); in blkcipher_next_slow()
164 walk->src.virt.addr = blkcipher_get_spot(walk->dst.virt.addr + in blkcipher_next_slow()
167 scatterwalk_copychunks(walk->src.virt.addr, &walk->in, bsize, 0); in blkcipher_next_slow()
169 walk->nbytes = bsize; in blkcipher_next_slow()
170 walk->flags |= BLKCIPHER_WALK_SLOW; in blkcipher_next_slow()
175 static inline int blkcipher_next_copy(struct blkcipher_walk *walk) in blkcipher_next_copy() argument
177 u8 *tmp = walk->page; in blkcipher_next_copy()
179 blkcipher_map_src(walk); in blkcipher_next_copy()
180 memcpy(tmp, walk->src.virt.addr, walk->nbytes); in blkcipher_next_copy()
181 blkcipher_unmap_src(walk); in blkcipher_next_copy()
183 walk->src.virt.addr = tmp; in blkcipher_next_copy()
184 walk->dst.virt.addr = tmp; in blkcipher_next_copy()
190 struct blkcipher_walk *walk) in blkcipher_next_fast() argument
194 walk->src.phys.page = scatterwalk_page(&walk->in); in blkcipher_next_fast()
195 walk->src.phys.offset = offset_in_page(walk->in.offset); in blkcipher_next_fast()
196 walk->dst.phys.page = scatterwalk_page(&walk->out); in blkcipher_next_fast()
197 walk->dst.phys.offset = offset_in_page(walk->out.offset); in blkcipher_next_fast()
199 if (walk->flags & BLKCIPHER_WALK_PHYS) in blkcipher_next_fast()
202 diff = walk->src.phys.offset - walk->dst.phys.offset; in blkcipher_next_fast()
203 diff |= walk->src.virt.page - walk->dst.virt.page; in blkcipher_next_fast()
205 blkcipher_map_src(walk); in blkcipher_next_fast()
206 walk->dst.virt.addr = walk->src.virt.addr; in blkcipher_next_fast()
209 walk->flags |= BLKCIPHER_WALK_DIFF; in blkcipher_next_fast()
210 blkcipher_map_dst(walk); in blkcipher_next_fast()
217 struct blkcipher_walk *walk) in blkcipher_walk_next() argument
223 n = walk->total; in blkcipher_walk_next()
224 if (unlikely(n < walk->cipher_blocksize)) { in blkcipher_walk_next()
226 return blkcipher_walk_done(desc, walk, -EINVAL); in blkcipher_walk_next()
229 bsize = min(walk->walk_blocksize, n); in blkcipher_walk_next()
231 walk->flags &= ~(BLKCIPHER_WALK_SLOW | BLKCIPHER_WALK_COPY | in blkcipher_walk_next()
233 if (!scatterwalk_aligned(&walk->in, walk->alignmask) || in blkcipher_walk_next()
234 !scatterwalk_aligned(&walk->out, walk->alignmask)) { in blkcipher_walk_next()
235 walk->flags |= BLKCIPHER_WALK_COPY; in blkcipher_walk_next()
236 if (!walk->page) { in blkcipher_walk_next()
237 walk->page = (void *)__get_free_page(GFP_ATOMIC); in blkcipher_walk_next()
238 if (!walk->page) in blkcipher_walk_next()
243 n = scatterwalk_clamp(&walk->in, n); in blkcipher_walk_next()
244 n = scatterwalk_clamp(&walk->out, n); in blkcipher_walk_next()
247 err = blkcipher_next_slow(desc, walk, bsize, walk->alignmask); in blkcipher_walk_next()
251 walk->nbytes = n; in blkcipher_walk_next()
252 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_walk_next()
253 err = blkcipher_next_copy(walk); in blkcipher_walk_next()
257 return blkcipher_next_fast(desc, walk); in blkcipher_walk_next()
260 if (walk->flags & BLKCIPHER_WALK_PHYS) { in blkcipher_walk_next()
261 walk->src.phys.page = virt_to_page(walk->src.virt.addr); in blkcipher_walk_next()
262 walk->dst.phys.page = virt_to_page(walk->dst.virt.addr); in blkcipher_walk_next()
263 walk->src.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
264 walk->dst.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
269 static inline int blkcipher_copy_iv(struct blkcipher_walk *walk) in blkcipher_copy_iv() argument
271 unsigned bs = walk->walk_blocksize; in blkcipher_copy_iv()
272 unsigned aligned_bs = ALIGN(bs, walk->alignmask + 1); in blkcipher_copy_iv()
274 walk->ivsize + max(aligned_bs, walk->ivsize) - in blkcipher_copy_iv()
275 (walk->alignmask + 1); in blkcipher_copy_iv()
278 size += walk->alignmask & ~(crypto_tfm_ctx_alignment() - 1); in blkcipher_copy_iv()
279 walk->buffer = kmalloc(size, GFP_ATOMIC); in blkcipher_copy_iv()
280 if (!walk->buffer) in blkcipher_copy_iv()
283 iv = (u8 *)ALIGN((unsigned long)walk->buffer, walk->alignmask + 1); in blkcipher_copy_iv()
286 iv = blkcipher_get_spot(iv, walk->ivsize); in blkcipher_copy_iv()
288 walk->iv = memcpy(iv, walk->iv, walk->ivsize); in blkcipher_copy_iv()
293 struct blkcipher_walk *walk) in blkcipher_walk_virt() argument
295 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt()
296 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt()
297 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_virt()
298 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt()
299 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt()
300 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt()
305 struct blkcipher_walk *walk) in blkcipher_walk_phys() argument
307 walk->flags |= BLKCIPHER_WALK_PHYS; in blkcipher_walk_phys()
308 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_phys()
309 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_phys()
310 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_phys()
311 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_phys()
312 return blkcipher_walk_first(desc, walk); in blkcipher_walk_phys()
317 struct blkcipher_walk *walk) in blkcipher_walk_first() argument
322 walk->iv = desc->info; in blkcipher_walk_first()
323 walk->nbytes = walk->total; in blkcipher_walk_first()
324 if (unlikely(!walk->total)) in blkcipher_walk_first()
327 walk->buffer = NULL; in blkcipher_walk_first()
328 if (unlikely(((unsigned long)walk->iv & walk->alignmask))) { in blkcipher_walk_first()
329 int err = blkcipher_copy_iv(walk); in blkcipher_walk_first()
334 scatterwalk_start(&walk->in, walk->in.sg); in blkcipher_walk_first()
335 scatterwalk_start(&walk->out, walk->out.sg); in blkcipher_walk_first()
336 walk->page = NULL; in blkcipher_walk_first()
338 return blkcipher_walk_next(desc, walk); in blkcipher_walk_first()
342 struct blkcipher_walk *walk, in blkcipher_walk_virt_block() argument
345 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt_block()
346 walk->walk_blocksize = blocksize; in blkcipher_walk_virt_block()
347 walk->cipher_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt_block()
348 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt_block()
349 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt_block()
350 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt_block()
355 struct blkcipher_walk *walk, in blkcipher_aead_walk_virt_block() argument
359 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_aead_walk_virt_block()
360 walk->walk_blocksize = blocksize; in blkcipher_aead_walk_virt_block()
361 walk->cipher_blocksize = crypto_aead_blocksize(tfm); in blkcipher_aead_walk_virt_block()
362 walk->ivsize = crypto_aead_ivsize(tfm); in blkcipher_aead_walk_virt_block()
363 walk->alignmask = crypto_aead_alignmask(tfm); in blkcipher_aead_walk_virt_block()
364 return blkcipher_walk_first(desc, walk); in blkcipher_aead_walk_virt_block()