10c2b180aSMarcel Moolenaar /*- 20c2b180aSMarcel Moolenaar * Copyright (c) 2014 Marcel Moolenaar 30c2b180aSMarcel Moolenaar * All rights reserved. 40c2b180aSMarcel Moolenaar * 50c2b180aSMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 60c2b180aSMarcel Moolenaar * modification, are permitted provided that the following conditions 70c2b180aSMarcel Moolenaar * are met: 80c2b180aSMarcel Moolenaar * 90c2b180aSMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 100c2b180aSMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 110c2b180aSMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 120c2b180aSMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 130c2b180aSMarcel Moolenaar * documentation and/or other materials provided with the distribution. 140c2b180aSMarcel Moolenaar * 150c2b180aSMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 160c2b180aSMarcel Moolenaar * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 170c2b180aSMarcel Moolenaar * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 180c2b180aSMarcel Moolenaar * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 190c2b180aSMarcel Moolenaar * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 200c2b180aSMarcel Moolenaar * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 210c2b180aSMarcel Moolenaar * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 220c2b180aSMarcel Moolenaar * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 230c2b180aSMarcel Moolenaar * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 240c2b180aSMarcel Moolenaar * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 250c2b180aSMarcel Moolenaar */ 260c2b180aSMarcel Moolenaar 270c2b180aSMarcel Moolenaar #include <sys/cdefs.h> 280c2b180aSMarcel Moolenaar __FBSDID("$FreeBSD$"); 290c2b180aSMarcel Moolenaar 300c2b180aSMarcel Moolenaar #include <sys/types.h> 310c2b180aSMarcel Moolenaar #include <errno.h> 320c2b180aSMarcel Moolenaar 33c0027d73SMarcel Moolenaar #include "bus.h" 349c2cdb1aSMarcel Moolenaar #include "busdma.h" 35c0027d73SMarcel Moolenaar #include "libbus.h" 360c2b180aSMarcel Moolenaar 379c2cdb1aSMarcel Moolenaar int16_t 38c0027d73SMarcel Moolenaar bus_read_1(int rid, long ofs) 390c2b180aSMarcel Moolenaar { 400c2b180aSMarcel Moolenaar uint8_t val; 410c2b180aSMarcel Moolenaar 420c2b180aSMarcel Moolenaar return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val); 430c2b180aSMarcel Moolenaar } 440c2b180aSMarcel Moolenaar 459c2cdb1aSMarcel Moolenaar int32_t 46c0027d73SMarcel Moolenaar bus_read_2(int rid, long ofs) 470c2b180aSMarcel Moolenaar { 480c2b180aSMarcel Moolenaar uint16_t val; 490c2b180aSMarcel Moolenaar 500c2b180aSMarcel Moolenaar return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val); 510c2b180aSMarcel Moolenaar } 520c2b180aSMarcel Moolenaar 530c2b180aSMarcel Moolenaar int64_t 54c0027d73SMarcel Moolenaar bus_read_4(int rid, long ofs) 550c2b180aSMarcel Moolenaar { 560c2b180aSMarcel Moolenaar uint32_t val; 570c2b180aSMarcel Moolenaar 580c2b180aSMarcel Moolenaar return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int64_t)val); 590c2b180aSMarcel Moolenaar } 600c2b180aSMarcel Moolenaar 610c2b180aSMarcel Moolenaar int 62c0027d73SMarcel Moolenaar bus_write_1(int rid, long ofs, uint8_t val) 630c2b180aSMarcel Moolenaar { 640c2b180aSMarcel Moolenaar 650c2b180aSMarcel Moolenaar return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0); 660c2b180aSMarcel Moolenaar } 670c2b180aSMarcel Moolenaar 680c2b180aSMarcel Moolenaar int 69c0027d73SMarcel Moolenaar bus_write_2(int rid, long ofs, uint16_t val) 700c2b180aSMarcel Moolenaar { 710c2b180aSMarcel Moolenaar 720c2b180aSMarcel Moolenaar return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0); 730c2b180aSMarcel Moolenaar } 740c2b180aSMarcel Moolenaar 750c2b180aSMarcel Moolenaar int 76c0027d73SMarcel Moolenaar bus_write_4(int rid, long ofs, uint32_t val) 770c2b180aSMarcel Moolenaar { 780c2b180aSMarcel Moolenaar 790c2b180aSMarcel Moolenaar return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0); 800c2b180aSMarcel Moolenaar } 810c2b180aSMarcel Moolenaar 820c2b180aSMarcel Moolenaar int 83c0027d73SMarcel Moolenaar bus_map(const char *dev) 840c2b180aSMarcel Moolenaar { 850c2b180aSMarcel Moolenaar 860c2b180aSMarcel Moolenaar return (bs_map(dev)); 870c2b180aSMarcel Moolenaar } 880c2b180aSMarcel Moolenaar 890c2b180aSMarcel Moolenaar int 90c0027d73SMarcel Moolenaar bus_unmap(int rid) 910c2b180aSMarcel Moolenaar { 920c2b180aSMarcel Moolenaar 930c2b180aSMarcel Moolenaar return ((!bs_unmap(rid)) ? errno : 0); 940c2b180aSMarcel Moolenaar } 950c2b180aSMarcel Moolenaar 960c2b180aSMarcel Moolenaar int 97c0027d73SMarcel Moolenaar bus_subregion(int rid, long ofs, long sz) 980c2b180aSMarcel Moolenaar { 990c2b180aSMarcel Moolenaar 1000c2b180aSMarcel Moolenaar return (bs_subregion(rid, ofs, sz)); 1010c2b180aSMarcel Moolenaar } 1029c2cdb1aSMarcel Moolenaar 1039c2cdb1aSMarcel Moolenaar int 1049c2cdb1aSMarcel Moolenaar busdma_tag_create(const char *dev, bus_addr_t align, bus_addr_t bndry, 1059c2cdb1aSMarcel Moolenaar bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz, 1069c2cdb1aSMarcel Moolenaar u_int datarate, u_int flags, busdma_tag_t *out_p) 1079c2cdb1aSMarcel Moolenaar { 1089c2cdb1aSMarcel Moolenaar int res; 1099c2cdb1aSMarcel Moolenaar 1109c2cdb1aSMarcel Moolenaar res = bd_tag_create(dev, align, bndry, maxaddr, maxsz, nsegs, maxsegsz, 1119c2cdb1aSMarcel Moolenaar datarate, flags); 1129c2cdb1aSMarcel Moolenaar if (res == -1) 1139c2cdb1aSMarcel Moolenaar return (errno); 1149c2cdb1aSMarcel Moolenaar *out_p = res; 1159c2cdb1aSMarcel Moolenaar return (0); 1169c2cdb1aSMarcel Moolenaar } 1179c2cdb1aSMarcel Moolenaar 1189c2cdb1aSMarcel Moolenaar int 1199c2cdb1aSMarcel Moolenaar busdma_tag_derive(busdma_tag_t tag, bus_addr_t align, bus_addr_t bndry, 1209c2cdb1aSMarcel Moolenaar bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz, 1219c2cdb1aSMarcel Moolenaar u_int datarate, u_int flags, busdma_tag_t *out_p) 1229c2cdb1aSMarcel Moolenaar { 1239c2cdb1aSMarcel Moolenaar int res; 1249c2cdb1aSMarcel Moolenaar 1259c2cdb1aSMarcel Moolenaar res = bd_tag_derive(tag, align, bndry, maxaddr, maxsz, nsegs, maxsegsz, 1269c2cdb1aSMarcel Moolenaar datarate, flags); 1279c2cdb1aSMarcel Moolenaar if (res == -1) 1289c2cdb1aSMarcel Moolenaar return (errno); 1299c2cdb1aSMarcel Moolenaar *out_p = res; 1309c2cdb1aSMarcel Moolenaar return (0); 1319c2cdb1aSMarcel Moolenaar } 1329c2cdb1aSMarcel Moolenaar 1339c2cdb1aSMarcel Moolenaar int 1349c2cdb1aSMarcel Moolenaar busdma_tag_destroy(busdma_tag_t tag) 1359c2cdb1aSMarcel Moolenaar { 1369c2cdb1aSMarcel Moolenaar 1379c2cdb1aSMarcel Moolenaar return (bd_tag_destroy(tag)); 1389c2cdb1aSMarcel Moolenaar } 1399c2cdb1aSMarcel Moolenaar 1406f769b73SMarcel Moolenaar int 1416f769b73SMarcel Moolenaar busdma_mem_alloc(busdma_tag_t tag, u_int flags, busdma_md_t *out_p) 1426f769b73SMarcel Moolenaar { 1436f769b73SMarcel Moolenaar int res; 1446f769b73SMarcel Moolenaar 1456f769b73SMarcel Moolenaar res = bd_mem_alloc(tag, flags); 1466f769b73SMarcel Moolenaar if (res == -1) 1476f769b73SMarcel Moolenaar return (errno); 1486f769b73SMarcel Moolenaar *out_p = res; 1496f769b73SMarcel Moolenaar return (0); 1506f769b73SMarcel Moolenaar } 1516f769b73SMarcel Moolenaar 1526f769b73SMarcel Moolenaar int 1536f769b73SMarcel Moolenaar busdma_mem_free(busdma_md_t md) 1546f769b73SMarcel Moolenaar { 1556f769b73SMarcel Moolenaar 1566f769b73SMarcel Moolenaar return (bd_mem_free(md)); 1576f769b73SMarcel Moolenaar } 158cc606478SMarcel Moolenaar 15922900685SMarcel Moolenaar int 16022900685SMarcel Moolenaar busdma_md_create(busdma_tag_t tag, u_int flags, busdma_md_t *out_p) 16122900685SMarcel Moolenaar { 16222900685SMarcel Moolenaar int res; 16322900685SMarcel Moolenaar 16422900685SMarcel Moolenaar res = bd_md_create(tag, flags); 16522900685SMarcel Moolenaar if (res == -1) 16622900685SMarcel Moolenaar return (errno); 16722900685SMarcel Moolenaar *out_p = res; 16822900685SMarcel Moolenaar return (0); 16922900685SMarcel Moolenaar } 17022900685SMarcel Moolenaar 17122900685SMarcel Moolenaar int 17222900685SMarcel Moolenaar busdma_md_destroy(busdma_md_t md) 17322900685SMarcel Moolenaar { 17422900685SMarcel Moolenaar 17522900685SMarcel Moolenaar return (bd_md_destroy(md)); 17622900685SMarcel Moolenaar } 17722900685SMarcel Moolenaar 17822900685SMarcel Moolenaar int 17922900685SMarcel Moolenaar busdma_md_load(busdma_md_t md, void *buf, size_t len, u_int flags) 18022900685SMarcel Moolenaar { 18122900685SMarcel Moolenaar 18222900685SMarcel Moolenaar return (bd_md_load(md, buf, len, flags)); 18322900685SMarcel Moolenaar } 18422900685SMarcel Moolenaar 185*4af242aaSMarcel Moolenaar int 186*4af242aaSMarcel Moolenaar busdma_md_unload(busdma_md_t md) 187*4af242aaSMarcel Moolenaar { 188*4af242aaSMarcel Moolenaar 189*4af242aaSMarcel Moolenaar return (bd_md_unload(md)); 190*4af242aaSMarcel Moolenaar } 191*4af242aaSMarcel Moolenaar 192cc606478SMarcel Moolenaar busdma_seg_t 193cc606478SMarcel Moolenaar busdma_md_first_seg(busdma_md_t md, int space) 194cc606478SMarcel Moolenaar { 195cc606478SMarcel Moolenaar busdma_seg_t seg; 196cc606478SMarcel Moolenaar 197cc606478SMarcel Moolenaar seg = bd_md_first_seg(md, space); 198cc606478SMarcel Moolenaar return (seg); 199cc606478SMarcel Moolenaar } 200cc606478SMarcel Moolenaar 201cc606478SMarcel Moolenaar busdma_seg_t 202cc606478SMarcel Moolenaar busdma_md_next_seg(busdma_md_t md, busdma_seg_t seg) 203cc606478SMarcel Moolenaar { 204cc606478SMarcel Moolenaar 205cc606478SMarcel Moolenaar seg = bd_md_next_seg(md, seg); 206cc606478SMarcel Moolenaar return (seg); 207cc606478SMarcel Moolenaar } 208cc606478SMarcel Moolenaar 209cc606478SMarcel Moolenaar bus_addr_t 210cc606478SMarcel Moolenaar busdma_seg_get_addr(busdma_seg_t seg) 211cc606478SMarcel Moolenaar { 212cc606478SMarcel Moolenaar u_long addr; 213cc606478SMarcel Moolenaar int error; 214cc606478SMarcel Moolenaar 215cc606478SMarcel Moolenaar error = bd_seg_get_addr(seg, &addr); 216cc606478SMarcel Moolenaar return ((error) ? ~0UL : addr); 217cc606478SMarcel Moolenaar } 218cc606478SMarcel Moolenaar 219cc606478SMarcel Moolenaar bus_size_t 220cc606478SMarcel Moolenaar busdma_seg_get_size(busdma_seg_t seg) 221cc606478SMarcel Moolenaar { 222cc606478SMarcel Moolenaar u_long size; 223cc606478SMarcel Moolenaar int error; 224cc606478SMarcel Moolenaar 225cc606478SMarcel Moolenaar error = bd_seg_get_size(seg, &size); 226cc606478SMarcel Moolenaar return ((error) ? ~0UL : size); 227cc606478SMarcel Moolenaar } 228*4af242aaSMarcel Moolenaar 229*4af242aaSMarcel Moolenaar int 230*4af242aaSMarcel Moolenaar busdma_sync(busdma_md_t md, int op, bus_addr_t base, bus_size_t size) 231*4af242aaSMarcel Moolenaar { 232*4af242aaSMarcel Moolenaar 233*4af242aaSMarcel Moolenaar return (bd_sync(md, op, base, size)); 234*4af242aaSMarcel Moolenaar } 235