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