1/* $OpenBSD: mpivar.h,v 1.41 2020/07/22 13:16:04 krw Exp $ */ 2 3/* 4 * Copyright (c) 2005 David Gwynne <dlg@openbsd.org> 5 * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20#include <sys/task.h> 21 22/* #define MPI_DEBUG */ 23#ifdef MPI_DEBUG 24extern uint32_t mpi_debug; 25#define DPRINTF(x...) do { if (mpi_debug) printf(x); } while(0) 26#define DNPRINTF(n,x...) do { if (mpi_debug & (n)) printf(x); } while(0) 27#define MPI_D_CMD 0x0001 28#define MPI_D_INTR 0x0002 29#define MPI_D_MISC 0x0004 30#define MPI_D_DMA 0x0008 31#define MPI_D_IOCTL 0x0010 32#define MPI_D_RW 0x0020 33#define MPI_D_MEM 0x0040 34#define MPI_D_CCB 0x0080 35#define MPI_D_PPR 0x0100 36#define MPI_D_RAID 0x0200 37#define MPI_D_EVT 0x0400 38#else 39#define DPRINTF(x...) 40#define DNPRINTF(n,x...) 41#endif 42 43#define MPI_REQUEST_SIZE 512 44#define MPI_REPLY_SIZE 80 45#define MPI_REPLYQ_DEPTH 128 46#define MPI_REPLY_COUNT (PAGE_SIZE / MPI_REPLY_SIZE) 47 48/* 49 * this is the max number of sge's we can stuff in a request frame: 50 * sizeof(scsi_io) + sizeof(sense) + sizeof(sge) * 32 = MPI_REQUEST_SIZE 51 */ 52#define MPI_MAX_SGL 36 53 54struct mpi_dmamem { 55 bus_dmamap_t mdm_map; 56 bus_dma_segment_t mdm_seg; 57 size_t mdm_size; 58 caddr_t mdm_kva; 59}; 60#define MPI_DMA_MAP(_mdm) ((_mdm)->mdm_map) 61#define MPI_DMA_DVA(_mdm) ((u_int64_t)(_mdm)->mdm_map->dm_segs[0].ds_addr) 62#define MPI_DMA_KVA(_mdm) ((void *)(_mdm)->mdm_kva) 63 64struct mpi_ccb_bundle { 65 struct mpi_msg_scsi_io mcb_io; /* sgl must follow */ 66 struct mpi_sge mcb_sgl[MPI_MAX_SGL]; 67 struct scsi_sense_data mcb_sense; 68} __packed; 69 70struct mpi_softc; 71 72struct mpi_rcb { 73 SIMPLEQ_ENTRY(mpi_rcb) rcb_link; 74 void *rcb_reply; 75 bus_addr_t rcb_offset; 76 u_int32_t rcb_reply_dva; 77}; 78SIMPLEQ_HEAD(mpi_rcb_list, mpi_rcb); 79 80struct mpi_ccb { 81 struct mpi_softc *ccb_sc; 82 int ccb_id; 83 84 void *ccb_cookie; 85 bus_dmamap_t ccb_dmamap; 86 87 bus_addr_t ccb_offset; 88 void *ccb_cmd; 89 u_int64_t ccb_cmd_dva; 90 91 volatile enum { 92 MPI_CCB_FREE, 93 MPI_CCB_READY, 94 MPI_CCB_QUEUED 95 } ccb_state; 96 void (*ccb_done)(struct mpi_ccb *); 97 struct mpi_rcb *ccb_rcb; 98 99 SLIST_ENTRY(mpi_ccb) ccb_link; 100}; 101 102SLIST_HEAD(mpi_ccb_list, mpi_ccb); 103 104struct mpi_softc { 105 struct device sc_dev; 106 107 u_int64_t sc_port_wwn; 108 u_int64_t sc_node_wwn; 109 110 int sc_flags; 111#define MPI_F_SPI (1<<0) 112#define MPI_F_RAID (1<<1) 113 114 struct scsibus_softc *sc_scsibus; 115 116 bus_space_tag_t sc_iot; 117 bus_space_handle_t sc_ioh; 118 bus_size_t sc_ios; 119 bus_dma_tag_t sc_dmat; 120 121 u_int8_t sc_fw_maj; 122 u_int8_t sc_fw_min; 123 u_int8_t sc_fw_unit; 124 u_int8_t sc_fw_dev; 125 126 u_int8_t sc_porttype; 127 int sc_maxcmds; 128 int sc_maxchdepth; 129 int sc_first_sgl_len; 130 int sc_chain_len; 131 int sc_max_sgl_len; 132 133 int sc_buswidth; 134 int sc_target; 135 int sc_ioc_number; 136 137 struct mpi_dmamem *sc_requests; 138 struct mpi_ccb *sc_ccbs; 139 struct mpi_ccb_list sc_ccb_free; 140 struct mutex sc_ccb_mtx; 141 struct scsi_iopool sc_iopool; 142 143 struct mpi_dmamem *sc_replies; 144 struct mpi_rcb *sc_rcbs; 145 int sc_repq; 146 147 struct mpi_ccb *sc_evt_ccb; 148 struct mpi_rcb_list sc_evt_ack_queue; 149 struct mutex sc_evt_ack_mtx; 150 struct scsi_iohandler sc_evt_ack_handler; 151 152 struct mpi_rcb_list sc_evt_scan_queue; 153 struct mutex sc_evt_scan_mtx; 154 struct scsi_iohandler sc_evt_scan_handler; 155 156 struct task sc_evt_rescan; 157 158 size_t sc_fw_len; 159 struct mpi_dmamem *sc_fw; 160 161 /* scsi ioctl from sd device */ 162 int (*sc_ioctl)(struct device *, u_long, caddr_t); 163 164 struct rwlock sc_lock; 165 struct mpi_cfg_hdr sc_cfg_hdr; 166 struct mpi_cfg_ioc_pg2 *sc_vol_page; 167 struct mpi_cfg_raid_vol *sc_vol_list; 168 struct mpi_cfg_raid_vol_pg0 *sc_rpg0; 169 170 struct ksensor *sc_sensors; 171 struct ksensordev sc_sensordev; 172}; 173 174int mpi_attach(struct mpi_softc *); 175void mpi_detach(struct mpi_softc *); 176 177int mpi_intr(void *); 178