Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * File...........: linux/drivers/s390/block/dasd.c | |
3 | * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> | |
4 | * Bugreports.to..: <Linux390@de.ibm.com> | |
5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | |
ab1d848f NH |
6 | * EMC Symmetrix ioctl Copyright EMC Corporation, 2008 |
7 | * Author.........: Nigel Hislop <hislop_nigel@emc.com> | |
1da177e4 LT |
8 | * |
9 | * This file is the interface of the DASD device driver, which is exported to user space | |
10 | * any future changes wrt the API will result in a change of the APIVERSION reported | |
11 | * to userspace by the DASDAPIVER-ioctl | |
12 | * | |
1da177e4 LT |
13 | */ |
14 | ||
15 | #ifndef DASD_H | |
16 | #define DASD_H | |
0680ba01 | 17 | #include <linux/types.h> |
1da177e4 LT |
18 | #include <linux/ioctl.h> |
19 | ||
20 | #define DASD_IOCTL_LETTER 'D' | |
21 | ||
22 | #define DASD_API_VERSION 6 | |
23 | ||
24 | /* | |
25 | * struct dasd_information2_t | |
26 | * represents any data about the device, which is visible to userspace. | |
27 | * including foramt and featueres. | |
28 | */ | |
29 | typedef struct dasd_information2_t { | |
30 | unsigned int devno; /* S/390 devno */ | |
31 | unsigned int real_devno; /* for aliases */ | |
32 | unsigned int schid; /* S/390 subchannel identifier */ | |
33 | unsigned int cu_type : 16; /* from SenseID */ | |
34 | unsigned int cu_model : 8; /* from SenseID */ | |
35 | unsigned int dev_type : 16; /* from SenseID */ | |
36 | unsigned int dev_model : 8; /* from SenseID */ | |
37 | unsigned int open_count; | |
38 | unsigned int req_queue_len; | |
39 | unsigned int chanq_len; /* length of chanq */ | |
40 | char type[4]; /* from discipline.name, 'none' for unknown */ | |
41 | unsigned int status; /* current device level */ | |
42 | unsigned int label_block; /* where to find the VOLSER */ | |
43 | unsigned int FBA_layout; /* fixed block size (like AIXVOL) */ | |
44 | unsigned int characteristics_size; | |
45 | unsigned int confdata_size; | |
46 | char characteristics[64]; /* from read_device_characteristics */ | |
47 | char configuration_data[256]; /* from read_configuration_data */ | |
48 | unsigned int format; /* format info like formatted/cdl/ldl/... */ | |
49 | unsigned int features; /* dasd features like 'ro',... */ | |
50 | unsigned int reserved0; /* reserved for further use ,... */ | |
51 | unsigned int reserved1; /* reserved for further use ,... */ | |
52 | unsigned int reserved2; /* reserved for further use ,... */ | |
53 | unsigned int reserved3; /* reserved for further use ,... */ | |
54 | unsigned int reserved4; /* reserved for further use ,... */ | |
55 | unsigned int reserved5; /* reserved for further use ,... */ | |
56 | unsigned int reserved6; /* reserved for further use ,... */ | |
57 | unsigned int reserved7; /* reserved for further use ,... */ | |
58 | } dasd_information2_t; | |
59 | ||
60 | /* | |
61 | * values to be used for dasd_information_t.format | |
62 | * 0x00: NOT formatted | |
63 | * 0x01: Linux disc layout | |
64 | * 0x02: Common disc layout | |
65 | */ | |
66 | #define DASD_FORMAT_NONE 0 | |
67 | #define DASD_FORMAT_LDL 1 | |
68 | #define DASD_FORMAT_CDL 2 | |
69 | /* | |
70 | * values to be used for dasd_information_t.features | |
71 | * 0x00: default features | |
72 | * 0x01: readonly (ro) | |
73 | * 0x02: use diag discipline (diag) | |
40545573 | 74 | * 0x04: set the device initially online (internal use only) |
9575bf26 | 75 | * 0x08: enable ERP related logging |
e4dbb0f2 | 76 | * 0x20: give access to raw eckd data |
1da177e4 | 77 | */ |
40545573 HH |
78 | #define DASD_FEATURE_DEFAULT 0x00 |
79 | #define DASD_FEATURE_READONLY 0x01 | |
80 | #define DASD_FEATURE_USEDIAG 0x02 | |
81 | #define DASD_FEATURE_INITIAL_ONLINE 0x04 | |
9575bf26 | 82 | #define DASD_FEATURE_ERPLOG 0x08 |
13de227b | 83 | #define DASD_FEATURE_FAILFAST 0x10 |
5a27e60d | 84 | #define DASD_FEATURE_FAILONSLCK 0x20 |
e4dbb0f2 | 85 | #define DASD_FEATURE_USERAW 0x40 |
1da177e4 LT |
86 | |
87 | #define DASD_PARTN_BITS 2 | |
88 | ||
89 | /* | |
90 | * struct dasd_information_t | |
91 | * represents any data about the data, which is visible to userspace | |
92 | */ | |
93 | typedef struct dasd_information_t { | |
94 | unsigned int devno; /* S/390 devno */ | |
95 | unsigned int real_devno; /* for aliases */ | |
96 | unsigned int schid; /* S/390 subchannel identifier */ | |
97 | unsigned int cu_type : 16; /* from SenseID */ | |
98 | unsigned int cu_model : 8; /* from SenseID */ | |
99 | unsigned int dev_type : 16; /* from SenseID */ | |
100 | unsigned int dev_model : 8; /* from SenseID */ | |
101 | unsigned int open_count; | |
102 | unsigned int req_queue_len; | |
103 | unsigned int chanq_len; /* length of chanq */ | |
104 | char type[4]; /* from discipline.name, 'none' for unknown */ | |
105 | unsigned int status; /* current device level */ | |
106 | unsigned int label_block; /* where to find the VOLSER */ | |
107 | unsigned int FBA_layout; /* fixed block size (like AIXVOL) */ | |
108 | unsigned int characteristics_size; | |
109 | unsigned int confdata_size; | |
110 | char characteristics[64]; /* from read_device_characteristics */ | |
111 | char configuration_data[256]; /* from read_configuration_data */ | |
112 | } dasd_information_t; | |
113 | ||
114 | /* | |
5800266a | 115 | * Read Subsystem Data - Performance Statistics |
1da177e4 LT |
116 | */ |
117 | typedef struct dasd_rssd_perf_stats_t { | |
118 | unsigned char invalid:1; | |
119 | unsigned char format:3; | |
120 | unsigned char data_format:4; | |
121 | unsigned char unit_address; | |
122 | unsigned short device_status; | |
123 | unsigned int nr_read_normal; | |
124 | unsigned int nr_read_normal_hits; | |
125 | unsigned int nr_write_normal; | |
126 | unsigned int nr_write_fast_normal_hits; | |
127 | unsigned int nr_read_seq; | |
128 | unsigned int nr_read_seq_hits; | |
129 | unsigned int nr_write_seq; | |
130 | unsigned int nr_write_fast_seq_hits; | |
131 | unsigned int nr_read_cache; | |
132 | unsigned int nr_read_cache_hits; | |
133 | unsigned int nr_write_cache; | |
134 | unsigned int nr_write_fast_cache_hits; | |
135 | unsigned int nr_inhibit_cache; | |
136 | unsigned int nr_bybass_cache; | |
137 | unsigned int nr_seq_dasd_to_cache; | |
138 | unsigned int nr_dasd_to_cache; | |
139 | unsigned int nr_cache_to_dasd; | |
140 | unsigned int nr_delayed_fast_write; | |
141 | unsigned int nr_normal_fast_write; | |
142 | unsigned int nr_seq_fast_write; | |
143 | unsigned int nr_cache_miss; | |
144 | unsigned char status2; | |
145 | unsigned int nr_quick_write_promotes; | |
146 | unsigned char reserved; | |
147 | unsigned short ssid; | |
148 | unsigned char reseved2[96]; | |
149 | } __attribute__((packed)) dasd_rssd_perf_stats_t; | |
150 | ||
151 | /* | |
152 | * struct profile_info_t | |
153 | * holds the profinling information | |
154 | */ | |
155 | typedef struct dasd_profile_info_t { | |
156 | unsigned int dasd_io_reqs; /* number of requests processed at all */ | |
157 | unsigned int dasd_io_sects; /* number of sectors processed at all */ | |
158 | unsigned int dasd_io_secs[32]; /* histogram of request's sizes */ | |
159 | unsigned int dasd_io_times[32]; /* histogram of requests's times */ | |
160 | unsigned int dasd_io_timps[32]; /* histogram of requests's times per sector */ | |
161 | unsigned int dasd_io_time1[32]; /* histogram of time from build to start */ | |
162 | unsigned int dasd_io_time2[32]; /* histogram of time from start to irq */ | |
163 | unsigned int dasd_io_time2ps[32]; /* histogram of time from start to irq */ | |
164 | unsigned int dasd_io_time3[32]; /* histogram of time from irq to end */ | |
165 | unsigned int dasd_io_nr_req[32]; /* histogram of # of requests in chanq */ | |
166 | } dasd_profile_info_t; | |
167 | ||
b44b0ab3 | 168 | /* |
1da177e4 LT |
169 | * struct format_data_t |
170 | * represents all data necessary to format a dasd | |
171 | */ | |
172 | typedef struct format_data_t { | |
b44b0ab3 SW |
173 | unsigned int start_unit; /* from track */ |
174 | unsigned int stop_unit; /* to track */ | |
175 | unsigned int blksize; /* sectorsize */ | |
176 | unsigned int intensity; | |
1da177e4 LT |
177 | } format_data_t; |
178 | ||
179 | /* | |
180 | * values to be used for format_data_t.intensity | |
181 | * 0/8: normal format | |
182 | * 1/9: also write record zero | |
183 | * 3/11: also write home address | |
184 | * 4/12: invalidate track | |
185 | */ | |
186 | #define DASD_FMT_INT_FMT_R0 1 /* write record zero */ | |
187 | #define DASD_FMT_INT_FMT_HA 2 /* write home address, also set FMT_R0 ! */ | |
188 | #define DASD_FMT_INT_INVAL 4 /* invalidate tracks */ | |
189 | #define DASD_FMT_INT_COMPAT 8 /* use OS/390 compatible disk layout */ | |
190 | ||
191 | ||
192 | /* | |
193 | * struct attrib_data_t | |
194 | * represents the operation (cache) bits for the device. | |
195 | * Used in DE to influence caching of the DASD. | |
196 | */ | |
197 | typedef struct attrib_data_t { | |
198 | unsigned char operation:3; /* cache operation mode */ | |
199 | unsigned char reserved:5; /* cache operation mode */ | |
200 | __u16 nr_cyl; /* no of cyliners for read ahaed */ | |
201 | __u8 reserved2[29]; /* for future use */ | |
202 | } __attribute__ ((packed)) attrib_data_t; | |
203 | ||
204 | /* definition of operation (cache) bits within attributes of DE */ | |
205 | #define DASD_NORMAL_CACHE 0x0 | |
206 | #define DASD_BYPASS_CACHE 0x1 | |
207 | #define DASD_INHIBIT_LOAD 0x2 | |
208 | #define DASD_SEQ_ACCESS 0x3 | |
209 | #define DASD_SEQ_PRESTAGE 0x4 | |
210 | #define DASD_REC_ACCESS 0x5 | |
211 | ||
ab1d848f NH |
212 | /* |
213 | * Perform EMC Symmetrix I/O | |
214 | */ | |
215 | typedef struct dasd_symmio_parms { | |
216 | unsigned char reserved[8]; /* compat with older releases */ | |
217 | unsigned long long psf_data; /* char * cast to u64 */ | |
218 | unsigned long long rssd_result; /* char * cast to u64 */ | |
219 | int psf_data_len; | |
220 | int rssd_result_len; | |
221 | } __attribute__ ((packed)) dasd_symmio_parms_t; | |
1da177e4 | 222 | |
196339f1 SW |
223 | /* |
224 | * Data returned by Sense Path Group ID (SNID) | |
225 | */ | |
226 | struct dasd_snid_data { | |
227 | struct { | |
228 | __u8 group:2; | |
229 | __u8 reserve:2; | |
230 | __u8 mode:1; | |
231 | __u8 res:3; | |
232 | } __attribute__ ((packed)) path_state; | |
233 | __u8 pgid[11]; | |
234 | } __attribute__ ((packed)); | |
235 | ||
236 | struct dasd_snid_ioctl_data { | |
237 | struct dasd_snid_data data; | |
238 | __u8 path_mask; | |
239 | } __attribute__ ((packed)); | |
240 | ||
241 | ||
1da177e4 LT |
242 | /******************************************************************************** |
243 | * SECTION: Definition of IOCTLs | |
244 | * | |
245 | * Here ist how the ioctl-nr should be used: | |
246 | * 0 - 31 DASD driver itself | |
49d9c81a | 247 | * 32 - 239 still open |
1da177e4 LT |
248 | * 240 - 255 reserved for EMC |
249 | *******************************************************************************/ | |
250 | ||
251 | /* Disable the volume (for Linux) */ | |
252 | #define BIODASDDISABLE _IO(DASD_IOCTL_LETTER,0) | |
253 | /* Enable the volume (for Linux) */ | |
254 | #define BIODASDENABLE _IO(DASD_IOCTL_LETTER,1) | |
255 | /* Issue a reserve/release command, rsp. */ | |
256 | #define BIODASDRSRV _IO(DASD_IOCTL_LETTER,2) /* reserve */ | |
257 | #define BIODASDRLSE _IO(DASD_IOCTL_LETTER,3) /* release */ | |
258 | #define BIODASDSLCK _IO(DASD_IOCTL_LETTER,4) /* steal lock */ | |
259 | /* reset profiling information of a device */ | |
260 | #define BIODASDPRRST _IO(DASD_IOCTL_LETTER,5) | |
261 | /* Quiesce IO on device */ | |
262 | #define BIODASDQUIESCE _IO(DASD_IOCTL_LETTER,6) | |
263 | /* Resume IO on device */ | |
264 | #define BIODASDRESUME _IO(DASD_IOCTL_LETTER,7) | |
265 | ||
266 | ||
267 | /* retrieve API version number */ | |
268 | #define DASDAPIVER _IOR(DASD_IOCTL_LETTER,0,int) | |
269 | /* Get information on a dasd device */ | |
270 | #define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t) | |
271 | /* retrieve profiling information of a device */ | |
272 | #define BIODASDPRRD _IOR(DASD_IOCTL_LETTER,2,dasd_profile_info_t) | |
273 | /* Get information on a dasd device (enhanced) */ | |
274 | #define BIODASDINFO2 _IOR(DASD_IOCTL_LETTER,3,dasd_information2_t) | |
275 | /* Performance Statistics Read */ | |
276 | #define BIODASDPSRD _IOR(DASD_IOCTL_LETTER,4,dasd_rssd_perf_stats_t) | |
277 | /* Get Attributes (cache operations) */ | |
278 | #define BIODASDGATTR _IOR(DASD_IOCTL_LETTER,5,attrib_data_t) | |
279 | ||
280 | ||
281 | /* #define BIODASDFORMAT _IOW(IOCTL_LETTER,0,format_data_t) , deprecated */ | |
282 | #define BIODASDFMT _IOW(DASD_IOCTL_LETTER,1,format_data_t) | |
283 | /* Set Attributes (cache operations) */ | |
284 | #define BIODASDSATTR _IOW(DASD_IOCTL_LETTER,2,attrib_data_t) | |
285 | ||
196339f1 SW |
286 | /* Get Sense Path Group ID (SNID) data */ |
287 | #define BIODASDSNID _IOWR(DASD_IOCTL_LETTER, 1, struct dasd_snid_ioctl_data) | |
288 | ||
ab1d848f | 289 | #define BIODASDSYMMIO _IOWR(DASD_IOCTL_LETTER, 240, dasd_symmio_parms_t) |
1da177e4 LT |
290 | |
291 | #endif /* DASD_H */ | |
292 |