11797Sphk/*-
21797Sphk * Copyright (c) 2008 Yahoo!, Inc.
31797Sphk * All rights reserved.
41797Sphk * Written by: John Baldwin <jhb@FreeBSD.org>
51797Sphk *
61797Sphk * Redistribution and use in source and binary forms, with or without
71797Sphk * modification, are permitted provided that the following conditions
81797Sphk * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the author nor the names of any co-contributors
15 *    may be used to endorse or promote products derived from this software
16 *    without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * LSI MPT-Fusion Host Adapter FreeBSD userland interface
31 *
32 * $FreeBSD$
33 */
34/*-
35 * Copyright (c) 2011, 2012 LSI Corp.
36 * All rights reserved.
37 *
38 * Redistribution and use in source and binary forms, with or without
39 * modification, are permitted provided that the following conditions
40 * are met:
41 * 1. Redistributions of source code must retain the above copyright
42 *    notice, this list of conditions and the following disclaimer.
43 * 2. Redistributions in binary form must reproduce the above copyright
44 *    notice, this list of conditions and the following disclaimer in the
45 *    documentation and/or other materials provided with the distribution.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
48 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57 * SUCH DAMAGE.
58 *
59 * LSI MPT-Fusion Host Adapter FreeBSD
60 *
61 * $FreeBSD$
62 */
63
64#ifndef _MPS_IOCTL_H_
65#define	_MPS_IOCTL_H_
66
67#include <dev/mps/mpi/mpi2_type.h>
68#include <dev/mps/mpi/mpi2.h>
69#include <dev/mps/mpi/mpi2_cnfg.h>
70#include <dev/mps/mpi/mpi2_sas.h>
71
72/*
73 * For the read header requests, the header should include the page
74 * type or extended page type, page number, and page version.  The
75 * buffer and length are unused.  The completed header is returned in
76 * the 'header' member.
77 *
78 * For the read page and write page requests, 'buf' should point to a
79 * buffer of 'len' bytes which holds the entire page (including the
80 * header).
81 *
82 * All requests specify the page address in 'page_address'.
83 */
84struct mps_cfg_page_req {
85	MPI2_CONFIG_PAGE_HEADER header;
86	uint32_t page_address;
87	void	*buf;
88	int	len;
89	uint16_t ioc_status;
90};
91
92struct mps_ext_cfg_page_req {
93	MPI2_CONFIG_EXTENDED_PAGE_HEADER header;
94	uint32_t page_address;
95	void	*buf;
96	int	len;
97	uint16_t ioc_status;
98};
99
100struct mps_raid_action {
101	uint8_t action;
102	uint8_t volume_bus;
103	uint8_t volume_id;
104	uint8_t phys_disk_num;
105	uint32_t action_data_word;
106	void *buf;
107	int len;
108	uint32_t volume_status;
109	uint32_t action_data[4];
110	uint16_t action_status;
111	uint16_t ioc_status;
112	uint8_t write;
113};
114
115struct mps_usr_command {
116	void *req;
117	uint32_t req_len;
118	void *rpl;
119	uint32_t rpl_len;
120	void *buf;
121	int len;
122	uint32_t flags;
123};
124
125typedef struct mps_pci_bits
126{
127	union {
128		struct {
129			uint32_t	DeviceNumber	:5;
130			uint32_t	FunctionNumber	:3;
131			uint32_t	BusNumber	:24;
132		} bits;
133		uint32_t	AsDWORD;
134	} u;
135	uint32_t	PciSegmentId;
136} mps_pci_bits_t;
137
138/*
139 *  The following is the MPSIOCTL_GET_ADAPTER_DATA data structure.  This data
140 *  structure is setup so that we hopefully are properly aligned for both
141 *  32-bit and 64-bit mode applications.
142 *
143 *  Adapter Type - Value = 4 = SCSI Protocol through SAS-2 adapter
144 *
145 *  MPI Port Number - The PCI Function number for this device
146 *
147 *  PCI Device HW Id - The PCI device number for this device
148 *
149 */
150#define	MPSIOCTL_ADAPTER_TYPE_SAS2		4
151#define	MPSIOCTL_ADAPTER_TYPE_SAS2_SSS6200	5
152typedef struct mps_adapter_data
153{
154	uint32_t	StructureLength;
155	uint32_t	AdapterType;
156	uint32_t	MpiPortNumber;
157	uint32_t	PCIDeviceHwId;
158	uint32_t	PCIDeviceHwRev;
159	uint32_t	SubSystemId;
160	uint32_t	SubsystemVendorId;
161	uint32_t	Reserved1;
162	uint32_t	MpiFirmwareVersion;
163	uint32_t	BiosVersion;
164	uint8_t		DriverVersion[32];
165	uint8_t		Reserved2;
166	uint8_t		ScsiId;
167	uint16_t	Reserved3;
168	mps_pci_bits_t	PciInformation;
169} mps_adapter_data_t;
170
171
172typedef struct mps_update_flash
173{
174	uint64_t	PtrBuffer;
175	uint32_t	ImageChecksum;
176	uint32_t	ImageOffset;
177	uint32_t	ImageSize;
178	uint32_t	ImageType;
179} mps_update_flash_t;
180
181
182#define	MPS_PASS_THRU_DIRECTION_NONE	0
183#define	MPS_PASS_THRU_DIRECTION_READ	1
184#define	MPS_PASS_THRU_DIRECTION_WRITE	2
185#define	MPS_PASS_THRU_DIRECTION_BOTH	3
186
187typedef struct mps_pass_thru
188{
189	uint64_t	PtrRequest;
190	uint64_t	PtrReply;
191	uint64_t	PtrData;
192	uint32_t	RequestSize;
193	uint32_t	ReplySize;
194	uint32_t	DataSize;
195	uint32_t	DataDirection;
196	uint64_t	PtrDataOut;
197	uint32_t	DataOutSize;
198	uint32_t	Timeout;
199} mps_pass_thru_t;
200
201
202/*
203 * Event queue defines
204 */
205#define	MPS_EVENT_QUEUE_SIZE		(50) /* Max Events stored in driver */
206#define	MPS_MAX_EVENT_DATA_LENGTH	(48) /* Size of each event in Dwords */
207
208typedef struct mps_event_query
209{
210	uint16_t	Entries;
211	uint16_t	Reserved;
212	uint32_t	Types[4];
213} mps_event_query_t;
214
215typedef struct mps_event_enable
216{
217	uint32_t	Types[4];
218} mps_event_enable_t;
219
220/*
221 * Event record entry for ioctl.
222 */
223typedef struct mps_event_entry
224{
225	uint32_t	Type;
226	uint32_t	Number;
227	uint32_t	Data[MPS_MAX_EVENT_DATA_LENGTH];
228} mps_event_entry_t;
229
230typedef struct mps_event_report
231{
232	uint32_t	Size;
233	uint64_t	PtrEvents;
234} mps_event_report_t;
235
236
237typedef struct mps_pci_info
238{
239	uint32_t	BusNumber;
240	uint8_t		DeviceNumber;
241	uint8_t		FunctionNumber;
242	uint16_t	InterruptVector;
243	uint8_t		PciHeader[256];
244} mps_pci_info_t;
245
246
247typedef struct mps_diag_action
248{
249	uint32_t	Action;
250	uint32_t	Length;
251	uint64_t	PtrDiagAction;
252	uint32_t	ReturnCode;
253} mps_diag_action_t;
254
255#define	MPS_FW_DIAGNOSTIC_UID_NOT_FOUND	(0xFF)
256
257#define	MPS_FW_DIAG_NEW				(0x806E6577)
258
259#define	MPS_FW_DIAG_TYPE_REGISTER		(0x00000001)
260#define	MPS_FW_DIAG_TYPE_UNREGISTER		(0x00000002)
261#define	MPS_FW_DIAG_TYPE_QUERY			(0x00000003)
262#define	MPS_FW_DIAG_TYPE_READ_BUFFER		(0x00000004)
263#define	MPS_FW_DIAG_TYPE_RELEASE		(0x00000005)
264
265#define	MPS_FW_DIAG_INVALID_UID			(0x00000000)
266
267#define MPS_DIAG_SUCCESS			0
268#define MPS_DIAG_FAILURE			1
269
270#define	MPS_FW_DIAG_ERROR_SUCCESS		(0x00000000)
271#define	MPS_FW_DIAG_ERROR_FAILURE		(0x00000001)
272#define	MPS_FW_DIAG_ERROR_INVALID_PARAMETER	(0x00000002)
273#define	MPS_FW_DIAG_ERROR_POST_FAILED		(0x00000010)
274#define	MPS_FW_DIAG_ERROR_INVALID_UID		(0x00000011)
275#define	MPS_FW_DIAG_ERROR_RELEASE_FAILED	(0x00000012)
276#define	MPS_FW_DIAG_ERROR_NO_BUFFER		(0x00000013)
277#define	MPS_FW_DIAG_ERROR_ALREADY_RELEASED	(0x00000014)
278
279
280typedef struct mps_fw_diag_register
281{
282	uint8_t		ExtendedType;
283	uint8_t		BufferType;
284	uint16_t	ApplicationFlags;
285	uint32_t	DiagnosticFlags;
286	uint32_t	ProductSpecific[23];
287	uint32_t	RequestedBufferSize;
288	uint32_t	UniqueId;
289} mps_fw_diag_register_t;
290
291typedef struct mps_fw_diag_unregister
292{
293	uint32_t	UniqueId;
294} mps_fw_diag_unregister_t;
295
296#define	MPS_FW_DIAG_FLAG_APP_OWNED		(0x0001)
297#define	MPS_FW_DIAG_FLAG_BUFFER_VALID		(0x0002)
298#define	MPS_FW_DIAG_FLAG_FW_BUFFER_ACCESS	(0x0004)
299
300typedef struct mps_fw_diag_query
301{
302	uint8_t		ExtendedType;
303	uint8_t		BufferType;
304	uint16_t	ApplicationFlags;
305	uint32_t	DiagnosticFlags;
306	uint32_t	ProductSpecific[23];
307	uint32_t	TotalBufferSize;
308	uint32_t	DriverAddedBufferSize;
309	uint32_t	UniqueId;
310} mps_fw_diag_query_t;
311
312typedef struct mps_fw_diag_release
313{
314	uint32_t	UniqueId;
315} mps_fw_diag_release_t;
316
317#define	MPS_FW_DIAG_FLAG_REREGISTER	(0x0001)
318#define	MPS_FW_DIAG_FLAG_FORCE_RELEASE	(0x0002)
319
320typedef struct mps_diag_read_buffer
321{
322	uint8_t		Status;
323	uint8_t		Reserved;
324	uint16_t	Flags;
325	uint32_t	StartingOffset;
326	uint32_t	BytesToRead;
327	uint32_t	UniqueId;
328	uint64_t	PtrDataBuffer;
329} mps_diag_read_buffer_t;
330
331/*
332 * Register Access
333 */
334#define	REG_IO_READ	1
335#define	REG_IO_WRITE	2
336#define	REG_MEM_READ	3
337#define	REG_MEM_WRITE	4
338
339typedef struct mps_reg_access
340{
341	uint32_t	Command;
342	uint32_t	RegOffset;
343	uint32_t	RegData;
344} mps_reg_access_t;
345
346typedef struct mps_btdh_mapping
347{
348	uint16_t	TargetID;
349	uint16_t	Bus;
350	uint16_t	DevHandle;
351	uint16_t	Reserved;
352} mps_btdh_mapping_t;
353
354#define MPSIO_MPS_COMMAND_FLAG_VERBOSE	0x01
355#define MPSIO_MPS_COMMAND_FLAG_DEBUG	0x02
356#define	MPSIO_READ_CFG_HEADER	_IOWR('M', 200, struct mps_cfg_page_req)
357#define	MPSIO_READ_CFG_PAGE	_IOWR('M', 201, struct mps_cfg_page_req)
358#define	MPSIO_READ_EXT_CFG_HEADER _IOWR('M', 202, struct mps_ext_cfg_page_req)
359#define	MPSIO_READ_EXT_CFG_PAGE	_IOWR('M', 203, struct mps_ext_cfg_page_req)
360#define	MPSIO_WRITE_CFG_PAGE	_IOWR('M', 204, struct mps_cfg_page_req)
361#define	MPSIO_RAID_ACTION	_IOWR('M', 205, struct mps_raid_action)
362#define	MPSIO_MPS_COMMAND	_IOWR('M', 210, struct mps_usr_command)
363
364#define	MPTIOCTL			('I')
365#define	MPTIOCTL_GET_ADAPTER_DATA	_IOWR(MPTIOCTL, 1,\
366    struct mps_adapter_data)
367#define	MPTIOCTL_UPDATE_FLASH		_IOWR(MPTIOCTL, 2,\
368    struct mps_update_flash)
369#define	MPTIOCTL_RESET_ADAPTER		_IO(MPTIOCTL, 3)
370#define	MPTIOCTL_PASS_THRU		_IOWR(MPTIOCTL, 4,\
371    struct mps_pass_thru)
372#define	MPTIOCTL_EVENT_QUERY		_IOWR(MPTIOCTL, 5,\
373    struct mps_event_query)
374#define	MPTIOCTL_EVENT_ENABLE		_IOWR(MPTIOCTL, 6,\
375    struct mps_event_enable)
376#define	MPTIOCTL_EVENT_REPORT		_IOWR(MPTIOCTL, 7,\
377    struct mps_event_report)
378#define	MPTIOCTL_GET_PCI_INFO		_IOWR(MPTIOCTL, 8,\
379    struct mps_pci_info)
380#define	MPTIOCTL_DIAG_ACTION		_IOWR(MPTIOCTL, 9,\
381    struct mps_diag_action)
382#define	MPTIOCTL_REG_ACCESS		_IOWR(MPTIOCTL, 10,\
383    struct mps_reg_access)
384#define	MPTIOCTL_BTDH_MAPPING		_IOWR(MPTIOCTL, 11,\
385    struct mps_btdh_mapping)
386
387#endif /* !_MPS_IOCTL_H_ */
388