xref: /freebsd/tools/bus_space/Python/lang.c (revision 1d386b48)
10c2b180aSMarcel Moolenaar /*-
2cc606478SMarcel Moolenaar  * Copyright (c) 2014, 2015 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 #include <Python.h>
290c2b180aSMarcel Moolenaar 
30c0027d73SMarcel Moolenaar #include "bus.h"
319c2cdb1aSMarcel Moolenaar #include "busdma.h"
320c2b180aSMarcel Moolenaar 
330c2b180aSMarcel Moolenaar static PyObject *
bus_read_1(PyObject * self,PyObject * args)340c2b180aSMarcel Moolenaar bus_read_1(PyObject *self, PyObject *args)
350c2b180aSMarcel Moolenaar {
360c2b180aSMarcel Moolenaar 	long ofs;
370c2b180aSMarcel Moolenaar 	int rid;
380c2b180aSMarcel Moolenaar 	uint8_t val;
390c2b180aSMarcel Moolenaar 
400c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "il", &rid, &ofs))
410c2b180aSMarcel Moolenaar 		return (NULL);
420c2b180aSMarcel Moolenaar 	if (!bs_read(rid, ofs, &val, sizeof(val))) {
430c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
440c2b180aSMarcel Moolenaar 		return (NULL);
450c2b180aSMarcel Moolenaar 	}
460c2b180aSMarcel Moolenaar 	return (Py_BuildValue("B", val));
470c2b180aSMarcel Moolenaar }
480c2b180aSMarcel Moolenaar 
490c2b180aSMarcel Moolenaar static PyObject *
bus_read_2(PyObject * self,PyObject * args)500c2b180aSMarcel Moolenaar bus_read_2(PyObject *self, PyObject *args)
510c2b180aSMarcel Moolenaar {
520c2b180aSMarcel Moolenaar 	long ofs;
530c2b180aSMarcel Moolenaar 	int rid;
540c2b180aSMarcel Moolenaar 	uint16_t val;
550c2b180aSMarcel Moolenaar 
560c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "il", &rid, &ofs))
570c2b180aSMarcel Moolenaar 		return (NULL);
580c2b180aSMarcel Moolenaar 	if (!bs_read(rid, ofs, &val, sizeof(val))) {
590c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
600c2b180aSMarcel Moolenaar 		return (NULL);
610c2b180aSMarcel Moolenaar 	}
620c2b180aSMarcel Moolenaar 	return (Py_BuildValue("H", val));
630c2b180aSMarcel Moolenaar }
640c2b180aSMarcel Moolenaar 
650c2b180aSMarcel Moolenaar static PyObject *
bus_read_4(PyObject * self,PyObject * args)660c2b180aSMarcel Moolenaar bus_read_4(PyObject *self, PyObject *args)
670c2b180aSMarcel Moolenaar {
680c2b180aSMarcel Moolenaar 	long ofs;
690c2b180aSMarcel Moolenaar 	int rid;
700c2b180aSMarcel Moolenaar 	uint32_t val;
710c2b180aSMarcel Moolenaar 
720c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "il", &rid, &ofs))
730c2b180aSMarcel Moolenaar 		return (NULL);
740c2b180aSMarcel Moolenaar 	if (!bs_read(rid, ofs, &val, sizeof(val))) {
750c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
760c2b180aSMarcel Moolenaar 		return (NULL);
770c2b180aSMarcel Moolenaar 	}
780c2b180aSMarcel Moolenaar 	return (Py_BuildValue("I", val));
790c2b180aSMarcel Moolenaar }
800c2b180aSMarcel Moolenaar 
810c2b180aSMarcel Moolenaar static PyObject *
bus_write_1(PyObject * self,PyObject * args)820c2b180aSMarcel Moolenaar bus_write_1(PyObject *self, PyObject *args)
830c2b180aSMarcel Moolenaar {
840c2b180aSMarcel Moolenaar 	long ofs;
850c2b180aSMarcel Moolenaar 	int rid;
860c2b180aSMarcel Moolenaar 	uint8_t val;
870c2b180aSMarcel Moolenaar 
880c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ilB", &rid, &ofs, &val))
890c2b180aSMarcel Moolenaar 		return (NULL);
900c2b180aSMarcel Moolenaar 	if (!bs_write(rid, ofs, &val, sizeof(val))) {
910c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
920c2b180aSMarcel Moolenaar 		return (NULL);
930c2b180aSMarcel Moolenaar 	}
940c2b180aSMarcel Moolenaar 	Py_RETURN_NONE;
950c2b180aSMarcel Moolenaar }
960c2b180aSMarcel Moolenaar 
970c2b180aSMarcel Moolenaar static PyObject *
bus_write_2(PyObject * self,PyObject * args)980c2b180aSMarcel Moolenaar bus_write_2(PyObject *self, PyObject *args)
990c2b180aSMarcel Moolenaar {
1000c2b180aSMarcel Moolenaar 	long ofs;
1010c2b180aSMarcel Moolenaar 	int rid;
1020c2b180aSMarcel Moolenaar 	uint16_t val;
1030c2b180aSMarcel Moolenaar 
1040c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ilH", &rid, &ofs, &val))
1050c2b180aSMarcel Moolenaar 		return (NULL);
1060c2b180aSMarcel Moolenaar 	if (!bs_write(rid, ofs, &val, sizeof(val))) {
1070c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
1080c2b180aSMarcel Moolenaar 		return (NULL);
1090c2b180aSMarcel Moolenaar 	}
1100c2b180aSMarcel Moolenaar 	Py_RETURN_NONE;
1110c2b180aSMarcel Moolenaar }
1120c2b180aSMarcel Moolenaar 
1130c2b180aSMarcel Moolenaar static PyObject *
bus_write_4(PyObject * self,PyObject * args)1140c2b180aSMarcel Moolenaar bus_write_4(PyObject *self, PyObject *args)
1150c2b180aSMarcel Moolenaar {
1160c2b180aSMarcel Moolenaar 	long ofs;
1170c2b180aSMarcel Moolenaar 	int rid;
1180c2b180aSMarcel Moolenaar 	uint32_t val;
1190c2b180aSMarcel Moolenaar 
1200c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ilI", &rid, &ofs, &val))
1210c2b180aSMarcel Moolenaar 		return (NULL);
1220c2b180aSMarcel Moolenaar 	if (!bs_write(rid, ofs, &val, sizeof(val))) {
1230c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
1240c2b180aSMarcel Moolenaar 		return (NULL);
1250c2b180aSMarcel Moolenaar 	}
1260c2b180aSMarcel Moolenaar 	Py_RETURN_NONE;
1270c2b180aSMarcel Moolenaar }
1280c2b180aSMarcel Moolenaar 
1290c2b180aSMarcel Moolenaar static PyObject *
bus_map(PyObject * self,PyObject * args)1300c2b180aSMarcel Moolenaar bus_map(PyObject *self, PyObject *args)
1310c2b180aSMarcel Moolenaar {
13271d80fbaSMarcel Moolenaar 	char *dev, *resource;
1330c2b180aSMarcel Moolenaar 	int rid;
1340c2b180aSMarcel Moolenaar 
13571d80fbaSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ss", &dev, &resource))
1360c2b180aSMarcel Moolenaar 		return (NULL);
13771d80fbaSMarcel Moolenaar 	rid = bs_map(dev, resource);
1380c2b180aSMarcel Moolenaar 	if (rid == -1) {
1390c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
1400c2b180aSMarcel Moolenaar 		return (NULL);
1410c2b180aSMarcel Moolenaar 	}
1420c2b180aSMarcel Moolenaar 	return (Py_BuildValue("i", rid));
1430c2b180aSMarcel Moolenaar }
1440c2b180aSMarcel Moolenaar 
1450c2b180aSMarcel Moolenaar static PyObject *
bus_unmap(PyObject * self,PyObject * args)1460c2b180aSMarcel Moolenaar bus_unmap(PyObject *self, PyObject *args)
1470c2b180aSMarcel Moolenaar {
1480c2b180aSMarcel Moolenaar 	int rid;
1490c2b180aSMarcel Moolenaar 
1500c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "i", &rid))
1510c2b180aSMarcel Moolenaar 		return (NULL);
1520c2b180aSMarcel Moolenaar 	if (!bs_unmap(rid)) {
1530c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
1540c2b180aSMarcel Moolenaar 		return (NULL);
1550c2b180aSMarcel Moolenaar 	}
1560c2b180aSMarcel Moolenaar 	Py_RETURN_NONE;
1570c2b180aSMarcel Moolenaar }
1580c2b180aSMarcel Moolenaar 
1590c2b180aSMarcel Moolenaar static PyObject *
bus_subregion(PyObject * self,PyObject * args)1600c2b180aSMarcel Moolenaar bus_subregion(PyObject *self, PyObject *args)
1610c2b180aSMarcel Moolenaar {
1620c2b180aSMarcel Moolenaar 	long ofs, sz;
1630c2b180aSMarcel Moolenaar 	int rid0, rid;
1640c2b180aSMarcel Moolenaar 
1650c2b180aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ill", &rid0, &ofs, &sz))
1660c2b180aSMarcel Moolenaar 		return (NULL);
1670c2b180aSMarcel Moolenaar 	rid = bs_subregion(rid0, ofs, sz);
1680c2b180aSMarcel Moolenaar 	if (rid == -1) {
1690c2b180aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
1700c2b180aSMarcel Moolenaar 		return (NULL);
1710c2b180aSMarcel Moolenaar 	}
1720c2b180aSMarcel Moolenaar 	return (Py_BuildValue("i", rid));
1730c2b180aSMarcel Moolenaar }
1740c2b180aSMarcel Moolenaar 
1759c2cdb1aSMarcel Moolenaar static PyObject *
busdma_tag_create(PyObject * self,PyObject * args)1769c2cdb1aSMarcel Moolenaar busdma_tag_create(PyObject *self, PyObject *args)
1779c2cdb1aSMarcel Moolenaar {
1789c2cdb1aSMarcel Moolenaar 	char *dev;
1796f769b73SMarcel Moolenaar 	u_long align, bndry, maxaddr, maxsz, maxsegsz;
1806f769b73SMarcel Moolenaar 	u_int nsegs, datarate, flags;
1816f769b73SMarcel Moolenaar 	int tid;
1829c2cdb1aSMarcel Moolenaar 
1836f769b73SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "skkkkIkII", &dev, &align, &bndry,
1849c2cdb1aSMarcel Moolenaar 	    &maxaddr, &maxsz, &nsegs, &maxsegsz, &datarate, &flags))
1859c2cdb1aSMarcel Moolenaar 		return (NULL);
1869c2cdb1aSMarcel Moolenaar 	tid = bd_tag_create(dev, align, bndry, maxaddr, maxsz, nsegs,
1879c2cdb1aSMarcel Moolenaar 	    maxsegsz, datarate, flags);
1889c2cdb1aSMarcel Moolenaar 	if (tid == -1) {
1899c2cdb1aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
1909c2cdb1aSMarcel Moolenaar 		return (NULL);
1919c2cdb1aSMarcel Moolenaar 	}
1929c2cdb1aSMarcel Moolenaar 	return (Py_BuildValue("i", tid));
1939c2cdb1aSMarcel Moolenaar }
1949c2cdb1aSMarcel Moolenaar 
1959c2cdb1aSMarcel Moolenaar static PyObject *
busdma_tag_derive(PyObject * self,PyObject * args)1969c2cdb1aSMarcel Moolenaar busdma_tag_derive(PyObject *self, PyObject *args)
1979c2cdb1aSMarcel Moolenaar {
1986f769b73SMarcel Moolenaar 	u_long align, bndry, maxaddr, maxsz, maxsegsz;
1996f769b73SMarcel Moolenaar 	u_int nsegs, datarate, flags;
2006f769b73SMarcel Moolenaar 	int ptid, tid;
2019c2cdb1aSMarcel Moolenaar 
2026f769b73SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ikkkkIkII", &ptid, &align, &bndry,
2039c2cdb1aSMarcel Moolenaar 	    &maxaddr, &maxsz, &nsegs, &maxsegsz, &datarate, &flags))
2049c2cdb1aSMarcel Moolenaar 		return (NULL);
2059c2cdb1aSMarcel Moolenaar 	tid = bd_tag_derive(ptid, align, bndry, maxaddr, maxsz, nsegs,
2069c2cdb1aSMarcel Moolenaar 	    maxsegsz, datarate, flags);
2079c2cdb1aSMarcel Moolenaar 	if (tid == -1) {
2089c2cdb1aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
2099c2cdb1aSMarcel Moolenaar 		return (NULL);
2109c2cdb1aSMarcel Moolenaar 	}
2119c2cdb1aSMarcel Moolenaar 	return (Py_BuildValue("i", tid));
2129c2cdb1aSMarcel Moolenaar }
2139c2cdb1aSMarcel Moolenaar 
2149c2cdb1aSMarcel Moolenaar static PyObject *
busdma_tag_destroy(PyObject * self,PyObject * args)2159c2cdb1aSMarcel Moolenaar busdma_tag_destroy(PyObject *self, PyObject *args)
2169c2cdb1aSMarcel Moolenaar {
2179c2cdb1aSMarcel Moolenaar 	int error, tid;
2189c2cdb1aSMarcel Moolenaar 
2199c2cdb1aSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "i", &tid))
2209c2cdb1aSMarcel Moolenaar 		return (NULL);
2219c2cdb1aSMarcel Moolenaar 	error = bd_tag_destroy(tid);
2229c2cdb1aSMarcel Moolenaar 	if (error) {
2239c2cdb1aSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
2249c2cdb1aSMarcel Moolenaar 		return (NULL);
2259c2cdb1aSMarcel Moolenaar 	}
2269c2cdb1aSMarcel Moolenaar 	Py_RETURN_NONE;
2279c2cdb1aSMarcel Moolenaar }
2289c2cdb1aSMarcel Moolenaar 
2296f769b73SMarcel Moolenaar static PyObject *
busdma_md_create(PyObject * self,PyObject * args)23022900685SMarcel Moolenaar busdma_md_create(PyObject *self, PyObject *args)
23122900685SMarcel Moolenaar {
23222900685SMarcel Moolenaar 	u_int flags;
23322900685SMarcel Moolenaar 	int error, mdid, tid;
23422900685SMarcel Moolenaar 
23522900685SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "iI", &tid, &flags))
23622900685SMarcel Moolenaar 		return (NULL);
23722900685SMarcel Moolenaar 	mdid = bd_md_create(tid, flags);
23822900685SMarcel Moolenaar 	if (mdid == -1) {
23922900685SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
24022900685SMarcel Moolenaar 		return (NULL);
24122900685SMarcel Moolenaar 	}
24222900685SMarcel Moolenaar 	return (Py_BuildValue("i", mdid));
24322900685SMarcel Moolenaar }
24422900685SMarcel Moolenaar 
24522900685SMarcel Moolenaar static PyObject *
busdma_md_destroy(PyObject * self,PyObject * args)24622900685SMarcel Moolenaar busdma_md_destroy(PyObject *self, PyObject *args)
24722900685SMarcel Moolenaar {
24822900685SMarcel Moolenaar 	int error, mdid;
24922900685SMarcel Moolenaar 
25022900685SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "i", &mdid))
25122900685SMarcel Moolenaar 		return (NULL);
25222900685SMarcel Moolenaar 	error = bd_md_destroy(mdid);
25322900685SMarcel Moolenaar 	if (error) {
25422900685SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
25522900685SMarcel Moolenaar 		return (NULL);
25622900685SMarcel Moolenaar 	}
25722900685SMarcel Moolenaar 	Py_RETURN_NONE;
25822900685SMarcel Moolenaar }
25922900685SMarcel Moolenaar 
26022900685SMarcel Moolenaar static PyObject *
busdma_md_load(PyObject * self,PyObject * args)26122900685SMarcel Moolenaar busdma_md_load(PyObject *self, PyObject *args)
26222900685SMarcel Moolenaar {
26322900685SMarcel Moolenaar 	void *buf;
26422900685SMarcel Moolenaar 	u_long len;
26522900685SMarcel Moolenaar 	u_int flags;
26622900685SMarcel Moolenaar 	int error, mdid;
26722900685SMarcel Moolenaar 
26822900685SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "iwkI", &mdid, &buf, &len, &flags))
26922900685SMarcel Moolenaar 		return (NULL);
27022900685SMarcel Moolenaar 	error = bd_md_load(mdid, buf, len, flags);
27122900685SMarcel Moolenaar 	if (error) {
27222900685SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
27322900685SMarcel Moolenaar 		return (NULL);
27422900685SMarcel Moolenaar 	}
27522900685SMarcel Moolenaar 	Py_RETURN_NONE;
27622900685SMarcel Moolenaar }
27722900685SMarcel Moolenaar 
27822900685SMarcel Moolenaar static PyObject *
busdma_md_unload(PyObject * self,PyObject * args)2794af242aaSMarcel Moolenaar busdma_md_unload(PyObject *self, PyObject *args)
2804af242aaSMarcel Moolenaar {
2814af242aaSMarcel Moolenaar 	int error, mdid;
2824af242aaSMarcel Moolenaar 
2834af242aaSMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "i", &mdid))
2844af242aaSMarcel Moolenaar 		return (NULL);
2854af242aaSMarcel Moolenaar 	error = bd_md_unload(mdid);
2864af242aaSMarcel Moolenaar 	if (error) {
2874af242aaSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
2884af242aaSMarcel Moolenaar 		return (NULL);
2894af242aaSMarcel Moolenaar 	}
2904af242aaSMarcel Moolenaar 	Py_RETURN_NONE;
2914af242aaSMarcel Moolenaar }
2924af242aaSMarcel Moolenaar 
2934af242aaSMarcel Moolenaar static PyObject *
busdma_mem_alloc(PyObject * self,PyObject * args)2946f769b73SMarcel Moolenaar busdma_mem_alloc(PyObject *self, PyObject *args)
2956f769b73SMarcel Moolenaar {
2966f769b73SMarcel Moolenaar 	u_int flags;
2976f769b73SMarcel Moolenaar 	int mdid, tid;
2986f769b73SMarcel Moolenaar 
2996f769b73SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "iI", &tid, &flags))
3006f769b73SMarcel Moolenaar 		return (NULL);
3016f769b73SMarcel Moolenaar 	mdid = bd_mem_alloc(tid, flags);
3026f769b73SMarcel Moolenaar 	if (mdid == -1) {
3036f769b73SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(errno));
3046f769b73SMarcel Moolenaar 		return (NULL);
3056f769b73SMarcel Moolenaar 	}
3066f769b73SMarcel Moolenaar 	return (Py_BuildValue("i", mdid));
3076f769b73SMarcel Moolenaar }
3086f769b73SMarcel Moolenaar 
3096f769b73SMarcel Moolenaar static PyObject *
busdma_mem_free(PyObject * self,PyObject * args)3106f769b73SMarcel Moolenaar busdma_mem_free(PyObject *self, PyObject *args)
3116f769b73SMarcel Moolenaar {
3126f769b73SMarcel Moolenaar 	int error, mdid;
3136f769b73SMarcel Moolenaar 
3146f769b73SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "i", &mdid))
3156f769b73SMarcel Moolenaar 		return (NULL);
3166f769b73SMarcel Moolenaar 	error = bd_mem_free(mdid);
3176f769b73SMarcel Moolenaar 	if (error) {
3186f769b73SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
3196f769b73SMarcel Moolenaar 		return (NULL);
3206f769b73SMarcel Moolenaar 	}
3216f769b73SMarcel Moolenaar 	Py_RETURN_NONE;
3226f769b73SMarcel Moolenaar }
3236f769b73SMarcel Moolenaar 
324cc606478SMarcel Moolenaar static PyObject *
busdma_md_first_seg(PyObject * self,PyObject * args)325cc606478SMarcel Moolenaar busdma_md_first_seg(PyObject *self, PyObject *args)
326cc606478SMarcel Moolenaar {
327cc606478SMarcel Moolenaar 	int error, mdid, sid, what;
328cc606478SMarcel Moolenaar 
329cc606478SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ii", &mdid, &what))
330cc606478SMarcel Moolenaar 		return (NULL);
331cc606478SMarcel Moolenaar 	sid = bd_md_first_seg(mdid, what);
3324af242aaSMarcel Moolenaar 	if (sid == -1)
3334af242aaSMarcel Moolenaar 		Py_RETURN_NONE;
334cc606478SMarcel Moolenaar 	return (Py_BuildValue("i", sid));
335cc606478SMarcel Moolenaar }
336cc606478SMarcel Moolenaar 
337cc606478SMarcel Moolenaar static PyObject *
busdma_md_next_seg(PyObject * self,PyObject * args)338cc606478SMarcel Moolenaar busdma_md_next_seg(PyObject *self, PyObject *args)
339cc606478SMarcel Moolenaar {
340cc606478SMarcel Moolenaar 	int error, mdid, sid;
341cc606478SMarcel Moolenaar 
342cc606478SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ii", &mdid, &sid))
343cc606478SMarcel Moolenaar 		return (NULL);
344cc606478SMarcel Moolenaar 	sid = bd_md_next_seg(mdid, sid);
3454af242aaSMarcel Moolenaar 	if (sid == -1)
3464af242aaSMarcel Moolenaar 		Py_RETURN_NONE;
347cc606478SMarcel Moolenaar 	return (Py_BuildValue("i", sid));
348cc606478SMarcel Moolenaar }
349cc606478SMarcel Moolenaar 
350cc606478SMarcel Moolenaar static PyObject *
busdma_seg_get_addr(PyObject * self,PyObject * args)351cc606478SMarcel Moolenaar busdma_seg_get_addr(PyObject *self, PyObject *args)
352cc606478SMarcel Moolenaar {
353cc606478SMarcel Moolenaar 	u_long addr;
354cc606478SMarcel Moolenaar 	int error, sid;
355cc606478SMarcel Moolenaar 
356cc606478SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "i", &sid))
357cc606478SMarcel Moolenaar 		return (NULL);
358cc606478SMarcel Moolenaar 	error = bd_seg_get_addr(sid, &addr);
359cc606478SMarcel Moolenaar 	if (error) {
360cc606478SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
361cc606478SMarcel Moolenaar 		return (NULL);
362cc606478SMarcel Moolenaar 	}
363cc606478SMarcel Moolenaar 	return (Py_BuildValue("k", addr));
364cc606478SMarcel Moolenaar }
365cc606478SMarcel Moolenaar 
366cc606478SMarcel Moolenaar static PyObject *
busdma_seg_get_size(PyObject * self,PyObject * args)367cc606478SMarcel Moolenaar busdma_seg_get_size(PyObject *self, PyObject *args)
368cc606478SMarcel Moolenaar {
369cc606478SMarcel Moolenaar 	u_long size;
370cc606478SMarcel Moolenaar 	int error, sid;
371cc606478SMarcel Moolenaar 
372cc606478SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "i", &sid))
373cc606478SMarcel Moolenaar 		return (NULL);
374cc606478SMarcel Moolenaar 	error = bd_seg_get_size(sid, &size);
375cc606478SMarcel Moolenaar 	if (error) {
376cc606478SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
377cc606478SMarcel Moolenaar 		return (NULL);
378cc606478SMarcel Moolenaar 	}
379cc606478SMarcel Moolenaar 	return (Py_BuildValue("k", size));
380cc606478SMarcel Moolenaar }
381cc606478SMarcel Moolenaar 
3824af242aaSMarcel Moolenaar static PyObject *
busdma_sync(PyObject * self,PyObject * args)3834af242aaSMarcel Moolenaar busdma_sync(PyObject *self, PyObject *args)
3844af242aaSMarcel Moolenaar {
3854af242aaSMarcel Moolenaar 	int error, mdid, op;
3864af242aaSMarcel Moolenaar 
387015b8583SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "ii", &mdid, &op))
3884af242aaSMarcel Moolenaar 		return (NULL);
389015b8583SMarcel Moolenaar 	error = bd_sync(mdid, op, 0UL, ~0UL);
390015b8583SMarcel Moolenaar 	if (error) {
391015b8583SMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
392015b8583SMarcel Moolenaar 		return (NULL);
393015b8583SMarcel Moolenaar 	}
394015b8583SMarcel Moolenaar 	Py_RETURN_NONE;
395015b8583SMarcel Moolenaar }
396015b8583SMarcel Moolenaar 
397015b8583SMarcel Moolenaar static PyObject *
busdma_sync_range(PyObject * self,PyObject * args)398015b8583SMarcel Moolenaar busdma_sync_range(PyObject *self, PyObject *args)
399015b8583SMarcel Moolenaar {
400015b8583SMarcel Moolenaar 	u_long ofs, len;
401015b8583SMarcel Moolenaar 	int error, mdid, op;
402015b8583SMarcel Moolenaar 
403015b8583SMarcel Moolenaar 	if (!PyArg_ParseTuple(args, "iikk", &mdid, &op, &ofs, &len))
404015b8583SMarcel Moolenaar 		return (NULL);
405015b8583SMarcel Moolenaar 	error = bd_sync(mdid, op, ofs, len);
4064af242aaSMarcel Moolenaar 	if (error) {
4074af242aaSMarcel Moolenaar 		PyErr_SetString(PyExc_IOError, strerror(error));
4084af242aaSMarcel Moolenaar 		return (NULL);
4094af242aaSMarcel Moolenaar 	}
4104af242aaSMarcel Moolenaar 	Py_RETURN_NONE;
4114af242aaSMarcel Moolenaar }
4124af242aaSMarcel Moolenaar 
413da4f5bdaSMarcel Moolenaar /*
414da4f5bdaSMarcel Moolenaar  * Module methods and initialization.
415da4f5bdaSMarcel Moolenaar  */
416da4f5bdaSMarcel Moolenaar 
417da4f5bdaSMarcel Moolenaar static char bus_docstr[] = "Access to H/W bus memory and register areas.";
418da4f5bdaSMarcel Moolenaar 
419c0027d73SMarcel Moolenaar static PyMethodDef bus_methods[] = {
4200c2b180aSMarcel Moolenaar     { "read_1", bus_read_1, METH_VARARGS, "Read a 1-byte data item." },
4210c2b180aSMarcel Moolenaar     { "read_2", bus_read_2, METH_VARARGS, "Read a 2-byte data item." },
4220c2b180aSMarcel Moolenaar     { "read_4", bus_read_4, METH_VARARGS, "Read a 4-byte data item." },
4230c2b180aSMarcel Moolenaar 
4240c2b180aSMarcel Moolenaar     { "write_1", bus_write_1, METH_VARARGS, "Write a 1-byte data item." },
4250c2b180aSMarcel Moolenaar     { "write_2", bus_write_2, METH_VARARGS, "Write a 2-byte data item." },
4260c2b180aSMarcel Moolenaar     { "write_4", bus_write_4, METH_VARARGS, "Write a 4-byte data item." },
4270c2b180aSMarcel Moolenaar 
4280c2b180aSMarcel Moolenaar     { "map", bus_map, METH_VARARGS,
4290c2b180aSMarcel Moolenaar 	"Return a resource ID for a device file created by proto(4)" },
4300c2b180aSMarcel Moolenaar     { "unmap", bus_unmap, METH_VARARGS,
4310c2b180aSMarcel Moolenaar 	"Free a resource ID" },
4320c2b180aSMarcel Moolenaar     { "subregion", bus_subregion, METH_VARARGS,
4330c2b180aSMarcel Moolenaar 	"Return a resource ID for a subregion of another resource ID" },
4340c2b180aSMarcel Moolenaar 
4350c2b180aSMarcel Moolenaar     { NULL, NULL, 0, NULL }
4360c2b180aSMarcel Moolenaar };
4370c2b180aSMarcel Moolenaar 
438da4f5bdaSMarcel Moolenaar static char busdma_docstr[] = "A bus- and device-independent interface"
439da4f5bdaSMarcel Moolenaar     " to Direct Memory Access (DMA) mechanisms.";
440da4f5bdaSMarcel Moolenaar 
4419c2cdb1aSMarcel Moolenaar static PyMethodDef busdma_methods[] = {
4426f769b73SMarcel Moolenaar     { "tag_create", busdma_tag_create, METH_VARARGS,
4436f769b73SMarcel Moolenaar 	"Create a root tag." },
4446f769b73SMarcel Moolenaar     { "tag_derive", busdma_tag_derive, METH_VARARGS,
4456f769b73SMarcel Moolenaar 	"Derive a child tag." },
4466f769b73SMarcel Moolenaar     { "tag_destroy", busdma_tag_destroy, METH_VARARGS,
4476f769b73SMarcel Moolenaar 	"Destroy a tag." },
44822900685SMarcel Moolenaar 
44922900685SMarcel Moolenaar     { "md_create", busdma_md_create, METH_VARARGS,
45022900685SMarcel Moolenaar 	"Create a new and empty memory descriptor." },
45122900685SMarcel Moolenaar     { "md_destroy", busdma_md_destroy, METH_VARARGS,
45222900685SMarcel Moolenaar 	"Destroy a previously created memory descriptor." },
45322900685SMarcel Moolenaar     { "md_load", busdma_md_load, METH_VARARGS,
45422900685SMarcel Moolenaar 	"Load a buffer into a memory descriptor." },
4554af242aaSMarcel Moolenaar     { "md_unload", busdma_md_unload, METH_VARARGS,
4564af242aaSMarcel Moolenaar 	"Unload a memory descriptor." },
45722900685SMarcel Moolenaar 
4586f769b73SMarcel Moolenaar     { "mem_alloc", busdma_mem_alloc, METH_VARARGS,
4596f769b73SMarcel Moolenaar 	"Allocate memory according to the DMA constraints." },
4606f769b73SMarcel Moolenaar     { "mem_free", busdma_mem_free, METH_VARARGS,
4616f769b73SMarcel Moolenaar 	"Free allocated memory." },
462cc606478SMarcel Moolenaar 
463cc606478SMarcel Moolenaar     { "md_first_seg", busdma_md_first_seg, METH_VARARGS,
464cc606478SMarcel Moolenaar 	"Return first segment in one of the segment lists." },
465cc606478SMarcel Moolenaar     { "md_next_seg", busdma_md_next_seg, METH_VARARGS,
466cc606478SMarcel Moolenaar 	"Return next segment in the segment list." },
467cc606478SMarcel Moolenaar     { "seg_get_addr", busdma_seg_get_addr, METH_VARARGS,
468cc606478SMarcel Moolenaar 	"Return the address of the segment." },
469cc606478SMarcel Moolenaar     { "seg_get_size", busdma_seg_get_size, METH_VARARGS,
470cc606478SMarcel Moolenaar 	"Return the size of the segment." },
4714af242aaSMarcel Moolenaar 
4724af242aaSMarcel Moolenaar     { "sync", busdma_sync, METH_VARARGS,
473015b8583SMarcel Moolenaar 	"Make the entire memory descriptor coherent WRT to DMA." },
474015b8583SMarcel Moolenaar     { "sync_range", busdma_sync_range, METH_VARARGS,
475015b8583SMarcel Moolenaar 	"Make part of the memory descriptor coherent WRT to DMA." },
4764af242aaSMarcel Moolenaar 
4779c2cdb1aSMarcel Moolenaar     { NULL, NULL, 0, NULL }
4789c2cdb1aSMarcel Moolenaar };
4799c2cdb1aSMarcel Moolenaar 
480da4f5bdaSMarcel Moolenaar static PyObject *
module_initialize(PyObject * bus,PyObject * busdma)481da4f5bdaSMarcel Moolenaar module_initialize(PyObject *bus, PyObject *busdma)
4820c2b180aSMarcel Moolenaar {
4830c2b180aSMarcel Moolenaar 
484da4f5bdaSMarcel Moolenaar 	if (bus == NULL || busdma == NULL)
485da4f5bdaSMarcel Moolenaar 		return (NULL);
4864af242aaSMarcel Moolenaar 
4874af242aaSMarcel Moolenaar 	PyModule_AddObject(busdma, "MD_BUS_SPACE", Py_BuildValue("i", 0));
4884af242aaSMarcel Moolenaar 	PyModule_AddObject(busdma, "MD_PHYS_SPACE", Py_BuildValue("i", 1));
4894af242aaSMarcel Moolenaar 	PyModule_AddObject(busdma, "MD_VIRT_SPACE", Py_BuildValue("i", 2));
4904af242aaSMarcel Moolenaar 
4914af242aaSMarcel Moolenaar 	PyModule_AddObject(busdma, "SYNC_PREREAD", Py_BuildValue("i", 1));
4924af242aaSMarcel Moolenaar 	PyModule_AddObject(busdma, "SYNC_POSTREAD", Py_BuildValue("i", 2));
4934af242aaSMarcel Moolenaar 	PyModule_AddObject(busdma, "SYNC_PREWRITE", Py_BuildValue("i", 4));
4944af242aaSMarcel Moolenaar 	PyModule_AddObject(busdma, "SYNC_POSTWRITE", Py_BuildValue("i", 8));
495da4f5bdaSMarcel Moolenaar 
496da4f5bdaSMarcel Moolenaar 	PyModule_AddObject(bus, "dma", busdma);
497da4f5bdaSMarcel Moolenaar 	return (bus);
4980c2b180aSMarcel Moolenaar }
499da4f5bdaSMarcel Moolenaar 
500da4f5bdaSMarcel Moolenaar #if PY_MAJOR_VERSION >= 3
501da4f5bdaSMarcel Moolenaar 
502da4f5bdaSMarcel Moolenaar static struct PyModuleDef bus_module = {
503da4f5bdaSMarcel Moolenaar 	PyModuleDef_HEAD_INIT,
504da4f5bdaSMarcel Moolenaar 	"bus",
505da4f5bdaSMarcel Moolenaar 	bus_docstr,
506da4f5bdaSMarcel Moolenaar         -1,
507da4f5bdaSMarcel Moolenaar 	bus_methods,
508da4f5bdaSMarcel Moolenaar };
509da4f5bdaSMarcel Moolenaar 
510da4f5bdaSMarcel Moolenaar static struct PyModuleDef busdma_module = {
511da4f5bdaSMarcel Moolenaar 	PyModuleDef_HEAD_INIT,
512da4f5bdaSMarcel Moolenaar 	"busdma",
513da4f5bdaSMarcel Moolenaar 	busdma_docstr,
514da4f5bdaSMarcel Moolenaar         -1,
515da4f5bdaSMarcel Moolenaar 	busdma_methods,
516da4f5bdaSMarcel Moolenaar };
517da4f5bdaSMarcel Moolenaar 
518da4f5bdaSMarcel Moolenaar PyMODINIT_FUNC
PyInit_bus(void)519da4f5bdaSMarcel Moolenaar PyInit_bus(void)
520da4f5bdaSMarcel Moolenaar {
521da4f5bdaSMarcel Moolenaar 	PyObject *bus, *busdma;
522da4f5bdaSMarcel Moolenaar 
523da4f5bdaSMarcel Moolenaar 	bus = PyModule_Create(&bus_module);
524da4f5bdaSMarcel Moolenaar 	busdma = PyModule_Create(&busdma_module);
525da4f5bdaSMarcel Moolenaar 	return (module_initialize(bus, busdma));
526da4f5bdaSMarcel Moolenaar }
527da4f5bdaSMarcel Moolenaar 
528da4f5bdaSMarcel Moolenaar #else /* PY_MAJOR_VERSION >= 3 */
529da4f5bdaSMarcel Moolenaar 
530da4f5bdaSMarcel Moolenaar PyMODINIT_FUNC
initbus(void)531da4f5bdaSMarcel Moolenaar initbus(void)
532da4f5bdaSMarcel Moolenaar {
533da4f5bdaSMarcel Moolenaar 	PyObject *bus, *busdma;
534da4f5bdaSMarcel Moolenaar 
535da4f5bdaSMarcel Moolenaar 	bus = Py_InitModule3("bus", bus_methods, bus_docstr);
536da4f5bdaSMarcel Moolenaar 	busdma = Py_InitModule3("busdma", busdma_methods, busdma_docstr);
537da4f5bdaSMarcel Moolenaar 	(void)module_initialize(bus, busdma);
538da4f5bdaSMarcel Moolenaar }
539da4f5bdaSMarcel Moolenaar 
540da4f5bdaSMarcel Moolenaar #endif /* PY_MAJOR_VERSION >= 3 */
541