Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _SYS_AVINTR_H
     27 #define	_SYS_AVINTR_H
     28 
     29 
     30 #include <sys/mutex.h>
     31 #include <sys/dditypes.h>
     32 #include <sys/ddi_intr.h>
     33 
     34 #ifdef	__cplusplus
     35 extern "C" {
     36 #endif
     37 
     38 /*
     39  * Period of autovector structures (add this in to get the next level).
     40  */
     41 #define	MAXIPL	16
     42 #define	INT_IPL(x) (x)
     43 #define	AV_INT_SPURIOUS	-1
     44 
     45 #ifdef	__STDC__
     46 typedef uint_t (*avfunc)(caddr_t, caddr_t);
     47 #else
     48 typedef uint_t (*avfunc)();
     49 #endif	/* __STDC__ */
     50 
     51 struct autovec {
     52 
     53 	/*
     54 	 * Interrupt handler and argument to pass to it.
     55 	 */
     56 
     57 	struct autovec *av_link;	/* pointer to next on in chain */
     58 	uint_t	(*av_vector)();
     59 	caddr_t	av_intarg1;
     60 	caddr_t	av_intarg2;
     61 	uint64_t *av_ticksp;
     62 	uint_t	av_prilevel;		/* priority level */
     63 
     64 	/*
     65 	 * Interrupt handle/id (like intrspec structure pointer) used to
     66 	 * identify a specific instance of interrupt handler in case we
     67 	 * have to remove the interrupt handler later.
     68 	 *
     69 	 */
     70 	void	*av_intr_id;
     71 	dev_info_t *av_dip;
     72 };
     73 
     74 struct av_head {
     75 	struct 	autovec	*avh_link;
     76 	ushort_t	avh_hi_pri;
     77 	ushort_t	avh_lo_pri;
     78 };
     79 
     80 /* softing contains a bit field of software interrupts which are pending */
     81 struct softint {
     82 	int st_pending;
     83 };
     84 
     85 #ifdef _KERNEL
     86 
     87 extern kmutex_t av_lock;
     88 extern ddi_softint_hdl_impl_t softlevel_hdl[];
     89 extern ddi_softint_hdl_impl_t softlevel1_hdl;
     90 extern int add_avintr(void *intr_id, int lvl, avfunc xxintr, char *name,
     91 	int vect, caddr_t arg1, caddr_t arg2, uint64_t *, dev_info_t *);
     92 extern int add_nmintr(int lvl, avfunc nmintr, char *name, caddr_t arg);
     93 extern int add_avsoftintr(void *intr_id, int lvl, avfunc xxintr,
     94 	char *name, caddr_t arg1, caddr_t arg2);
     95 extern int rem_avsoftintr(void *intr_id, int lvl, avfunc xxintr);
     96 extern int av_softint_movepri(void *intr_id, int old_lvl);
     97 extern void update_avsoftintr_args(void *intr_id, int lvl, caddr_t arg2);
     98 extern void rem_avintr(void *intr_id, int lvl, avfunc xxintr, int vect);
     99 extern uint_t softlevel1(caddr_t, caddr_t);
    100 
    101 #endif	/* _KERNEL */
    102 
    103 #ifdef	__cplusplus
    104 }
    105 #endif
    106 
    107 #endif /* _SYS_AVINTR_H */
    108