xref: /freebsd-src/sys/dev/mpi3mr/mpi3mr_app.h (revision 945c3ce49ed127de6ccd6d55a944d8a58291c315)
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