1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef _VMW_PVSCSI_H_
25#define _VMW_PVSCSI_H_
26
27#include <linux/types.h>
28
29#define PVSCSI_DRIVER_VERSION_STRING "1.0.2.0-k"
30
31#define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128
32
33#define MASK(n) ((1 << (n)) - 1)
34
35#define PCI_VENDOR_ID_VMWARE 0x15AD
36#define PCI_DEVICE_ID_VMWARE_PVSCSI 0x07C0
37
38
39
40
41enum HostBusAdapterStatus {
42 BTSTAT_SUCCESS = 0x00,
43 BTSTAT_LINKED_COMMAND_COMPLETED = 0x0a,
44 BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG = 0x0b,
45 BTSTAT_DATA_UNDERRUN = 0x0c,
46 BTSTAT_SELTIMEO = 0x11,
47 BTSTAT_DATARUN = 0x12,
48 BTSTAT_BUSFREE = 0x13,
49 BTSTAT_INVPHASE = 0x14,
50
51 BTSTAT_LUNMISMATCH = 0x17,
52
53 BTSTAT_INVPARAM = 0x1a,
54
55 BTSTAT_SENSFAILED = 0x1b,
56 BTSTAT_TAGREJECT = 0x1c,
57
58 BTSTAT_BADMSG = 0x1d,
59
60 BTSTAT_HAHARDWARE = 0x20,
61 BTSTAT_NORESPONSE = 0x21,
62
63 BTSTAT_SENTRST = 0x22,
64 BTSTAT_RECVRST = 0x23,
65
66 BTSTAT_DISCONNECT = 0x24,
67
68 BTSTAT_BUSRESET = 0x25,
69 BTSTAT_ABORTQUEUE = 0x26,
70 BTSTAT_HASOFTWARE = 0x27,
71 BTSTAT_HATIMEOUT = 0x30,
72 BTSTAT_SCSIPARITY = 0x34,
73};
74
75
76
77
78enum ScsiDeviceStatus {
79 SDSTAT_GOOD = 0x00,
80 SDSTAT_CHECK = 0x02,
81};
82
83
84
85
86
87
88
89enum PVSCSIRegOffset {
90 PVSCSI_REG_OFFSET_COMMAND = 0x0,
91 PVSCSI_REG_OFFSET_COMMAND_DATA = 0x4,
92 PVSCSI_REG_OFFSET_COMMAND_STATUS = 0x8,
93 PVSCSI_REG_OFFSET_LAST_STS_0 = 0x100,
94 PVSCSI_REG_OFFSET_LAST_STS_1 = 0x104,
95 PVSCSI_REG_OFFSET_LAST_STS_2 = 0x108,
96 PVSCSI_REG_OFFSET_LAST_STS_3 = 0x10c,
97 PVSCSI_REG_OFFSET_INTR_STATUS = 0x100c,
98 PVSCSI_REG_OFFSET_INTR_MASK = 0x2010,
99 PVSCSI_REG_OFFSET_KICK_NON_RW_IO = 0x3014,
100 PVSCSI_REG_OFFSET_DEBUG = 0x3018,
101 PVSCSI_REG_OFFSET_KICK_RW_IO = 0x4018,
102};
103
104
105
106
107
108enum PVSCSICommands {
109 PVSCSI_CMD_FIRST = 0,
110
111 PVSCSI_CMD_ADAPTER_RESET = 1,
112 PVSCSI_CMD_ISSUE_SCSI = 2,
113 PVSCSI_CMD_SETUP_RINGS = 3,
114 PVSCSI_CMD_RESET_BUS = 4,
115 PVSCSI_CMD_RESET_DEVICE = 5,
116 PVSCSI_CMD_ABORT_CMD = 6,
117 PVSCSI_CMD_CONFIG = 7,
118 PVSCSI_CMD_SETUP_MSG_RING = 8,
119 PVSCSI_CMD_DEVICE_UNPLUG = 9,
120
121 PVSCSI_CMD_LAST = 10
122};
123
124
125
126
127
128struct PVSCSICmdDescResetDevice {
129 u32 target;
130 u8 lun[8];
131} __packed;
132
133
134
135
136
137struct PVSCSICmdDescConfigCmd {
138 u64 cmpAddr;
139 u64 configPageAddress;
140 u32 configPageNum;
141 u32 _pad;
142} __packed;
143
144enum PVSCSIConfigPageType {
145 PVSCSI_CONFIG_PAGE_CONTROLLER = 0x1958,
146 PVSCSI_CONFIG_PAGE_PHY = 0x1959,
147 PVSCSI_CONFIG_PAGE_DEVICE = 0x195a,
148};
149
150enum PVSCSIConfigPageAddressType {
151 PVSCSI_CONFIG_CONTROLLER_ADDRESS = 0x2120,
152 PVSCSI_CONFIG_BUSTARGET_ADDRESS = 0x2121,
153 PVSCSI_CONFIG_PHY_ADDRESS = 0x2122,
154};
155
156
157
158
159
160
161
162
163struct PVSCSICmdDescAbortCmd {
164 u64 context;
165 u32 target;
166 u32 _pad;
167} __packed;
168
169
170
171
172
173
174
175
176
177
178
179#define PVSCSI_SETUP_RINGS_MAX_NUM_PAGES 32
180struct PVSCSICmdDescSetupRings {
181 u32 reqRingNumPages;
182 u32 cmpRingNumPages;
183 u64 ringsStatePPN;
184 u64 reqRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
185 u64 cmpRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
186} __packed;
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207#define PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES 16
208
209struct PVSCSICmdDescSetupMsgRing {
210 u32 numPages;
211 u32 _pad;
212 u64 ringPPNs[PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES];
213} __packed;
214
215enum PVSCSIMsgType {
216 PVSCSI_MSG_DEV_ADDED = 0,
217 PVSCSI_MSG_DEV_REMOVED = 1,
218 PVSCSI_MSG_LAST = 2,
219};
220
221
222
223
224
225
226
227
228
229
230struct PVSCSIRingMsgDesc {
231 u32 type;
232 u32 args[31];
233} __packed;
234
235struct PVSCSIMsgDescDevStatusChanged {
236 u32 type;
237 u32 bus;
238 u32 target;
239 u8 lun[8];
240 u32 pad[27];
241} __packed;
242
243
244
245
246
247
248
249
250
251
252
253
254
255struct PVSCSIRingsState {
256 u32 reqProdIdx;
257 u32 reqConsIdx;
258 u32 reqNumEntriesLog2;
259
260 u32 cmpProdIdx;
261 u32 cmpConsIdx;
262 u32 cmpNumEntriesLog2;
263
264 u8 _pad[104];
265
266 u32 msgProdIdx;
267 u32 msgConsIdx;
268 u32 msgNumEntriesLog2;
269} __packed;
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307#define PVSCSI_FLAG_CMD_WITH_SG_LIST (1 << 0)
308#define PVSCSI_FLAG_CMD_OUT_OF_BAND_CDB (1 << 1)
309#define PVSCSI_FLAG_CMD_DIR_NONE (1 << 2)
310#define PVSCSI_FLAG_CMD_DIR_TOHOST (1 << 3)
311#define PVSCSI_FLAG_CMD_DIR_TODEVICE (1 << 4)
312
313struct PVSCSIRingReqDesc {
314 u64 context;
315 u64 dataAddr;
316 u64 dataLen;
317 u64 senseAddr;
318 u32 senseLen;
319 u32 flags;
320 u8 cdb[16];
321 u8 cdbLen;
322 u8 lun[8];
323 u8 tag;
324 u8 bus;
325 u8 target;
326 u8 vcpuHint;
327 u8 unused[59];
328} __packed;
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346struct PVSCSISGElement {
347 u64 addr;
348 u32 length;
349 u32 flags;
350} __packed;
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366struct PVSCSIRingCmpDesc {
367 u64 context;
368 u64 dataLen;
369 u32 senseLen;
370 u16 hostStatus;
371 u16 scsiStatus;
372 u32 _pad[2];
373} __packed;
374
375struct PVSCSIConfigPageHeader {
376 u32 pageNum;
377 u16 numDwords;
378 u16 hostStatus;
379 u16 scsiStatus;
380 u16 reserved[3];
381} __packed;
382
383struct PVSCSIConfigPageController {
384 struct PVSCSIConfigPageHeader header;
385 u64 nodeWWN;
386 u16 manufacturer[64];
387 u16 serialNumber[64];
388 u16 opromVersion[32];
389 u16 hwVersion[32];
390 u16 firmwareVersion[32];
391 u32 numPhys;
392 u8 useConsecutivePhyWWNs;
393 u8 reserved[3];
394} __packed;
395
396
397
398
399
400#define PVSCSI_INTR_CMPL_0 (1 << 0)
401#define PVSCSI_INTR_CMPL_1 (1 << 1)
402#define PVSCSI_INTR_CMPL_MASK MASK(2)
403
404#define PVSCSI_INTR_MSG_0 (1 << 2)
405#define PVSCSI_INTR_MSG_1 (1 << 3)
406#define PVSCSI_INTR_MSG_MASK (MASK(2) << 2)
407
408#define PVSCSI_INTR_ALL_SUPPORTED MASK(4)
409
410
411
412
413#define PVSCSI_MAX_INTRS 24
414
415
416
417
418#define PVSCSI_VECTOR_COMPLETION 0
419
420
421
422
423
424#define PVSCSI_MAX_NUM_PAGES_REQ_RING PVSCSI_SETUP_RINGS_MAX_NUM_PAGES
425#define PVSCSI_MAX_NUM_PAGES_CMP_RING PVSCSI_SETUP_RINGS_MAX_NUM_PAGES
426#define PVSCSI_MAX_NUM_PAGES_MSG_RING PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES
427
428#define PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE \
429 (PAGE_SIZE / sizeof(struct PVSCSIRingReqDesc))
430
431#define PVSCSI_MAX_REQ_QUEUE_DEPTH \
432 (PVSCSI_MAX_NUM_PAGES_REQ_RING * PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE)
433
434#define PVSCSI_MEM_SPACE_COMMAND_NUM_PAGES 1
435#define PVSCSI_MEM_SPACE_INTR_STATUS_NUM_PAGES 1
436#define PVSCSI_MEM_SPACE_MISC_NUM_PAGES 2
437#define PVSCSI_MEM_SPACE_KICK_IO_NUM_PAGES 2
438#define PVSCSI_MEM_SPACE_MSIX_NUM_PAGES 2
439
440enum PVSCSIMemSpace {
441 PVSCSI_MEM_SPACE_COMMAND_PAGE = 0,
442 PVSCSI_MEM_SPACE_INTR_STATUS_PAGE = 1,
443 PVSCSI_MEM_SPACE_MISC_PAGE = 2,
444 PVSCSI_MEM_SPACE_KICK_IO_PAGE = 4,
445 PVSCSI_MEM_SPACE_MSIX_TABLE_PAGE = 6,
446 PVSCSI_MEM_SPACE_MSIX_PBA_PAGE = 7,
447};
448
449#define PVSCSI_MEM_SPACE_NUM_PAGES \
450 (PVSCSI_MEM_SPACE_COMMAND_NUM_PAGES + \
451 PVSCSI_MEM_SPACE_INTR_STATUS_NUM_PAGES + \
452 PVSCSI_MEM_SPACE_MISC_NUM_PAGES + \
453 PVSCSI_MEM_SPACE_KICK_IO_NUM_PAGES + \
454 PVSCSI_MEM_SPACE_MSIX_NUM_PAGES)
455
456#define PVSCSI_MEM_SPACE_SIZE (PVSCSI_MEM_SPACE_NUM_PAGES * PAGE_SIZE)
457
458#endif
459