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: stable/11/sys/dev/mpr/mpr_ioctl.h 331903 2018-04-03 02:29:17Z mav $
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: stable/11/sys/dev/mpr/mpr_ioctl.h 331903 2018-04-03 02:29:17Z mav $
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
152331903Smav#define	MPRIOCTL_ADAPTER_TYPE_SAS35		7
153265236Skentypedef struct mpr_adapter_data
154265236Sken{
155265236Sken	uint32_t	StructureLength;
156265236Sken	uint32_t	AdapterType;
157265236Sken	uint32_t	MpiPortNumber;
158265236Sken	uint32_t	PCIDeviceHwId;
159265236Sken	uint32_t	PCIDeviceHwRev;
160265236Sken	uint32_t	SubSystemId;
161265236Sken	uint32_t	SubsystemVendorId;
162265236Sken	uint32_t	Reserved1;
163265236Sken	uint32_t	MpiFirmwareVersion;
164265236Sken	uint32_t	BiosVersion;
165265236Sken	uint8_t		DriverVersion[32];
166265236Sken	uint8_t		Reserved2;
167265236Sken	uint8_t		ScsiId;
168265236Sken	uint16_t	Reserved3;
169265236Sken	mpr_pci_bits_t	PciInformation;
170265236Sken} mpr_adapter_data_t;
171265236Sken
172265236Sken
173265236Skentypedef struct mpr_update_flash
174265236Sken{
175265236Sken	uint64_t	PtrBuffer;
176265236Sken	uint32_t	ImageChecksum;
177265236Sken	uint32_t	ImageOffset;
178265236Sken	uint32_t	ImageSize;
179265236Sken	uint32_t	ImageType;
180265236Sken} mpr_update_flash_t;
181265236Sken
182265236Sken
183265236Sken#define	MPR_PASS_THRU_DIRECTION_NONE	0
184265236Sken#define	MPR_PASS_THRU_DIRECTION_READ	1
185265236Sken#define	MPR_PASS_THRU_DIRECTION_WRITE	2
186265236Sken#define	MPR_PASS_THRU_DIRECTION_BOTH	3
187265236Sken
188265236Skentypedef struct mpr_pass_thru
189265236Sken{
190265236Sken	uint64_t	PtrRequest;
191265236Sken	uint64_t	PtrReply;
192265236Sken	uint64_t	PtrData;
193265236Sken	uint32_t	RequestSize;
194265236Sken	uint32_t	ReplySize;
195265236Sken	uint32_t	DataSize;
196265236Sken	uint32_t	DataDirection;
197265236Sken	uint64_t	PtrDataOut;
198265236Sken	uint32_t	DataOutSize;
199265236Sken	uint32_t	Timeout;
200265236Sken} mpr_pass_thru_t;
201265236Sken
202265236Sken
203265236Sken/*
204265236Sken * Event queue defines
205265236Sken */
206331903Smav#define	MPR_EVENT_QUEUE_SIZE		(200) /* Max Events stored in driver */
207265236Sken#define	MPR_MAX_EVENT_DATA_LENGTH	(48) /* Size of each event in Dwords */
208265236Sken
209265236Skentypedef struct mpr_event_query
210265236Sken{
211265236Sken	uint16_t	Entries;
212265236Sken	uint16_t	Reserved;
213265236Sken	uint32_t	Types[4];
214265236Sken} mpr_event_query_t;
215265236Sken
216265236Skentypedef struct mpr_event_enable
217265236Sken{
218265236Sken	uint32_t	Types[4];
219265236Sken} mpr_event_enable_t;
220265236Sken
221265236Sken/*
222265236Sken * Event record entry for ioctl.
223265236Sken */
224265236Skentypedef struct mpr_event_entry
225265236Sken{
226265236Sken	uint32_t	Type;
227265236Sken	uint32_t	Number;
228265236Sken	uint32_t	Data[MPR_MAX_EVENT_DATA_LENGTH];
229265236Sken} mpr_event_entry_t;
230265236Sken
231265236Skentypedef struct mpr_event_report
232265236Sken{
233265236Sken	uint32_t	Size;
234265236Sken	uint64_t	PtrEvents;
235265236Sken} mpr_event_report_t;
236265236Sken
237265236Sken
238265236Skentypedef struct mpr_pci_info
239265236Sken{
240265236Sken	uint32_t	BusNumber;
241265236Sken	uint8_t		DeviceNumber;
242265236Sken	uint8_t		FunctionNumber;
243265236Sken	uint16_t	InterruptVector;
244265236Sken	uint8_t		PciHeader[256];
245265236Sken} mpr_pci_info_t;
246265236Sken
247265236Sken
248265236Skentypedef struct mpr_diag_action
249265236Sken{
250265236Sken	uint32_t	Action;
251265236Sken	uint32_t	Length;
252265236Sken	uint64_t	PtrDiagAction;
253265236Sken	uint32_t	ReturnCode;
254265236Sken} mpr_diag_action_t;
255265236Sken
256265236Sken#define	MPR_FW_DIAGNOSTIC_UID_NOT_FOUND	(0xFF)
257265236Sken
258265236Sken#define	MPR_FW_DIAG_NEW				(0x806E6577)
259265236Sken
260265236Sken#define	MPR_FW_DIAG_TYPE_REGISTER		(0x00000001)
261265236Sken#define	MPR_FW_DIAG_TYPE_UNREGISTER		(0x00000002)
262265236Sken#define	MPR_FW_DIAG_TYPE_QUERY			(0x00000003)
263265236Sken#define	MPR_FW_DIAG_TYPE_READ_BUFFER		(0x00000004)
264265236Sken#define	MPR_FW_DIAG_TYPE_RELEASE		(0x00000005)
265265236Sken
266265236Sken#define	MPR_FW_DIAG_INVALID_UID			(0x00000000)
267265236Sken
268265236Sken#define MPR_DIAG_SUCCESS			0
269265236Sken#define MPR_DIAG_FAILURE			1
270265236Sken
271265236Sken#define	MPR_FW_DIAG_ERROR_SUCCESS		(0x00000000)
272265236Sken#define	MPR_FW_DIAG_ERROR_FAILURE		(0x00000001)
273265236Sken#define	MPR_FW_DIAG_ERROR_INVALID_PARAMETER	(0x00000002)
274265236Sken#define	MPR_FW_DIAG_ERROR_POST_FAILED		(0x00000010)
275265236Sken#define	MPR_FW_DIAG_ERROR_INVALID_UID		(0x00000011)
276265236Sken#define	MPR_FW_DIAG_ERROR_RELEASE_FAILED	(0x00000012)
277265236Sken#define	MPR_FW_DIAG_ERROR_NO_BUFFER		(0x00000013)
278265236Sken#define	MPR_FW_DIAG_ERROR_ALREADY_RELEASED	(0x00000014)
279265236Sken
280265236Sken
281265236Skentypedef struct mpr_fw_diag_register
282265236Sken{
283265236Sken	uint8_t		ExtendedType;
284265236Sken	uint8_t		BufferType;
285265236Sken	uint16_t	ApplicationFlags;
286265236Sken	uint32_t	DiagnosticFlags;
287265236Sken	uint32_t	ProductSpecific[23];
288265236Sken	uint32_t	RequestedBufferSize;
289265236Sken	uint32_t	UniqueId;
290265236Sken} mpr_fw_diag_register_t;
291265236Sken
292265236Skentypedef struct mpr_fw_diag_unregister
293265236Sken{
294265236Sken	uint32_t	UniqueId;
295265236Sken} mpr_fw_diag_unregister_t;
296265236Sken
297265236Sken#define	MPR_FW_DIAG_FLAG_APP_OWNED		(0x0001)
298265236Sken#define	MPR_FW_DIAG_FLAG_BUFFER_VALID		(0x0002)
299265236Sken#define	MPR_FW_DIAG_FLAG_FW_BUFFER_ACCESS	(0x0004)
300265236Sken
301265236Skentypedef struct mpr_fw_diag_query
302265236Sken{
303265236Sken	uint8_t		ExtendedType;
304265236Sken	uint8_t		BufferType;
305265236Sken	uint16_t	ApplicationFlags;
306265236Sken	uint32_t	DiagnosticFlags;
307265236Sken	uint32_t	ProductSpecific[23];
308265236Sken	uint32_t	TotalBufferSize;
309265236Sken	uint32_t	DriverAddedBufferSize;
310265236Sken	uint32_t	UniqueId;
311265236Sken} mpr_fw_diag_query_t;
312265236Sken
313265236Skentypedef struct mpr_fw_diag_release
314265236Sken{
315265236Sken	uint32_t	UniqueId;
316265236Sken} mpr_fw_diag_release_t;
317265236Sken
318265236Sken#define	MPR_FW_DIAG_FLAG_REREGISTER	(0x0001)
319265236Sken#define	MPR_FW_DIAG_FLAG_FORCE_RELEASE	(0x0002)
320265236Sken
321265236Skentypedef struct mpr_diag_read_buffer
322265236Sken{
323265236Sken	uint8_t		Status;
324265236Sken	uint8_t		Reserved;
325265236Sken	uint16_t	Flags;
326265236Sken	uint32_t	StartingOffset;
327265236Sken	uint32_t	BytesToRead;
328265236Sken	uint32_t	UniqueId;
329265236Sken	uint64_t	PtrDataBuffer;
330265236Sken} mpr_diag_read_buffer_t;
331265236Sken
332265236Sken/*
333265236Sken * Register Access
334265236Sken */
335265236Sken#define	REG_IO_READ	1
336265236Sken#define	REG_IO_WRITE	2
337265236Sken#define	REG_MEM_READ	3
338265236Sken#define	REG_MEM_WRITE	4
339265236Sken
340265236Skentypedef struct mpr_reg_access
341265236Sken{
342265236Sken	uint32_t	Command;
343265236Sken	uint32_t	RegOffset;
344265236Sken	uint32_t	RegData;
345265236Sken} mpr_reg_access_t;
346265236Sken
347265236Skentypedef struct mpr_btdh_mapping
348265236Sken{
349265236Sken	uint16_t	TargetID;
350265236Sken	uint16_t	Bus;
351265236Sken	uint16_t	DevHandle;
352265236Sken	uint16_t	Reserved;
353265236Sken} mpr_btdh_mapping_t;
354265236Sken
355265236Sken#define MPRIO_MPR_COMMAND_FLAG_VERBOSE	0x01
356265236Sken#define MPRIO_MPR_COMMAND_FLAG_DEBUG	0x02
357265236Sken#define	MPRIO_READ_CFG_HEADER	_IOWR('M', 200, struct mpr_cfg_page_req)
358265236Sken#define	MPRIO_READ_CFG_PAGE	_IOWR('M', 201, struct mpr_cfg_page_req)
359265236Sken#define	MPRIO_READ_EXT_CFG_HEADER _IOWR('M', 202, struct mpr_ext_cfg_page_req)
360265236Sken#define	MPRIO_READ_EXT_CFG_PAGE	_IOWR('M', 203, struct mpr_ext_cfg_page_req)
361265236Sken#define	MPRIO_WRITE_CFG_PAGE	_IOWR('M', 204, struct mpr_cfg_page_req)
362265236Sken#define	MPRIO_RAID_ACTION	_IOWR('M', 205, struct mpr_raid_action)
363265236Sken#define	MPRIO_MPR_COMMAND	_IOWR('M', 210, struct mpr_usr_command)
364265236Sken
365265236Sken#define	MPTIOCTL			('I')
366265236Sken#define	MPTIOCTL_GET_ADAPTER_DATA	_IOWR(MPTIOCTL, 1,\
367265236Sken    struct mpr_adapter_data)
368265236Sken#define	MPTIOCTL_UPDATE_FLASH		_IOWR(MPTIOCTL, 2,\
369265236Sken    struct mpr_update_flash)
370265236Sken#define	MPTIOCTL_RESET_ADAPTER		_IO(MPTIOCTL, 3)
371265236Sken#define	MPTIOCTL_PASS_THRU		_IOWR(MPTIOCTL, 4,\
372265236Sken    struct mpr_pass_thru)
373265236Sken#define	MPTIOCTL_EVENT_QUERY		_IOWR(MPTIOCTL, 5,\
374265236Sken    struct mpr_event_query)
375265236Sken#define	MPTIOCTL_EVENT_ENABLE		_IOWR(MPTIOCTL, 6,\
376265236Sken    struct mpr_event_enable)
377265236Sken#define	MPTIOCTL_EVENT_REPORT		_IOWR(MPTIOCTL, 7,\
378265236Sken    struct mpr_event_report)
379265236Sken#define	MPTIOCTL_GET_PCI_INFO		_IOWR(MPTIOCTL, 8,\
380265236Sken    struct mpr_pci_info)
381265236Sken#define	MPTIOCTL_DIAG_ACTION		_IOWR(MPTIOCTL, 9,\
382265236Sken    struct mpr_diag_action)
383265236Sken#define	MPTIOCTL_REG_ACCESS		_IOWR(MPTIOCTL, 10,\
384265236Sken    struct mpr_reg_access)
385265236Sken#define	MPTIOCTL_BTDH_MAPPING		_IOWR(MPTIOCTL, 11,\
386265236Sken    struct mpr_btdh_mapping)
387265236Sken
388265236Sken#endif /* !_MPR_IOCTL_H_ */
389