xref: /freebsd/tools/bus_space/C/lang.c (revision 4af242aad17cf5b7b119fc5d17184711a7addccd)
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