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