summaryrefslogtreecommitdiff
path: root/sys/arch/alpha/include/intr.h
diff options
context:
space:
mode:
authorArtur Grabowski <art@cvs.openbsd.org>2000-11-08 16:01:27 +0000
committerArtur Grabowski <art@cvs.openbsd.org>2000-11-08 16:01:27 +0000
commitfd438f5ca0b94ed3d88d133b522e0103dee486b8 (patch)
tree6d0a5d2c22adef30dd9a9bb3ce9d92ff9ebc024a /sys/arch/alpha/include/intr.h
parent979a51167c72e38f0c094528a264a7fccca6d1c5 (diff)
Merge in big portions of the improvements NetBSD did to their alpha port.
Highlights: UVM, PMAP_NEW, bus_dma (only on some buses for now), new hardware support, possiblity for ELF, etc, etc. Too much to mention. This is still work in progress. video consoles might be broken, otherwise we have basically the same functionality as before plus more.
Diffstat (limited to 'sys/arch/alpha/include/intr.h')
-rw-r--r--sys/arch/alpha/include/intr.h93
1 files changed, 74 insertions, 19 deletions
diff --git a/sys/arch/alpha/include/intr.h b/sys/arch/alpha/include/intr.h
index 6c30e75771a..2c9bebf21da 100644
--- a/sys/arch/alpha/include/intr.h
+++ b/sys/arch/alpha/include/intr.h
@@ -1,7 +1,7 @@
-/* $OpenBSD: intr.h,v 1.6 2000/07/06 15:25:02 ho Exp $ */
-/* $NetBSD: intr.h,v 1.4 1996/12/03 17:34:47 cgd Exp $ */
+/* $NetBSD: intr.h,v 1.25 2000/05/23 05:12:56 thorpej Exp $ */
/*
+ * Copyright (c) 1997 Christopher G. Demetriou. All rights reserved.
* Copyright (c) 1996 Carnegie-Mellon University.
* All rights reserved.
*
@@ -32,6 +32,7 @@
#define _ALPHA_INTR_H_
#include <sys/queue.h>
+#include <machine/atomic.h>
#define IPL_NONE 0 /* disable only this interrupt */
#define IPL_BIO 1 /* disable block I/O interrupts */
@@ -39,6 +40,7 @@
#define IPL_TTY 3 /* disable terminal interrupts */
#define IPL_CLOCK 4 /* disable clock interrupts */
#define IPL_HIGH 5 /* disable all interrupts */
+#define IPL_SERIAL 6 /* disable serial interrupts */
#define IST_UNUSABLE -1 /* interrupt cannot be used */
#define IST_NONE 0 /* none (dummy) */
@@ -46,19 +48,36 @@
#define IST_EDGE 2 /* edge-triggered */
#define IST_LEVEL 3 /* level-triggered */
+#ifdef _KERNEL
+
+/* IPL-lowering/restoring macros */
#define splx(s) \
- (s == ALPHA_PSL_IPL_0 ? spl0() : alpha_pal_swpipl(s))
-#define splsoft() alpha_pal_swpipl(ALPHA_PSL_IPL_SOFT)
-#define spllowersoftclock() splsoft()
-#define splsoftclock() splsoft()
-#define splsoftnet() splsoft()
-#define splnet() alpha_pal_swpipl(ALPHA_PSL_IPL_IO)
-#define splbio() alpha_pal_swpipl(ALPHA_PSL_IPL_IO)
-#define splimp() alpha_pal_swpipl(ALPHA_PSL_IPL_IO)
-#define spltty() alpha_pal_swpipl(ALPHA_PSL_IPL_IO)
-#define splclock() alpha_pal_swpipl(ALPHA_PSL_IPL_CLOCK)
-#define splstatclock() alpha_pal_swpipl(ALPHA_PSL_IPL_CLOCK)
-#define splhigh() alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH)
+ ((s) == ALPHA_PSL_IPL_0 ? spl0() : alpha_pal_swpipl(s))
+#define spllowersoftclock() alpha_pal_swpipl(ALPHA_PSL_IPL_SOFT)
+
+/* IPL-raising functions/macros */
+static __inline int _splraise __P((int)) __attribute__ ((unused));
+static __inline int
+_splraise(s)
+ int s;
+{
+ int cur = alpha_pal_rdps() & ALPHA_PSL_IPL_MASK;
+ return (s > cur ? alpha_pal_swpipl(s) : cur);
+}
+#define splsoft() _splraise(ALPHA_PSL_IPL_SOFT)
+#define splsoftserial() splsoft()
+#define splsoftclock() splsoft()
+#define splsoftnet() splsoft()
+#define splnet() _splraise(ALPHA_PSL_IPL_IO)
+#define splbio() _splraise(ALPHA_PSL_IPL_IO)
+#define splimp() _splraise(ALPHA_PSL_IPL_IO)
+#define spltty() _splraise(ALPHA_PSL_IPL_IO)
+#define splserial() _splraise(ALPHA_PSL_IPL_IO)
+#define splclock() _splraise(ALPHA_PSL_IPL_CLOCK)
+#define splstatclock() _splraise(ALPHA_PSL_IPL_CLOCK)
+#define splhigh() _splraise(ALPHA_PSL_IPL_HIGH)
+
+#define spllpt() spltty()
/*
* simulated software interrupt register
@@ -67,9 +86,31 @@ extern u_int64_t ssir;
#define SIR_NET 0x1
#define SIR_CLOCK 0x2
+#define SIR_SERIAL 0x4
+
+#define setsoft(x) atomic_setbits_ulong(&ssir, (x))
+
+#define setsoftnet() setsoft(SIR_NET)
+#define setsoftclock() setsoft(SIR_CLOCK)
+#define setsoftserial() setsoft(SIR_SERIAL)
+
+/*
+ * Interprocessor interrupts. In order how we want them processed.
+ */
+#define ALPHA_IPI_HALT 0x0000000000000001UL
+#define ALPHA_IPI_TBIA 0x0000000000000002UL
+#define ALPHA_IPI_TBIAP 0x0000000000000004UL
+#define ALPHA_IPI_SHOOTDOWN 0x0000000000000008UL
+#define ALPHA_IPI_IMB 0x0000000000000010UL
+#define ALPHA_IPI_AST 0x0000000000000020UL
+
+#define ALPHA_NIPIS 6 /* must not exceed 64 */
-#define setsoftnet() ssir |= SIR_NET
-#define setsoftclock() ssir |= SIR_CLOCK
+typedef void (*ipifunc_t) __P((void));
+extern ipifunc_t ipifuncs[ALPHA_NIPIS];
+
+void alpha_send_ipi __P((unsigned long, unsigned long));
+void alpha_broadcast_ipi __P((unsigned long));
/*
* Alpha shared-interrupt-line common code.
@@ -78,27 +119,34 @@ extern u_int64_t ssir;
struct alpha_shared_intrhand {
TAILQ_ENTRY(alpha_shared_intrhand)
ih_q;
+ struct alpha_shared_intr *ih_intrhead;
int (*ih_fn) __P((void *));
void *ih_arg;
int ih_level;
+ unsigned int ih_num;
};
struct alpha_shared_intr {
TAILQ_HEAD(,alpha_shared_intrhand)
intr_q;
+ void *intr_private;
int intr_sharetype;
int intr_dfltsharetype;
int intr_nstrays;
int intr_maxstrays;
};
+#define ALPHA_SHARED_INTR_DISABLE(asi, num) \
+ ((asi)[num].intr_maxstrays != 0 && \
+ (asi)[num].intr_nstrays == (asi)[num].intr_maxstrays)
+
struct alpha_shared_intr *alpha_shared_intr_alloc __P((unsigned int));
int alpha_shared_intr_dispatch __P((struct alpha_shared_intr *,
unsigned int));
-int alpha_shared_intr_check __P((struct alpha_shared_intr *,
- unsigned int, int));
void *alpha_shared_intr_establish __P((struct alpha_shared_intr *,
unsigned int, int, int, int (*)(void *), void *, const char *));
+void alpha_shared_intr_disestablish __P((struct alpha_shared_intr *,
+ void *, const char *));
int alpha_shared_intr_get_sharetype __P((struct alpha_shared_intr *,
unsigned int));
int alpha_shared_intr_isactive __P((struct alpha_shared_intr *,
@@ -109,5 +157,12 @@ void alpha_shared_intr_set_maxstrays __P((struct alpha_shared_intr *,
unsigned int, int));
void alpha_shared_intr_stray __P((struct alpha_shared_intr *, unsigned int,
const char *));
+void alpha_shared_intr_set_private __P((struct alpha_shared_intr *,
+ unsigned int, void *));
+void *alpha_shared_intr_get_private __P((struct alpha_shared_intr *,
+ unsigned int));
+
+void set_iointr(void (*)(void *, unsigned long));
-#endif
+#endif /* _KERNEL */
+#endif /* ! _ALPHA_INTR_H_ */