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