1 /*- 2 * Copyright (c) 2014 Marcel Moolenaar 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #include <sys/cdefs.h> 28 #include <sys/types.h> 29 #include <errno.h> 30 31 #include "bus.h" 32 #include "busdma.h" 33 #include "libbus.h" 34 35 int16_t 36 bus_read_1(int rid, long ofs) 37 { 38 uint8_t val; 39 40 return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val); 41 } 42 43 int32_t 44 bus_read_2(int rid, long ofs) 45 { 46 uint16_t val; 47 48 return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val); 49 } 50 51 int64_t 52 bus_read_4(int rid, long ofs) 53 { 54 uint32_t val; 55 56 return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int64_t)val); 57 } 58 59 int 60 bus_write_1(int rid, long ofs, uint8_t val) 61 { 62 63 return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0); 64 } 65 66 int 67 bus_write_2(int rid, long ofs, uint16_t val) 68 { 69 70 return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0); 71 } 72 73 int 74 bus_write_4(int rid, long ofs, uint32_t val) 75 { 76 77 return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0); 78 } 79 80 int 81 bus_map(const char *dev, const char *resource) 82 { 83 84 return (bs_map(dev, resource)); 85 } 86 87 int 88 bus_unmap(int rid) 89 { 90 91 return ((!bs_unmap(rid)) ? errno : 0); 92 } 93 94 int 95 bus_subregion(int rid, long ofs, long sz) 96 { 97 98 return (bs_subregion(rid, ofs, sz)); 99 } 100 101 int 102 busdma_tag_create(const char *dev, bus_addr_t align, bus_addr_t bndry, 103 bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz, 104 u_int datarate, u_int flags, busdma_tag_t *out_p) 105 { 106 int res; 107 108 res = bd_tag_create(dev, align, bndry, maxaddr, maxsz, nsegs, maxsegsz, 109 datarate, flags); 110 if (res == -1) 111 return (errno); 112 *out_p = res; 113 return (0); 114 } 115 116 int 117 busdma_tag_derive(busdma_tag_t tag, bus_addr_t align, bus_addr_t bndry, 118 bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz, 119 u_int datarate, u_int flags, busdma_tag_t *out_p) 120 { 121 int res; 122 123 res = bd_tag_derive(tag, align, bndry, maxaddr, maxsz, nsegs, maxsegsz, 124 datarate, flags); 125 if (res == -1) 126 return (errno); 127 *out_p = res; 128 return (0); 129 } 130 131 int 132 busdma_tag_destroy(busdma_tag_t tag) 133 { 134 135 return (bd_tag_destroy(tag)); 136 } 137 138 int 139 busdma_mem_alloc(busdma_tag_t tag, u_int flags, busdma_md_t *out_p) 140 { 141 int res; 142 143 res = bd_mem_alloc(tag, flags); 144 if (res == -1) 145 return (errno); 146 *out_p = res; 147 return (0); 148 } 149 150 int 151 busdma_mem_free(busdma_md_t md) 152 { 153 154 return (bd_mem_free(md)); 155 } 156 157 int 158 busdma_md_create(busdma_tag_t tag, u_int flags, busdma_md_t *out_p) 159 { 160 int res; 161 162 res = bd_md_create(tag, flags); 163 if (res == -1) 164 return (errno); 165 *out_p = res; 166 return (0); 167 } 168 169 int 170 busdma_md_destroy(busdma_md_t md) 171 { 172 173 return (bd_md_destroy(md)); 174 } 175 176 int 177 busdma_md_load(busdma_md_t md, void *buf, size_t len, u_int flags) 178 { 179 180 return (bd_md_load(md, buf, len, flags)); 181 } 182 183 int 184 busdma_md_unload(busdma_md_t md) 185 { 186 187 return (bd_md_unload(md)); 188 } 189 190 busdma_seg_t 191 busdma_md_first_seg(busdma_md_t md, int space) 192 { 193 busdma_seg_t seg; 194 195 seg = bd_md_first_seg(md, space); 196 return (seg); 197 } 198 199 busdma_seg_t 200 busdma_md_next_seg(busdma_md_t md, busdma_seg_t seg) 201 { 202 203 seg = bd_md_next_seg(md, seg); 204 return (seg); 205 } 206 207 bus_addr_t 208 busdma_seg_get_addr(busdma_seg_t seg) 209 { 210 u_long addr; 211 int error; 212 213 error = bd_seg_get_addr(seg, &addr); 214 return ((error) ? ~0UL : addr); 215 } 216 217 bus_size_t 218 busdma_seg_get_size(busdma_seg_t seg) 219 { 220 u_long size; 221 int error; 222 223 error = bd_seg_get_size(seg, &size); 224 return ((error) ? ~0UL : size); 225 } 226 227 int 228 busdma_sync(busdma_md_t md, int op) 229 { 230 231 return (bd_sync(md, op, 0UL, ~0UL)); 232 } 233 234 int 235 busdma_sync_range(busdma_md_t md, int op, bus_size_t ofs, bus_size_t len) 236 { 237 238 return (bd_sync(md, op, ofs, len)); 239 } 240