2 * Copyright (c) 2018 VMware, Inc.
4 * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0)
12 #define MASK(v) ((1 << (v)) - 1)
14 #define PCI_VENDOR_ID_VMWARE 0x15ad
15 #define PCI_DEVICE_ID_VMWARE_PVSCSI 0x07c0
17 enum pvscsi_reg_offset {
18 PVSCSI_REG_OFFSET_COMMAND = 0x0000,
19 PVSCSI_REG_OFFSET_COMMAND_DATA = 0x0004,
20 PVSCSI_REG_OFFSET_COMMAND_STATUS = 0x0008,
21 PVSCSI_REG_OFFSET_LAST_STS_0 = 0x0100,
22 PVSCSI_REG_OFFSET_LAST_STS_1 = 0x0104,
23 PVSCSI_REG_OFFSET_LAST_STS_2 = 0x0108,
24 PVSCSI_REG_OFFSET_LAST_STS_3 = 0x010c,
25 PVSCSI_REG_OFFSET_INTR_STATUS = 0x100c,
26 PVSCSI_REG_OFFSET_INTR_MASK = 0x2010,
27 PVSCSI_REG_OFFSET_KICK_NON_RW_IO = 0x3014,
28 PVSCSI_REG_OFFSET_DEBUG = 0x3018,
29 PVSCSI_REG_OFFSET_KICK_RW_IO = 0x4018,
32 enum pvscsi_commands {
35 PVSCSI_CMD_ADAPTER_RESET = 1,
36 PVSCSI_CMD_ISSUE_SCSI = 2,
37 PVSCSI_CMD_SETUP_RINGS = 3,
38 PVSCSI_CMD_RESET_BUS = 4,
39 PVSCSI_CMD_RESET_DEVICE = 5,
40 PVSCSI_CMD_ABORT_CMD = 6,
41 PVSCSI_CMD_CONFIG = 7,
42 PVSCSI_CMD_SETUP_MSG_RING = 8,
43 PVSCSI_CMD_DEVICE_UNPLUG = 9,
44 PVSCSI_CMD_SETUP_REQCALLTHRESHOLD = 10,
45 PVSCSI_CMD_GET_MAX_TARGETS = 11,
50 struct pvscsi_cmd_desc_reset_device {
55 struct pvscsi_cmd_desc_abort_cmd {
61 #define PVSCSI_SETUP_RINGS_MAX_NUM_PAGES 32
62 #define PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES 16
64 struct pvscsi_cmd_desc_setup_rings {
65 uint32_t req_ring_num_pages;
66 uint32_t cmp_ring_num_pages;
67 uint64_t rings_state_ppn;
68 uint64_t req_ring_ppns[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
69 uint64_t cmp_ring_ppns[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
72 struct pvscsi_cmd_desc_setup_msg_ring {
75 uint64_t ring_ppns[PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES];
78 struct pvscsi_rings_state {
79 uint32_t req_prod_idx;
80 uint32_t req_cons_idx;
81 uint32_t req_num_entries_log2;
82 uint32_t cmp_prod_idx;
83 uint32_t cmp_cons_idx;
84 uint32_t cmp_num_entries_log2;
85 uint32_t req_call_threshold;
87 uint32_t msg_prod_idx;
88 uint32_t msg_cons_idx;
89 uint32_t msg_num_entries_log2;
92 #define PVSCSI_FLAG_CMD_WITH_SG_LIST (1 << 0)
93 #define PVSCSI_FLAG_CMD_OUT_OF_BAND_CDB (1 << 1)
94 #define PVSCSI_FLAG_CMD_DIR_NONE (1 << 2)
95 #define PVSCSI_FLAG_CMD_DIR_TOHOST (1 << 3)
96 #define PVSCSI_FLAG_CMD_DIR_TODEVICE (1 << 4)
98 #define PVSCSI_FLAG_RESERVED_MASK (~MASK(5))
100 #define PVSCSI_INTR_CMPL_0 (1 << 0)
101 #define PVSCSI_INTR_CMPL_1 (1 << 1)
102 #define PVSCSI_INTR_CMPL_MASK MASK(2)
104 #define PVSCSI_INTR_MSG_0 (1 << 2)
105 #define PVSCSI_INTR_MSG_1 (1 << 3)
106 #define PVSCSI_INTR_MSG_MASK (MASK(2) << 2)
108 #define PVSCSI_INTR_ALL_SUPPORTED MASK(4)
110 struct pvscsi_ring_req_desc {
127 struct pvscsi_ring_cmp_desc {
131 uint16_t host_status;
132 uint16_t scsi_status;
136 #define PVSCSI_MAX_SG_ENTRIES_PER_SEGMENT 128
137 #define PVSCSI_MAX_NUM_SG_SEGMENTS 128
138 #define PVSCSI_SGE_FLAG_CHAIN_ELEMENT (1 << 0)
140 struct pvscsi_sg_element {
146 enum pvscsi_msg_type {
147 PVSCSI_MSG_DEV_ADDED = 0,
148 PVSCSI_MSG_DEV_REMOVED = 1,
152 struct pvscsi_ring_msg_desc {
157 struct pvscsi_ring_msg_dev_status_changed {
165 struct pvscsi_cmd_desc_setup_req_call {
169 #define PVSCSI_MAX_NUM_PAGES_REQ_RING PVSCSI_SETUP_RINGS_MAX_NUM_PAGES
170 #define PVSCSI_MAX_NUM_PAGES_CMP_RING PVSCSI_SETUP_RINGS_MAX_NUM_PAGES
171 #define PVSCSI_MAX_NUM_PAGES_MSG_RING PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES
173 #define PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE \
174 (PAGE_SIZE / sizeof(struct pvscsi_ring_req_desc))
175 #define PVSCSI_MAX_NUM_CMP_ENTRIES_PER_PAGE \
176 (PAGE_SIZE / sizeof(struct pvscs_ring_cmp_desc))
177 #define PVSCSI_MAX_NUM_MSG_ENTRIES_PER_PAGE \
178 (PAGE_SIZE / sizeof(struct pvscsi_ring_msg_desc))
180 #define PVSCSI_MAX_REQ_QUEUE_DEPTH \
181 (PVSCSI_MAX_NUM_PAGES_REQ_RING * PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE)
182 #define PVSCSI_MAX_CMP_QUEUE_DEPTH \
183 (PVSCSI_MAX_NUM_PAGES_CMP_RING * PVSCSI_MAX_NUM_CMP_ENTRIES_PER_PAGE)
184 #define PVSCSI_MAX_QUEUE_DEPTH \
185 MAX(PVSCSI_MAX_REQ_QUEUE_DEPTH, PVSCSI_MAX_CMP_QUEUE_DEPTH)
187 enum pvscsi_host_status {
188 BTSTAT_SUCCESS = 0x00,
189 BTSTAT_LINKED_COMMAND_COMPLETED = 0x0a,
190 BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG = 0x0b,
191 BTSTAT_DATA_UNDERRUN = 0x0c,
192 BTSTAT_SELTIMEO = 0x11,
193 BTSTAT_DATARUN = 0x12,
194 BTSTAT_BUSFREE = 0x13,
195 BTSTAT_INVPHASE = 0x14,
196 BTSTAT_INVCODE = 0x15,
197 BTSTAT_INVOPCODE = 0x16,
198 BTSTAT_LUNMISMATCH = 0x17,
199 BTSTAT_INVPARAM = 0x1a,
200 BTSTAT_SENSFAILED = 0x1b,
201 BTSTAT_TAGREJECT = 0x1c,
202 BTSTAT_BADMSG = 0x1d,
203 BTSTAT_HAHARDWARE = 0x20,
204 BTSTAT_NORESPONSE = 0x21,
205 BTSTAT_SENTRST = 0x22,
206 BTSTAT_RECVRST = 0x23,
207 BTSTAT_DISCONNECT = 0x24,
208 BTSTAT_BUSRESET = 0x25,
209 BTSTAT_ABORTQUEUE = 0x26,
210 BTSTAT_HASOFTWARE = 0x27,
211 BTSTAT_HATIMEOUT = 0x30,
212 BTSTAT_SCSIPARITY = 0x34,
215 #endif /* !_PVSCSI_H_ */