1212420Sken/*- 2212420Sken * Copyright (c) 2008 Yahoo!, Inc. 3212420Sken * All rights reserved. 4212420Sken * Written by: John Baldwin <jhb@FreeBSD.org> 5212420Sken * 6212420Sken * Redistribution and use in source and binary forms, with or without 7212420Sken * modification, are permitted provided that the following conditions 8212420Sken * are met: 9212420Sken * 1. Redistributions of source code must retain the above copyright 10212420Sken * notice, this list of conditions and the following disclaimer. 11212420Sken * 2. Redistributions in binary form must reproduce the above copyright 12212420Sken * notice, this list of conditions and the following disclaimer in the 13212420Sken * documentation and/or other materials provided with the distribution. 14212420Sken * 3. Neither the name of the author nor the names of any co-contributors 15212420Sken * may be used to endorse or promote products derived from this software 16212420Sken * without specific prior written permission. 17212420Sken * 18212420Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19212420Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20212420Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21212420Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22212420Sken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23212420Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24212420Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25212420Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26212420Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27212420Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28212420Sken * SUCH DAMAGE. 29212420Sken * 30212420Sken * LSI MPT-Fusion Host Adapter FreeBSD userland interface 31212420Sken * 32212420Sken * $FreeBSD$ 33212420Sken */ 34230920Sken/*- 35237876Sken * Copyright (c) 2011, 2012 LSI Corp. 36230920Sken * All rights reserved. 37230920Sken * 38230920Sken * Redistribution and use in source and binary forms, with or without 39230920Sken * modification, are permitted provided that the following conditions 40230920Sken * are met: 41230920Sken * 1. Redistributions of source code must retain the above copyright 42230920Sken * notice, this list of conditions and the following disclaimer. 43230920Sken * 2. Redistributions in binary form must reproduce the above copyright 44230920Sken * notice, this list of conditions and the following disclaimer in the 45230920Sken * documentation and/or other materials provided with the distribution. 46230920Sken * 47230920Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 48230920Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49230920Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50230920Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 51230920Sken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 52230920Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 53230920Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54230920Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 55230920Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 56230920Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 57230920Sken * SUCH DAMAGE. 58230920Sken * 59230920Sken * LSI MPT-Fusion Host Adapter FreeBSD 60230920Sken * 61230920Sken * $FreeBSD$ 62230920Sken */ 63212420Sken 64212420Sken#ifndef _MPS_IOCTL_H_ 65212420Sken#define _MPS_IOCTL_H_ 66212420Sken 67212420Sken#include <dev/mps/mpi/mpi2_type.h> 68212420Sken#include <dev/mps/mpi/mpi2.h> 69212420Sken#include <dev/mps/mpi/mpi2_cnfg.h> 70212420Sken#include <dev/mps/mpi/mpi2_sas.h> 71212420Sken 72212420Sken/* 73212420Sken * For the read header requests, the header should include the page 74212420Sken * type or extended page type, page number, and page version. The 75212420Sken * buffer and length are unused. The completed header is returned in 76212420Sken * the 'header' member. 77212420Sken * 78212420Sken * For the read page and write page requests, 'buf' should point to a 79212420Sken * buffer of 'len' bytes which holds the entire page (including the 80212420Sken * header). 81212420Sken * 82212420Sken * All requests specify the page address in 'page_address'. 83212420Sken */ 84212420Skenstruct mps_cfg_page_req { 85212420Sken MPI2_CONFIG_PAGE_HEADER header; 86212420Sken uint32_t page_address; 87212420Sken void *buf; 88212420Sken int len; 89212420Sken uint16_t ioc_status; 90212420Sken}; 91212420Sken 92212420Skenstruct mps_ext_cfg_page_req { 93212420Sken MPI2_CONFIG_EXTENDED_PAGE_HEADER header; 94212420Sken uint32_t page_address; 95212420Sken void *buf; 96212420Sken int len; 97212420Sken uint16_t ioc_status; 98212420Sken}; 99212420Sken 100212420Skenstruct mps_raid_action { 101212420Sken uint8_t action; 102212420Sken uint8_t volume_bus; 103212420Sken uint8_t volume_id; 104212420Sken uint8_t phys_disk_num; 105212420Sken uint32_t action_data_word; 106212420Sken void *buf; 107212420Sken int len; 108212420Sken uint32_t volume_status; 109212420Sken uint32_t action_data[4]; 110212420Sken uint16_t action_status; 111212420Sken uint16_t ioc_status; 112212420Sken uint8_t write; 113212420Sken}; 114212420Sken 115212420Skenstruct mps_usr_command { 116212420Sken void *req; 117212420Sken uint32_t req_len; 118212420Sken void *rpl; 119212420Sken uint32_t rpl_len; 120212420Sken void *buf; 121212420Sken int len; 122212420Sken uint32_t flags; 123212420Sken}; 124212420Sken 125230920Skentypedef struct mps_pci_bits 126230920Sken{ 127230920Sken union { 128230920Sken struct { 129230920Sken uint32_t DeviceNumber :5; 130230920Sken uint32_t FunctionNumber :3; 131230920Sken uint32_t BusNumber :24; 132230920Sken } bits; 133230920Sken uint32_t AsDWORD; 134230920Sken } u; 135230920Sken uint32_t PciSegmentId; 136230920Sken} mps_pci_bits_t; 137230920Sken 138230920Sken/* 139230920Sken * The following is the MPSIOCTL_GET_ADAPTER_DATA data structure. This data 140230920Sken * structure is setup so that we hopefully are properly aligned for both 141230920Sken * 32-bit and 64-bit mode applications. 142230920Sken * 143230920Sken * Adapter Type - Value = 4 = SCSI Protocol through SAS-2 adapter 144230920Sken * 145230920Sken * MPI Port Number - The PCI Function number for this device 146230920Sken * 147230920Sken * PCI Device HW Id - The PCI device number for this device 148230920Sken * 149230920Sken */ 150230920Sken#define MPSIOCTL_ADAPTER_TYPE_SAS2 4 151230920Sken#define MPSIOCTL_ADAPTER_TYPE_SAS2_SSS6200 5 152230920Skentypedef struct mps_adapter_data 153230920Sken{ 154230920Sken uint32_t StructureLength; 155230920Sken uint32_t AdapterType; 156230920Sken uint32_t MpiPortNumber; 157230920Sken uint32_t PCIDeviceHwId; 158230920Sken uint32_t PCIDeviceHwRev; 159230920Sken uint32_t SubSystemId; 160230920Sken uint32_t SubsystemVendorId; 161230920Sken uint32_t Reserved1; 162230920Sken uint32_t MpiFirmwareVersion; 163230920Sken uint32_t BiosVersion; 164230920Sken uint8_t DriverVersion[32]; 165230920Sken uint8_t Reserved2; 166230920Sken uint8_t ScsiId; 167230920Sken uint16_t Reserved3; 168230920Sken mps_pci_bits_t PciInformation; 169230920Sken} mps_adapter_data_t; 170230920Sken 171230920Sken 172230920Skentypedef struct mps_update_flash 173230920Sken{ 174230920Sken uint64_t PtrBuffer; 175230920Sken uint32_t ImageChecksum; 176230920Sken uint32_t ImageOffset; 177230920Sken uint32_t ImageSize; 178230920Sken uint32_t ImageType; 179230920Sken} mps_update_flash_t; 180230920Sken 181230920Sken 182230920Sken#define MPS_PASS_THRU_DIRECTION_NONE 0 183230920Sken#define MPS_PASS_THRU_DIRECTION_READ 1 184230920Sken#define MPS_PASS_THRU_DIRECTION_WRITE 2 185230920Sken#define MPS_PASS_THRU_DIRECTION_BOTH 3 186230920Sken 187230920Skentypedef struct mps_pass_thru 188230920Sken{ 189230920Sken uint64_t PtrRequest; 190230920Sken uint64_t PtrReply; 191230920Sken uint64_t PtrData; 192230920Sken uint32_t RequestSize; 193230920Sken uint32_t ReplySize; 194230920Sken uint32_t DataSize; 195230920Sken uint32_t DataDirection; 196230920Sken uint64_t PtrDataOut; 197230920Sken uint32_t DataOutSize; 198230920Sken uint32_t Timeout; 199230920Sken} mps_pass_thru_t; 200230920Sken 201230920Sken 202230920Sken/* 203230920Sken * Event queue defines 204230920Sken */ 205230920Sken#define MPS_EVENT_QUEUE_SIZE (50) /* Max Events stored in driver */ 206230920Sken#define MPS_MAX_EVENT_DATA_LENGTH (48) /* Size of each event in Dwords */ 207230920Sken 208230920Skentypedef struct mps_event_query 209230920Sken{ 210230920Sken uint16_t Entries; 211230920Sken uint16_t Reserved; 212230920Sken uint32_t Types[4]; 213230920Sken} mps_event_query_t; 214230920Sken 215230920Skentypedef struct mps_event_enable 216230920Sken{ 217230920Sken uint32_t Types[4]; 218230920Sken} mps_event_enable_t; 219230920Sken 220230920Sken/* 221230920Sken * Event record entry for ioctl. 222230920Sken */ 223230920Skentypedef struct mps_event_entry 224230920Sken{ 225230920Sken uint32_t Type; 226230920Sken uint32_t Number; 227230920Sken uint32_t Data[MPS_MAX_EVENT_DATA_LENGTH]; 228230920Sken} mps_event_entry_t; 229230920Sken 230230920Skentypedef struct mps_event_report 231230920Sken{ 232230920Sken uint32_t Size; 233230920Sken uint64_t PtrEvents; 234230920Sken} mps_event_report_t; 235230920Sken 236230920Sken 237230920Skentypedef struct mps_pci_info 238230920Sken{ 239230920Sken uint32_t BusNumber; 240230920Sken uint8_t DeviceNumber; 241230920Sken uint8_t FunctionNumber; 242230920Sken uint16_t InterruptVector; 243230920Sken uint8_t PciHeader[256]; 244230920Sken} mps_pci_info_t; 245230920Sken 246230920Sken 247230920Skentypedef struct mps_diag_action 248230920Sken{ 249230920Sken uint32_t Action; 250230920Sken uint32_t Length; 251230920Sken uint64_t PtrDiagAction; 252230920Sken uint32_t ReturnCode; 253230920Sken} mps_diag_action_t; 254230920Sken 255230920Sken#define MPS_FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) 256230920Sken 257230920Sken#define MPS_FW_DIAG_NEW (0x806E6577) 258230920Sken 259230920Sken#define MPS_FW_DIAG_TYPE_REGISTER (0x00000001) 260230920Sken#define MPS_FW_DIAG_TYPE_UNREGISTER (0x00000002) 261230920Sken#define MPS_FW_DIAG_TYPE_QUERY (0x00000003) 262230920Sken#define MPS_FW_DIAG_TYPE_READ_BUFFER (0x00000004) 263230920Sken#define MPS_FW_DIAG_TYPE_RELEASE (0x00000005) 264230920Sken 265230920Sken#define MPS_FW_DIAG_INVALID_UID (0x00000000) 266230920Sken 267230920Sken#define MPS_DIAG_SUCCESS 0 268230920Sken#define MPS_DIAG_FAILURE 1 269230920Sken 270230920Sken#define MPS_FW_DIAG_ERROR_SUCCESS (0x00000000) 271230920Sken#define MPS_FW_DIAG_ERROR_FAILURE (0x00000001) 272230920Sken#define MPS_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002) 273230920Sken#define MPS_FW_DIAG_ERROR_POST_FAILED (0x00000010) 274230920Sken#define MPS_FW_DIAG_ERROR_INVALID_UID (0x00000011) 275230920Sken#define MPS_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) 276230920Sken#define MPS_FW_DIAG_ERROR_NO_BUFFER (0x00000013) 277230920Sken#define MPS_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) 278230920Sken 279230920Sken 280230920Skentypedef struct mps_fw_diag_register 281230920Sken{ 282230920Sken uint8_t ExtendedType; 283230920Sken uint8_t BufferType; 284230920Sken uint16_t ApplicationFlags; 285230920Sken uint32_t DiagnosticFlags; 286230920Sken uint32_t ProductSpecific[23]; 287230920Sken uint32_t RequestedBufferSize; 288230920Sken uint32_t UniqueId; 289230920Sken} mps_fw_diag_register_t; 290230920Sken 291230920Skentypedef struct mps_fw_diag_unregister 292230920Sken{ 293230920Sken uint32_t UniqueId; 294230920Sken} mps_fw_diag_unregister_t; 295230920Sken 296230920Sken#define MPS_FW_DIAG_FLAG_APP_OWNED (0x0001) 297230920Sken#define MPS_FW_DIAG_FLAG_BUFFER_VALID (0x0002) 298230920Sken#define MPS_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) 299230920Sken 300230920Skentypedef struct mps_fw_diag_query 301230920Sken{ 302230920Sken uint8_t ExtendedType; 303230920Sken uint8_t BufferType; 304230920Sken uint16_t ApplicationFlags; 305230920Sken uint32_t DiagnosticFlags; 306230920Sken uint32_t ProductSpecific[23]; 307230920Sken uint32_t TotalBufferSize; 308230920Sken uint32_t DriverAddedBufferSize; 309230920Sken uint32_t UniqueId; 310230920Sken} mps_fw_diag_query_t; 311230920Sken 312230920Skentypedef struct mps_fw_diag_release 313230920Sken{ 314230920Sken uint32_t UniqueId; 315230920Sken} mps_fw_diag_release_t; 316230920Sken 317230920Sken#define MPS_FW_DIAG_FLAG_REREGISTER (0x0001) 318230920Sken#define MPS_FW_DIAG_FLAG_FORCE_RELEASE (0x0002) 319230920Sken 320230920Skentypedef struct mps_diag_read_buffer 321230920Sken{ 322230920Sken uint8_t Status; 323230920Sken uint8_t Reserved; 324230920Sken uint16_t Flags; 325230920Sken uint32_t StartingOffset; 326230920Sken uint32_t BytesToRead; 327230920Sken uint32_t UniqueId; 328230920Sken uint64_t PtrDataBuffer; 329230920Sken} mps_diag_read_buffer_t; 330230920Sken 331230920Sken/* 332230920Sken * Register Access 333230920Sken */ 334230920Sken#define REG_IO_READ 1 335230920Sken#define REG_IO_WRITE 2 336230920Sken#define REG_MEM_READ 3 337230920Sken#define REG_MEM_WRITE 4 338230920Sken 339230920Skentypedef struct mps_reg_access 340230920Sken{ 341230920Sken uint32_t Command; 342230920Sken uint32_t RegOffset; 343230920Sken uint32_t RegData; 344230920Sken} mps_reg_access_t; 345230920Sken 346230920Skentypedef struct mps_btdh_mapping 347230920Sken{ 348230920Sken uint16_t TargetID; 349230920Sken uint16_t Bus; 350230920Sken uint16_t DevHandle; 351230920Sken uint16_t Reserved; 352230920Sken} mps_btdh_mapping_t; 353230920Sken 354230920Sken#define MPSIO_MPS_COMMAND_FLAG_VERBOSE 0x01 355230920Sken#define MPSIO_MPS_COMMAND_FLAG_DEBUG 0x02 356212420Sken#define MPSIO_READ_CFG_HEADER _IOWR('M', 200, struct mps_cfg_page_req) 357212420Sken#define MPSIO_READ_CFG_PAGE _IOWR('M', 201, struct mps_cfg_page_req) 358212420Sken#define MPSIO_READ_EXT_CFG_HEADER _IOWR('M', 202, struct mps_ext_cfg_page_req) 359212420Sken#define MPSIO_READ_EXT_CFG_PAGE _IOWR('M', 203, struct mps_ext_cfg_page_req) 360212420Sken#define MPSIO_WRITE_CFG_PAGE _IOWR('M', 204, struct mps_cfg_page_req) 361212420Sken#define MPSIO_RAID_ACTION _IOWR('M', 205, struct mps_raid_action) 362212420Sken#define MPSIO_MPS_COMMAND _IOWR('M', 210, struct mps_usr_command) 363212420Sken 364230920Sken#define MPTIOCTL ('I') 365230920Sken#define MPTIOCTL_GET_ADAPTER_DATA _IOWR(MPTIOCTL, 1,\ 366230920Sken struct mps_adapter_data) 367230920Sken#define MPTIOCTL_UPDATE_FLASH _IOWR(MPTIOCTL, 2,\ 368230920Sken struct mps_update_flash) 369230920Sken#define MPTIOCTL_RESET_ADAPTER _IO(MPTIOCTL, 3) 370230920Sken#define MPTIOCTL_PASS_THRU _IOWR(MPTIOCTL, 4,\ 371230920Sken struct mps_pass_thru) 372230920Sken#define MPTIOCTL_EVENT_QUERY _IOWR(MPTIOCTL, 5,\ 373230920Sken struct mps_event_query) 374230920Sken#define MPTIOCTL_EVENT_ENABLE _IOWR(MPTIOCTL, 6,\ 375230920Sken struct mps_event_enable) 376230920Sken#define MPTIOCTL_EVENT_REPORT _IOWR(MPTIOCTL, 7,\ 377230920Sken struct mps_event_report) 378230920Sken#define MPTIOCTL_GET_PCI_INFO _IOWR(MPTIOCTL, 8,\ 379230920Sken struct mps_pci_info) 380230920Sken#define MPTIOCTL_DIAG_ACTION _IOWR(MPTIOCTL, 9,\ 381230920Sken struct mps_diag_action) 382230920Sken#define MPTIOCTL_REG_ACCESS _IOWR(MPTIOCTL, 10,\ 383230920Sken struct mps_reg_access) 384230920Sken#define MPTIOCTL_BTDH_MAPPING _IOWR(MPTIOCTL, 11,\ 385230920Sken struct mps_btdh_mapping) 386230920Sken 387212420Sken#endif /* !_MPS_IOCTL_H_ */ 388