intr.h revision 1.15
11.15Swiz/*	$NetBSD: intr.h,v 1.15 2002/02/11 10:57:58 wiz Exp $	*/
21.1Ssakamoto
31.6Smycroft/*-
41.6Smycroft * Copyright (c) 1998 The NetBSD Foundation, Inc.
51.6Smycroft * All rights reserved.
61.6Smycroft *
71.6Smycroft * This code is derived from software contributed to The NetBSD Foundation
81.6Smycroft * by Charles M. Hannum.
91.1Ssakamoto *
101.1Ssakamoto * Redistribution and use in source and binary forms, with or without
111.1Ssakamoto * modification, are permitted provided that the following conditions
121.1Ssakamoto * are met:
131.1Ssakamoto * 1. Redistributions of source code must retain the above copyright
141.1Ssakamoto *    notice, this list of conditions and the following disclaimer.
151.1Ssakamoto * 2. Redistributions in binary form must reproduce the above copyright
161.1Ssakamoto *    notice, this list of conditions and the following disclaimer in the
171.1Ssakamoto *    documentation and/or other materials provided with the distribution.
181.1Ssakamoto * 3. All advertising materials mentioning features or use of this software
191.1Ssakamoto *    must display the following acknowledgement:
201.6Smycroft *        This product includes software developed by the NetBSD
211.6Smycroft *        Foundation, Inc. and its contributors.
221.6Smycroft * 4. Neither the name of The NetBSD Foundation nor the names of its
231.6Smycroft *    contributors may be used to endorse or promote products derived
241.6Smycroft *    from this software without specific prior written permission.
251.1Ssakamoto *
261.6Smycroft * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
271.6Smycroft * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
281.6Smycroft * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
291.6Smycroft * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
301.6Smycroft * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
311.6Smycroft * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
321.6Smycroft * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
331.6Smycroft * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
341.6Smycroft * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
351.6Smycroft * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
361.6Smycroft * POSSIBILITY OF SUCH DAMAGE.
371.1Ssakamoto */
381.1Ssakamoto
391.1Ssakamoto#ifndef _BEBOX_INTR_H_
401.1Ssakamoto#define _BEBOX_INTR_H_
411.1Ssakamoto
421.1Ssakamoto/* Interrupt priority `levels'. */
431.1Ssakamoto#define	IPL_NONE	9	/* nothing */
441.1Ssakamoto#define	IPL_SOFTCLOCK	8	/* software clock interrupt */
451.1Ssakamoto#define	IPL_SOFTNET	7	/* software network interrupt */
461.1Ssakamoto#define	IPL_BIO		6	/* block I/O */
471.1Ssakamoto#define	IPL_NET		5	/* network */
481.8Sthorpej#define	IPL_SOFTSERIAL	4	/* software serial interrupt */
491.8Sthorpej#define	IPL_TTY		3	/* terminal */
501.1Ssakamoto#define	IPL_IMP		3	/* memory allocation */
511.1Ssakamoto#define	IPL_AUDIO	2	/* audio */
521.1Ssakamoto#define	IPL_CLOCK	1	/* clock */
531.8Sthorpej#define	IPL_HIGH	1	/* everything */
541.4Ssakamoto#define	IPL_SERIAL	0	/* serial */
551.1Ssakamoto#define	NIPL		10
561.1Ssakamoto
571.1Ssakamoto/* Interrupt sharing types. */
581.1Ssakamoto#define	IST_NONE	0	/* none */
591.1Ssakamoto#define	IST_PULSE	1	/* pulsed */
601.1Ssakamoto#define	IST_EDGE	2	/* edge-triggered */
611.1Ssakamoto#define	IST_LEVEL	3	/* level-triggered */
621.1Ssakamoto
631.1Ssakamoto#ifndef _LOCORE
641.1Ssakamoto
651.2Ssakamoto/*
661.2Ssakamoto * Interrupt handler chains.  intr_establish() inserts a handler into
671.2Ssakamoto * the list.  The handler is called with its (single) argument.
681.2Ssakamoto */
691.2Ssakamotostruct intrhand {
701.2Ssakamoto	int	(*ih_fun) __P((void *));
711.2Ssakamoto	void	*ih_arg;
721.2Ssakamoto	u_long	ih_count;
731.2Ssakamoto	struct	intrhand *ih_next;
741.2Ssakamoto	int	ih_level;
751.2Ssakamoto	int	ih_irq;
761.2Ssakamoto};
771.2Ssakamoto
781.2Ssakamotovoid setsoftclock __P((void));
791.2Ssakamotovoid clearsoftclock __P((void));
801.2Ssakamotoint  splsoftclock __P((void));
811.2Ssakamotovoid setsoftnet   __P((void));
821.2Ssakamotovoid clearsoftnet __P((void));
831.2Ssakamotoint  splsoftnet   __P((void));
841.2Ssakamoto
851.2Ssakamotovoid do_pending_int __P((void));
861.14Smatt
871.14Smattvoid ext_intr __P((void));
881.14Smattvoid *intr_establish __P((int, int, int, int (*)(void *), void *));
891.14Smattvoid intr_disestablish __P((void *));
901.14Smattvoid intr_calculatemasks __P((void));
911.14Smattint  isa_intr __P((void));
921.14Smattvoid isa_intr_mask __P((int));
931.14Smattvoid isa_intr_clr __P((int));
941.14Smatt
951.14Smattvoid enable_intr __P((void));
961.14Smattvoid disable_intr __P((void));
971.2Ssakamoto
981.7Ssakamotostatic __inline int splraise __P((int));
991.7Ssakamotostatic __inline int spllower __P((int));
1001.7Ssakamotostatic __inline void splx __P((int));
1011.7Ssakamotostatic __inline void set_sint __P((int));
1021.2Ssakamoto
1031.2Ssakamotoextern volatile int cpl, ipending, astpending, tickspending;
1041.2Ssakamotoextern int imask[];
1051.7Ssakamotoextern long intrcnt[];
1061.2Ssakamoto
1071.2Ssakamoto/*
1081.2Ssakamoto *  Reorder protection in the following inline functions is
1091.15Swiz * achieved with the "eieio" instruction which the assembler
1101.2Ssakamoto * seems to detect and then doen't move instructions past....
1111.2Ssakamoto */
1121.2Ssakamotostatic __inline int
1131.2Ssakamotosplraise(newcpl)
1141.2Ssakamoto	int newcpl;
1151.2Ssakamoto{
1161.2Ssakamoto	int oldcpl;
1171.2Ssakamoto
1181.2Ssakamoto	__asm__ volatile("sync; eieio\n");	/* don't reorder.... */
1191.2Ssakamoto	oldcpl = cpl;
1201.2Ssakamoto	cpl = oldcpl | newcpl;
1211.2Ssakamoto	__asm__ volatile("sync; eieio\n");	/* reorder protect */
1221.2Ssakamoto	return(oldcpl);
1231.2Ssakamoto}
1241.2Ssakamoto
1251.2Ssakamotostatic __inline void
1261.2Ssakamotosplx(newcpl)
1271.2Ssakamoto	int newcpl;
1281.2Ssakamoto{
1291.2Ssakamoto	__asm__ volatile("sync; eieio\n");	/* reorder protect */
1301.2Ssakamoto	cpl = newcpl;
1311.2Ssakamoto	if(ipending & ~newcpl)
1321.2Ssakamoto		do_pending_int();
1331.2Ssakamoto	__asm__ volatile("sync; eieio\n");	/* reorder protect */
1341.2Ssakamoto}
1351.2Ssakamoto
1361.2Ssakamotostatic __inline int
1371.2Ssakamotospllower(newcpl)
1381.2Ssakamoto	int newcpl;
1391.2Ssakamoto{
1401.2Ssakamoto	int oldcpl;
1411.2Ssakamoto
1421.2Ssakamoto	__asm__ volatile("sync; eieio\n");	/* reorder protect */
1431.2Ssakamoto	oldcpl = cpl;
1441.2Ssakamoto	cpl = newcpl;
1451.2Ssakamoto	if(ipending & ~newcpl)
1461.2Ssakamoto		do_pending_int();
1471.2Ssakamoto	__asm__ volatile("sync; eieio\n");	/* reorder protect */
1481.2Ssakamoto	return(oldcpl);
1491.2Ssakamoto}
1501.2Ssakamoto
1511.2Ssakamoto/* Following code should be implemented with lwarx/stwcx to avoid
1521.2Ssakamoto * the disable/enable. i need to read the manual once more.... */
1531.2Ssakamotostatic __inline void
1541.2Ssakamotoset_sint(pending)
1551.2Ssakamoto	int	pending;
1561.2Ssakamoto{
1571.2Ssakamoto	int	msrsave;
1581.2Ssakamoto
1591.2Ssakamoto	__asm__ ("mfmsr %0" : "=r"(msrsave));
1601.2Ssakamoto	__asm__ volatile ("mtmsr %0" :: "r"(msrsave & ~PSL_EE));
1611.2Ssakamoto	ipending |= pending;
1621.2Ssakamoto	__asm__ volatile ("mtmsr %0" :: "r"(msrsave));
1631.2Ssakamoto}
1641.2Ssakamoto
1651.2Ssakamoto#define	ICU_LEN		32
1661.2Ssakamoto#define	IRQ_SLAVE	2
1671.2Ssakamoto#define	LEGAL_IRQ(x)	((x) >= 0 && (x) < ICU_LEN && (x) != IRQ_SLAVE)
1681.2Ssakamoto
1691.2Ssakamoto#define	MOTHER_BOARD_REG	0x7ffff000
1701.2Ssakamoto#define	CPU0_INT_MASK	0x0f0
1711.2Ssakamoto#define	CPU1_INT_MASK	0x1f0
1721.2Ssakamoto#define	INT_STATE_REG	0x2f0
1731.2Ssakamoto
1741.3Ssakamoto#define	SINT_CLOCK	0x20000000
1751.3Ssakamoto#define	SINT_NET	0x40000000
1761.4Ssakamoto#define	SINT_SERIAL	0x80000000
1771.3Ssakamoto#define	SPL_CLOCK	0x00000001
1781.4Ssakamoto#define	SINT_MASK	(SINT_CLOCK|SINT_NET|SINT_SERIAL)
1791.2Ssakamoto
1801.2Ssakamoto#define	CNT_SINT_NET	29
1811.2Ssakamoto#define	CNT_SINT_CLOCK	30
1821.4Ssakamoto#define	CNT_SINT_SERIAL	31
1831.3Ssakamoto#define	CNT_CLOCK	0
1841.2Ssakamoto
1851.2Ssakamoto#define splbio()	splraise(imask[IPL_BIO])
1861.2Ssakamoto#define splnet()	splraise(imask[IPL_NET])
1871.2Ssakamoto#define spltty()	splraise(imask[IPL_TTY])
1881.8Sthorpej#define splclock()	splraise(imask[IPL_CLOCK])
1891.12Sthorpej#define splvm()		splraise(imask[IPL_IMP])
1901.4Ssakamoto#define	splserial()	splraise(imask[IPL_SERIAL])
1911.8Sthorpej#define splstatclock()	splclock()
1921.9Sthorpej#define	spllowersoftclock() spllower(imask[IPL_SOFTCLOCK])
1931.9Sthorpej#define	splsoftclock()	splraise(imask[IPL_SOFTCLOCK])
1941.8Sthorpej#define	splsoftnet()	splraise(imask[IPL_SOFTNET])
1951.8Sthorpej#define	splsoftserial()	splraise(imask[IPL_SOFTSERIAL])
1961.5Sis
1971.5Sis#define spllpt()	spltty()
1981.2Ssakamoto
1991.2Ssakamoto#define	setsoftclock()	set_sint(SINT_CLOCK);
2001.2Ssakamoto#define	setsoftnet()	set_sint(SINT_NET);
2011.4Ssakamoto#define	setsoftserial()	set_sint(SINT_SERIAL);
2021.2Ssakamoto
2031.8Sthorpej#define	splhigh()	splraise(imask[IPL_HIGH])
2041.2Ssakamoto#define	spl0()		spllower(0)
2051.10Sthorpej
2061.10Sthorpej#define	splsched()	splhigh()
2071.11Sthorpej#define	spllock()	splhigh()
2081.1Ssakamoto
2091.1Ssakamoto#endif /* !_LOCORE */
2101.1Ssakamoto
2111.1Ssakamoto#endif /* !_BEBOX_INTR_H_ */
212