0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef _VMW_PVSCSI_H_
0023 #define _VMW_PVSCSI_H_
0024
0025 #include <linux/types.h>
0026
0027 #define PVSCSI_DRIVER_VERSION_STRING "1.0.7.0-k"
0028
0029 #define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128
0030
0031 #define MASK(n) ((1 << (n)) - 1)
0032
0033 #define PCI_DEVICE_ID_VMWARE_PVSCSI 0x07C0
0034
0035
0036
0037
0038 enum HostBusAdapterStatus {
0039 BTSTAT_SUCCESS = 0x00,
0040 BTSTAT_LINKED_COMMAND_COMPLETED = 0x0a,
0041 BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG = 0x0b,
0042 BTSTAT_DATA_UNDERRUN = 0x0c,
0043 BTSTAT_SELTIMEO = 0x11,
0044 BTSTAT_DATARUN = 0x12,
0045 BTSTAT_BUSFREE = 0x13,
0046 BTSTAT_INVPHASE = 0x14,
0047
0048 BTSTAT_LUNMISMATCH = 0x17,
0049
0050 BTSTAT_INVPARAM = 0x1a,
0051
0052 BTSTAT_SENSFAILED = 0x1b,
0053 BTSTAT_TAGREJECT = 0x1c,
0054
0055 BTSTAT_BADMSG = 0x1d,
0056
0057 BTSTAT_HAHARDWARE = 0x20,
0058 BTSTAT_NORESPONSE = 0x21,
0059
0060 BTSTAT_SENTRST = 0x22,
0061 BTSTAT_RECVRST = 0x23,
0062
0063 BTSTAT_DISCONNECT = 0x24,
0064
0065 BTSTAT_BUSRESET = 0x25,
0066 BTSTAT_ABORTQUEUE = 0x26,
0067 BTSTAT_HASOFTWARE = 0x27,
0068 BTSTAT_HATIMEOUT = 0x30,
0069 BTSTAT_SCSIPARITY = 0x34,
0070 };
0071
0072
0073
0074
0075 enum ScsiDeviceStatus {
0076 SDSTAT_GOOD = 0x00,
0077 SDSTAT_CHECK = 0x02,
0078 };
0079
0080
0081
0082
0083
0084
0085
0086 enum PVSCSIRegOffset {
0087 PVSCSI_REG_OFFSET_COMMAND = 0x0,
0088 PVSCSI_REG_OFFSET_COMMAND_DATA = 0x4,
0089 PVSCSI_REG_OFFSET_COMMAND_STATUS = 0x8,
0090 PVSCSI_REG_OFFSET_LAST_STS_0 = 0x100,
0091 PVSCSI_REG_OFFSET_LAST_STS_1 = 0x104,
0092 PVSCSI_REG_OFFSET_LAST_STS_2 = 0x108,
0093 PVSCSI_REG_OFFSET_LAST_STS_3 = 0x10c,
0094 PVSCSI_REG_OFFSET_INTR_STATUS = 0x100c,
0095 PVSCSI_REG_OFFSET_INTR_MASK = 0x2010,
0096 PVSCSI_REG_OFFSET_KICK_NON_RW_IO = 0x3014,
0097 PVSCSI_REG_OFFSET_DEBUG = 0x3018,
0098 PVSCSI_REG_OFFSET_KICK_RW_IO = 0x4018,
0099 };
0100
0101
0102
0103
0104
0105 enum PVSCSICommands {
0106 PVSCSI_CMD_FIRST = 0,
0107
0108 PVSCSI_CMD_ADAPTER_RESET = 1,
0109 PVSCSI_CMD_ISSUE_SCSI = 2,
0110 PVSCSI_CMD_SETUP_RINGS = 3,
0111 PVSCSI_CMD_RESET_BUS = 4,
0112 PVSCSI_CMD_RESET_DEVICE = 5,
0113 PVSCSI_CMD_ABORT_CMD = 6,
0114 PVSCSI_CMD_CONFIG = 7,
0115 PVSCSI_CMD_SETUP_MSG_RING = 8,
0116 PVSCSI_CMD_DEVICE_UNPLUG = 9,
0117 PVSCSI_CMD_SETUP_REQCALLTHRESHOLD = 10,
0118
0119 PVSCSI_CMD_LAST = 11
0120 };
0121
0122
0123
0124
0125
0126 struct PVSCSICmdDescResetDevice {
0127 u32 target;
0128 u8 lun[8];
0129 } __packed;
0130
0131
0132
0133
0134
0135 struct PVSCSICmdDescConfigCmd {
0136 u64 cmpAddr;
0137 u64 configPageAddress;
0138 u32 configPageNum;
0139 u32 _pad;
0140 } __packed;
0141
0142
0143
0144
0145
0146 struct PVSCSICmdDescSetupReqCall {
0147 u32 enable;
0148 } __packed;
0149
0150 enum PVSCSIConfigPageType {
0151 PVSCSI_CONFIG_PAGE_CONTROLLER = 0x1958,
0152 PVSCSI_CONFIG_PAGE_PHY = 0x1959,
0153 PVSCSI_CONFIG_PAGE_DEVICE = 0x195a,
0154 };
0155
0156 enum PVSCSIConfigPageAddressType {
0157 PVSCSI_CONFIG_CONTROLLER_ADDRESS = 0x2120,
0158 PVSCSI_CONFIG_BUSTARGET_ADDRESS = 0x2121,
0159 PVSCSI_CONFIG_PHY_ADDRESS = 0x2122,
0160 };
0161
0162
0163
0164
0165
0166
0167
0168
0169 struct PVSCSICmdDescAbortCmd {
0170 u64 context;
0171 u32 target;
0172 u32 _pad;
0173 } __packed;
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185 #define PVSCSI_SETUP_RINGS_MAX_NUM_PAGES 32
0186 struct PVSCSICmdDescSetupRings {
0187 u32 reqRingNumPages;
0188 u32 cmpRingNumPages;
0189 u64 ringsStatePPN;
0190 u64 reqRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
0191 u64 cmpRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
0192 } __packed;
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213 #define PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES 16
0214
0215 struct PVSCSICmdDescSetupMsgRing {
0216 u32 numPages;
0217 u32 _pad;
0218 u64 ringPPNs[PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES];
0219 } __packed;
0220
0221 enum PVSCSIMsgType {
0222 PVSCSI_MSG_DEV_ADDED = 0,
0223 PVSCSI_MSG_DEV_REMOVED = 1,
0224 PVSCSI_MSG_LAST = 2,
0225 };
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236 struct PVSCSIRingMsgDesc {
0237 u32 type;
0238 u32 args[31];
0239 } __packed;
0240
0241 struct PVSCSIMsgDescDevStatusChanged {
0242 u32 type;
0243 u32 bus;
0244 u32 target;
0245 u8 lun[8];
0246 u32 pad[27];
0247 } __packed;
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261 struct PVSCSIRingsState {
0262 u32 reqProdIdx;
0263 u32 reqConsIdx;
0264 u32 reqNumEntriesLog2;
0265
0266 u32 cmpProdIdx;
0267 u32 cmpConsIdx;
0268 u32 cmpNumEntriesLog2;
0269
0270 u32 reqCallThreshold;
0271
0272 u8 _pad[100];
0273
0274 u32 msgProdIdx;
0275 u32 msgConsIdx;
0276 u32 msgNumEntriesLog2;
0277 } __packed;
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315 #define PVSCSI_FLAG_CMD_WITH_SG_LIST (1 << 0)
0316 #define PVSCSI_FLAG_CMD_OUT_OF_BAND_CDB (1 << 1)
0317 #define PVSCSI_FLAG_CMD_DIR_NONE (1 << 2)
0318 #define PVSCSI_FLAG_CMD_DIR_TOHOST (1 << 3)
0319 #define PVSCSI_FLAG_CMD_DIR_TODEVICE (1 << 4)
0320
0321 struct PVSCSIRingReqDesc {
0322 u64 context;
0323 u64 dataAddr;
0324 u64 dataLen;
0325 u64 senseAddr;
0326 u32 senseLen;
0327 u32 flags;
0328 u8 cdb[16];
0329 u8 cdbLen;
0330 u8 lun[8];
0331 u8 tag;
0332 u8 bus;
0333 u8 target;
0334 u16 vcpuHint;
0335 u8 unused[58];
0336 } __packed;
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354 struct PVSCSISGElement {
0355 u64 addr;
0356 u32 length;
0357 u32 flags;
0358 } __packed;
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374 struct PVSCSIRingCmpDesc {
0375 u64 context;
0376 u64 dataLen;
0377 u32 senseLen;
0378 u16 hostStatus;
0379 u16 scsiStatus;
0380 u32 _pad[2];
0381 } __packed;
0382
0383 struct PVSCSIConfigPageHeader {
0384 u32 pageNum;
0385 u16 numDwords;
0386 u16 hostStatus;
0387 u16 scsiStatus;
0388 u16 reserved[3];
0389 } __packed;
0390
0391 struct PVSCSIConfigPageController {
0392 struct PVSCSIConfigPageHeader header;
0393 u64 nodeWWN;
0394 u16 manufacturer[64];
0395 u16 serialNumber[64];
0396 u16 opromVersion[32];
0397 u16 hwVersion[32];
0398 u16 firmwareVersion[32];
0399 u32 numPhys;
0400 u8 useConsecutivePhyWWNs;
0401 u8 reserved[3];
0402 } __packed;
0403
0404
0405
0406
0407
0408 #define PVSCSI_INTR_CMPL_0 (1 << 0)
0409 #define PVSCSI_INTR_CMPL_1 (1 << 1)
0410 #define PVSCSI_INTR_CMPL_MASK MASK(2)
0411
0412 #define PVSCSI_INTR_MSG_0 (1 << 2)
0413 #define PVSCSI_INTR_MSG_1 (1 << 3)
0414 #define PVSCSI_INTR_MSG_MASK (MASK(2) << 2)
0415
0416 #define PVSCSI_INTR_ALL_SUPPORTED MASK(4)
0417
0418
0419
0420
0421 #define PVSCSI_MAX_INTRS 24
0422
0423
0424
0425
0426
0427 #define PVSCSI_MAX_NUM_PAGES_REQ_RING PVSCSI_SETUP_RINGS_MAX_NUM_PAGES
0428 #define PVSCSI_MAX_NUM_PAGES_CMP_RING PVSCSI_SETUP_RINGS_MAX_NUM_PAGES
0429 #define PVSCSI_MAX_NUM_PAGES_MSG_RING PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES
0430
0431 #define PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE \
0432 (PAGE_SIZE / sizeof(struct PVSCSIRingReqDesc))
0433
0434 #define PVSCSI_MAX_REQ_QUEUE_DEPTH \
0435 (PVSCSI_MAX_NUM_PAGES_REQ_RING * PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE)
0436
0437 #define PVSCSI_MEM_SPACE_COMMAND_NUM_PAGES 1
0438 #define PVSCSI_MEM_SPACE_INTR_STATUS_NUM_PAGES 1
0439 #define PVSCSI_MEM_SPACE_MISC_NUM_PAGES 2
0440 #define PVSCSI_MEM_SPACE_KICK_IO_NUM_PAGES 2
0441 #define PVSCSI_MEM_SPACE_MSIX_NUM_PAGES 2
0442
0443 enum PVSCSIMemSpace {
0444 PVSCSI_MEM_SPACE_COMMAND_PAGE = 0,
0445 PVSCSI_MEM_SPACE_INTR_STATUS_PAGE = 1,
0446 PVSCSI_MEM_SPACE_MISC_PAGE = 2,
0447 PVSCSI_MEM_SPACE_KICK_IO_PAGE = 4,
0448 PVSCSI_MEM_SPACE_MSIX_TABLE_PAGE = 6,
0449 PVSCSI_MEM_SPACE_MSIX_PBA_PAGE = 7,
0450 };
0451
0452 #define PVSCSI_MEM_SPACE_NUM_PAGES \
0453 (PVSCSI_MEM_SPACE_COMMAND_NUM_PAGES + \
0454 PVSCSI_MEM_SPACE_INTR_STATUS_NUM_PAGES + \
0455 PVSCSI_MEM_SPACE_MISC_NUM_PAGES + \
0456 PVSCSI_MEM_SPACE_KICK_IO_NUM_PAGES + \
0457 PVSCSI_MEM_SPACE_MSIX_NUM_PAGES)
0458
0459 #define PVSCSI_MEM_SPACE_SIZE (PVSCSI_MEM_SPACE_NUM_PAGES * PAGE_SIZE)
0460
0461 #endif