intr.h revision 1.16
1/* $NetBSD: intr.h,v 1.16 1998/09/21 00:33:16 matt Exp $ */ 2 3/* 4 * Copyright (c) 1997 Christopher G. Demetriou. All rights reserved. 5 * Copyright (c) 1996 Carnegie-Mellon University. 6 * All rights reserved. 7 * 8 * Author: Chris G. Demetriou 9 * 10 * Permission to use, copy, modify and distribute this software and 11 * its documentation is hereby granted, provided that both the copyright 12 * notice and this permission notice appear in all copies of the 13 * software, derivative works or modified versions, and any portions 14 * thereof, and that both notices appear in supporting documentation. 15 * 16 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 17 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 18 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 19 * 20 * Carnegie Mellon requests users of this software to return to 21 * 22 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 23 * School of Computer Science 24 * Carnegie Mellon University 25 * Pittsburgh PA 15213-3890 26 * 27 * any improvements or extensions that they make and grant Carnegie the 28 * rights to redistribute these changes. 29 */ 30 31#ifndef _ALPHA_INTR_H_ 32#define _ALPHA_INTR_H_ 33 34#include <sys/queue.h> 35 36#define IPL_NONE 0 /* disable only this interrupt */ 37#define IPL_BIO 1 /* disable block I/O interrupts */ 38#define IPL_NET 2 /* disable network interrupts */ 39#define IPL_TTY 3 /* disable terminal interrupts */ 40#define IPL_CLOCK 4 /* disable clock interrupts */ 41#define IPL_HIGH 5 /* disable all interrupts */ 42#define IPL_SERIAL 6 /* disable serial interrupts */ 43 44#define IST_UNUSABLE -1 /* interrupt cannot be used */ 45#define IST_NONE 0 /* none (dummy) */ 46#define IST_PULSE 1 /* pulsed */ 47#define IST_EDGE 2 /* edge-triggered */ 48#define IST_LEVEL 3 /* level-triggered */ 49#ifdef _KERNEL 50 51/* IPL-lowering/restoring macros */ 52#define splx(s) \ 53 ((s) == ALPHA_PSL_IPL_0 ? spl0() : alpha_pal_swpipl(s)) 54#define splsoft() alpha_pal_swpipl(ALPHA_PSL_IPL_SOFT) 55#define splsoftserial() splsoft() 56#define splsoftclock() splsoft() 57#define splsoftnet() splsoft() 58 59/* IPL-raising functions/macros */ 60static __inline int _splraise __P((int)) __attribute__ ((unused)); 61static __inline int 62_splraise(s) 63 int s; 64{ 65 int cur = alpha_pal_rdps() & ALPHA_PSL_IPL_MASK; 66 return (s > cur ? alpha_pal_swpipl(s) : cur); 67} 68#define splnet() _splraise(ALPHA_PSL_IPL_IO) 69#define splbio() _splraise(ALPHA_PSL_IPL_IO) 70#define splimp() _splraise(ALPHA_PSL_IPL_IO) 71#define spltty() _splraise(ALPHA_PSL_IPL_IO) 72#define splserial() _splraise(ALPHA_PSL_IPL_IO) 73#define splclock() _splraise(ALPHA_PSL_IPL_CLOCK) 74#define splstatclock() _splraise(ALPHA_PSL_IPL_CLOCK) 75#define splhigh() _splraise(ALPHA_PSL_IPL_HIGH) 76 77#define spllpt() spltty() 78 79/* 80 * simulated software interrupt register 81 */ 82extern u_int64_t ssir; 83 84#define SIR_NET 0x1 85#define SIR_CLOCK 0x2 86#define SIR_SERIAL 0x4 87 88#define setsoftnet() ssir |= SIR_NET 89#define setsoftclock() ssir |= SIR_CLOCK 90#define setsoftserial() ssir |= SIR_SERIAL 91 92/* 93 * Alpha shared-interrupt-line common code. 94 */ 95 96struct alpha_shared_intrhand { 97 TAILQ_ENTRY(alpha_shared_intrhand) 98 ih_q; 99 int (*ih_fn) __P((void *)); 100 void *ih_arg; 101 int ih_level; 102 unsigned int ih_num; 103}; 104 105struct alpha_shared_intr { 106 TAILQ_HEAD(,alpha_shared_intrhand) 107 intr_q; 108 int intr_sharetype; 109 int intr_dfltsharetype; 110 int intr_nstrays; 111 int intr_maxstrays; 112}; 113 114#define ALPHA_SHARED_INTR_DISABLE(asi, num) \ 115 ((asi)[num].intr_maxstrays != 0 && \ 116 (asi)[num].intr_nstrays == (asi)[num].intr_maxstrays) 117 118struct alpha_shared_intr *alpha_shared_intr_alloc __P((unsigned int)); 119int alpha_shared_intr_dispatch __P((struct alpha_shared_intr *, 120 unsigned int)); 121void *alpha_shared_intr_establish __P((struct alpha_shared_intr *, 122 unsigned int, int, int, int (*)(void *), void *, const char *)); 123void alpha_shared_intr_disestablish __P((struct alpha_shared_intr *, 124 void *, const char *)); 125int alpha_shared_intr_get_sharetype __P((struct alpha_shared_intr *, 126 unsigned int)); 127int alpha_shared_intr_isactive __P((struct alpha_shared_intr *, 128 unsigned int)); 129void alpha_shared_intr_set_dfltsharetype __P((struct alpha_shared_intr *, 130 unsigned int, int)); 131void alpha_shared_intr_set_maxstrays __P((struct alpha_shared_intr *, 132 unsigned int, int)); 133void alpha_shared_intr_stray __P((struct alpha_shared_intr *, unsigned int, 134 const char *)); 135 136#endif 137#endif 138