xref: /freebsd/tools/bus_space/C/lang.c (revision 6bfca4dcab07dad45a805879d954876b353c0810)
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/types.h>
280c2b180aSMarcel Moolenaar #include <errno.h>
290c2b180aSMarcel Moolenaar 
30c0027d73SMarcel Moolenaar #include "bus.h"
319c2cdb1aSMarcel Moolenaar #include "busdma.h"
32c0027d73SMarcel Moolenaar #include "libbus.h"
330c2b180aSMarcel Moolenaar 
349c2cdb1aSMarcel Moolenaar int16_t
bus_read_1(int rid,long ofs)35c0027d73SMarcel Moolenaar bus_read_1(int rid, long ofs)
360c2b180aSMarcel Moolenaar {
370c2b180aSMarcel Moolenaar 	uint8_t val;
380c2b180aSMarcel Moolenaar 
390c2b180aSMarcel Moolenaar 	return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val);
400c2b180aSMarcel Moolenaar }
410c2b180aSMarcel Moolenaar 
429c2cdb1aSMarcel Moolenaar int32_t
bus_read_2(int rid,long ofs)43c0027d73SMarcel Moolenaar bus_read_2(int rid, long ofs)
440c2b180aSMarcel Moolenaar {
450c2b180aSMarcel Moolenaar 	uint16_t val;
460c2b180aSMarcel Moolenaar 
470c2b180aSMarcel Moolenaar 	return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int)val);
480c2b180aSMarcel Moolenaar }
490c2b180aSMarcel Moolenaar 
500c2b180aSMarcel Moolenaar int64_t
bus_read_4(int rid,long ofs)51c0027d73SMarcel Moolenaar bus_read_4(int rid, long ofs)
520c2b180aSMarcel Moolenaar {
530c2b180aSMarcel Moolenaar 	uint32_t val;
540c2b180aSMarcel Moolenaar 
550c2b180aSMarcel Moolenaar 	return ((!bs_read(rid, ofs, &val, sizeof(val))) ? -1 : (int64_t)val);
560c2b180aSMarcel Moolenaar }
570c2b180aSMarcel Moolenaar 
580c2b180aSMarcel Moolenaar int
bus_write_1(int rid,long ofs,uint8_t val)59c0027d73SMarcel Moolenaar bus_write_1(int rid, long ofs, uint8_t val)
600c2b180aSMarcel Moolenaar {
610c2b180aSMarcel Moolenaar 
620c2b180aSMarcel Moolenaar 	return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0);
630c2b180aSMarcel Moolenaar }
640c2b180aSMarcel Moolenaar 
650c2b180aSMarcel Moolenaar int
bus_write_2(int rid,long ofs,uint16_t val)66c0027d73SMarcel Moolenaar bus_write_2(int rid, long ofs, uint16_t val)
670c2b180aSMarcel Moolenaar {
680c2b180aSMarcel Moolenaar 
690c2b180aSMarcel Moolenaar 	return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0);
700c2b180aSMarcel Moolenaar }
710c2b180aSMarcel Moolenaar 
720c2b180aSMarcel Moolenaar int
bus_write_4(int rid,long ofs,uint32_t val)73c0027d73SMarcel Moolenaar bus_write_4(int rid, long ofs, uint32_t val)
740c2b180aSMarcel Moolenaar {
750c2b180aSMarcel Moolenaar 
760c2b180aSMarcel Moolenaar 	return ((!bs_write(rid, ofs, &val, sizeof(val))) ? errno : 0);
770c2b180aSMarcel Moolenaar }
780c2b180aSMarcel Moolenaar 
790c2b180aSMarcel Moolenaar int
bus_map(const char * dev,const char * resource)8071d80fbaSMarcel Moolenaar bus_map(const char *dev, const char *resource)
810c2b180aSMarcel Moolenaar {
820c2b180aSMarcel Moolenaar 
8371d80fbaSMarcel Moolenaar 	return (bs_map(dev, resource));
840c2b180aSMarcel Moolenaar }
850c2b180aSMarcel Moolenaar 
860c2b180aSMarcel Moolenaar int
bus_unmap(int rid)87c0027d73SMarcel Moolenaar bus_unmap(int rid)
880c2b180aSMarcel Moolenaar {
890c2b180aSMarcel Moolenaar 
900c2b180aSMarcel Moolenaar 	return ((!bs_unmap(rid)) ? errno : 0);
910c2b180aSMarcel Moolenaar }
920c2b180aSMarcel Moolenaar 
930c2b180aSMarcel Moolenaar int
bus_subregion(int rid,long ofs,long sz)94c0027d73SMarcel Moolenaar bus_subregion(int rid, long ofs, long sz)
950c2b180aSMarcel Moolenaar {
960c2b180aSMarcel Moolenaar 
970c2b180aSMarcel Moolenaar 	return (bs_subregion(rid, ofs, sz));
980c2b180aSMarcel Moolenaar }
999c2cdb1aSMarcel Moolenaar 
1009c2cdb1aSMarcel Moolenaar int
busdma_tag_create(const char * dev,bus_addr_t align,bus_addr_t bndry,bus_addr_t maxaddr,bus_size_t maxsz,u_int nsegs,bus_size_t maxsegsz,u_int datarate,u_int flags,busdma_tag_t * out_p)1019c2cdb1aSMarcel Moolenaar busdma_tag_create(const char *dev, bus_addr_t align, bus_addr_t bndry,
1029c2cdb1aSMarcel Moolenaar     bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz,
1039c2cdb1aSMarcel Moolenaar     u_int datarate, u_int flags, busdma_tag_t *out_p)
1049c2cdb1aSMarcel Moolenaar {
1059c2cdb1aSMarcel Moolenaar 	int res;
1069c2cdb1aSMarcel Moolenaar 
1079c2cdb1aSMarcel Moolenaar 	res = bd_tag_create(dev, align, bndry, maxaddr, maxsz, nsegs, maxsegsz,
1089c2cdb1aSMarcel Moolenaar 	    datarate, flags);
1099c2cdb1aSMarcel Moolenaar 	if (res == -1)
1109c2cdb1aSMarcel Moolenaar 		return (errno);
1119c2cdb1aSMarcel Moolenaar 	*out_p = res;
1129c2cdb1aSMarcel Moolenaar 	return (0);
1139c2cdb1aSMarcel Moolenaar }
1149c2cdb1aSMarcel Moolenaar 
1159c2cdb1aSMarcel Moolenaar int
busdma_tag_derive(busdma_tag_t tag,bus_addr_t align,bus_addr_t bndry,bus_addr_t maxaddr,bus_size_t maxsz,u_int nsegs,bus_size_t maxsegsz,u_int datarate,u_int flags,busdma_tag_t * out_p)1169c2cdb1aSMarcel Moolenaar busdma_tag_derive(busdma_tag_t tag, bus_addr_t align, bus_addr_t bndry,
1179c2cdb1aSMarcel Moolenaar     bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz,
1189c2cdb1aSMarcel Moolenaar     u_int datarate, u_int flags, busdma_tag_t *out_p)
1199c2cdb1aSMarcel Moolenaar {
1209c2cdb1aSMarcel Moolenaar 	int res;
1219c2cdb1aSMarcel Moolenaar 
1229c2cdb1aSMarcel Moolenaar 	res = bd_tag_derive(tag, align, bndry, maxaddr, maxsz, nsegs, maxsegsz,
1239c2cdb1aSMarcel Moolenaar 	    datarate, flags);
1249c2cdb1aSMarcel Moolenaar 	if (res == -1)
1259c2cdb1aSMarcel Moolenaar 		return (errno);
1269c2cdb1aSMarcel Moolenaar 	*out_p = res;
1279c2cdb1aSMarcel Moolenaar 	return (0);
1289c2cdb1aSMarcel Moolenaar }
1299c2cdb1aSMarcel Moolenaar 
1309c2cdb1aSMarcel Moolenaar int
busdma_tag_destroy(busdma_tag_t tag)1319c2cdb1aSMarcel Moolenaar busdma_tag_destroy(busdma_tag_t tag)
1329c2cdb1aSMarcel Moolenaar {
1339c2cdb1aSMarcel Moolenaar 
1349c2cdb1aSMarcel Moolenaar 	return (bd_tag_destroy(tag));
1359c2cdb1aSMarcel Moolenaar }
1369c2cdb1aSMarcel Moolenaar 
1376f769b73SMarcel Moolenaar int
busdma_mem_alloc(busdma_tag_t tag,u_int flags,busdma_md_t * out_p)1386f769b73SMarcel Moolenaar busdma_mem_alloc(busdma_tag_t tag, u_int flags, busdma_md_t *out_p)
1396f769b73SMarcel Moolenaar {
1406f769b73SMarcel Moolenaar 	int res;
1416f769b73SMarcel Moolenaar 
1426f769b73SMarcel Moolenaar 	res = bd_mem_alloc(tag, flags);
1436f769b73SMarcel Moolenaar 	if (res == -1)
1446f769b73SMarcel Moolenaar 		return (errno);
1456f769b73SMarcel Moolenaar 	*out_p = res;
1466f769b73SMarcel Moolenaar 	return (0);
1476f769b73SMarcel Moolenaar }
1486f769b73SMarcel Moolenaar 
1496f769b73SMarcel Moolenaar int
busdma_mem_free(busdma_md_t md)1506f769b73SMarcel Moolenaar busdma_mem_free(busdma_md_t md)
1516f769b73SMarcel Moolenaar {
1526f769b73SMarcel Moolenaar 
1536f769b73SMarcel Moolenaar 	return (bd_mem_free(md));
1546f769b73SMarcel Moolenaar }
155cc606478SMarcel Moolenaar 
15622900685SMarcel Moolenaar int
busdma_md_create(busdma_tag_t tag,u_int flags,busdma_md_t * out_p)15722900685SMarcel Moolenaar busdma_md_create(busdma_tag_t tag, u_int flags, busdma_md_t *out_p)
15822900685SMarcel Moolenaar {
15922900685SMarcel Moolenaar 	int res;
16022900685SMarcel Moolenaar 
16122900685SMarcel Moolenaar 	res = bd_md_create(tag, flags);
16222900685SMarcel Moolenaar 	if (res == -1)
16322900685SMarcel Moolenaar 		return (errno);
16422900685SMarcel Moolenaar 	*out_p = res;
16522900685SMarcel Moolenaar 	return (0);
16622900685SMarcel Moolenaar }
16722900685SMarcel Moolenaar 
16822900685SMarcel Moolenaar int
busdma_md_destroy(busdma_md_t md)16922900685SMarcel Moolenaar busdma_md_destroy(busdma_md_t md)
17022900685SMarcel Moolenaar {
17122900685SMarcel Moolenaar 
17222900685SMarcel Moolenaar 	return (bd_md_destroy(md));
17322900685SMarcel Moolenaar }
17422900685SMarcel Moolenaar 
17522900685SMarcel Moolenaar int
busdma_md_load(busdma_md_t md,void * buf,size_t len,u_int flags)17622900685SMarcel Moolenaar busdma_md_load(busdma_md_t md, void *buf, size_t len, u_int flags)
17722900685SMarcel Moolenaar {
17822900685SMarcel Moolenaar 
17922900685SMarcel Moolenaar 	return (bd_md_load(md, buf, len, flags));
18022900685SMarcel Moolenaar }
18122900685SMarcel Moolenaar 
1824af242aaSMarcel Moolenaar int
busdma_md_unload(busdma_md_t md)1834af242aaSMarcel Moolenaar busdma_md_unload(busdma_md_t md)
1844af242aaSMarcel Moolenaar {
1854af242aaSMarcel Moolenaar 
1864af242aaSMarcel Moolenaar 	return (bd_md_unload(md));
1874af242aaSMarcel Moolenaar }
1884af242aaSMarcel Moolenaar 
189cc606478SMarcel Moolenaar busdma_seg_t
busdma_md_first_seg(busdma_md_t md,int space)190cc606478SMarcel Moolenaar busdma_md_first_seg(busdma_md_t md, int space)
191cc606478SMarcel Moolenaar {
192cc606478SMarcel Moolenaar 	busdma_seg_t seg;
193cc606478SMarcel Moolenaar 
194cc606478SMarcel Moolenaar 	seg = bd_md_first_seg(md, space);
195cc606478SMarcel Moolenaar 	return (seg);
196cc606478SMarcel Moolenaar }
197cc606478SMarcel Moolenaar 
198cc606478SMarcel Moolenaar busdma_seg_t
busdma_md_next_seg(busdma_md_t md,busdma_seg_t seg)199cc606478SMarcel Moolenaar busdma_md_next_seg(busdma_md_t md, busdma_seg_t seg)
200cc606478SMarcel Moolenaar {
201cc606478SMarcel Moolenaar 
202cc606478SMarcel Moolenaar 	seg = bd_md_next_seg(md, seg);
203cc606478SMarcel Moolenaar 	return (seg);
204cc606478SMarcel Moolenaar }
205cc606478SMarcel Moolenaar 
206cc606478SMarcel Moolenaar bus_addr_t
busdma_seg_get_addr(busdma_seg_t seg)207cc606478SMarcel Moolenaar busdma_seg_get_addr(busdma_seg_t seg)
208cc606478SMarcel Moolenaar {
209cc606478SMarcel Moolenaar 	u_long addr;
210cc606478SMarcel Moolenaar 	int error;
211cc606478SMarcel Moolenaar 
212cc606478SMarcel Moolenaar 	error = bd_seg_get_addr(seg, &addr);
213cc606478SMarcel Moolenaar 	return ((error) ? ~0UL : addr);
214cc606478SMarcel Moolenaar }
215cc606478SMarcel Moolenaar 
216cc606478SMarcel Moolenaar bus_size_t
busdma_seg_get_size(busdma_seg_t seg)217cc606478SMarcel Moolenaar busdma_seg_get_size(busdma_seg_t seg)
218cc606478SMarcel Moolenaar {
219cc606478SMarcel Moolenaar 	u_long size;
220cc606478SMarcel Moolenaar 	int error;
221cc606478SMarcel Moolenaar 
222cc606478SMarcel Moolenaar 	error = bd_seg_get_size(seg, &size);
223cc606478SMarcel Moolenaar 	return ((error) ? ~0UL : size);
224cc606478SMarcel Moolenaar }
2254af242aaSMarcel Moolenaar 
2264af242aaSMarcel Moolenaar int
busdma_sync(busdma_md_t md,int op)227*015b8583SMarcel Moolenaar busdma_sync(busdma_md_t md, int op)
2284af242aaSMarcel Moolenaar {
2294af242aaSMarcel Moolenaar 
230*015b8583SMarcel Moolenaar 	return (bd_sync(md, op, 0UL, ~0UL));
231*015b8583SMarcel Moolenaar }
232*015b8583SMarcel Moolenaar 
233*015b8583SMarcel Moolenaar int
busdma_sync_range(busdma_md_t md,int op,bus_size_t ofs,bus_size_t len)234*015b8583SMarcel Moolenaar busdma_sync_range(busdma_md_t md, int op, bus_size_t ofs, bus_size_t len)
235*015b8583SMarcel Moolenaar {
236*015b8583SMarcel Moolenaar 
237*015b8583SMarcel Moolenaar 	return (bd_sync(md, op, ofs, len));
2384af242aaSMarcel Moolenaar }
239