1*d93766d5Sjsg /* $OpenBSD: intr.h,v 1.15 2024/10/14 10:08:13 jsg Exp $ */ 28eda2d14Spatrick /* $NetBSD: intr.h,v 1.12 2003/06/16 20:00:59 thorpej Exp $ */ 38eda2d14Spatrick 48eda2d14Spatrick /* 58eda2d14Spatrick * Copyright (c) 2001, 2003 Wasabi Systems, Inc. 68eda2d14Spatrick * All rights reserved. 78eda2d14Spatrick * 88eda2d14Spatrick * Written by Jason R. Thorpe for Wasabi Systems, Inc. 98eda2d14Spatrick * 108eda2d14Spatrick * Redistribution and use in source and binary forms, with or without 118eda2d14Spatrick * modification, are permitted provided that the following conditions 128eda2d14Spatrick * are met: 138eda2d14Spatrick * 1. Redistributions of source code must retain the above copyright 148eda2d14Spatrick * notice, this list of conditions and the following disclaimer. 158eda2d14Spatrick * 2. Redistributions in binary form must reproduce the above copyright 168eda2d14Spatrick * notice, this list of conditions and the following disclaimer in the 178eda2d14Spatrick * documentation and/or other materials provided with the distribution. 188eda2d14Spatrick * 3. All advertising materials mentioning features or use of this software 198eda2d14Spatrick * must display the following acknowledgement: 208eda2d14Spatrick * This product includes software developed for the NetBSD Project by 218eda2d14Spatrick * Wasabi Systems, Inc. 228eda2d14Spatrick * 4. The name of Wasabi Systems, Inc. may not be used to endorse 238eda2d14Spatrick * or promote products derived from this software without specific prior 248eda2d14Spatrick * written permission. 258eda2d14Spatrick * 268eda2d14Spatrick * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 278eda2d14Spatrick * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 288eda2d14Spatrick * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 298eda2d14Spatrick * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 308eda2d14Spatrick * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 318eda2d14Spatrick * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 328eda2d14Spatrick * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 338eda2d14Spatrick * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 348eda2d14Spatrick * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 358eda2d14Spatrick * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 368eda2d14Spatrick * POSSIBILITY OF SUCH DAMAGE. 378eda2d14Spatrick */ 388eda2d14Spatrick 398eda2d14Spatrick #ifndef _MACHINE_INTR_H_ 408eda2d14Spatrick #define _MACHINE_INTR_H_ 418eda2d14Spatrick 428eda2d14Spatrick #ifdef _KERNEL 438eda2d14Spatrick 44ad0d549bSkettenis /* Interrupt priority `levels'; not mutually exclusive. */ 458eda2d14Spatrick #define IPL_NONE 0 /* nothing */ 46ad0d549bSkettenis #define IPL_SOFT 1 /* soft interrupts */ 47ad0d549bSkettenis #define IPL_SOFTCLOCK 2 /* soft clock interrupts */ 48ad0d549bSkettenis #define IPL_SOFTNET 3 /* soft network interrupts */ 49ad0d549bSkettenis #define IPL_SOFTTTY 4 /* soft terminal interrupts */ 508eda2d14Spatrick #define IPL_BIO 5 /* block I/O */ 518eda2d14Spatrick #define IPL_NET 6 /* network */ 52ad0d549bSkettenis #define IPL_TTY 7 /* terminal */ 538eda2d14Spatrick #define IPL_VM 8 /* memory allocation */ 54ad0d549bSkettenis #define IPL_AUDIO 9 /* audio */ 55ad0d549bSkettenis #define IPL_CLOCK 10 /* clock */ 56ad0d549bSkettenis #define IPL_SCHED IPL_CLOCK 57ad0d549bSkettenis #define IPL_STATCLOCK IPL_CLOCK 58ad0d549bSkettenis #define IPL_HIGH 11 /* everything */ 59ad0d549bSkettenis #define IPL_IPI 12 /* interprocessor interrupt */ 60ad0d549bSkettenis #define NIPL 13 /* number of levels */ 618eda2d14Spatrick 62ad0d549bSkettenis #define IPL_MPFLOOR IPL_TTY 63ad0d549bSkettenis /* Interrupt priority 'flags'. */ 64ad0d549bSkettenis #define IPL_IRQMASK 0xf /* priority only */ 65ad0d549bSkettenis #define IPL_FLAGMASK 0xf00 /* flags only*/ 66ad0d549bSkettenis #define IPL_MPSAFE 0x100 /* 'mpsafe' interrupt, no kernel lock */ 678eda2d14Spatrick 688eda2d14Spatrick /* Interrupt sharing types. */ 698eda2d14Spatrick #define IST_NONE 0 /* none */ 708eda2d14Spatrick #define IST_PULSE 1 /* pulsed */ 718eda2d14Spatrick #define IST_EDGE 2 /* edge-triggered */ 728eda2d14Spatrick #define IST_LEVEL 3 /* level-triggered */ 738eda2d14Spatrick 748eda2d14Spatrick #define IST_LEVEL_LOW IST_LEVEL 758eda2d14Spatrick #define IST_LEVEL_HIGH 4 768eda2d14Spatrick #define IST_EDGE_FALLING IST_EDGE 778eda2d14Spatrick #define IST_EDGE_RISING 5 788eda2d14Spatrick #define IST_EDGE_BOTH 6 798eda2d14Spatrick 808eda2d14Spatrick #ifndef _LOCORE 818eda2d14Spatrick #include <sys/queue.h> 828eda2d14Spatrick 83789e88a4Spatrick struct cpu_info; 84789e88a4Spatrick 858eda2d14Spatrick int splraise(int); 868eda2d14Spatrick int spllower(int); 878eda2d14Spatrick void splx(int); 888eda2d14Spatrick 898eda2d14Spatrick void arm_do_pending_intr(int); 908eda2d14Spatrick void arm_set_intr_handler(int (*raise)(int), int (*lower)(int), 918eda2d14Spatrick void (*x)(int), void (*setipl)(int), 92789e88a4Spatrick void *(*intr_establish)(int irqno, int level, struct cpu_info *ci, 93789e88a4Spatrick int (*func)(void *), void *cookie, char *name), 948eda2d14Spatrick void (*intr_disestablish)(void *cookie), 958eda2d14Spatrick const char *(*intr_string)(void *cookie), 968eda2d14Spatrick void (*intr_handle)(void *)); 978eda2d14Spatrick 988eda2d14Spatrick struct arm_intr_func { 998eda2d14Spatrick int (*raise)(int); 1008eda2d14Spatrick int (*lower)(int); 1018eda2d14Spatrick void (*x)(int); 1028eda2d14Spatrick void (*setipl)(int); 103789e88a4Spatrick void *(*intr_establish)(int irqno, int level, struct cpu_info *, 104789e88a4Spatrick int (*func)(void *), void *cookie, char *name); 1058eda2d14Spatrick void (*intr_disestablish)(void *cookie); 1068eda2d14Spatrick const char *(*intr_string)(void *cookie); 1078eda2d14Spatrick }; 1088eda2d14Spatrick 1098eda2d14Spatrick extern struct arm_intr_func arm_intr_func; 1108eda2d14Spatrick 1118eda2d14Spatrick #define splraise(cpl) (arm_intr_func.raise(cpl)) 1128eda2d14Spatrick #define _splraise(cpl) (arm_intr_func.raise(cpl)) 1138eda2d14Spatrick #define spllower(cpl) (arm_intr_func.lower(cpl)) 1148eda2d14Spatrick #define splx(cpl) (arm_intr_func.x(cpl)) 1158eda2d14Spatrick 1168eda2d14Spatrick #define splhigh() splraise(IPL_HIGH) 1178eda2d14Spatrick #define splsoft() splraise(IPL_SOFT) 1188eda2d14Spatrick #define splsoftclock() splraise(IPL_SOFTCLOCK) 1198eda2d14Spatrick #define splsoftnet() splraise(IPL_SOFTNET) 1208eda2d14Spatrick #define splbio() splraise(IPL_BIO) 1218eda2d14Spatrick #define splnet() splraise(IPL_NET) 1228eda2d14Spatrick #define spltty() splraise(IPL_TTY) 1238eda2d14Spatrick #define splvm() splraise(IPL_VM) 1248eda2d14Spatrick #define splaudio() splraise(IPL_AUDIO) 1258eda2d14Spatrick #define splclock() splraise(IPL_CLOCK) 1268eda2d14Spatrick #define splstatclock() splraise(IPL_STATCLOCK) 1278eda2d14Spatrick 1288eda2d14Spatrick #define spl0() spllower(IPL_NONE) 1298eda2d14Spatrick 1308eda2d14Spatrick #define splsched() splhigh() 1318eda2d14Spatrick 132babc8fa4Sjsg void intr_barrier(void *); 133babc8fa4Sjsg 1348eda2d14Spatrick void arm_init_smask(void); /* XXX */ 1358eda2d14Spatrick extern uint32_t arm_smask[NIPL]; 1368eda2d14Spatrick void arm_setsoftintr(int si); 1378eda2d14Spatrick 1388eda2d14Spatrick #define _setsoftintr arm_setsoftintr 1398eda2d14Spatrick 1408eda2d14Spatrick #include <arm/softintr.h> 1418eda2d14Spatrick 1428eda2d14Spatrick void *arm_intr_establish(int irqno, int level, int (*func)(void *), 1438eda2d14Spatrick void *cookie, char *name); 1448eda2d14Spatrick void arm_intr_disestablish(void *cookie); 1458eda2d14Spatrick const char *arm_intr_string(void *cookie); 1468eda2d14Spatrick 1478eda2d14Spatrick /* XXX - this is probably the wrong location for this */ 1488eda2d14Spatrick void arm_clock_register(void (*)(void), void (*)(u_int), void (*)(int), 1498eda2d14Spatrick void (*)(void)); 1508eda2d14Spatrick 1510ffbfca4Spatrick struct interrupt_controller { 1520ffbfca4Spatrick int ic_node; 1530ffbfca4Spatrick void *ic_cookie; 154789e88a4Spatrick void *(*ic_establish)(void *, int *, int, struct cpu_info *, 1555e5d77c4Spatrick int (*)(void *), void *, char *); 156789e88a4Spatrick void *(*ic_establish_msi)(void *, uint64_t *, uint64_t *, int, 157789e88a4Spatrick struct cpu_info *, int (*)(void *), void *, char *); 1582b8e4081Spatrick void (*ic_disestablish)(void *); 159575c38b7Spatrick void (*ic_enable)(void *); 160575c38b7Spatrick void (*ic_disable)(void *); 161790a53b2Skettenis void (*ic_route)(void *, int, struct cpu_info *); 162ad0d549bSkettenis void (*ic_cpu_enable)(void); 163452daaedSpatrick void (*ic_barrier)(void *); 1640ffbfca4Spatrick 1650ffbfca4Spatrick LIST_ENTRY(interrupt_controller) ic_list; 1660ffbfca4Spatrick uint32_t ic_phandle; 1670ffbfca4Spatrick uint32_t ic_cells; 1680ffbfca4Spatrick }; 1690ffbfca4Spatrick 1703a2a51e5Skettenis void arm_intr_init_fdt(void); 1710ffbfca4Spatrick void arm_intr_register_fdt(struct interrupt_controller *); 1720ffbfca4Spatrick void *arm_intr_establish_fdt(int, int, int (*)(void *), 1730ffbfca4Spatrick void *, char *); 174789e88a4Spatrick void *arm_intr_establish_fdt_cpu(int, int, struct cpu_info *, 175789e88a4Spatrick int (*)(void *), void *, char *); 1760ffbfca4Spatrick void *arm_intr_establish_fdt_idx(int, int, int, int (*)(void *), 1770ffbfca4Spatrick void *, char *); 178789e88a4Spatrick void *arm_intr_establish_fdt_idx_cpu(int, int, int, struct cpu_info *, 179789e88a4Spatrick int (*)(void *), void *, char *); 1805e5d77c4Spatrick void *arm_intr_establish_fdt_imap(int, int *, int, int, int (*)(void *), 1815e5d77c4Spatrick void *, char *); 182789e88a4Spatrick void *arm_intr_establish_fdt_imap_cpu(int, int *, int, int, 183789e88a4Spatrick struct cpu_info *, int (*)(void *), void *, char *); 1845e5d77c4Spatrick void *arm_intr_establish_fdt_msi(int, uint64_t *, uint64_t *, int, 1855e5d77c4Spatrick int (*)(void *), void *, char *); 186789e88a4Spatrick void *arm_intr_establish_fdt_msi_cpu(int, uint64_t *, uint64_t *, int, 187789e88a4Spatrick struct cpu_info *, int (*)(void *), void *, char *); 1882b8e4081Spatrick void arm_intr_disestablish_fdt(void *); 189575c38b7Spatrick void arm_intr_enable(void *); 190575c38b7Spatrick void arm_intr_disable(void *); 191790a53b2Skettenis void arm_intr_route(void *, int, struct cpu_info *); 192ad0d549bSkettenis void arm_intr_cpu_enable(void); 1930ffbfca4Spatrick 1943a2a51e5Skettenis void *arm_intr_parent_establish_fdt(void *, int *, int, 195789e88a4Spatrick struct cpu_info *ci, int (*)(void *), void *, char *); 1962b8e4081Spatrick void arm_intr_parent_disestablish_fdt(void *); 1973a2a51e5Skettenis 198ad0d549bSkettenis void arm_send_ipi(struct cpu_info *, int); 199ad0d549bSkettenis extern void (*intr_send_ipi_func)(struct cpu_info *, int); 200ad0d549bSkettenis 201ad0d549bSkettenis #define ARM_IPI_NOP 0 202ad0d549bSkettenis #define ARM_IPI_DDB 1 203ad0d549bSkettenis 2048eda2d14Spatrick #ifdef DIAGNOSTIC 2058eda2d14Spatrick /* 2068eda2d14Spatrick * Although this function is implemented in MI code, it must be in this MD 2078eda2d14Spatrick * header because we don't want this header to include MI includes. 2088eda2d14Spatrick */ 2098eda2d14Spatrick void splassert_fail(int, int, const char *); 2108eda2d14Spatrick extern int splassert_ctl; 2118eda2d14Spatrick void arm_splassert_check(int, const char *); 2128eda2d14Spatrick #define splassert(__wantipl) do { \ 2138eda2d14Spatrick if (splassert_ctl > 0) { \ 2148eda2d14Spatrick arm_splassert_check(__wantipl, __func__); \ 2158eda2d14Spatrick } \ 2168eda2d14Spatrick } while (0) 2178eda2d14Spatrick #define splsoftassert(wantipl) splassert(wantipl) 2188eda2d14Spatrick #else 2198eda2d14Spatrick #define splassert(wantipl) do { /* nothing */ } while (0) 2208eda2d14Spatrick #define splsoftassert(wantipl) do { /* nothing */ } while (0) 2218eda2d14Spatrick #endif 2228eda2d14Spatrick 2238eda2d14Spatrick #endif /* ! _LOCORE */ 2248eda2d14Spatrick 2258eda2d14Spatrick #define ARM_IRQ_HANDLER arm_intr 2268eda2d14Spatrick 2278eda2d14Spatrick #endif /* _KERNEL */ 2288eda2d14Spatrick 2298eda2d14Spatrick #endif /* _MACHINE_INTR_H_ */ 2308eda2d14Spatrick 231