Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.30-rc8 306 lines 6.9 kB view raw
1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file COPYING in the main directory of this archive 4 * for more details. 5 * 6 * Changed by HuTao Apr18, 2003 7 * 8 * Copyright was missing when I got the code so took from MIPS arch ...MaTed--- 9 * Copyright (C) 1994 by Waldorf GMBH, written by Ralf Baechle 10 * Copyright (C) 1995, 96, 97, 98, 99, 2000, 2001 by Ralf Baechle 11 * 12 * Adapted for BlackFin (ADI) by Ted Ma <mated@sympatico.ca> 13 * Copyright (c) 2002 Arcturus Networks Inc. (www.arcturusnetworks.com) 14 * Copyright (c) 2002 Lineo, Inc. <mattw@lineo.com> 15 */ 16 17#ifndef _BFIN_IRQ_H_ 18#define _BFIN_IRQ_H_ 19 20/* SYS_IRQS and NR_IRQS are defined in <mach-bf5xx/irq.h>*/ 21#include <mach/irq.h> 22#include <asm/pda.h> 23#include <asm/processor.h> 24 25#ifdef CONFIG_SMP 26/* Forward decl needed due to cdef inter dependencies */ 27static inline uint32_t __pure bfin_dspid(void); 28# define blackfin_core_id() (bfin_dspid() & 0xff) 29# define bfin_irq_flags cpu_pda[blackfin_core_id()].imask 30#else 31extern unsigned long bfin_irq_flags; 32#endif 33 34#ifdef CONFIG_IPIPE 35 36#include <linux/ipipe_trace.h> 37 38void __ipipe_unstall_root(void); 39 40void __ipipe_restore_root(unsigned long flags); 41 42#ifdef CONFIG_DEBUG_HWERR 43# define __all_masked_irq_flags 0x3f 44# define __save_and_cli_hw(x) \ 45 __asm__ __volatile__( \ 46 "cli %0;" \ 47 "sti %1;" \ 48 : "=&d"(x) \ 49 : "d" (0x3F) \ 50 ) 51#else 52# define __all_masked_irq_flags 0x1f 53# define __save_and_cli_hw(x) \ 54 __asm__ __volatile__( \ 55 "cli %0;" \ 56 : "=&d"(x) \ 57 ) 58#endif 59 60#define irqs_enabled_from_flags_hw(x) ((x) != __all_masked_irq_flags) 61#define raw_irqs_disabled_flags(flags) (!irqs_enabled_from_flags_hw(flags)) 62#define local_test_iflag_hw(x) irqs_enabled_from_flags_hw(x) 63 64#define local_save_flags(x) \ 65 do { \ 66 (x) = __ipipe_test_root() ? \ 67 __all_masked_irq_flags : bfin_irq_flags; \ 68 barrier(); \ 69 } while (0) 70 71#define local_irq_save(x) \ 72 do { \ 73 (x) = __ipipe_test_and_stall_root() ? \ 74 __all_masked_irq_flags : bfin_irq_flags; \ 75 barrier(); \ 76 } while (0) 77 78static inline void local_irq_restore(unsigned long x) 79{ 80 barrier(); 81 __ipipe_restore_root(x == __all_masked_irq_flags); 82} 83 84#define local_irq_disable() \ 85 do { \ 86 __ipipe_stall_root(); \ 87 barrier(); \ 88 } while (0) 89 90static inline void local_irq_enable(void) 91{ 92 barrier(); 93 __ipipe_unstall_root(); 94} 95 96#define irqs_disabled() __ipipe_test_root() 97 98#define local_save_flags_hw(x) \ 99 __asm__ __volatile__( \ 100 "cli %0;" \ 101 "sti %0;" \ 102 : "=d"(x) \ 103 ) 104 105#define irqs_disabled_hw() \ 106 ({ \ 107 unsigned long flags; \ 108 local_save_flags_hw(flags); \ 109 !irqs_enabled_from_flags_hw(flags); \ 110 }) 111 112static inline unsigned long raw_mangle_irq_bits(int virt, unsigned long real) 113{ 114 /* Merge virtual and real interrupt mask bits into a single 115 32bit word. */ 116 return (real & ~(1 << 31)) | ((virt != 0) << 31); 117} 118 119static inline int raw_demangle_irq_bits(unsigned long *x) 120{ 121 int virt = (*x & (1 << 31)) != 0; 122 *x &= ~(1L << 31); 123 return virt; 124} 125 126#ifdef CONFIG_IPIPE_TRACE_IRQSOFF 127 128#define local_irq_disable_hw() \ 129 do { \ 130 int _tmp_dummy; \ 131 if (!irqs_disabled_hw()) \ 132 ipipe_trace_begin(0x80000000); \ 133 __asm__ __volatile__ ("cli %0;" : "=d" (_tmp_dummy) : ); \ 134 } while (0) 135 136#define local_irq_enable_hw() \ 137 do { \ 138 if (irqs_disabled_hw()) \ 139 ipipe_trace_end(0x80000000); \ 140 __asm__ __volatile__ ("sti %0;" : : "d"(bfin_irq_flags)); \ 141 } while (0) 142 143#define local_irq_save_hw(x) \ 144 do { \ 145 __save_and_cli_hw(x); \ 146 if (local_test_iflag_hw(x)) \ 147 ipipe_trace_begin(0x80000001); \ 148 } while (0) 149 150#define local_irq_restore_hw(x) \ 151 do { \ 152 if (local_test_iflag_hw(x)) { \ 153 ipipe_trace_end(0x80000001); \ 154 local_irq_enable_hw_notrace(); \ 155 } \ 156 } while (0) 157 158#define local_irq_disable_hw_notrace() \ 159 do { \ 160 int _tmp_dummy; \ 161 __asm__ __volatile__ ("cli %0;" : "=d" (_tmp_dummy) : ); \ 162 } while (0) 163 164#define local_irq_enable_hw_notrace() \ 165 __asm__ __volatile__( \ 166 "sti %0;" \ 167 : \ 168 : "d"(bfin_irq_flags) \ 169 ) 170 171#define local_irq_save_hw_notrace(x) __save_and_cli_hw(x) 172 173#define local_irq_restore_hw_notrace(x) \ 174 do { \ 175 if (local_test_iflag_hw(x)) \ 176 local_irq_enable_hw_notrace(); \ 177 } while (0) 178 179#else /* CONFIG_IPIPE_TRACE_IRQSOFF */ 180 181#define local_irq_enable_hw() \ 182 __asm__ __volatile__( \ 183 "sti %0;" \ 184 : \ 185 : "d"(bfin_irq_flags) \ 186 ) 187 188#define local_irq_disable_hw() \ 189 do { \ 190 int _tmp_dummy; \ 191 __asm__ __volatile__ ( \ 192 "cli %0;" \ 193 : "=d" (_tmp_dummy)); \ 194 } while (0) 195 196#define local_irq_restore_hw(x) \ 197 do { \ 198 if (irqs_enabled_from_flags_hw(x)) \ 199 local_irq_enable_hw(); \ 200 } while (0) 201 202#define local_irq_save_hw(x) __save_and_cli_hw(x) 203 204#define local_irq_disable_hw_notrace() local_irq_disable_hw() 205#define local_irq_enable_hw_notrace() local_irq_enable_hw() 206#define local_irq_save_hw_notrace(x) local_irq_save_hw(x) 207#define local_irq_restore_hw_notrace(x) local_irq_restore_hw(x) 208 209#endif /* CONFIG_IPIPE_TRACE_IRQSOFF */ 210 211#else /* !CONFIG_IPIPE */ 212 213/* 214 * Interrupt configuring macros. 215 */ 216#define local_irq_disable() \ 217 do { \ 218 int __tmp_dummy; \ 219 __asm__ __volatile__( \ 220 "cli %0;" \ 221 : "=d" (__tmp_dummy) \ 222 ); \ 223 } while (0) 224 225#define local_irq_enable() \ 226 __asm__ __volatile__( \ 227 "sti %0;" \ 228 : \ 229 : "d" (bfin_irq_flags) \ 230 ) 231 232#ifdef CONFIG_DEBUG_HWERR 233# define __save_and_cli(x) \ 234 __asm__ __volatile__( \ 235 "cli %0;" \ 236 "sti %1;" \ 237 : "=&d" (x) \ 238 : "d" (0x3F) \ 239 ) 240#else 241# define __save_and_cli(x) \ 242 __asm__ __volatile__( \ 243 "cli %0;" \ 244 : "=&d" (x) \ 245 ) 246#endif 247 248#define local_save_flags(x) \ 249 __asm__ __volatile__( \ 250 "cli %0;" \ 251 "sti %0;" \ 252 : "=d" (x) \ 253 ) 254 255#ifdef CONFIG_DEBUG_HWERR 256#define irqs_enabled_from_flags(x) (((x) & ~0x3f) != 0) 257#else 258#define irqs_enabled_from_flags(x) ((x) != 0x1f) 259#endif 260 261#define local_irq_restore(x) \ 262 do { \ 263 if (irqs_enabled_from_flags(x)) \ 264 local_irq_enable(); \ 265 } while (0) 266 267/* For spinlocks etc */ 268#define local_irq_save(x) __save_and_cli(x) 269 270#define irqs_disabled() \ 271({ \ 272 unsigned long flags; \ 273 local_save_flags(flags); \ 274 !irqs_enabled_from_flags(flags); \ 275}) 276 277#define local_irq_save_hw(x) local_irq_save(x) 278#define local_irq_restore_hw(x) local_irq_restore(x) 279#define local_irq_enable_hw() local_irq_enable() 280#define local_irq_disable_hw() local_irq_disable() 281#define irqs_disabled_hw() irqs_disabled() 282 283#endif /* !CONFIG_IPIPE */ 284 285#if ANOMALY_05000244 && defined(CONFIG_BFIN_ICACHE) 286# define NOP_PAD_ANOMALY_05000244 "nop; nop;" 287#else 288# define NOP_PAD_ANOMALY_05000244 289#endif 290 291#define idle_with_irq_disabled() \ 292 __asm__ __volatile__( \ 293 NOP_PAD_ANOMALY_05000244 \ 294 ".align 8;" \ 295 "sti %0;" \ 296 "idle;" \ 297 : \ 298 : "d" (bfin_irq_flags) \ 299 ) 300 301static inline int irq_canonicalize(int irq) 302{ 303 return irq; 304} 305 306#endif /* _BFIN_IRQ_H_ */