intr.h revision 1.13
11.13Snonaka/* 	$NetBSD: intr.h,v 1.13 2010/04/17 13:36:21 nonaka Exp $	*/
21.1Sichiro
31.1Sichiro/*
41.1Sichiro * Copyright (c) 1997 Mark Brinicombe.
51.1Sichiro * All rights reserved.
61.1Sichiro *
71.1Sichiro * Redistribution and use in source and binary forms, with or without
81.1Sichiro * modification, are permitted provided that the following conditions
91.1Sichiro * are met:
101.1Sichiro * 1. Redistributions of source code must retain the above copyright
111.1Sichiro *    notice, this list of conditions and the following disclaimer.
121.1Sichiro * 2. Redistributions in binary form must reproduce the above copyright
131.1Sichiro *    notice, this list of conditions and the following disclaimer in the
141.1Sichiro *    documentation and/or other materials provided with the distribution.
151.1Sichiro * 3. All advertising materials mentioning features or use of this software
161.1Sichiro *    must display the following acknowledgement:
171.1Sichiro *	This product includes software developed by Mark Brinicombe
181.1Sichiro *	for the NetBSD Project.
191.1Sichiro * 4. The name of the company nor the name of the author may be used to
201.1Sichiro *    endorse or promote products derived from this software without specific
211.1Sichiro *    prior written permission.
221.1Sichiro *
231.1Sichiro * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
241.1Sichiro * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
251.1Sichiro * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
261.1Sichiro * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
271.1Sichiro * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
281.1Sichiro * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
291.1Sichiro * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
301.1Sichiro * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
311.1Sichiro * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
321.1Sichiro * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
331.1Sichiro * SUCH DAMAGE.
341.1Sichiro */
351.1Sichiro
361.3Stoshii#ifndef _HPCARM_INTR_H_
371.3Stoshii#define _HPCARM_INTR_H_
381.1Sichiro
391.13Snonaka#ifdef _KERNEL
401.13Snonaka
411.12Smatt#ifdef __HAVE_FAST_SOFTINTS
421.12Smatt#define IPL_NONE	0
431.12Smatt#define IPL_SOFTCLOCK	1
441.12Smatt#define IPL_SOFTBIO	2
451.12Smatt#define IPL_SOFTNET	3
461.12Smatt#define IPL_SOFTSERIAL	4
471.12Smatt#define IPL_VM		5
481.12Smatt#define IPL_SCHED	6
491.12Smatt#define IPL_HIGH	7
501.1Sichiro
511.11Sad#define NIPL		8
521.12Smatt#else
531.12Smatt#define IPL_NONE	0
541.12Smatt#define IPL_SOFTCLOCK	IPL_NONE
551.12Smatt#define IPL_SOFTBIO	IPL_NONE
561.12Smatt#define IPL_SOFTNET	IPL_NONE
571.12Smatt#define IPL_SOFTSERIAL	IPL_NONE
581.12Smatt#define IPL_VM		1
591.12Smatt#define IPL_SCHED	2
601.12Smatt#define IPL_HIGH	3
611.12Smatt
621.12Smatt#define NIPL		4
631.12Smatt#endif
641.1Sichiro
651.1Sichiro#define	IST_UNUSABLE	-1	/* interrupt cannot be used */
661.1Sichiro#define	IST_NONE	0	/* none (dummy) */
671.1Sichiro#define	IST_PULSE	1	/* pulsed */
681.1Sichiro#define	IST_EDGE	2	/* edge-triggered */
691.1Sichiro#define	IST_LEVEL	3	/* level-triggered */
701.1Sichiro
711.13Snonaka#define	IST_LEVEL_LOW	IST_LEVEL
721.13Snonaka#define	IST_LEVEL_HIGH	4
731.13Snonaka#define	IST_EDGE_FALLING IST_EDGE
741.13Snonaka#define	IST_EDGE_RISING	5
751.13Snonaka#define	IST_EDGE_BOTH	6
761.13Snonaka
771.13Snonaka#ifdef __OLD_INTERRUPT_CODE	/* XXX XXX XXX */
781.13Snonaka
791.1Sichiro#include <machine/irqhandler.h>
801.6Sthorpej#include <arm/arm32/psl.h>
811.4Stoshii
821.13Snonaka#else	/* !__OLD_INTERRUPT_CODE */
831.13Snonaka
841.13Snonaka#define	__NEWINTR	/* enables new hooks in cpu_fork()/cpu_switch() */
851.13Snonaka
861.13Snonaka#ifndef _LOCORE
871.13Snonaka
881.13Snonaka#include <sys/device.h>
891.13Snonaka#include <sys/queue.h>
901.13Snonaka
911.13Snonaka#if defined(_LKM)
921.13Snonaka
931.13Snonakaint	_splraise(int);
941.13Snonakaint	_spllower(int);
951.13Snonakavoid	splx(int);
961.13Snonakavoid	_setsoftintr(int);
971.13Snonaka
981.13Snonaka#else	/* _LKM */
991.13Snonaka
1001.13Snonaka#include "opt_arm_intr_impl.h"
1011.13Snonaka
1021.13Snonaka#if defined(ARM_INTR_IMPL)
1031.13Snonaka
1041.13Snonaka/*
1051.13Snonaka * Each board needs to define the following functions:
1061.13Snonaka *
1071.13Snonaka * int	_splraise(int);
1081.13Snonaka * int	_spllower(int);
1091.13Snonaka * void	splx(int);
1101.13Snonaka * void	_setsoftintr(int);
1111.13Snonaka *
1121.13Snonaka * These may be defined as functions, static inline functions, or macros,
1131.13Snonaka * but there must be a _spllower() and splx() defined as functions callable
1141.13Snonaka * from assembly language (for cpu_switch()).  However, since it's quite
1151.13Snonaka * useful to be able to inline splx(), you could do something like the
1161.13Snonaka * following:
1171.13Snonaka *
1181.13Snonaka * in <boardtype>_intr.h:
1191.13Snonaka * 	static inline int
1201.13Snonaka *	boardtype_splx(int spl)
1211.13Snonaka *	{...}
1221.13Snonaka *
1231.13Snonaka *	#define splx(nspl)	boardtype_splx(nspl)
1241.13Snonaka *	...
1251.13Snonaka * and in boardtype's machdep code:
1261.13Snonaka *
1271.13Snonaka *	...
1281.13Snonaka *	#undef splx
1291.13Snonaka *	int
1301.13Snonaka *	splx(int spl)
1311.13Snonaka *	{
1321.13Snonaka *		return boardtype_splx(spl);
1331.13Snonaka *	}
1341.13Snonaka */
1351.13Snonaka
1361.13Snonaka#include ARM_INTR_IMPL
1371.13Snonaka
1381.13Snonaka#else	/* ARM_INTR_IMPL */
1391.13Snonaka
1401.13Snonaka#error ARM_INTR_IMPL not defined.
1411.13Snonaka
1421.13Snonaka#endif	/* ARM_INTR_IMPL */
1431.13Snonaka
1441.13Snonaka#endif	/* _LKM */
1451.13Snonaka
1461.13Snonaka#define splsoft()	_splraise(IPL_SOFT)
1471.13Snonaka
1481.13Snonakatypedef uint8_t ipl_t;
1491.13Snonakatypedef struct {
1501.13Snonaka	ipl_t _ipl;
1511.13Snonaka} ipl_cookie_t;
1521.13Snonaka
1531.13Snonakastatic inline ipl_cookie_t
1541.13Snonakamakeiplcookie(ipl_t ipl)
1551.13Snonaka{
1561.13Snonaka
1571.13Snonaka	return (ipl_cookie_t){._ipl = ipl};
1581.13Snonaka}
1591.13Snonaka
1601.13Snonakastatic inline int
1611.13Snonakasplraiseipl(ipl_cookie_t icookie)
1621.13Snonaka{
1631.13Snonaka
1641.13Snonaka	return _splraise(icookie._ipl);
1651.13Snonaka}
1661.13Snonaka
1671.13Snonaka#define	spl0()		_spllower(IPL_NONE)
1681.13Snonaka
1691.13Snonaka#include <sys/spl.h>
1701.13Snonaka
1711.13Snonaka#endif	/* ! _LOCORE */
1721.13Snonaka
1731.13Snonaka#endif	/* __OLD_INTERRUPT_CODE */
1741.13Snonaka
1751.13Snonaka#endif	/* _KERNEL */
1761.13Snonaka
1771.3Stoshii#endif	/* _HPCARM_INTR_H */
178