xref: /openbsd-src/sys/arch/powerpc64/include/intr.h (revision 0a255fef3effb1c60f624a80f4e6d53ce037efe8)
1*0a255fefSkettenis /*	$OpenBSD: intr.h,v 1.15 2025/01/12 21:54:07 kettenis Exp $	*/
21af8fcf9Skettenis 
31af8fcf9Skettenis /*
41af8fcf9Skettenis  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
51af8fcf9Skettenis  *
61af8fcf9Skettenis  * Permission to use, copy, modify, and distribute this software for any
71af8fcf9Skettenis  * purpose with or without fee is hereby granted, provided that the above
81af8fcf9Skettenis  * copyright notice and this permission notice appear in all copies.
91af8fcf9Skettenis  *
101af8fcf9Skettenis  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
111af8fcf9Skettenis  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
121af8fcf9Skettenis  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
131af8fcf9Skettenis  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
141af8fcf9Skettenis  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
151af8fcf9Skettenis  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
161af8fcf9Skettenis  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
171af8fcf9Skettenis  */
181af8fcf9Skettenis 
191af8fcf9Skettenis #ifndef _MACHINE_INTR_H_
201af8fcf9Skettenis #define _MACHINE_INTR_H_
211af8fcf9Skettenis 
22125ecf92Svisa #include <sys/queue.h>
23125ecf92Svisa 
24fcf94dc6Skettenis struct cpu_info;
25832971c7Skettenis struct trapframe;
26fcf94dc6Skettenis 
2713861200Skettenis #define IPL_NONE	0
28e3d6f9a2Skettenis #define IPL_SOFT	1
29e3d6f9a2Skettenis #define IPL_SOFTCLOCK	2
30e3d6f9a2Skettenis #define IPL_SOFTNET	3
31e3d6f9a2Skettenis #define IPL_SOFTTTY	4
32e3d6f9a2Skettenis #define IPL_BIO		5
33e3d6f9a2Skettenis #define IPL_NET		6
34e3d6f9a2Skettenis #define IPL_TTY		7
351af8fcf9Skettenis #define IPL_VM		IPL_TTY
36e3d6f9a2Skettenis #define IPL_AUDIO	8
37e3d6f9a2Skettenis #define IPL_CLOCK	9
3813861200Skettenis #define IPL_STATCLOCK	IPL_CLOCK
391af8fcf9Skettenis #define IPL_SCHED	IPL_CLOCK
401af8fcf9Skettenis #define IPL_HIGH	IPL_CLOCK
41e3d6f9a2Skettenis #define IPL_IPI		10
42e3d6f9a2Skettenis #define NIPL		11
431af8fcf9Skettenis 
4413861200Skettenis #define	IPL_MPFLOOR	IPL_TTY
451af8fcf9Skettenis /* Interrupt priority 'flags'. */
461af8fcf9Skettenis #define	IPL_IRQMASK	0xf	/* priority only */
471af8fcf9Skettenis #define	IPL_FLAGMASK	0xf00	/* flags only*/
481af8fcf9Skettenis #define	IPL_MPSAFE	0x100	/* 'mpsafe' interrupt, no kernel lock */
4913861200Skettenis 
501af8fcf9Skettenis int	splraise(int);
511af8fcf9Skettenis int	spllower(int);
521af8fcf9Skettenis void	splx(int);
5313861200Skettenis 
541af8fcf9Skettenis #define spl0()		spllower(IPL_NONE)
551af8fcf9Skettenis #define splsoftclock()	splraise(IPL_SOFTCLOCK)
561af8fcf9Skettenis #define splsoftnet()	splraise(IPL_SOFTNET)
571af8fcf9Skettenis #define splsofttty()	splraise(IPL_SOFTTTY)
581af8fcf9Skettenis #define splbio()	splraise(IPL_BIO)
591af8fcf9Skettenis #define splnet()	splraise(IPL_NET)
601af8fcf9Skettenis #define spltty()	splraise(IPL_TTY)
611af8fcf9Skettenis #define splvm()		splraise(IPL_VM)
621af8fcf9Skettenis #define splclock()	splraise(IPL_CLOCK)
631af8fcf9Skettenis #define splstatclock()	splraise(IPL_STATCLOCK)
641af8fcf9Skettenis #define splsched()	splraise(IPL_SCHED)
651af8fcf9Skettenis #define splhigh()	splraise(IPL_HIGH)
661af8fcf9Skettenis 
671af8fcf9Skettenis #ifdef DIAGNOSTIC
681af8fcf9Skettenis /*
691af8fcf9Skettenis  * Although this function is implemented in MI code, it must be in this MD
701af8fcf9Skettenis  * header because we don't want this header to include MI includes.
711af8fcf9Skettenis  */
721af8fcf9Skettenis void splassert_fail(int, int, const char *);
731af8fcf9Skettenis extern int splassert_ctl;
741af8fcf9Skettenis void splassert_check(int, const char *);
751af8fcf9Skettenis #define splassert(__wantipl) do {			\
761af8fcf9Skettenis 	if (splassert_ctl > 0) {			\
771af8fcf9Skettenis 		splassert_check(__wantipl, __func__);	\
781af8fcf9Skettenis 	}						\
791af8fcf9Skettenis } while (0)
801af8fcf9Skettenis #define	splsoftassert(wantipl)	splassert(wantipl)
811af8fcf9Skettenis #else
821af8fcf9Skettenis #define	splassert(wantipl)	do { /* nothing */ } while (0)
831af8fcf9Skettenis #define	splsoftassert(wantipl)	do { /* nothing */ } while (0)
841af8fcf9Skettenis #endif
857387796dSkettenis 
86e3d6f9a2Skettenis void	intr_init(void);
87e3d6f9a2Skettenis 
887387796dSkettenis #define intr_barrier(x)
8913861200Skettenis 
901af8fcf9Skettenis #define IST_EDGE	0
911af8fcf9Skettenis #define IST_LEVEL	1
921af8fcf9Skettenis 
93a940e3deSkettenis void	*intr_establish(uint32_t, int, int, struct cpu_info *,
941af8fcf9Skettenis 	    int (*)(void *), void *, const char *);
95284a504dSkettenis 
96284a504dSkettenis #define IPI_NOP		0
97c7966c0cSgkoehler #define IPI_DDB		(1 << 0)
98c7966c0cSgkoehler #define IPI_SETPERF	(1 << 1)
99284a504dSkettenis 
100284a504dSkettenis void	intr_send_ipi(struct cpu_info *, int);
1011af8fcf9Skettenis 
102e0747862Skettenis extern void (*_exi)(struct trapframe *);
1031af8fcf9Skettenis extern void (*_hvi)(struct trapframe *);
104a940e3deSkettenis extern void *(*_intr_establish)(uint32_t, int, int, struct cpu_info *,
1051af8fcf9Skettenis 	    int (*)(void *), void *, const char *);
106fcf94dc6Skettenis extern void (*_intr_send_ipi)(void *);
1071af8fcf9Skettenis extern void (*_setipl)(int);
108fbe80760Skettenis 
10913861200Skettenis #include <machine/softintr.h>
1101af8fcf9Skettenis 
111c5e78cb5Skettenis struct interrupt_controller {
112c5e78cb5Skettenis 	int	ic_node;
113c5e78cb5Skettenis 	void	*ic_cookie;
114c5e78cb5Skettenis 	void	*(*ic_establish)(void *, int *, int, struct cpu_info *,
115c5e78cb5Skettenis 		    int (*)(void *), void *, char *);
116fcf94dc6Skettenis 	void	(*ic_send_ipi)(void *);
117c5e78cb5Skettenis 
118c5e78cb5Skettenis 	LIST_ENTRY(interrupt_controller) ic_list;
119c5e78cb5Skettenis 	uint32_t ic_phandle;
120c5e78cb5Skettenis 	uint32_t ic_cells;
121c5e78cb5Skettenis };
122c5e78cb5Skettenis 
123c5e78cb5Skettenis void	interrupt_controller_register(struct interrupt_controller *);
124c5e78cb5Skettenis 
125fcf94dc6Skettenis void	*fdt_intr_establish_idx_cpu(int, int, int, struct cpu_info *,
126fcf94dc6Skettenis 	    int (*)(void *), void *, char *);
127c5e78cb5Skettenis void	*fdt_intr_establish_imap(int, int *, int, int, int (*)(void *),
128c5e78cb5Skettenis 	    void *, char *);
129c5e78cb5Skettenis void	*fdt_intr_establish_imap_cpu(int, int *, int, int,
130c5e78cb5Skettenis 	    struct cpu_info *, int (*)(void *), void *, char *);
131*0a255fefSkettenis void	fdt_intr_disestablish(void *);
132c5e78cb5Skettenis 
1331af8fcf9Skettenis #endif /* _MACHINE_INTR_H_ */
134