xref: /freebsd/sys/dev/ppbus/ppb_msq.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
146f3ff79SMike Smith /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
446f3ff79SMike Smith  * Copyright (c) 1998 Nicolas Souchu
546f3ff79SMike Smith  * All rights reserved.
646f3ff79SMike Smith  *
746f3ff79SMike Smith  * Redistribution and use in source and binary forms, with or without
846f3ff79SMike Smith  * modification, are permitted provided that the following conditions
946f3ff79SMike Smith  * are met:
1046f3ff79SMike Smith  * 1. Redistributions of source code must retain the above copyright
1146f3ff79SMike Smith  *    notice, this list of conditions and the following disclaimer.
1246f3ff79SMike Smith  * 2. Redistributions in binary form must reproduce the above copyright
1346f3ff79SMike Smith  *    notice, this list of conditions and the following disclaimer in the
1446f3ff79SMike Smith  *    documentation and/or other materials provided with the distribution.
1546f3ff79SMike Smith  *
1646f3ff79SMike Smith  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1746f3ff79SMike Smith  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1846f3ff79SMike Smith  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1946f3ff79SMike Smith  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2046f3ff79SMike Smith  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2146f3ff79SMike Smith  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2246f3ff79SMike Smith  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2346f3ff79SMike Smith  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2446f3ff79SMike Smith  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2546f3ff79SMike Smith  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2646f3ff79SMike Smith  * SUCH DAMAGE.
2746f3ff79SMike Smith  *
2846f3ff79SMike Smith  */
2946f3ff79SMike Smith #ifndef __PPB_MSQ_H
3046f3ff79SMike Smith #define __PPB_MSQ_H
3146f3ff79SMike Smith 
3246f3ff79SMike Smith /*
3346f3ff79SMike Smith  * Basic definitions
3446f3ff79SMike Smith  */
3546f3ff79SMike Smith 
3646f3ff79SMike Smith /* microsequence parameter descriptor */
37bc35c174SNicolas Souchu #define MS_INS_MASK	0x00ff	/* mask to retrieve the instruction position < 256	XXX */
3846f3ff79SMike Smith #define MS_ARG_MASK	0x0f00	/* mask to retrieve the argument number */
3946f3ff79SMike Smith #define MS_TYP_MASK	0xf000	/* mask to retrieve the type of the param */
4046f3ff79SMike Smith 
4146f3ff79SMike Smith /* offset of each mask (see above) */
4246f3ff79SMike Smith #define MS_INS_OFFSET	0
4346f3ff79SMike Smith #define MS_ARG_OFFSET	8
4446f3ff79SMike Smith #define MS_TYP_OFFSET	12
4546f3ff79SMike Smith 
4646f3ff79SMike Smith /* list of parameter types */
4746f3ff79SMike Smith #define MS_TYP_INT	0x0	/* integer */
4846f3ff79SMike Smith #define MS_TYP_CHA	0x1	/* character */
4946f3ff79SMike Smith #define MS_TYP_PTR	0x2	/* void pointer */
5046f3ff79SMike Smith #define MS_TYP_FUN	0x3	/* function pointer */
5146f3ff79SMike Smith 
5246f3ff79SMike Smith #define MS_PARAM(ins,arg,typ) \
5346f3ff79SMike Smith 	(((ins<<MS_INS_OFFSET) & MS_INS_MASK) | \
5446f3ff79SMike Smith 	 ((arg<<MS_ARG_OFFSET) & MS_ARG_MASK) | \
5546f3ff79SMike Smith 	 ((typ<<MS_TYP_OFFSET) & MS_TYP_MASK))
5646f3ff79SMike Smith 
5746f3ff79SMike Smith #define MS_INS(param) ((param & MS_INS_MASK) >> MS_INS_OFFSET)
5846f3ff79SMike Smith #define MS_ARG(param) ((param & MS_ARG_MASK) >> MS_ARG_OFFSET)
5946f3ff79SMike Smith #define MS_TYP(param) ((param & MS_TYP_MASK) >> MS_TYP_OFFSET)
6046f3ff79SMike Smith 
6146f3ff79SMike Smith /* microsequence opcodes - do not change! */
6246f3ff79SMike Smith #define MS_OP_GET       0	/* get <ptr>, <len>			*/
6346f3ff79SMike Smith #define MS_OP_PUT       1	/* put <ptr>, <len>			*/
6446f3ff79SMike Smith 
6546f3ff79SMike Smith #define MS_OP_RFETCH	2	/* rfetch <reg>, <mask>, <ptr>		*/
6646f3ff79SMike Smith #define MS_OP_RSET	3	/* rset <reg>, <mask>, <mask>		*/
6746f3ff79SMike Smith #define MS_OP_RASSERT	4	/* rassert <reg>, <mask>		*/
6846f3ff79SMike Smith #define MS_OP_DELAY     5	/* delay <val>				*/
6946f3ff79SMike Smith #define MS_OP_SET       6	/* set <val>				*/
7046f3ff79SMike Smith #define MS_OP_DBRA      7	/* dbra <offset>			*/
7146f3ff79SMike Smith #define MS_OP_BRSET     8	/* brset <mask>, <offset>		*/
7246f3ff79SMike Smith #define MS_OP_BRCLEAR   9	/* brclear <mask>, <offset>		*/
7346f3ff79SMike Smith #define MS_OP_RET       10	/* ret <retcode>			*/
7446f3ff79SMike Smith #define MS_OP_C_CALL	11	/* c_call <function>, <parameter>	*/
7546f3ff79SMike Smith #define MS_OP_PTR	12	/* ptr <pointer>			*/
7624ef1eb1SNicolas Souchu #define MS_OP_ADELAY	13	/* adelay <val>				*/
7724ef1eb1SNicolas Souchu #define MS_OP_BRSTAT	14	/* brstat <mask>, <mask>, <offset>	*/
7846f3ff79SMike Smith #define MS_OP_SUBRET	15	/* subret <code>			*/
7946f3ff79SMike Smith #define MS_OP_CALL	16	/* call <microsequence>			*/
8046f3ff79SMike Smith #define MS_OP_RASSERT_P	17	/* rassert_p <iter>, <reg>		*/
8146f3ff79SMike Smith #define MS_OP_RFETCH_P	18	/* rfetch_p <iter>, <reg>, <mask>	*/
8246f3ff79SMike Smith #define MS_OP_TRIG	19	/* trigger <reg>, <len>, <array>	*/
8346f3ff79SMike Smith 
8446f3ff79SMike Smith /* common masks */
8546f3ff79SMike Smith #define MS_CLEAR_ALL	0x0
8646f3ff79SMike Smith #define MS_ASSERT_NONE	0x0
8746f3ff79SMike Smith #define MS_ASSERT_ALL	0xff
8846f3ff79SMike Smith #define MS_FETCH_ALL	0xff
8946f3ff79SMike Smith 
9046f3ff79SMike Smith /* undefined parameter value */
9124ef1eb1SNicolas Souchu #define MS_NULL		0
9224ef1eb1SNicolas Souchu #define MS_UNKNOWN	MS_NULL
9324ef1eb1SNicolas Souchu 
9424ef1eb1SNicolas Souchu /* predifined parameters */
9524ef1eb1SNicolas Souchu #define MS_ACCUM	-1	/* use accum previously set by MS_OP_SET */
9646f3ff79SMike Smith 
9746f3ff79SMike Smith /* these are register numbers according to our PC-like parallel port model */
9846f3ff79SMike Smith #define MS_REG_DTR	0x0
9946f3ff79SMike Smith #define MS_REG_STR	0x1
10046f3ff79SMike Smith #define MS_REG_CTR	0x2
10120240fa3SNicolas Souchu #define MS_REG_EPP_A	0x3
10220240fa3SNicolas Souchu #define MS_REG_EPP_D	0x4
10346f3ff79SMike Smith 
10446f3ff79SMike Smith /*
10546f3ff79SMike Smith  * Microsequence macro abstraction level
10646f3ff79SMike Smith  */
10746f3ff79SMike Smith 
10846f3ff79SMike Smith /* register operations */
10929f19445SAlfred Perlstein #define MS_RSET(reg,assert,clear) { MS_OP_RSET, {{ (reg) }, { (assert) }, { (clear) }}}
11029f19445SAlfred Perlstein #define MS_RASSERT(reg,byte)	  { MS_OP_RASSERT, { { (reg) }, { (byte) }}}
11129f19445SAlfred Perlstein #define MS_RCLR(reg,clear)	  { MS_OP_RSET, {{ (reg) }, { MS_ASSERT_NONE }, { (clear) }}}
11229f19445SAlfred Perlstein #define MS_RFETCH(reg,mask,ptr) { MS_OP_RFETCH, {{ (reg) }, { (mask) }, { (ptr) }}}
11346f3ff79SMike Smith 
11446f3ff79SMike Smith /* trigger the port with array[char, delay,...] */
11529f19445SAlfred Perlstein #define MS_TRIG(reg,len,array)	{ MS_OP_TRIG, {{ (reg) }, { (len) }, { (array) }}}
11646f3ff79SMike Smith 
11746f3ff79SMike Smith /* assert/fetch from/to ptr */
11829f19445SAlfred Perlstein #define MS_RASSERT_P(n,reg)	  { MS_OP_RASSERT_P, {{ (n) }, { (reg) }}}
11929f19445SAlfred Perlstein #define MS_RFETCH_P(n,reg,mask)	  { MS_OP_RFETCH_P, {{ (n) }, { (reg) }, { (mask) }}}
12046f3ff79SMike Smith 
12146f3ff79SMike Smith /* ptr manipulation */
12229f19445SAlfred Perlstein #define MS_PTR(ptr)	{ MS_OP_PTR, {{ (ptr) }}}
12346f3ff79SMike Smith 
12446f3ff79SMike Smith #define MS_DASS(byte) MS_RASSERT(MS_REG_DTR,byte)
12546f3ff79SMike Smith #define MS_SASS(byte) MS_RASSERT(MS_REG_STR,byte)
12646f3ff79SMike Smith #define MS_CASS(byte) MS_RASSERT(MS_REG_CTR,byte)
12729f19445SAlfred Perlstein #define MS_SET(accum)		{ MS_OP_SET, {{ (accum) }}}
12829f19445SAlfred Perlstein #define MS_BRSET(mask,offset)	{ MS_OP_BRSET, {{ (mask) }, { (offset) }}}
12929f19445SAlfred Perlstein #define MS_DBRA(offset)		{ MS_OP_DBRA, {{ (offset) }}}
13029f19445SAlfred Perlstein #define MS_BRCLEAR(mask,offset)	{ MS_OP_BRCLEAR, {{ (mask) }, { (offset) }}}
13124ef1eb1SNicolas Souchu #define MS_BRSTAT(mask_set,mask_clr,offset) \
13229f19445SAlfred Perlstein 		{ MS_OP_BRSTAT, {{ mask_set }, { mask_clr }, { (offset) }}}
13346f3ff79SMike Smith 
13446f3ff79SMike Smith /* C function or submicrosequence call */
13546f3ff79SMike Smith #define MS_C_CALL(function,parameter) \
13629f19445SAlfred Perlstein 		{ MS_OP_C_CALL, {{ (function) }, { (parameter) }}}
13729f19445SAlfred Perlstein #define MS_CALL(microseq) { MS_OP_CALL, {{ (microseq) }}}
13846f3ff79SMike Smith 
13946f3ff79SMike Smith /* mode dependent read/write operations
14046f3ff79SMike Smith  * ppb_MS_xxx_init() call required otherwise default is
14146f3ff79SMike Smith  * IEEE1284 operating mode */
14229f19445SAlfred Perlstein #define MS_PUT(ptr,len) { MS_OP_PUT, {{ (ptr) }, { (len) }}}
14329f19445SAlfred Perlstein #define MS_GET(ptr,len) { MS_OP_GET, {{ (ptr) }, { (len) }}}
14446f3ff79SMike Smith 
14546f3ff79SMike Smith /* delay in microseconds */
14629f19445SAlfred Perlstein #define MS_DELAY(udelay) { MS_OP_DELAY, {{ (udelay) }}}
14724ef1eb1SNicolas Souchu 
14824ef1eb1SNicolas Souchu /* asynchroneous delay in ms */
14929f19445SAlfred Perlstein #define MS_ADELAY(mdelay) { MS_OP_ADELAY, {{ (mdelay) }}}
15046f3ff79SMike Smith 
15146f3ff79SMike Smith /* return from submicrosequence execution or microseqence execution */
15229f19445SAlfred Perlstein #define MS_SUBRET(code)	{ MS_OP_SUBRET,	{{ (code) }}}
15329f19445SAlfred Perlstein #define MS_RET(code)	{ MS_OP_RET, {{ (code) }}}
15446f3ff79SMike Smith 
15546f3ff79SMike Smith /*
15646f3ff79SMike Smith  * Function abstraction level
15746f3ff79SMike Smith  */
15846f3ff79SMike Smith 
1590f210c92SNicolas Souchu #define ppb_MS_GET_init(bus,dev,body) ppb_MS_init(bus, dev, body, MS_OP_GET)
16046f3ff79SMike Smith 
1610f210c92SNicolas Souchu #define ppb_MS_PUT_init(bus,dev,body) ppb_MS_init(bus, dev, body, MS_OP_PUT)
16246f3ff79SMike Smith 
16346f3ff79SMike Smith extern int ppb_MS_init(
1640f210c92SNicolas Souchu 		device_t,			/* ppbus bus */
1650f210c92SNicolas Souchu 		device_t,			/* ppbus device */
16646f3ff79SMike Smith 		struct ppb_microseq *,		/* loop msq to assign */
16746f3ff79SMike Smith 		int opcode			/* MS_OP_GET, MS_OP_PUT */
16846f3ff79SMike Smith 		);
16946f3ff79SMike Smith 
17046f3ff79SMike Smith extern int ppb_MS_init_msq(
17146f3ff79SMike Smith 		struct ppb_microseq *,
17246f3ff79SMike Smith 		int,				/* number of parameters */
17346f3ff79SMike Smith 		...				/* descriptor, value, ... */
17446f3ff79SMike Smith 		);
17546f3ff79SMike Smith 
17646f3ff79SMike Smith extern int ppb_MS_exec(
1770f210c92SNicolas Souchu 		device_t,			/* ppbus bus */
1780f210c92SNicolas Souchu 		device_t,			/* ppbus device */
17946f3ff79SMike Smith 		int,				/* microseq opcode */
18046f3ff79SMike Smith 		union ppb_insarg,		/* param1 */
18146f3ff79SMike Smith 		union ppb_insarg,		/* param2 */
18246f3ff79SMike Smith 		union ppb_insarg,		/* param3 */
18346f3ff79SMike Smith 		int *				/* returned value */
18446f3ff79SMike Smith 		);
18546f3ff79SMike Smith 
18646f3ff79SMike Smith extern int ppb_MS_loop(
1870f210c92SNicolas Souchu 		device_t,			/* ppbus bus */
1880f210c92SNicolas Souchu 		device_t,			/* ppbus device */
18946f3ff79SMike Smith 		struct ppb_microseq *,		/* prologue msq of loop */
19046f3ff79SMike Smith 		struct ppb_microseq *,		/* body msq of loop */
19146f3ff79SMike Smith 		struct ppb_microseq *,		/* epilogue msq of loop */
19246f3ff79SMike Smith 		int,				/* number of iter */
19346f3ff79SMike Smith 		int *				/* returned value */
19446f3ff79SMike Smith 		);
19546f3ff79SMike Smith 
19646f3ff79SMike Smith extern int ppb_MS_microseq(
1970f210c92SNicolas Souchu 		device_t,			/* ppbus bus */
1980f210c92SNicolas Souchu 		device_t,			/* ppbus device */
19946f3ff79SMike Smith 		struct ppb_microseq *,		/* msq to execute */
20046f3ff79SMike Smith 		int *				/* returned value */
20146f3ff79SMike Smith 		);
20246f3ff79SMike Smith 
20346f3ff79SMike Smith #endif
204