1 1.15 thorpej /* $NetBSD: vmevar.h,v 1.15 2023/12/04 01:49:29 thorpej Exp $ */ 2 1.6 drochner 3 1.6 drochner /* 4 1.6 drochner * Copyright (c) 1999 5 1.6 drochner * Matthias Drochner. All rights reserved. 6 1.1 pk * 7 1.1 pk * Redistribution and use in source and binary forms, with or without 8 1.1 pk * modification, are permitted provided that the following conditions 9 1.1 pk * are met: 10 1.1 pk * 1. Redistributions of source code must retain the above copyright 11 1.1 pk * notice, this list of conditions and the following disclaimer. 12 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 pk * notice, this list of conditions and the following disclaimer in the 14 1.1 pk * documentation and/or other materials provided with the distribution. 15 1.6 drochner * 3. The name of the author may not be used to endorse or promote products 16 1.6 drochner * derived from this software without specific prior written permission. 17 1.6 drochner * 18 1.6 drochner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 1.6 drochner * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 1.6 drochner * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 1.6 drochner * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 1.6 drochner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 1.6 drochner * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.6 drochner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.6 drochner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.6 drochner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 1.6 drochner * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 pk * 29 1.1 pk */ 30 1.1 pk 31 1.9 pk #ifndef _VMEVAR_H_ 32 1.9 pk #define _VMEVAR_H_ 33 1.6 drochner 34 1.6 drochner typedef u_int32_t vme_addr_t, vme_size_t; 35 1.6 drochner typedef int vme_am_t; 36 1.6 drochner 37 1.6 drochner typedef enum { 38 1.6 drochner VME_D8 = 1, 39 1.6 drochner VME_D16 = 2, 40 1.6 drochner VME_D32 = 4 41 1.6 drochner } vme_datasize_t; 42 1.6 drochner 43 1.6 drochner typedef int vme_swap_t; /* hardware swap capabilities, 44 1.6 drochner placeholder - contents to be specified */ 45 1.6 drochner 46 1.6 drochner #ifdef _KERNEL 47 1.6 drochner 48 1.15 thorpej #include <sys/vmem.h> 49 1.15 thorpej 50 1.9 pk /* 51 1.9 pk * Generic placeholder for any resources needed for a mapping, 52 1.9 pk * overloaded by bus interface driver 53 1.9 pk */ 54 1.11 perry typedef void *vme_mapresc_t; 55 1.6 drochner 56 1.9 pk /* Describes interrupt mapping, opaque to MI drivers */ 57 1.6 drochner typedef void *vme_intr_handle_t; 58 1.6 drochner 59 1.6 drochner /* 60 1.9 pk * Tag structure passed to VME bus devices; 61 1.9 pk * contains the bus dependent functions, accessed via macros below. 62 1.6 drochner */ 63 1.6 drochner typedef struct vme_chipset_tag { 64 1.6 drochner void *cookie; 65 1.6 drochner 66 1.10 perry int (*vct_map)(void *, vme_addr_t, vme_size_t, 67 1.10 perry vme_am_t, vme_datasize_t, vme_swap_t, 68 1.10 perry bus_space_tag_t *, bus_space_handle_t *, 69 1.10 perry vme_mapresc_t *); 70 1.10 perry void (*vct_unmap)(void *, vme_mapresc_t); 71 1.10 perry 72 1.10 perry int (*vct_probe)(void *, vme_addr_t, vme_size_t, 73 1.10 perry vme_am_t, vme_datasize_t, 74 1.10 perry int (*)(void *, bus_space_tag_t, bus_space_handle_t), 75 1.10 perry void *); 76 1.10 perry 77 1.10 perry int (*vct_int_map)(void *, int, int, vme_intr_handle_t *); 78 1.10 perry const struct evcnt *(*vct_int_evcnt)(void *, vme_intr_handle_t); 79 1.10 perry void *(*vct_int_establish)(void *, vme_intr_handle_t, int, 80 1.10 perry int (*)(void *), void *); 81 1.10 perry void (*vct_int_disestablish)(void *, void *); 82 1.10 perry 83 1.10 perry int (*vct_dmamap_create)(void *, vme_size_t, 84 1.10 perry vme_am_t, vme_datasize_t, vme_swap_t, 85 1.10 perry int, vme_size_t, vme_addr_t, 86 1.10 perry int, bus_dmamap_t *); 87 1.10 perry void (*vct_dmamap_destroy)(void *, bus_dmamap_t); 88 1.6 drochner 89 1.6 drochner /* 90 1.6 drochner * This sucks: we have to give all the VME specific arguments 91 1.6 drochner * twice - for dmamem_alloc and for dmamem_create. Perhaps 92 1.6 drochner * give a "dmamap" argument here, meaning: "allocate memory which 93 1.6 drochner * can be accessed through this DMA map". 94 1.6 drochner */ 95 1.10 perry int (*vct_dmamem_alloc)(void *, vme_size_t, 96 1.10 perry vme_am_t, vme_datasize_t, vme_swap_t, 97 1.10 perry bus_dma_segment_t *, int, int *, int); 98 1.10 perry void (*vct_dmamem_free)(void *, bus_dma_segment_t *, int); 99 1.6 drochner 100 1.6 drochner struct vmebus_softc *bus; 101 1.6 drochner } *vme_chipset_tag_t; 102 1.1 pk 103 1.1 pk /* 104 1.6 drochner * map / unmap: map VME address ranges into kernel address space 105 1.6 drochner * XXX should have mapping to CPU only to allow user mmap() without 106 1.6 drochner * wasting kvm 107 1.1 pk */ 108 1.6 drochner #define vme_space_map(vc, vmeaddr, len, am, datasize, swap, tag, handle, resc) \ 109 1.9 pk (*((vc)->vct_map))((vc)->cookie, (vmeaddr), (len), (am), (datasize), \ 110 1.9 pk (swap), (tag), (handle), (resc)) 111 1.6 drochner #define vme_space_unmap(vc, resc) \ 112 1.9 pk (*((vc)->vct_unmap))((vc)->cookie, (resc)) 113 1.1 pk 114 1.6 drochner /* 115 1.9 pk * probe: check readability or call callback. 116 1.6 drochner */ 117 1.6 drochner #define vme_probe(vc, vmeaddr, len, am, datasize, callback, cbarg) \ 118 1.9 pk (*((vc)->vct_probe))((vc)->cookie, (vmeaddr), (len), (am), \ 119 1.9 pk (datasize), (callback), (cbarg)) 120 1.1 pk 121 1.6 drochner /* 122 1.9 pk * install / deinstall VME interrupt handler. 123 1.6 drochner */ 124 1.6 drochner #define vme_intr_map(vc, level, vector, handlep) \ 125 1.9 pk (*((vc)->vct_int_map))((vc)->cookie, (level), (vector), (handlep)) 126 1.8 cgd #define vme_intr_evcnt(vc, handle) \ 127 1.9 pk (*((vc)->vct_int_evcnt))((vc)->cookie, (handle)) 128 1.6 drochner #define vme_intr_establish(vc, handle, prio, func, arg) \ 129 1.9 pk (*((vc)->vct_int_establish))((vc)->cookie, \ 130 1.9 pk (handle), (prio), (func), (arg)) 131 1.6 drochner #define vme_intr_disestablish(vc, cookie) \ 132 1.9 pk (*((vc)->vct_int_unmap))((vc)->cookie, (cookie)) 133 1.1 pk 134 1.6 drochner /* 135 1.9 pk * Create DMA map (which is later used by bus independent DMA functions). 136 1.6 drochner */ 137 1.6 drochner #define vme_dmamap_create(vc, size, am, datasize, swap, nsegs, segsz, bound, \ 138 1.9 pk flags, map) \ 139 1.9 pk (*((vc)->vct_dmamap_create))((vc)->cookie, (size), (am), (datasize), \ 140 1.9 pk (swap), (nsegs), (segsz), (bound), (flags), (map)) 141 1.6 drochner #define vme_dmamap_destroy(vc, map) \ 142 1.9 pk (*((vc)->vct_dmamap_destroy))((vc)->cookie, (map)) 143 1.1 pk 144 1.6 drochner /* 145 1.9 pk * Allocate memory directly accessible from VME. 146 1.6 drochner */ 147 1.6 drochner #define vme_dmamem_alloc(vc, size, am, datasize, swap, \ 148 1.6 drochner segs, nsegs, rsegs, flags) \ 149 1.6 drochner (*((vc)->vct_dmamem_alloc))((vc)->cookie, (size), (am), (datasize), (swap), \ 150 1.6 drochner (segs), (nsegs), (rsegs), (flags)) 151 1.6 drochner #define vme_dmamem_free(vc, segs, nsegs) \ 152 1.6 drochner (*((vc)->vct_dmamem_free))((vc)->cookie, (segs), (nsegs)) 153 1.1 pk 154 1.6 drochner /* 155 1.9 pk * Autoconfiguration data structures. 156 1.6 drochner */ 157 1.1 pk 158 1.6 drochner struct vme_attach_args; 159 1.13 cegger typedef void (*vme_slaveconf_callback)(device_t, 160 1.10 perry struct vme_attach_args *); 161 1.6 drochner 162 1.6 drochner struct vmebus_attach_args { 163 1.6 drochner vme_chipset_tag_t va_vct; 164 1.6 drochner bus_dma_tag_t va_bdt; 165 1.1 pk 166 1.6 drochner vme_slaveconf_callback va_slaveconfig; 167 1.6 drochner }; 168 1.7 drochner 169 1.7 drochner struct extent; 170 1.1 pk 171 1.6 drochner struct vmebus_softc { 172 1.6 drochner vme_chipset_tag_t sc_vct; 173 1.6 drochner bus_dma_tag_t sc_bdt; 174 1.1 pk 175 1.6 drochner vme_slaveconf_callback slaveconfig; 176 1.1 pk 177 1.15 thorpej vmem_t *vme32_arena, *vme24_arena, *vme16_arena; 178 1.1 pk }; 179 1.1 pk 180 1.6 drochner #define VME_MAXCFRANGES 3 181 1.6 drochner 182 1.6 drochner struct vme_range { 183 1.6 drochner vme_addr_t offset; 184 1.6 drochner vme_size_t size; 185 1.6 drochner vme_am_t am; 186 1.1 pk }; 187 1.1 pk 188 1.1 pk struct vme_attach_args { 189 1.6 drochner vme_chipset_tag_t va_vct; 190 1.6 drochner bus_dma_tag_t va_bdt; 191 1.1 pk 192 1.6 drochner int ivector, ilevel; 193 1.6 drochner int numcfranges; 194 1.6 drochner struct vme_range r[VME_MAXCFRANGES]; 195 1.1 pk }; 196 1.1 pk 197 1.6 drochner /* 198 1.9 pk * Address space accounting. 199 1.6 drochner */ 200 1.10 perry int _vme_space_alloc(struct vmebus_softc *, vme_addr_t, vme_size_t, vme_am_t); 201 1.10 perry void _vme_space_free(struct vmebus_softc *, vme_addr_t, vme_size_t, vme_am_t); 202 1.10 perry int _vme_space_get(struct vmebus_softc *, vme_size_t, vme_am_t, 203 1.10 perry u_long, vme_addr_t*); 204 1.6 drochner 205 1.6 drochner #define vme_space_alloc(tag, addr, size, ams) \ 206 1.9 pk _vme_space_alloc(tag->bus, addr, size, ams) 207 1.6 drochner 208 1.6 drochner #define vme_space_free(tag, addr, size, ams) \ 209 1.9 pk _vme_space_free(tag->bus, addr, size, ams) 210 1.6 drochner 211 1.6 drochner #define vme_space_get(tag, size, ams, align, addr) \ 212 1.9 pk _vme_space_get(tag->bus, size, ams, align, addr) 213 1.6 drochner 214 1.6 drochner #endif /* KERNEL */ 215 1.9 pk #endif /* _VMEVAR_H_ */ 216