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