Linux-libre 4.19.123-gnu
[librecmc/linux-libre.git] / drivers / infiniband / hw / hfi1 / pio_copy.c
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  * @pbuf: a number of blocks allocated within a PIO send context
59  * @pbc: PBC to send
60  * @from: source, must be 8 byte aligned
61  * @count: number of DWORD (32-bit) quantities to copy from source
62  *
63  * Copy data from source to PIO Send Buffer memory, 8 bytes at a time.
64  * Must always write full BLOCK_SIZE bytes blocks.  The first block must
65  * be written to the corresponding SOP=1 address.
66  *
67  * Known:
68  * o pbuf->start always starts on a block boundary
69  * o pbuf can wrap only at a block boundary
70  */
71 void pio_copy(struct hfi1_devdata *dd, struct pio_buf *pbuf, u64 pbc,
72               const void *from, size_t count)
73 {
74         void __iomem *dest = pbuf->start + SOP_DISTANCE;
75         void __iomem *send = dest + PIO_BLOCK_SIZE;
76         void __iomem *dend;                     /* 8-byte data end */
77
78         /* write the PBC */
79         writeq(pbc, dest);
80         dest += sizeof(u64);
81
82         /* calculate where the QWORD data ends - in SOP=1 space */
83         dend = dest + ((count >> 1) * sizeof(u64));
84
85         if (dend < send) {
86                 /*
87                  * all QWORD data is within the SOP block, does *not*
88                  * reach the end of the SOP block
89                  */
90
91                 while (dest < dend) {
92                         writeq(*(u64 *)from, dest);
93                         from += sizeof(u64);
94                         dest += sizeof(u64);
95                 }
96                 /*
97                  * No boundary checks are needed here:
98                  * 0. We're not on the SOP block boundary
99                  * 1. The possible DWORD dangle will still be within
100                  *    the SOP block
101                  * 2. We cannot wrap except on a block boundary.
102                  */
103         } else {
104                 /* QWORD data extends _to_ or beyond the SOP block */
105
106                 /* write 8-byte SOP chunk data */
107                 while (dest < send) {
108                         writeq(*(u64 *)from, dest);
109                         from += sizeof(u64);
110                         dest += sizeof(u64);
111                 }
112                 /* drop out of the SOP range */
113                 dest -= SOP_DISTANCE;
114                 dend -= SOP_DISTANCE;
115
116                 /*
117                  * If the wrap comes before or matches the data end,
118                  * copy until until the wrap, then wrap.
119                  *
120                  * If the data ends at the end of the SOP above and
121                  * the buffer wraps, then pbuf->end == dend == dest
122                  * and nothing will get written, but we will wrap in
123                  * case there is a dangling DWORD.
124                  */
125                 if (pbuf->end <= dend) {
126                         while (dest < pbuf->end) {
127                                 writeq(*(u64 *)from, dest);
128                                 from += sizeof(u64);
129                                 dest += sizeof(u64);
130                         }
131
132                         dest -= pbuf->sc->size;
133                         dend -= pbuf->sc->size;
134                 }
135
136                 /* write 8-byte non-SOP, non-wrap chunk data */
137                 while (dest < dend) {
138                         writeq(*(u64 *)from, dest);
139                         from += sizeof(u64);
140                         dest += sizeof(u64);
141                 }
142         }
143         /* at this point we have wrapped if we are going to wrap */
144
145         /* write dangling u32, if any */
146         if (count & 1) {
147                 union mix val;
148
149                 val.val64 = 0;
150                 val.val32[0] = *(u32 *)from;
151                 writeq(val.val64, dest);
152                 dest += sizeof(u64);
153         }
154         /*
155          * fill in rest of block, no need to check pbuf->end
156          * as we only wrap on a block boundary
157          */
158         while (((unsigned long)dest & PIO_BLOCK_MASK) != 0) {
159                 writeq(0, dest);
160                 dest += sizeof(u64);
161         }
162
163         /* finished with this buffer */
164         this_cpu_dec(*pbuf->sc->buffers_allocated);
165         preempt_enable();
166 }
167
168 /*
169  * Handle carry bytes using shifts and masks.
170  *
171  * NOTE: the value the unused portion of carry is expected to always be zero.
172  */
173
174 /*
175  * "zero" shift - bit shift used to zero out upper bytes.  Input is
176  * the count of LSB bytes to preserve.
177  */
178 #define zshift(x) (8 * (8 - (x)))
179
180 /*
181  * "merge" shift - bit shift used to merge with carry bytes.  Input is
182  * the LSB byte count to move beyond.
183  */
184 #define mshift(x) (8 * (x))
185
186 /*
187  * Jump copy - no-loop copy for < 8 bytes.
188  */
189 static inline void jcopy(u8 *dest, const u8 *src, u32 n)
190 {
191         switch (n) {
192         case 7:
193                 *dest++ = *src++;
194                 /* fall through */
195         case 6:
196                 *dest++ = *src++;
197                 /* fall through */
198         case 5:
199                 *dest++ = *src++;
200                 /* fall through */
201         case 4:
202                 *dest++ = *src++;
203                 /* fall through */
204         case 3:
205                 *dest++ = *src++;
206                 /* fall through */
207         case 2:
208                 *dest++ = *src++;
209                 /* fall through */
210         case 1:
211                 *dest++ = *src++;
212                 /* fall through */
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  */
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  */
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  */
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  */
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  */
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  */
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  */
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  */
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  */
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  */
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 }