1f5e6d5a3SSumit Saxena /* SPDX-License-Identifier: GPL-2.0-or-later WITH Linux-syscall-note */
2f5e6d5a3SSumit Saxena /*
3f5e6d5a3SSumit Saxena  * Driver for Broadcom MPI3 Storage Controllers
4f5e6d5a3SSumit Saxena  *
5f5e6d5a3SSumit Saxena  * Copyright (C) 2017-2022 Broadcom Inc.
6f5e6d5a3SSumit Saxena  *  (mailto: mpi3mr-linuxdrv.pdl@broadcom.com)
7f5e6d5a3SSumit Saxena  *
8f5e6d5a3SSumit Saxena  */
9f5e6d5a3SSumit Saxena 
10f5e6d5a3SSumit Saxena #ifndef SCSI_BSG_MPI3MR_H_INCLUDED
11f5e6d5a3SSumit Saxena #define SCSI_BSG_MPI3MR_H_INCLUDED
12f5e6d5a3SSumit Saxena 
13f5e6d5a3SSumit Saxena #include <linux/types.h>
14f5e6d5a3SSumit Saxena 
15f5e6d5a3SSumit Saxena /* Definitions for BSG commands */
16f5e6d5a3SSumit Saxena #define MPI3MR_IOCTL_VERSION			0x06
17f5e6d5a3SSumit Saxena 
18f5e6d5a3SSumit Saxena #define MPI3MR_APP_DEFAULT_TIMEOUT		(60) /*seconds*/
19f5e6d5a3SSumit Saxena 
20f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPTYPE_UNKNOWN		0
21f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPTYPE_AVGFAMILY		1
22f5e6d5a3SSumit Saxena 
23f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPSTATE_UNKNOWN		0
24f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPSTATE_OPERATIONAL		1
25f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPSTATE_FAULT		2
26f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPSTATE_IN_RESET		3
27f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPSTATE_UNRECOVERABLE	4
28f5e6d5a3SSumit Saxena 
29f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPRESET_UNKNOWN		0
30f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPRESET_SOFT		1
31f5e6d5a3SSumit Saxena #define MPI3MR_BSG_ADPRESET_DIAG_FAULT		2
32f5e6d5a3SSumit Saxena 
33f5e6d5a3SSumit Saxena #define MPI3MR_BSG_LOGDATA_MAX_ENTRIES		400
34f5e6d5a3SSumit Saxena #define MPI3MR_BSG_LOGDATA_ENTRY_HEADER_SZ	4
35f5e6d5a3SSumit Saxena 
36f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_UNKNOWN		0
37f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_ADPINFO		1
38f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_ADPRESET		2
39f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_ALLTGTDEVINFO	4
40f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_GETCHGCNT		5
41f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_LOGDATAENABLE	6
42f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_PELENABLE		7
43f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_GETLOGDATA		8
44f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_QUERY_HDB		9
45f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_REPOST_HDB		10
46f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_UPLOAD_HDB		11
47f5e6d5a3SSumit Saxena #define MPI3MR_DRVBSG_OPCODE_REFRESH_HDB_TRIGGERS	12
48f5e6d5a3SSumit Saxena 
49f5e6d5a3SSumit Saxena 
50f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_UNKNOWN		0
51f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_RAIDMGMT_CMD		1
52f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_RAIDMGMT_RESP	2
53f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_DATA_IN		3
54f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_DATA_OUT		4
55f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_MPI_REPLY		5
56f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_ERR_RESPONSE		6
57f5e6d5a3SSumit Saxena #define MPI3MR_BSG_BUFTYPE_MPI_REQUEST		0xFE
58f5e6d5a3SSumit Saxena 
59f5e6d5a3SSumit Saxena #define MPI3MR_BSG_MPI_REPLY_BUFTYPE_UNKNOWN	0
60f5e6d5a3SSumit Saxena #define MPI3MR_BSG_MPI_REPLY_BUFTYPE_STATUS	1
61f5e6d5a3SSumit Saxena #define MPI3MR_BSG_MPI_REPLY_BUFTYPE_ADDRESS	2
62f5e6d5a3SSumit Saxena 
63f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFTYPE_UNKNOWN		0
64f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFTYPE_TRACE		1
65f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFTYPE_FIRMWARE		2
66f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFTYPE_RESERVED		3
67f5e6d5a3SSumit Saxena 
68f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFSTATUS_UNKNOWN		0
69f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFSTATUS_NOT_ALLOCATED	1
70f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFSTATUS_POSTED_UNPAUSED	2
71f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFSTATUS_POSTED_PAUSED	3
72f5e6d5a3SSumit Saxena #define MPI3MR_HDB_BUFSTATUS_RELEASED		4
73f5e6d5a3SSumit Saxena 
74f5e6d5a3SSumit Saxena #define MPI3MR_HDB_TRIGGER_TYPE_UNKNOWN		0
75f5e6d5a3SSumit Saxena #define MPI3MR_HDB_TRIGGER_TYPE_DIAGFAULT	1
76f5e6d5a3SSumit Saxena #define MPI3MR_HDB_TRIGGER_TYPE_ELEMENT		2
77f5e6d5a3SSumit Saxena #define MPI3MR_HDB_TRIGGER_TYPE_MASTER		3
78f5e6d5a3SSumit Saxena 
79f5e6d5a3SSumit Saxena 
80f5e6d5a3SSumit Saxena /* Supported BSG commands */
81f5e6d5a3SSumit Saxena enum command {
82f5e6d5a3SSumit Saxena 	MPI3MR_DRV_CMD = 1,
83f5e6d5a3SSumit Saxena 	MPI3MR_MPT_CMD = 2,
84f5e6d5a3SSumit Saxena };
85f5e6d5a3SSumit Saxena 
86f5e6d5a3SSumit Saxena /**
87f5e6d5a3SSumit Saxena  * struct mpi3_driver_info_layout - Information about driver
88f5e6d5a3SSumit Saxena  *
89f5e6d5a3SSumit Saxena  * @information_length: Length of this structure in bytes
90f5e6d5a3SSumit Saxena  * @driver_signature: Driver Vendor name
91f5e6d5a3SSumit Saxena  * @os_name: Operating System Name
92f5e6d5a3SSumit Saxena  * @driver_name: Driver name
93f5e6d5a3SSumit Saxena  * @driver_version: Driver version
94f5e6d5a3SSumit Saxena  * @driver_release_date: Driver release date
95f5e6d5a3SSumit Saxena  * @driver_capabilities: Driver capabilities
96f5e6d5a3SSumit Saxena  */
97f5e6d5a3SSumit Saxena struct mpi3_driver_info_layout {
98f5e6d5a3SSumit Saxena 	__le32	information_length;
99f5e6d5a3SSumit Saxena 	__u8	driver_signature[12];
100f5e6d5a3SSumit Saxena 	__u8	os_name[16];
101f5e6d5a3SSumit Saxena 	__u8	os_version[12];
102f5e6d5a3SSumit Saxena 	__u8	driver_name[20];
103f5e6d5a3SSumit Saxena 	__u8	driver_version[32];
104f5e6d5a3SSumit Saxena 	__u8	driver_release_date[20];
105f5e6d5a3SSumit Saxena 	__le32	driver_capabilities;
106f5e6d5a3SSumit Saxena };
107f5e6d5a3SSumit Saxena 
108f5e6d5a3SSumit Saxena /**
109f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_in_adpinfo - Adapter information request
110f5e6d5a3SSumit Saxena  * data returned by the driver.
111f5e6d5a3SSumit Saxena  *
112f5e6d5a3SSumit Saxena  * @adp_type: Adapter type
113f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
114f5e6d5a3SSumit Saxena  * @pci_dev_id: PCI device ID of the adapter
115f5e6d5a3SSumit Saxena  * @pci_dev_hw_rev: PCI revision of the adapter
116f5e6d5a3SSumit Saxena  * @pci_subsys_dev_id: PCI subsystem device ID of the adapter
117f5e6d5a3SSumit Saxena  * @pci_subsys_ven_id: PCI subsystem vendor ID of the adapter
118f5e6d5a3SSumit Saxena  * @pci_dev: PCI device
119f5e6d5a3SSumit Saxena  * @pci_func: PCI function
120f5e6d5a3SSumit Saxena  * @pci_bus: PCI bus
121f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
122f5e6d5a3SSumit Saxena  * @pci_seg_id: PCI segment ID
123f5e6d5a3SSumit Saxena  * @app_intfc_ver: version of the application interface definition
124f5e6d5a3SSumit Saxena  * @rsvd3: Reserved
125f5e6d5a3SSumit Saxena  * @rsvd4: Reserved
126f5e6d5a3SSumit Saxena  * @rsvd5: Reserved
127f5e6d5a3SSumit Saxena  * @driver_info: Driver Information (Version/Name)
128f5e6d5a3SSumit Saxena  */
129f5e6d5a3SSumit Saxena struct mpi3mr_bsg_in_adpinfo {
130f5e6d5a3SSumit Saxena 	__u32	adp_type;
131f5e6d5a3SSumit Saxena 	__u32	rsvd1;
132f5e6d5a3SSumit Saxena 	__u32	pci_dev_id;
133f5e6d5a3SSumit Saxena 	__u32	pci_dev_hw_rev;
134f5e6d5a3SSumit Saxena 	__u32	pci_subsys_dev_id;
135f5e6d5a3SSumit Saxena 	__u32	pci_subsys_ven_id;
136f5e6d5a3SSumit Saxena 	__u32	pci_dev:5;
137f5e6d5a3SSumit Saxena 	__u32	pci_func:3;
138f5e6d5a3SSumit Saxena 	__u32	pci_bus:8;
139f5e6d5a3SSumit Saxena 	__u16	rsvd2;
140f5e6d5a3SSumit Saxena 	__u32	pci_seg_id;
141f5e6d5a3SSumit Saxena 	__u32	app_intfc_ver;
142f5e6d5a3SSumit Saxena 	__u8	adp_state;
143f5e6d5a3SSumit Saxena 	__u8	rsvd3;
144f5e6d5a3SSumit Saxena 	__u16	rsvd4;
145f5e6d5a3SSumit Saxena 	__u32	rsvd5[2];
146f5e6d5a3SSumit Saxena 	struct mpi3_driver_info_layout driver_info;
147f5e6d5a3SSumit Saxena };
148f5e6d5a3SSumit Saxena 
149f5e6d5a3SSumit Saxena /**
150f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_adp_reset - Adapter reset request
151f5e6d5a3SSumit Saxena  * payload data to the driver.
152f5e6d5a3SSumit Saxena  *
153f5e6d5a3SSumit Saxena  * @reset_type: Reset type
154f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
155f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
156f5e6d5a3SSumit Saxena  */
157f5e6d5a3SSumit Saxena struct mpi3mr_bsg_adp_reset {
158f5e6d5a3SSumit Saxena 	__u8	reset_type;
159f5e6d5a3SSumit Saxena 	__u8	rsvd1;
160f5e6d5a3SSumit Saxena 	__u16	rsvd2;
161f5e6d5a3SSumit Saxena };
162f5e6d5a3SSumit Saxena 
163f5e6d5a3SSumit Saxena /**
164f5e6d5a3SSumit Saxena  * struct mpi3mr_change_count - Topology change count
165f5e6d5a3SSumit Saxena  * returned by the driver.
166f5e6d5a3SSumit Saxena  *
167f5e6d5a3SSumit Saxena  * @change_count: Topology change count
168f5e6d5a3SSumit Saxena  * @rsvd: Reserved
169f5e6d5a3SSumit Saxena  */
170f5e6d5a3SSumit Saxena struct mpi3mr_change_count {
171f5e6d5a3SSumit Saxena 	__u16	change_count;
172f5e6d5a3SSumit Saxena 	__u16	rsvd;
173f5e6d5a3SSumit Saxena };
174f5e6d5a3SSumit Saxena 
175f5e6d5a3SSumit Saxena /**
176f5e6d5a3SSumit Saxena  * struct mpi3mr_device_map_info - Target device mapping
177f5e6d5a3SSumit Saxena  * information
178f5e6d5a3SSumit Saxena  *
179f5e6d5a3SSumit Saxena  * @handle: Firmware device handle
180f5e6d5a3SSumit Saxena  * @perst_id: Persistent ID assigned by the firmware
181f5e6d5a3SSumit Saxena  * @target_id: Target ID assigned by the driver
182f5e6d5a3SSumit Saxena  * @bus_id: Bus ID assigned by the driver
183f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
184f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
185f5e6d5a3SSumit Saxena  */
186f5e6d5a3SSumit Saxena struct mpi3mr_device_map_info {
187f5e6d5a3SSumit Saxena 	__u16	handle;
188f5e6d5a3SSumit Saxena 	__u16	perst_id;
189f5e6d5a3SSumit Saxena 	__u32	target_id;
190f5e6d5a3SSumit Saxena 	__u8	bus_id;
191f5e6d5a3SSumit Saxena 	__u8	rsvd1;
192f5e6d5a3SSumit Saxena 	__u16	rsvd2;
193f5e6d5a3SSumit Saxena };
194f5e6d5a3SSumit Saxena 
195f5e6d5a3SSumit Saxena /**
196f5e6d5a3SSumit Saxena  * struct mpi3mr_all_tgt_info - Target device mapping
197f5e6d5a3SSumit Saxena  * information returned by the driver
198f5e6d5a3SSumit Saxena  *
199f5e6d5a3SSumit Saxena  * @num_devices: The number of devices in driver's inventory
200f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
201f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
202f5e6d5a3SSumit Saxena  * @dmi: Variable length array of mapping information of targets
203f5e6d5a3SSumit Saxena  */
204f5e6d5a3SSumit Saxena struct mpi3mr_all_tgt_info {
205f5e6d5a3SSumit Saxena 	__u16	num_devices;
206f5e6d5a3SSumit Saxena 	__u16	rsvd1;
207f5e6d5a3SSumit Saxena 	__u32	rsvd2;
208f5e6d5a3SSumit Saxena 	struct mpi3mr_device_map_info dmi[1];
209f5e6d5a3SSumit Saxena };
210f5e6d5a3SSumit Saxena 
211f5e6d5a3SSumit Saxena /**
212f5e6d5a3SSumit Saxena  * struct mpi3mr_logdata_enable - Number of log data
213f5e6d5a3SSumit Saxena  * entries saved by the driver returned as payload data for
214f5e6d5a3SSumit Saxena  * enable logdata BSG request by the driver.
215f5e6d5a3SSumit Saxena  *
216f5e6d5a3SSumit Saxena  * @max_entries: Number of log data entries cached by the driver
217f5e6d5a3SSumit Saxena  * @rsvd: Reserved
218f5e6d5a3SSumit Saxena  */
219f5e6d5a3SSumit Saxena struct mpi3mr_logdata_enable {
220f5e6d5a3SSumit Saxena 	__u16	max_entries;
221f5e6d5a3SSumit Saxena 	__u16	rsvd;
222f5e6d5a3SSumit Saxena };
223f5e6d5a3SSumit Saxena 
224f5e6d5a3SSumit Saxena /**
225f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_out_pel_enable - PEL enable request payload
226f5e6d5a3SSumit Saxena  * data to the driver.
227f5e6d5a3SSumit Saxena  *
228f5e6d5a3SSumit Saxena  * @pel_locale: PEL locale to the firmware
229f5e6d5a3SSumit Saxena  * @pel_class: PEL class to the firmware
230f5e6d5a3SSumit Saxena  * @rsvd: Reserved
231f5e6d5a3SSumit Saxena  */
232f5e6d5a3SSumit Saxena struct mpi3mr_bsg_out_pel_enable {
233f5e6d5a3SSumit Saxena 	__u16	pel_locale;
234f5e6d5a3SSumit Saxena 	__u8	pel_class;
235f5e6d5a3SSumit Saxena 	__u8	rsvd;
236f5e6d5a3SSumit Saxena };
237f5e6d5a3SSumit Saxena 
238f5e6d5a3SSumit Saxena /**
239f5e6d5a3SSumit Saxena  * struct mpi3mr_logdata_entry - Log data entry cached by the
240f5e6d5a3SSumit Saxena  * driver.
241f5e6d5a3SSumit Saxena  *
242f5e6d5a3SSumit Saxena  * @valid_entry: Is the entry valid
243f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
244f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
245f5e6d5a3SSumit Saxena  * @data: Variable length Log entry data
246f5e6d5a3SSumit Saxena  */
247f5e6d5a3SSumit Saxena struct mpi3mr_logdata_entry {
248f5e6d5a3SSumit Saxena 	__u8	valid_entry;
249f5e6d5a3SSumit Saxena 	__u8	rsvd1;
250f5e6d5a3SSumit Saxena 	__u16	rsvd2;
251f5e6d5a3SSumit Saxena 	__u8	data[1]; /* Variable length Array */
252f5e6d5a3SSumit Saxena };
253f5e6d5a3SSumit Saxena 
254f5e6d5a3SSumit Saxena /**
255f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_in_log_data - Log data entries saved by
256f5e6d5a3SSumit Saxena  * the driver returned as payload data for Get logdata request
257f5e6d5a3SSumit Saxena  * by the driver.
258f5e6d5a3SSumit Saxena  *
259f5e6d5a3SSumit Saxena  * @entry: Variable length Log data entry array
260f5e6d5a3SSumit Saxena  */
261f5e6d5a3SSumit Saxena struct mpi3mr_bsg_in_log_data {
262f5e6d5a3SSumit Saxena 	struct mpi3mr_logdata_entry entry[1];
263f5e6d5a3SSumit Saxena };
264f5e6d5a3SSumit Saxena 
265f5e6d5a3SSumit Saxena /**
266f5e6d5a3SSumit Saxena  * struct mpi3mr_hdb_entry - host diag buffer entry.
267f5e6d5a3SSumit Saxena  *
268f5e6d5a3SSumit Saxena  * @buf_type: Buffer type
269f5e6d5a3SSumit Saxena  * @status: Buffer status
270f5e6d5a3SSumit Saxena  * @trigger_type: Trigger type
271f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
272f5e6d5a3SSumit Saxena  * @size: Buffer size
273f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
274f5e6d5a3SSumit Saxena  * @trigger_data: Trigger specific data
275f5e6d5a3SSumit Saxena  * @rsvd3: Reserved
276f5e6d5a3SSumit Saxena  * @rsvd4: Reserved
277f5e6d5a3SSumit Saxena  */
278f5e6d5a3SSumit Saxena struct mpi3mr_hdb_entry {
279f5e6d5a3SSumit Saxena 	__u8	buf_type;
280f5e6d5a3SSumit Saxena 	__u8	status;
281f5e6d5a3SSumit Saxena 	__u8	trigger_type;
282f5e6d5a3SSumit Saxena 	__u8	rsvd1;
283f5e6d5a3SSumit Saxena 	__u16	size;
284f5e6d5a3SSumit Saxena 	__u16	rsvd2;
285f5e6d5a3SSumit Saxena 	__u64	trigger_data;
286f5e6d5a3SSumit Saxena 	__u32	rsvd3;
287f5e6d5a3SSumit Saxena 	__u32	rsvd4;
288f5e6d5a3SSumit Saxena };
289f5e6d5a3SSumit Saxena 
290f5e6d5a3SSumit Saxena 
291f5e6d5a3SSumit Saxena /**
292f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_in_hdb_status - This structure contains
293f5e6d5a3SSumit Saxena  * return data for the BSG request to retrieve the number of host
294f5e6d5a3SSumit Saxena  * diagnostic buffers supported by the driver and their current
295f5e6d5a3SSumit Saxena  * status and additional status specific data if any in forms of
296f5e6d5a3SSumit Saxena  * multiple hdb entries.
297f5e6d5a3SSumit Saxena  *
298f5e6d5a3SSumit Saxena  * @num_hdb_types: Number of host diag buffer types supported
299f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
300f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
301f5e6d5a3SSumit Saxena  * @rsvd3: Reserved
302f5e6d5a3SSumit Saxena  * @entry: Variable length Diag buffer status entry array
303f5e6d5a3SSumit Saxena  */
304f5e6d5a3SSumit Saxena struct mpi3mr_bsg_in_hdb_status {
305f5e6d5a3SSumit Saxena 	__u8	num_hdb_types;
306f5e6d5a3SSumit Saxena 	__u8	rsvd1;
307f5e6d5a3SSumit Saxena 	__u16	rsvd2;
308f5e6d5a3SSumit Saxena 	__u32	rsvd3;
309f5e6d5a3SSumit Saxena 	struct mpi3mr_hdb_entry entry[1];
310f5e6d5a3SSumit Saxena };
311f5e6d5a3SSumit Saxena 
312f5e6d5a3SSumit Saxena /**
313f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_out_repost_hdb - Repost host diagnostic
314f5e6d5a3SSumit Saxena  * buffer request payload data to the driver.
315f5e6d5a3SSumit Saxena  *
316f5e6d5a3SSumit Saxena  * @buf_type: Buffer type
317f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
318f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
319f5e6d5a3SSumit Saxena  */
320f5e6d5a3SSumit Saxena struct mpi3mr_bsg_out_repost_hdb {
321f5e6d5a3SSumit Saxena 	__u8	buf_type;
322f5e6d5a3SSumit Saxena 	__u8	rsvd1;
323f5e6d5a3SSumit Saxena 	__u16	rsvd2;
324f5e6d5a3SSumit Saxena };
325f5e6d5a3SSumit Saxena 
326f5e6d5a3SSumit Saxena /**
327f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_out_upload_hdb - Upload host diagnostic
328f5e6d5a3SSumit Saxena  * buffer request payload data to the driver.
329f5e6d5a3SSumit Saxena  *
330f5e6d5a3SSumit Saxena  * @buf_type: Buffer type
331f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
332f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
333f5e6d5a3SSumit Saxena  * @start_offset: Start offset of the buffer from where to copy
334f5e6d5a3SSumit Saxena  * @length: Length of the buffer to copy
335f5e6d5a3SSumit Saxena  */
336f5e6d5a3SSumit Saxena struct mpi3mr_bsg_out_upload_hdb {
337f5e6d5a3SSumit Saxena 	__u8	buf_type;
338f5e6d5a3SSumit Saxena 	__u8	rsvd1;
339f5e6d5a3SSumit Saxena 	__u16	rsvd2;
340f5e6d5a3SSumit Saxena 	__u32	start_offset;
341f5e6d5a3SSumit Saxena 	__u32	length;
342f5e6d5a3SSumit Saxena };
343f5e6d5a3SSumit Saxena 
344f5e6d5a3SSumit Saxena /**
345f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_out_refresh_hdb_triggers - Refresh host
346f5e6d5a3SSumit Saxena  * diagnostic buffer triggers request payload data to the driver.
347f5e6d5a3SSumit Saxena  *
348f5e6d5a3SSumit Saxena  * @page_type: Page type
349f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
350f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
351f5e6d5a3SSumit Saxena  */
352f5e6d5a3SSumit Saxena struct mpi3mr_bsg_out_refresh_hdb_triggers {
353f5e6d5a3SSumit Saxena 	__u8	page_type;
354f5e6d5a3SSumit Saxena 	__u8	rsvd1;
355f5e6d5a3SSumit Saxena 	__u16	rsvd2;
356f5e6d5a3SSumit Saxena };
357f5e6d5a3SSumit Saxena /**
358f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_drv_cmd -  Generic bsg data
359f5e6d5a3SSumit Saxena  * structure for all driver specific requests.
360f5e6d5a3SSumit Saxena  *
361f5e6d5a3SSumit Saxena  * @mrioc_id: Controller ID
362f5e6d5a3SSumit Saxena  * @opcode: Driver specific opcode
363f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
364f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
365f5e6d5a3SSumit Saxena  */
366f5e6d5a3SSumit Saxena struct mpi3mr_bsg_drv_cmd {
367f5e6d5a3SSumit Saxena 	__u8	mrioc_id;
368f5e6d5a3SSumit Saxena 	__u8	opcode;
369f5e6d5a3SSumit Saxena 	__u16	rsvd1;
370f5e6d5a3SSumit Saxena 	__u32	rsvd2[4];
371f5e6d5a3SSumit Saxena };
372f5e6d5a3SSumit Saxena /**
373f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_in_reply_buf - MPI reply buffer returned
374f5e6d5a3SSumit Saxena  * for MPI Passthrough request .
375f5e6d5a3SSumit Saxena  *
376f5e6d5a3SSumit Saxena  * @mpi_reply_type: Type of MPI reply
377f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
378f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
379f5e6d5a3SSumit Saxena  * @reply_buf: Variable Length buffer based on mpirep type
380f5e6d5a3SSumit Saxena  */
381f5e6d5a3SSumit Saxena struct mpi3mr_bsg_in_reply_buf {
382f5e6d5a3SSumit Saxena 	__u8	mpi_reply_type;
383f5e6d5a3SSumit Saxena 	__u8	rsvd1;
384f5e6d5a3SSumit Saxena 	__u16	rsvd2;
385f0931824SShin'ichiro Kawasaki 	__u8	reply_buf[];
386f5e6d5a3SSumit Saxena };
387f5e6d5a3SSumit Saxena 
388f5e6d5a3SSumit Saxena /**
389f5e6d5a3SSumit Saxena  * struct mpi3mr_buf_entry - User buffer descriptor for MPI
390f5e6d5a3SSumit Saxena  * Passthrough requests.
391f5e6d5a3SSumit Saxena  *
392f5e6d5a3SSumit Saxena  * @buf_type: Buffer type
393f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
394f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
395f5e6d5a3SSumit Saxena  * @buf_len: Buffer length
396f5e6d5a3SSumit Saxena  */
397f5e6d5a3SSumit Saxena struct mpi3mr_buf_entry {
398f5e6d5a3SSumit Saxena 	__u8	buf_type;
399f5e6d5a3SSumit Saxena 	__u8	rsvd1;
400f5e6d5a3SSumit Saxena 	__u16	rsvd2;
401f5e6d5a3SSumit Saxena 	__u32	buf_len;
402f5e6d5a3SSumit Saxena };
403f5e6d5a3SSumit Saxena /**
404f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_buf_entry_list - list of user buffer
405f5e6d5a3SSumit Saxena  * descriptor for MPI Passthrough requests.
406f5e6d5a3SSumit Saxena  *
407f5e6d5a3SSumit Saxena  * @num_of_entries: Number of buffer descriptors
408f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
409f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
410f5e6d5a3SSumit Saxena  * @rsvd3: Reserved
411f5e6d5a3SSumit Saxena  * @buf_entry: Variable length array of buffer descriptors
412f5e6d5a3SSumit Saxena  */
413f5e6d5a3SSumit Saxena struct mpi3mr_buf_entry_list {
414f5e6d5a3SSumit Saxena 	__u8	num_of_entries;
415f5e6d5a3SSumit Saxena 	__u8	rsvd1;
416f5e6d5a3SSumit Saxena 	__u16	rsvd2;
417f5e6d5a3SSumit Saxena 	__u32	rsvd3;
418f5e6d5a3SSumit Saxena 	struct mpi3mr_buf_entry buf_entry[1];
419f5e6d5a3SSumit Saxena };
420f5e6d5a3SSumit Saxena /**
421f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_mptcmd -  Generic bsg data
422f5e6d5a3SSumit Saxena  * structure for all MPI Passthrough requests .
423f5e6d5a3SSumit Saxena  *
424f5e6d5a3SSumit Saxena  * @mrioc_id: Controller ID
425f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
426f5e6d5a3SSumit Saxena  * @timeout: MPI request timeout
427f5e6d5a3SSumit Saxena  * @buf_entry_list: Buffer descriptor list
428f5e6d5a3SSumit Saxena  */
429f5e6d5a3SSumit Saxena struct mpi3mr_bsg_mptcmd {
430f5e6d5a3SSumit Saxena 	__u8	mrioc_id;
431f5e6d5a3SSumit Saxena 	__u8	rsvd1;
432f5e6d5a3SSumit Saxena 	__u16	timeout;
433f5e6d5a3SSumit Saxena 	__u32	rsvd2;
434f5e6d5a3SSumit Saxena 	struct mpi3mr_buf_entry_list buf_entry_list;
435f5e6d5a3SSumit Saxena };
436f5e6d5a3SSumit Saxena 
437f5e6d5a3SSumit Saxena /**
438f5e6d5a3SSumit Saxena  * struct mpi3mr_bsg_packet -  Generic bsg data
439f5e6d5a3SSumit Saxena  * structure for all supported requests .
440f5e6d5a3SSumit Saxena  *
441f5e6d5a3SSumit Saxena  * @cmd_type: represents drvrcmd or mptcmd
442f5e6d5a3SSumit Saxena  * @rsvd1: Reserved
443f5e6d5a3SSumit Saxena  * @rsvd2: Reserved
444f5e6d5a3SSumit Saxena  * @drvrcmd: driver request structure
445f5e6d5a3SSumit Saxena  * @mptcmd: mpt request structure
446f5e6d5a3SSumit Saxena  */
447f5e6d5a3SSumit Saxena struct mpi3mr_bsg_packet {
448f5e6d5a3SSumit Saxena 	__u8	cmd_type;
449f5e6d5a3SSumit Saxena 	__u8	rsvd1;
450f5e6d5a3SSumit Saxena 	__u16	rsvd2;
451f5e6d5a3SSumit Saxena 	__u32	rsvd3;
452f5e6d5a3SSumit Saxena 	union {
453f5e6d5a3SSumit Saxena 		struct mpi3mr_bsg_drv_cmd drvrcmd;
454f5e6d5a3SSumit Saxena 		struct mpi3mr_bsg_mptcmd mptcmd;
455f5e6d5a3SSumit Saxena 	} cmd;
456f5e6d5a3SSumit Saxena };
457f3de4706SSumit Saxena 
458f3de4706SSumit Saxena struct mpi3_nvme_encapsulated_request {
459f3de4706SSumit Saxena 	__le16	host_tag;
460f3de4706SSumit Saxena 	__u8	ioc_use_only02;
461f3de4706SSumit Saxena 	__u8	function;
462f3de4706SSumit Saxena 	__le16	ioc_use_only04;
463f3de4706SSumit Saxena 	__u8	ioc_use_only06;
464f3de4706SSumit Saxena 	__u8	msg_flags;
465f3de4706SSumit Saxena 	__le16	change_count;
466f3de4706SSumit Saxena 	__le16	dev_handle;
467f3de4706SSumit Saxena 	__le16	encapsulated_command_length;
468f3de4706SSumit Saxena 	__le16	flags;
469f3de4706SSumit Saxena 	__le32	data_length;
470f3de4706SSumit Saxena 	__le32  reserved14[3];
471c6f2e6b6SKees Cook 	__le32	command[];
472f3de4706SSumit Saxena };
473f3de4706SSumit Saxena 
474f3de4706SSumit Saxena struct mpi3_nvme_encapsulated_error_reply {
475f3de4706SSumit Saxena 	__le16	host_tag;
476f3de4706SSumit Saxena 	__u8	ioc_use_only02;
477f3de4706SSumit Saxena 	__u8	function;
478f3de4706SSumit Saxena 	__le16	ioc_use_only04;
479f3de4706SSumit Saxena 	__u8	ioc_use_only06;
480f3de4706SSumit Saxena 	__u8	msg_flags;
481f3de4706SSumit Saxena 	__le16	ioc_use_only08;
482f3de4706SSumit Saxena 	__le16	ioc_status;
483f3de4706SSumit Saxena 	__le32	ioc_log_info;
484f3de4706SSumit Saxena 	__le32	nvme_completion_entry[4];
485f3de4706SSumit Saxena };
486f3de4706SSumit Saxena 
4877dbd0dd8SSumit Saxena #define	MPI3MR_NVME_PRP_SIZE		8 /* PRP size */
4887dbd0dd8SSumit Saxena #define	MPI3MR_NVME_CMD_PRP1_OFFSET	24 /* PRP1 offset in NVMe cmd */
4897dbd0dd8SSumit Saxena #define	MPI3MR_NVME_CMD_PRP2_OFFSET	32 /* PRP2 offset in NVMe cmd */
4907dbd0dd8SSumit Saxena #define	MPI3MR_NVME_CMD_SGL_OFFSET	24 /* SGL offset in NVMe cmd */
4917dbd0dd8SSumit Saxena #define MPI3MR_NVME_DATA_FORMAT_PRP	0
4927dbd0dd8SSumit Saxena #define MPI3MR_NVME_DATA_FORMAT_SGL1	1
4937dbd0dd8SSumit Saxena #define MPI3MR_NVME_DATA_FORMAT_SGL2	2
4947dbd0dd8SSumit Saxena 
495f3de4706SSumit Saxena /* MPI3: task management related definitions */
496f3de4706SSumit Saxena struct mpi3_scsi_task_mgmt_request {
497f3de4706SSumit Saxena 	__le16	host_tag;
498f3de4706SSumit Saxena 	__u8	ioc_use_only02;
499f3de4706SSumit Saxena 	__u8	function;
500f3de4706SSumit Saxena 	__le16	ioc_use_only04;
501f3de4706SSumit Saxena 	__u8	ioc_use_only06;
502f3de4706SSumit Saxena 	__u8    msg_flags;
503f3de4706SSumit Saxena 	__le16	change_count;
504f3de4706SSumit Saxena 	__le16	dev_handle;
505f3de4706SSumit Saxena 	__le16	task_host_tag;
506f3de4706SSumit Saxena 	__u8	task_type;
507f3de4706SSumit Saxena 	__u8	reserved0f;
508f3de4706SSumit Saxena 	__le16	task_request_queue_id;
509f3de4706SSumit Saxena 	__le16	reserved12;
510f3de4706SSumit Saxena 	__le32	reserved14;
511f3de4706SSumit Saxena 	__u8	lun[8];
512f3de4706SSumit Saxena };
513f3de4706SSumit Saxena 
514f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_MSGFLAGS_DO_NOT_SEND_TASK_IU      (0x08)
515f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK               (0x01)
516f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK_SET           (0x02)
517f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_TARGET_RESET             (0x03)
518f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET       (0x05)
519f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET           (0x06)
520f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_QUERY_TASK               (0x07)
521f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_CLEAR_ACA                (0x08)
522f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_QUERY_TASK_SET           (0x09)
523f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_QUERY_ASYNC_EVENT        (0x0a)
524f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_TASKTYPE_I_T_NEXUS_RESET          (0x0b)
525f3de4706SSumit Saxena struct mpi3_scsi_task_mgmt_reply {
526f3de4706SSumit Saxena 	__le16	host_tag;
527f3de4706SSumit Saxena 	__u8	ioc_use_only02;
528f3de4706SSumit Saxena 	__u8	function;
529f3de4706SSumit Saxena 	__le16  ioc_use_only04;
530f3de4706SSumit Saxena 	__u8	ioc_use_only06;
531f3de4706SSumit Saxena 	__u8	msg_flags;
532f3de4706SSumit Saxena 	__le16	ioc_use_only08;
533f3de4706SSumit Saxena 	__le16	ioc_status;
534f3de4706SSumit Saxena 	__le32	ioc_log_info;
535f3de4706SSumit Saxena 	__le32	termination_count;
536f3de4706SSumit Saxena 	__le32	response_data;
537f3de4706SSumit Saxena 	__le32	reserved18;
538f3de4706SSumit Saxena };
539f3de4706SSumit Saxena 
540f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_TM_COMPLETE                (0x00)
541f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_INVALID_FRAME              (0x02)
542f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_TM_FUNCTION_NOT_SUPPORTED  (0x04)
543f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_TM_FAILED                  (0x05)
544f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_TM_SUCCEEDED               (0x08)
545f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_TM_INVALID_LUN             (0x09)
546f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_TM_OVERLAPPED_TAG          (0x0a)
547f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_IO_QUEUED_ON_IOC           (0x80)
548f3de4706SSumit Saxena #define MPI3_SCSITASKMGMT_RSPCODE_TM_NVME_DENIED             (0x81)
549f3de4706SSumit Saxena 
550f3de4706SSumit Saxena /* MPI3: PEL related definitions */
551f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_NON_BLOCKING_BOOT_EVENT   (0x0200)
552f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_BLOCKING_BOOT_EVENT       (0x0100)
553f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_PCIE                      (0x0080)
554f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_CONFIGURATION             (0x0040)
555f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_CONTROLER                 (0x0020)
556f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_SAS                       (0x0010)
557f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_EPACK                     (0x0008)
558f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_ENCLOSURE                 (0x0004)
559f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_PD                        (0x0002)
560f3de4706SSumit Saxena #define MPI3_PEL_LOCALE_FLAGS_VD                        (0x0001)
561f3de4706SSumit Saxena #define MPI3_PEL_CLASS_DEBUG                            (0x00)
562f3de4706SSumit Saxena #define MPI3_PEL_CLASS_PROGRESS                         (0x01)
563f3de4706SSumit Saxena #define MPI3_PEL_CLASS_INFORMATIONAL                    (0x02)
564f3de4706SSumit Saxena #define MPI3_PEL_CLASS_WARNING                          (0x03)
565f3de4706SSumit Saxena #define MPI3_PEL_CLASS_CRITICAL                         (0x04)
566f3de4706SSumit Saxena #define MPI3_PEL_CLASS_FATAL                            (0x05)
567f3de4706SSumit Saxena #define MPI3_PEL_CLASS_FAULT                            (0x06)
568f3de4706SSumit Saxena 
569f3de4706SSumit Saxena /* MPI3: Function definitions */
570f3de4706SSumit Saxena #define MPI3_BSG_FUNCTION_MGMT_PASSTHROUGH              (0x0a)
571f3de4706SSumit Saxena #define MPI3_BSG_FUNCTION_SCSI_IO                       (0x20)
572f3de4706SSumit Saxena #define MPI3_BSG_FUNCTION_SCSI_TASK_MGMT                (0x21)
573f3de4706SSumit Saxena #define MPI3_BSG_FUNCTION_SMP_PASSTHROUGH               (0x22)
574f3de4706SSumit Saxena #define MPI3_BSG_FUNCTION_NVME_ENCAPSULATED             (0x24)
575f3de4706SSumit Saxena 
576f5e6d5a3SSumit Saxena #endif
577