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