12d1d418eSSumit Saxena /* 22d1d418eSSumit Saxena * SPDX-License-Identifier: BSD-2-Clause 32d1d418eSSumit Saxena * 4*945c3ce4SChandrakanth patil * Copyright (c) 2020-2024, Broadcom Inc. All rights reserved. 52d1d418eSSumit Saxena * Support: <fbsd-storage-driver.pdl@broadcom.com> 62d1d418eSSumit Saxena * 72d1d418eSSumit Saxena * Authors: Sumit Saxena <sumit.saxena@broadcom.com> 82d1d418eSSumit Saxena * Chandrakanth Patil <chandrakanth.patil@broadcom.com> 92d1d418eSSumit Saxena * 102d1d418eSSumit Saxena * Redistribution and use in source and binary forms, with or without 112d1d418eSSumit Saxena * modification, are permitted provided that the following conditions are 122d1d418eSSumit Saxena * met: 132d1d418eSSumit Saxena * 142d1d418eSSumit Saxena * 1. Redistributions of source code must retain the above copyright notice, 152d1d418eSSumit Saxena * this list of conditions and the following disclaimer. 162d1d418eSSumit Saxena * 2. Redistributions in binary form must reproduce the above copyright notice, 172d1d418eSSumit Saxena * this list of conditions and the following disclaimer in the documentation and/or other 182d1d418eSSumit Saxena * materials provided with the distribution. 192d1d418eSSumit Saxena * 3. Neither the name of the Broadcom Inc. nor the names of its contributors 202d1d418eSSumit Saxena * may be used to endorse or promote products derived from this software without 212d1d418eSSumit Saxena * specific prior written permission. 222d1d418eSSumit Saxena * 232d1d418eSSumit Saxena * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 242d1d418eSSumit Saxena * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 252d1d418eSSumit Saxena * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 262d1d418eSSumit Saxena * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 272d1d418eSSumit Saxena * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 282d1d418eSSumit Saxena * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 292d1d418eSSumit Saxena * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 302d1d418eSSumit Saxena * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 312d1d418eSSumit Saxena * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 322d1d418eSSumit Saxena * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 332d1d418eSSumit Saxena * POSSIBILITY OF SUCH DAMAGE. 342d1d418eSSumit Saxena * 352d1d418eSSumit Saxena * The views and conclusions contained in the software and documentation are 362d1d418eSSumit Saxena * those of the authors and should not be interpreted as representing 372d1d418eSSumit Saxena * official policies,either expressed or implied, of the FreeBSD Project. 382d1d418eSSumit Saxena * 392d1d418eSSumit Saxena * Mail to: Broadcom Inc 1320 Ridder Park Dr, San Jose, CA 95131 402d1d418eSSumit Saxena * 412d1d418eSSumit Saxena * Broadcom Inc. (Broadcom) MPI3MR Adapter FreeBSD 422d1d418eSSumit Saxena */ 432d1d418eSSumit Saxena 442d1d418eSSumit Saxena #include "mpi3mr.h" 452d1d418eSSumit Saxena 462d1d418eSSumit Saxena #ifndef _MPI3MR_APP_H_ 472d1d418eSSumit Saxena #define _MPI3MR_APP_H_ 482d1d418eSSumit Saxena 492d1d418eSSumit Saxena #define MPI3MR_IOCTL_ADPTYPE_AVGFAMILY 1 502d1d418eSSumit Saxena #define MPI3MR_IOCTL_VERSION 0x06 512d1d418eSSumit Saxena 522d1d418eSSumit Saxena #define MPI3MRDRVCMD _IOWR('B', 1, struct mpi3mr_ioctl_drvcmd) 532d1d418eSSumit Saxena #define MPI3MRMPTCMD _IOWR('B', 2, struct mpi3mr_ioctl_mptcmd) 542d1d418eSSumit Saxena 552d1d418eSSumit Saxena #define MPI3MR_IOCTL_DEFAULT_TIMEOUT (10) 562d1d418eSSumit Saxena #define PEND_IOCTLS_COMP_WAIT_TIME (10) 572d1d418eSSumit Saxena 582d1d418eSSumit Saxena #define MPI3MR_IOCTL_LOGDATA_MAX_ENTRIES 400 592d1d418eSSumit Saxena #define MPI3MR_IOCTL_LOGDATA_ENTRY_HEADER_SZ 0x5 602d1d418eSSumit Saxena 612d1d418eSSumit Saxena #define GET_IOC_STATUS(ioc_status) \ 622d1d418eSSumit Saxena ioc_status & MPI3_IOCSTATUS_STATUS_MASK 632d1d418eSSumit Saxena 642d1d418eSSumit Saxena /* Encapsulated NVMe command definitions */ 652d1d418eSSumit Saxena #define MPI3MR_NVME_PRP_SIZE 8 662d1d418eSSumit Saxena #define MPI3MR_NVME_CMD_PRP1_OFFSET 24 672d1d418eSSumit Saxena #define MPI3MR_NVME_CMD_PRP2_OFFSET 32 682d1d418eSSumit Saxena #define MPI3MR_NVME_CMD_SGL_OFFSET 24 692d1d418eSSumit Saxena #define MPI3MR_NVME_DATA_FORMAT_PRP 0 702d1d418eSSumit Saxena #define MPI3MR_NVME_DATA_FORMAT_SGL1 1 712d1d418eSSumit Saxena #define MPI3MR_NVME_DATA_FORMAT_SGL2 2 722d1d418eSSumit Saxena 732d1d418eSSumit Saxena #define MPI3MR_NVMESGL_DATA_SEGMENT 0x00 742d1d418eSSumit Saxena #define MPI3MR_NVMESGL_LAST_SEGMENT 0x03 752d1d418eSSumit Saxena 762d1d418eSSumit Saxena int mpi3mr_app_attach(struct mpi3mr_softc *); 772d1d418eSSumit Saxena void mpi3mr_app_detach(struct mpi3mr_softc *); 782d1d418eSSumit Saxena 792d1d418eSSumit Saxena enum mpi3mr_ioctl_adp_state { 802d1d418eSSumit Saxena MPI3MR_IOCTL_ADP_STATE_UNKNOWN = 0, 812d1d418eSSumit Saxena MPI3MR_IOCTL_ADP_STATE_OPERATIONAL = 1, 822d1d418eSSumit Saxena MPI3MR_IOCTL_ADP_STATE_FAULT = 2, 832d1d418eSSumit Saxena MPI3MR_IOCTL_ADP_STATE_IN_RESET = 3, 842d1d418eSSumit Saxena MPI3MR_IOCTL_ADP_STATE_UNRECOVERABLE = 4, 852d1d418eSSumit Saxena }; 862d1d418eSSumit Saxena 872d1d418eSSumit Saxena enum mpi3mr_ioctl_data_dir { 882d1d418eSSumit Saxena MPI3MR_APP_DDN, 892d1d418eSSumit Saxena MPI3MR_APP_DDI, 902d1d418eSSumit Saxena MPI3MR_APP_DDO, 912d1d418eSSumit Saxena }; 922d1d418eSSumit Saxena 932d1d418eSSumit Saxena enum mpi3mr_ioctl_drvcmds_opcode { 942d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_UNKNOWN = 0, 952d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_ADPINFO = 1, 962d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_ADPRESET = 2, 972d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_TGTDEVINFO = 3, 982d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_ALLTGTDEVINFO = 4, 992d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_GETCHGCNT = 5, 1002d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_LOGDATAENABLE = 6, 1012d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_PELENABLE = 7, 1022d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_GETLOGDATA = 8, 1032d1d418eSSumit Saxena MPI3MR_DRVRIOCTL_OPCODE_GETPCIINFO = 100, 1042d1d418eSSumit Saxena }; 1052d1d418eSSumit Saxena 1062d1d418eSSumit Saxena enum mpi3mr_ioctl_mpibuffer_type { 1072d1d418eSSumit Saxena MPI3MR_IOCTL_BUFTYPE_UNKNOWN, 1082d1d418eSSumit Saxena MPI3MR_IOCTL_BUFTYPE_RAIDMGMT_CMD, 1092d1d418eSSumit Saxena MPI3MR_IOCTL_BUFTYPE_RAIDMGMT_RESP, 1102d1d418eSSumit Saxena MPI3MR_IOCTL_BUFTYPE_DATA_IN, 1112d1d418eSSumit Saxena MPI3MR_IOCTL_BUFTYPE_DATA_OUT, 1122d1d418eSSumit Saxena MPI3MR_IOCTL_BUFTYPE_MPI_REPLY, 1132d1d418eSSumit Saxena MPI3MR_IOCTL_BUFTYPE_ERR_RESPONSE, 1142d1d418eSSumit Saxena }; 1152d1d418eSSumit Saxena 1162d1d418eSSumit Saxena enum mpi3mr_ioctl_mpireply_type { 1172d1d418eSSumit Saxena MPI3MR_IOCTL_MPI_REPLY_BUFTYPE_UNKNOWN, 1182d1d418eSSumit Saxena MPI3MR_IOCTL_MPI_REPLY_BUFTYPE_STATUS, 1192d1d418eSSumit Saxena MPI3MR_IOCTL_MPI_REPLY_BUFTYPE_ADDRESS, 1202d1d418eSSumit Saxena }; 1212d1d418eSSumit Saxena 1222d1d418eSSumit Saxena enum mpi3mr_ioctl_reset_type { 1232d1d418eSSumit Saxena MPI3MR_IOCTL_ADPRESET_UNKNOWN, 1242d1d418eSSumit Saxena MPI3MR_IOCTL_ADPRESET_SOFT, 1252d1d418eSSumit Saxena MPI3MR_IOCTL_ADPRESET_DIAG_FAULT, 1262d1d418eSSumit Saxena }; 1272d1d418eSSumit Saxena 1282d1d418eSSumit Saxena struct mpi3mr_ioctl_drvcmd { 1292d1d418eSSumit Saxena U8 mrioc_id; 1302d1d418eSSumit Saxena U8 opcode; 1312d1d418eSSumit Saxena U16 rsvd1; 1322d1d418eSSumit Saxena U32 rsvd2; 1332d1d418eSSumit Saxena void *data_in_buf; 1342d1d418eSSumit Saxena void *data_out_buf; 1352d1d418eSSumit Saxena U32 data_in_size; 1362d1d418eSSumit Saxena U32 data_out_size; 1372d1d418eSSumit Saxena }; 1382d1d418eSSumit Saxena 1392d1d418eSSumit Saxena struct mpi3mr_ioctl_adpinfo { 1402d1d418eSSumit Saxena U32 adp_type; 1412d1d418eSSumit Saxena U32 rsvd1; 1422d1d418eSSumit Saxena U32 pci_dev_id; 1432d1d418eSSumit Saxena U32 pci_dev_hw_rev; 1442d1d418eSSumit Saxena U32 pci_subsys_dev_id; 1452d1d418eSSumit Saxena U32 pci_subsys_ven_id; 1462d1d418eSSumit Saxena U32 pci_dev:5; 1472d1d418eSSumit Saxena U32 pci_func:3; 1482d1d418eSSumit Saxena U32 pci_bus:8; 1492d1d418eSSumit Saxena U32 rsvd2:16; 1502d1d418eSSumit Saxena U32 pci_seg_id; 1512d1d418eSSumit Saxena U32 ioctl_ver; 1522d1d418eSSumit Saxena U8 adp_state; 1532d1d418eSSumit Saxena U8 rsvd3; 1542d1d418eSSumit Saxena U16 rsvd4; 1552d1d418eSSumit Saxena U32 rsvd5[2]; 1562d1d418eSSumit Saxena Mpi3DriverInfoLayout_t driver_info; 1572d1d418eSSumit Saxena }; 1582d1d418eSSumit Saxena 1592d1d418eSSumit Saxena struct mpi3mr_ioctl_pciinfo { 1602d1d418eSSumit Saxena U32 config_space[64]; 1612d1d418eSSumit Saxena }; 1622d1d418eSSumit Saxena 1632d1d418eSSumit Saxena struct mpi3mr_ioctl_tgtinfo { 1642d1d418eSSumit Saxena U32 target_id; 1652d1d418eSSumit Saxena U8 bus_id; 1662d1d418eSSumit Saxena U8 rsvd1; 1672d1d418eSSumit Saxena U16 rsvd2; 1682d1d418eSSumit Saxena U16 dev_handle; 1692d1d418eSSumit Saxena U16 persistent_id; 1702d1d418eSSumit Saxena U32 seq_num; 1712d1d418eSSumit Saxena }; 1722d1d418eSSumit Saxena 1732d1d418eSSumit Saxena struct mpi3mr_device_map_info { 1742d1d418eSSumit Saxena U16 handle; 1752d1d418eSSumit Saxena U16 per_id; 1762d1d418eSSumit Saxena U32 target_id; 1772d1d418eSSumit Saxena U8 bus_id; 1782d1d418eSSumit Saxena U8 rsvd1; 1792d1d418eSSumit Saxena U16 rsvd2; 1802d1d418eSSumit Saxena }; 1812d1d418eSSumit Saxena 1822d1d418eSSumit Saxena struct mpi3mr_ioctl_all_tgtinfo { 1832d1d418eSSumit Saxena U16 num_devices; 1842d1d418eSSumit Saxena U16 rsvd1; 1852d1d418eSSumit Saxena U32 rsvd2; 1862d1d418eSSumit Saxena struct mpi3mr_device_map_info dmi[1]; 1872d1d418eSSumit Saxena }; 1882d1d418eSSumit Saxena 1892d1d418eSSumit Saxena struct mpi3mr_ioctl_chgcnt { 1902d1d418eSSumit Saxena U16 change_count; 1912d1d418eSSumit Saxena U16 rsvd; 1922d1d418eSSumit Saxena }; 1932d1d418eSSumit Saxena 1942d1d418eSSumit Saxena struct mpi3mr_ioctl_adpreset { 1952d1d418eSSumit Saxena U8 reset_type; 1962d1d418eSSumit Saxena U8 rsvd1; 1972d1d418eSSumit Saxena U16 rsvd2; 1982d1d418eSSumit Saxena }; 1992d1d418eSSumit Saxena 2002d1d418eSSumit Saxena struct mpi3mr_ioctl_mptcmd { 2012d1d418eSSumit Saxena U8 mrioc_id; 2022d1d418eSSumit Saxena U8 rsvd1; 2032d1d418eSSumit Saxena U16 timeout; 2042d1d418eSSumit Saxena U16 rsvd2; 2052d1d418eSSumit Saxena U16 mpi_msg_size; 2062d1d418eSSumit Saxena void *mpi_msg_buf; 2072d1d418eSSumit Saxena void *buf_entry_list; 2082d1d418eSSumit Saxena U32 buf_entry_list_size; 2092d1d418eSSumit Saxena }; 2102d1d418eSSumit Saxena 2112d1d418eSSumit Saxena struct mpi3mr_buf_entry { 2122d1d418eSSumit Saxena U8 buf_type; 2132d1d418eSSumit Saxena U8 rsvd1; 2142d1d418eSSumit Saxena U16 rsvd2; 2152d1d418eSSumit Saxena U32 buf_len; 2162d1d418eSSumit Saxena void *buffer; 2172d1d418eSSumit Saxena }; 2182d1d418eSSumit Saxena 2192d1d418eSSumit Saxena struct mpi3mr_ioctl_buf_entry_list { 2202d1d418eSSumit Saxena U8 num_of_buf_entries; 2212d1d418eSSumit Saxena U8 rsvd1; 2222d1d418eSSumit Saxena U16 rsvd2; 2232d1d418eSSumit Saxena U32 rsvd3; 2242d1d418eSSumit Saxena struct mpi3mr_buf_entry buf_entry[1]; 2252d1d418eSSumit Saxena }; 2262d1d418eSSumit Saxena 2272d1d418eSSumit Saxena struct mpi3mr_ioctl_mpt_dma_buffer { 2282d1d418eSSumit Saxena void *user_buf; 2292d1d418eSSumit Saxena void *kern_buf; 2302d1d418eSSumit Saxena U32 user_buf_len; 2312d1d418eSSumit Saxena U32 kern_buf_len; 2322d1d418eSSumit Saxena bus_addr_t kern_buf_dma; 2332d1d418eSSumit Saxena bus_dma_tag_t kern_buf_dmatag; 2342d1d418eSSumit Saxena bus_dmamap_t kern_buf_dmamap; 2352d1d418eSSumit Saxena U8 data_dir; 2362d1d418eSSumit Saxena U16 num_dma_desc; 2372d1d418eSSumit Saxena struct dma_memory_desc *dma_desc; 2382d1d418eSSumit Saxena }; 2392d1d418eSSumit Saxena 2402d1d418eSSumit Saxena struct mpi3mr_ioctl_mpirepbuf { 2412d1d418eSSumit Saxena U8 mpirep_type; 2422d1d418eSSumit Saxena U8 rsvd1; 2432d1d418eSSumit Saxena U16 rsvd2; 2442d1d418eSSumit Saxena U8 repbuf[1]; 2452d1d418eSSumit Saxena }; 2462d1d418eSSumit Saxena 2472d1d418eSSumit Saxena struct mpi3mr_nvme_pt_sge { 2482d1d418eSSumit Saxena U64 base_addr; 2492d1d418eSSumit Saxena U32 length; 2502d1d418eSSumit Saxena U16 rsvd; 2512d1d418eSSumit Saxena U8 rsvd1; 2522d1d418eSSumit Saxena U8 sub_type:4; 2532d1d418eSSumit Saxena U8 type:4; 2542d1d418eSSumit Saxena }; 2552d1d418eSSumit Saxena 2562d1d418eSSumit Saxena struct mpi3mr_log_data_entry { 2572d1d418eSSumit Saxena U8 valid_entry; 2582d1d418eSSumit Saxena U8 rsvd1; 2592d1d418eSSumit Saxena U16 rsvd2; 2602d1d418eSSumit Saxena U8 data[1]; 2612d1d418eSSumit Saxena }; 2622d1d418eSSumit Saxena 2632d1d418eSSumit Saxena struct mpi3mr_ioctl_logdata_enable { 2642d1d418eSSumit Saxena U16 max_entries; 2652d1d418eSSumit Saxena U16 rsvd; 2662d1d418eSSumit Saxena }; 2672d1d418eSSumit Saxena 2682d1d418eSSumit Saxena struct mpi3mr_ioctl_pel_enable { 2692d1d418eSSumit Saxena U16 pel_locale; 2702d1d418eSSumit Saxena U8 pel_class; 2712d1d418eSSumit Saxena U8 rsvd; 2722d1d418eSSumit Saxena }; 2732d1d418eSSumit Saxena 2742d1d418eSSumit Saxena int 2752d1d418eSSumit Saxena mpi3mr_pel_abort(struct mpi3mr_softc *sc); 2762d1d418eSSumit Saxena void 2772d1d418eSSumit Saxena mpi3mr_pel_getseq_complete(struct mpi3mr_softc *sc, 2782d1d418eSSumit Saxena struct mpi3mr_drvr_cmd *drvr_cmd); 2792d1d418eSSumit Saxena void 2802d1d418eSSumit Saxena mpi3mr_issue_pel_wait(struct mpi3mr_softc *sc, 2812d1d418eSSumit Saxena struct mpi3mr_drvr_cmd *drvr_cmd); 2822d1d418eSSumit Saxena void 2832d1d418eSSumit Saxena mpi3mr_pel_wait_complete(struct mpi3mr_softc *sc, 2842d1d418eSSumit Saxena struct mpi3mr_drvr_cmd *drvr_cmd); 2852d1d418eSSumit Saxena void 2862d1d418eSSumit Saxena mpi3mr_send_pel_getseq(struct mpi3mr_softc *sc, 2872d1d418eSSumit Saxena struct mpi3mr_drvr_cmd *drvr_cmd); 2882d1d418eSSumit Saxena void 2892d1d418eSSumit Saxena mpi3mr_app_send_aen(struct mpi3mr_softc *sc); 2902d1d418eSSumit Saxena 2912d1d418eSSumit Saxena #endif /* !_MPI3MR_API_H_ */ 292