1 /*
2  * Copyright(c) 2015, 2016 Intel Corporation.
3  *
4  * This file is provided under a dual BSD/GPLv2 license.  When using or
5  * redistributing this file, you may do so under either license.
6  *
7  * GPL LICENSE SUMMARY
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of version 2 of the GNU General Public License as
11  * published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * BSD LICENSE
19  *
20  * Redistribution and use in source and binary forms, with or without
21  * modification, are permitted provided that the following conditions
22  * are met:
23  *
24  *  - Redistributions of source code must retain the above copyright
25  *    notice, this list of conditions and the following disclaimer.
26  *  - Redistributions in binary form must reproduce the above copyright
27  *    notice, this list of conditions and the following disclaimer in
28  *    the documentation and/or other materials provided with the
29  *    distribution.
30  *  - Neither the name of Intel Corporation nor the names of its
31  *    contributors may be used to endorse or promote products derived
32  *    from this software without specific prior written permission.
33  *
34  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
38  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
39  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
40  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
42  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45  *
46  */
47 
48 #include "hfi.h"
49 
50 /* additive distance between non-SOP and SOP space */
51 #define SOP_DISTANCE (TXE_PIO_SIZE / 2)
52 #define PIO_BLOCK_MASK (PIO_BLOCK_SIZE - 1)
53 /* number of QUADWORDs in a block */
54 #define PIO_BLOCK_QWS (PIO_BLOCK_SIZE / sizeof(u64))
55 
56 /**
57  * pio_copy - copy data block to MMIO space
58  * @dd: hfi1 dev data
59  * @pbuf: a number of blocks allocated within a PIO send context
60  * @pbc: PBC to send
61  * @from: source, must be 8 byte aligned
62  * @count: number of DWORD (32-bit) quantities to copy from source
63  *
64  * Copy data from source to PIO Send Buffer memory, 8 bytes at a time.
65  * Must always write full BLOCK_SIZE bytes blocks.  The first block must
66  * be written to the corresponding SOP=1 address.
67  *
68  * Known:
69  * o pbuf->start always starts on a block boundary
70  * o pbuf can wrap only at a block boundary
71  */
pio_copy(struct hfi1_devdata * dd,struct pio_buf * pbuf,u64 pbc,const void * from,size_t count)72 void pio_copy(struct hfi1_devdata *dd, struct pio_buf *pbuf, u64 pbc,
73 	      const void *from, size_t count)
74 {
75 	void __iomem *dest = pbuf->start + SOP_DISTANCE;
76 	void __iomem *send = dest + PIO_BLOCK_SIZE;
77 	void __iomem *dend;			/* 8-byte data end */
78 
79 	/* write the PBC */
80 	writeq(pbc, dest);
81 	dest += sizeof(u64);
82 
83 	/* calculate where the QWORD data ends - in SOP=1 space */
84 	dend = dest + ((count >> 1) * sizeof(u64));
85 
86 	if (dend < send) {
87 		/*
88 		 * all QWORD data is within the SOP block, does *not*
89 		 * reach the end of the SOP block
90 		 */
91 
92 		while (dest < dend) {
93 			writeq(*(u64 *)from, dest);
94 			from += sizeof(u64);
95 			dest += sizeof(u64);
96 		}
97 		/*
98 		 * No boundary checks are needed here:
99 		 * 0. We're not on the SOP block boundary
100 		 * 1. The possible DWORD dangle will still be within
101 		 *    the SOP block
102 		 * 2. We cannot wrap except on a block boundary.
103 		 */
104 	} else {
105 		/* QWORD data extends _to_ or beyond the SOP block */
106 
107 		/* write 8-byte SOP chunk data */
108 		while (dest < send) {
109 			writeq(*(u64 *)from, dest);
110 			from += sizeof(u64);
111 			dest += sizeof(u64);
112 		}
113 		/* drop out of the SOP range */
114 		dest -= SOP_DISTANCE;
115 		dend -= SOP_DISTANCE;
116 
117 		/*
118 		 * If the wrap comes before or matches the data end,
119 		 * copy until until the wrap, then wrap.
120 		 *
121 		 * If the data ends at the end of the SOP above and
122 		 * the buffer wraps, then pbuf->end == dend == dest
123 		 * and nothing will get written, but we will wrap in
124 		 * case there is a dangling DWORD.
125 		 */
126 		if (pbuf->end <= dend) {
127 			while (dest < pbuf->end) {
128 				writeq(*(u64 *)from, dest);
129 				from += sizeof(u64);
130 				dest += sizeof(u64);
131 			}
132 
133 			dest -= pbuf->sc->size;
134 			dend -= pbuf->sc->size;
135 		}
136 
137 		/* write 8-byte non-SOP, non-wrap chunk data */
138 		while (dest < dend) {
139 			writeq(*(u64 *)from, dest);
140 			from += sizeof(u64);
141 			dest += sizeof(u64);
142 		}
143 	}
144 	/* at this point we have wrapped if we are going to wrap */
145 
146 	/* write dangling u32, if any */
147 	if (count & 1) {
148 		union mix val;
149 
150 		val.val64 = 0;
151 		val.val32[0] = *(u32 *)from;
152 		writeq(val.val64, dest);
153 		dest += sizeof(u64);
154 	}
155 	/*
156 	 * fill in rest of block, no need to check pbuf->end
157 	 * as we only wrap on a block boundary
158 	 */
159 	while (((unsigned long)dest & PIO_BLOCK_MASK) != 0) {
160 		writeq(0, dest);
161 		dest += sizeof(u64);
162 	}
163 
164 	/* finished with this buffer */
165 	this_cpu_dec(*pbuf->sc->buffers_allocated);
166 	preempt_enable();
167 }
168 
169 /*
170  * Handle carry bytes using shifts and masks.
171  *
172  * NOTE: the value the unused portion of carry is expected to always be zero.
173  */
174 
175 /*
176  * "zero" shift - bit shift used to zero out upper bytes.  Input is
177  * the count of LSB bytes to preserve.
178  */
179 #define zshift(x) (8 * (8 - (x)))
180 
181 /*
182  * "merge" shift - bit shift used to merge with carry bytes.  Input is
183  * the LSB byte count to move beyond.
184  */
185 #define mshift(x) (8 * (x))
186 
187 /*
188  * Jump copy - no-loop copy for < 8 bytes.
189  */
jcopy(u8 * dest,const u8 * src,u32 n)190 static inline void jcopy(u8 *dest, const u8 *src, u32 n)
191 {
192 	switch (n) {
193 	case 7:
194 		*dest++ = *src++;
195 		fallthrough;
196 	case 6:
197 		*dest++ = *src++;
198 		fallthrough;
199 	case 5:
200 		*dest++ = *src++;
201 		fallthrough;
202 	case 4:
203 		*dest++ = *src++;
204 		fallthrough;
205 	case 3:
206 		*dest++ = *src++;
207 		fallthrough;
208 	case 2:
209 		*dest++ = *src++;
210 		fallthrough;
211 	case 1:
212 		*dest++ = *src++;
213 	}
214 }
215 
216 /*
217  * Read nbytes from "from" and and place them in the low bytes
218  * of pbuf->carry.  Other bytes are left as-is.  Any previous
219  * value in pbuf->carry is lost.
220  *
221  * NOTES:
222  * o do not read from from if nbytes is zero
223  * o from may _not_ be u64 aligned.
224  */
read_low_bytes(struct pio_buf * pbuf,const void * from,unsigned int nbytes)225 static inline void read_low_bytes(struct pio_buf *pbuf, const void *from,
226 				  unsigned int nbytes)
227 {
228 	pbuf->carry.val64 = 0;
229 	jcopy(&pbuf->carry.val8[0], from, nbytes);
230 	pbuf->carry_bytes = nbytes;
231 }
232 
233 /*
234  * Read nbytes bytes from "from" and put them at the end of pbuf->carry.
235  * It is expected that the extra read does not overfill carry.
236  *
237  * NOTES:
238  * o from may _not_ be u64 aligned
239  * o nbytes may span a QW boundary
240  */
read_extra_bytes(struct pio_buf * pbuf,const void * from,unsigned int nbytes)241 static inline void read_extra_bytes(struct pio_buf *pbuf,
242 				    const void *from, unsigned int nbytes)
243 {
244 	jcopy(&pbuf->carry.val8[pbuf->carry_bytes], from, nbytes);
245 	pbuf->carry_bytes += nbytes;
246 }
247 
248 /*
249  * Write a quad word using parts of pbuf->carry and the next 8 bytes of src.
250  * Put the unused part of the next 8 bytes of src into the LSB bytes of
251  * pbuf->carry with the upper bytes zeroed..
252  *
253  * NOTES:
254  * o result must keep unused bytes zeroed
255  * o src must be u64 aligned
256  */
merge_write8(struct pio_buf * pbuf,void __iomem * dest,const void * src)257 static inline void merge_write8(
258 	struct pio_buf *pbuf,
259 	void __iomem *dest,
260 	const void *src)
261 {
262 	u64 new, temp;
263 
264 	new = *(u64 *)src;
265 	temp = pbuf->carry.val64 | (new << mshift(pbuf->carry_bytes));
266 	writeq(temp, dest);
267 	pbuf->carry.val64 = new >> zshift(pbuf->carry_bytes);
268 }
269 
270 /*
271  * Write a quad word using all bytes of carry.
272  */
carry8_write8(union mix carry,void __iomem * dest)273 static inline void carry8_write8(union mix carry, void __iomem *dest)
274 {
275 	writeq(carry.val64, dest);
276 }
277 
278 /*
279  * Write a quad word using all the valid bytes of carry.  If carry
280  * has zero valid bytes, nothing is written.
281  * Returns 0 on nothing written, non-zero on quad word written.
282  */
carry_write8(struct pio_buf * pbuf,void __iomem * dest)283 static inline int carry_write8(struct pio_buf *pbuf, void __iomem *dest)
284 {
285 	if (pbuf->carry_bytes) {
286 		/* unused bytes are always kept zeroed, so just write */
287 		writeq(pbuf->carry.val64, dest);
288 		return 1;
289 	}
290 
291 	return 0;
292 }
293 
294 /*
295  * Segmented PIO Copy - start
296  *
297  * Start a PIO copy.
298  *
299  * @pbuf: destination buffer
300  * @pbc: the PBC for the PIO buffer
301  * @from: data source, QWORD aligned
302  * @nbytes: bytes to copy
303  */
seg_pio_copy_start(struct pio_buf * pbuf,u64 pbc,const void * from,size_t nbytes)304 void seg_pio_copy_start(struct pio_buf *pbuf, u64 pbc,
305 			const void *from, size_t nbytes)
306 {
307 	void __iomem *dest = pbuf->start + SOP_DISTANCE;
308 	void __iomem *send = dest + PIO_BLOCK_SIZE;
309 	void __iomem *dend;			/* 8-byte data end */
310 
311 	writeq(pbc, dest);
312 	dest += sizeof(u64);
313 
314 	/* calculate where the QWORD data ends - in SOP=1 space */
315 	dend = dest + ((nbytes >> 3) * sizeof(u64));
316 
317 	if (dend < send) {
318 		/*
319 		 * all QWORD data is within the SOP block, does *not*
320 		 * reach the end of the SOP block
321 		 */
322 
323 		while (dest < dend) {
324 			writeq(*(u64 *)from, dest);
325 			from += sizeof(u64);
326 			dest += sizeof(u64);
327 		}
328 		/*
329 		 * No boundary checks are needed here:
330 		 * 0. We're not on the SOP block boundary
331 		 * 1. The possible DWORD dangle will still be within
332 		 *    the SOP block
333 		 * 2. We cannot wrap except on a block boundary.
334 		 */
335 	} else {
336 		/* QWORD data extends _to_ or beyond the SOP block */
337 
338 		/* write 8-byte SOP chunk data */
339 		while (dest < send) {
340 			writeq(*(u64 *)from, dest);
341 			from += sizeof(u64);
342 			dest += sizeof(u64);
343 		}
344 		/* drop out of the SOP range */
345 		dest -= SOP_DISTANCE;
346 		dend -= SOP_DISTANCE;
347 
348 		/*
349 		 * If the wrap comes before or matches the data end,
350 		 * copy until until the wrap, then wrap.
351 		 *
352 		 * If the data ends at the end of the SOP above and
353 		 * the buffer wraps, then pbuf->end == dend == dest
354 		 * and nothing will get written, but we will wrap in
355 		 * case there is a dangling DWORD.
356 		 */
357 		if (pbuf->end <= dend) {
358 			while (dest < pbuf->end) {
359 				writeq(*(u64 *)from, dest);
360 				from += sizeof(u64);
361 				dest += sizeof(u64);
362 			}
363 
364 			dest -= pbuf->sc->size;
365 			dend -= pbuf->sc->size;
366 		}
367 
368 		/* write 8-byte non-SOP, non-wrap chunk data */
369 		while (dest < dend) {
370 			writeq(*(u64 *)from, dest);
371 			from += sizeof(u64);
372 			dest += sizeof(u64);
373 		}
374 	}
375 	/* at this point we have wrapped if we are going to wrap */
376 
377 	/* ...but it doesn't matter as we're done writing */
378 
379 	/* save dangling bytes, if any */
380 	read_low_bytes(pbuf, from, nbytes & 0x7);
381 
382 	pbuf->qw_written = 1 /*PBC*/ + (nbytes >> 3);
383 }
384 
385 /*
386  * Mid copy helper, "mixed case" - source is 64-bit aligned but carry
387  * bytes are non-zero.
388  *
389  * Whole u64s must be written to the chip, so bytes must be manually merged.
390  *
391  * @pbuf: destination buffer
392  * @from: data source, is QWORD aligned.
393  * @nbytes: bytes to copy
394  *
395  * Must handle nbytes < 8.
396  */
mid_copy_mix(struct pio_buf * pbuf,const void * from,size_t nbytes)397 static void mid_copy_mix(struct pio_buf *pbuf, const void *from, size_t nbytes)
398 {
399 	void __iomem *dest = pbuf->start + (pbuf->qw_written * sizeof(u64));
400 	void __iomem *dend;			/* 8-byte data end */
401 	unsigned long qw_to_write = nbytes >> 3;
402 	unsigned long bytes_left = nbytes & 0x7;
403 
404 	/* calculate 8-byte data end */
405 	dend = dest + (qw_to_write * sizeof(u64));
406 
407 	if (pbuf->qw_written < PIO_BLOCK_QWS) {
408 		/*
409 		 * Still within SOP block.  We don't need to check for
410 		 * wrap because we are still in the first block and
411 		 * can only wrap on block boundaries.
412 		 */
413 		void __iomem *send;		/* SOP end */
414 		void __iomem *xend;
415 
416 		/*
417 		 * calculate the end of data or end of block, whichever
418 		 * comes first
419 		 */
420 		send = pbuf->start + PIO_BLOCK_SIZE;
421 		xend = min(send, dend);
422 
423 		/* shift up to SOP=1 space */
424 		dest += SOP_DISTANCE;
425 		xend += SOP_DISTANCE;
426 
427 		/* write 8-byte chunk data */
428 		while (dest < xend) {
429 			merge_write8(pbuf, dest, from);
430 			from += sizeof(u64);
431 			dest += sizeof(u64);
432 		}
433 
434 		/* shift down to SOP=0 space */
435 		dest -= SOP_DISTANCE;
436 	}
437 	/*
438 	 * At this point dest could be (either, both, or neither):
439 	 * - at dend
440 	 * - at the wrap
441 	 */
442 
443 	/*
444 	 * If the wrap comes before or matches the data end,
445 	 * copy until until the wrap, then wrap.
446 	 *
447 	 * If dest is at the wrap, we will fall into the if,
448 	 * not do the loop, when wrap.
449 	 *
450 	 * If the data ends at the end of the SOP above and
451 	 * the buffer wraps, then pbuf->end == dend == dest
452 	 * and nothing will get written.
453 	 */
454 	if (pbuf->end <= dend) {
455 		while (dest < pbuf->end) {
456 			merge_write8(pbuf, dest, from);
457 			from += sizeof(u64);
458 			dest += sizeof(u64);
459 		}
460 
461 		dest -= pbuf->sc->size;
462 		dend -= pbuf->sc->size;
463 	}
464 
465 	/* write 8-byte non-SOP, non-wrap chunk data */
466 	while (dest < dend) {
467 		merge_write8(pbuf, dest, from);
468 		from += sizeof(u64);
469 		dest += sizeof(u64);
470 	}
471 
472 	pbuf->qw_written += qw_to_write;
473 
474 	/* handle carry and left-over bytes */
475 	if (pbuf->carry_bytes + bytes_left >= 8) {
476 		unsigned long nread;
477 
478 		/* there is enough to fill another qw - fill carry */
479 		nread = 8 - pbuf->carry_bytes;
480 		read_extra_bytes(pbuf, from, nread);
481 
482 		/*
483 		 * One more write - but need to make sure dest is correct.
484 		 * Check for wrap and the possibility the write
485 		 * should be in SOP space.
486 		 *
487 		 * The two checks immediately below cannot both be true, hence
488 		 * the else. If we have wrapped, we cannot still be within the
489 		 * first block. Conversely, if we are still in the first block,
490 		 * we cannot have wrapped. We do the wrap check first as that
491 		 * is more likely.
492 		 */
493 		/* adjust if we have wrapped */
494 		if (dest >= pbuf->end)
495 			dest -= pbuf->sc->size;
496 		/* jump to the SOP range if within the first block */
497 		else if (pbuf->qw_written < PIO_BLOCK_QWS)
498 			dest += SOP_DISTANCE;
499 
500 		/* flush out full carry */
501 		carry8_write8(pbuf->carry, dest);
502 		pbuf->qw_written++;
503 
504 		/* now adjust and read the rest of the bytes into carry */
505 		bytes_left -= nread;
506 		from += nread; /* from is now not aligned */
507 		read_low_bytes(pbuf, from, bytes_left);
508 	} else {
509 		/* not enough to fill another qw, append the rest to carry */
510 		read_extra_bytes(pbuf, from, bytes_left);
511 	}
512 }
513 
514 /*
515  * Mid copy helper, "straight case" - source pointer is 64-bit aligned
516  * with no carry bytes.
517  *
518  * @pbuf: destination buffer
519  * @from: data source, is QWORD aligned
520  * @nbytes: bytes to copy
521  *
522  * Must handle nbytes < 8.
523  */
mid_copy_straight(struct pio_buf * pbuf,const void * from,size_t nbytes)524 static void mid_copy_straight(struct pio_buf *pbuf,
525 			      const void *from, size_t nbytes)
526 {
527 	void __iomem *dest = pbuf->start + (pbuf->qw_written * sizeof(u64));
528 	void __iomem *dend;			/* 8-byte data end */
529 
530 	/* calculate 8-byte data end */
531 	dend = dest + ((nbytes >> 3) * sizeof(u64));
532 
533 	if (pbuf->qw_written < PIO_BLOCK_QWS) {
534 		/*
535 		 * Still within SOP block.  We don't need to check for
536 		 * wrap because we are still in the first block and
537 		 * can only wrap on block boundaries.
538 		 */
539 		void __iomem *send;		/* SOP end */
540 		void __iomem *xend;
541 
542 		/*
543 		 * calculate the end of data or end of block, whichever
544 		 * comes first
545 		 */
546 		send = pbuf->start + PIO_BLOCK_SIZE;
547 		xend = min(send, dend);
548 
549 		/* shift up to SOP=1 space */
550 		dest += SOP_DISTANCE;
551 		xend += SOP_DISTANCE;
552 
553 		/* write 8-byte chunk data */
554 		while (dest < xend) {
555 			writeq(*(u64 *)from, dest);
556 			from += sizeof(u64);
557 			dest += sizeof(u64);
558 		}
559 
560 		/* shift down to SOP=0 space */
561 		dest -= SOP_DISTANCE;
562 	}
563 	/*
564 	 * At this point dest could be (either, both, or neither):
565 	 * - at dend
566 	 * - at the wrap
567 	 */
568 
569 	/*
570 	 * If the wrap comes before or matches the data end,
571 	 * copy until until the wrap, then wrap.
572 	 *
573 	 * If dest is at the wrap, we will fall into the if,
574 	 * not do the loop, when wrap.
575 	 *
576 	 * If the data ends at the end of the SOP above and
577 	 * the buffer wraps, then pbuf->end == dend == dest
578 	 * and nothing will get written.
579 	 */
580 	if (pbuf->end <= dend) {
581 		while (dest < pbuf->end) {
582 			writeq(*(u64 *)from, dest);
583 			from += sizeof(u64);
584 			dest += sizeof(u64);
585 		}
586 
587 		dest -= pbuf->sc->size;
588 		dend -= pbuf->sc->size;
589 	}
590 
591 	/* write 8-byte non-SOP, non-wrap chunk data */
592 	while (dest < dend) {
593 		writeq(*(u64 *)from, dest);
594 		from += sizeof(u64);
595 		dest += sizeof(u64);
596 	}
597 
598 	/* we know carry_bytes was zero on entry to this routine */
599 	read_low_bytes(pbuf, from, nbytes & 0x7);
600 
601 	pbuf->qw_written += nbytes >> 3;
602 }
603 
604 /*
605  * Segmented PIO Copy - middle
606  *
607  * Must handle any aligned tail and any aligned source with any byte count.
608  *
609  * @pbuf: a number of blocks allocated within a PIO send context
610  * @from: data source
611  * @nbytes: number of bytes to copy
612  */
seg_pio_copy_mid(struct pio_buf * pbuf,const void * from,size_t nbytes)613 void seg_pio_copy_mid(struct pio_buf *pbuf, const void *from, size_t nbytes)
614 {
615 	unsigned long from_align = (unsigned long)from & 0x7;
616 
617 	if (pbuf->carry_bytes + nbytes < 8) {
618 		/* not enough bytes to fill a QW */
619 		read_extra_bytes(pbuf, from, nbytes);
620 		return;
621 	}
622 
623 	if (from_align) {
624 		/* misaligned source pointer - align it */
625 		unsigned long to_align;
626 
627 		/* bytes to read to align "from" */
628 		to_align = 8 - from_align;
629 
630 		/*
631 		 * In the advance-to-alignment logic below, we do not need
632 		 * to check if we are using more than nbytes.  This is because
633 		 * if we are here, we already know that carry+nbytes will
634 		 * fill at least one QW.
635 		 */
636 		if (pbuf->carry_bytes + to_align < 8) {
637 			/* not enough align bytes to fill a QW */
638 			read_extra_bytes(pbuf, from, to_align);
639 			from += to_align;
640 			nbytes -= to_align;
641 		} else {
642 			/* bytes to fill carry */
643 			unsigned long to_fill = 8 - pbuf->carry_bytes;
644 			/* bytes left over to be read */
645 			unsigned long extra = to_align - to_fill;
646 			void __iomem *dest;
647 
648 			/* fill carry... */
649 			read_extra_bytes(pbuf, from, to_fill);
650 			from += to_fill;
651 			nbytes -= to_fill;
652 			/* may not be enough valid bytes left to align */
653 			if (extra > nbytes)
654 				extra = nbytes;
655 
656 			/* ...now write carry */
657 			dest = pbuf->start + (pbuf->qw_written * sizeof(u64));
658 
659 			/*
660 			 * The two checks immediately below cannot both be
661 			 * true, hence the else.  If we have wrapped, we
662 			 * cannot still be within the first block.
663 			 * Conversely, if we are still in the first block, we
664 			 * cannot have wrapped.  We do the wrap check first
665 			 * as that is more likely.
666 			 */
667 			/* adjust if we've wrapped */
668 			if (dest >= pbuf->end)
669 				dest -= pbuf->sc->size;
670 			/* jump to SOP range if within the first block */
671 			else if (pbuf->qw_written < PIO_BLOCK_QWS)
672 				dest += SOP_DISTANCE;
673 
674 			carry8_write8(pbuf->carry, dest);
675 			pbuf->qw_written++;
676 
677 			/* read any extra bytes to do final alignment */
678 			/* this will overwrite anything in pbuf->carry */
679 			read_low_bytes(pbuf, from, extra);
680 			from += extra;
681 			nbytes -= extra;
682 			/*
683 			 * If no bytes are left, return early - we are done.
684 			 * NOTE: This short-circuit is *required* because
685 			 * "extra" may have been reduced in size and "from"
686 			 * is not aligned, as required when leaving this
687 			 * if block.
688 			 */
689 			if (nbytes == 0)
690 				return;
691 		}
692 
693 		/* at this point, from is QW aligned */
694 	}
695 
696 	if (pbuf->carry_bytes)
697 		mid_copy_mix(pbuf, from, nbytes);
698 	else
699 		mid_copy_straight(pbuf, from, nbytes);
700 }
701 
702 /*
703  * Segmented PIO Copy - end
704  *
705  * Write any remainder (in pbuf->carry) and finish writing the whole block.
706  *
707  * @pbuf: a number of blocks allocated within a PIO send context
708  */
seg_pio_copy_end(struct pio_buf * pbuf)709 void seg_pio_copy_end(struct pio_buf *pbuf)
710 {
711 	void __iomem *dest = pbuf->start + (pbuf->qw_written * sizeof(u64));
712 
713 	/*
714 	 * The two checks immediately below cannot both be true, hence the
715 	 * else.  If we have wrapped, we cannot still be within the first
716 	 * block.  Conversely, if we are still in the first block, we
717 	 * cannot have wrapped.  We do the wrap check first as that is
718 	 * more likely.
719 	 */
720 	/* adjust if we have wrapped */
721 	if (dest >= pbuf->end)
722 		dest -= pbuf->sc->size;
723 	/* jump to the SOP range if within the first block */
724 	else if (pbuf->qw_written < PIO_BLOCK_QWS)
725 		dest += SOP_DISTANCE;
726 
727 	/* write final bytes, if any */
728 	if (carry_write8(pbuf, dest)) {
729 		dest += sizeof(u64);
730 		/*
731 		 * NOTE: We do not need to recalculate whether dest needs
732 		 * SOP_DISTANCE or not.
733 		 *
734 		 * If we are in the first block and the dangle write
735 		 * keeps us in the same block, dest will need
736 		 * to retain SOP_DISTANCE in the loop below.
737 		 *
738 		 * If we are in the first block and the dangle write pushes
739 		 * us to the next block, then loop below will not run
740 		 * and dest is not used.  Hence we do not need to update
741 		 * it.
742 		 *
743 		 * If we are past the first block, then SOP_DISTANCE
744 		 * was never added, so there is nothing to do.
745 		 */
746 	}
747 
748 	/* fill in rest of block */
749 	while (((unsigned long)dest & PIO_BLOCK_MASK) != 0) {
750 		writeq(0, dest);
751 		dest += sizeof(u64);
752 	}
753 
754 	/* finished with this buffer */
755 	this_cpu_dec(*pbuf->sc->buffers_allocated);
756 	preempt_enable();
757 }
758