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