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