1 /* $NetBSD: mfivar.h,v 1.14 2010/02/09 00:05:18 msaitoh Exp $ */ 2 /* $OpenBSD: mfivar.h,v 1.28 2006/08/31 18:18:46 marco Exp $ */ 3 /* 4 * Copyright (c) 2006 Marco Peereboom <marco@peereboom.us> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <dev/sysmon/sysmonvar.h> 20 #include <sys/envsys.h> 21 22 #define DEVNAME(_s) (device_xname((_s)->sc_dev)) 23 24 /* #define MFI_DEBUG */ 25 #ifdef MFI_DEBUG 26 extern uint32_t mfi_debug; 27 #define DPRINTF(x...) do { if (mfi_debug) printf(x); } while(0) 28 #define DNPRINTF(n,x...) do { if (mfi_debug & n) printf(x); } while(0) 29 #define MFI_D_CMD 0x0001 30 #define MFI_D_INTR 0x0002 31 #define MFI_D_MISC 0x0004 32 #define MFI_D_DMA 0x0008 33 #define MFI_D_IOCTL 0x0010 34 #define MFI_D_RW 0x0020 35 #define MFI_D_MEM 0x0040 36 #define MFI_D_CCB 0x0080 37 #else 38 #define DPRINTF(x, ...) 39 #define DNPRINTF(n, x, ...) 40 #endif 41 42 struct mfi_mem { 43 bus_dmamap_t am_map; 44 bus_dma_segment_t am_seg; 45 size_t am_size; 46 void * am_kva; 47 }; 48 49 #define MFIMEM_MAP(_am) ((_am)->am_map) 50 #define MFIMEM_DVA(_am) ((_am)->am_map->dm_segs[0].ds_addr) 51 #define MFIMEM_KVA(_am) ((void *)(_am)->am_kva) 52 53 struct mfi_prod_cons { 54 uint32_t mpc_producer; 55 uint32_t mpc_consumer; 56 uint32_t mpc_reply_q[1]; /* compensate for 1 extra reply per spec */ 57 }; 58 59 struct mfi_ccb { 60 struct mfi_softc *ccb_sc; 61 62 union mfi_frame *ccb_frame; 63 paddr_t ccb_pframe; 64 uint32_t ccb_frame_size; 65 uint32_t ccb_extra_frames; 66 67 struct mfi_sense *ccb_sense; 68 paddr_t ccb_psense; 69 70 bus_dmamap_t ccb_dmamap; 71 72 union mfi_sgl *ccb_sgl; 73 74 /* data for sgl */ 75 void *ccb_data; 76 uint32_t ccb_len; 77 78 uint32_t ccb_direction; 79 #define MFI_DATA_NONE 0 80 #define MFI_DATA_IN 1 81 #define MFI_DATA_OUT 2 82 83 struct scsipi_xfer *ccb_xs; 84 85 void (*ccb_done)(struct mfi_ccb *); 86 87 volatile enum { 88 MFI_CCB_FREE, 89 MFI_CCB_READY, 90 MFI_CCB_DONE 91 } ccb_state; 92 uint32_t ccb_flags; 93 #define MFI_CCB_F_ERR (1<<0) 94 TAILQ_ENTRY(mfi_ccb) ccb_link; 95 }; 96 97 TAILQ_HEAD(mfi_ccb_list, mfi_ccb); 98 99 enum mfi_iop { 100 MFI_IOP_XSCALE, 101 MFI_IOP_PPC, 102 MFI_IOP_GEN2 103 }; 104 105 struct mfi_iop_ops { 106 uint32_t (*mio_fw_state)(struct mfi_softc *); 107 void (*mio_intr_dis)(struct mfi_softc *); 108 void (*mio_intr_ena)(struct mfi_softc *); 109 int (*mio_intr)(struct mfi_softc *); 110 void (*mio_post)(struct mfi_softc *, struct mfi_ccb *); 111 }; 112 113 struct mfi_softc { 114 device_t sc_dev; 115 struct scsipi_channel sc_chan; 116 struct scsipi_adapter sc_adapt; 117 118 const struct mfi_iop_ops *sc_iop; 119 120 void *sc_ih; 121 122 uint32_t sc_flags; 123 124 bus_space_tag_t sc_iot; 125 bus_space_handle_t sc_ioh; 126 bus_dma_tag_t sc_dmat; 127 bus_size_t sc_size; 128 129 /* save some useful information for logical drives that is missing 130 * in sc_ld_list 131 */ 132 struct { 133 uint32_t ld_present; 134 char ld_dev[16]; /* device name sd? */ 135 } sc_ld[MFI_MAX_LD]; 136 137 /* firmware determined max, totals and other information*/ 138 uint32_t sc_max_cmds; 139 uint32_t sc_max_sgl; 140 uint32_t sc_max_ld; 141 uint32_t sc_ld_cnt; 142 /* XXX these struct should be local to mgmt function */ 143 struct mfi_ctrl_info sc_info; 144 struct mfi_ld_list sc_ld_list; 145 struct mfi_ld_details sc_ld_details; 146 147 /* all commands */ 148 struct mfi_ccb *sc_ccb; 149 150 /* producer/consumer pointers and reply queue */ 151 struct mfi_mem *sc_pcq; 152 153 /* frame memory */ 154 struct mfi_mem *sc_frames; 155 uint32_t sc_frames_size; 156 157 /* sense memory */ 158 struct mfi_mem *sc_sense; 159 160 struct mfi_ccb_list sc_ccb_freeq; 161 162 struct sysmon_envsys *sc_sme; 163 envsys_data_t *sc_sensor; 164 165 device_t sc_child; 166 }; 167 168 int mfi_rescan(device_t, const char *, const int *); 169 void mfi_childdetached(device_t, device_t); 170 int mfi_attach(struct mfi_softc *, enum mfi_iop); 171 int mfi_detach(struct mfi_softc *, int); 172 int mfi_intr(void *); 173