1 1.15 matt /* $NetBSD: s3c2xx0_intr.h,v 1.15 2014/03/14 21:39:29 matt Exp $ */ 2 1.1 bsh 3 1.1 bsh /* 4 1.3 bsh * Copyright (c) 2002, 2003 Fujitsu Component Limited 5 1.3 bsh * Copyright (c) 2002, 2003 Genetec Corporation 6 1.1 bsh * All rights reserved. 7 1.1 bsh * 8 1.1 bsh * Redistribution and use in source and binary forms, with or without 9 1.1 bsh * modification, are permitted provided that the following conditions 10 1.1 bsh * are met: 11 1.1 bsh * 1. Redistributions of source code must retain the above copyright 12 1.1 bsh * notice, this list of conditions and the following disclaimer. 13 1.1 bsh * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 bsh * notice, this list of conditions and the following disclaimer in the 15 1.1 bsh * documentation and/or other materials provided with the distribution. 16 1.1 bsh * 3. Neither the name of The Fujitsu Component Limited nor the name of 17 1.1 bsh * Genetec corporation may not be used to endorse or promote products 18 1.1 bsh * derived from this software without specific prior written permission. 19 1.1 bsh * 20 1.1 bsh * THIS SOFTWARE IS PROVIDED BY FUJITSU COMPONENT LIMITED AND GENETEC 21 1.1 bsh * CORPORATION ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 22 1.1 bsh * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23 1.1 bsh * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 1.1 bsh * DISCLAIMED. IN NO EVENT SHALL FUJITSU COMPONENT LIMITED OR GENETEC 25 1.1 bsh * CORPORATION BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 1.1 bsh * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 1.1 bsh * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 28 1.1 bsh * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 29 1.1 bsh * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 1.1 bsh * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 1.1 bsh * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 1.1 bsh * SUCH DAMAGE. 33 1.1 bsh */ 34 1.1 bsh 35 1.1 bsh /* Derived from i80321_intr.h */ 36 1.1 bsh 37 1.1 bsh /* 38 1.1 bsh * Copyright (c) 2001, 2002 Wasabi Systems, Inc. 39 1.1 bsh * All rights reserved. 40 1.1 bsh * 41 1.1 bsh * Written by Jason R. Thorpe for Wasabi Systems, Inc. 42 1.1 bsh * 43 1.1 bsh * Redistribution and use in source and binary forms, with or without 44 1.1 bsh * modification, are permitted provided that the following conditions 45 1.1 bsh * are met: 46 1.1 bsh * 1. Redistributions of source code must retain the above copyright 47 1.1 bsh * notice, this list of conditions and the following disclaimer. 48 1.1 bsh * 2. Redistributions in binary form must reproduce the above copyright 49 1.1 bsh * notice, this list of conditions and the following disclaimer in the 50 1.1 bsh * documentation and/or other materials provided with the distribution. 51 1.1 bsh * 3. All advertising materials mentioning features or use of this software 52 1.1 bsh * must display the following acknowledgement: 53 1.1 bsh * This product includes software developed for the NetBSD Project by 54 1.1 bsh * Wasabi Systems, Inc. 55 1.1 bsh * 4. The name of Wasabi Systems, Inc. may not be used to endorse 56 1.1 bsh * or promote products derived from this software without specific prior 57 1.1 bsh * written permission. 58 1.1 bsh * 59 1.1 bsh * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 60 1.1 bsh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 61 1.1 bsh * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 62 1.1 bsh * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 63 1.1 bsh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 64 1.1 bsh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 65 1.1 bsh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 66 1.1 bsh * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 67 1.1 bsh * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 68 1.1 bsh * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 69 1.1 bsh * POSSIBILITY OF SUCH DAMAGE. 70 1.1 bsh */ 71 1.1 bsh 72 1.1 bsh #ifndef _S3C2XX0_INTR_H_ 73 1.1 bsh #define _S3C2XX0_INTR_H_ 74 1.1 bsh 75 1.15 matt #include <sys/evcnt.h> 76 1.14 nisimura 77 1.1 bsh #include <arm/cpu.h> 78 1.1 bsh #include <arm/armreg.h> 79 1.1 bsh #include <arm/cpufunc.h> 80 1.1 bsh #include <machine/intr.h> 81 1.1 bsh 82 1.1 bsh #include <arm/s3c2xx0/s3c2xx0reg.h> 83 1.1 bsh 84 1.1 bsh typedef int (* s3c2xx0_irq_handler_t)(void *); 85 1.1 bsh 86 1.1 bsh extern volatile uint32_t *s3c2xx0_intr_mask_reg; 87 1.1 bsh 88 1.10 perry extern volatile int intr_mask; 89 1.10 perry extern volatile int global_intr_mask; 90 1.11 matt #ifdef __HAVE_FAST_SOFTINTS 91 1.10 perry extern volatile int softint_pending; 92 1.11 matt #endif 93 1.1 bsh extern int s3c2xx0_imask[]; 94 1.1 bsh extern int s3c2xx0_ilevel[]; 95 1.1 bsh 96 1.1 bsh void s3c2xx0_update_intr_masks( int, int ); 97 1.3 bsh 98 1.10 perry static inline void 99 1.3 bsh s3c2xx0_mask_interrupts(int mask) 100 1.3 bsh { 101 1.3 bsh int save = disable_interrupts(I32_bit); 102 1.4 bsh global_intr_mask &= ~mask; 103 1.4 bsh s3c2xx0_update_hw_mask(); 104 1.3 bsh restore_interrupts(save); 105 1.3 bsh } 106 1.3 bsh 107 1.10 perry static inline void 108 1.3 bsh s3c2xx0_unmask_interrupts(int mask) 109 1.3 bsh { 110 1.3 bsh int save = disable_interrupts(I32_bit); 111 1.4 bsh global_intr_mask |= mask; 112 1.4 bsh s3c2xx0_update_hw_mask(); 113 1.3 bsh restore_interrupts(save); 114 1.3 bsh } 115 1.1 bsh 116 1.10 perry static inline void 117 1.1 bsh s3c2xx0_setipl(int new) 118 1.1 bsh { 119 1.12 matt set_curcpl(new); 120 1.12 matt intr_mask = s3c2xx0_imask[curcpl()]; 121 1.4 bsh s3c2xx0_update_hw_mask(); 122 1.11 matt #ifdef __HAVE_FAST_SOFTINTS 123 1.4 bsh update_softintr_mask(); 124 1.11 matt #endif 125 1.1 bsh } 126 1.1 bsh 127 1.1 bsh 128 1.10 perry static inline void 129 1.1 bsh s3c2xx0_splx(int new) 130 1.1 bsh { 131 1.1 bsh int psw; 132 1.1 bsh 133 1.1 bsh psw = disable_interrupts(I32_bit); 134 1.1 bsh s3c2xx0_setipl(new); 135 1.1 bsh restore_interrupts(psw); 136 1.1 bsh 137 1.11 matt #ifdef __HAVE_FAST_SOFTINTS 138 1.12 matt cpu_dosoftints(); 139 1.11 matt #endif 140 1.1 bsh } 141 1.1 bsh 142 1.1 bsh 143 1.10 perry static inline int 144 1.1 bsh s3c2xx0_splraise(int ipl) 145 1.1 bsh { 146 1.1 bsh int old, psw; 147 1.1 bsh 148 1.12 matt old = curcpl(); 149 1.12 matt if( ipl > old ){ 150 1.1 bsh psw = disable_interrupts(I32_bit); 151 1.1 bsh s3c2xx0_setipl(ipl); 152 1.1 bsh restore_interrupts(psw); 153 1.1 bsh } 154 1.1 bsh 155 1.1 bsh return (old); 156 1.1 bsh } 157 1.1 bsh 158 1.10 perry static inline int 159 1.1 bsh s3c2xx0_spllower(int ipl) 160 1.1 bsh { 161 1.12 matt int old = curcpl(); 162 1.1 bsh int psw = disable_interrupts(I32_bit); 163 1.1 bsh s3c2xx0_splx(ipl); 164 1.1 bsh restore_interrupts(psw); 165 1.1 bsh return(old); 166 1.1 bsh } 167 1.1 bsh 168 1.1 bsh int _splraise(int); 169 1.1 bsh int _spllower(int); 170 1.1 bsh void splx(int); 171 1.1 bsh 172 1.1 bsh #if !defined(EVBARM_SPL_NOINLINE) 173 1.1 bsh 174 1.7 bsh #define splx(new) s3c2xx0_splx(new) 175 1.1 bsh #define _spllower(ipl) s3c2xx0_spllower(ipl) 176 1.1 bsh #define _splraise(ipl) s3c2xx0_splraise(ipl) 177 1.1 bsh 178 1.1 bsh #endif /* !EVBARM_SPL_NOINTR */ 179 1.1 bsh 180 1.1 bsh 181 1.1 bsh /* 182 1.1 bsh * interrupt dispatch table. 183 1.1 bsh */ 184 1.1 bsh #ifdef MULTIPLE_HANDLERS_ON_ONE_IRQ 185 1.1 bsh struct intrhand { 186 1.1 bsh TAILQ_ENTRY(intrhand) ih_list; /* link on intrq list */ 187 1.1 bsh s3c2xx0_irq_handler_t ih_func; /* handler */ 188 1.1 bsh void *ih_arg; /* arg for handler */ 189 1.1 bsh }; 190 1.1 bsh #endif 191 1.1 bsh 192 1.14 nisimura #define IRQNAMESIZE sizeof("s3c2xx0 irq xx") 193 1.14 nisimura 194 1.1 bsh struct s3c2xx0_intr_dispatch { 195 1.1 bsh #ifdef MULTIPLE_HANDLERS_ON_ONE_IRQ 196 1.1 bsh TAILQ_HEAD(,intrhand) list; 197 1.1 bsh #else 198 1.1 bsh s3c2xx0_irq_handler_t func; 199 1.1 bsh #endif 200 1.1 bsh void *cookie; /* NULL for stackframe */ 201 1.1 bsh int level; 202 1.14 nisimura struct evcnt ev; 203 1.14 nisimura char name[IRQNAMESIZE]; 204 1.1 bsh }; 205 1.1 bsh 206 1.1 bsh /* used by s3c2{80,40,41}0 interrupt handler */ 207 1.1 bsh void s3c2xx0_intr_init(struct s3c2xx0_intr_dispatch *, int ); 208 1.6 bsh 209 1.6 bsh /* initialize some variable so that splfoo() doesn't touch ileegal 210 1.6 bsh address during bootstrap */ 211 1.6 bsh void s3c2xx0_intr_bootstrap(vaddr_t); 212 1.1 bsh 213 1.5 matt #endif /* _S3C2XX0_INTR_H_ */ 214