2 * Copyright IBM Corp. 2006
3 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
8 /* ETR attachment control register */
10 unsigned int e0
: 1; /* port 0 stepping control */
11 unsigned int e1
: 1; /* port 1 stepping control */
12 unsigned int _pad0
: 5; /* must be 00100 */
13 unsigned int dp
: 1; /* data port control */
14 unsigned int p0
: 1; /* port 0 change recognition control */
15 unsigned int p1
: 1; /* port 1 change recognition control */
16 unsigned int _pad1
: 3; /* must be 000 */
17 unsigned int ea
: 1; /* ETR alert control */
18 unsigned int es
: 1; /* ETR sync check control */
19 unsigned int sl
: 1; /* switch to local control */
20 } __attribute__ ((packed
));
22 /* Port state returned by steai */
24 etr_psc_operational
= 0,
25 etr_psc_semi_operational
= 1,
26 etr_psc_protocol_error
= 4,
27 etr_psc_no_symbols
= 8,
28 etr_psc_no_signal
= 12,
32 /* Logical port state returned by stetr */
34 etr_lpsc_operational_step
= 0,
35 etr_lpsc_operational_alt
= 1,
36 etr_lpsc_semi_operational
= 2,
37 etr_lpsc_protocol_error
= 4,
38 etr_lpsc_no_symbol_sync
= 8,
39 etr_lpsc_no_signal
= 12,
40 etr_lpsc_pps_mode
= 13
43 /* ETR status words */
45 struct etr_eacr eacr
; /* attachment control register */
46 unsigned int y
: 1; /* stepping mode */
47 unsigned int _pad0
: 5; /* must be 00000 */
48 unsigned int p
: 1; /* stepping port number */
49 unsigned int q
: 1; /* data port number */
50 unsigned int psc0
: 4; /* port 0 state code */
51 unsigned int psc1
: 4; /* port 1 state code */
52 } __attribute__ ((packed
));
54 /* Second level data register status word */
56 unsigned int vv1
: 1; /* copy of validity bit data frame 1 */
57 unsigned int vv2
: 1; /* copy of validity bit data frame 2 */
58 unsigned int vv3
: 1; /* copy of validity bit data frame 3 */
59 unsigned int vv4
: 1; /* copy of validity bit data frame 4 */
60 unsigned int _pad0
: 19; /* must by all zeroes */
61 unsigned int n
: 1; /* EAF port number */
62 unsigned int v1
: 1; /* validity bit ETR data frame 1 */
63 unsigned int v2
: 1; /* validity bit ETR data frame 2 */
64 unsigned int v3
: 1; /* validity bit ETR data frame 3 */
65 unsigned int v4
: 1; /* validity bit ETR data frame 4 */
66 unsigned int _pad1
: 4; /* must be 0000 */
67 } __attribute__ ((packed
));
71 unsigned int u
: 1; /* untuned bit */
72 unsigned int _pad0
: 1; /* must be 0 */
73 unsigned int r
: 1; /* service request bit */
74 unsigned int _pad1
: 4; /* must be 0000 */
75 unsigned int a
: 1; /* time adjustment bit */
76 unsigned int net_id
: 8; /* ETR network id */
77 unsigned int etr_id
: 8; /* id of ETR which sends data frames */
78 unsigned int etr_pn
: 8; /* port number of ETR output port */
79 } __attribute__ ((packed
));
82 unsigned int etv
: 32; /* Upper 32 bits of TOD. */
83 } __attribute__ ((packed
));
86 unsigned int rc
: 8; /* failure reason code */
87 unsigned int _pad0
: 3; /* must be 000 */
88 unsigned int c
: 1; /* ETR coupled bit */
89 unsigned int tc
: 4; /* ETR type code */
90 unsigned int blto
: 8; /* biased local time offset */
91 /* (blto - 128) * 15 = minutes */
92 unsigned int buo
: 8; /* biased utc offset */
93 /* (buo - 128) = leap seconds */
94 } __attribute__ ((packed
));
97 unsigned int ed
: 8; /* ETS device dependent data */
98 unsigned int _pad0
: 1; /* must be 0 */
99 unsigned int buc
: 5; /* biased ut1 correction */
100 /* (buc - 16) * 0.1 seconds */
101 unsigned int em
: 6; /* ETS error magnitude */
102 unsigned int dc
: 6; /* ETS drift code */
103 unsigned int sc
: 6; /* ETS steering code */
104 } __attribute__ ((packed
));
107 * ETR attachment information block, two formats
108 * format 1 has 4 reserved words with a size of 64 bytes
109 * format 2 has 16 reserved words with a size of 96 bytes
113 struct etr_slsw slsw
;
114 unsigned long long tsp
;
115 struct etr_edf1 edf1
;
116 struct etr_edf2 edf2
;
117 struct etr_edf3 edf3
;
118 struct etr_edf4 edf4
;
119 unsigned int reserved
[16];
120 } __attribute__ ((packed
,aligned(8)));
122 /* ETR interruption parameter */
123 struct etr_irq_parm
{
124 unsigned int _pad0
: 8;
125 unsigned int pc0
: 1; /* port 0 state change */
126 unsigned int pc1
: 1; /* port 1 state change */
127 unsigned int _pad1
: 3;
128 unsigned int eai
: 1; /* ETR alert indication */
129 unsigned int _pad2
: 18;
130 } __attribute__ ((packed
));
132 /* Query TOD offset result */
133 struct etr_ptff_qto
{
134 unsigned long long physical_clock
;
135 unsigned long long tod_offset
;
136 unsigned long long logical_tod_offset
;
137 unsigned long long tod_epoch_difference
;
138 } __attribute__ ((packed
));
140 /* Inline assembly helper functions */
141 static inline int etr_setr(struct etr_eacr
*ctrl
)
143 int rc
= -EOPNOTSUPP
;
146 " .insn s,0xb2160000,%1\n"
150 : "+d" (rc
) : "Q" (*ctrl
));
154 /* Stores a format 1 aib with 64 bytes */
155 static inline int etr_stetr(struct etr_aib
*aib
)
157 int rc
= -EOPNOTSUPP
;
160 " .insn s,0xb2170000,%1\n"
164 : "+d" (rc
) : "Q" (*aib
));
168 /* Stores a format 2 aib with 96 bytes for specified port */
169 static inline int etr_steai(struct etr_aib
*aib
, unsigned int func
)
171 register unsigned int reg0
asm("0") = func
;
172 int rc
= -EOPNOTSUPP
;
175 " .insn s,0xb2b30000,%1\n"
179 : "+d" (rc
) : "Q" (*aib
), "d" (reg0
));
183 /* Function codes for the steai instruction. */
184 #define ETR_STEAI_STEPPING_PORT 0x10
185 #define ETR_STEAI_ALTERNATE_PORT 0x11
186 #define ETR_STEAI_PORT_0 0x12
187 #define ETR_STEAI_PORT_1 0x13
189 static inline int etr_ptff(void *ptff_block
, unsigned int func
)
191 register unsigned int reg0
asm("0") = func
;
192 register unsigned long reg1
asm("1") = (unsigned long) ptff_block
;
193 int rc
= -EOPNOTSUPP
;
199 : "=d" (rc
), "=m" (ptff_block
)
200 : "d" (reg0
), "d" (reg1
), "m" (ptff_block
) : "cc");
204 /* Function codes for the ptff instruction. */
205 #define ETR_PTFF_QAF 0x00 /* query available functions */
206 #define ETR_PTFF_QTO 0x01 /* query tod offset */
207 #define ETR_PTFF_QSI 0x02 /* query steering information */
208 #define ETR_PTFF_ATO 0x40 /* adjust tod offset */
209 #define ETR_PTFF_STO 0x41 /* set tod offset */
210 #define ETR_PTFF_SFS 0x42 /* set fine steering rate */
211 #define ETR_PTFF_SGS 0x43 /* set gross steering rate */
213 /* Functions needed by the machine check handler */
214 void etr_switch_to_local(void);
215 void etr_sync_check(void);
217 /* STP interruption parameter */
218 struct stp_irq_parm
{
219 unsigned int _pad0
: 14;
220 unsigned int tsc
: 1; /* Timing status change */
221 unsigned int lac
: 1; /* Link availability change */
222 unsigned int tcpc
: 1; /* Time control parameter change */
223 unsigned int _pad2
: 15;
224 } __attribute__ ((packed
));
226 #define STP_OP_SYNC 1
227 #define STP_OP_CTRL 3
231 unsigned int rsvd1
: 8;
232 unsigned int stratum
: 8;
233 unsigned int vbits
: 16;
234 unsigned int leaps
: 16;
235 unsigned int tmd
: 4;
236 unsigned int ctn
: 4;
237 unsigned int rsvd2
: 3;
239 unsigned int tst
: 4;
240 unsigned int tzo
: 16;
241 unsigned int dsto
: 16;
242 unsigned int ctrl
: 16;
243 unsigned int rsvd3
: 16;
246 unsigned int ctnid
[3];
248 unsigned int todoff
[4];
249 unsigned int rsvd6
[48];
250 } __attribute__ ((packed
));
252 /* Functions needed by the machine check handler */
253 void stp_sync_check(void);
254 void stp_island_check(void);
256 #endif /* __S390_ETR_H */