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