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