diff options
Diffstat (limited to 'include/asm-arm/system.h')
| -rw-r--r-- | include/asm-arm/system.h | 138 |
1 files changed, 9 insertions, 129 deletions
diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h index 6001febfe63b..f05fbe31576c 100644 --- a/include/asm-arm/system.h +++ b/include/asm-arm/system.h | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #define CPUID_TCM 2 | 46 | #define CPUID_TCM 2 |
| 47 | #define CPUID_TLBTYPE 3 | 47 | #define CPUID_TLBTYPE 3 |
| 48 | 48 | ||
| 49 | #ifdef CONFIG_CPU_CP15 | ||
| 49 | #define read_cpuid(reg) \ | 50 | #define read_cpuid(reg) \ |
| 50 | ({ \ | 51 | ({ \ |
| 51 | unsigned int __val; \ | 52 | unsigned int __val; \ |
| @@ -55,6 +56,9 @@ | |||
| 55 | : "cc"); \ | 56 | : "cc"); \ |
| 56 | __val; \ | 57 | __val; \ |
| 57 | }) | 58 | }) |
| 59 | #else | ||
| 60 | #define read_cpuid(reg) (processor_id) | ||
| 61 | #endif | ||
| 58 | 62 | ||
| 59 | /* | 63 | /* |
| 60 | * This is used to ensure the compiler did actually allocate the register we | 64 | * This is used to ensure the compiler did actually allocate the register we |
| @@ -176,7 +180,6 @@ extern unsigned int user_debug; | |||
| 176 | #define wmb() mb() | 180 | #define wmb() mb() |
| 177 | #define read_barrier_depends() do { } while(0) | 181 | #define read_barrier_depends() do { } while(0) |
| 178 | #define set_mb(var, value) do { var = value; mb(); } while (0) | 182 | #define set_mb(var, value) do { var = value; mb(); } while (0) |
| 179 | #define set_wmb(var, value) do { var = value; wmb(); } while (0) | ||
| 180 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); | 183 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); |
| 181 | 184 | ||
| 182 | /* | 185 | /* |
| @@ -208,130 +211,7 @@ static inline void sched_cacheflush(void) | |||
| 208 | { | 211 | { |
| 209 | } | 212 | } |
| 210 | 213 | ||
| 211 | /* | 214 | #include <linux/irqflags.h> |
| 212 | * CPU interrupt mask handling. | ||
| 213 | */ | ||
| 214 | #if __LINUX_ARM_ARCH__ >= 6 | ||
| 215 | |||
| 216 | #define local_irq_save(x) \ | ||
| 217 | ({ \ | ||
| 218 | __asm__ __volatile__( \ | ||
| 219 | "mrs %0, cpsr @ local_irq_save\n" \ | ||
| 220 | "cpsid i" \ | ||
| 221 | : "=r" (x) : : "memory", "cc"); \ | ||
| 222 | }) | ||
| 223 | |||
| 224 | #define local_irq_enable() __asm__("cpsie i @ __sti" : : : "memory", "cc") | ||
| 225 | #define local_irq_disable() __asm__("cpsid i @ __cli" : : : "memory", "cc") | ||
| 226 | #define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc") | ||
| 227 | #define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc") | ||
| 228 | |||
| 229 | #else | ||
| 230 | |||
| 231 | /* | ||
| 232 | * Save the current interrupt enable state & disable IRQs | ||
| 233 | */ | ||
| 234 | #define local_irq_save(x) \ | ||
| 235 | ({ \ | ||
| 236 | unsigned long temp; \ | ||
| 237 | (void) (&temp == &x); \ | ||
| 238 | __asm__ __volatile__( \ | ||
| 239 | "mrs %0, cpsr @ local_irq_save\n" \ | ||
| 240 | " orr %1, %0, #128\n" \ | ||
| 241 | " msr cpsr_c, %1" \ | ||
| 242 | : "=r" (x), "=r" (temp) \ | ||
| 243 | : \ | ||
| 244 | : "memory", "cc"); \ | ||
| 245 | }) | ||
| 246 | |||
| 247 | /* | ||
| 248 | * Enable IRQs | ||
| 249 | */ | ||
| 250 | #define local_irq_enable() \ | ||
| 251 | ({ \ | ||
| 252 | unsigned long temp; \ | ||
| 253 | __asm__ __volatile__( \ | ||
| 254 | "mrs %0, cpsr @ local_irq_enable\n" \ | ||
| 255 | " bic %0, %0, #128\n" \ | ||
| 256 | " msr cpsr_c, %0" \ | ||
| 257 | : "=r" (temp) \ | ||
| 258 | : \ | ||
| 259 | : "memory", "cc"); \ | ||
| 260 | }) | ||
| 261 | |||
| 262 | /* | ||
| 263 | * Disable IRQs | ||
| 264 | */ | ||
| 265 | #define local_irq_disable() \ | ||
| 266 | ({ \ | ||
| 267 | unsigned long temp; \ | ||
| 268 | __asm__ __volatile__( \ | ||
| 269 | "mrs %0, cpsr @ local_irq_disable\n" \ | ||
| 270 | " orr %0, %0, #128\n" \ | ||
| 271 | " msr cpsr_c, %0" \ | ||
| 272 | : "=r" (temp) \ | ||
| 273 | : \ | ||
| 274 | : "memory", "cc"); \ | ||
| 275 | }) | ||
| 276 | |||
| 277 | /* | ||
| 278 | * Enable FIQs | ||
| 279 | */ | ||
| 280 | #define local_fiq_enable() \ | ||
| 281 | ({ \ | ||
| 282 | unsigned long temp; \ | ||
| 283 | __asm__ __volatile__( \ | ||
| 284 | "mrs %0, cpsr @ stf\n" \ | ||
| 285 | " bic %0, %0, #64\n" \ | ||
| 286 | " msr cpsr_c, %0" \ | ||
| 287 | : "=r" (temp) \ | ||
| 288 | : \ | ||
| 289 | : "memory", "cc"); \ | ||
| 290 | }) | ||
| 291 | |||
| 292 | /* | ||
| 293 | * Disable FIQs | ||
| 294 | */ | ||
| 295 | #define local_fiq_disable() \ | ||
| 296 | ({ \ | ||
| 297 | unsigned long temp; \ | ||
| 298 | __asm__ __volatile__( \ | ||
| 299 | "mrs %0, cpsr @ clf\n" \ | ||
| 300 | " orr %0, %0, #64\n" \ | ||
| 301 | " msr cpsr_c, %0" \ | ||
| 302 | : "=r" (temp) \ | ||
| 303 | : \ | ||
| 304 | : "memory", "cc"); \ | ||
| 305 | }) | ||
| 306 | |||
| 307 | #endif | ||
| 308 | |||
| 309 | /* | ||
| 310 | * Save the current interrupt enable state. | ||
| 311 | */ | ||
| 312 | #define local_save_flags(x) \ | ||
| 313 | ({ \ | ||
| 314 | __asm__ __volatile__( \ | ||
| 315 | "mrs %0, cpsr @ local_save_flags" \ | ||
| 316 | : "=r" (x) : : "memory", "cc"); \ | ||
| 317 | }) | ||
| 318 | |||
| 319 | /* | ||
| 320 | * restore saved IRQ & FIQ state | ||
| 321 | */ | ||
| 322 | #define local_irq_restore(x) \ | ||
| 323 | __asm__ __volatile__( \ | ||
| 324 | "msr cpsr_c, %0 @ local_irq_restore\n" \ | ||
| 325 | : \ | ||
| 326 | : "r" (x) \ | ||
| 327 | : "memory", "cc") | ||
| 328 | |||
| 329 | #define irqs_disabled() \ | ||
| 330 | ({ \ | ||
| 331 | unsigned long flags; \ | ||
| 332 | local_save_flags(flags); \ | ||
| 333 | (int)(flags & PSR_I_BIT); \ | ||
| 334 | }) | ||
| 335 | 215 | ||
| 336 | #ifdef CONFIG_SMP | 216 | #ifdef CONFIG_SMP |
| 337 | 217 | ||
| @@ -406,17 +286,17 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size | |||
| 406 | #error SMP is not supported on this platform | 286 | #error SMP is not supported on this platform |
| 407 | #endif | 287 | #endif |
| 408 | case 1: | 288 | case 1: |
| 409 | local_irq_save(flags); | 289 | raw_local_irq_save(flags); |
| 410 | ret = *(volatile unsigned char *)ptr; | 290 | ret = *(volatile unsigned char *)ptr; |
| 411 | *(volatile unsigned char *)ptr = x; | 291 | *(volatile unsigned char *)ptr = x; |
| 412 | local_irq_restore(flags); | 292 | raw_local_irq_restore(flags); |
| 413 | break; | 293 | break; |
| 414 | 294 | ||
| 415 | case 4: | 295 | case 4: |
| 416 | local_irq_save(flags); | 296 | raw_local_irq_save(flags); |
| 417 | ret = *(volatile unsigned long *)ptr; | 297 | ret = *(volatile unsigned long *)ptr; |
| 418 | *(volatile unsigned long *)ptr = x; | 298 | *(volatile unsigned long *)ptr = x; |
| 419 | local_irq_restore(flags); | 299 | raw_local_irq_restore(flags); |
| 420 | break; | 300 | break; |
| 421 | #else | 301 | #else |
| 422 | case 1: | 302 | case 1: |
