xref: /rk3399_rockchip-uboot/arch/nds32/include/asm/system.h (revision 326ea986ac150acdc7656d57fca647db80b50158)
100f892fcSMacpaul Lin /*
200f892fcSMacpaul Lin  * Copyright (C) 2011 Andes Technology Corporation
300f892fcSMacpaul Lin  * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
400f892fcSMacpaul Lin  *
5*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
600f892fcSMacpaul Lin  */
700f892fcSMacpaul Lin 
800f892fcSMacpaul Lin #ifndef __ASM_NDS_SYSTEM_H
900f892fcSMacpaul Lin #define __ASM_NDS_SYSTEM_H
1000f892fcSMacpaul Lin 
1100f892fcSMacpaul Lin /*
1200f892fcSMacpaul Lin  * Interrupt configuring macros.
1300f892fcSMacpaul Lin  */
1400f892fcSMacpaul Lin 
1500f892fcSMacpaul Lin extern int irq_flags;
1600f892fcSMacpaul Lin 
1700f892fcSMacpaul Lin #define local_irq_enable() \
1800f892fcSMacpaul Lin 	__asm__ __volatile__ ( \
1900f892fcSMacpaul Lin 		"mfsr	%0, $psw\n\t" \
2000f892fcSMacpaul Lin 		"andi	%0, %0, 0x1\n\t" \
2100f892fcSMacpaul Lin 		"setgie.e\n\t" \
2200f892fcSMacpaul Lin 		: \
2300f892fcSMacpaul Lin 		: "r" (irq_flags) \
2400f892fcSMacpaul Lin 	)
2500f892fcSMacpaul Lin 
2600f892fcSMacpaul Lin #define local_irq_disable() \
2700f892fcSMacpaul Lin 	do { \
2800f892fcSMacpaul Lin 		int __tmp_dummy; \
2900f892fcSMacpaul Lin 		__asm__ __volatile__ ( \
3000f892fcSMacpaul Lin 			"mfsr	%0, $psw\n\t" \
3100f892fcSMacpaul Lin 			"andi	%0, %0, 0x1\n\t" \
3200f892fcSMacpaul Lin 			"setgie.d\n\t" \
3300f892fcSMacpaul Lin 			"dsb\n\t" \
3400f892fcSMacpaul Lin 			: "=r" (__tmp_dummy) \
3500f892fcSMacpaul Lin 		); \
3600f892fcSMacpaul Lin 	} while (0)
3700f892fcSMacpaul Lin 
3800f892fcSMacpaul Lin #define local_irq_save(x) \
3900f892fcSMacpaul Lin 	__asm__ __volatile__ ( \
4000f892fcSMacpaul Lin 		"mfsr	%0, $psw\n\t" \
4100f892fcSMacpaul Lin 		"andi	%0, %0, 0x1\n\t" \
4200f892fcSMacpaul Lin 		"setgie.d\n\t" \
4300f892fcSMacpaul Lin 		"dsb\n\t" \
4400f892fcSMacpaul Lin 		: "=&r" (x) \
4500f892fcSMacpaul Lin 	)
4600f892fcSMacpaul Lin 
4700f892fcSMacpaul Lin #define local_save_flags(x) \
4800f892fcSMacpaul Lin 	__asm__ __volatile__ ( \
4900f892fcSMacpaul Lin 		"mfsr	%0, $psw\n\t" \
5000f892fcSMacpaul Lin 		"andi	%0, %0, 0x1\n\t" \
5100f892fcSMacpaul Lin 		"setgie.e\n\t" \
5200f892fcSMacpaul Lin 		"setgie.d\n\t" \
5300f892fcSMacpaul Lin 		: "=r" (x) \
5400f892fcSMacpaul Lin 	)
5500f892fcSMacpaul Lin 
5600f892fcSMacpaul Lin #define irqs_enabled_from_flags(x) ((x) != 0x1f)
5700f892fcSMacpaul Lin 
5800f892fcSMacpaul Lin #define local_irq_restore(x) \
5900f892fcSMacpaul Lin 	do { \
6000f892fcSMacpaul Lin 		if (irqs_enabled_from_flags(x)) \
6100f892fcSMacpaul Lin 			local_irq_enable(); \
6200f892fcSMacpaul Lin 	} while (0)
6300f892fcSMacpaul Lin 
6400f892fcSMacpaul Lin /*
6500f892fcSMacpaul Lin  * Force strict CPU ordering.
6600f892fcSMacpaul Lin  */
6700f892fcSMacpaul Lin #define nop()			asm volatile ("nop;\n\t" : : )
6800f892fcSMacpaul Lin #define mb()			asm volatile (""   : : : "memory")
6900f892fcSMacpaul Lin #define rmb()			asm volatile (""   : : : "memory")
7000f892fcSMacpaul Lin #define wmb()			asm volatile (""   : : : "memory")
7100f892fcSMacpaul Lin 
7200f892fcSMacpaul Lin #endif	/* __ASM_NDS_SYSTEM_H */
73