Statistics
| Branch: | Revision:

root / pc-bios / s390-ccw / cio.h @ f487b677

History | View | Annotate | Download (8.6 kB)

1 1e17c2c1 Alexander Graf
/*
2 1e17c2c1 Alexander Graf
 * Channel IO definitions
3 1e17c2c1 Alexander Graf
 *
4 1e17c2c1 Alexander Graf
 * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
5 1e17c2c1 Alexander Graf
 *
6 1e17c2c1 Alexander Graf
 * Inspired by various s390 headers in Linux 3.9.
7 1e17c2c1 Alexander Graf
 *
8 1e17c2c1 Alexander Graf
 * This work is licensed under the terms of the GNU GPL, version 2 or (at
9 1e17c2c1 Alexander Graf
 * your option) any later version. See the COPYING file in the top-level
10 1e17c2c1 Alexander Graf
 * directory.
11 1e17c2c1 Alexander Graf
 */
12 1e17c2c1 Alexander Graf
13 1e17c2c1 Alexander Graf
#ifndef CIO_H
14 1e17c2c1 Alexander Graf
#define CIO_H
15 1e17c2c1 Alexander Graf
16 1e17c2c1 Alexander Graf
/*
17 1e17c2c1 Alexander Graf
 * path management control word
18 1e17c2c1 Alexander Graf
 */
19 1e17c2c1 Alexander Graf
struct pmcw {
20 1e17c2c1 Alexander Graf
    __u32 intparm;        /* interruption parameter */
21 1e17c2c1 Alexander Graf
    __u32 qf      : 1;    /* qdio facility */
22 1e17c2c1 Alexander Graf
    __u32 w       : 1;
23 1e17c2c1 Alexander Graf
    __u32 isc     : 3;    /* interruption sublass */
24 1e17c2c1 Alexander Graf
    __u32 res5    : 3;    /* reserved zeros */
25 1e17c2c1 Alexander Graf
    __u32 ena     : 1;    /* enabled */
26 1e17c2c1 Alexander Graf
    __u32 lm      : 2;    /* limit mode */
27 1e17c2c1 Alexander Graf
    __u32 mme     : 2;    /* measurement-mode enable */
28 1e17c2c1 Alexander Graf
    __u32 mp      : 1;    /* multipath mode */
29 1e17c2c1 Alexander Graf
    __u32 tf      : 1;    /* timing facility */
30 1e17c2c1 Alexander Graf
    __u32 dnv     : 1;    /* device number valid */
31 1e17c2c1 Alexander Graf
    __u32 dev     : 16;   /* device number */
32 1e17c2c1 Alexander Graf
    __u8  lpm;            /* logical path mask */
33 1e17c2c1 Alexander Graf
    __u8  pnom;           /* path not operational mask */
34 1e17c2c1 Alexander Graf
    __u8  lpum;           /* last path used mask */
35 1e17c2c1 Alexander Graf
    __u8  pim;            /* path installed mask */
36 1e17c2c1 Alexander Graf
    __u16 mbi;            /* measurement-block index */
37 1e17c2c1 Alexander Graf
    __u8  pom;            /* path operational mask */
38 1e17c2c1 Alexander Graf
    __u8  pam;            /* path available mask */
39 1e17c2c1 Alexander Graf
    __u8  chpid[8];       /* CHPID 0-7 (if available) */
40 1e17c2c1 Alexander Graf
    __u32 unused1 : 8;    /* reserved zeros */
41 1e17c2c1 Alexander Graf
    __u32 st      : 3;    /* subchannel type */
42 1e17c2c1 Alexander Graf
    __u32 unused2 : 18;   /* reserved zeros */
43 1e17c2c1 Alexander Graf
    __u32 mbfc    : 1;    /* measurement block format control */
44 1e17c2c1 Alexander Graf
    __u32 xmwme   : 1;    /* extended measurement word mode enable */
45 1e17c2c1 Alexander Graf
    __u32 csense  : 1;    /* concurrent sense; can be enabled ...*/
46 1e17c2c1 Alexander Graf
                /*  ... per MSCH, however, if facility */
47 1e17c2c1 Alexander Graf
                /*  ... is not installed, this results */
48 1e17c2c1 Alexander Graf
                /*  ... in an operand exception.       */
49 1e17c2c1 Alexander Graf
} __attribute__ ((packed));
50 1e17c2c1 Alexander Graf
51 1e17c2c1 Alexander Graf
/* Target SCHIB configuration. */
52 1e17c2c1 Alexander Graf
struct schib_config {
53 1e17c2c1 Alexander Graf
    __u64 mba;
54 1e17c2c1 Alexander Graf
    __u32 intparm;
55 1e17c2c1 Alexander Graf
    __u16 mbi;
56 1e17c2c1 Alexander Graf
    __u32 isc:3;
57 1e17c2c1 Alexander Graf
    __u32 ena:1;
58 1e17c2c1 Alexander Graf
    __u32 mme:2;
59 1e17c2c1 Alexander Graf
    __u32 mp:1;
60 1e17c2c1 Alexander Graf
    __u32 csense:1;
61 1e17c2c1 Alexander Graf
    __u32 mbfc:1;
62 1e17c2c1 Alexander Graf
} __attribute__ ((packed));
63 1e17c2c1 Alexander Graf
64 1e17c2c1 Alexander Graf
struct scsw {
65 1e17c2c1 Alexander Graf
    __u16 flags;
66 1e17c2c1 Alexander Graf
    __u16 ctrl;
67 1e17c2c1 Alexander Graf
    __u32 cpa;
68 1e17c2c1 Alexander Graf
    __u8 dstat;
69 1e17c2c1 Alexander Graf
    __u8 cstat;
70 1e17c2c1 Alexander Graf
    __u16 count;
71 1e17c2c1 Alexander Graf
} __attribute__ ((packed));
72 1e17c2c1 Alexander Graf
73 1e17c2c1 Alexander Graf
#define SCSW_FCTL_CLEAR_FUNC 0x1000
74 1e17c2c1 Alexander Graf
#define SCSW_FCTL_HALT_FUNC 0x2000
75 1e17c2c1 Alexander Graf
#define SCSW_FCTL_START_FUNC 0x4000
76 1e17c2c1 Alexander Graf
77 1e17c2c1 Alexander Graf
/*
78 1e17c2c1 Alexander Graf
 * subchannel information block
79 1e17c2c1 Alexander Graf
 */
80 1e17c2c1 Alexander Graf
struct schib {
81 1e17c2c1 Alexander Graf
    struct pmcw pmcw;     /* path management control word */
82 1e17c2c1 Alexander Graf
    struct scsw scsw;     /* subchannel status word */
83 1e17c2c1 Alexander Graf
    __u64 mba;            /* measurement block address */
84 1e17c2c1 Alexander Graf
    __u8 mda[4];          /* model dependent area */
85 1e17c2c1 Alexander Graf
} __attribute__ ((packed,aligned(4)));
86 1e17c2c1 Alexander Graf
87 1e17c2c1 Alexander Graf
struct subchannel_id {
88 1e17c2c1 Alexander Graf
        __u32 cssid  : 8;
89 1e17c2c1 Alexander Graf
        __u32        : 4;
90 1e17c2c1 Alexander Graf
        __u32 m      : 1;
91 1e17c2c1 Alexander Graf
        __u32 ssid   : 2;
92 1e17c2c1 Alexander Graf
        __u32 one    : 1;
93 1e17c2c1 Alexander Graf
        __u32 sch_no : 16;
94 1e17c2c1 Alexander Graf
} __attribute__ ((packed, aligned(4)));
95 1e17c2c1 Alexander Graf
96 1e17c2c1 Alexander Graf
/*
97 1e17c2c1 Alexander Graf
 * TPI info structure
98 1e17c2c1 Alexander Graf
 */
99 1e17c2c1 Alexander Graf
struct tpi_info {
100 1e17c2c1 Alexander Graf
    struct subchannel_id schid;
101 1e17c2c1 Alexander Graf
    __u32 intparm;         /* interruption parameter */
102 1e17c2c1 Alexander Graf
    __u32 adapter_IO : 1;
103 1e17c2c1 Alexander Graf
    __u32 reserved2  : 1;
104 1e17c2c1 Alexander Graf
    __u32 isc        : 3;
105 1e17c2c1 Alexander Graf
    __u32 reserved3  : 12;
106 1e17c2c1 Alexander Graf
    __u32 int_type   : 3;
107 1e17c2c1 Alexander Graf
    __u32 reserved4  : 12;
108 1e17c2c1 Alexander Graf
} __attribute__ ((packed));
109 1e17c2c1 Alexander Graf
110 1e17c2c1 Alexander Graf
/* channel command word (type 1) */
111 1e17c2c1 Alexander Graf
struct ccw1 {
112 1e17c2c1 Alexander Graf
    __u8 cmd_code;
113 1e17c2c1 Alexander Graf
    __u8 flags;
114 1e17c2c1 Alexander Graf
    __u16 count;
115 1e17c2c1 Alexander Graf
    __u32 cda;
116 1e17c2c1 Alexander Graf
} __attribute__ ((packed));
117 1e17c2c1 Alexander Graf
118 1e17c2c1 Alexander Graf
#define CCW_FLAG_DC              0x80
119 1e17c2c1 Alexander Graf
#define CCW_FLAG_CC              0x40
120 1e17c2c1 Alexander Graf
#define CCW_FLAG_SLI             0x20
121 1e17c2c1 Alexander Graf
#define CCW_FLAG_SKIP            0x10
122 1e17c2c1 Alexander Graf
#define CCW_FLAG_PCI             0x08
123 1e17c2c1 Alexander Graf
#define CCW_FLAG_IDA             0x04
124 1e17c2c1 Alexander Graf
#define CCW_FLAG_SUSPEND         0x02
125 1e17c2c1 Alexander Graf
126 1e17c2c1 Alexander Graf
#define CCW_CMD_NOOP             0x03
127 1e17c2c1 Alexander Graf
#define CCW_CMD_BASIC_SENSE      0x04
128 1e17c2c1 Alexander Graf
#define CCW_CMD_TIC              0x08
129 1e17c2c1 Alexander Graf
#define CCW_CMD_SENSE_ID         0xe4
130 1e17c2c1 Alexander Graf
131 1e17c2c1 Alexander Graf
#define CCW_CMD_SET_VQ           0x13
132 1e17c2c1 Alexander Graf
#define CCW_CMD_VDEV_RESET       0x33
133 1e17c2c1 Alexander Graf
#define CCW_CMD_READ_FEAT        0x12
134 1e17c2c1 Alexander Graf
#define CCW_CMD_WRITE_FEAT       0x11
135 1e17c2c1 Alexander Graf
#define CCW_CMD_READ_CONF        0x22
136 1e17c2c1 Alexander Graf
#define CCW_CMD_WRITE_CONF       0x21
137 1e17c2c1 Alexander Graf
#define CCW_CMD_WRITE_STATUS     0x31
138 1e17c2c1 Alexander Graf
#define CCW_CMD_SET_IND          0x43
139 1e17c2c1 Alexander Graf
#define CCW_CMD_SET_CONF_IND     0x53
140 1e17c2c1 Alexander Graf
#define CCW_CMD_READ_VQ_CONF     0x32
141 1e17c2c1 Alexander Graf
142 1e17c2c1 Alexander Graf
/*
143 1e17c2c1 Alexander Graf
 * Command-mode operation request block
144 1e17c2c1 Alexander Graf
 */
145 1e17c2c1 Alexander Graf
struct cmd_orb {
146 1e17c2c1 Alexander Graf
    __u32 intparm;    /* interruption parameter */
147 1e17c2c1 Alexander Graf
    __u32 key:4;      /* flags, like key, suspend control, etc. */
148 1e17c2c1 Alexander Graf
    __u32 spnd:1;     /* suspend control */
149 1e17c2c1 Alexander Graf
    __u32 res1:1;     /* reserved */
150 1e17c2c1 Alexander Graf
    __u32 mod:1;      /* modification control */
151 1e17c2c1 Alexander Graf
    __u32 sync:1;     /* synchronize control */
152 1e17c2c1 Alexander Graf
    __u32 fmt:1;      /* format control */
153 1e17c2c1 Alexander Graf
    __u32 pfch:1;     /* prefetch control */
154 1e17c2c1 Alexander Graf
    __u32 isic:1;     /* initial-status-interruption control */
155 1e17c2c1 Alexander Graf
    __u32 alcc:1;     /* address-limit-checking control */
156 1e17c2c1 Alexander Graf
    __u32 ssic:1;     /* suppress-suspended-interr. control */
157 1e17c2c1 Alexander Graf
    __u32 res2:1;     /* reserved */
158 1e17c2c1 Alexander Graf
    __u32 c64:1;      /* IDAW/QDIO 64 bit control  */
159 1e17c2c1 Alexander Graf
    __u32 i2k:1;      /* IDAW 2/4kB block size control */
160 1e17c2c1 Alexander Graf
    __u32 lpm:8;      /* logical path mask */
161 1e17c2c1 Alexander Graf
    __u32 ils:1;      /* incorrect length */
162 1e17c2c1 Alexander Graf
    __u32 zero:6;     /* reserved zeros */
163 1e17c2c1 Alexander Graf
    __u32 orbx:1;     /* ORB extension control */
164 1e17c2c1 Alexander Graf
    __u32 cpa;    /* channel program address */
165 1e17c2c1 Alexander Graf
}  __attribute__ ((packed, aligned(4)));
166 1e17c2c1 Alexander Graf
167 1e17c2c1 Alexander Graf
struct ciw {
168 1e17c2c1 Alexander Graf
    __u8 type;
169 1e17c2c1 Alexander Graf
    __u8 command;
170 1e17c2c1 Alexander Graf
    __u16 count;
171 1e17c2c1 Alexander Graf
};
172 1e17c2c1 Alexander Graf
173 1e17c2c1 Alexander Graf
/*
174 1e17c2c1 Alexander Graf
 * sense-id response buffer layout
175 1e17c2c1 Alexander Graf
 */
176 1e17c2c1 Alexander Graf
struct senseid {
177 1e17c2c1 Alexander Graf
    /* common part */
178 1e17c2c1 Alexander Graf
    __u8  reserved;   /* always 0x'FF' */
179 1e17c2c1 Alexander Graf
    __u16 cu_type;    /* control unit type */
180 1e17c2c1 Alexander Graf
    __u8  cu_model;   /* control unit model */
181 1e17c2c1 Alexander Graf
    __u16 dev_type;   /* device type */
182 1e17c2c1 Alexander Graf
    __u8  dev_model;  /* device model */
183 1e17c2c1 Alexander Graf
    __u8  unused;     /* padding byte */
184 1e17c2c1 Alexander Graf
    /* extended part */
185 1e17c2c1 Alexander Graf
    struct ciw ciw[62];
186 1e17c2c1 Alexander Graf
}  __attribute__ ((packed, aligned(4)));
187 1e17c2c1 Alexander Graf
188 1e17c2c1 Alexander Graf
/* interruption response block */
189 1e17c2c1 Alexander Graf
struct irb {
190 1e17c2c1 Alexander Graf
    struct scsw scsw;
191 1e17c2c1 Alexander Graf
    __u32 esw[5];
192 1e17c2c1 Alexander Graf
    __u32 ecw[8];
193 1e17c2c1 Alexander Graf
    __u32 emw[8];
194 1e17c2c1 Alexander Graf
}  __attribute__ ((packed, aligned(4)));
195 1e17c2c1 Alexander Graf
196 1e17c2c1 Alexander Graf
/*
197 1e17c2c1 Alexander Graf
 * Some S390 specific IO instructions as inline
198 1e17c2c1 Alexander Graf
 */
199 1e17c2c1 Alexander Graf
200 1e17c2c1 Alexander Graf
static inline int stsch_err(struct subchannel_id schid, struct schib *addr)
201 1e17c2c1 Alexander Graf
{
202 1e17c2c1 Alexander Graf
    register struct subchannel_id reg1 asm ("1") = schid;
203 1e17c2c1 Alexander Graf
    int ccode = -EIO;
204 1e17c2c1 Alexander Graf
205 1e17c2c1 Alexander Graf
    asm volatile(
206 1e17c2c1 Alexander Graf
        "    stsch    0(%3)\n"
207 1e17c2c1 Alexander Graf
        "0:  ipm    %0\n"
208 1e17c2c1 Alexander Graf
        "    srl    %0,28\n"
209 1e17c2c1 Alexander Graf
        "1:\n"
210 1e17c2c1 Alexander Graf
        : "+d" (ccode), "=m" (*addr)
211 1e17c2c1 Alexander Graf
        : "d" (reg1), "a" (addr)
212 1e17c2c1 Alexander Graf
        : "cc");
213 1e17c2c1 Alexander Graf
    return ccode;
214 1e17c2c1 Alexander Graf
}
215 1e17c2c1 Alexander Graf
216 1e17c2c1 Alexander Graf
static inline int msch(struct subchannel_id schid, struct schib *addr)
217 1e17c2c1 Alexander Graf
{
218 1e17c2c1 Alexander Graf
    register struct subchannel_id reg1 asm ("1") = schid;
219 1e17c2c1 Alexander Graf
    int ccode;
220 1e17c2c1 Alexander Graf
221 1e17c2c1 Alexander Graf
    asm volatile(
222 1e17c2c1 Alexander Graf
        "    msch    0(%2)\n"
223 1e17c2c1 Alexander Graf
        "    ipm    %0\n"
224 1e17c2c1 Alexander Graf
        "    srl    %0,28"
225 1e17c2c1 Alexander Graf
        : "=d" (ccode)
226 1e17c2c1 Alexander Graf
        : "d" (reg1), "a" (addr), "m" (*addr)
227 1e17c2c1 Alexander Graf
        : "cc");
228 1e17c2c1 Alexander Graf
    return ccode;
229 1e17c2c1 Alexander Graf
}
230 1e17c2c1 Alexander Graf
231 1e17c2c1 Alexander Graf
static inline int msch_err(struct subchannel_id schid, struct schib *addr)
232 1e17c2c1 Alexander Graf
{
233 1e17c2c1 Alexander Graf
    register struct subchannel_id reg1 asm ("1") = schid;
234 1e17c2c1 Alexander Graf
    int ccode = -EIO;
235 1e17c2c1 Alexander Graf
236 1e17c2c1 Alexander Graf
    asm volatile(
237 1e17c2c1 Alexander Graf
        "    msch    0(%2)\n"
238 1e17c2c1 Alexander Graf
        "0:  ipm    %0\n"
239 1e17c2c1 Alexander Graf
        "    srl    %0,28\n"
240 1e17c2c1 Alexander Graf
        "1:\n"
241 1e17c2c1 Alexander Graf
        : "+d" (ccode)
242 1e17c2c1 Alexander Graf
        : "d" (reg1), "a" (addr), "m" (*addr)
243 1e17c2c1 Alexander Graf
        : "cc");
244 1e17c2c1 Alexander Graf
    return ccode;
245 1e17c2c1 Alexander Graf
}
246 1e17c2c1 Alexander Graf
247 1e17c2c1 Alexander Graf
static inline int tsch(struct subchannel_id schid, struct irb *addr)
248 1e17c2c1 Alexander Graf
{
249 1e17c2c1 Alexander Graf
    register struct subchannel_id reg1 asm ("1") = schid;
250 1e17c2c1 Alexander Graf
    int ccode;
251 1e17c2c1 Alexander Graf
252 1e17c2c1 Alexander Graf
    asm volatile(
253 1e17c2c1 Alexander Graf
        "    tsch    0(%3)\n"
254 1e17c2c1 Alexander Graf
        "    ipm    %0\n"
255 1e17c2c1 Alexander Graf
        "    srl    %0,28"
256 1e17c2c1 Alexander Graf
        : "=d" (ccode), "=m" (*addr)
257 1e17c2c1 Alexander Graf
        : "d" (reg1), "a" (addr)
258 1e17c2c1 Alexander Graf
        : "cc");
259 1e17c2c1 Alexander Graf
    return ccode;
260 1e17c2c1 Alexander Graf
}
261 1e17c2c1 Alexander Graf
262 1e17c2c1 Alexander Graf
static inline int ssch(struct subchannel_id schid, struct cmd_orb *addr)
263 1e17c2c1 Alexander Graf
{
264 1e17c2c1 Alexander Graf
    register struct subchannel_id reg1 asm("1") = schid;
265 1e17c2c1 Alexander Graf
    int ccode = -EIO;
266 1e17c2c1 Alexander Graf
267 1e17c2c1 Alexander Graf
    asm volatile(
268 1e17c2c1 Alexander Graf
        "    ssch    0(%2)\n"
269 1e17c2c1 Alexander Graf
        "0:  ipm    %0\n"
270 1e17c2c1 Alexander Graf
        "    srl    %0,28\n"
271 1e17c2c1 Alexander Graf
        "1:\n"
272 1e17c2c1 Alexander Graf
        : "+d" (ccode)
273 1e17c2c1 Alexander Graf
        : "d" (reg1), "a" (addr), "m" (*addr)
274 1e17c2c1 Alexander Graf
        : "cc", "memory");
275 1e17c2c1 Alexander Graf
    return ccode;
276 1e17c2c1 Alexander Graf
}
277 1e17c2c1 Alexander Graf
278 1e17c2c1 Alexander Graf
static inline int csch(struct subchannel_id schid)
279 1e17c2c1 Alexander Graf
{
280 1e17c2c1 Alexander Graf
    register struct subchannel_id reg1 asm("1") = schid;
281 1e17c2c1 Alexander Graf
    int ccode;
282 1e17c2c1 Alexander Graf
283 1e17c2c1 Alexander Graf
    asm volatile(
284 1e17c2c1 Alexander Graf
        "    csch\n"
285 1e17c2c1 Alexander Graf
        "    ipm    %0\n"
286 1e17c2c1 Alexander Graf
        "    srl    %0,28"
287 1e17c2c1 Alexander Graf
        : "=d" (ccode)
288 1e17c2c1 Alexander Graf
        : "d" (reg1)
289 1e17c2c1 Alexander Graf
        : "cc");
290 1e17c2c1 Alexander Graf
    return ccode;
291 1e17c2c1 Alexander Graf
}
292 1e17c2c1 Alexander Graf
293 1e17c2c1 Alexander Graf
static inline int tpi(struct tpi_info *addr)
294 1e17c2c1 Alexander Graf
{
295 1e17c2c1 Alexander Graf
    int ccode;
296 1e17c2c1 Alexander Graf
297 1e17c2c1 Alexander Graf
    asm volatile(
298 1e17c2c1 Alexander Graf
        "    tpi    0(%2)\n"
299 1e17c2c1 Alexander Graf
        "    ipm    %0\n"
300 1e17c2c1 Alexander Graf
        "    srl    %0,28"
301 1e17c2c1 Alexander Graf
        : "=d" (ccode), "=m" (*addr)
302 1e17c2c1 Alexander Graf
        : "a" (addr)
303 1e17c2c1 Alexander Graf
        : "cc");
304 1e17c2c1 Alexander Graf
    return ccode;
305 1e17c2c1 Alexander Graf
}
306 1e17c2c1 Alexander Graf
307 1e17c2c1 Alexander Graf
static inline int chsc(void *chsc_area)
308 1e17c2c1 Alexander Graf
{
309 1e17c2c1 Alexander Graf
    typedef struct { char _[4096]; } addr_type;
310 1e17c2c1 Alexander Graf
    int cc;
311 1e17c2c1 Alexander Graf
312 1e17c2c1 Alexander Graf
    asm volatile(
313 1e17c2c1 Alexander Graf
        "    .insn    rre,0xb25f0000,%2,0\n"
314 1e17c2c1 Alexander Graf
        "    ipm    %0\n"
315 1e17c2c1 Alexander Graf
        "    srl    %0,28\n"
316 1e17c2c1 Alexander Graf
        : "=d" (cc), "=m" (*(addr_type *) chsc_area)
317 1e17c2c1 Alexander Graf
        : "d" (chsc_area), "m" (*(addr_type *) chsc_area)
318 1e17c2c1 Alexander Graf
        : "cc");
319 1e17c2c1 Alexander Graf
    return cc;
320 1e17c2c1 Alexander Graf
}
321 1e17c2c1 Alexander Graf
322 1e17c2c1 Alexander Graf
#endif /* CIO_H */