xref: /netbsd/sys/dev/mvme/mvmebus.h (revision 5f819ca3)
1*5f819ca3Schs /*	$NetBSD: mvmebus.h,v 1.4 2012/10/27 17:18:27 chs Exp $	*/
208bde987Sscw 
308bde987Sscw /*-
408bde987Sscw  * Copyright (c) 2000, 2002 The NetBSD Foundation, Inc.
508bde987Sscw  * All rights reserved.
608bde987Sscw  *
708bde987Sscw  * This code is derived from software contributed to The NetBSD Foundation
808bde987Sscw  * by Steve C. Woodford.
908bde987Sscw  *
1008bde987Sscw  * Redistribution and use in source and binary forms, with or without
1108bde987Sscw  * modification, are permitted provided that the following conditions
1208bde987Sscw  * are met:
1308bde987Sscw  * 1. Redistributions of source code must retain the above copyright
1408bde987Sscw  *    notice, this list of conditions and the following disclaimer.
1508bde987Sscw  * 2. Redistributions in binary form must reproduce the above copyright
1608bde987Sscw  *    notice, this list of conditions and the following disclaimer in the
1708bde987Sscw  *    documentation and/or other materials provided with the distribution.
1808bde987Sscw  *
1908bde987Sscw  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2008bde987Sscw  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2108bde987Sscw  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2208bde987Sscw  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2308bde987Sscw  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2408bde987Sscw  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2508bde987Sscw  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2608bde987Sscw  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2708bde987Sscw  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2808bde987Sscw  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2908bde987Sscw  * POSSIBILITY OF SUCH DAMAGE.
3008bde987Sscw  */
3108bde987Sscw 
3208bde987Sscw #ifndef _MVME_MVMEBUS_H
3308bde987Sscw #define _MVME_MVMEBUS_H
3408bde987Sscw 
3508bde987Sscw /*
3608bde987Sscw  * VMEbus master and slave windows are described using
3708bde987Sscw  * instances of this structure.
3808bde987Sscw  *
3908bde987Sscw  * The chip-specific code records the details of the available mappings
4008bde987Sscw  * for the MVME board.
4108bde987Sscw  */
4208bde987Sscw struct mvmebus_range {
4308bde987Sscw 	vme_am_t	vr_am;		/* Address modifier (A16, A24, A32) */
4408bde987Sscw 	vme_datasize_t	vr_datasize;	/* Datasize: logical OR of D8,D16,D32 */
4508bde987Sscw 	paddr_t		vr_locstart;	/* CPU-relative address of mapping */
4608bde987Sscw 	paddr_t		vr_mask;	/* Mask to apply to this mapping */
4708bde987Sscw 	vme_addr_t	vr_vmestart;	/* VMEbus start address */
4808bde987Sscw 	vme_addr_t	vr_vmeend;	/* VMEbus end address */
4908bde987Sscw };
5008bde987Sscw 
5108bde987Sscw /* Assigned to vr_am to specify the mapping is not valid */
5208bde987Sscw #define MVMEBUS_AM_DISABLED	((vme_am_t)-1)
5308bde987Sscw 
5408bde987Sscw /* For slave mappings, these specify the slave's capabilities */
5508bde987Sscw #define MVMEBUS_AM_CAP_DATA	0x0100
5608bde987Sscw #define MVMEBUS_AM_CAP_PROG	0x0200
5708bde987Sscw #define MVMEBUS_AM_CAP_BLK	0x0400
5808bde987Sscw #define MVMEBUS_AM_CAP_BLKD64	0x0800
5908bde987Sscw #define MVMEBUS_AM_CAP_USER	0x1000
6008bde987Sscw #define MVMEBUS_AM_CAP_SUPER	0x2000
6108bde987Sscw #define MVMEBUS_AM_HAS_CAP(x)	(((x) & 0x3f00) != 0)
6208bde987Sscw 
6308bde987Sscw #define MVMEBUS_AM2CAP(am)	(_mvmebus_am_cap[((am) & \
6408bde987Sscw 				    (VME_AM_MODEMASK | VME_AM_PRIVMASK))])
6508bde987Sscw 
6608bde987Sscw 
6708bde987Sscw /*
6808bde987Sscw  * This records VMEbus-specific details of a region of bus_space_map'd
6908bde987Sscw  * VMEbus address space.
7008bde987Sscw  */
7108bde987Sscw struct mvmebus_mapresc {
7208bde987Sscw 	bus_space_handle_t	mr_handle;
7308bde987Sscw 	bus_addr_t		mr_addr;
7408bde987Sscw 	bus_size_t		mr_size;
7508bde987Sscw 	vme_am_t		mr_am;
7608bde987Sscw 	vme_datasize_t		mr_datasize;
7708bde987Sscw 	int			mr_range;
7808bde987Sscw };
7908bde987Sscw 
8008bde987Sscw 
8108bde987Sscw /*
8208bde987Sscw  * This records the VMEbus-specific details of a region of phyisical
8308bde987Sscw  * memory accessible through a VMEbus slave map.
8408bde987Sscw  */
8508bde987Sscw struct mvmebus_dmamap {
8608bde987Sscw 	vme_am_t		vm_am;
8708bde987Sscw 	vme_datasize_t		vm_datasize;
8808bde987Sscw 	vme_swap_t		vm_swap;
8908bde987Sscw 	struct mvmebus_range	*vm_slave;
9008bde987Sscw };
9108bde987Sscw 
9208bde987Sscw 
9308bde987Sscw struct mvmebus_softc {
94*5f819ca3Schs 	device_t		sc_dev;
9508bde987Sscw 	bus_space_tag_t		sc_bust;
9608bde987Sscw 	bus_dma_tag_t		sc_dmat;
9708bde987Sscw 	short			sc_irqref[8];
9808bde987Sscw 	void			*sc_chip;
9908bde987Sscw 	int			sc_nmasters;
10008bde987Sscw 	struct mvmebus_range	*sc_masters;
10108bde987Sscw 	int			sc_nslaves;
10208bde987Sscw 	struct mvmebus_range	*sc_slaves;
10308bde987Sscw 	struct evcnt		sc_evcnt[7];
10408bde987Sscw 	void			(*sc_intr_establish)(void *, int, int, int, int,
10508bde987Sscw 				    int (*)(void *), void *, struct evcnt *);
10608bde987Sscw 	void			(*sc_intr_disestablish)(void *, int, int, int,
10708bde987Sscw 				    struct evcnt *);
10808bde987Sscw 	struct vme_chipset_tag	sc_vct;
10908bde987Sscw 	struct mvme68k_bus_dma_tag	sc_mvmedmat;
11008bde987Sscw };
11108bde987Sscw 
11208bde987Sscw 
11308bde987Sscw void	mvmebus_attach(struct mvmebus_softc *);
11408bde987Sscw int	mvmebus_map(void *, vme_addr_t, vme_size_t, vme_am_t,
11508bde987Sscw 	    vme_datasize_t, vme_swap_t, bus_space_tag_t *,
11608bde987Sscw 	    bus_space_handle_t *, vme_mapresc_t *);
11708bde987Sscw void	mvmebus_unmap(void *, vme_mapresc_t);
11808bde987Sscw int	mvmebus_probe(void *, vme_addr_t, vme_size_t,
11908bde987Sscw 	    vme_am_t, vme_datasize_t,
12008bde987Sscw 	    int (*) (void *, bus_space_tag_t, bus_space_handle_t), void *arg);
12108bde987Sscw int	mvmebus_intmap(void *, int, int, vme_intr_handle_t *);
12208bde987Sscw const struct evcnt *mvmebus_intr_evcnt(void *, vme_intr_handle_t);
12308bde987Sscw void *	mvmebus_intr_establish(void *, vme_intr_handle_t, int,
12408bde987Sscw 	    int (*) (void *), void *);
12508bde987Sscw void	mvmebus_intr_disestablish(void *, vme_intr_handle_t);
12608bde987Sscw 
12708bde987Sscw int	mvmebus_dmamap_create(void *, vme_size_t, vme_am_t, vme_datasize_t,
12808bde987Sscw 	    vme_swap_t, int, vme_size_t, vme_addr_t, int, bus_dmamap_t *);
12908bde987Sscw void	mvmebus_dmamap_destroy(void *, bus_dmamap_t);
13008bde987Sscw int	mvmebus_dmamap_load(bus_dma_tag_t, bus_dmamap_t,
13108bde987Sscw 	    void *, bus_size_t, struct proc *, int);
13208bde987Sscw int	mvmebus_dmamap_load_mbuf(bus_dma_tag_t,
13308bde987Sscw 	    bus_dmamap_t, struct mbuf *, int);
13408bde987Sscw int	mvmebus_dmamap_load_uio(bus_dma_tag_t,
13508bde987Sscw 	    bus_dmamap_t, struct uio *, int);
13608bde987Sscw int	mvmebus_dmamap_load_raw(bus_dma_tag_t,
13708bde987Sscw 	    bus_dmamap_t, bus_dma_segment_t *, int, bus_size_t, int);
13808bde987Sscw void	mvmebus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t);
13908bde987Sscw void	mvmebus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
14008bde987Sscw 	    bus_size_t, int);
14108bde987Sscw 
14208bde987Sscw int	mvmebus_dmamem_alloc(void *, vme_size_t, vme_am_t, vme_datasize_t,
14308bde987Sscw 	    vme_swap_t, bus_dma_segment_t *, int, int *, int);
14408bde987Sscw void	mvmebus_dmamem_free(void *, bus_dma_segment_t *, int);
14508bde987Sscw int	mvmebus_dmamem_map(bus_dma_tag_t, bus_dma_segment_t *, int,
14653524e44Schristos 	    size_t, void **, int);
14753524e44Schristos void	mvmebus_dmamem_unmap(bus_dma_tag_t, void *, size_t);
14808bde987Sscw paddr_t	mvmebus_dmamem_mmap(bus_dma_tag_t, bus_dma_segment_t *, int,
14908bde987Sscw 	    off_t, int, int);
15008bde987Sscw 
15108bde987Sscw extern vme_am_t _mvmebus_am_cap[];
15208bde987Sscw extern const char *mvmebus_irq_name[];
15308bde987Sscw 
15408bde987Sscw #endif /* _MVME_MVMEBUS_H */
155