amrvar.h revision 58496
1235783Skib/*- 2235783Skib * Copyright (c) 1999 Michael Smith 3235783Skib * All rights reserved. 4235783Skib * 5235783Skib * Redistribution and use in source and binary forms, with or without 6235783Skib * modification, are permitted provided that the following conditions 7235783Skib * are met: 8235783Skib * 1. Redistributions of source code must retain the above copyright 9235783Skib * notice, this list of conditions and the following disclaimer. 10235783Skib * 2. Redistributions in binary form must reproduce the above copyright 11235783Skib * notice, this list of conditions and the following disclaimer in the 12235783Skib * documentation and/or other materials provided with the distribution. 13235783Skib * 14235783Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15235783Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16235783Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17235783Skib * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18235783Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19235783Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20235783Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21235783Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22235783Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23235783Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24235783Skib * SUCH DAMAGE. 25235783Skib * 26235783Skib * $FreeBSD: head/sys/dev/amr/amrvar.h 58496 2000-03-23 18:33:19Z msmith $ 27235783Skib */ 28235783Skib 29235783Skib/* 30235783Skib * We could actually use all 17 segments, but using only 16 means that 31235783Skib * each scatter/gather map is 128 bytes in size, and thus we don't have to worry about 32235783Skib * maps crossing page boundaries. 33235783Skib */ 34235783Skib#define AMR_NSEG 16 35235783Skib 36235783Skib#define AMR_CFG_BASE 0x10 37235783Skib#define AMR_CFG_SIG 0xa0 38235783Skib#define AMR_SIGNATURE 0x3344 39235783Skib 40235783Skib#define AMR_MAXCMD 255 /* ident = 0 not allowed */ 41235783Skib#define AMR_MAXLD 40 42235783Skib 43235783Skib#define AMR_BLKSIZE 512 44235783Skib 45235783Skibstruct amr_softc; 46235783Skib 47235783Skib/* 48235783Skib * Per-logical-drive datastructure 49235783Skib */ 50235783Skibstruct amr_logdrive 51235783Skib{ 52235783Skib u_int32_t al_size; 53235783Skib int al_state; 54235783Skib int al_properties; 55235783Skib 56235783Skib /* synthetic geometry */ 57235783Skib int al_cylinders; 58235783Skib int al_heads; 59235783Skib int al_sectors; 60235783Skib 61235783Skib /* driver */ 62235783Skib device_t al_disk; 63235783Skib}; 64235783Skib 65235783Skib 66235783Skib/* 67235783Skib * Per-command control structure. 68235783Skib */ 69235783Skibstruct amr_command 70235783Skib{ 71235783Skib TAILQ_ENTRY(amr_command) ac_link; 72235783Skib 73235783Skib struct amr_softc *ac_sc; 74235783Skib u_int8_t ac_slot; 75235783Skib int ac_status; 76235783Skib#define AMR_STATUS_BUSY 0xffff 77235783Skib#define AMR_STATUS_WEDGED 0xdead 78235783Skib struct amr_mailbox ac_mailbox; 79235783Skib u_int32_t ac_sgphys; 80235783Skib int ac_nsgent; 81235783Skib int ac_flags; 82235783Skib#define AMR_CMD_DATAIN (1<<0) 83235783Skib#define AMR_CMD_DATAOUT (1<<1) 84235783Skib#define AMR_CMD_PRIORITY (1<<2) 85235783Skib time_t ac_stamp; 86235783Skib 87235783Skib void *ac_data; 88235783Skib size_t ac_length; 89235783Skib bus_dmamap_t ac_dmamap; 90235783Skib u_int32_t ac_dataphys; 91235783Skib 92235783Skib void (* ac_complete)(struct amr_command *ac); 93235783Skib void *ac_private; 94235783Skib}; 95235783Skib 96235783Skibstruct amr_softc 97235783Skib{ 98235783Skib /* bus attachments */ 99235783Skib device_t amr_dev; 100235783Skib struct resource *amr_reg; /* control registers */ 101235783Skib bus_space_handle_t amr_bhandle; 102235783Skib bus_space_tag_t amr_btag; 103235783Skib bus_dma_tag_t amr_parent_dmat; /* parent DMA tag */ 104235783Skib bus_dma_tag_t amr_buffer_dmat; /* data buffer DMA tag */ 105235783Skib struct resource *amr_irq; /* interrupt */ 106235783Skib void *amr_intr; 107235783Skib 108235783Skib /* mailbox */ 109235783Skib volatile struct amr_mailbox *amr_mailbox; 110235783Skib volatile struct amr_mailbox64 *amr_mailbox64; 111235783Skib u_int32_t amr_mailboxphys; 112235783Skib bus_dma_tag_t amr_mailbox_dmat; 113235783Skib bus_dmamap_t amr_mailbox_dmamap; 114235783Skib 115235783Skib /* scatter/gather lists and their controller-visible mappings */ 116235783Skib struct amr_sgentry *amr_sgtable; /* s/g lists */ 117235783Skib u_int32_t amr_sgbusaddr; /* s/g table base address in bus space */ 118235783Skib bus_dma_tag_t amr_sg_dmat; /* s/g buffer DMA tag */ 119235783Skib bus_dmamap_t amr_sg_dmamap; /* map for s/g buffers */ 120235783Skib 121235783Skib /* controller limits and features */ 122235783Skib int amr_maxio; /* maximum number of I/O transactions */ 123235783Skib int amr_maxdrives; /* max number of logical drives */ 124235783Skib 125235783Skib /* connected logical drives */ 126235783Skib struct amr_logdrive amr_drive[AMR_MAXLD]; 127235783Skib 128235783Skib /* controller status */ 129235783Skib int amr_state; 130235783Skib#define AMR_STATE_OPEN (1<<0) 131235783Skib#define AMR_STATE_SUSPEND (1<<1) 132235783Skib#define AMR_STATE_INTEN (1<<2) 133235783Skib#define AMR_STATE_SHUTDOWN (1<<3) 134235783Skib 135235783Skib /* per-controller queues */ 136235783Skib struct buf_queue_head amr_bufq; /* pending I/O */ 137235783Skib int amr_waitbufs; 138235783Skib struct amr_command *amr_busycmd[AMR_MAXCMD]; 139235783Skib int amr_busycmdcount; 140235783Skib TAILQ_HEAD(,amr_command) amr_work; 141235783Skib int amr_workcount; 142235783Skib TAILQ_HEAD(,amr_command) amr_freecmds; 143235783Skib 144235783Skib /* controller type-specific support */ 145235783Skib int amr_type; 146235783Skib#define AMR_TYPE_STD 0 147235783Skib#define AMR_TYPE_QUARTZ 1 148235783Skib void (* amr_submit_command)(struct amr_softc *sc); 149235783Skib int (* amr_get_work)(struct amr_softc *sc, struct amr_mailbox *mbsave); 150235783Skib void (* amr_attach_mailbox)(struct amr_softc *sc); 151235783Skib}; 152235783Skib 153235783Skib/* 154235783Skib * I/O primitives 155235783Skib */ 156235783Skib/* Quartz */ 157235783Skib#define AMR_QPUT_IDB(sc, val) bus_space_write_4(sc->amr_btag, sc->amr_bhandle, AMR_QIDB, val) 158235783Skib#define AMR_QGET_IDB(sc) bus_space_read_4 (sc->amr_btag, sc->amr_bhandle, AMR_QIDB) 159235783Skib#define AMR_QPUT_ODB(sc, val) bus_space_write_4(sc->amr_btag, sc->amr_bhandle, AMR_QODB, val) 160235783Skib#define AMR_QGET_ODB(sc) bus_space_read_4 (sc->amr_btag, sc->amr_bhandle, AMR_QODB) 161235783Skib 162235783Skib/* Standard */ 163235783Skib#define AMR_SPUT_ISTAT(sc, val) bus_space_write_1(sc->amr_btag, sc->amr_bhandle, AMR_SINTR, val) 164235783Skib#define AMR_SGET_ISTAT(sc) bus_space_read_1 (sc->amr_btag, sc->amr_bhandle, AMR_SINTR) 165235783Skib#define AMR_SACK_INTERRUPT(sc) bus_space_write_1(sc->amr_btag, sc->amr_bhandle, AMR_SCMD, AMR_SCMD_ACKINTR) 166235783Skib#define AMR_SPOST_COMMAND(sc) bus_space_write_1(sc->amr_btag, sc->amr_bhandle, AMR_SCMD, AMR_SCMD_POST) 167235783Skib#define AMR_SGET_MBSTAT(sc) bus_space_read_1 (sc->amr_btag, sc->amr_bhandle, AMR_SMBOX_BUSY) 168235783Skib#define AMR_SENABLE_INTR(sc) \ 169235783Skib bus_space_write_1(sc->amr_btag, sc->amr_bhandle, AMR_STOGGLE, \ 170235783Skib bus_space_read_1(sc->amr_btag, sc->amr_bhandle, AMR_STOGGLE) | AMR_STOGL_IENABLE) 171235783Skib#define AMR_SDISABLE_INTR(sc) \ 172235783Skib bus_space_write_1(sc->amr_btag, sc->amr_bhandle, AMR_STOGGLE, \ 173235783Skib bus_space_read_1(sc->amr_btag, sc->amr_bhandle, AMR_STOGGLE) & ~AMR_STOGL_IENABLE) 174235783Skib#define AMR_SBYTE_SET(sc, reg, val) bus_space_write_1(sc->amr_btag, sc->amr_bhandle, reg, val) 175235783Skib 176235783Skib/* 177235783Skib * Interface between bus connections and driver core. 178235783Skib */ 179235783Skibextern void amr_free(struct amr_softc *sc); 180235783Skibextern int amr_attach(struct amr_softc *sc); 181235783Skibextern void amr_startup(struct amr_softc *sc); 182235783Skibextern void amr_intr(void *data); 183235783Skibextern int amr_detach(device_t dev); 184235783Skibextern int amr_shutdown(device_t dev); 185235783Skibextern int amr_suspend(device_t dev); 186235783Skibextern int amr_resume(device_t dev); 187235783Skibextern d_open_t amr_open; 188235783Skibextern d_close_t amr_close; 189235783Skibextern d_ioctl_t amr_ioctl; 190235783Skib 191235783Skibextern devclass_t amr_devclass; 192235783Skib 193235783Skib/* 194235783Skib * MegaRAID logical disk driver 195235783Skib */ 196235783Skibstruct amrd_softc 197235783Skib{ 198235783Skib device_t amrd_dev; 199235783Skib struct amr_softc *amrd_controller; 200235783Skib struct amr_logdrive *amrd_drive; 201235783Skib struct disk amrd_disk; 202235783Skib struct devstat amrd_stats; 203235783Skib struct disklabel amrd_label; 204235783Skib int amrd_unit; 205235783Skib int amrd_flags; 206235783Skib#define AMRD_OPEN (1<<0) /* drive is open (can't shut down) */ 207235783Skib}; 208235783Skib 209235783Skib/* 210235783Skib * Interface between driver core and disk driver (should be using a bus?) 211235783Skib */ 212235783Skibextern int amr_submit_buf(struct amr_softc *sc, struct buf *bp); 213235783Skibextern int amr_submit_ioctl(struct amr_softc *sc, struct amr_logdrive *drive, u_long cmd, 214235783Skib caddr_t addr, int32_t flag, struct proc *p); 215235783Skibextern void amrd_intr(void *data); 216235783Skib 217235783Skib