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