1 /* $NetBSD: podulebus_io.c,v 1.2 2002/09/27 15:35:31 provos Exp $ */ 2 3 /* 4 * Copyright (c) 1997 Mark Brinicombe. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Mark Brinicombe. 18 * 4. The name of the company nor the name of the author may be used to 19 * endorse or promote products derived from this software without specific 20 * prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 26 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 27 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 28 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 /* 36 * bus_space I/O functions for podulebus 37 */ 38 39 #include <sys/param.h> 40 #include <sys/systm.h> 41 #include <machine/bus.h> 42 43 /* Proto types for all the bus_space structure functions */ 44 45 bs_protos(podulebus); 46 bs_protos(bs_notimpl); 47 48 /* Declare the podulebus bus space tag */ 49 50 struct bus_space podulebus_bs_tag = { 51 /* cookie */ 52 (void *) 2, /* Shift to apply to registers */ 53 54 /* mapping/unmapping */ 55 podulebus_bs_map, 56 podulebus_bs_unmap, 57 podulebus_bs_subregion, 58 59 /* allocation/deallocation */ 60 podulebus_bs_alloc, 61 podulebus_bs_free, 62 63 /* get kernel virtual address */ 64 0, /* there is no linear mapping */ 65 66 /* mmap bus space for userland */ 67 bs_notimpl_bs_mmap, /* there is no bus mapping ... well maybe EASI space? */ 68 69 /* barrier */ 70 podulebus_bs_barrier, 71 72 /* read (single) */ 73 podulebus_bs_r_1, 74 podulebus_bs_r_2, 75 podulebus_bs_r_4, 76 bs_notimpl_bs_r_8, 77 78 /* read multiple */ 79 podulebus_bs_rm_1, 80 podulebus_bs_rm_2, 81 bs_notimpl_bs_rm_4, 82 bs_notimpl_bs_rm_8, 83 84 /* read region */ 85 podulebus_bs_rr_1, 86 podulebus_bs_rr_2, 87 bs_notimpl_bs_rr_4, 88 bs_notimpl_bs_rr_8, 89 90 /* write (single) */ 91 podulebus_bs_w_1, 92 podulebus_bs_w_2, 93 podulebus_bs_w_4, 94 bs_notimpl_bs_w_8, 95 96 /* write multiple */ 97 podulebus_bs_wm_1, 98 podulebus_bs_wm_2, 99 bs_notimpl_bs_wm_4, 100 bs_notimpl_bs_wm_8, 101 102 /* write region */ 103 podulebus_bs_wr_1, 104 podulebus_bs_wr_2, 105 bs_notimpl_bs_wr_4, 106 bs_notimpl_bs_wr_8, 107 108 /* set multiple */ 109 bs_notimpl_bs_sm_1, 110 bs_notimpl_bs_sm_2, 111 bs_notimpl_bs_sm_4, 112 bs_notimpl_bs_sm_8, 113 114 /* set region */ 115 podulebus_bs_sr_1, 116 podulebus_bs_sr_2, 117 bs_notimpl_bs_sr_4, 118 bs_notimpl_bs_sr_8, 119 120 /* copy */ 121 bs_notimpl_bs_c_1, 122 bs_notimpl_bs_c_2, 123 bs_notimpl_bs_c_4, 124 bs_notimpl_bs_c_8, 125 }; 126 127 /* bus space functions */ 128 129 int 130 podulebus_bs_map(t, bpa, size, cacheable, bshp) 131 void *t; 132 bus_addr_t bpa; 133 bus_size_t size; 134 int cacheable; 135 bus_space_handle_t *bshp; 136 { 137 /* 138 * Temporary implementation as all I/O is already mapped etc. 139 * 140 * Eventually this function will do the mapping check for multiple maps 141 */ 142 *bshp = bpa; 143 return(0); 144 } 145 146 int 147 podulebus_bs_alloc(t, rstart, rend, size, alignment, boundary, cacheable, 148 bpap, bshp) 149 void *t; 150 bus_addr_t rstart, rend; 151 bus_size_t size, alignment, boundary; 152 int cacheable; 153 bus_addr_t *bpap; 154 bus_space_handle_t *bshp; 155 { 156 panic("podulebus_bs_alloc(): Help!"); 157 } 158 159 160 void 161 podulebus_bs_unmap(t, bsh, size) 162 void *t; 163 bus_space_handle_t bsh; 164 bus_size_t size; 165 { 166 /* 167 * Temporary implementation 168 */ 169 } 170 171 void 172 podulebus_bs_free(t, bsh, size) 173 void *t; 174 bus_space_handle_t bsh; 175 bus_size_t size; 176 { 177 178 panic("podulebus_bs_free(): Help!"); 179 /* podulebus_bs_unmap() does all that we need to do. */ 180 /* podulebus_bs_unmap(t, bsh, size);*/ 181 } 182 183 int 184 podulebus_bs_subregion(t, bsh, offset, size, nbshp) 185 void *t; 186 bus_space_handle_t bsh; 187 bus_size_t offset, size; 188 bus_space_handle_t *nbshp; 189 { 190 191 *nbshp = bsh + (offset << ((int)t)); 192 return (0); 193 } 194 195 void 196 podulebus_bs_barrier(t, bsh, offset, len, flags) 197 void *t; 198 bus_space_handle_t bsh; 199 bus_size_t offset, len; 200 int flags; 201 { 202 } 203 204 /* Rough-and-ready implementations from arm26 */ 205 206 void 207 podulebus_bs_rr_1(void *cookie, bus_space_handle_t bsh, 208 bus_size_t offset, u_int8_t *datap, bus_size_t count) 209 { 210 int i; 211 212 for (i = 0; i < count; i++) 213 datap[i] = podulebus_bs_r_1(cookie, bsh, offset + i); 214 } 215 216 void 217 podulebus_bs_rr_2(void *cookie, bus_space_handle_t bsh, 218 bus_size_t offset, u_int16_t *datap, bus_size_t count) 219 { 220 int i; 221 222 for (i = 0; i < count; i++) 223 datap[i] = podulebus_bs_r_2(cookie, bsh, offset + i); 224 } 225 226 void 227 podulebus_bs_wr_1(void *cookie, bus_space_handle_t bsh, 228 bus_size_t offset, u_int8_t const *datap, 229 bus_size_t count) 230 { 231 int i; 232 233 for (i = 0; i < count; i++) 234 podulebus_bs_w_1(cookie, bsh, offset + i, datap[i]); 235 } 236 237 void 238 podulebus_bs_wr_2(void *cookie, bus_space_handle_t bsh, 239 bus_size_t offset, u_int16_t const *datap, 240 bus_size_t count) 241 { 242 int i; 243 244 for (i = 0; i < count; i++) 245 podulebus_bs_w_2(cookie, bsh, offset + i, datap[i]); 246 } 247 248 void 249 podulebus_bs_sr_1(void *cookie, bus_space_handle_t bsh, 250 bus_size_t offset, u_int8_t value, bus_size_t count) 251 { 252 int i; 253 254 for (i = 0; i < count; i++) 255 podulebus_bs_w_1(cookie, bsh, offset + i, value); 256 } 257 258 void 259 podulebus_bs_sr_2(void *cookie, bus_space_handle_t bsh, 260 bus_size_t offset, u_int16_t value, bus_size_t count) 261 { 262 int i; 263 264 for (i = 0; i < count; i++) 265 podulebus_bs_w_2(cookie, bsh, offset + i, value); 266 } 267