1*4965d1a4Smpi /* $OpenBSD: intr.h,v 1.44 2018/01/13 15:18:11 mpi Exp $ */
29c0b8818Smickey
39c0b8818Smickey /*
4fef2e65fSmickey * Copyright (c) 2002-2004 Michael Shalayeff
59c0b8818Smickey * All rights reserved.
69c0b8818Smickey *
770016991Smickey * Redistribution and use in source and binary forms, with or without
870016991Smickey * modification, are permitted provided that the following conditions
970016991Smickey * are met:
1070016991Smickey * 1. Redistributions of source code must retain the above copyright
1170016991Smickey * notice, this list of conditions and the following disclaimer.
1270016991Smickey * 2. Redistributions in binary form must reproduce the above copyright
1370016991Smickey * notice, this list of conditions and the following disclaimer in the
1470016991Smickey * documentation and/or other materials provided with the distribution.
159c0b8818Smickey *
1670016991Smickey * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1770016991Smickey * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1870016991Smickey * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1970016991Smickey * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
2070016991Smickey * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2170016991Smickey * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2270016991Smickey * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2370016991Smickey * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2470016991Smickey * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
2570016991Smickey * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2670016991Smickey * THE POSSIBILITY OF SUCH DAMAGE.
279c0b8818Smickey */
289c0b8818Smickey
29e2dc97cfSmickey #ifndef _MACHINE_INTR_H_
30e2dc97cfSmickey #define _MACHINE_INTR_H_
319c0b8818Smickey
32ce53554cSmickey #include <machine/psl.h>
33ce53554cSmickey
34e2dc97cfSmickey #define CPU_NINTS 32
3572d6f90cSjsing #define NIPL 17
369c0b8818Smickey
3770016991Smickey #define IPL_NONE 0
3870016991Smickey #define IPL_SOFTCLOCK 1
3970016991Smickey #define IPL_SOFTNET 2
4070016991Smickey #define IPL_BIO 3
4170016991Smickey #define IPL_NET 4
4270016991Smickey #define IPL_SOFTTTY 5
4370016991Smickey #define IPL_TTY 6
4470016991Smickey #define IPL_VM 7
4570016991Smickey #define IPL_AUDIO 8
4670016991Smickey #define IPL_CLOCK 9
4770016991Smickey #define IPL_STATCLOCK 10
486c4b9a03Smiod #define IPL_SCHED 10
4970016991Smickey #define IPL_HIGH 10
5072d6f90cSjsing #define IPL_IPI 11
5172d6f90cSjsing #define IPL_NESTED 12 /* pseudo-level for sub-tables */
529c0b8818Smickey
53*4965d1a4Smpi #define IPL_MPFLOOR IPL_AUDIO
54ee8a2a3cSkettenis #define IPL_MPSAFE 0 /* no "mpsafe" interrupts */
55ee8a2a3cSkettenis
56e2dc97cfSmickey #define IST_NONE 0
57e2dc97cfSmickey #define IST_PULSE 1
58e2dc97cfSmickey #define IST_EDGE 2
59e2dc97cfSmickey #define IST_LEVEL 3
609c0b8818Smickey
6172d6f90cSjsing #ifdef MULTIPROCESSOR
6272d6f90cSjsing #define HPPA_IPI_NOP 0
63b71a5009Sjsing #define HPPA_IPI_HALT 1
64b71a5009Sjsing #define HPPA_IPI_FPU_SAVE 2
65b71a5009Sjsing #define HPPA_IPI_FPU_FLUSH 3
66b71a5009Sjsing #define HPPA_NIPI 4
6772d6f90cSjsing #endif
6872d6f90cSjsing
6970016991Smickey #if !defined(_LOCORE) && defined(_KERNEL)
7057f0881cSmiod
71256cc8b0Sjsing extern volatile u_long imask[NIPL];
729c0b8818Smickey
7370016991Smickey #ifdef DIAGNOSTIC
7470016991Smickey void splassert_fail(int, int, const char *);
7570016991Smickey extern int splassert_ctl;
7670016991Smickey void splassert_check(int, const char *);
7770016991Smickey #define splassert(__wantipl) do { \
78032bee17Sthib if (splassert_ctl > 0) { \
7970016991Smickey splassert_check(__wantipl, __func__); \
8070016991Smickey } \
8170016991Smickey } while (0)
82312f6203Smiod #define splsoftassert(__wantipl) splassert(__wantipl)
8370016991Smickey #else
8470016991Smickey #define splassert(__wantipl) do { /* nada */ } while (0)
85312f6203Smiod #define splsoftassert(__wantipl) do { /* nada */ } while (0)
8670016991Smickey #endif /* DIAGNOSTIC */
87e2dc97cfSmickey
8870016991Smickey void cpu_intr_init(void);
8970016991Smickey void cpu_intr(void *);
9070016991Smickey
9150c05db7Skettenis void intr_barrier(void *);
9250c05db7Skettenis
9370016991Smickey static __inline int
spllower(int ncpl)9470016991Smickey spllower(int ncpl)
9570016991Smickey {
96a5c02b8eSdlg register int arg0 asm("r26") = ncpl;
97a5c02b8eSdlg register int ret0 asm("r28");
98a5c02b8eSdlg
99a5c02b8eSdlg __asm volatile("break %1, %2"
100a5c02b8eSdlg : "=r" (ret0)
101a5c02b8eSdlg : "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_SPLLOWER), "r" (arg0)
102a5c02b8eSdlg : "memory");
103a5c02b8eSdlg
104a5c02b8eSdlg return (ret0);
10570016991Smickey }
10670016991Smickey
10770016991Smickey static __inline int
splraise(int ncpl)10870016991Smickey splraise(int ncpl)
10970016991Smickey {
1109ab6497cSjsing struct cpu_info *ci = curcpu();
1119ab6497cSjsing int ocpl = ci->ci_cpl;
11270016991Smickey
11370016991Smickey if (ocpl < ncpl)
1149ab6497cSjsing ci->ci_cpl = ncpl;
1151deb03bbSkettenis __asm volatile ("sync" : : : "memory");
11670016991Smickey
11770016991Smickey return (ocpl);
11870016991Smickey }
11970016991Smickey
12070016991Smickey static __inline void
splx(int ncpl)12170016991Smickey splx(int ncpl)
12270016991Smickey {
12370016991Smickey (void)spllower(ncpl);
12470016991Smickey }
12570016991Smickey
126d06d3757Sjsing static __inline register_t
hppa_intr_disable(void)127d06d3757Sjsing hppa_intr_disable(void)
128d06d3757Sjsing {
129d06d3757Sjsing register_t eiem;
130d06d3757Sjsing
1312df76cc2Sguenther __asm volatile("mfctl %%cr15, %0": "=r" (eiem));
1322df76cc2Sguenther __asm volatile("mtctl %r0, %cr15");
133d06d3757Sjsing
134d06d3757Sjsing return eiem;
135d06d3757Sjsing }
136d06d3757Sjsing
137d06d3757Sjsing static __inline void
hppa_intr_enable(register_t eiem)138d06d3757Sjsing hppa_intr_enable(register_t eiem)
139d06d3757Sjsing {
1402df76cc2Sguenther __asm volatile("mtctl %0, %%cr15":: "r" (eiem));
141d06d3757Sjsing }
142d06d3757Sjsing
14370016991Smickey #define splsoftclock() splraise(IPL_SOFTCLOCK)
14470016991Smickey #define splsoftnet() splraise(IPL_SOFTNET)
14570016991Smickey #define splbio() splraise(IPL_BIO)
14670016991Smickey #define splnet() splraise(IPL_NET)
14770016991Smickey #define splsofttty() splraise(IPL_SOFTTTY)
14870016991Smickey #define spltty() splraise(IPL_TTY)
1492eb11716Smickey #define splvm() splraise(IPL_VM)
15070016991Smickey #define splaudio() splraise(IPL_AUDIO)
15170016991Smickey #define splclock() splraise(IPL_CLOCK)
152b130df4aSmartin #define splsched() splraise(IPL_SCHED)
1532eb11716Smickey #define splstatclock() splraise(IPL_STATCLOCK)
15470016991Smickey #define splhigh() splraise(IPL_HIGH)
15572d6f90cSjsing #define splipi() splraise(IPL_IPI)
15670016991Smickey #define spl0() spllower(IPL_NONE)
15770016991Smickey
15870016991Smickey #define SOFTINT_MASK ((1 << (IPL_SOFTCLOCK - 1)) | \
15970016991Smickey (1 << (IPL_SOFTNET - 1)) | (1 << (IPL_SOFTTTY - 1)))
16070016991Smickey
161ed3d8ff0Sjsing #ifdef MULTIPROCESSOR
162ed3d8ff0Sjsing void hppa_ipi_init(struct cpu_info *);
163ed3d8ff0Sjsing int hppa_ipi_send(struct cpu_info *, u_long);
164ee9717a0Sjsing int hppa_ipi_broadcast(u_long);
165ed3d8ff0Sjsing #endif
166ed3d8ff0Sjsing
167da6814fdSjsing #define setsoftast(p) (p->p_md.md_astpending = 1)
1688b3c6796Skettenis
1698b3c6796Skettenis void *softintr_establish(int, void (*)(void *), void *);
1708b3c6796Skettenis void softintr_disestablish(void *);
1718b3c6796Skettenis void softintr_schedule(void *);
1729c0b8818Smickey
17372d6f90cSjsing #ifdef MULTIPROCESSOR
17472d6f90cSjsing void hppa_ipi_init(struct cpu_info *);
17546ace63bSjsing int hppa_ipi_intr(void *arg);
17672d6f90cSjsing int hppa_ipi_send(struct cpu_info *, u_long);
17772d6f90cSjsing #endif
17872d6f90cSjsing
17970016991Smickey #endif /* !_LOCORE && _KERNEL */
180e2dc97cfSmickey #endif /* _MACHINE_INTR_H_ */
181