intr.h revision 1.17
1/* $NetBSD: intr.h,v 1.17 1998/09/25 22:06:33 thorpej 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 50#ifdef _KERNEL 51 52/* IPL-lowering/restoring macros */ 53#define splx(s) \ 54 ((s) == ALPHA_PSL_IPL_0 ? spl0() : alpha_pal_swpipl(s)) 55#define splsoft() alpha_pal_swpipl(ALPHA_PSL_IPL_SOFT) 56#define splsoftserial() splsoft() 57#define splsoftclock() splsoft() 58#define splsoftnet() splsoft() 59 60/* IPL-raising functions/macros */ 61static __inline int _splraise __P((int)) __attribute__ ((unused)); 62static __inline int 63_splraise(s) 64 int s; 65{ 66 int cur = alpha_pal_rdps() & ALPHA_PSL_IPL_MASK; 67 return (s > cur ? alpha_pal_swpipl(s) : cur); 68} 69#define splnet() _splraise(ALPHA_PSL_IPL_IO) 70#define splbio() _splraise(ALPHA_PSL_IPL_IO) 71#define splimp() _splraise(ALPHA_PSL_IPL_IO) 72#define spltty() _splraise(ALPHA_PSL_IPL_IO) 73#define splserial() _splraise(ALPHA_PSL_IPL_IO) 74#define splclock() _splraise(ALPHA_PSL_IPL_CLOCK) 75#define splstatclock() _splraise(ALPHA_PSL_IPL_CLOCK) 76#define splhigh() _splraise(ALPHA_PSL_IPL_HIGH) 77 78#define spllpt() spltty() 79 80/* 81 * simulated software interrupt register 82 */ 83extern u_int64_t ssir; 84 85#define SIR_NET 0x1 86#define SIR_CLOCK 0x2 87#define SIR_SERIAL 0x4 88 89#define setsoftnet() ssir |= SIR_NET 90#define setsoftclock() ssir |= SIR_CLOCK 91#define setsoftserial() ssir |= SIR_SERIAL 92 93/* 94 * Alpha shared-interrupt-line common code. 95 */ 96 97struct alpha_shared_intrhand { 98 TAILQ_ENTRY(alpha_shared_intrhand) 99 ih_q; 100 int (*ih_fn) __P((void *)); 101 void *ih_arg; 102 int ih_level; 103 unsigned int ih_num; 104}; 105 106struct alpha_shared_intr { 107 TAILQ_HEAD(,alpha_shared_intrhand) 108 intr_q; 109 int intr_sharetype; 110 int intr_dfltsharetype; 111 int intr_nstrays; 112 int intr_maxstrays; 113}; 114 115#define ALPHA_SHARED_INTR_DISABLE(asi, num) \ 116 ((asi)[num].intr_maxstrays != 0 && \ 117 (asi)[num].intr_nstrays == (asi)[num].intr_maxstrays) 118 119struct alpha_shared_intr *alpha_shared_intr_alloc __P((unsigned int)); 120int alpha_shared_intr_dispatch __P((struct alpha_shared_intr *, 121 unsigned int)); 122void *alpha_shared_intr_establish __P((struct alpha_shared_intr *, 123 unsigned int, int, int, int (*)(void *), void *, const char *)); 124void alpha_shared_intr_disestablish __P((struct alpha_shared_intr *, 125 void *, const char *)); 126int alpha_shared_intr_get_sharetype __P((struct alpha_shared_intr *, 127 unsigned int)); 128int alpha_shared_intr_isactive __P((struct alpha_shared_intr *, 129 unsigned int)); 130void alpha_shared_intr_set_dfltsharetype __P((struct alpha_shared_intr *, 131 unsigned int, int)); 132void alpha_shared_intr_set_maxstrays __P((struct alpha_shared_intr *, 133 unsigned int, int)); 134void alpha_shared_intr_stray __P((struct alpha_shared_intr *, unsigned int, 135 const char *)); 136 137#endif /* _KERNEL */ 138#endif /* ! _ALPHA_INTR_H_ */ 139