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

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

1.1       nbrk        1: /* $OpenBSD: intr.h,v 1.28 2007/05/16 19:37:06 thib Exp $ */
                      2: /* $NetBSD: intr.h,v 1.26 2000/06/03 20:47:41 thorpej Exp $ */
                      3:
                      4: /*-
                      5:  * Copyright (c) 2000 The NetBSD Foundation, Inc.
                      6:  * All rights reserved.
                      7:  *
                      8:  * This code is derived from software contributed to The NetBSD Foundation
                      9:  * by Jason R. Thorpe.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  * 3. All advertising materials mentioning features or use of this software
                     20:  *    must display the following acknowledgement:
                     21:  *     This product includes software developed by the NetBSD
                     22:  *     Foundation, Inc. and its contributors.
                     23:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     24:  *    contributors may be used to endorse or promote products derived
                     25:  *    from this software without specific prior written permission.
                     26:  *
                     27:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     28:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     29:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     30:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     31:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     32:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     33:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     34:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     35:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     36:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     37:  * POSSIBILITY OF SUCH DAMAGE.
                     38:  */
                     39:
                     40: /*
                     41:  * Copyright (c) 1997 Christopher G. Demetriou.  All rights reserved.
                     42:  * Copyright (c) 1996 Carnegie-Mellon University.
                     43:  * All rights reserved.
                     44:  *
                     45:  * Author: Chris G. Demetriou
                     46:  *
                     47:  * Permission to use, copy, modify and distribute this software and
                     48:  * its documentation is hereby granted, provided that both the copyright
                     49:  * notice and this permission notice appear in all copies of the
                     50:  * software, derivative works or modified versions, and any portions
                     51:  * thereof, and that both notices appear in supporting documentation.
                     52:  *
                     53:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     54:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     55:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     56:  *
                     57:  * Carnegie Mellon requests users of this software to return to
                     58:  *
                     59:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     60:  *  School of Computer Science
                     61:  *  Carnegie Mellon University
                     62:  *  Pittsburgh PA 15213-3890
                     63:  *
                     64:  * any improvements or extensions that they make and grant Carnegie the
                     65:  * rights to redistribute these changes.
                     66:  */
                     67:
                     68: #ifndef _ALPHA_INTR_H_
                     69: #define _ALPHA_INTR_H_
                     70:
                     71: #include <sys/evcount.h>
                     72: #include <sys/lock.h>
                     73: #include <sys/queue.h>
                     74: #include <machine/atomic.h>
                     75:
                     76: /*
                     77:  * The Alpha System Control Block.  This is 8k long, and you get
                     78:  * 16 bytes per vector (i.e. the vector numbers are spaced 16
                     79:  * apart).
                     80:  *
                     81:  * This is sort of a "shadow" SCB -- rather than the CPU jumping
                     82:  * to (SCBaddr + (16 * vector)), like it does on the VAX, we get
                     83:  * a vector number in a1.  We use the SCB to look up a routine/arg
                     84:  * and jump to it.
                     85:  *
                     86:  * Since we use the SCB only for I/O interrupts, we make it shorter
                     87:  * than normal, starting it at vector 0x800 (the start of the I/O
                     88:  * interrupt vectors).
                     89:  */
                     90: #define        SCB_IOVECBASE   0x0800
                     91: #define        SCB_VECSIZE     0x0010
                     92: #define        SCB_SIZE        0x2000
                     93:
                     94: #define        SCB_VECTOIDX(x) ((x) >> 4)
                     95: #define        SCB_IDXTOVEC(x) ((x) << 4)
                     96:
                     97: #define        SCB_NIOVECS     SCB_VECTOIDX(SCB_SIZE - SCB_IOVECBASE)
                     98:
                     99: struct scbvec {
                    100:        void    (*scb_func)(void *, u_long);
                    101:        void    *scb_arg;
                    102: };
                    103:
                    104: /*
                    105:  * Alpha interrupts come in at one of 4 levels:
                    106:  *
                    107:  *     software interrupt level
                    108:  *     i/o level 1
                    109:  *     i/o level 2
                    110:  *     clock level
                    111:  *
                    112:  * However, since we do not have any way to know which hardware
                    113:  * level a particular i/o interrupt comes in on, we have to
                    114:  * whittle it down to 3.
                    115:  */
                    116:
                    117: #define        IPL_NONE        ALPHA_PSL_IPL_0
                    118: #define        IPL_SOFTINT     ALPHA_PSL_IPL_SOFT
                    119: #define        IPL_BIO         ALPHA_PSL_IPL_IO
                    120: #define        IPL_NET         ALPHA_PSL_IPL_IO
                    121: #define        IPL_TTY         ALPHA_PSL_IPL_IO
                    122: #define        IPL_SERIAL      ALPHA_PSL_IPL_IO
                    123: #define        IPL_AUDIO       ALPHA_PSL_IPL_IO
                    124: #define        IPL_VM          ALPHA_PSL_IPL_IO
                    125: #define        IPL_CLOCK       ALPHA_PSL_IPL_CLOCK
                    126: #define        IPL_HIGH        ALPHA_PSL_IPL_HIGH
                    127:
                    128: #define        IPL_SOFTSERIAL  -1      /* serial software interrupts */
                    129: #define        IPL_SOFTNET     -2      /* network software interrupts */
                    130: #define        IPL_SOFTCLOCK   -3      /* clock software interrupts */
                    131: #define        IPL_SOFT        -4      /* other software interrupts */
                    132:
                    133: #define        IST_UNUSABLE    -1      /* interrupt cannot be used */
                    134: #define        IST_NONE        0       /* none (dummy) */
                    135: #define        IST_PULSE       1       /* pulsed */
                    136: #define        IST_EDGE        2       /* edge-triggered */
                    137: #define        IST_LEVEL       3       /* level-triggered */
                    138:
                    139: #define SI_SOFTSERIAL  0
                    140: #define SI_SOFTNET     1
                    141: #define SI_SOFTCLOCK   2
                    142: #define SI_SOFT                3
                    143: #define        SI_NSOFT        4
                    144:
                    145: #ifdef _KERNEL
                    146:
                    147: /* SPL asserts */
                    148: #ifdef DIAGNOSTIC
                    149: /*
                    150:  * Although this function is implemented in MI code, it must be in this MD
                    151:  * header because we don't want this header to include MI includes.
                    152:  */
                    153: void splassert_fail(int, int, const char *);
                    154: extern int splassert_ctl;
                    155: void splassert_check(int, const char *);
                    156: #define        splassert(__wantipl)                                            \
                    157:        do {                                                            \
                    158:                if (splassert_ctl > 0) {                                \
                    159:                        splassert_check(__wantipl, __func__);           \
                    160:                }                                                       \
                    161:        } while (0)
                    162: #else
                    163: #define        splassert(wantipl)      do { /* nothing */ } while (0)
                    164: #endif
                    165:
                    166: /* IPL-lowering/restoring macros */
                    167: #define splx(s)                                                                \
                    168:     ((s) == ALPHA_PSL_IPL_0 ? spl0() : alpha_pal_swpipl(s))
                    169:
                    170: /* IPL-raising functions/macros */
                    171: int _splraise(int);
                    172:
                    173: #define splsoft()              _splraise(IPL_SOFTINT)
                    174: #define splsoftserial()                splsoft()
                    175: #define splsoftclock()         splsoft()
                    176: #define splsoftnet()           splsoft()
                    177: #define splnet()                _splraise(IPL_NET)
                    178: #define splbio()                _splraise(IPL_BIO)
                    179: #define spltty()                _splraise(IPL_TTY)
                    180: #define splserial()             _splraise(IPL_SERIAL)
                    181: #define splaudio()             _splraise(IPL_AUDIO)
                    182: #define splvm()                        _splraise(IPL_VM)
                    183: #define splclock()              _splraise(IPL_CLOCK)
                    184: #define splstatclock()          _splraise(IPL_CLOCK)
                    185: #define splhigh()               _splraise(IPL_HIGH)
                    186:
                    187: #define spllpt()               spltty()
                    188: #define spllock()              splhigh()
                    189: #define splsched()             splhigh()
                    190:
                    191: /*
                    192:  * Interprocessor interrupts.  In order how we want them processed.
                    193:  */
                    194: #define        ALPHA_IPI_HALT          0x0000000000000001UL
                    195: #define        ALPHA_IPI_TBIA          0x0000000000000002UL
                    196: #define        ALPHA_IPI_TBIAP         0x0000000000000004UL
                    197: #define        ALPHA_IPI_SHOOTDOWN     0x0000000000000008UL
                    198: #define        ALPHA_IPI_IMB           0x0000000000000010UL
                    199: #define        ALPHA_IPI_AST           0x0000000000000020UL
                    200: #define        ALPHA_IPI_SYNCH_FPU     0x0000000000000040UL
                    201: #define        ALPHA_IPI_DISCARD_FPU   0x0000000000000080UL
                    202: #define        ALPHA_IPI_PAUSE         0x0000000000000100UL
                    203:
                    204: #define        ALPHA_NIPIS             6       /* must not exceed 64 */
                    205:
                    206: typedef void (*ipifunc_t)(void);
                    207: extern ipifunc_t ipifuncs[ALPHA_NIPIS];
                    208:
                    209: void   alpha_send_ipi(unsigned long, unsigned long);
                    210: void   alpha_broadcast_ipi(unsigned long);
                    211: void   alpha_multicast_ipi(unsigned long, unsigned long);
                    212:
                    213: /*
                    214:  * Alpha shared-interrupt-line common code.
                    215:  */
                    216:
                    217: struct alpha_shared_intrhand {
                    218:        TAILQ_ENTRY(alpha_shared_intrhand)
                    219:                ih_q;
                    220:        struct alpha_shared_intr *ih_intrhead;
                    221:        int     (*ih_fn)(void *);
                    222:        void    *ih_arg;
                    223:        int     ih_level;
                    224:        unsigned int ih_num;
                    225:        struct evcount ih_count;
                    226: };
                    227:
                    228: struct alpha_shared_intr {
                    229:        TAILQ_HEAD(,alpha_shared_intrhand)
                    230:                intr_q;
                    231:        void    *intr_private;
                    232:        int     intr_sharetype;
                    233:        int     intr_dfltsharetype;
                    234:        int     intr_nstrays;
                    235:        int     intr_maxstrays;
                    236: };
                    237:
                    238: #define        ALPHA_SHARED_INTR_DISABLE(asi, num)                             \
                    239:        ((asi)[num].intr_maxstrays != 0 &&                              \
                    240:         (asi)[num].intr_nstrays == (asi)[num].intr_maxstrays)
                    241:
                    242: /*
                    243:  * simulated software interrupt register
                    244:  */
                    245: extern unsigned long ssir;
                    246:
                    247: #define        setsoft(x)      atomic_setbits_ulong(&ssir, 1 << (x))
                    248:
                    249: struct alpha_soft_intrhand {
                    250:        TAILQ_ENTRY(alpha_soft_intrhand)
                    251:                sih_q;
                    252:        struct alpha_soft_intr *sih_intrhead;
                    253:        void    (*sih_fn)(void *);
                    254:        void    *sih_arg;
                    255:        int     sih_pending;
                    256: };
                    257:
                    258: struct alpha_soft_intr {
                    259:        TAILQ_HEAD(, alpha_soft_intrhand)
                    260:                softintr_q;
                    261:        struct simplelock softintr_slock;
                    262:        unsigned long softintr_siq;
                    263: };
                    264:
                    265: void   *softintr_establish(int, void (*)(void *), void *);
                    266: void   softintr_disestablish(void *);
                    267: void   softintr_init(void);
                    268: void   softintr_dispatch(void);
                    269:
                    270: #define        softintr_schedule(arg)                                          \
                    271: do {                                                                   \
                    272:        struct alpha_soft_intrhand *__sih = (arg);                      \
                    273:        struct alpha_soft_intr *__si = __sih->sih_intrhead;             \
                    274:        int __s;                                                        \
                    275:                                                                        \
                    276:        __s = splhigh();                                                \
                    277:        simple_lock(&__si->softintr_slock);                             \
                    278:        if (__sih->sih_pending == 0) {                                  \
                    279:                TAILQ_INSERT_TAIL(&__si->softintr_q, __sih, sih_q);     \
                    280:                __sih->sih_pending = 1;                                 \
                    281:                setsoft(__si->softintr_siq);                            \
                    282:        }                                                               \
                    283:        simple_unlock(&__si->softintr_slock);                           \
                    284:        splx(__s);                                                      \
                    285: } while (0)
                    286:
                    287: /* XXX For legacy software interrupts. */
                    288: extern struct alpha_soft_intrhand *softnet_intrhand;
                    289: extern struct alpha_soft_intrhand *softclock_intrhand;
                    290:
                    291: #define        setsoftnet()    softintr_schedule(softnet_intrhand)
                    292: #define        setsoftclock()  softintr_schedule(softclock_intrhand)
                    293:
                    294: struct alpha_shared_intr *alpha_shared_intr_alloc(unsigned int);
                    295: int    alpha_shared_intr_dispatch(struct alpha_shared_intr *,
                    296:            unsigned int);
                    297: void   *alpha_shared_intr_establish(struct alpha_shared_intr *,
                    298:            unsigned int, int, int, int (*)(void *), void *, const char *);
                    299: void   alpha_shared_intr_disestablish(struct alpha_shared_intr *,
                    300:            void *, const char *);
                    301: int    alpha_shared_intr_get_sharetype(struct alpha_shared_intr *,
                    302:            unsigned int);
                    303: int    alpha_shared_intr_isactive(struct alpha_shared_intr *,
                    304:            unsigned int);
                    305: int    alpha_shared_intr_firstactive(struct alpha_shared_intr *,
                    306:            unsigned int);
                    307: void   alpha_shared_intr_set_dfltsharetype(struct alpha_shared_intr *,
                    308:            unsigned int, int);
                    309: void   alpha_shared_intr_set_maxstrays(struct alpha_shared_intr *,
                    310:            unsigned int, int);
                    311: void   alpha_shared_intr_reset_strays(struct alpha_shared_intr *,
                    312:            unsigned int);
                    313: void   alpha_shared_intr_stray(struct alpha_shared_intr *, unsigned int,
                    314:            const char *);
                    315: void   alpha_shared_intr_set_private(struct alpha_shared_intr *,
                    316:            unsigned int, void *);
                    317: void   *alpha_shared_intr_get_private(struct alpha_shared_intr *,
                    318:            unsigned int);
                    319:
                    320: extern struct scbvec scb_iovectab[];
                    321:
                    322: void   scb_init(void);
                    323: void   scb_set(u_long, void (*)(void *, u_long), void *);
                    324: u_long scb_alloc(void (*)(void *, u_long), void *);
                    325: void   scb_free(u_long);
                    326:
                    327: #define        SCB_ALLOC_FAILED        ((u_long) -1)
                    328:
                    329: #endif /* _KERNEL */
                    330: #endif /* ! _ALPHA_INTR_H_ */

CVSweb