intr.h revision 1.23
11.23Sperry/* $NetBSD: intr.h,v 1.23 2006/02/16 20:17:13 perry 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.18Sthorpej#define IPL_VM 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.19Smatt#define CLKF_BASEPRI(frame) ((frame)->pri == 0) 661.2Ssakamoto/* 671.2Ssakamoto * Interrupt handler chains. intr_establish() inserts a handler into 681.2Ssakamoto * the list. The handler is called with its (single) argument. 691.2Ssakamoto */ 701.2Ssakamotostruct intrhand { 711.2Ssakamoto int (*ih_fun) __P((void *)); 721.2Ssakamoto void *ih_arg; 731.2Ssakamoto u_long ih_count; 741.2Ssakamoto struct intrhand *ih_next; 751.2Ssakamoto int ih_level; 761.2Ssakamoto int ih_irq; 771.2Ssakamoto}; 781.2Ssakamoto 791.2Ssakamotovoid do_pending_int __P((void)); 801.14Smatt 811.14Smattvoid ext_intr __P((void)); 821.14Smattvoid *intr_establish __P((int, int, int, int (*)(void *), void *)); 831.14Smattvoid intr_disestablish __P((void *)); 841.14Smattvoid intr_calculatemasks __P((void)); 851.14Smattint isa_intr __P((void)); 861.14Smattvoid isa_intr_mask __P((int)); 871.14Smattvoid isa_intr_clr __P((int)); 881.14Smatt 891.14Smattvoid enable_intr __P((void)); 901.14Smattvoid disable_intr __P((void)); 911.2Ssakamoto 921.23Sperrystatic __inline int splraise __P((int)); 931.23Sperrystatic __inline int spllower __P((int)); 941.23Sperrystatic __inline void splx __P((int)); 951.23Sperrystatic __inline void set_sint __P((int)); 961.2Ssakamoto 971.2Ssakamotoextern volatile int cpl, ipending, astpending, tickspending; 981.2Ssakamotoextern int imask[]; 991.7Ssakamotoextern long intrcnt[]; 1001.2Ssakamoto 1011.2Ssakamoto/* 1021.2Ssakamoto * Reorder protection in the following inline functions is 1031.15Swiz * achieved with the "eieio" instruction which the assembler 1041.16Swiz * seems to detect and then doesn't move instructions past.... 1051.2Ssakamoto */ 1061.23Sperrystatic __inline int 1071.2Ssakamotosplraise(newcpl) 1081.2Ssakamoto int newcpl; 1091.2Ssakamoto{ 1101.2Ssakamoto int oldcpl; 1111.2Ssakamoto 1121.22Sperry __asm volatile("sync; eieio\n"); /* don't reorder.... */ 1131.2Ssakamoto oldcpl = cpl; 1141.2Ssakamoto cpl = oldcpl | newcpl; 1151.22Sperry __asm volatile("sync; eieio\n"); /* reorder protect */ 1161.2Ssakamoto return(oldcpl); 1171.2Ssakamoto} 1181.2Ssakamoto 1191.23Sperrystatic __inline void 1201.2Ssakamotosplx(newcpl) 1211.2Ssakamoto int newcpl; 1221.2Ssakamoto{ 1231.22Sperry __asm volatile("sync; eieio\n"); /* reorder protect */ 1241.2Ssakamoto cpl = newcpl; 1251.2Ssakamoto if(ipending & ~newcpl) 1261.2Ssakamoto do_pending_int(); 1271.22Sperry __asm volatile("sync; eieio\n"); /* reorder protect */ 1281.2Ssakamoto} 1291.2Ssakamoto 1301.23Sperrystatic __inline int 1311.2Ssakamotospllower(newcpl) 1321.2Ssakamoto int newcpl; 1331.2Ssakamoto{ 1341.2Ssakamoto int oldcpl; 1351.2Ssakamoto 1361.22Sperry __asm volatile("sync; eieio\n"); /* reorder protect */ 1371.2Ssakamoto oldcpl = cpl; 1381.2Ssakamoto cpl = newcpl; 1391.2Ssakamoto if(ipending & ~newcpl) 1401.2Ssakamoto do_pending_int(); 1411.22Sperry __asm volatile("sync; eieio\n"); /* reorder protect */ 1421.2Ssakamoto return(oldcpl); 1431.2Ssakamoto} 1441.2Ssakamoto 1451.2Ssakamoto/* Following code should be implemented with lwarx/stwcx to avoid 1461.2Ssakamoto * the disable/enable. i need to read the manual once more.... */ 1471.23Sperrystatic __inline void 1481.2Ssakamotoset_sint(pending) 1491.2Ssakamoto int pending; 1501.2Ssakamoto{ 1511.2Ssakamoto int msrsave; 1521.2Ssakamoto 1531.22Sperry __asm ("mfmsr %0" : "=r"(msrsave)); 1541.22Sperry __asm volatile ("mtmsr %0" :: "r"(msrsave & ~PSL_EE)); 1551.2Ssakamoto ipending |= pending; 1561.22Sperry __asm volatile ("mtmsr %0" :: "r"(msrsave)); 1571.2Ssakamoto} 1581.2Ssakamoto 1591.2Ssakamoto#define ICU_LEN 32 1601.2Ssakamoto#define IRQ_SLAVE 2 1611.2Ssakamoto#define LEGAL_IRQ(x) ((x) >= 0 && (x) < ICU_LEN && (x) != IRQ_SLAVE) 1621.2Ssakamoto 1631.2Ssakamoto#define MOTHER_BOARD_REG 0x7ffff000 1641.2Ssakamoto#define CPU0_INT_MASK 0x0f0 1651.2Ssakamoto#define CPU1_INT_MASK 0x1f0 1661.2Ssakamoto#define INT_STATE_REG 0x2f0 1671.2Ssakamoto 1681.3Ssakamoto#define SINT_CLOCK 0x20000000 1691.3Ssakamoto#define SINT_NET 0x40000000 1701.4Ssakamoto#define SINT_SERIAL 0x80000000 1711.3Ssakamoto#define SPL_CLOCK 0x00000001 1721.4Ssakamoto#define SINT_MASK (SINT_CLOCK|SINT_NET|SINT_SERIAL) 1731.2Ssakamoto 1741.2Ssakamoto#define CNT_SINT_NET 29 1751.2Ssakamoto#define CNT_SINT_CLOCK 30 1761.4Ssakamoto#define CNT_SINT_SERIAL 31 1771.3Ssakamoto#define CNT_CLOCK 0 1781.2Ssakamoto 1791.2Ssakamoto#define splbio() splraise(imask[IPL_BIO]) 1801.2Ssakamoto#define splnet() splraise(imask[IPL_NET]) 1811.2Ssakamoto#define spltty() splraise(imask[IPL_TTY]) 1821.8Sthorpej#define splclock() splraise(imask[IPL_CLOCK]) 1831.18Sthorpej#define splvm() splraise(imask[IPL_VM]) 1841.4Ssakamoto#define splserial() splraise(imask[IPL_SERIAL]) 1851.8Sthorpej#define splstatclock() splclock() 1861.9Sthorpej#define spllowersoftclock() spllower(imask[IPL_SOFTCLOCK]) 1871.9Sthorpej#define splsoftclock() splraise(imask[IPL_SOFTCLOCK]) 1881.8Sthorpej#define splsoftnet() splraise(imask[IPL_SOFTNET]) 1891.8Sthorpej#define splsoftserial() splraise(imask[IPL_SOFTSERIAL]) 1901.5Sis 1911.5Sis#define spllpt() spltty() 1921.2Ssakamoto 1931.2Ssakamoto#define setsoftclock() set_sint(SINT_CLOCK); 1941.2Ssakamoto#define setsoftnet() set_sint(SINT_NET); 1951.4Ssakamoto#define setsoftserial() set_sint(SINT_SERIAL); 1961.2Ssakamoto 1971.8Sthorpej#define splhigh() splraise(imask[IPL_HIGH]) 1981.2Ssakamoto#define spl0() spllower(0) 1991.10Sthorpej 2001.10Sthorpej#define splsched() splhigh() 2011.11Sthorpej#define spllock() splhigh() 2021.1Ssakamoto 2031.1Ssakamoto#endif /* !_LOCORE */ 2041.1Ssakamoto 2051.1Ssakamoto#endif /* !_BEBOX_INTR_H_ */ 206