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