xref: /openbsd-src/sys/arch/hppa/include/intr.h (revision 4965d1a4536ae31f44fece9aedf52ba3da2c14fb)
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