1/* SPDX-License-Identifier: GPL-2.0-or-later */
2
3/* low-level asm for "intrigue" (PA8500-8700 CPU perf counters)
4 *
5 * Copyright (C) 2001 Randolph Chung <tausq at parisc-linux.org>
6 * Copyright (C) 2001 Hewlett-Packard (Grant Grundler)
7 */
8
9#include <asm/assembly.h>
10
11#include <linux/init.h>
12#include <linux/linkage.h>
13
14#ifdef CONFIG_64BIT
15 .level 2.0w
16#endif /* CONFIG_64BIT */
17
18#define MTDIAG_1(gr) .word 0x14201840 + gr*0x10000
19#define MTDIAG_2(gr) .word 0x14401840 + gr*0x10000
20#define MFDIAG_1(gr) .word 0x142008A0 + gr
21#define MFDIAG_2(gr) .word 0x144008A0 + gr
22#define STDIAG(dr) .word 0x14000AA0 + dr*0x200000
23#define SFDIAG(dr) .word 0x14000BA0 + dr*0x200000
24#define DR2_SLOW_RET 53
25
26
27;
28; Enable the performance counters
29;
30; The coprocessor only needs to be enabled when
31; starting/stopping the coprocessor with the pmenb/pmdis.
32;
33 .text
34
35ENTRY(perf_intrigue_enable_perf_counters)
36 .proc
37 .callinfo frame=0,NO_CALLS
38 .entry
39
40 ldi 0x20,%r25 ; load up perfmon bit
41 mfctl ccr,%r26 ; get coprocessor register
42 or %r25,%r26,%r26 ; set bit
43 mtctl %r26,ccr ; turn on performance coprocessor
44 pmenb ; enable performance monitor
45 ssm 0,0 ; dummy op to ensure completion
46 sync ; follow ERS
47 andcm %r26,%r25,%r26 ; clear bit now
48 mtctl %r26,ccr ; turn off performance coprocessor
49 nop ; NOPs as specified in ERS
50 nop
51 nop
52 nop
53 nop
54 nop
55 nop
56 bve (%r2)
57 nop
58 .exit
59 .procend
60ENDPROC(perf_intrigue_enable_perf_counters)
61
62ENTRY(perf_intrigue_disable_perf_counters)
63 .proc
64 .callinfo frame=0,NO_CALLS
65 .entry
66 ldi 0x20,%r25 ; load up perfmon bit
67 mfctl ccr,%r26 ; get coprocessor register
68 or %r25,%r26,%r26 ; set bit
69 mtctl %r26,ccr ; turn on performance coprocessor
70 pmdis ; disable performance monitor
71 ssm 0,0 ; dummy op to ensure completion
72 andcm %r26,%r25,%r26 ; clear bit now
73 bve (%r2)
74 mtctl %r26,ccr ; turn off performance coprocessor
75 .exit
76 .procend
77ENDPROC(perf_intrigue_disable_perf_counters)
78
79;***********************************************************************
80;*
81;* Name: perf_rdr_shift_in_W
82;*
83;* Description:
84;* This routine shifts data in from the RDR in arg0 and returns
85;* the result in ret0. If the RDR is <= 64 bits in length, it
86;* is shifted shifted backup immediately. This is to compensate
87;* for RDR10 which has bits that preclude PDC stack operations
88;* when they are in the wrong state.
89;*
90;* Arguments:
91;* arg0 : rdr to be read
92;* arg1 : bit length of rdr
93;*
94;* Returns:
95;* ret0 = next 64 bits of rdr data from staging register
96;*
97;* Register usage:
98;* arg0 : rdr to be read
99;* arg1 : bit length of rdr
100;* %r24 - original DR2 value
101;* %r1 - scratch
102;* %r29 - scratch
103;*
104;* Returns:
105;* ret0 = RDR data (right justified)
106;*
107;***********************************************************************
108
109ENTRY(perf_rdr_shift_in_W)
110 .proc
111 .callinfo frame=0,NO_CALLS
112 .entry
113;
114; read(shift in) the RDR.
115;
116
117; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any
118; shifting is done, from or to, remote diagnose registers.
119;
120
121 depdi,z 1,DR2_SLOW_RET,1,%r29
122 MFDIAG_2 (24)
123 or %r24,%r29,%r29
124 MTDIAG_2 (29) ; set DR2_SLOW_RET
125
126 nop
127 nop
128 nop
129 nop
130
131;
132; Cacheline start (32-byte cacheline)
133;
134 nop
135 nop
136 nop
137 extrd,u arg1,63,6,%r1 ; setup shift amount by bits to move
138
139 mtsar %r1
140 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
141 blr %r1,%r0 ; branch to 8-instruction sequence
142 nop
143
144;
145; Cacheline start (32-byte cacheline)
146;
147
148 ;
149 ; RDR 0 sequence
150 ;
151 SFDIAG (0)
152 ssm 0,0
153 MFDIAG_1 (28)
154 shrpd ret0,%r0,%sar,%r1
155 MTDIAG_1 (1) ; mtdiag %dr1, %r1
156 STDIAG (0)
157 ssm 0,0
158 b,n perf_rdr_shift_in_W_leave
159
160 ;
161 ; RDR 1 sequence
162 ;
163 sync
164 ssm 0,0
165 SFDIAG (1)
166 ssm 0,0
167 MFDIAG_1 (28)
168 ssm 0,0
169 b,n perf_rdr_shift_in_W_leave
170 nop
171
172 ;
173 ; RDR 2 read sequence
174 ;
175 SFDIAG (2)
176 ssm 0,0
177 MFDIAG_1 (28)
178 shrpd ret0,%r0,%sar,%r1
179 MTDIAG_1 (1)
180 STDIAG (2)
181 ssm 0,0
182 b,n perf_rdr_shift_in_W_leave
183
184 ;
185 ; RDR 3 read sequence
186 ;
187 b,n perf_rdr_shift_in_W_leave
188 nop
189 nop
190 nop
191 nop
192 nop
193 nop
194 nop
195
196 ;
197 ; RDR 4 read sequence
198 ;
199 sync
200 ssm 0,0
201 SFDIAG (4)
202 ssm 0,0
203 MFDIAG_1 (28)
204 b,n perf_rdr_shift_in_W_leave
205 ssm 0,0
206 nop
207
208 ;
209 ; RDR 5 read sequence
210 ;
211 sync
212 ssm 0,0
213 SFDIAG (5)
214 ssm 0,0
215 MFDIAG_1 (28)
216 b,n perf_rdr_shift_in_W_leave
217 ssm 0,0
218 nop
219
220 ;
221 ; RDR 6 read sequence
222 ;
223 sync
224 ssm 0,0
225 SFDIAG (6)
226 ssm 0,0
227 MFDIAG_1 (28)
228 b,n perf_rdr_shift_in_W_leave
229 ssm 0,0
230 nop
231
232 ;
233 ; RDR 7 read sequence
234 ;
235 b,n perf_rdr_shift_in_W_leave
236 nop
237 nop
238 nop
239 nop
240 nop
241 nop
242 nop
243
244 ;
245 ; RDR 8 read sequence
246 ;
247 b,n perf_rdr_shift_in_W_leave
248 nop
249 nop
250 nop
251 nop
252 nop
253 nop
254 nop
255
256 ;
257 ; RDR 9 read sequence
258 ;
259 b,n perf_rdr_shift_in_W_leave
260 nop
261 nop
262 nop
263 nop
264 nop
265 nop
266 nop
267
268 ;
269 ; RDR 10 read sequence
270 ;
271 SFDIAG (10)
272 ssm 0,0
273 MFDIAG_1 (28)
274 shrpd ret0,%r0,%sar,%r1
275 MTDIAG_1 (1)
276 STDIAG (10)
277 ssm 0,0
278 b,n perf_rdr_shift_in_W_leave
279
280 ;
281 ; RDR 11 read sequence
282 ;
283 SFDIAG (11)
284 ssm 0,0
285 MFDIAG_1 (28)
286 shrpd ret0,%r0,%sar,%r1
287 MTDIAG_1 (1)
288 STDIAG (11)
289 ssm 0,0
290 b,n perf_rdr_shift_in_W_leave
291
292 ;
293 ; RDR 12 read sequence
294 ;
295 b,n perf_rdr_shift_in_W_leave
296 nop
297 nop
298 nop
299 nop
300 nop
301 nop
302 nop
303
304 ;
305 ; RDR 13 read sequence
306 ;
307 sync
308 ssm 0,0
309 SFDIAG (13)
310 ssm 0,0
311 MFDIAG_1 (28)
312 b,n perf_rdr_shift_in_W_leave
313 ssm 0,0
314 nop
315
316 ;
317 ; RDR 14 read sequence
318 ;
319 SFDIAG (14)
320 ssm 0,0
321 MFDIAG_1 (28)
322 shrpd ret0,%r0,%sar,%r1
323 MTDIAG_1 (1)
324 STDIAG (14)
325 ssm 0,0
326 b,n perf_rdr_shift_in_W_leave
327
328 ;
329 ; RDR 15 read sequence
330 ;
331 sync
332 ssm 0,0
333 SFDIAG (15)
334 ssm 0,0
335 MFDIAG_1 (28)
336 ssm 0,0
337 b,n perf_rdr_shift_in_W_leave
338 nop
339
340 ;
341 ; RDR 16 read sequence
342 ;
343 sync
344 ssm 0,0
345 SFDIAG (16)
346 ssm 0,0
347 MFDIAG_1 (28)
348 b,n perf_rdr_shift_in_W_leave
349 ssm 0,0
350 nop
351
352 ;
353 ; RDR 17 read sequence
354 ;
355 SFDIAG (17)
356 ssm 0,0
357 MFDIAG_1 (28)
358 shrpd ret0,%r0,%sar,%r1
359 MTDIAG_1 (1)
360 STDIAG (17)
361 ssm 0,0
362 b,n perf_rdr_shift_in_W_leave
363
364 ;
365 ; RDR 18 read sequence
366 ;
367 SFDIAG (18)
368 ssm 0,0
369 MFDIAG_1 (28)
370 shrpd ret0,%r0,%sar,%r1
371 MTDIAG_1 (1)
372 STDIAG (18)
373 ssm 0,0
374 b,n perf_rdr_shift_in_W_leave
375
376 ;
377 ; RDR 19 read sequence
378 ;
379 b,n perf_rdr_shift_in_W_leave
380 nop
381 nop
382 nop
383 nop
384 nop
385 nop
386 nop
387
388 ;
389 ; RDR 20 read sequence
390 ;
391 sync
392 ssm 0,0
393 SFDIAG (20)
394 ssm 0,0
395 MFDIAG_1 (28)
396 b,n perf_rdr_shift_in_W_leave
397 ssm 0,0
398 nop
399
400 ;
401 ; RDR 21 read sequence
402 ;
403 sync
404 ssm 0,0
405 SFDIAG (21)
406 ssm 0,0
407 MFDIAG_1 (28)
408 b,n perf_rdr_shift_in_W_leave
409 ssm 0,0
410 nop
411
412 ;
413 ; RDR 22 read sequence
414 ;
415 sync
416 ssm 0,0
417 SFDIAG (22)
418 ssm 0,0
419 MFDIAG_1 (28)
420 b,n perf_rdr_shift_in_W_leave
421 ssm 0,0
422 nop
423
424 ;
425 ; RDR 23 read sequence
426 ;
427 sync
428 ssm 0,0
429 SFDIAG (23)
430 ssm 0,0
431 MFDIAG_1 (28)
432 b,n perf_rdr_shift_in_W_leave
433 ssm 0,0
434 nop
435
436 ;
437 ; RDR 24 read sequence
438 ;
439 sync
440 ssm 0,0
441 SFDIAG (24)
442 ssm 0,0
443 MFDIAG_1 (28)
444 b,n perf_rdr_shift_in_W_leave
445 ssm 0,0
446 nop
447
448 ;
449 ; RDR 25 read sequence
450 ;
451 sync
452 ssm 0,0
453 SFDIAG (25)
454 ssm 0,0
455 MFDIAG_1 (28)
456 b,n perf_rdr_shift_in_W_leave
457 ssm 0,0
458 nop
459
460 ;
461 ; RDR 26 read sequence
462 ;
463 SFDIAG (26)
464 ssm 0,0
465 MFDIAG_1 (28)
466 shrpd ret0,%r0,%sar,%r1
467 MTDIAG_1 (1)
468 STDIAG (26)
469 ssm 0,0
470 b,n perf_rdr_shift_in_W_leave
471
472 ;
473 ; RDR 27 read sequence
474 ;
475 SFDIAG (27)
476 ssm 0,0
477 MFDIAG_1 (28)
478 shrpd ret0,%r0,%sar,%r1
479 MTDIAG_1 (1)
480 STDIAG (27)
481 ssm 0,0
482 b,n perf_rdr_shift_in_W_leave
483
484 ;
485 ; RDR 28 read sequence
486 ;
487 sync
488 ssm 0,0
489 SFDIAG (28)
490 ssm 0,0
491 MFDIAG_1 (28)
492 b,n perf_rdr_shift_in_W_leave
493 ssm 0,0
494 nop
495
496 ;
497 ; RDR 29 read sequence
498 ;
499 sync
500 ssm 0,0
501 SFDIAG (29)
502 ssm 0,0
503 MFDIAG_1 (28)
504 b,n perf_rdr_shift_in_W_leave
505 ssm 0,0
506 nop
507
508 ;
509 ; RDR 30 read sequence
510 ;
511 SFDIAG (30)
512 ssm 0,0
513 MFDIAG_1 (28)
514 shrpd ret0,%r0,%sar,%r1
515 MTDIAG_1 (1)
516 STDIAG (30)
517 ssm 0,0
518 b,n perf_rdr_shift_in_W_leave
519
520 ;
521 ; RDR 31 read sequence
522 ;
523 sync
524 ssm 0,0
525 SFDIAG (31)
526 ssm 0,0
527 MFDIAG_1 (28)
528 nop
529 ssm 0,0
530 nop
531
532 ;
533 ; Fallthrough
534 ;
535
536perf_rdr_shift_in_W_leave:
537 bve (%r2)
538 .exit
539 MTDIAG_2 (24) ; restore DR2
540 .procend
541ENDPROC(perf_rdr_shift_in_W)
542
543
544;***********************************************************************
545;*
546;* Name: perf_rdr_shift_out_W
547;*
548;* Description:
549;* This routine moves data to the RDR's. The double-word that
550;* arg1 points to is loaded and moved into the staging register.
551;* Then the STDIAG instruction for the RDR # in arg0 is called
552;* to move the data to the RDR.
553;*
554;* Arguments:
555;* arg0 = rdr number
556;* arg1 = 64-bit value to write
557;* %r24 - DR2 | DR2_SLOW_RET
558;* %r23 - original DR2 value
559;*
560;* Returns:
561;* None
562;*
563;* Register usage:
564;*
565;***********************************************************************
566
567ENTRY(perf_rdr_shift_out_W)
568 .proc
569 .callinfo frame=0,NO_CALLS
570 .entry
571;
572; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any
573; shifting is done, from or to, the remote diagnose registers.
574;
575
576 depdi,z 1,DR2_SLOW_RET,1,%r24
577 MFDIAG_2 (23)
578 or %r24,%r23,%r24
579 MTDIAG_2 (24) ; set DR2_SLOW_RET
580 MTDIAG_1 (25) ; data to the staging register
581 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
582 blr %r1,%r0 ; branch to 8-instruction sequence
583 nop
584
585 ;
586 ; RDR 0 write sequence
587 ;
588 sync ; RDR 0 write sequence
589 ssm 0,0
590 STDIAG (0)
591 ssm 0,0
592 b,n perf_rdr_shift_out_W_leave
593 nop
594 ssm 0,0
595 nop
596
597 ;
598 ; RDR 1 write sequence
599 ;
600 sync
601 ssm 0,0
602 STDIAG (1)
603 ssm 0,0
604 b,n perf_rdr_shift_out_W_leave
605 nop
606 ssm 0,0
607 nop
608
609 ;
610 ; RDR 2 write sequence
611 ;
612 sync
613 ssm 0,0
614 STDIAG (2)
615 ssm 0,0
616 b,n perf_rdr_shift_out_W_leave
617 nop
618 ssm 0,0
619 nop
620
621 ;
622 ; RDR 3 write sequence
623 ;
624 sync
625 ssm 0,0
626 STDIAG (3)
627 ssm 0,0
628 b,n perf_rdr_shift_out_W_leave
629 nop
630 ssm 0,0
631 nop
632
633 ;
634 ; RDR 4 write sequence
635 ;
636 sync
637 ssm 0,0
638 STDIAG (4)
639 ssm 0,0
640 b,n perf_rdr_shift_out_W_leave
641 nop
642 ssm 0,0
643 nop
644
645 ;
646 ; RDR 5 write sequence
647 ;
648 sync
649 ssm 0,0
650 STDIAG (5)
651 ssm 0,0
652 b,n perf_rdr_shift_out_W_leave
653 nop
654 ssm 0,0
655 nop
656
657 ;
658 ; RDR 6 write sequence
659 ;
660 sync
661 ssm 0,0
662 STDIAG (6)
663 ssm 0,0
664 b,n perf_rdr_shift_out_W_leave
665 nop
666 ssm 0,0
667 nop
668
669 ;
670 ; RDR 7 write sequence
671 ;
672 sync
673 ssm 0,0
674 STDIAG (7)
675 ssm 0,0
676 b,n perf_rdr_shift_out_W_leave
677 nop
678 ssm 0,0
679 nop
680
681 ;
682 ; RDR 8 write sequence
683 ;
684 sync
685 ssm 0,0
686 STDIAG (8)
687 ssm 0,0
688 b,n perf_rdr_shift_out_W_leave
689 nop
690 ssm 0,0
691 nop
692
693 ;
694 ; RDR 9 write sequence
695 ;
696 sync
697 ssm 0,0
698 STDIAG (9)
699 ssm 0,0
700 b,n perf_rdr_shift_out_W_leave
701 nop
702 ssm 0,0
703 nop
704
705 ;
706 ; RDR 10 write sequence
707 ;
708 sync
709 ssm 0,0
710 STDIAG (10)
711 STDIAG (26)
712 ssm 0,0
713 b,n perf_rdr_shift_out_W_leave
714 ssm 0,0
715 nop
716
717 ;
718 ; RDR 11 write sequence
719 ;
720 sync
721 ssm 0,0
722 STDIAG (11)
723 STDIAG (27)
724 ssm 0,0
725 b,n perf_rdr_shift_out_W_leave
726 ssm 0,0
727 nop
728
729 ;
730 ; RDR 12 write sequence
731 ;
732 sync
733 ssm 0,0
734 STDIAG (12)
735 ssm 0,0
736 b,n perf_rdr_shift_out_W_leave
737 nop
738 ssm 0,0
739 nop
740
741 ;
742 ; RDR 13 write sequence
743 ;
744 sync
745 ssm 0,0
746 STDIAG (13)
747 ssm 0,0
748 b,n perf_rdr_shift_out_W_leave
749 nop
750 ssm 0,0
751 nop
752
753 ;
754 ; RDR 14 write sequence
755 ;
756 sync
757 ssm 0,0
758 STDIAG (14)
759 ssm 0,0
760 b,n perf_rdr_shift_out_W_leave
761 nop
762 ssm 0,0
763 nop
764
765 ;
766 ; RDR 15 write sequence
767 ;
768 sync
769 ssm 0,0
770 STDIAG (15)
771 ssm 0,0
772 b,n perf_rdr_shift_out_W_leave
773 nop
774 ssm 0,0
775 nop
776
777 ;
778 ; RDR 16 write sequence
779 ;
780 sync
781 ssm 0,0
782 STDIAG (16)
783 ssm 0,0
784 b,n perf_rdr_shift_out_W_leave
785 nop
786 ssm 0,0
787 nop
788
789 ;
790 ; RDR 17 write sequence
791 ;
792 sync
793 ssm 0,0
794 STDIAG (17)
795 ssm 0,0
796 b,n perf_rdr_shift_out_W_leave
797 nop
798 ssm 0,0
799 nop
800
801 ;
802 ; RDR 18 write sequence
803 ;
804 sync
805 ssm 0,0
806 STDIAG (18)
807 ssm 0,0
808 b,n perf_rdr_shift_out_W_leave
809 nop
810 ssm 0,0
811 nop
812
813 ;
814 ; RDR 19 write sequence
815 ;
816 sync
817 ssm 0,0
818 STDIAG (19)
819 ssm 0,0
820 b,n perf_rdr_shift_out_W_leave
821 nop
822 ssm 0,0
823 nop
824
825 ;
826 ; RDR 20 write sequence
827 ;
828 sync
829 ssm 0,0
830 STDIAG (20)
831 ssm 0,0
832 b,n perf_rdr_shift_out_W_leave
833 nop
834 ssm 0,0
835 nop
836
837 ;
838 ; RDR 21 write sequence
839 ;
840 sync
841 ssm 0,0
842 STDIAG (21)
843 ssm 0,0
844 b,n perf_rdr_shift_out_W_leave
845 nop
846 ssm 0,0
847 nop
848
849 ;
850 ; RDR 22 write sequence
851 ;
852 sync
853 ssm 0,0
854 STDIAG (22)
855 ssm 0,0
856 b,n perf_rdr_shift_out_W_leave
857 nop
858 ssm 0,0
859 nop
860
861 ;
862 ; RDR 23 write sequence
863 ;
864 sync
865 ssm 0,0
866 STDIAG (23)
867 ssm 0,0
868 b,n perf_rdr_shift_out_W_leave
869 nop
870 ssm 0,0
871 nop
872
873 ;
874 ; RDR 24 write sequence
875 ;
876 sync
877 ssm 0,0
878 STDIAG (24)
879 ssm 0,0
880 b,n perf_rdr_shift_out_W_leave
881 nop
882 ssm 0,0
883 nop
884
885 ;
886 ; RDR 25 write sequence
887 ;
888 sync
889 ssm 0,0
890 STDIAG (25)
891 ssm 0,0
892 b,n perf_rdr_shift_out_W_leave
893 nop
894 ssm 0,0
895 nop
896
897 ;
898 ; RDR 26 write sequence
899 ;
900 sync
901 ssm 0,0
902 STDIAG (10)
903 STDIAG (26)
904 ssm 0,0
905 b,n perf_rdr_shift_out_W_leave
906 ssm 0,0
907 nop
908
909 ;
910 ; RDR 27 write sequence
911 ;
912 sync
913 ssm 0,0
914 STDIAG (11)
915 STDIAG (27)
916 ssm 0,0
917 b,n perf_rdr_shift_out_W_leave
918 ssm 0,0
919 nop
920
921 ;
922 ; RDR 28 write sequence
923 ;
924 sync
925 ssm 0,0
926 STDIAG (28)
927 ssm 0,0
928 b,n perf_rdr_shift_out_W_leave
929 nop
930 ssm 0,0
931 nop
932
933 ;
934 ; RDR 29 write sequence
935 ;
936 sync
937 ssm 0,0
938 STDIAG (29)
939 ssm 0,0
940 b,n perf_rdr_shift_out_W_leave
941 nop
942 ssm 0,0
943 nop
944
945 ;
946 ; RDR 30 write sequence
947 ;
948 sync
949 ssm 0,0
950 STDIAG (30)
951 ssm 0,0
952 b,n perf_rdr_shift_out_W_leave
953 nop
954 ssm 0,0
955 nop
956
957 ;
958 ; RDR 31 write sequence
959 ;
960 sync
961 ssm 0,0
962 STDIAG (31)
963 ssm 0,0
964 b,n perf_rdr_shift_out_W_leave
965 nop
966 ssm 0,0
967 nop
968
969perf_rdr_shift_out_W_leave:
970 bve (%r2)
971 .exit
972 MTDIAG_2 (23) ; restore DR2
973 .procend
974ENDPROC(perf_rdr_shift_out_W)
975
976
977;***********************************************************************
978;*
979;* Name: rdr_shift_in_U
980;*
981;* Description:
982;* This routine shifts data in from the RDR in arg0 and returns
983;* the result in ret0. If the RDR is <= 64 bits in length, it
984;* is shifted shifted backup immediately. This is to compensate
985;* for RDR10 which has bits that preclude PDC stack operations
986;* when they are in the wrong state.
987;*
988;* Arguments:
989;* arg0 : rdr to be read
990;* arg1 : bit length of rdr
991;*
992;* Returns:
993;* ret0 = next 64 bits of rdr data from staging register
994;*
995;* Register usage:
996;* arg0 : rdr to be read
997;* arg1 : bit length of rdr
998;* %r24 - original DR2 value
999;* %r23 - DR2 | DR2_SLOW_RET
1000;* %r1 - scratch
1001;*
1002;***********************************************************************
1003
1004ENTRY(perf_rdr_shift_in_U)
1005 .proc
1006 .callinfo frame=0,NO_CALLS
1007 .entry
1008
1009; read(shift in) the RDR.
1010;
1011; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any
1012; shifting is done, from or to, remote diagnose registers.
1013
1014 depdi,z 1,DR2_SLOW_RET,1,%r29
1015 MFDIAG_2 (24)
1016 or %r24,%r29,%r29
1017 MTDIAG_2 (29) ; set DR2_SLOW_RET
1018
1019 nop
1020 nop
1021 nop
1022 nop
1023
1024;
1025; Start of next 32-byte cacheline
1026;
1027 nop
1028 nop
1029 nop
1030 extrd,u arg1,63,6,%r1
1031
1032 mtsar %r1
1033 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
1034 blr %r1,%r0 ; branch to 8-instruction sequence
1035 nop
1036
1037;
1038; Start of next 32-byte cacheline
1039;
1040 SFDIAG (0) ; RDR 0 read sequence
1041 ssm 0,0
1042 MFDIAG_1 (28)
1043 shrpd ret0,%r0,%sar,%r1
1044 MTDIAG_1 (1)
1045 STDIAG (0)
1046 ssm 0,0
1047 b,n perf_rdr_shift_in_U_leave
1048
1049 SFDIAG (1) ; RDR 1 read sequence
1050 ssm 0,0
1051 MFDIAG_1 (28)
1052 shrpd ret0,%r0,%sar,%r1
1053 MTDIAG_1 (1)
1054 STDIAG (1)
1055 ssm 0,0
1056 b,n perf_rdr_shift_in_U_leave
1057
1058 sync ; RDR 2 read sequence
1059 ssm 0,0
1060 SFDIAG (4)
1061 ssm 0,0
1062 MFDIAG_1 (28)
1063 b,n perf_rdr_shift_in_U_leave
1064 ssm 0,0
1065 nop
1066
1067 sync ; RDR 3 read sequence
1068 ssm 0,0
1069 SFDIAG (3)
1070 ssm 0,0
1071 MFDIAG_1 (28)
1072 b,n perf_rdr_shift_in_U_leave
1073 ssm 0,0
1074 nop
1075
1076 sync ; RDR 4 read sequence
1077 ssm 0,0
1078 SFDIAG (4)
1079 ssm 0,0
1080 MFDIAG_1 (28)
1081 b,n perf_rdr_shift_in_U_leave
1082 ssm 0,0
1083 nop
1084
1085 sync ; RDR 5 read sequence
1086 ssm 0,0
1087 SFDIAG (5)
1088 ssm 0,0
1089 MFDIAG_1 (28)
1090 b,n perf_rdr_shift_in_U_leave
1091 ssm 0,0
1092 nop
1093
1094 sync ; RDR 6 read sequence
1095 ssm 0,0
1096 SFDIAG (6)
1097 ssm 0,0
1098 MFDIAG_1 (28)
1099 b,n perf_rdr_shift_in_U_leave
1100 ssm 0,0
1101 nop
1102
1103 sync ; RDR 7 read sequence
1104 ssm 0,0
1105 SFDIAG (7)
1106 ssm 0,0
1107 MFDIAG_1 (28)
1108 b,n perf_rdr_shift_in_U_leave
1109 ssm 0,0
1110 nop
1111
1112 b,n perf_rdr_shift_in_U_leave
1113 nop
1114 nop
1115 nop
1116 nop
1117 nop
1118 nop
1119 nop
1120
1121 SFDIAG (9) ; RDR 9 read sequence
1122 ssm 0,0
1123 MFDIAG_1 (28)
1124 shrpd ret0,%r0,%sar,%r1
1125 MTDIAG_1 (1)
1126 STDIAG (9)
1127 ssm 0,0
1128 b,n perf_rdr_shift_in_U_leave
1129
1130 SFDIAG (10) ; RDR 10 read sequence
1131 ssm 0,0
1132 MFDIAG_1 (28)
1133 shrpd ret0,%r0,%sar,%r1
1134 MTDIAG_1 (1)
1135 STDIAG (10)
1136 ssm 0,0
1137 b,n perf_rdr_shift_in_U_leave
1138
1139 SFDIAG (11) ; RDR 11 read sequence
1140 ssm 0,0
1141 MFDIAG_1 (28)
1142 shrpd ret0,%r0,%sar,%r1
1143 MTDIAG_1 (1)
1144 STDIAG (11)
1145 ssm 0,0
1146 b,n perf_rdr_shift_in_U_leave
1147
1148 SFDIAG (12) ; RDR 12 read sequence
1149 ssm 0,0
1150 MFDIAG_1 (28)
1151 shrpd ret0,%r0,%sar,%r1
1152 MTDIAG_1 (1)
1153 STDIAG (12)
1154 ssm 0,0
1155 b,n perf_rdr_shift_in_U_leave
1156
1157 SFDIAG (13) ; RDR 13 read sequence
1158 ssm 0,0
1159 MFDIAG_1 (28)
1160 shrpd ret0,%r0,%sar,%r1
1161 MTDIAG_1 (1)
1162 STDIAG (13)
1163 ssm 0,0
1164 b,n perf_rdr_shift_in_U_leave
1165
1166 SFDIAG (14) ; RDR 14 read sequence
1167 ssm 0,0
1168 MFDIAG_1 (28)
1169 shrpd ret0,%r0,%sar,%r1
1170 MTDIAG_1 (1)
1171 STDIAG (14)
1172 ssm 0,0
1173 b,n perf_rdr_shift_in_U_leave
1174
1175 SFDIAG (15) ; RDR 15 read sequence
1176 ssm 0,0
1177 MFDIAG_1 (28)
1178 shrpd ret0,%r0,%sar,%r1
1179 MTDIAG_1 (1)
1180 STDIAG (15)
1181 ssm 0,0
1182 b,n perf_rdr_shift_in_U_leave
1183
1184 sync ; RDR 16 read sequence
1185 ssm 0,0
1186 SFDIAG (16)
1187 ssm 0,0
1188 MFDIAG_1 (28)
1189 b,n perf_rdr_shift_in_U_leave
1190 ssm 0,0
1191 nop
1192
1193 SFDIAG (17) ; RDR 17 read sequence
1194 ssm 0,0
1195 MFDIAG_1 (28)
1196 shrpd ret0,%r0,%sar,%r1
1197 MTDIAG_1 (1)
1198 STDIAG (17)
1199 ssm 0,0
1200 b,n perf_rdr_shift_in_U_leave
1201
1202 SFDIAG (18) ; RDR 18 read sequence
1203 ssm 0,0
1204 MFDIAG_1 (28)
1205 shrpd ret0,%r0,%sar,%r1
1206 MTDIAG_1 (1)
1207 STDIAG (18)
1208 ssm 0,0
1209 b,n perf_rdr_shift_in_U_leave
1210
1211 b,n perf_rdr_shift_in_U_leave
1212 nop
1213 nop
1214 nop
1215 nop
1216 nop
1217 nop
1218 nop
1219
1220 sync ; RDR 20 read sequence
1221 ssm 0,0
1222 SFDIAG (20)
1223 ssm 0,0
1224 MFDIAG_1 (28)
1225 b,n perf_rdr_shift_in_U_leave
1226 ssm 0,0
1227 nop
1228
1229 sync ; RDR 21 read sequence
1230 ssm 0,0
1231 SFDIAG (21)
1232 ssm 0,0
1233 MFDIAG_1 (28)
1234 b,n perf_rdr_shift_in_U_leave
1235 ssm 0,0
1236 nop
1237
1238 sync ; RDR 22 read sequence
1239 ssm 0,0
1240 SFDIAG (22)
1241 ssm 0,0
1242 MFDIAG_1 (28)
1243 b,n perf_rdr_shift_in_U_leave
1244 ssm 0,0
1245 nop
1246
1247 sync ; RDR 23 read sequence
1248 ssm 0,0
1249 SFDIAG (23)
1250 ssm 0,0
1251 MFDIAG_1 (28)
1252 b,n perf_rdr_shift_in_U_leave
1253 ssm 0,0
1254 nop
1255
1256 sync ; RDR 24 read sequence
1257 ssm 0,0
1258 SFDIAG (24)
1259 ssm 0,0
1260 MFDIAG_1 (28)
1261 b,n perf_rdr_shift_in_U_leave
1262 ssm 0,0
1263 nop
1264
1265 sync ; RDR 25 read sequence
1266 ssm 0,0
1267 SFDIAG (25)
1268 ssm 0,0
1269 MFDIAG_1 (28)
1270 b,n perf_rdr_shift_in_U_leave
1271 ssm 0,0
1272 nop
1273
1274 SFDIAG (26) ; RDR 26 read sequence
1275 ssm 0,0
1276 MFDIAG_1 (28)
1277 shrpd ret0,%r0,%sar,%r1
1278 MTDIAG_1 (1)
1279 STDIAG (26)
1280 ssm 0,0
1281 b,n perf_rdr_shift_in_U_leave
1282
1283 SFDIAG (27) ; RDR 27 read sequence
1284 ssm 0,0
1285 MFDIAG_1 (28)
1286 shrpd ret0,%r0,%sar,%r1
1287 MTDIAG_1 (1)
1288 STDIAG (27)
1289 ssm 0,0
1290 b,n perf_rdr_shift_in_U_leave
1291
1292 sync ; RDR 28 read sequence
1293 ssm 0,0
1294 SFDIAG (28)
1295 ssm 0,0
1296 MFDIAG_1 (28)
1297 b,n perf_rdr_shift_in_U_leave
1298 ssm 0,0
1299 nop
1300
1301 b,n perf_rdr_shift_in_U_leave
1302 nop
1303 nop
1304 nop
1305 nop
1306 nop
1307 nop
1308 nop
1309
1310 SFDIAG (30) ; RDR 30 read sequence
1311 ssm 0,0
1312 MFDIAG_1 (28)
1313 shrpd ret0,%r0,%sar,%r1
1314 MTDIAG_1 (1)
1315 STDIAG (30)
1316 ssm 0,0
1317 b,n perf_rdr_shift_in_U_leave
1318
1319 SFDIAG (31) ; RDR 31 read sequence
1320 ssm 0,0
1321 MFDIAG_1 (28)
1322 shrpd ret0,%r0,%sar,%r1
1323 MTDIAG_1 (1)
1324 STDIAG (31)
1325 ssm 0,0
1326 b,n perf_rdr_shift_in_U_leave
1327 nop
1328
1329perf_rdr_shift_in_U_leave:
1330 bve (%r2)
1331 .exit
1332 MTDIAG_2 (24) ; restore DR2
1333 .procend
1334ENDPROC(perf_rdr_shift_in_U)
1335
1336;***********************************************************************
1337;*
1338;* Name: rdr_shift_out_U
1339;*
1340;* Description:
1341;* This routine moves data to the RDR's. The double-word that
1342;* arg1 points to is loaded and moved into the staging register.
1343;* Then the STDIAG instruction for the RDR # in arg0 is called
1344;* to move the data to the RDR.
1345;*
1346;* Arguments:
1347;* arg0 = rdr target
1348;* arg1 = buffer pointer
1349;*
1350;* Returns:
1351;* None
1352;*
1353;* Register usage:
1354;* arg0 = rdr target
1355;* arg1 = buffer pointer
1356;* %r24 - DR2 | DR2_SLOW_RET
1357;* %r23 - original DR2 value
1358;*
1359;***********************************************************************
1360
1361ENTRY(perf_rdr_shift_out_U)
1362 .proc
1363 .callinfo frame=0,NO_CALLS
1364 .entry
1365
1366;
1367; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any
1368; shifting is done, from or to, the remote diagnose registers.
1369;
1370
1371 depdi,z 1,DR2_SLOW_RET,1,%r24
1372 MFDIAG_2 (23)
1373 or %r24,%r23,%r24
1374 MTDIAG_2 (24) ; set DR2_SLOW_RET
1375
1376 MTDIAG_1 (25) ; data to the staging register
1377 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
1378 blr %r1,%r0 ; branch to 8-instruction sequence
1379 nop
1380
1381;
1382; 32-byte cachline aligned
1383;
1384
1385 sync ; RDR 0 write sequence
1386 ssm 0,0
1387 STDIAG (0)
1388 ssm 0,0
1389 b,n perf_rdr_shift_out_U_leave
1390 nop
1391 ssm 0,0
1392 nop
1393
1394 sync ; RDR 1 write sequence
1395 ssm 0,0
1396 STDIAG (1)
1397 ssm 0,0
1398 b,n perf_rdr_shift_out_U_leave
1399 nop
1400 ssm 0,0
1401 nop
1402
1403 sync ; RDR 2 write sequence
1404 ssm 0,0
1405 STDIAG (2)
1406 ssm 0,0
1407 b,n perf_rdr_shift_out_U_leave
1408 nop
1409 ssm 0,0
1410 nop
1411
1412 sync ; RDR 3 write sequence
1413 ssm 0,0
1414 STDIAG (3)
1415 ssm 0,0
1416 b,n perf_rdr_shift_out_U_leave
1417 nop
1418 ssm 0,0
1419 nop
1420
1421 sync ; RDR 4 write sequence
1422 ssm 0,0
1423 STDIAG (4)
1424 ssm 0,0
1425 b,n perf_rdr_shift_out_U_leave
1426 nop
1427 ssm 0,0
1428 nop
1429
1430 sync ; RDR 5 write sequence
1431 ssm 0,0
1432 STDIAG (5)
1433 ssm 0,0
1434 b,n perf_rdr_shift_out_U_leave
1435 nop
1436 ssm 0,0
1437 nop
1438
1439 sync ; RDR 6 write sequence
1440 ssm 0,0
1441 STDIAG (6)
1442 ssm 0,0
1443 b,n perf_rdr_shift_out_U_leave
1444 nop
1445 ssm 0,0
1446 nop
1447
1448 sync ; RDR 7 write sequence
1449 ssm 0,0
1450 STDIAG (7)
1451 ssm 0,0
1452 b,n perf_rdr_shift_out_U_leave
1453 nop
1454 ssm 0,0
1455 nop
1456
1457 sync ; RDR 8 write sequence
1458 ssm 0,0
1459 STDIAG (8)
1460 ssm 0,0
1461 b,n perf_rdr_shift_out_U_leave
1462 nop
1463 ssm 0,0
1464 nop
1465
1466 sync ; RDR 9 write sequence
1467 ssm 0,0
1468 STDIAG (9)
1469 ssm 0,0
1470 b,n perf_rdr_shift_out_U_leave
1471 nop
1472 ssm 0,0
1473 nop
1474
1475 sync ; RDR 10 write sequence
1476 ssm 0,0
1477 STDIAG (10)
1478 ssm 0,0
1479 b,n perf_rdr_shift_out_U_leave
1480 nop
1481 ssm 0,0
1482 nop
1483
1484 sync ; RDR 11 write sequence
1485 ssm 0,0
1486 STDIAG (11)
1487 ssm 0,0
1488 b,n perf_rdr_shift_out_U_leave
1489 nop
1490 ssm 0,0
1491 nop
1492
1493 sync ; RDR 12 write sequence
1494 ssm 0,0
1495 STDIAG (12)
1496 ssm 0,0
1497 b,n perf_rdr_shift_out_U_leave
1498 nop
1499 ssm 0,0
1500 nop
1501
1502 sync ; RDR 13 write sequence
1503 ssm 0,0
1504 STDIAG (13)
1505 ssm 0,0
1506 b,n perf_rdr_shift_out_U_leave
1507 nop
1508 ssm 0,0
1509 nop
1510
1511 sync ; RDR 14 write sequence
1512 ssm 0,0
1513 STDIAG (14)
1514 ssm 0,0
1515 b,n perf_rdr_shift_out_U_leave
1516 nop
1517 ssm 0,0
1518 nop
1519
1520 sync ; RDR 15 write sequence
1521 ssm 0,0
1522 STDIAG (15)
1523 ssm 0,0
1524 b,n perf_rdr_shift_out_U_leave
1525 nop
1526 ssm 0,0
1527 nop
1528
1529 sync ; RDR 16 write sequence
1530 ssm 0,0
1531 STDIAG (16)
1532 ssm 0,0
1533 b,n perf_rdr_shift_out_U_leave
1534 nop
1535 ssm 0,0
1536 nop
1537
1538 sync ; RDR 17 write sequence
1539 ssm 0,0
1540 STDIAG (17)
1541 ssm 0,0
1542 b,n perf_rdr_shift_out_U_leave
1543 nop
1544 ssm 0,0
1545 nop
1546
1547 sync ; RDR 18 write sequence
1548 ssm 0,0
1549 STDIAG (18)
1550 ssm 0,0
1551 b,n perf_rdr_shift_out_U_leave
1552 nop
1553 ssm 0,0
1554 nop
1555
1556 sync ; RDR 19 write sequence
1557 ssm 0,0
1558 STDIAG (19)
1559 ssm 0,0
1560 b,n perf_rdr_shift_out_U_leave
1561 nop
1562 ssm 0,0
1563 nop
1564
1565 sync ; RDR 20 write sequence
1566 ssm 0,0
1567 STDIAG (20)
1568 ssm 0,0
1569 b,n perf_rdr_shift_out_U_leave
1570 nop
1571 ssm 0,0
1572 nop
1573
1574 sync ; RDR 21 write sequence
1575 ssm 0,0
1576 STDIAG (21)
1577 ssm 0,0
1578 b,n perf_rdr_shift_out_U_leave
1579 nop
1580 ssm 0,0
1581 nop
1582
1583 sync ; RDR 22 write sequence
1584 ssm 0,0
1585 STDIAG (22)
1586 ssm 0,0
1587 b,n perf_rdr_shift_out_U_leave
1588 nop
1589 ssm 0,0
1590 nop
1591
1592 sync ; RDR 23 write sequence
1593 ssm 0,0
1594 STDIAG (23)
1595 ssm 0,0
1596 b,n perf_rdr_shift_out_U_leave
1597 nop
1598 ssm 0,0
1599 nop
1600
1601 sync ; RDR 24 write sequence
1602 ssm 0,0
1603 STDIAG (24)
1604 ssm 0,0
1605 b,n perf_rdr_shift_out_U_leave
1606 nop
1607 ssm 0,0
1608 nop
1609
1610 sync ; RDR 25 write sequence
1611 ssm 0,0
1612 STDIAG (25)
1613 ssm 0,0
1614 b,n perf_rdr_shift_out_U_leave
1615 nop
1616 ssm 0,0
1617 nop
1618
1619 sync ; RDR 26 write sequence
1620 ssm 0,0
1621 STDIAG (26)
1622 ssm 0,0
1623 b,n perf_rdr_shift_out_U_leave
1624 nop
1625 ssm 0,0
1626 nop
1627
1628 sync ; RDR 27 write sequence
1629 ssm 0,0
1630 STDIAG (27)
1631 ssm 0,0
1632 b,n perf_rdr_shift_out_U_leave
1633 nop
1634 ssm 0,0
1635 nop
1636
1637 sync ; RDR 28 write sequence
1638 ssm 0,0
1639 STDIAG (28)
1640 ssm 0,0
1641 b,n perf_rdr_shift_out_U_leave
1642 nop
1643 ssm 0,0
1644 nop
1645
1646 sync ; RDR 29 write sequence
1647 ssm 0,0
1648 STDIAG (29)
1649 ssm 0,0
1650 b,n perf_rdr_shift_out_U_leave
1651 nop
1652 ssm 0,0
1653 nop
1654
1655 sync ; RDR 30 write sequence
1656 ssm 0,0
1657 STDIAG (30)
1658 ssm 0,0
1659 b,n perf_rdr_shift_out_U_leave
1660 nop
1661 ssm 0,0
1662 nop
1663
1664 sync ; RDR 31 write sequence
1665 ssm 0,0
1666 STDIAG (31)
1667 ssm 0,0
1668 b,n perf_rdr_shift_out_U_leave
1669 nop
1670 ssm 0,0
1671 nop
1672
1673perf_rdr_shift_out_U_leave:
1674 bve (%r2)
1675 .exit
1676 MTDIAG_2 (23) ; restore DR2
1677 .procend
1678ENDPROC(perf_rdr_shift_out_U)
1679
1680

source code of linux/arch/parisc/kernel/perf_asm.S