Annotation of sys/arch/powerpc/include/intr.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: intr.h,v 1.33 2007/05/19 10:20:57 miod Exp $ */
2:
3: /*
4: * Copyright (c) 1997 Per Fogelstrom, Opsycon AB and RTMX Inc, USA.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: * 3. All advertising materials mentioning features or use of this software
15: * must display the following acknowledgement:
16: * This product includes software developed under OpenBSD by
17: * Per Fogelstrom, Opsycon AB, Sweden for RTMX Inc, North Carolina USA.
18: * 4. The name of the author may not be used to endorse or promote products
19: * derived from this software without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
22: * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
25: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: *
33: */
34:
35: #ifndef _POWERPC_INTR_H_
36: #define _POWERPC_INTR_H_
37:
38: #define IPL_NONE 0
39: #define IPL_BIO 1
40: #define IPL_AUDIO IPL_BIO /* XXX - was defined this val in audio_if.h */
41: #define IPL_NET 2
42: #define IPL_TTY 3
43: #define IPL_VM 4
44: #define IPL_CLOCK 5
45: #define IPL_HIGH 6
46: #define IPL_NUM 7
47:
48: #define IST_NONE 0
49: #define IST_PULSE 1
50: #define IST_EDGE 2
51: #define IST_LEVEL 3
52:
53: #if defined(_KERNEL) && !defined(_LOCORE)
54:
55: #include <sys/evcount.h>
56: #include <machine/atomic.h>
57:
58: #define PPC_NIRQ 66
59: #define PPC_CLK_IRQ 64
60: #define PPC_STAT_IRQ 65
61:
62: void setsoftclock(void);
63: void clearsoftclock(void);
64: int splsoftclock(void);
65: void setsoftnet(void);
66: void clearsoftnet(void);
67: int splsoftnet(void);
68:
69: void do_pending_int(void);
70:
71: extern int imask[IPL_NUM];
72:
73: /* SPL asserts */
74: #define splassert(wantipl) /* nothing */
75:
76: /*
77: * Reorder protection in the following inline functions is
78: * achived with an empty asm volatile statement. the compiler
79: * will not move instructions past asm volatiles.
80: */
81: volatile static __inline int
82: splraise(int newcpl)
83: {
84: struct cpu_info *ci = curcpu();
85: int oldcpl;
86:
87: __asm__ volatile("":::"memory"); /* don't reorder.... */
88: oldcpl = ci->ci_cpl;
89: ci->ci_cpl = oldcpl | newcpl;
90: __asm__ volatile("":::"memory"); /* don't reorder.... */
91: return(oldcpl);
92: }
93:
94: volatile static __inline void
95: splx(int newcpl)
96: {
97: struct cpu_info *ci = curcpu();
98:
99: __asm__ volatile("":::"memory"); /* reorder protect */
100: ci->ci_cpl = newcpl;
101: if(ci->ci_ipending & ~newcpl)
102: do_pending_int();
103: __asm__ volatile("":::"memory"); /* reorder protect */
104: }
105:
106: volatile static __inline int
107: spllower(int newcpl)
108: {
109: struct cpu_info *ci = curcpu();
110: int oldcpl;
111:
112: __asm__ volatile("":::"memory"); /* reorder protect */
113: oldcpl = ci->ci_cpl;
114: ci->ci_cpl = newcpl;
115: if(ci->ci_ipending & ~newcpl)
116: do_pending_int();
117: __asm__ volatile("":::"memory"); /* reorder protect */
118: return(oldcpl);
119: }
120:
121: #define set_sint(p) atomic_setbits_int(&curcpu()->ci_ipending, p)
122:
123: #define SINT_CLOCK 0x10000000
124: #define SINT_NET 0x20000000
125: #define SINT_TTY 0x40000000
126: #define SPL_CLOCK 0x80000000
127: #define SINT_MASK (SINT_CLOCK|SINT_NET|SINT_TTY)
128:
129: #define splbio() splraise(imask[IPL_BIO])
130: #define splnet() splraise(imask[IPL_NET])
131: #define spltty() splraise(imask[IPL_TTY])
132: #define splaudio() splraise(imask[IPL_AUDIO])
133: #define splclock() splraise(imask[IPL_CLOCK])
134: #define splvm() splraise(imask[IPL_VM])
135: #define splsched() splhigh()
136: #define spllock() splhigh()
137: #define splstatclock() splhigh()
138: #define splsoftclock() splraise(SINT_CLOCK)
139: #define splsoftnet() splraise(SINT_NET|SINT_CLOCK)
140: #define splsofttty() splraise(SINT_TTY|SINT_NET|SINT_CLOCK)
141:
142: #define setsoftclock() set_sint(SINT_CLOCK);
143: #define setsoftnet() set_sint(SINT_NET);
144: #define setsofttty() set_sint(SINT_TTY);
145:
146: #define splhigh() splraise(0xffffffff)
147: #define spl0() spllower(0)
148:
149: /*
150: * Interrupt control struct used to control the ICU setup.
151: */
152:
153: struct intrhand {
154: struct intrhand *ih_next;
155: int (*ih_fun)(void *);
156: void *ih_arg;
157: struct evcount ih_count;
158: int ih_level;
159: int ih_irq;
160: char *ih_what;
161: };
162: extern int ppc_configed_intr_cnt;
163: #define MAX_PRECONF_INTR 16
164: extern struct intrhand ppc_configed_intr[MAX_PRECONF_INTR];
165: void softnet(int isr);
166:
167: #endif /* _LOCORE */
168: #endif /* _POWERPC_INTR_H_ */
CVSweb