1 1.16 riastrad /* $NetBSD: pxa2x0_intr.h,v 1.16 2023/07/13 19:42:24 riastradh Exp $ */ 2 1.1 bsh 3 1.1 bsh /* Derived from i80321_intr.h */ 4 1.1 bsh 5 1.1 bsh /* 6 1.1 bsh * Copyright (c) 2001, 2002 Wasabi Systems, Inc. 7 1.1 bsh * All rights reserved. 8 1.1 bsh * 9 1.1 bsh * Written by Jason R. Thorpe for Wasabi Systems, Inc. 10 1.1 bsh * 11 1.1 bsh * Redistribution and use in source and binary forms, with or without 12 1.1 bsh * modification, are permitted provided that the following conditions 13 1.1 bsh * are met: 14 1.1 bsh * 1. Redistributions of source code must retain the above copyright 15 1.1 bsh * notice, this list of conditions and the following disclaimer. 16 1.1 bsh * 2. Redistributions in binary form must reproduce the above copyright 17 1.1 bsh * notice, this list of conditions and the following disclaimer in the 18 1.1 bsh * documentation and/or other materials provided with the distribution. 19 1.1 bsh * 3. All advertising materials mentioning features or use of this software 20 1.1 bsh * must display the following acknowledgement: 21 1.1 bsh * This product includes software developed for the NetBSD Project by 22 1.1 bsh * Wasabi Systems, Inc. 23 1.1 bsh * 4. The name of Wasabi Systems, Inc. may not be used to endorse 24 1.1 bsh * or promote products derived from this software without specific prior 25 1.1 bsh * written permission. 26 1.1 bsh * 27 1.1 bsh * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 28 1.1 bsh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 1.1 bsh * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 1.1 bsh * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 31 1.1 bsh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 1.1 bsh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 1.1 bsh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 1.1 bsh * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 1.1 bsh * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 1.1 bsh * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 1.1 bsh * POSSIBILITY OF SUCH DAMAGE. 38 1.1 bsh */ 39 1.1 bsh 40 1.1 bsh #ifndef _PXA2X0_INTR_H_ 41 1.1 bsh #define _PXA2X0_INTR_H_ 42 1.1 bsh 43 1.2 thorpej #define ARM_IRQ_HANDLER _C_LABEL(pxa2x0_irq_handler) 44 1.2 thorpej 45 1.2 thorpej #ifndef _LOCORE 46 1.2 thorpej 47 1.1 bsh #include <arm/cpu.h> 48 1.1 bsh #include <arm/armreg.h> 49 1.1 bsh #include <arm/cpufunc.h> 50 1.1 bsh #include <machine/intr.h> 51 1.1 bsh 52 1.1 bsh #include <arm/xscale/pxa2x0reg.h> 53 1.1 bsh 54 1.13 matt extern vaddr_t pxaic_base; /* Shared with pxa2x0_irq.S */ 55 1.10 bjh21 #define read_icu(offset) (*(volatile uint32_t *)(pxaic_base + (offset))) 56 1.1 bsh #define write_icu(offset,value) \ 57 1.10 bjh21 (*(volatile uint32_t *)(pxaic_base + (offset)) = (value)) 58 1.1 bsh 59 1.7 perry extern volatile int intr_mask; 60 1.1 bsh extern int pxa2x0_imask[]; 61 1.11 matt 62 1.1 bsh 63 1.1 bsh /* 64 1.1 bsh * Cotulla's integrated ICU doesn't have IRQ0..7, so 65 1.1 bsh * we map software interrupts to bit 0..3 66 1.1 bsh */ 67 1.7 perry static inline void 68 1.1 bsh pxa2x0_setipl(int new) 69 1.1 bsh { 70 1.11 matt set_curcpl(new); 71 1.11 matt intr_mask = pxa2x0_imask[new]; 72 1.10 bjh21 write_icu(SAIPIC_MR, intr_mask); 73 1.1 bsh } 74 1.1 bsh 75 1.1 bsh 76 1.7 perry static inline void 77 1.1 bsh pxa2x0_splx(int new) 78 1.1 bsh { 79 1.1 bsh int psw; 80 1.1 bsh 81 1.1 bsh psw = disable_interrupts(I32_bit); 82 1.1 bsh pxa2x0_setipl(new); 83 1.1 bsh restore_interrupts(psw); 84 1.1 bsh 85 1.11 matt #ifdef __HAVE_FAST_SOFTINTS 86 1.11 matt cpu_dosoftints(); 87 1.11 matt #endif 88 1.1 bsh } 89 1.1 bsh 90 1.1 bsh 91 1.7 perry static inline int 92 1.1 bsh pxa2x0_splraise(int ipl) 93 1.1 bsh { 94 1.10 bjh21 int old, psw; 95 1.1 bsh 96 1.11 matt old = curcpl(); 97 1.11 matt if (ipl > old) { 98 1.1 bsh psw = disable_interrupts(I32_bit); 99 1.1 bsh pxa2x0_setipl(ipl); 100 1.1 bsh restore_interrupts(psw); 101 1.1 bsh } 102 1.1 bsh 103 1.10 bjh21 return old; 104 1.1 bsh } 105 1.1 bsh 106 1.7 perry static inline int 107 1.1 bsh pxa2x0_spllower(int ipl) 108 1.1 bsh { 109 1.11 matt int old = curcpl(); 110 1.1 bsh int psw = disable_interrupts(I32_bit); 111 1.10 bjh21 112 1.1 bsh pxa2x0_splx(ipl); 113 1.1 bsh restore_interrupts(psw); 114 1.10 bjh21 return old; 115 1.1 bsh } 116 1.1 bsh 117 1.1 bsh int _splraise(int); 118 1.1 bsh int _spllower(int); 119 1.1 bsh void splx(int); 120 1.1 bsh 121 1.1 bsh #if !defined(EVBARM_SPL_NOINLINE) 122 1.1 bsh 123 1.1 bsh #define splx(new) pxa2x0_splx(new) 124 1.1 bsh #define _spllower(ipl) pxa2x0_spllower(ipl) 125 1.1 bsh #define _splraise(ipl) pxa2x0_splraise(ipl) 126 1.1 bsh 127 1.1 bsh #endif /* !EVBARM_SPL_NOINTR */ 128 1.3 scw 129 1.3 scw /* 130 1.3 scw * This function *MUST* be called very early on in a port's 131 1.3 scw * initarm() function, before ANY spl*() functions are called. 132 1.3 scw * 133 1.3 scw * The parameter is the virtual address of the PXA2x0's Interrupt 134 1.3 scw * Controller registers. 135 1.3 scw */ 136 1.3 scw void pxa2x0_intr_bootstrap(vaddr_t); 137 1.3 scw 138 1.3 scw void pxa2x0_irq_handler(void *); 139 1.3 scw void *pxa2x0_intr_establish(int irqno, int level, 140 1.3 scw int (*func)(void *), void *cookie); 141 1.9 peter void pxa2x0_intr_disestablish(void *cookie); 142 1.3 scw void pxa2x0_update_intr_masks(int irqno, int level); 143 1.2 thorpej 144 1.2 thorpej #endif /* ! _LOCORE */ 145 1.1 bsh 146 1.4 dogcow #endif /* _PXA2X0_INTR_H_ */ 147