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