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 * 30281564Sslm * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD userland interface 31212420Sken * 32212420Sken * $FreeBSD: releng/10.2/sys/dev/mps/mps_ioctl.h 281564 2015-04-15 21:47:15Z slm $ 33212420Sken */ 34230592Sken/*- 35281564Sslm * Copyright (c) 2011-2015 LSI Corp. 36281564Sslm * Copyright (c) 2013-2015 Avago Technologies 37230592Sken * All rights reserved. 38230592Sken * 39230592Sken * Redistribution and use in source and binary forms, with or without 40230592Sken * modification, are permitted provided that the following conditions 41230592Sken * are met: 42230592Sken * 1. Redistributions of source code must retain the above copyright 43230592Sken * notice, this list of conditions and the following disclaimer. 44230592Sken * 2. Redistributions in binary form must reproduce the above copyright 45230592Sken * notice, this list of conditions and the following disclaimer in the 46230592Sken * documentation and/or other materials provided with the distribution. 47230592Sken * 48230592Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 49230592Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50230592Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51230592Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 52230592Sken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53230592Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54230592Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55230592Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56230592Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57230592Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58230592Sken * SUCH DAMAGE. 59230592Sken * 60281564Sslm * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD 61230592Sken * 62230592Sken * $FreeBSD: releng/10.2/sys/dev/mps/mps_ioctl.h 281564 2015-04-15 21:47:15Z slm $ 63230592Sken */ 64212420Sken 65212420Sken#ifndef _MPS_IOCTL_H_ 66212420Sken#define _MPS_IOCTL_H_ 67212420Sken 68212420Sken#include <dev/mps/mpi/mpi2_type.h> 69212420Sken#include <dev/mps/mpi/mpi2.h> 70212420Sken#include <dev/mps/mpi/mpi2_cnfg.h> 71212420Sken#include <dev/mps/mpi/mpi2_sas.h> 72212420Sken 73212420Sken/* 74212420Sken * For the read header requests, the header should include the page 75212420Sken * type or extended page type, page number, and page version. The 76212420Sken * buffer and length are unused. The completed header is returned in 77212420Sken * the 'header' member. 78212420Sken * 79212420Sken * For the read page and write page requests, 'buf' should point to a 80212420Sken * buffer of 'len' bytes which holds the entire page (including the 81212420Sken * header). 82212420Sken * 83212420Sken * All requests specify the page address in 'page_address'. 84212420Sken */ 85212420Skenstruct mps_cfg_page_req { 86212420Sken MPI2_CONFIG_PAGE_HEADER header; 87212420Sken uint32_t page_address; 88212420Sken void *buf; 89212420Sken int len; 90212420Sken uint16_t ioc_status; 91212420Sken}; 92212420Sken 93212420Skenstruct mps_ext_cfg_page_req { 94212420Sken MPI2_CONFIG_EXTENDED_PAGE_HEADER header; 95212420Sken uint32_t page_address; 96212420Sken void *buf; 97212420Sken int len; 98212420Sken uint16_t ioc_status; 99212420Sken}; 100212420Sken 101212420Skenstruct mps_raid_action { 102212420Sken uint8_t action; 103212420Sken uint8_t volume_bus; 104212420Sken uint8_t volume_id; 105212420Sken uint8_t phys_disk_num; 106212420Sken uint32_t action_data_word; 107212420Sken void *buf; 108212420Sken int len; 109212420Sken uint32_t volume_status; 110212420Sken uint32_t action_data[4]; 111212420Sken uint16_t action_status; 112212420Sken uint16_t ioc_status; 113212420Sken uint8_t write; 114212420Sken}; 115212420Sken 116212420Skenstruct mps_usr_command { 117212420Sken void *req; 118212420Sken uint32_t req_len; 119212420Sken void *rpl; 120212420Sken uint32_t rpl_len; 121212420Sken void *buf; 122212420Sken int len; 123212420Sken uint32_t flags; 124212420Sken}; 125212420Sken 126230592Skentypedef struct mps_pci_bits 127230592Sken{ 128230592Sken union { 129230592Sken struct { 130230592Sken uint32_t DeviceNumber :5; 131230592Sken uint32_t FunctionNumber :3; 132230592Sken uint32_t BusNumber :24; 133230592Sken } bits; 134230592Sken uint32_t AsDWORD; 135230592Sken } u; 136230592Sken uint32_t PciSegmentId; 137230592Sken} mps_pci_bits_t; 138230592Sken 139230592Sken/* 140230592Sken * The following is the MPSIOCTL_GET_ADAPTER_DATA data structure. This data 141230592Sken * structure is setup so that we hopefully are properly aligned for both 142230592Sken * 32-bit and 64-bit mode applications. 143230592Sken * 144230592Sken * Adapter Type - Value = 4 = SCSI Protocol through SAS-2 adapter 145230592Sken * 146230592Sken * MPI Port Number - The PCI Function number for this device 147230592Sken * 148230592Sken * PCI Device HW Id - The PCI device number for this device 149230592Sken * 150230592Sken */ 151230592Sken#define MPSIOCTL_ADAPTER_TYPE_SAS2 4 152230592Sken#define MPSIOCTL_ADAPTER_TYPE_SAS2_SSS6200 5 153230592Skentypedef struct mps_adapter_data 154230592Sken{ 155230592Sken uint32_t StructureLength; 156230592Sken uint32_t AdapterType; 157230592Sken uint32_t MpiPortNumber; 158230592Sken uint32_t PCIDeviceHwId; 159230592Sken uint32_t PCIDeviceHwRev; 160230592Sken uint32_t SubSystemId; 161230592Sken uint32_t SubsystemVendorId; 162230592Sken uint32_t Reserved1; 163230592Sken uint32_t MpiFirmwareVersion; 164230592Sken uint32_t BiosVersion; 165230592Sken uint8_t DriverVersion[32]; 166230592Sken uint8_t Reserved2; 167230592Sken uint8_t ScsiId; 168230592Sken uint16_t Reserved3; 169230592Sken mps_pci_bits_t PciInformation; 170230592Sken} mps_adapter_data_t; 171230592Sken 172230592Sken 173230592Skentypedef struct mps_update_flash 174230592Sken{ 175230592Sken uint64_t PtrBuffer; 176230592Sken uint32_t ImageChecksum; 177230592Sken uint32_t ImageOffset; 178230592Sken uint32_t ImageSize; 179230592Sken uint32_t ImageType; 180230592Sken} mps_update_flash_t; 181230592Sken 182230592Sken 183230592Sken#define MPS_PASS_THRU_DIRECTION_NONE 0 184230592Sken#define MPS_PASS_THRU_DIRECTION_READ 1 185230592Sken#define MPS_PASS_THRU_DIRECTION_WRITE 2 186230592Sken#define MPS_PASS_THRU_DIRECTION_BOTH 3 187230592Sken 188230592Skentypedef struct mps_pass_thru 189230592Sken{ 190230592Sken uint64_t PtrRequest; 191230592Sken uint64_t PtrReply; 192230592Sken uint64_t PtrData; 193230592Sken uint32_t RequestSize; 194230592Sken uint32_t ReplySize; 195230592Sken uint32_t DataSize; 196230592Sken uint32_t DataDirection; 197230592Sken uint64_t PtrDataOut; 198230592Sken uint32_t DataOutSize; 199230592Sken uint32_t Timeout; 200230592Sken} mps_pass_thru_t; 201230592Sken 202230592Sken 203230592Sken/* 204230592Sken * Event queue defines 205230592Sken */ 206230592Sken#define MPS_EVENT_QUEUE_SIZE (50) /* Max Events stored in driver */ 207230592Sken#define MPS_MAX_EVENT_DATA_LENGTH (48) /* Size of each event in Dwords */ 208230592Sken 209230592Skentypedef struct mps_event_query 210230592Sken{ 211230592Sken uint16_t Entries; 212230592Sken uint16_t Reserved; 213230592Sken uint32_t Types[4]; 214230592Sken} mps_event_query_t; 215230592Sken 216230592Skentypedef struct mps_event_enable 217230592Sken{ 218230592Sken uint32_t Types[4]; 219230592Sken} mps_event_enable_t; 220230592Sken 221230592Sken/* 222230592Sken * Event record entry for ioctl. 223230592Sken */ 224230592Skentypedef struct mps_event_entry 225230592Sken{ 226230592Sken uint32_t Type; 227230592Sken uint32_t Number; 228230592Sken uint32_t Data[MPS_MAX_EVENT_DATA_LENGTH]; 229230592Sken} mps_event_entry_t; 230230592Sken 231230592Skentypedef struct mps_event_report 232230592Sken{ 233230592Sken uint32_t Size; 234230592Sken uint64_t PtrEvents; 235230592Sken} mps_event_report_t; 236230592Sken 237230592Sken 238230592Skentypedef struct mps_pci_info 239230592Sken{ 240230592Sken uint32_t BusNumber; 241230592Sken uint8_t DeviceNumber; 242230592Sken uint8_t FunctionNumber; 243230592Sken uint16_t InterruptVector; 244230592Sken uint8_t PciHeader[256]; 245230592Sken} mps_pci_info_t; 246230592Sken 247230592Sken 248230592Skentypedef struct mps_diag_action 249230592Sken{ 250230592Sken uint32_t Action; 251230592Sken uint32_t Length; 252230592Sken uint64_t PtrDiagAction; 253230592Sken uint32_t ReturnCode; 254230592Sken} mps_diag_action_t; 255230592Sken 256230592Sken#define MPS_FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) 257230592Sken 258230592Sken#define MPS_FW_DIAG_NEW (0x806E6577) 259230592Sken 260230592Sken#define MPS_FW_DIAG_TYPE_REGISTER (0x00000001) 261230592Sken#define MPS_FW_DIAG_TYPE_UNREGISTER (0x00000002) 262230592Sken#define MPS_FW_DIAG_TYPE_QUERY (0x00000003) 263230592Sken#define MPS_FW_DIAG_TYPE_READ_BUFFER (0x00000004) 264230592Sken#define MPS_FW_DIAG_TYPE_RELEASE (0x00000005) 265230592Sken 266230592Sken#define MPS_FW_DIAG_INVALID_UID (0x00000000) 267230592Sken 268230592Sken#define MPS_DIAG_SUCCESS 0 269230592Sken#define MPS_DIAG_FAILURE 1 270230592Sken 271230592Sken#define MPS_FW_DIAG_ERROR_SUCCESS (0x00000000) 272230592Sken#define MPS_FW_DIAG_ERROR_FAILURE (0x00000001) 273230592Sken#define MPS_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002) 274230592Sken#define MPS_FW_DIAG_ERROR_POST_FAILED (0x00000010) 275230592Sken#define MPS_FW_DIAG_ERROR_INVALID_UID (0x00000011) 276230592Sken#define MPS_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) 277230592Sken#define MPS_FW_DIAG_ERROR_NO_BUFFER (0x00000013) 278230592Sken#define MPS_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) 279230592Sken 280230592Sken 281230592Skentypedef struct mps_fw_diag_register 282230592Sken{ 283230592Sken uint8_t ExtendedType; 284230592Sken uint8_t BufferType; 285230592Sken uint16_t ApplicationFlags; 286230592Sken uint32_t DiagnosticFlags; 287230592Sken uint32_t ProductSpecific[23]; 288230592Sken uint32_t RequestedBufferSize; 289230592Sken uint32_t UniqueId; 290230592Sken} mps_fw_diag_register_t; 291230592Sken 292230592Skentypedef struct mps_fw_diag_unregister 293230592Sken{ 294230592Sken uint32_t UniqueId; 295230592Sken} mps_fw_diag_unregister_t; 296230592Sken 297230592Sken#define MPS_FW_DIAG_FLAG_APP_OWNED (0x0001) 298230592Sken#define MPS_FW_DIAG_FLAG_BUFFER_VALID (0x0002) 299230592Sken#define MPS_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) 300230592Sken 301230592Skentypedef struct mps_fw_diag_query 302230592Sken{ 303230592Sken uint8_t ExtendedType; 304230592Sken uint8_t BufferType; 305230592Sken uint16_t ApplicationFlags; 306230592Sken uint32_t DiagnosticFlags; 307230592Sken uint32_t ProductSpecific[23]; 308230592Sken uint32_t TotalBufferSize; 309230592Sken uint32_t DriverAddedBufferSize; 310230592Sken uint32_t UniqueId; 311230592Sken} mps_fw_diag_query_t; 312230592Sken 313230592Skentypedef struct mps_fw_diag_release 314230592Sken{ 315230592Sken uint32_t UniqueId; 316230592Sken} mps_fw_diag_release_t; 317230592Sken 318230592Sken#define MPS_FW_DIAG_FLAG_REREGISTER (0x0001) 319230592Sken#define MPS_FW_DIAG_FLAG_FORCE_RELEASE (0x0002) 320230592Sken 321230592Skentypedef struct mps_diag_read_buffer 322230592Sken{ 323230592Sken uint8_t Status; 324230592Sken uint8_t Reserved; 325230592Sken uint16_t Flags; 326230592Sken uint32_t StartingOffset; 327230592Sken uint32_t BytesToRead; 328230592Sken uint32_t UniqueId; 329230592Sken uint64_t PtrDataBuffer; 330230592Sken} mps_diag_read_buffer_t; 331230592Sken 332230592Sken/* 333230592Sken * Register Access 334230592Sken */ 335230592Sken#define REG_IO_READ 1 336230592Sken#define REG_IO_WRITE 2 337230592Sken#define REG_MEM_READ 3 338230592Sken#define REG_MEM_WRITE 4 339230592Sken 340230592Skentypedef struct mps_reg_access 341230592Sken{ 342230592Sken uint32_t Command; 343230592Sken uint32_t RegOffset; 344230592Sken uint32_t RegData; 345230592Sken} mps_reg_access_t; 346230592Sken 347230592Skentypedef struct mps_btdh_mapping 348230592Sken{ 349230592Sken uint16_t TargetID; 350230592Sken uint16_t Bus; 351230592Sken uint16_t DevHandle; 352230592Sken uint16_t Reserved; 353230592Sken} mps_btdh_mapping_t; 354230592Sken 355230592Sken#define MPSIO_MPS_COMMAND_FLAG_VERBOSE 0x01 356230592Sken#define MPSIO_MPS_COMMAND_FLAG_DEBUG 0x02 357212420Sken#define MPSIO_READ_CFG_HEADER _IOWR('M', 200, struct mps_cfg_page_req) 358212420Sken#define MPSIO_READ_CFG_PAGE _IOWR('M', 201, struct mps_cfg_page_req) 359212420Sken#define MPSIO_READ_EXT_CFG_HEADER _IOWR('M', 202, struct mps_ext_cfg_page_req) 360212420Sken#define MPSIO_READ_EXT_CFG_PAGE _IOWR('M', 203, struct mps_ext_cfg_page_req) 361212420Sken#define MPSIO_WRITE_CFG_PAGE _IOWR('M', 204, struct mps_cfg_page_req) 362212420Sken#define MPSIO_RAID_ACTION _IOWR('M', 205, struct mps_raid_action) 363212420Sken#define MPSIO_MPS_COMMAND _IOWR('M', 210, struct mps_usr_command) 364212420Sken 365230592Sken#define MPTIOCTL ('I') 366230592Sken#define MPTIOCTL_GET_ADAPTER_DATA _IOWR(MPTIOCTL, 1,\ 367230592Sken struct mps_adapter_data) 368230592Sken#define MPTIOCTL_UPDATE_FLASH _IOWR(MPTIOCTL, 2,\ 369230592Sken struct mps_update_flash) 370230592Sken#define MPTIOCTL_RESET_ADAPTER _IO(MPTIOCTL, 3) 371230592Sken#define MPTIOCTL_PASS_THRU _IOWR(MPTIOCTL, 4,\ 372230592Sken struct mps_pass_thru) 373230592Sken#define MPTIOCTL_EVENT_QUERY _IOWR(MPTIOCTL, 5,\ 374230592Sken struct mps_event_query) 375230592Sken#define MPTIOCTL_EVENT_ENABLE _IOWR(MPTIOCTL, 6,\ 376230592Sken struct mps_event_enable) 377230592Sken#define MPTIOCTL_EVENT_REPORT _IOWR(MPTIOCTL, 7,\ 378230592Sken struct mps_event_report) 379230592Sken#define MPTIOCTL_GET_PCI_INFO _IOWR(MPTIOCTL, 8,\ 380230592Sken struct mps_pci_info) 381230592Sken#define MPTIOCTL_DIAG_ACTION _IOWR(MPTIOCTL, 9,\ 382230592Sken struct mps_diag_action) 383230592Sken#define MPTIOCTL_REG_ACCESS _IOWR(MPTIOCTL, 10,\ 384230592Sken struct mps_reg_access) 385230592Sken#define MPTIOCTL_BTDH_MAPPING _IOWR(MPTIOCTL, 11,\ 386230592Sken struct mps_btdh_mapping) 387230592Sken 388212420Sken#endif /* !_MPS_IOCTL_H_ */ 389