1 1.19 martin /* $NetBSD: intr.h,v 1.19 2022/07/11 09:39:10 martin Exp $ */ 2 1.2 garbled 3 1.2 garbled /*- 4 1.2 garbled * Copyright (c) 2007 Michael Lorenz 5 1.2 garbled * All rights reserved. 6 1.2 garbled * 7 1.2 garbled * Redistribution and use in source and binary forms, with or without 8 1.2 garbled * modification, are permitted provided that the following conditions 9 1.2 garbled * are met: 10 1.2 garbled * 1. Redistributions of source code must retain the above copyright 11 1.2 garbled * notice, this list of conditions and the following disclaimer. 12 1.2 garbled * 2. Redistributions in binary form must reproduce the above copyright 13 1.2 garbled * notice, this list of conditions and the following disclaimer in the 14 1.2 garbled * documentation and/or other materials provided with the distribution. 15 1.2 garbled * 16 1.2 garbled * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.2 garbled * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.2 garbled * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.2 garbled * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.2 garbled * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.2 garbled * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.2 garbled * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.2 garbled * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.2 garbled * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.2 garbled * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.2 garbled * POSSIBILITY OF SUCH DAMAGE. 27 1.2 garbled */ 28 1.2 garbled 29 1.17 rin #ifndef _LOCORE 30 1.17 rin #include <sys/cdefs.h> 31 1.19 martin __KERNEL_RCSID(0, "$NetBSD: intr.h,v 1.19 2022/07/11 09:39:10 martin Exp $"); 32 1.17 rin #endif 33 1.17 rin 34 1.11 matt #ifndef _POWERPC_INTR_MACHDEP_H_ 35 1.11 matt #define _POWERPC_INTR_MACHDEP_H_ 36 1.2 garbled 37 1.19 martin #if 0 /* PR port-powerpc/56922: fast softints are broken on powerpc */ 38 1.6 macallan #define __HAVE_FAST_SOFTINTS 1 39 1.19 martin #endif 40 1.6 macallan 41 1.2 garbled 42 1.2 garbled /* Interrupt priority `levels'. */ 43 1.10 phx #define IPL_NONE 0 /* nothing */ 44 1.10 phx #define IPL_SOFTCLOCK 1 /* timeouts */ 45 1.10 phx #define IPL_SOFTBIO 2 /* block I/O */ 46 1.10 phx #define IPL_SOFTNET 3 /* protocol stacks */ 47 1.10 phx #define IPL_SOFTSERIAL 4 /* serial */ 48 1.10 phx #define IPL_VM 5 /* memory allocation */ 49 1.10 phx #define IPL_SCHED 6 50 1.10 phx #define IPL_HIGH 7 /* everything */ 51 1.10 phx #define NIPL 8 52 1.2 garbled 53 1.2 garbled /* Interrupt sharing types. */ 54 1.10 phx #define IST_NONE 0 /* none */ 55 1.10 phx #define IST_PULSE 1 /* pulsed */ 56 1.10 phx #define IST_EDGE 2 /* falling edge triggered */ 57 1.10 phx #define IST_LEVEL 3 /* low level triggered */ 58 1.10 phx 59 1.10 phx #define IST_EDGE_FALLING IST_EDGE 60 1.10 phx #define IST_EDGE_RISING 4 /* rising edge triggered */ 61 1.10 phx #define IST_LEVEL_LOW IST_LEVEL 62 1.10 phx #define IST_LEVEL_HIGH 5 /* high level triggered */ 63 1.2 garbled 64 1.9 matt #if !defined(_LOCORE) 65 1.9 matt void * intr_establish(int, int, int, int (*)(void *), void *); 66 1.12 nonaka void * intr_establish_xname(int, int, int, int (*)(void *), void *, 67 1.12 nonaka const char *); 68 1.9 matt void intr_disestablish(void *); 69 1.9 matt const char * 70 1.9 matt intr_typename(int); 71 1.9 matt 72 1.9 matt int splraise(int); 73 1.9 matt int spllower(int); 74 1.9 matt void splx(int); 75 1.9 matt 76 1.9 matt #if !defined(_MODULE) 77 1.9 matt 78 1.11 matt #include <powerpc/softint.h> 79 1.11 matt 80 1.9 matt void genppc_cpu_configure(void); 81 1.9 matt 82 1.2 garbled /* 83 1.2 garbled * Interrupt handler chains. intr_establish() inserts a handler into 84 1.2 garbled * the list. The handler is called with its (single) argument. 85 1.2 garbled */ 86 1.2 garbled struct intrhand { 87 1.2 garbled int (*ih_fun)(void *); 88 1.2 garbled void *ih_arg; 89 1.2 garbled struct intrhand *ih_next; 90 1.7 matt int ih_ipl; 91 1.8 matt int ih_virq; 92 1.12 nonaka char ih_xname[INTRDEVNAMEBUF]; 93 1.2 garbled }; 94 1.2 garbled 95 1.6 macallan void softint_fast_dispatch(struct lwp *, int); 96 1.6 macallan 97 1.15 rin #ifdef __HAVE_FAST_SOFTINTS 98 1.9 matt #define softint_init_md powerpc_softint_init_md 99 1.6 macallan #define softint_trigger powerpc_softint_trigger 100 1.15 rin #endif 101 1.2 garbled 102 1.8 matt #ifdef __IMASK_T 103 1.8 matt typedef __IMASK_T imask_t; 104 1.8 matt #else 105 1.8 matt typedef uint32_t imask_t; 106 1.8 matt #endif 107 1.8 matt 108 1.8 matt #define NVIRQ (sizeof(imask_t)*8) /* 32 virtual IRQs */ 109 1.8 matt #ifndef NIRQ 110 1.14 macallan #define NIRQ 256 /* up to 256 HW IRQs */ 111 1.8 matt #endif 112 1.5 kiyohara 113 1.8 matt #define HWIRQ_MAX (NVIRQ - 1) 114 1.8 matt #define HWIRQ_MASK (~(imask_t)0 >> 1) 115 1.5 kiyohara 116 1.8 matt #define PIC_VIRQ_TO_MASK(v) __BIT(HWIRQ_MAX - (v)) 117 1.8 matt #define PIC_VIRQ_MS_PENDING(p) __builtin_clz(p) 118 1.2 garbled 119 1.9 matt #endif /* !_MODULE */ 120 1.9 matt 121 1.2 garbled #define spl0() spllower(0) 122 1.2 garbled 123 1.2 garbled typedef int ipl_t; 124 1.2 garbled typedef struct { 125 1.2 garbled ipl_t _ipl; 126 1.2 garbled } ipl_cookie_t; 127 1.2 garbled 128 1.13 christos static __inline ipl_cookie_t 129 1.2 garbled makeiplcookie(ipl_t ipl) 130 1.2 garbled { 131 1.2 garbled 132 1.2 garbled return (ipl_cookie_t){._ipl = ipl}; 133 1.2 garbled } 134 1.2 garbled 135 1.13 christos static __inline int 136 1.2 garbled splraiseipl(ipl_cookie_t icookie) 137 1.2 garbled { 138 1.2 garbled 139 1.6 macallan return splraise(icookie._ipl); 140 1.2 garbled } 141 1.2 garbled 142 1.2 garbled #include <sys/spl.h> 143 1.2 garbled 144 1.2 garbled #endif /* _LOCORE */ 145 1.2 garbled 146 1.11 matt #endif /* _POWERPC_INTR_MACHDEP_H_ */ 147