Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/s390/include/asm/etr.h
10818 views
1
/*
2
* include/asm-s390/etr.h
3
*
4
* Copyright IBM Corp. 2006
5
* Author(s): Martin Schwidefsky ([email protected])
6
*/
7
#ifndef __S390_ETR_H
8
#define __S390_ETR_H
9
10
/* ETR attachment control register */
11
struct etr_eacr {
12
unsigned int e0 : 1; /* port 0 stepping control */
13
unsigned int e1 : 1; /* port 1 stepping control */
14
unsigned int _pad0 : 5; /* must be 00100 */
15
unsigned int dp : 1; /* data port control */
16
unsigned int p0 : 1; /* port 0 change recognition control */
17
unsigned int p1 : 1; /* port 1 change recognition control */
18
unsigned int _pad1 : 3; /* must be 000 */
19
unsigned int ea : 1; /* ETR alert control */
20
unsigned int es : 1; /* ETR sync check control */
21
unsigned int sl : 1; /* switch to local control */
22
} __attribute__ ((packed));
23
24
/* Port state returned by steai */
25
enum etr_psc {
26
etr_psc_operational = 0,
27
etr_psc_semi_operational = 1,
28
etr_psc_protocol_error = 4,
29
etr_psc_no_symbols = 8,
30
etr_psc_no_signal = 12,
31
etr_psc_pps_mode = 13
32
};
33
34
/* Logical port state returned by stetr */
35
enum etr_lpsc {
36
etr_lpsc_operational_step = 0,
37
etr_lpsc_operational_alt = 1,
38
etr_lpsc_semi_operational = 2,
39
etr_lpsc_protocol_error = 4,
40
etr_lpsc_no_symbol_sync = 8,
41
etr_lpsc_no_signal = 12,
42
etr_lpsc_pps_mode = 13
43
};
44
45
/* ETR status words */
46
struct etr_esw {
47
struct etr_eacr eacr; /* attachment control register */
48
unsigned int y : 1; /* stepping mode */
49
unsigned int _pad0 : 5; /* must be 00000 */
50
unsigned int p : 1; /* stepping port number */
51
unsigned int q : 1; /* data port number */
52
unsigned int psc0 : 4; /* port 0 state code */
53
unsigned int psc1 : 4; /* port 1 state code */
54
} __attribute__ ((packed));
55
56
/* Second level data register status word */
57
struct etr_slsw {
58
unsigned int vv1 : 1; /* copy of validity bit data frame 1 */
59
unsigned int vv2 : 1; /* copy of validity bit data frame 2 */
60
unsigned int vv3 : 1; /* copy of validity bit data frame 3 */
61
unsigned int vv4 : 1; /* copy of validity bit data frame 4 */
62
unsigned int _pad0 : 19; /* must by all zeroes */
63
unsigned int n : 1; /* EAF port number */
64
unsigned int v1 : 1; /* validity bit ETR data frame 1 */
65
unsigned int v2 : 1; /* validity bit ETR data frame 2 */
66
unsigned int v3 : 1; /* validity bit ETR data frame 3 */
67
unsigned int v4 : 1; /* validity bit ETR data frame 4 */
68
unsigned int _pad1 : 4; /* must be 0000 */
69
} __attribute__ ((packed));
70
71
/* ETR data frames */
72
struct etr_edf1 {
73
unsigned int u : 1; /* untuned bit */
74
unsigned int _pad0 : 1; /* must be 0 */
75
unsigned int r : 1; /* service request bit */
76
unsigned int _pad1 : 4; /* must be 0000 */
77
unsigned int a : 1; /* time adjustment bit */
78
unsigned int net_id : 8; /* ETR network id */
79
unsigned int etr_id : 8; /* id of ETR which sends data frames */
80
unsigned int etr_pn : 8; /* port number of ETR output port */
81
} __attribute__ ((packed));
82
83
struct etr_edf2 {
84
unsigned int etv : 32; /* Upper 32 bits of TOD. */
85
} __attribute__ ((packed));
86
87
struct etr_edf3 {
88
unsigned int rc : 8; /* failure reason code */
89
unsigned int _pad0 : 3; /* must be 000 */
90
unsigned int c : 1; /* ETR coupled bit */
91
unsigned int tc : 4; /* ETR type code */
92
unsigned int blto : 8; /* biased local time offset */
93
/* (blto - 128) * 15 = minutes */
94
unsigned int buo : 8; /* biased utc offset */
95
/* (buo - 128) = leap seconds */
96
} __attribute__ ((packed));
97
98
struct etr_edf4 {
99
unsigned int ed : 8; /* ETS device dependent data */
100
unsigned int _pad0 : 1; /* must be 0 */
101
unsigned int buc : 5; /* biased ut1 correction */
102
/* (buc - 16) * 0.1 seconds */
103
unsigned int em : 6; /* ETS error magnitude */
104
unsigned int dc : 6; /* ETS drift code */
105
unsigned int sc : 6; /* ETS steering code */
106
} __attribute__ ((packed));
107
108
/*
109
* ETR attachment information block, two formats
110
* format 1 has 4 reserved words with a size of 64 bytes
111
* format 2 has 16 reserved words with a size of 96 bytes
112
*/
113
struct etr_aib {
114
struct etr_esw esw;
115
struct etr_slsw slsw;
116
unsigned long long tsp;
117
struct etr_edf1 edf1;
118
struct etr_edf2 edf2;
119
struct etr_edf3 edf3;
120
struct etr_edf4 edf4;
121
unsigned int reserved[16];
122
} __attribute__ ((packed,aligned(8)));
123
124
/* ETR interruption parameter */
125
struct etr_irq_parm {
126
unsigned int _pad0 : 8;
127
unsigned int pc0 : 1; /* port 0 state change */
128
unsigned int pc1 : 1; /* port 1 state change */
129
unsigned int _pad1 : 3;
130
unsigned int eai : 1; /* ETR alert indication */
131
unsigned int _pad2 : 18;
132
} __attribute__ ((packed));
133
134
/* Query TOD offset result */
135
struct etr_ptff_qto {
136
unsigned long long physical_clock;
137
unsigned long long tod_offset;
138
unsigned long long logical_tod_offset;
139
unsigned long long tod_epoch_difference;
140
} __attribute__ ((packed));
141
142
/* Inline assembly helper functions */
143
static inline int etr_setr(struct etr_eacr *ctrl)
144
{
145
int rc = -ENOSYS;
146
147
asm volatile(
148
" .insn s,0xb2160000,%1\n"
149
"0: la %0,0\n"
150
"1:\n"
151
EX_TABLE(0b,1b)
152
: "+d" (rc) : "Q" (*ctrl));
153
return rc;
154
}
155
156
/* Stores a format 1 aib with 64 bytes */
157
static inline int etr_stetr(struct etr_aib *aib)
158
{
159
int rc = -ENOSYS;
160
161
asm volatile(
162
" .insn s,0xb2170000,%1\n"
163
"0: la %0,0\n"
164
"1:\n"
165
EX_TABLE(0b,1b)
166
: "+d" (rc) : "Q" (*aib));
167
return rc;
168
}
169
170
/* Stores a format 2 aib with 96 bytes for specified port */
171
static inline int etr_steai(struct etr_aib *aib, unsigned int func)
172
{
173
register unsigned int reg0 asm("0") = func;
174
int rc = -ENOSYS;
175
176
asm volatile(
177
" .insn s,0xb2b30000,%1\n"
178
"0: la %0,0\n"
179
"1:\n"
180
EX_TABLE(0b,1b)
181
: "+d" (rc) : "Q" (*aib), "d" (reg0));
182
return rc;
183
}
184
185
/* Function codes for the steai instruction. */
186
#define ETR_STEAI_STEPPING_PORT 0x10
187
#define ETR_STEAI_ALTERNATE_PORT 0x11
188
#define ETR_STEAI_PORT_0 0x12
189
#define ETR_STEAI_PORT_1 0x13
190
191
static inline int etr_ptff(void *ptff_block, unsigned int func)
192
{
193
register unsigned int reg0 asm("0") = func;
194
register unsigned long reg1 asm("1") = (unsigned long) ptff_block;
195
int rc = -ENOSYS;
196
197
asm volatile(
198
" .word 0x0104\n"
199
" ipm %0\n"
200
" srl %0,28\n"
201
: "=d" (rc), "=m" (ptff_block)
202
: "d" (reg0), "d" (reg1), "m" (ptff_block) : "cc");
203
return rc;
204
}
205
206
/* Function codes for the ptff instruction. */
207
#define ETR_PTFF_QAF 0x00 /* query available functions */
208
#define ETR_PTFF_QTO 0x01 /* query tod offset */
209
#define ETR_PTFF_QSI 0x02 /* query steering information */
210
#define ETR_PTFF_ATO 0x40 /* adjust tod offset */
211
#define ETR_PTFF_STO 0x41 /* set tod offset */
212
#define ETR_PTFF_SFS 0x42 /* set fine steering rate */
213
#define ETR_PTFF_SGS 0x43 /* set gross steering rate */
214
215
/* Functions needed by the machine check handler */
216
void etr_switch_to_local(void);
217
void etr_sync_check(void);
218
219
/* STP interruption parameter */
220
struct stp_irq_parm {
221
unsigned int _pad0 : 14;
222
unsigned int tsc : 1; /* Timing status change */
223
unsigned int lac : 1; /* Link availability change */
224
unsigned int tcpc : 1; /* Time control parameter change */
225
unsigned int _pad2 : 15;
226
} __attribute__ ((packed));
227
228
#define STP_OP_SYNC 1
229
#define STP_OP_CTRL 3
230
231
struct stp_sstpi {
232
unsigned int rsvd0;
233
unsigned int rsvd1 : 8;
234
unsigned int stratum : 8;
235
unsigned int vbits : 16;
236
unsigned int leaps : 16;
237
unsigned int tmd : 4;
238
unsigned int ctn : 4;
239
unsigned int rsvd2 : 3;
240
unsigned int c : 1;
241
unsigned int tst : 4;
242
unsigned int tzo : 16;
243
unsigned int dsto : 16;
244
unsigned int ctrl : 16;
245
unsigned int rsvd3 : 16;
246
unsigned int tto;
247
unsigned int rsvd4;
248
unsigned int ctnid[3];
249
unsigned int rsvd5;
250
unsigned int todoff[4];
251
unsigned int rsvd6[48];
252
} __attribute__ ((packed));
253
254
/* Functions needed by the machine check handler */
255
void stp_sync_check(void);
256
void stp_island_check(void);
257
258
#endif /* __S390_ETR_H */
259
260