xref: /netbsd-src/sys/arch/evbarm/ifpga/ifpga_intr.h (revision a5e21717caef81224de0cb5550a8747f0c4f48d4)
1*a5e21717She /*	$NetBSD: ifpga_intr.h,v 1.9 2009/02/13 21:08:40 he Exp $	*/
2256da36aSrearnsha 
3256da36aSrearnsha /*
4256da36aSrearnsha  * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
5256da36aSrearnsha  * All rights reserved.
6256da36aSrearnsha  *
7256da36aSrearnsha  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8256da36aSrearnsha  *
9256da36aSrearnsha  * Redistribution and use in source and binary forms, with or without
10256da36aSrearnsha  * modification, are permitted provided that the following conditions
11256da36aSrearnsha  * are met:
12256da36aSrearnsha  * 1. Redistributions of source code must retain the above copyright
13256da36aSrearnsha  *    notice, this list of conditions and the following disclaimer.
14256da36aSrearnsha  * 2. Redistributions in binary form must reproduce the above copyright
15256da36aSrearnsha  *    notice, this list of conditions and the following disclaimer in the
16256da36aSrearnsha  *    documentation and/or other materials provided with the distribution.
17256da36aSrearnsha  * 3. All advertising materials mentioning features or use of this software
18256da36aSrearnsha  *    must display the following acknowledgement:
19256da36aSrearnsha  *	This product includes software developed for the NetBSD Project by
20256da36aSrearnsha  *	Wasabi Systems, Inc.
21256da36aSrearnsha  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22256da36aSrearnsha  *    or promote products derived from this software without specific prior
23256da36aSrearnsha  *    written permission.
24256da36aSrearnsha  *
25256da36aSrearnsha  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26256da36aSrearnsha  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27256da36aSrearnsha  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28256da36aSrearnsha  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29256da36aSrearnsha  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30256da36aSrearnsha  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31256da36aSrearnsha  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32256da36aSrearnsha  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33256da36aSrearnsha  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34256da36aSrearnsha  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35256da36aSrearnsha  * POSSIBILITY OF SUCH DAMAGE.
36256da36aSrearnsha  */
37256da36aSrearnsha 
38256da36aSrearnsha #ifndef _IFPGA_INTR_H_
39256da36aSrearnsha #define _IFPGA_INTR_H_
40256da36aSrearnsha 
41256da36aSrearnsha #define	ARM_IRQ_HANDLER	_C_LABEL(ifpga_intr_dispatch)
42256da36aSrearnsha 
43256da36aSrearnsha #ifndef _LOCORE
44256da36aSrearnsha 
45*a5e21717She #include <arm/cpu.h>
46256da36aSrearnsha #include <arm/armreg.h>
47256da36aSrearnsha #include <arm/cpufunc.h>
48256da36aSrearnsha 
49256da36aSrearnsha #include <evbarm/ifpga/ifpgareg.h>
50256da36aSrearnsha #include <evbarm/ifpga/ifpgavar.h>
51256da36aSrearnsha 
525f1c88d7Sperry static inline void __attribute__((__unused__))
ifpga_set_intrmask(void)53256da36aSrearnsha ifpga_set_intrmask(void)
54256da36aSrearnsha {
555f1c88d7Sperry 	extern volatile uint32_t intr_enabled;
56256da36aSrearnsha 	extern struct ifpga_softc *ifpga_sc;
57256da36aSrearnsha 	uint32_t mask = intr_enabled;
58256da36aSrearnsha 
59256da36aSrearnsha 	bus_space_write_4 (ifpga_sc->sc_iot, ifpga_sc->sc_irq_ioh,
60256da36aSrearnsha 	    IFPGA_INTR_ENABLECLR, ~mask);
61256da36aSrearnsha 	bus_space_write_4 (ifpga_sc->sc_iot, ifpga_sc->sc_irq_ioh,
62256da36aSrearnsha 	    IFPGA_INTR_ENABLESET, mask);
63256da36aSrearnsha }
64256da36aSrearnsha 
655f1c88d7Sperry static inline void __attribute__((__unused__))
ifpga_splx(int new)66256da36aSrearnsha ifpga_splx(int new)
67256da36aSrearnsha {
685f1c88d7Sperry 	extern volatile uint32_t intr_enabled;
695f1c88d7Sperry 	extern volatile int ifpga_ipending;
70256da36aSrearnsha 	int oldirqstate, hwpend;
71256da36aSrearnsha 
725b0328dfSrearnsha 	__insn_barrier();
735b0328dfSrearnsha 
74256da36aSrearnsha 	oldirqstate = disable_interrupts(I32_bit);
75825088edSmatt 	set_curcpl(new);
76256da36aSrearnsha 
77256da36aSrearnsha 	hwpend = (ifpga_ipending & IFPGA_INTR_HWMASK) & ~new;
78256da36aSrearnsha 	if (hwpend != 0) {
79256da36aSrearnsha 		intr_enabled |= hwpend;
80256da36aSrearnsha 		ifpga_set_intrmask();
81256da36aSrearnsha 	}
82256da36aSrearnsha 
83256da36aSrearnsha 	restore_interrupts(oldirqstate);
84256da36aSrearnsha 
850c0de807Smatt #ifdef __HAVE_FAST_SOFTINTS
86825088edSmatt 	cpu_dosoftints();
870c0de807Smatt #endif
88256da36aSrearnsha }
89256da36aSrearnsha 
905f1c88d7Sperry static inline int __attribute__((__unused__))
ifpga_splraise(int ipl)91256da36aSrearnsha ifpga_splraise(int ipl)
92256da36aSrearnsha {
93256da36aSrearnsha 	extern int ifpga_imask[];
94825088edSmatt 	const int old = curcpl();
95825088edSmatt 	set_curcpl(old | ifpga_imask[ipl]);
965b0328dfSrearnsha 
975b0328dfSrearnsha 	__insn_barrier();
98256da36aSrearnsha 
99256da36aSrearnsha 	return (old);
100256da36aSrearnsha }
101256da36aSrearnsha 
1025f1c88d7Sperry static inline int __attribute__((__unused__))
ifpga_spllower(int ipl)103256da36aSrearnsha ifpga_spllower(int ipl)
104256da36aSrearnsha {
105256da36aSrearnsha 	extern int ifpga_imask[];
106825088edSmatt 	const int old = curcpl();
107256da36aSrearnsha 
108256da36aSrearnsha 	ifpga_splx(ifpga_imask[ipl]);
109256da36aSrearnsha 	return(old);
110256da36aSrearnsha }
111256da36aSrearnsha 
112256da36aSrearnsha #if !defined(EVBARM_SPL_NOINLINE)
113256da36aSrearnsha 
114256da36aSrearnsha #define splx(new)		ifpga_splx(new)
115256da36aSrearnsha #define	_spllower(ipl)		ifpga_spllower(ipl)
116256da36aSrearnsha #define	_splraise(ipl)		ifpga_splraise(ipl)
117256da36aSrearnsha 
118256da36aSrearnsha #else
119256da36aSrearnsha 
120256da36aSrearnsha int	_splraise(int);
121256da36aSrearnsha int	_spllower(int);
122256da36aSrearnsha void	splx(int);
123256da36aSrearnsha 
124256da36aSrearnsha #endif /* ! EVBARM_SPL_NOINLINE */
125256da36aSrearnsha 
126256da36aSrearnsha #endif /* _LOCORE */
127256da36aSrearnsha 
1281df05a73Smatt #endif /* _IFPGA_INTR_H_ */
129