[BACK]Return to intr.h CVS log [TXT][DIR] Up to [local] / sys / arch / sgi / include

Annotation of sys/arch/sgi/include/intr.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: intr.h,v 1.18 2007/06/20 16:50:41 miod Exp $ */
                      2:
                      3: /*
                      4:  * Copyright (c) 2001-2004 Opsycon AB  (www.opsycon.se / www.opsycon.com)
                      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:  *
                     15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
                     16:  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     18:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
                     19:  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     20:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     21:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     22:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     23:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     24:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     25:  * SUCH DAMAGE.
                     26:  *
                     27:  */
                     28:
                     29: #ifndef _MACHINE_INTR_H_
                     30: #define _MACHINE_INTR_H_
                     31:
                     32: /*
                     33:  *  The interrupt mask cpl is a mask which can be used with the
                     34:  *  CPU interrupt mask register or an external HW mask register.
                     35:  *  If interrupts are masked by the CPU interrupt mask all external
                     36:  *  masks should be enabled and any routing set up so that the
                     37:  *  interrupt source is routed to the CPU interrupt corresponding
                     38:  *  to the interrupts "priority level". In this case the generic
                     39:  *  interrupt handler can be used.
                     40:  *
                     41:  *  The IMASK_EXTERNAL define is used to select whether the CPU
                     42:  *  interrupt mask should be controlled by the cpl mask value
                     43:  *  or not. If the mask is external, the CPU mask is never changed
                     44:  *  from the value it gets when interrupt dispatchers are registred.
                     45:  *  When an external masking register is used dedicated interrupt
                     46:  *  handlers must be written as well as ipending handlers.
                     47:  */
                     48: #define        IMASK_EXTERNAL          /* XXX move this to config */
                     49:
                     50: /* This define controls whether splraise is inlined or not */
                     51: /* #define INLINE_SPLRAISE */
                     52:
                     53:
                     54: /* Interrupt priority `levels'; not mutually exclusive. */
                     55: #define        IPL_NONE        0       /* nothing */
                     56: #define        IPL_BIO         1       /* block I/O */
                     57: #define IPL_AUDIO      IPL_BIO
                     58: #define        IPL_NET         2       /* network */
                     59: #define        IPL_TTY         3       /* terminal */
                     60: #define        IPL_VM          4       /* memory allocation */
                     61: #define        IPL_CLOCK       5       /* clock */
                     62: #define        IPL_HIGH        6       /* everything */
                     63: #define        NIPLS           7       /* Number of levels */
                     64:
                     65: /* Interrupt sharing types. */
                     66: #define        IST_NONE        0       /* none */
                     67: #define        IST_PULSE       1       /* pulsed */
                     68: #define        IST_EDGE        2       /* edge-triggered */
                     69: #define        IST_LEVEL       3       /* level-triggered */
                     70:
                     71: /* Soft interrupt masks. */
                     72: #define        SINT_CLOCK      31
                     73: #define        SINT_CLOCKMASK  (1 << SINT_CLOCK)
                     74: #define        SINT_NET        30
                     75: #define        SINT_NETMASK    ((1 << SINT_NET) | SINT_CLOCKMASK)
                     76: #define        SINT_TTY        29
                     77: #define        SINT_TTYMASK    ((1 << SINT_TTY) | SINT_CLOCKMASK)
                     78: #define        SINT_ALLMASK    (SINT_CLOCKMASK | SINT_NETMASK | SINT_TTYMASK)
                     79: #define        SPL_CLOCK       28
                     80: #define        SPL_CLOCKMASK   (1 << SPL_CLOCK)
                     81:
                     82: #ifndef _LOCORE
                     83:
                     84: #define splbio()               splraise(imask[IPL_BIO])
                     85: #define splnet()               splraise(imask[IPL_NET])
                     86: #define spltty()               splraise(imask[IPL_TTY])
                     87: #define splaudio()             splraise(imask[IPL_AUDIO])
                     88: #define splclock()             splraise(imask[IPL_CLOCK])
                     89: #define splvm()                        splraise(imask[IPL_VM])
                     90: #define splsoftclock()         splraise(SINT_CLOCKMASK)
                     91: #define splsoftnet()           splraise(SINT_NETMASK|SINT_CLOCKMASK)
                     92: #define splsofttty()           splraise(SINT_TTYMASK)
                     93: #define splstatclock()         splhigh()
                     94: #define splsched()             splhigh()
                     95: #define splhigh()              splraise(-1)
                     96: #define spl0()                 spllower(0)
                     97:
                     98: #include <machine/atomic.h>
                     99:
                    100: #define setsoftclock()         atomic_setbits_int(&ipending, SINT_CLOCKMASK)
                    101: #define setsoftnet()           atomic_setbits_int(&ipending, SINT_NETMASK)
                    102: #define setsofttty()           atomic_setbits_int(&ipending, SINT_TTYMASK)
                    103:
                    104: void   splinit(void);
                    105:
                    106: #define        splassert(X)
                    107:
                    108: /*
                    109:  *  Schedule prioritys for base interrupts (cpu)
                    110:  */
                    111: #define        INTPRI_CLOCK    1
                    112: #define        INTPRI_MACEIO   2       /* O2 I/O interrupt */
                    113: #define        INTPRI_XBOWMUX  2       /* Origin 200/2000 I/O interrupt */
                    114: #define        INTPRI_MACEAUX  3
                    115:
                    116: /*
                    117:  *   Define a type for interrupt masks. We may need 64 bits here.
                    118:  */
                    119: typedef u_int32_t intrmask_t;          /* Type of var holding interrupt mask */
                    120:
                    121: #define        INTMASKSIZE     (sizeof(intrmask_t) * 8)
                    122:
                    123: extern volatile intrmask_t cpl;
                    124: extern volatile intrmask_t ipending;
                    125: extern volatile intrmask_t astpending;
                    126:
                    127: extern intrmask_t imask[NIPLS];
                    128:
                    129: /*
                    130:  *  A note on clock interrupts. Clock interrupts are always
                    131:  *  allowed to happen but will not be serviced if masked.
                    132:  *  The reason for this is that clocks usually sits on INT5
                    133:  *  and can not be easily masked if external HW masking is used.
                    134:  */
                    135:
                    136: /* Inlines */
                    137: static __inline void register_pending_int_handler(void (*)(int));
                    138: static __inline void splx(int newcpl);
                    139: static __inline int spllower(int newcpl);
                    140:
                    141: typedef void  (int_f) (int);
                    142: extern int_f *pending_hand;
                    143:
                    144: static __inline void
                    145: register_pending_int_handler(void(*pending)(int))
                    146: {
                    147:        pending_hand = pending;
                    148: }
                    149:
                    150: /*
                    151:  */
                    152: #ifdef INLINE_SPLRAISE
                    153: static __inline int splraise(int newcpl);
                    154: static __inline int
                    155: splraise(int newcpl)
                    156: {
                    157:        int oldcpl;
                    158:
                    159:        __asm__ (" .set noreorder\n");
                    160:        oldcpl = cpl;
                    161:        cpl = oldcpl | newcpl;
                    162:        __asm__ (" sync\n .set reorder\n");
                    163:        return (oldcpl);
                    164: }
                    165: #else
                    166: int splraise(int newcpl);
                    167: #endif
                    168:
                    169: static __inline void
                    170: splx(int newcpl)
                    171: {
                    172:        if (ipending & ~newcpl)
                    173:                (*pending_hand)(newcpl);
                    174:        else
                    175:                cpl = newcpl;
                    176: }
                    177:
                    178: static __inline int
                    179: spllower(int newcpl)
                    180: {
                    181:        int oldcpl;
                    182:
                    183:        oldcpl = cpl;
                    184:        if (ipending & ~newcpl)
                    185:                (*pending_hand)(newcpl);
                    186:        else
                    187:                cpl = newcpl;
                    188:        return (oldcpl);
                    189: }
                    190:
                    191: /*
                    192:  * Interrupt control struct used by interrupt dispatchers
                    193:  * to hold interrupt handler info.
                    194:  */
                    195:
                    196: #include <sys/evcount.h>
                    197:
                    198: struct intrhand {
                    199:        struct  intrhand *ih_next;
                    200:        int     (*ih_fun)(void *);
                    201:        void    *ih_arg;
                    202:        int     ih_level;
                    203:        int     ih_irq;
                    204:        char    *ih_what;
                    205:        void    *frame;
                    206:        struct evcount  ih_count;
                    207: };
                    208:
                    209: extern struct intrhand *intrhand[INTMASKSIZE];
                    210:
                    211: /*
                    212:  * Low level interrupt dispatcher registration data.
                    213:  */
                    214: #define NLOWINT        16              /* Number of low level registrations possible */
                    215:
                    216: struct trap_frame;
                    217:
                    218: extern intrmask_t idle_mask;
                    219: extern int last_low_int;
                    220:
                    221: void set_intr(int, intrmask_t, intrmask_t(*)(intrmask_t, struct trap_frame *));
                    222:
                    223: #ifdef IMASK_EXTERNAL
                    224: void hw_setintrmask(intrmask_t);
                    225: extern void *hwmask_addr;
                    226: #endif
                    227:
                    228: /*
                    229:  *  Generic interrupt handling code that can be used for simple
                    230:  *  interrupt hardware models. Functions can also be used by
                    231:  *  more complex code especially the mask calculation code.
                    232:  */
                    233:
                    234: void *generic_intr_establish(void *, u_long, int, int,
                    235:            int (*)(void *), void *, char *);
                    236: void generic_intr_disestablish(void *, void *);
                    237: void generic_intr_makemasks(void);
                    238: void generic_do_pending_int(int);
                    239: intrmask_t generic_iointr(intrmask_t, struct trap_frame *);
                    240:
                    241: #endif /* _LOCORE */
                    242:
                    243: #endif /* _MACHINE_INTR_H_ */

CVSweb