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 void 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()
83 static inline void blkcipher_done_fast(struct blkcipher_walk *walk, in blkcipher_done_fast() argument
86 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_done_fast()
87 blkcipher_map_dst(walk); in blkcipher_done_fast()
88 memcpy(walk->dst.virt.addr, walk->page, n); in blkcipher_done_fast()
89 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
90 } else if (!(walk->flags & BLKCIPHER_WALK_PHYS)) { in blkcipher_done_fast()
91 if (walk->flags & BLKCIPHER_WALK_DIFF) in blkcipher_done_fast()
92 blkcipher_unmap_dst(walk); in blkcipher_done_fast()
93 blkcipher_unmap_src(walk); in blkcipher_done_fast()
96 scatterwalk_advance(&walk->in, n); in blkcipher_done_fast()
97 scatterwalk_advance(&walk->out, n); in blkcipher_done_fast()
101 struct blkcipher_walk *walk, int err) in blkcipher_walk_done() argument
109 n = walk->nbytes - err; in blkcipher_walk_done()
110 walk->total -= n; in blkcipher_walk_done()
111 more = (walk->total != 0); in blkcipher_walk_done()
113 if (likely(!(walk->flags & BLKCIPHER_WALK_SLOW))) { in blkcipher_walk_done()
114 blkcipher_done_fast(walk, n); in blkcipher_walk_done()
121 blkcipher_done_slow(walk, n); in blkcipher_walk_done()
124 scatterwalk_done(&walk->in, 0, more); in blkcipher_walk_done()
125 scatterwalk_done(&walk->out, 1, more); in blkcipher_walk_done()
129 return blkcipher_walk_next(desc, walk); in blkcipher_walk_done()
133 walk->nbytes = 0; in blkcipher_walk_done()
134 if (walk->iv != desc->info) in blkcipher_walk_done()
135 memcpy(desc->info, walk->iv, walk->ivsize); in blkcipher_walk_done()
136 if (walk->buffer != walk->page) in blkcipher_walk_done()
137 kfree(walk->buffer); in blkcipher_walk_done()
138 if (walk->page) in blkcipher_walk_done()
139 free_page((unsigned long)walk->page); in blkcipher_walk_done()
145 struct blkcipher_walk *walk, in blkcipher_next_slow() argument
152 if (walk->buffer) in blkcipher_next_slow()
155 walk->buffer = walk->page; in blkcipher_next_slow()
156 if (walk->buffer) in blkcipher_next_slow()
161 walk->buffer = kmalloc(n, GFP_ATOMIC); in blkcipher_next_slow()
162 if (!walk->buffer) in blkcipher_next_slow()
163 return blkcipher_walk_done(desc, walk, -ENOMEM); in blkcipher_next_slow()
166 walk->dst.virt.addr = (u8 *)ALIGN((unsigned long)walk->buffer, in blkcipher_next_slow()
168 walk->dst.virt.addr = blkcipher_get_spot(walk->dst.virt.addr, bsize); in blkcipher_next_slow()
169 walk->src.virt.addr = blkcipher_get_spot(walk->dst.virt.addr + in blkcipher_next_slow()
172 scatterwalk_copychunks(walk->src.virt.addr, &walk->in, bsize, 0); in blkcipher_next_slow()
174 walk->nbytes = bsize; in blkcipher_next_slow()
175 walk->flags |= BLKCIPHER_WALK_SLOW; in blkcipher_next_slow()
180 static inline int blkcipher_next_copy(struct blkcipher_walk *walk) in blkcipher_next_copy() argument
182 u8 *tmp = walk->page; in blkcipher_next_copy()
184 blkcipher_map_src(walk); in blkcipher_next_copy()
185 memcpy(tmp, walk->src.virt.addr, walk->nbytes); in blkcipher_next_copy()
186 blkcipher_unmap_src(walk); in blkcipher_next_copy()
188 walk->src.virt.addr = tmp; in blkcipher_next_copy()
189 walk->dst.virt.addr = tmp; in blkcipher_next_copy()
195 struct blkcipher_walk *walk) in blkcipher_next_fast() argument
199 walk->src.phys.page = scatterwalk_page(&walk->in); in blkcipher_next_fast()
200 walk->src.phys.offset = offset_in_page(walk->in.offset); in blkcipher_next_fast()
201 walk->dst.phys.page = scatterwalk_page(&walk->out); in blkcipher_next_fast()
202 walk->dst.phys.offset = offset_in_page(walk->out.offset); in blkcipher_next_fast()
204 if (walk->flags & BLKCIPHER_WALK_PHYS) in blkcipher_next_fast()
207 diff = walk->src.phys.offset - walk->dst.phys.offset; in blkcipher_next_fast()
208 diff |= walk->src.virt.page - walk->dst.virt.page; in blkcipher_next_fast()
210 blkcipher_map_src(walk); in blkcipher_next_fast()
211 walk->dst.virt.addr = walk->src.virt.addr; in blkcipher_next_fast()
214 walk->flags |= BLKCIPHER_WALK_DIFF; in blkcipher_next_fast()
215 blkcipher_map_dst(walk); in blkcipher_next_fast()
222 struct blkcipher_walk *walk) in blkcipher_walk_next() argument
228 n = walk->total; in blkcipher_walk_next()
229 if (unlikely(n < walk->cipher_blocksize)) { in blkcipher_walk_next()
231 return blkcipher_walk_done(desc, walk, -EINVAL); in blkcipher_walk_next()
234 bsize = min(walk->walk_blocksize, n); 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 n = scatterwalk_clamp(&walk->in, n); in blkcipher_walk_next()
249 n = scatterwalk_clamp(&walk->out, n); in blkcipher_walk_next()
252 err = blkcipher_next_slow(desc, walk, bsize, walk->alignmask); in blkcipher_walk_next()
256 walk->nbytes = n; in blkcipher_walk_next()
257 if (walk->flags & BLKCIPHER_WALK_COPY) { in blkcipher_walk_next()
258 err = blkcipher_next_copy(walk); in blkcipher_walk_next()
262 return blkcipher_next_fast(desc, walk); in blkcipher_walk_next()
265 if (walk->flags & BLKCIPHER_WALK_PHYS) { in blkcipher_walk_next()
266 walk->src.phys.page = virt_to_page(walk->src.virt.addr); in blkcipher_walk_next()
267 walk->dst.phys.page = virt_to_page(walk->dst.virt.addr); in blkcipher_walk_next()
268 walk->src.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
269 walk->dst.phys.offset &= PAGE_SIZE - 1; in blkcipher_walk_next()
274 static inline int blkcipher_copy_iv(struct blkcipher_walk *walk) in blkcipher_copy_iv() argument
276 unsigned bs = walk->walk_blocksize; in blkcipher_copy_iv()
277 unsigned aligned_bs = ALIGN(bs, walk->alignmask + 1); in blkcipher_copy_iv()
279 walk->ivsize + max(aligned_bs, walk->ivsize) - in blkcipher_copy_iv()
280 (walk->alignmask + 1); in blkcipher_copy_iv()
283 size += walk->alignmask & ~(crypto_tfm_ctx_alignment() - 1); in blkcipher_copy_iv()
284 walk->buffer = kmalloc(size, GFP_ATOMIC); in blkcipher_copy_iv()
285 if (!walk->buffer) in blkcipher_copy_iv()
288 iv = (u8 *)ALIGN((unsigned long)walk->buffer, walk->alignmask + 1); in blkcipher_copy_iv()
291 iv = blkcipher_get_spot(iv, walk->ivsize); in blkcipher_copy_iv()
293 walk->iv = memcpy(iv, walk->iv, walk->ivsize); in blkcipher_copy_iv()
298 struct blkcipher_walk *walk) in blkcipher_walk_virt() argument
300 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt()
301 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt()
302 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_virt()
303 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt()
304 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt()
305 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt()
310 struct blkcipher_walk *walk) in blkcipher_walk_phys() argument
312 walk->flags |= BLKCIPHER_WALK_PHYS; in blkcipher_walk_phys()
313 walk->walk_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_phys()
314 walk->cipher_blocksize = walk->walk_blocksize; in blkcipher_walk_phys()
315 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_phys()
316 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_phys()
317 return blkcipher_walk_first(desc, walk); in blkcipher_walk_phys()
322 struct blkcipher_walk *walk) in blkcipher_walk_first() argument
327 walk->iv = desc->info; in blkcipher_walk_first()
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 if (unlikely(((unsigned long)walk->iv & walk->alignmask))) { in blkcipher_walk_first()
334 int err = blkcipher_copy_iv(walk); in blkcipher_walk_first()
339 scatterwalk_start(&walk->in, walk->in.sg); in blkcipher_walk_first()
340 scatterwalk_start(&walk->out, walk->out.sg); in blkcipher_walk_first()
341 walk->page = NULL; in blkcipher_walk_first()
343 return blkcipher_walk_next(desc, walk); in blkcipher_walk_first()
347 struct blkcipher_walk *walk, in blkcipher_walk_virt_block() argument
350 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_walk_virt_block()
351 walk->walk_blocksize = blocksize; in blkcipher_walk_virt_block()
352 walk->cipher_blocksize = crypto_blkcipher_blocksize(desc->tfm); in blkcipher_walk_virt_block()
353 walk->ivsize = crypto_blkcipher_ivsize(desc->tfm); in blkcipher_walk_virt_block()
354 walk->alignmask = crypto_blkcipher_alignmask(desc->tfm); in blkcipher_walk_virt_block()
355 return blkcipher_walk_first(desc, walk); in blkcipher_walk_virt_block()
360 struct blkcipher_walk *walk, in blkcipher_aead_walk_virt_block() argument
364 walk->flags &= ~BLKCIPHER_WALK_PHYS; in blkcipher_aead_walk_virt_block()
365 walk->walk_blocksize = blocksize; in blkcipher_aead_walk_virt_block()
366 walk->cipher_blocksize = crypto_aead_blocksize(tfm); in blkcipher_aead_walk_virt_block()
367 walk->ivsize = crypto_aead_ivsize(tfm); in blkcipher_aead_walk_virt_block()
368 walk->alignmask = crypto_aead_alignmask(tfm); in blkcipher_aead_walk_virt_block()
369 return blkcipher_walk_first(desc, walk); in blkcipher_aead_walk_virt_block()