more changes on original files
[linux-2.4.git] / arch / ia64 / sn / kernel / sn2 / ptc_deadlock.S
1 /* 
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2000-2003 Silicon Graphics, Inc. All rights reserved.
7  */
8
9 #include <asm/sn/sn2/shub_mmr.h>
10
11 #define ZEROVAL         0x3f            // "zero" value for outstanding PIO requests
12 #define DEADLOCKBIT     SH_PIO_WRITE_STATUS_0_WRITE_DEADLOCK_SHFT
13 #define WRITECOUNT      SH_PIO_WRITE_STATUS_0_PENDING_WRITE_COUNT_SHFT
14 #define ALIAS_OFFSET    (SH_PIO_WRITE_STATUS_0_ALIAS-SH_PIO_WRITE_STATUS_0)
15
16
17         .global sn2_ptc_deadlock_recovery_core
18         .proc   sn2_ptc_deadlock_recovery_core
19
20 sn2_ptc_deadlock_recovery_core:
21         .regstk 5,0,0,0
22
23         ptc0     = in0
24         data0    = in1
25         ptc1     = in2
26         data1    = in3
27         piowc    = in4
28         piowcphy = r30
29         psrsave  = r2
30         zeroval  = r3
31         scr1     = r16
32         scr2     = r17
33
34
35         extr.u  piowcphy=piowc,0,61;;   // Convert piowc to uncached physical address
36         dep     piowcphy=-1,piowcphy,63,1
37
38         mov     zeroval=ZEROVAL         // "zero" value for PIO write count
39
40 1:
41         add     scr2=ALIAS_OFFSET,piowc // Address of WRITE_STATUS alias register 
42         mov     scr1=7;;                // Clear DEADLOCK, WRITE_ERROR, MULTI_WRITE_ERROR
43         st8.rel [scr2]=scr1;;
44
45 5:      ld8.acq scr1=[piowc];;          // Wait for PIOs to complete.
46         extr.u  scr2=scr1,WRITECOUNT,7;;// PIO count
47         cmp.ne  p6,p0=zeroval,scr2
48 (p6)    br.cond.sptk 5b
49         
50
51
52         ////////////// BEGIN PHYSICAL MODE ////////////////////
53         mov psrsave=psr                 // Disable IC (no PMIs)
54         rsm psr.i | psr.dt | psr.ic;;
55         srlz.i;;
56
57         st8.rel [ptc0]=data0            // Write PTC0 & wait for completion.
58
59 5:      ld8.acq scr1=[piowcphy];;       // Wait for PIOs to complete.
60         extr.u  scr2=scr1,WRITECOUNT,7;;// PIO count
61         cmp.ne  p6,p0=zeroval,scr2
62 (p6)    br.cond.sptk 5b;;
63
64         tbit.nz p8,p7=scr1,DEADLOCKBIT;;// Test for DEADLOCK
65         
66 (p7)    st8.rel [ptc1]=data1;;          // Now write PTC1.
67
68 5:      ld8.acq scr1=[piowcphy];;       // Wait for PIOs to complete.
69         extr.u  scr2=scr1,WRITECOUNT,7;;// PIO count
70         cmp.ne  p6,p0=zeroval,scr2
71 (p6)    br.cond.sptk 5b
72         
73         tbit.nz p8,p0=scr1,DEADLOCKBIT;;// Test for DEADLOCK
74
75         mov psr.l=psrsave;;             // Reenable IC
76         srlz.i;;
77         ////////////// END   PHYSICAL MODE ////////////////////
78
79 (p8)    br.cond.spnt 1b;;               // Repeat if DEADLOCK occurred.
80
81         br.ret.sptk     rp
82         .endp sn2_ptc_deadlock_recovery_core