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