xref: /dragonfly/sys/dev/virtual/vmware/pvscsi/pvscsi.h (revision 7b13bc965396179b8fd65ed1a1592887afc377de)
1 /*-
2  * Copyright (c) 2018 VMware, Inc.
3  *
4  * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0)
5  *
6  * $FreeBSD$
7  */
8 
9 #ifndef _PVSCSI_H_
10 #define _PVSCSI_H_
11 
12 #define   MASK(v)   ((1 << (v)) - 1)
13 
14 #define   PCI_VENDOR_ID_VMWARE                    0x15ad
15 #define   PCI_DEVICE_ID_VMWARE_PVSCSI   0x07c0
16 
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,
30 };
31 
32 enum pvscsi_commands {
33           PVSCSI_CMD_FIRST                        = 0,
34 
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,
46 
47           PVSCSI_CMD_LAST                                   = 12,
48 };
49 
50 struct pvscsi_cmd_desc_reset_device {
51           uint32_t  target;
52           uint8_t             lun[8];
53 };
54 
55 struct pvscsi_cmd_desc_abort_cmd {
56           uint64_t  context;
57           uint32_t  target;
58           uint32_t  pad;
59 };
60 
61 #define   PVSCSI_SETUP_RINGS_MAX_NUM_PAGES        32
62 #define   PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES     16
63 
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];
70 };
71 
72 struct pvscsi_cmd_desc_setup_msg_ring {
73           uint32_t  num_pages;
74           uint32_t  pad_;
75           uint64_t  ring_ppns[PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES];
76 };
77 
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;
86           uint8_t             _pad[100];
87           uint32_t  msg_prod_idx;
88           uint32_t  msg_cons_idx;
89           uint32_t  msg_num_entries_log2;
90 };
91 
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)
97 
98 #define   PVSCSI_FLAG_RESERVED_MASK     (~MASK(5))
99 
100 #define   PVSCSI_INTR_CMPL_0  (1 << 0)
101 #define   PVSCSI_INTR_CMPL_1  (1 << 1)
102 #define   PVSCSI_INTR_CMPL_MASK         MASK(2)
103 
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)
107 
108 #define   PVSCSI_INTR_ALL_SUPPORTED     MASK(4)
109 
110 struct pvscsi_ring_req_desc {
111           uint64_t  context;
112           uint64_t  data_addr;
113           uint64_t  data_len;
114           uint64_t  sense_addr;
115           uint32_t  sense_len;
116           uint32_t  flags;
117           uint8_t             cdb[16];
118           uint8_t             cdb_len;
119           uint8_t             lun[8];
120           uint8_t             tag;
121           uint8_t             bus;
122           uint8_t             target;
123           uint16_t  vcpu_hint;
124           uint8_t             unused[58];
125 };
126 
127 struct pvscsi_ring_cmp_desc {
128           uint64_t  context;
129           uint64_t  data_len;
130           uint32_t  sense_len;
131           uint16_t  host_status;
132           uint16_t  scsi_status;
133           uint32_t  _pad[2];
134 };
135 
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)
139 
140 struct pvscsi_sg_element {
141           uint64_t  addr;
142           uint32_t  length;
143           uint32_t  flags;
144 };
145 
146 enum pvscsi_msg_type {
147           PVSCSI_MSG_DEV_ADDED          = 0,
148           PVSCSI_MSG_DEV_REMOVED        = 1,
149           PVSCSI_MSG_LAST     = 2,
150 };
151 
152 struct pvscsi_ring_msg_desc {
153           uint32_t  type;
154           uint32_t  args[31];
155 };
156 
157 struct pvscsi_ring_msg_dev_status_changed {
158           uint32_t  type;
159           uint32_t  bus;
160           uint32_t  target;
161           uint8_t             lun[8];
162           uint32_t  pad[27];
163 };
164 
165 struct pvscsi_cmd_desc_setup_req_call {
166           uint32_t  enable;
167 };
168 
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
172 
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))
179 
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)
186 
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,
213 };
214 
215 #endif /* !_PVSCSI_H_ */
216