]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/vmware/pvscsi/pvscsi.h
Merge ^/vendor/lvm-project/release-10.x up to its last change (upstream
[FreeBSD/FreeBSD.git] / sys / dev / vmware / pvscsi / pvscsi.h
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         uint8_t         vcpu_hint;
124         uint8_t         unused[59];
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_ */