mpr_ioctl.h revision 297590
1114879Sjulian/*- 2114879Sjulian * Copyright (c) 2008 Yahoo!, Inc. 3114879Sjulian * All rights reserved. 4114879Sjulian * Written by: John Baldwin <jhb@FreeBSD.org> 5114879Sjulian * 6114879Sjulian * Redistribution and use in source and binary forms, with or without 7114879Sjulian * modification, are permitted provided that the following conditions 8114879Sjulian * are met: 9114879Sjulian * 1. Redistributions of source code must retain the above copyright 10114879Sjulian * notice, this list of conditions and the following disclaimer. 11114879Sjulian * 2. Redistributions in binary form must reproduce the above copyright 12114879Sjulian * notice, this list of conditions and the following disclaimer in the 13114879Sjulian * documentation and/or other materials provided with the distribution. 14114879Sjulian * 3. Neither the name of the author nor the names of any co-contributors 15114879Sjulian * may be used to endorse or promote products derived from this software 16114879Sjulian * without specific prior written permission. 17114879Sjulian * 18114879Sjulian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19114879Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20114879Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21114879Sjulian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22114879Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23114879Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24114879Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25114879Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26114879Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27114879Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28121054Semax * SUCH DAMAGE. 29114879Sjulian * 30114879Sjulian * LSI MPT-Fusion Host Adapter FreeBSD userland interface 31114879Sjulian * 32114879Sjulian * $FreeBSD: stable/10/usr.sbin/mpsutil/mpr_ioctl.h 297590 2016-04-05 20:34:20Z sbruno $ 33121054Semax */ 34114879Sjulian/*- 35114879Sjulian * Copyright (c) 2011-2014 LSI Corp. 36114879Sjulian * All rights reserved. 37114879Sjulian * 38114879Sjulian * Redistribution and use in source and binary forms, with or without 39114879Sjulian * modification, are permitted provided that the following conditions 40114879Sjulian * are met: 41114879Sjulian * 1. Redistributions of source code must retain the above copyright 42114879Sjulian * notice, this list of conditions and the following disclaimer. 43114879Sjulian * 2. Redistributions in binary form must reproduce the above copyright 44114879Sjulian * notice, this list of conditions and the following disclaimer in the 45114879Sjulian * documentation and/or other materials provided with the distribution. 46114879Sjulian * 47114879Sjulian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 48114879Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49114879Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50114879Sjulian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 51114879Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 52114879Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 53114879Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54128079Semax * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 55121054Semax * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 56121054Semax * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 57121054Semax * SUCH DAMAGE. 58121054Semax * 59114879Sjulian * LSI MPT-Fusion Host Adapter FreeBSD 60114879Sjulian * 61114879Sjulian * $FreeBSD: stable/10/usr.sbin/mpsutil/mpr_ioctl.h 297590 2016-04-05 20:34:20Z sbruno $ 62114879Sjulian */ 63114879Sjulian 64114879Sjulian#ifndef _MPR_IOCTL_H_ 65114879Sjulian#define _MPR_IOCTL_H_ 66114879Sjulian 67114879Sjulian#include <dev/mpr/mpi/mpi2_type.h> 68162494Semax#include <dev/mpr/mpi/mpi2.h> 69162494Semax#include <dev/mpr/mpi/mpi2_cnfg.h> 70114879Sjulian#include <dev/mpr/mpi/mpi2_sas.h> 71114879Sjulian 72114879Sjulian/* 73114879Sjulian * For the read header requests, the header should include the page 74114879Sjulian * type or extended page type, page number, and page version. The 75114879Sjulian * buffer and length are unused. The completed header is returned in 76114879Sjulian * the 'header' member. 77114879Sjulian * 78114879Sjulian * For the read page and write page requests, 'buf' should point to a 79114879Sjulian * buffer of 'len' bytes which holds the entire page (including the 80114879Sjulian * header). 81114879Sjulian * 82114879Sjulian * All requests specify the page address in 'page_address'. 83114879Sjulian */ 84114879Sjulianstruct mpr_cfg_page_req { 85114879Sjulian MPI2_CONFIG_PAGE_HEADER header; 86114879Sjulian uint32_t page_address; 87114879Sjulian void *buf; 88114879Sjulian int len; 89114879Sjulian uint16_t ioc_status; 90114879Sjulian}; 91114879Sjulian 92114879Sjulianstruct mpr_ext_cfg_page_req { 93114879Sjulian MPI2_CONFIG_EXTENDED_PAGE_HEADER header; 94114879Sjulian uint32_t page_address; 95114879Sjulian void *buf; 96114879Sjulian int len; 97114879Sjulian uint16_t ioc_status; 98114879Sjulian}; 99114879Sjulian 100114879Sjulianstruct mpr_raid_action { 101114879Sjulian uint8_t action; 102114879Sjulian uint8_t volume_bus; 103114879Sjulian uint8_t volume_id; 104114879Sjulian uint8_t phys_disk_num; 105114879Sjulian uint32_t action_data_word; 106114879Sjulian void *buf; 107114879Sjulian int len; 108114879Sjulian uint32_t volume_status; 109114879Sjulian uint32_t action_data[4]; 110114879Sjulian uint16_t action_status; 111114879Sjulian uint16_t ioc_status; 112114879Sjulian uint8_t write; 113121054Semax}; 114114879Sjulian 115114879Sjulianstruct mpr_usr_command { 116114879Sjulian void *req; 117114879Sjulian uint32_t req_len; 118114879Sjulian void *rpl; 119114879Sjulian uint32_t rpl_len; 120114879Sjulian void *buf; 121114879Sjulian int len; 122114879Sjulian uint32_t flags; 123114879Sjulian}; 124114879Sjulian 125121054Semaxtypedef struct mpr_pci_bits 126114879Sjulian{ 127114879Sjulian union { 128114879Sjulian struct { 129114879Sjulian uint32_t DeviceNumber :5; 130114879Sjulian uint32_t FunctionNumber :3; 131188130Semax uint32_t BusNumber :24; 132188130Semax } bits; 133114879Sjulian uint32_t AsDWORD; 134114879Sjulian } u; 135114879Sjulian uint32_t PciSegmentId; 136121054Semax} mpr_pci_bits_t; 137121054Semax 138114879Sjulian/* 139114879Sjulian * The following is the MPRIOCTL_GET_ADAPTER_DATA data structure. This data 140114879Sjulian * structure is setup so that we hopefully are properly aligned for both 141114879Sjulian * 32-bit and 64-bit mode applications. 142114879Sjulian * 143114879Sjulian * Adapter Type - Value = 6 = SCSI Protocol through SAS-3 adapter 144114879Sjulian * 145114879Sjulian * MPI Port Number - The PCI Function number for this device 146114879Sjulian * 147114879Sjulian * PCI Device HW Id - The PCI device number for this device 148114879Sjulian * 149114879Sjulian */ 150114879Sjulian#define MPRIOCTL_ADAPTER_TYPE_SAS3 6 151114879Sjuliantypedef struct mpr_adapter_data 152114879Sjulian{ 153114879Sjulian uint32_t StructureLength; 154114879Sjulian uint32_t AdapterType; 155114879Sjulian uint32_t MpiPortNumber; 156114879Sjulian uint32_t PCIDeviceHwId; 157114879Sjulian uint32_t PCIDeviceHwRev; 158114879Sjulian uint32_t SubSystemId; 159114879Sjulian uint32_t SubsystemVendorId; 160114879Sjulian uint32_t Reserved1; 161114879Sjulian uint32_t MpiFirmwareVersion; 162114879Sjulian uint32_t BiosVersion; 163114879Sjulian uint8_t DriverVersion[32]; 164114879Sjulian uint8_t Reserved2; 165114879Sjulian uint8_t ScsiId; 166114879Sjulian uint16_t Reserved3; 167114879Sjulian mpr_pci_bits_t PciInformation; 168114879Sjulian} mpr_adapter_data_t; 169114879Sjulian 170114879Sjulian 171114879Sjuliantypedef struct mpr_update_flash 172114879Sjulian{ 173114879Sjulian uint64_t PtrBuffer; 174114879Sjulian uint32_t ImageChecksum; 175114879Sjulian uint32_t ImageOffset; 176114879Sjulian uint32_t ImageSize; 177114879Sjulian uint32_t ImageType; 178114879Sjulian} mpr_update_flash_t; 179114879Sjulian 180114879Sjulian 181114879Sjulian#define MPR_PASS_THRU_DIRECTION_NONE 0 182114879Sjulian#define MPR_PASS_THRU_DIRECTION_READ 1 183121054Semax#define MPR_PASS_THRU_DIRECTION_WRITE 2 184121054Semax#define MPR_PASS_THRU_DIRECTION_BOTH 3 185121054Semax 186121054Semaxtypedef struct mpr_pass_thru 187121054Semax{ 188114879Sjulian uint64_t PtrRequest; 189114879Sjulian uint64_t PtrReply; 190114879Sjulian uint64_t PtrData; 191114879Sjulian uint32_t RequestSize; 192114879Sjulian uint32_t ReplySize; 193114879Sjulian uint32_t DataSize; 194114879Sjulian uint32_t DataDirection; 195114879Sjulian uint64_t PtrDataOut; 196114879Sjulian uint32_t DataOutSize; 197114879Sjulian uint32_t Timeout; 198114879Sjulian} mpr_pass_thru_t; 199114879Sjulian 200121054Semax 201114879Sjulian/* 202114879Sjulian * Event queue defines 203114879Sjulian */ 204114879Sjulian#define MPR_EVENT_QUEUE_SIZE (50) /* Max Events stored in driver */ 205114879Sjulian#define MPR_MAX_EVENT_DATA_LENGTH (48) /* Size of each event in Dwords */ 206114879Sjulian 207114879Sjuliantypedef struct mpr_event_query 208114879Sjulian{ 209114879Sjulian uint16_t Entries; 210114879Sjulian uint16_t Reserved; 211114879Sjulian uint32_t Types[4]; 212114879Sjulian} mpr_event_query_t; 213114879Sjulian 214114879Sjuliantypedef struct mpr_event_enable 215114879Sjulian{ 216121054Semax uint32_t Types[4]; 217121054Semax} mpr_event_enable_t; 218114879Sjulian 219114879Sjulian/* 220114879Sjulian * Event record entry for ioctl. 221121054Semax */ 222121054Semaxtypedef struct mpr_event_entry 223114879Sjulian{ 224114879Sjulian uint32_t Type; 225114879Sjulian uint32_t Number; 226114879Sjulian uint32_t Data[MPR_MAX_EVENT_DATA_LENGTH]; 227114879Sjulian} mpr_event_entry_t; 228114879Sjulian 229121054Semaxtypedef struct mpr_event_report 230121054Semax{ 231114879Sjulian uint32_t Size; 232114879Sjulian uint64_t PtrEvents; 233114879Sjulian} mpr_event_report_t; 234114879Sjulian 235114879Sjulian 236114879Sjuliantypedef struct mpr_pci_info 237114879Sjulian{ 238114879Sjulian uint32_t BusNumber; 239114879Sjulian uint8_t DeviceNumber; 240114879Sjulian uint8_t FunctionNumber; 241114879Sjulian uint16_t InterruptVector; 242114879Sjulian uint8_t PciHeader[256]; 243121054Semax} mpr_pci_info_t; 244121054Semax 245114879Sjulian 246114879Sjuliantypedef struct mpr_diag_action 247114879Sjulian{ 248121054Semax uint32_t Action; 249121054Semax uint32_t Length; 250114879Sjulian uint64_t PtrDiagAction; 251114879Sjulian uint32_t ReturnCode; 252114879Sjulian} mpr_diag_action_t; 253114879Sjulian 254114879Sjulian#define MPR_FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) 255114879Sjulian 256121054Semax#define MPR_FW_DIAG_NEW (0x806E6577) 257121054Semax 258114879Sjulian#define MPR_FW_DIAG_TYPE_REGISTER (0x00000001) 259114879Sjulian#define MPR_FW_DIAG_TYPE_UNREGISTER (0x00000002) 260114879Sjulian#define MPR_FW_DIAG_TYPE_QUERY (0x00000003) 261114879Sjulian#define MPR_FW_DIAG_TYPE_READ_BUFFER (0x00000004) 262114879Sjulian#define MPR_FW_DIAG_TYPE_RELEASE (0x00000005) 263114879Sjulian 264114879Sjulian#define MPR_FW_DIAG_INVALID_UID (0x00000000) 265114879Sjulian 266114879Sjulian#define MPR_DIAG_SUCCESS 0 267128079Semax#define MPR_DIAG_FAILURE 1 268114879Sjulian 269114879Sjulian#define MPR_FW_DIAG_ERROR_SUCCESS (0x00000000) 270114879Sjulian#define MPR_FW_DIAG_ERROR_FAILURE (0x00000001) 271114879Sjulian#define MPR_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002) 272114879Sjulian#define MPR_FW_DIAG_ERROR_POST_FAILED (0x00000010) 273114879Sjulian#define MPR_FW_DIAG_ERROR_INVALID_UID (0x00000011) 274114879Sjulian#define MPR_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) 275114879Sjulian#define MPR_FW_DIAG_ERROR_NO_BUFFER (0x00000013) 276114879Sjulian#define MPR_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) 277114879Sjulian 278114879Sjulian 279114879Sjuliantypedef struct mpr_fw_diag_register 280114879Sjulian{ 281114879Sjulian uint8_t ExtendedType; 282114879Sjulian uint8_t BufferType; 283114879Sjulian uint16_t ApplicationFlags; 284162529Semax uint32_t DiagnosticFlags; 285162529Semax uint32_t ProductSpecific[23]; 286114879Sjulian uint32_t RequestedBufferSize; 287114879Sjulian uint32_t UniqueId; 288121054Semax} mpr_fw_diag_register_t; 289121054Semax 290114879Sjuliantypedef struct mpr_fw_diag_unregister 291114879Sjulian{ 292114879Sjulian uint32_t UniqueId; 293114879Sjulian} mpr_fw_diag_unregister_t; 294114879Sjulian 295114879Sjulian#define MPR_FW_DIAG_FLAG_APP_OWNED (0x0001) 296114879Sjulian#define MPR_FW_DIAG_FLAG_BUFFER_VALID (0x0002) 297114879Sjulian#define MPR_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) 298114879Sjulian 299114879Sjuliantypedef struct mpr_fw_diag_query 300114879Sjulian{ 301121054Semax uint8_t ExtendedType; 302121054Semax uint8_t BufferType; 303114879Sjulian uint16_t ApplicationFlags; 304114879Sjulian uint32_t DiagnosticFlags; 305114879Sjulian uint32_t ProductSpecific[23]; 306114879Sjulian uint32_t TotalBufferSize; 307114879Sjulian uint32_t DriverAddedBufferSize; 308114879Sjulian uint32_t UniqueId; 309114879Sjulian} mpr_fw_diag_query_t; 310114879Sjulian 311114879Sjuliantypedef struct mpr_fw_diag_release 312121054Semax{ 313121054Semax uint32_t UniqueId; 314114879Sjulian} mpr_fw_diag_release_t; 315114879Sjulian 316114879Sjulian#define MPR_FW_DIAG_FLAG_REREGISTER (0x0001) 317114879Sjulian#define MPR_FW_DIAG_FLAG_FORCE_RELEASE (0x0002) 318114879Sjulian 319114879Sjuliantypedef struct mpr_diag_read_buffer 320114879Sjulian{ 321114879Sjulian uint8_t Status; 322114879Sjulian uint8_t Reserved; 323114879Sjulian uint16_t Flags; 324128079Semax uint32_t StartingOffset; 325114879Sjulian uint32_t BytesToRead; 326128079Semax uint32_t UniqueId; 327114879Sjulian uint64_t PtrDataBuffer; 328114879Sjulian} mpr_diag_read_buffer_t; 329114879Sjulian 330114879Sjulian/* 331114879Sjulian * Register Access 332114879Sjulian */ 333114879Sjulian#define REG_IO_READ 1 334114879Sjulian#define REG_IO_WRITE 2 335114879Sjulian#define REG_MEM_READ 3 336114879Sjulian#define REG_MEM_WRITE 4 337114879Sjulian 338114879Sjuliantypedef struct mpr_reg_access 339114879Sjulian{ 340114879Sjulian uint32_t Command; 341114879Sjulian uint32_t RegOffset; 342114879Sjulian uint32_t RegData; 343114879Sjulian} mpr_reg_access_t; 344114879Sjulian 345114879Sjuliantypedef struct mpr_btdh_mapping 346121054Semax{ 347121054Semax uint16_t TargetID; 348114879Sjulian uint16_t Bus; 349114879Sjulian uint16_t DevHandle; 350114879Sjulian uint16_t Reserved; 351114879Sjulian} mpr_btdh_mapping_t; 352114879Sjulian 353114879Sjulian#define MPRIO_MPR_COMMAND_FLAG_VERBOSE 0x01 354114879Sjulian#define MPRIO_MPR_COMMAND_FLAG_DEBUG 0x02 355114879Sjulian#define MPRIO_READ_CFG_HEADER _IOWR('M', 200, struct mpr_cfg_page_req) 356114879Sjulian#define MPRIO_READ_CFG_PAGE _IOWR('M', 201, struct mpr_cfg_page_req) 357114879Sjulian#define MPRIO_READ_EXT_CFG_HEADER _IOWR('M', 202, struct mpr_ext_cfg_page_req) 358114879Sjulian#define MPRIO_READ_EXT_CFG_PAGE _IOWR('M', 203, struct mpr_ext_cfg_page_req) 359121054Semax#define MPRIO_WRITE_CFG_PAGE _IOWR('M', 204, struct mpr_cfg_page_req) 360121054Semax#define MPRIO_RAID_ACTION _IOWR('M', 205, struct mpr_raid_action) 361114879Sjulian#define MPRIO_MPR_COMMAND _IOWR('M', 210, struct mpr_usr_command) 362114879Sjulian 363114879Sjulian#ifndef MPTIOCTL 364114879Sjulian#define MPTIOCTL ('I') 365114879Sjulian#define MPTIOCTL_GET_ADAPTER_DATA _IOWR(MPTIOCTL, 1,\ 366114879Sjulian struct mpr_adapter_data) 367114879Sjulian#define MPTIOCTL_UPDATE_FLASH _IOWR(MPTIOCTL, 2,\ 368114879Sjulian struct mpr_update_flash) 369114879Sjulian#define MPTIOCTL_RESET_ADAPTER _IO(MPTIOCTL, 3) 370121054Semax#define MPTIOCTL_PASS_THRU _IOWR(MPTIOCTL, 4,\ 371121054Semax struct mpr_pass_thru) 372114879Sjulian#define MPTIOCTL_EVENT_QUERY _IOWR(MPTIOCTL, 5,\ 373114879Sjulian struct mpr_event_query) 374114879Sjulian#define MPTIOCTL_EVENT_ENABLE _IOWR(MPTIOCTL, 6,\ 375114879Sjulian struct mpr_event_enable) 376114879Sjulian#define MPTIOCTL_EVENT_REPORT _IOWR(MPTIOCTL, 7,\ 377114879Sjulian struct mpr_event_report) 378114879Sjulian#define MPTIOCTL_GET_PCI_INFO _IOWR(MPTIOCTL, 8,\ 379121054Semax struct mpr_pci_info) 380121054Semax#define MPTIOCTL_DIAG_ACTION _IOWR(MPTIOCTL, 9,\ 381121054Semax struct mpr_diag_action) 382121054Semax#define MPTIOCTL_REG_ACCESS _IOWR(MPTIOCTL, 10,\ 383121054Semax struct mpr_reg_access) 384121054Semax#define MPTIOCTL_BTDH_MAPPING _IOWR(MPTIOCTL, 11,\ 385121054Semax struct mpr_btdh_mapping) 386121054Semax#endif 387121054Semax 388121054Semax#endif /* !_MPR_IOCTL_H_ */ 389121054Semax