blob: 5453a9b902a9cb9f1a4961797d155bc38494517c [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Macpaul Lin0b9b59a2011-10-11 22:33:15 +00002/*
3 * Copyright (C) 2011 Andes Technology Corporation
4 * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
Macpaul Lin0b9b59a2011-10-11 22:33:15 +00005 */
6
7#ifndef __ASM_NDS_SYSTEM_H
8#define __ASM_NDS_SYSTEM_H
9
10/*
11 * Interrupt configuring macros.
12 */
13
14extern int irq_flags;
15
16#define local_irq_enable() \
17 __asm__ __volatile__ ( \
18 "mfsr %0, $psw\n\t" \
19 "andi %0, %0, 0x1\n\t" \
20 "setgie.e\n\t" \
21 : \
22 : "r" (irq_flags) \
23 )
24
25#define local_irq_disable() \
26 do { \
27 int __tmp_dummy; \
28 __asm__ __volatile__ ( \
29 "mfsr %0, $psw\n\t" \
30 "andi %0, %0, 0x1\n\t" \
31 "setgie.d\n\t" \
32 "dsb\n\t" \
33 : "=r" (__tmp_dummy) \
34 ); \
35 } while (0)
36
37#define local_irq_save(x) \
38 __asm__ __volatile__ ( \
39 "mfsr %0, $psw\n\t" \
40 "andi %0, %0, 0x1\n\t" \
41 "setgie.d\n\t" \
42 "dsb\n\t" \
43 : "=&r" (x) \
44 )
45
46#define local_save_flags(x) \
47 __asm__ __volatile__ ( \
48 "mfsr %0, $psw\n\t" \
49 "andi %0, %0, 0x1\n\t" \
50 "setgie.e\n\t" \
51 "setgie.d\n\t" \
52 : "=r" (x) \
53 )
54
55#define irqs_enabled_from_flags(x) ((x) != 0x1f)
56
57#define local_irq_restore(x) \
58 do { \
59 if (irqs_enabled_from_flags(x)) \
60 local_irq_enable(); \
61 } while (0)
62
63/*
64 * Force strict CPU ordering.
65 */
66#define nop() asm volatile ("nop;\n\t" : : )
67#define mb() asm volatile ("" : : : "memory")
68#define rmb() asm volatile ("" : : : "memory")
69#define wmb() asm volatile ("" : : : "memory")
70
71#endif /* __ASM_NDS_SYSTEM_H */