Home | History | Annotate | Line # | Download | only in ic
aacvar.h revision 1.9
      1 /*	$NetBSD: aacvar.h,v 1.9 2007/06/05 04:04:14 briggs Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2002 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Andrew Doran.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *        This product includes software developed by the NetBSD
     21  *        Foundation, Inc. and its contributors.
     22  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  *    contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 
     39 /*-
     40  * Copyright (c) 2000 Michael Smith
     41  * Copyright (c) 2000 BSDi
     42  * Copyright (c) 2000 Niklas Hallqvist
     43  * All rights reserved.
     44  *
     45  * Redistribution and use in source and binary forms, with or without
     46  * modification, are permitted provided that the following conditions
     47  * are met:
     48  * 1. Redistributions of source code must retain the above copyright
     49  *    notice, this list of conditions and the following disclaimer.
     50  * 2. Redistributions in binary form must reproduce the above copyright
     51  *    notice, this list of conditions and the following disclaimer in the
     52  *    documentation and/or other materials provided with the distribution.
     53  *
     54  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     55  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     56  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     57  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     58  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     59  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     60  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     61  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     62  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     63  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     64  * SUCH DAMAGE.
     65  *
     66  *	from FreeBSD: aacvar.h,v 1.1 2000/09/13 03:20:34 msmith Exp
     67  *	via OpenBSD: aacvar.h,v 1.2 2002/03/14 01:26:53 millert Exp
     68  */
     69 
     70 #ifndef _PCI_AACVAR_H_
     71 #define	_PCI_AACVAR_H_
     72 
     73 /* Debugging */
     74 #ifdef AAC_DEBUG
     75 #define AAC_DPRINTF(mask, args) if ((aac_debug & (mask)) != 0) printf args
     76 #define AAC_D_INTR	0x01
     77 #define AAC_D_MISC	0x02
     78 #define AAC_D_CMD	0x04
     79 #define AAC_D_QUEUE	0x08
     80 #define AAC_D_IO	0x10
     81 extern int aac_debug;
     82 
     83 #define AAC_PRINT_FIB(sc, fib)	aac_print_fib((sc), (fib), __FUNCTION__)
     84 #else
     85 #define AAC_DPRINTF(mask, args)
     86 #define AAC_PRINT_FIB(sc, fib)
     87 #endif
     88 
     89 struct aac_code_lookup {
     90 	const char	*string;
     91 	u_int32_t code;
     92 };
     93 
     94 extern const struct	 aac_code_lookup aac_command_status_table[];
     95 extern const struct	 aac_code_lookup aac_container_types[];
     96 
     97 struct aac_softc;
     98 
     99 /*
    100  * We allocate a small set of FIBs for the adapter to use to send us messages.
    101  */
    102 #define AAC_ADAPTER_FIBS	8
    103 
    104 /*
    105  * FIBs are allocated in page-size chunks and can grow up to the 512
    106  * limit imposed by the hardware.
    107  */
    108 #define AAC_PREALLOCATE_FIBS	128
    109 
    110 /*
    111  * Firmware messages are passed in the printf buffer.
    112  */
    113 #define AAC_PRINTF_BUFSIZE	256
    114 
    115 /*
    116  * We wait this many seconds for the adapter to come ready if it is still
    117  * booting.
    118  */
    119 #define AAC_BOOT_TIMEOUT	(3 * 60)
    120 
    121 /*
    122  * Wait this long for a lost interrupt to get detected.
    123  */
    124 #define AAC_WATCH_TIMEOUT	10000		/* 10000 * 1ms = 10s */
    125 
    126 /*
    127  * Timeout for immediate commands.
    128  */
    129 #define AAC_IMMEDIATE_TIMEOUT	30
    130 
    131 /*
    132  * Delay 20ms after the qnotify in sync operations.  Experimentally deduced.
    133  */
    134 #define AAC_SYNC_DELAY		20000
    135 
    136 /*
    137  * sc->sc_max_sgs is the number of scatter-gather elements we can fit
    138  * in one block I/O request (64-bit or 32-bit, depending) FIB, or the
    139  * maximum number that the firmware will accept.  We subtract one to
    140  * deal with requests that do not start on an even page boundary.
    141  */
    142 #define	AAC_MAX_XFER(sc)	(((sc)->sc_max_sgs - 1) * PAGE_SIZE)
    143 
    144 /*
    145  * Fixed sector size.
    146  */
    147 #define	AAC_SECTOR_SIZE		512
    148 
    149 /*
    150  * Number of CCBs to reserve for control operations.
    151  */
    152 #define	AAC_NCCBS_RESERVE	8
    153 
    154 /*
    155  * Quirk listings.
    156  */
    157 #define AAC_QUIRK_PERC2QC	(1 << 0)	/* Dell PERC 2QC */
    158 #define AAC_QUIRK_SG_64BIT	(1 << 4)	/* Use 64-bit S/G addresses */
    159 #define AAC_QUIRK_4GB_WINDOW	(1 << 5)	/* Device can access host mem
    160 						 * in 2GB-4GB range */
    161 #define AAC_QUIRK_NO4GB		(1 << 6)	/* Can't access host mem >2GB */
    162 #define AAC_QUIRK_256FIBS	(1 << 7)	/* Can only handle 256 cmds */
    163 #define AAC_QUIRK_BROKEN_MMAP	(1 << 8)	/* Broken HostPhysMemPages */
    164 #define AAC_QUIRK_NEW_COMM	(1 << 11)	/* New comm. i/f supported */
    165 #define AAC_QUIRK_RAW_IO	(1 << 12)	/* Raw I/O interface */
    166 #define AAC_QUIRK_ARRAY_64BIT	(1 << 13)	/* 64-bit array size */
    167 
    168 
    169 /*
    170  * We gather a number of adapter-visible items into a single structure.
    171  *
    172  * The ordering of this structure may be important; we copy the Linux driver:
    173  *
    174  * Adapter FIBs
    175  * Init struct
    176  * Queue headers (Comm Area)
    177  * Printf buffer
    178  *
    179  * In addition, we add:
    180  * Sync Fib
    181  */
    182 struct aac_common {
    183 	/* fibs for the controller to send us messages */
    184 	struct aac_fib ac_fibs[AAC_ADAPTER_FIBS];
    185 
    186 	/* the init structure */
    187 	struct aac_adapter_init	ac_init;
    188 
    189 	/* arena within which the queue structures are kept */
    190 	u_int8_t ac_qbuf[sizeof(struct aac_queue_table) + AAC_QUEUE_ALIGN];
    191 
    192 	/* buffer for text messages from the controller */
    193 	char	ac_printf[AAC_PRINTF_BUFSIZE];
    194 
    195 	/* fib for synchronous commands */
    196 	struct aac_fib ac_sync_fib;
    197 };
    198 
    199 struct aac_ccb;
    200 
    201 /*
    202  * Interface operations
    203  */
    204 struct aac_interface {
    205 	int	(*aif_get_fwstatus)(struct aac_softc *);
    206 	void	(*aif_qnotify)(struct aac_softc *, int);
    207 	int	(*aif_get_istatus)(struct aac_softc *);
    208 	void	(*aif_set_istatus)(struct aac_softc *, int);
    209 	void	(*aif_set_mailbox)(struct aac_softc *, u_int32_t,
    210 				   u_int32_t, u_int32_t, u_int32_t, u_int32_t);
    211 	uint32_t (*aif_get_mailbox)(struct aac_softc *, int);
    212 	void	(*aif_set_interrupts)(struct aac_softc *, int);
    213 	int	(*aif_send_command)(struct aac_softc *, struct aac_ccb *);
    214 	int	(*aif_get_outb_queue)(struct aac_softc *);
    215 	void	(*aif_set_outb_queue)(struct aac_softc *, int);
    216 };
    217 
    218 #define AAC_GET_FWSTATUS(sc)		((sc)->sc_if.aif_get_fwstatus(sc))
    219 #define AAC_QNOTIFY(sc, qbit) \
    220 	((sc)->sc_if.aif_qnotify((sc), (qbit)))
    221 #define AAC_GET_ISTATUS(sc)		((sc)->sc_if.aif_get_istatus(sc))
    222 #define AAC_CLEAR_ISTATUS(sc, mask) \
    223 	((sc)->sc_if.aif_set_istatus((sc), (mask)))
    224 #define AAC_SET_MAILBOX(sc, command, arg0, arg1, arg2, arg3) \
    225 	do {								\
    226 		((sc)->sc_if.aif_set_mailbox((sc), (command), (arg0),	\
    227 		    (arg1), (arg2), (arg3)));				\
    228 	} while(0)
    229 #define AAC_GET_MAILBOX(sc, mb)		((sc)->sc_if.aif_get_mailbox(sc, mb))
    230 #define AAC_GET_MAILBOXSTATUS(sc)	(AAC_GET_MAILBOX(sc, 0))
    231 #define	AAC_MASK_INTERRUPTS(sc)	\
    232 	((sc)->sc_if.aif_set_interrupts((sc), 0))
    233 #define AAC_UNMASK_INTERRUPTS(sc) \
    234 	((sc)->sc_if.aif_set_interrupts((sc), 1))
    235 #define AAC_SEND_COMMAND(sc, cm) \
    236 	((sc)->sc_if.aif_send_command((sc), cm))
    237 #define AAC_GET_OUTB_QUEUE(sc) \
    238 	((sc)->sc_if.aif_get_outb_queue((sc)))
    239 #define AAC_SET_OUTB_QUEUE(sc, idx) \
    240 	((sc)->sc_if.aif_set_outb_queue((sc), (idx)))
    241 
    242 #define AAC_SETREG4(sc, reg, val) \
    243 	bus_space_write_4((sc)->sc_memt, (sc)->sc_memh, (reg), (val))
    244 #define AAC_GETREG4(sc, reg) \
    245 	bus_space_read_4((sc)->sc_memt, (sc)->sc_memh, (reg))
    246 #define AAC_SETREG2(sc, reg, val) \
    247 	bus_space_write_2((sc)->sc_memt, (sc)->sc_memh, (reg), (val))
    248 #define AAC_GETREG2(sc, reg) \
    249 	bus_space_read_2((sc)->sc_memt, (sc)->sc_memh, (reg))
    250 #define AAC_SETREG1(sc, reg, val) \
    251 	bus_space_write_1((sc)->sc_memt, (sc)->sc_memh, (reg), (val))
    252 #define AAC_GETREG1(sc, reg) \
    253 	bus_space_read_1((sc)->sc_memt, (sc)->sc_memh, (reg))
    254 
    255 struct aac_fibmap {
    256 	TAILQ_ENTRY(aac_fibmap)	fm_link;
    257 	struct aac_fib		*fm_fibs;
    258 	bus_dma_segment_t	fm_fibseg;
    259 	bus_dmamap_t		fm_fibmap;
    260 	struct aac_ccb		*fm_ccbs;
    261 };
    262 
    263 /*
    264  * A command control block, one for each corresponding command index
    265  * of the controller.
    266  */
    267 struct aac_ccb {
    268 	SIMPLEQ_ENTRY(aac_ccb)	ac_chain;
    269 
    270 	struct aac_fib		*ac_fib;
    271 	struct aac_fibmap	*ac_fibmap;
    272 	bus_addr_t		ac_fibphys;
    273 	bus_dmamap_t		ac_dmamap_xfer;
    274 
    275 	void			*ac_data;
    276 	size_t			ac_datalen;
    277 	u_int			ac_flags;
    278 
    279 	void			(*ac_intr)(struct aac_ccb *);
    280 	struct device		*ac_device;
    281 	void			*ac_context;
    282 };
    283 #define AAC_CCB_MAPPED	 	0x01
    284 #define AAC_CCB_COMPLETED 	0x02
    285 #define AAC_CCB_DATA_IN		0x04
    286 #define AAC_CCB_DATA_OUT	0x08
    287 
    288 struct aac_drive {
    289 	u_int	hd_present;
    290 	u_int	hd_devtype;
    291 	u_int	hd_size;
    292 };
    293 
    294 /*
    295  * Per-controller structure.
    296  */
    297 struct aac_softc {
    298 	struct device		sc_dv;
    299 	void			*sc_ih;
    300 	bus_space_tag_t		sc_memt;
    301 	bus_space_handle_t	sc_memh;
    302 	bus_dma_tag_t		sc_dmat;
    303 	bus_size_t		sc_regsize;
    304 
    305 	struct FsaRevision	sc_revision;
    306 	int			sc_hwif;
    307 	int			sc_quirks;
    308 	struct aac_interface	sc_if;
    309 
    310 	u_int32_t		sc_max_fibs;
    311 	u_int32_t		sc_max_fibs_alloc;
    312 	u_int32_t		sc_max_sectors;
    313 	u_int32_t		sc_max_fib_size;
    314 	u_int32_t		sc_max_sgs;
    315 
    316 	u_int32_t		sc_total_fibs;
    317 	TAILQ_HEAD(,aac_fibmap)	sc_fibmap_tqh;
    318 
    319 	struct aac_common	*sc_common;
    320 	bus_dma_segment_t	sc_common_seg;
    321 	bus_dmamap_t		sc_common_dmamap;
    322 	struct aac_fib		*sc_aif_fib;
    323 
    324 	struct aac_ccb		*sc_ccbs;
    325 	SIMPLEQ_HEAD(, aac_ccb)	sc_ccb_free;
    326 	SIMPLEQ_HEAD(, aac_ccb)	sc_ccb_queue;
    327 	SIMPLEQ_HEAD(, aac_ccb)	sc_ccb_complete;
    328 
    329 	struct aac_queue_table	*sc_queues;
    330 	struct aac_queue_entry	*sc_qentries[AAC_QUEUE_COUNT];
    331 	struct aac_drive	sc_hdr[AAC_MAX_CONTAINERS];
    332 	int			sc_nunits;
    333 	int			sc_flags;
    334 	uint32_t		sc_supported_options;
    335 
    336 	/* Set by parent */
    337 	int			(*sc_intr_set)(struct aac_softc *,
    338 						int (*)(void *), void *);
    339 };
    340 #define AAC_HWIF_I960RX		0
    341 #define AAC_HWIF_STRONGARM	1
    342 #define AAC_HWIF_FALCON		2
    343 #define AAC_HWIF_RKT		3
    344 #define AAC_HWIF_UNKNOWN	-1
    345 
    346 #define	AAC_ONLINE		2
    347 
    348 struct aac_attach_args {
    349 	int		aaca_unit;
    350 };
    351 
    352 int	aac_attach(struct aac_softc *);
    353 void	aac_ccb_enqueue(struct aac_softc *, struct aac_ccb *);
    354 void	aac_ccb_free(struct aac_softc *, struct aac_ccb *);
    355 struct aac_ccb *aac_ccb_alloc(struct aac_softc *, int);
    356 int	aac_ccb_map(struct aac_softc *, struct aac_ccb *);
    357 int	aac_ccb_poll(struct aac_softc *, struct aac_ccb *, int);
    358 int	aac_ccb_submit(struct aac_softc *, struct aac_ccb *);
    359 void	aac_ccb_unmap(struct aac_softc *, struct aac_ccb *);
    360 const char	*aac_describe_code(const struct aac_code_lookup *, u_int32_t);
    361 int	aac_intr(void *);
    362 
    363 #endif	/* !_PCI_AACVAR_H_ */
    364