mpr_ioctl.h revision 265236
1265236Sken/*-
2265236Sken * Copyright (c) 2008 Yahoo!, Inc.
3265236Sken * All rights reserved.
4265236Sken * Written by: John Baldwin <jhb@FreeBSD.org>
5265236Sken *
6265236Sken * Redistribution and use in source and binary forms, with or without
7265236Sken * modification, are permitted provided that the following conditions
8265236Sken * are met:
9265236Sken * 1. Redistributions of source code must retain the above copyright
10265236Sken *    notice, this list of conditions and the following disclaimer.
11265236Sken * 2. Redistributions in binary form must reproduce the above copyright
12265236Sken *    notice, this list of conditions and the following disclaimer in the
13265236Sken *    documentation and/or other materials provided with the distribution.
14265236Sken * 3. Neither the name of the author nor the names of any co-contributors
15265236Sken *    may be used to endorse or promote products derived from this software
16265236Sken *    without specific prior written permission.
17265236Sken *
18265236Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19265236Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20265236Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21265236Sken * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22265236Sken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23265236Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24265236Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25265236Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26265236Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27265236Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28265236Sken * SUCH DAMAGE.
29265236Sken *
30265236Sken * LSI MPT-Fusion Host Adapter FreeBSD userland interface
31265236Sken *
32265236Sken * $FreeBSD: head/sys/dev/mpr/mpr_ioctl.h 265236 2014-05-02 20:25:09Z ken $
33265236Sken */
34265236Sken/*-
35265236Sken * Copyright (c) 2011-2014 LSI Corp.
36265236Sken * All rights reserved.
37265236Sken *
38265236Sken * Redistribution and use in source and binary forms, with or without
39265236Sken * modification, are permitted provided that the following conditions
40265236Sken * are met:
41265236Sken * 1. Redistributions of source code must retain the above copyright
42265236Sken *    notice, this list of conditions and the following disclaimer.
43265236Sken * 2. Redistributions in binary form must reproduce the above copyright
44265236Sken *    notice, this list of conditions and the following disclaimer in the
45265236Sken *    documentation and/or other materials provided with the distribution.
46265236Sken *
47265236Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
48265236Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49265236Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50265236Sken * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
51265236Sken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52265236Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53265236Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54265236Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55265236Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56265236Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57265236Sken * SUCH DAMAGE.
58265236Sken *
59265236Sken * LSI MPT-Fusion Host Adapter FreeBSD
60265236Sken *
61265236Sken * $FreeBSD: head/sys/dev/mpr/mpr_ioctl.h 265236 2014-05-02 20:25:09Z ken $
62265236Sken */
63265236Sken
64265236Sken#ifndef _MPR_IOCTL_H_
65265236Sken#define	_MPR_IOCTL_H_
66265236Sken
67265236Sken#include <dev/mpr/mpi/mpi2_type.h>
68265236Sken#include <dev/mpr/mpi/mpi2.h>
69265236Sken#include <dev/mpr/mpi/mpi2_cnfg.h>
70265236Sken#include <dev/mpr/mpi/mpi2_sas.h>
71265236Sken
72265236Sken/*
73265236Sken * For the read header requests, the header should include the page
74265236Sken * type or extended page type, page number, and page version.  The
75265236Sken * buffer and length are unused.  The completed header is returned in
76265236Sken * the 'header' member.
77265236Sken *
78265236Sken * For the read page and write page requests, 'buf' should point to a
79265236Sken * buffer of 'len' bytes which holds the entire page (including the
80265236Sken * header).
81265236Sken *
82265236Sken * All requests specify the page address in 'page_address'.
83265236Sken */
84265236Skenstruct mpr_cfg_page_req {
85265236Sken	MPI2_CONFIG_PAGE_HEADER header;
86265236Sken	uint32_t page_address;
87265236Sken	void	*buf;
88265236Sken	int	len;
89265236Sken	uint16_t ioc_status;
90265236Sken};
91265236Sken
92265236Skenstruct mpr_ext_cfg_page_req {
93265236Sken	MPI2_CONFIG_EXTENDED_PAGE_HEADER header;
94265236Sken	uint32_t page_address;
95265236Sken	void	*buf;
96265236Sken	int	len;
97265236Sken	uint16_t ioc_status;
98265236Sken};
99265236Sken
100265236Skenstruct mpr_raid_action {
101265236Sken	uint8_t action;
102265236Sken	uint8_t volume_bus;
103265236Sken	uint8_t volume_id;
104265236Sken	uint8_t phys_disk_num;
105265236Sken	uint32_t action_data_word;
106265236Sken	void *buf;
107265236Sken	int len;
108265236Sken	uint32_t volume_status;
109265236Sken	uint32_t action_data[4];
110265236Sken	uint16_t action_status;
111265236Sken	uint16_t ioc_status;
112265236Sken	uint8_t write;
113265236Sken};
114265236Sken
115265236Skenstruct mpr_usr_command {
116265236Sken	void *req;
117265236Sken	uint32_t req_len;
118265236Sken	void *rpl;
119265236Sken	uint32_t rpl_len;
120265236Sken	void *buf;
121265236Sken	int len;
122265236Sken	uint32_t flags;
123265236Sken};
124265236Sken
125265236Skentypedef struct mpr_pci_bits
126265236Sken{
127265236Sken	union {
128265236Sken		struct {
129265236Sken			uint32_t	DeviceNumber	:5;
130265236Sken			uint32_t	FunctionNumber	:3;
131265236Sken			uint32_t	BusNumber	:24;
132265236Sken		} bits;
133265236Sken		uint32_t	AsDWORD;
134265236Sken	} u;
135265236Sken	uint32_t	PciSegmentId;
136265236Sken} mpr_pci_bits_t;
137265236Sken
138265236Sken/*
139265236Sken *  The following is the MPRIOCTL_GET_ADAPTER_DATA data structure.  This data
140265236Sken *  structure is setup so that we hopefully are properly aligned for both
141265236Sken *  32-bit and 64-bit mode applications.
142265236Sken *
143265236Sken *  Adapter Type - Value = 6 = SCSI Protocol through SAS-3 adapter
144265236Sken *
145265236Sken *  MPI Port Number - The PCI Function number for this device
146265236Sken *
147265236Sken *  PCI Device HW Id - The PCI device number for this device
148265236Sken *
149265236Sken */
150265236Sken#define	MPRIOCTL_ADAPTER_TYPE_SAS3		6
151265236Skentypedef struct mpr_adapter_data
152265236Sken{
153265236Sken	uint32_t	StructureLength;
154265236Sken	uint32_t	AdapterType;
155265236Sken	uint32_t	MpiPortNumber;
156265236Sken	uint32_t	PCIDeviceHwId;
157265236Sken	uint32_t	PCIDeviceHwRev;
158265236Sken	uint32_t	SubSystemId;
159265236Sken	uint32_t	SubsystemVendorId;
160265236Sken	uint32_t	Reserved1;
161265236Sken	uint32_t	MpiFirmwareVersion;
162265236Sken	uint32_t	BiosVersion;
163265236Sken	uint8_t		DriverVersion[32];
164265236Sken	uint8_t		Reserved2;
165265236Sken	uint8_t		ScsiId;
166265236Sken	uint16_t	Reserved3;
167265236Sken	mpr_pci_bits_t	PciInformation;
168265236Sken} mpr_adapter_data_t;
169265236Sken
170265236Sken
171265236Skentypedef struct mpr_update_flash
172265236Sken{
173265236Sken	uint64_t	PtrBuffer;
174265236Sken	uint32_t	ImageChecksum;
175265236Sken	uint32_t	ImageOffset;
176265236Sken	uint32_t	ImageSize;
177265236Sken	uint32_t	ImageType;
178265236Sken} mpr_update_flash_t;
179265236Sken
180265236Sken
181265236Sken#define	MPR_PASS_THRU_DIRECTION_NONE	0
182265236Sken#define	MPR_PASS_THRU_DIRECTION_READ	1
183265236Sken#define	MPR_PASS_THRU_DIRECTION_WRITE	2
184265236Sken#define	MPR_PASS_THRU_DIRECTION_BOTH	3
185265236Sken
186265236Skentypedef struct mpr_pass_thru
187265236Sken{
188265236Sken	uint64_t	PtrRequest;
189265236Sken	uint64_t	PtrReply;
190265236Sken	uint64_t	PtrData;
191265236Sken	uint32_t	RequestSize;
192265236Sken	uint32_t	ReplySize;
193265236Sken	uint32_t	DataSize;
194265236Sken	uint32_t	DataDirection;
195265236Sken	uint64_t	PtrDataOut;
196265236Sken	uint32_t	DataOutSize;
197265236Sken	uint32_t	Timeout;
198265236Sken} mpr_pass_thru_t;
199265236Sken
200265236Sken
201265236Sken/*
202265236Sken * Event queue defines
203265236Sken */
204265236Sken#define	MPR_EVENT_QUEUE_SIZE		(50) /* Max Events stored in driver */
205265236Sken#define	MPR_MAX_EVENT_DATA_LENGTH	(48) /* Size of each event in Dwords */
206265236Sken
207265236Skentypedef struct mpr_event_query
208265236Sken{
209265236Sken	uint16_t	Entries;
210265236Sken	uint16_t	Reserved;
211265236Sken	uint32_t	Types[4];
212265236Sken} mpr_event_query_t;
213265236Sken
214265236Skentypedef struct mpr_event_enable
215265236Sken{
216265236Sken	uint32_t	Types[4];
217265236Sken} mpr_event_enable_t;
218265236Sken
219265236Sken/*
220265236Sken * Event record entry for ioctl.
221265236Sken */
222265236Skentypedef struct mpr_event_entry
223265236Sken{
224265236Sken	uint32_t	Type;
225265236Sken	uint32_t	Number;
226265236Sken	uint32_t	Data[MPR_MAX_EVENT_DATA_LENGTH];
227265236Sken} mpr_event_entry_t;
228265236Sken
229265236Skentypedef struct mpr_event_report
230265236Sken{
231265236Sken	uint32_t	Size;
232265236Sken	uint64_t	PtrEvents;
233265236Sken} mpr_event_report_t;
234265236Sken
235265236Sken
236265236Skentypedef struct mpr_pci_info
237265236Sken{
238265236Sken	uint32_t	BusNumber;
239265236Sken	uint8_t		DeviceNumber;
240265236Sken	uint8_t		FunctionNumber;
241265236Sken	uint16_t	InterruptVector;
242265236Sken	uint8_t		PciHeader[256];
243265236Sken} mpr_pci_info_t;
244265236Sken
245265236Sken
246265236Skentypedef struct mpr_diag_action
247265236Sken{
248265236Sken	uint32_t	Action;
249265236Sken	uint32_t	Length;
250265236Sken	uint64_t	PtrDiagAction;
251265236Sken	uint32_t	ReturnCode;
252265236Sken} mpr_diag_action_t;
253265236Sken
254265236Sken#define	MPR_FW_DIAGNOSTIC_UID_NOT_FOUND	(0xFF)
255265236Sken
256265236Sken#define	MPR_FW_DIAG_NEW				(0x806E6577)
257265236Sken
258265236Sken#define	MPR_FW_DIAG_TYPE_REGISTER		(0x00000001)
259265236Sken#define	MPR_FW_DIAG_TYPE_UNREGISTER		(0x00000002)
260265236Sken#define	MPR_FW_DIAG_TYPE_QUERY			(0x00000003)
261265236Sken#define	MPR_FW_DIAG_TYPE_READ_BUFFER		(0x00000004)
262265236Sken#define	MPR_FW_DIAG_TYPE_RELEASE		(0x00000005)
263265236Sken
264265236Sken#define	MPR_FW_DIAG_INVALID_UID			(0x00000000)
265265236Sken
266265236Sken#define MPR_DIAG_SUCCESS			0
267265236Sken#define MPR_DIAG_FAILURE			1
268265236Sken
269265236Sken#define	MPR_FW_DIAG_ERROR_SUCCESS		(0x00000000)
270265236Sken#define	MPR_FW_DIAG_ERROR_FAILURE		(0x00000001)
271265236Sken#define	MPR_FW_DIAG_ERROR_INVALID_PARAMETER	(0x00000002)
272265236Sken#define	MPR_FW_DIAG_ERROR_POST_FAILED		(0x00000010)
273265236Sken#define	MPR_FW_DIAG_ERROR_INVALID_UID		(0x00000011)
274265236Sken#define	MPR_FW_DIAG_ERROR_RELEASE_FAILED	(0x00000012)
275265236Sken#define	MPR_FW_DIAG_ERROR_NO_BUFFER		(0x00000013)
276265236Sken#define	MPR_FW_DIAG_ERROR_ALREADY_RELEASED	(0x00000014)
277265236Sken
278265236Sken
279265236Skentypedef struct mpr_fw_diag_register
280265236Sken{
281265236Sken	uint8_t		ExtendedType;
282265236Sken	uint8_t		BufferType;
283265236Sken	uint16_t	ApplicationFlags;
284265236Sken	uint32_t	DiagnosticFlags;
285265236Sken	uint32_t	ProductSpecific[23];
286265236Sken	uint32_t	RequestedBufferSize;
287265236Sken	uint32_t	UniqueId;
288265236Sken} mpr_fw_diag_register_t;
289265236Sken
290265236Skentypedef struct mpr_fw_diag_unregister
291265236Sken{
292265236Sken	uint32_t	UniqueId;
293265236Sken} mpr_fw_diag_unregister_t;
294265236Sken
295265236Sken#define	MPR_FW_DIAG_FLAG_APP_OWNED		(0x0001)
296265236Sken#define	MPR_FW_DIAG_FLAG_BUFFER_VALID		(0x0002)
297265236Sken#define	MPR_FW_DIAG_FLAG_FW_BUFFER_ACCESS	(0x0004)
298265236Sken
299265236Skentypedef struct mpr_fw_diag_query
300265236Sken{
301265236Sken	uint8_t		ExtendedType;
302265236Sken	uint8_t		BufferType;
303265236Sken	uint16_t	ApplicationFlags;
304265236Sken	uint32_t	DiagnosticFlags;
305265236Sken	uint32_t	ProductSpecific[23];
306265236Sken	uint32_t	TotalBufferSize;
307265236Sken	uint32_t	DriverAddedBufferSize;
308265236Sken	uint32_t	UniqueId;
309265236Sken} mpr_fw_diag_query_t;
310265236Sken
311265236Skentypedef struct mpr_fw_diag_release
312265236Sken{
313265236Sken	uint32_t	UniqueId;
314265236Sken} mpr_fw_diag_release_t;
315265236Sken
316265236Sken#define	MPR_FW_DIAG_FLAG_REREGISTER	(0x0001)
317265236Sken#define	MPR_FW_DIAG_FLAG_FORCE_RELEASE	(0x0002)
318265236Sken
319265236Skentypedef struct mpr_diag_read_buffer
320265236Sken{
321265236Sken	uint8_t		Status;
322265236Sken	uint8_t		Reserved;
323265236Sken	uint16_t	Flags;
324265236Sken	uint32_t	StartingOffset;
325265236Sken	uint32_t	BytesToRead;
326265236Sken	uint32_t	UniqueId;
327265236Sken	uint64_t	PtrDataBuffer;
328265236Sken} mpr_diag_read_buffer_t;
329265236Sken
330265236Sken/*
331265236Sken * Register Access
332265236Sken */
333265236Sken#define	REG_IO_READ	1
334265236Sken#define	REG_IO_WRITE	2
335265236Sken#define	REG_MEM_READ	3
336265236Sken#define	REG_MEM_WRITE	4
337265236Sken
338265236Skentypedef struct mpr_reg_access
339265236Sken{
340265236Sken	uint32_t	Command;
341265236Sken	uint32_t	RegOffset;
342265236Sken	uint32_t	RegData;
343265236Sken} mpr_reg_access_t;
344265236Sken
345265236Skentypedef struct mpr_btdh_mapping
346265236Sken{
347265236Sken	uint16_t	TargetID;
348265236Sken	uint16_t	Bus;
349265236Sken	uint16_t	DevHandle;
350265236Sken	uint16_t	Reserved;
351265236Sken} mpr_btdh_mapping_t;
352265236Sken
353265236Sken#define MPRIO_MPR_COMMAND_FLAG_VERBOSE	0x01
354265236Sken#define MPRIO_MPR_COMMAND_FLAG_DEBUG	0x02
355265236Sken#define	MPRIO_READ_CFG_HEADER	_IOWR('M', 200, struct mpr_cfg_page_req)
356265236Sken#define	MPRIO_READ_CFG_PAGE	_IOWR('M', 201, struct mpr_cfg_page_req)
357265236Sken#define	MPRIO_READ_EXT_CFG_HEADER _IOWR('M', 202, struct mpr_ext_cfg_page_req)
358265236Sken#define	MPRIO_READ_EXT_CFG_PAGE	_IOWR('M', 203, struct mpr_ext_cfg_page_req)
359265236Sken#define	MPRIO_WRITE_CFG_PAGE	_IOWR('M', 204, struct mpr_cfg_page_req)
360265236Sken#define	MPRIO_RAID_ACTION	_IOWR('M', 205, struct mpr_raid_action)
361265236Sken#define	MPRIO_MPR_COMMAND	_IOWR('M', 210, struct mpr_usr_command)
362265236Sken
363265236Sken#define	MPTIOCTL			('I')
364265236Sken#define	MPTIOCTL_GET_ADAPTER_DATA	_IOWR(MPTIOCTL, 1,\
365265236Sken    struct mpr_adapter_data)
366265236Sken#define	MPTIOCTL_UPDATE_FLASH		_IOWR(MPTIOCTL, 2,\
367265236Sken    struct mpr_update_flash)
368265236Sken#define	MPTIOCTL_RESET_ADAPTER		_IO(MPTIOCTL, 3)
369265236Sken#define	MPTIOCTL_PASS_THRU		_IOWR(MPTIOCTL, 4,\
370265236Sken    struct mpr_pass_thru)
371265236Sken#define	MPTIOCTL_EVENT_QUERY		_IOWR(MPTIOCTL, 5,\
372265236Sken    struct mpr_event_query)
373265236Sken#define	MPTIOCTL_EVENT_ENABLE		_IOWR(MPTIOCTL, 6,\
374265236Sken    struct mpr_event_enable)
375265236Sken#define	MPTIOCTL_EVENT_REPORT		_IOWR(MPTIOCTL, 7,\
376265236Sken    struct mpr_event_report)
377265236Sken#define	MPTIOCTL_GET_PCI_INFO		_IOWR(MPTIOCTL, 8,\
378265236Sken    struct mpr_pci_info)
379265236Sken#define	MPTIOCTL_DIAG_ACTION		_IOWR(MPTIOCTL, 9,\
380265236Sken    struct mpr_diag_action)
381265236Sken#define	MPTIOCTL_REG_ACCESS		_IOWR(MPTIOCTL, 10,\
382265236Sken    struct mpr_reg_access)
383265236Sken#define	MPTIOCTL_BTDH_MAPPING		_IOWR(MPTIOCTL, 11,\
384265236Sken    struct mpr_btdh_mapping)
385265236Sken
386265236Sken#endif /* !_MPR_IOCTL_H_ */
387