xref: /rk3399_rockchip-uboot/arch/microblaze/include/asm/asm.h (revision 819833af39a91fa1c1e8252862bbda6f5a602f7b)
1*819833afSPeter Tyser /*
2*819833afSPeter Tyser  * (C) Copyright 2007 Michal Simek
3*819833afSPeter Tyser  *
4*819833afSPeter Tyser  * Michal  SIMEK <monstr@monstr.eu>
5*819833afSPeter Tyser  *
6*819833afSPeter Tyser  * See file CREDITS for list of people who contributed to this
7*819833afSPeter Tyser  * project.
8*819833afSPeter Tyser  *
9*819833afSPeter Tyser  * This program is free software; you can redistribute it and/or
10*819833afSPeter Tyser  * modify it under the terms of the GNU General Public License as
11*819833afSPeter Tyser  * published by the Free Software Foundation; either version 2 of
12*819833afSPeter Tyser  * the License, or (at your option) any later version.
13*819833afSPeter Tyser  *
14*819833afSPeter Tyser  * This program is distributed in the hope that it will be useful,
15*819833afSPeter Tyser  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16*819833afSPeter Tyser  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
17*819833afSPeter Tyser  * GNU General Public License for more details.
18*819833afSPeter Tyser  *
19*819833afSPeter Tyser  * You should have received a copy of the GNU General Public License
20*819833afSPeter Tyser  * along with this program; if not, write to the Free Software
21*819833afSPeter Tyser  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22*819833afSPeter Tyser  * MA 02111-1307 USA
23*819833afSPeter Tyser  */
24*819833afSPeter Tyser 
25*819833afSPeter Tyser /* FSL macros */
26*819833afSPeter Tyser #define NGET(val, fslnum) \
27*819833afSPeter Tyser 	__asm__ __volatile__ ("nget %0, rfsl" #fslnum :"=r" (val));
28*819833afSPeter Tyser 
29*819833afSPeter Tyser #define GET(val, fslnum) \
30*819833afSPeter Tyser 	__asm__ __volatile__ ("get %0, rfsl" #fslnum :"=r" (val));
31*819833afSPeter Tyser 
32*819833afSPeter Tyser #define NCGET(val, fslnum) \
33*819833afSPeter Tyser 	__asm__ __volatile__ ("ncget %0, rfsl" #fslnum :"=r" (val));
34*819833afSPeter Tyser 
35*819833afSPeter Tyser #define CGET(val, fslnum) \
36*819833afSPeter Tyser 	__asm__ __volatile__ ("cget %0, rfsl" #fslnum :"=r" (val));
37*819833afSPeter Tyser 
38*819833afSPeter Tyser #define NPUT(val, fslnum) \
39*819833afSPeter Tyser 	__asm__ __volatile__ ("nput %0, rfsl" #fslnum ::"r" (val));
40*819833afSPeter Tyser 
41*819833afSPeter Tyser #define PUT(val, fslnum) \
42*819833afSPeter Tyser 	__asm__ __volatile__ ("put %0, rfsl" #fslnum ::"r" (val));
43*819833afSPeter Tyser 
44*819833afSPeter Tyser #define NCPUT(val, fslnum) \
45*819833afSPeter Tyser 	__asm__ __volatile__ ("ncput %0, rfsl" #fslnum ::"r" (val));
46*819833afSPeter Tyser 
47*819833afSPeter Tyser #define CPUT(val, fslnum) \
48*819833afSPeter Tyser 	__asm__ __volatile__ ("cput %0, rfsl" #fslnum ::"r" (val));
49*819833afSPeter Tyser 
50*819833afSPeter Tyser /* CPU dependent */
51*819833afSPeter Tyser /* machine status register */
52*819833afSPeter Tyser #define MFS(val, reg) \
53*819833afSPeter Tyser 	__asm__ __volatile__ ("mfs %0," #reg :"=r" (val));
54*819833afSPeter Tyser 
55*819833afSPeter Tyser #define MTS(val, reg) \
56*819833afSPeter Tyser 	__asm__ __volatile__ ("mts " #reg ", %0"::"r" (val));
57*819833afSPeter Tyser 
58*819833afSPeter Tyser /* get return address from interrupt */
59*819833afSPeter Tyser #define R14(val) \
60*819833afSPeter Tyser 	__asm__ __volatile__ ("addi %0, r14, 0":"=r" (val));
61*819833afSPeter Tyser 
62*819833afSPeter Tyser #define NOP	__asm__ __volatile__ ("nop");
63*819833afSPeter Tyser 
64*819833afSPeter Tyser /* use machine status registe USE_MSR_REG */
65*819833afSPeter Tyser #ifdef XILINX_USE_MSR_INSTR
66*819833afSPeter Tyser #define MSRSET(val) \
67*819833afSPeter Tyser 	__asm__ __volatile__ ("msrset r0," #val );
68*819833afSPeter Tyser 
69*819833afSPeter Tyser #define MSRCLR(val) \
70*819833afSPeter Tyser 	__asm__ __volatile__ ("msrclr r0," #val );
71*819833afSPeter Tyser 
72*819833afSPeter Tyser #else
73*819833afSPeter Tyser #define MSRSET(val)						\
74*819833afSPeter Tyser {								\
75*819833afSPeter Tyser 	register unsigned tmp;					\
76*819833afSPeter Tyser 	__asm__ __volatile__ ("					\
77*819833afSPeter Tyser 			mfs	%0, rmsr;			\
78*819833afSPeter Tyser 			ori	%0, %0, "#val";			\
79*819833afSPeter Tyser 			mts	rmsr, %0;			\
80*819833afSPeter Tyser 			nop;"					\
81*819833afSPeter Tyser 			: "=r" (tmp)				\
82*819833afSPeter Tyser 			: "d" (val)				\
83*819833afSPeter Tyser 			: "memory");				\
84*819833afSPeter Tyser }
85*819833afSPeter Tyser 
86*819833afSPeter Tyser #define MSRCLR(val)						\
87*819833afSPeter Tyser {								\
88*819833afSPeter Tyser 	register unsigned tmp;					\
89*819833afSPeter Tyser 	__asm__ __volatile__ ("					\
90*819833afSPeter Tyser 			mfs	%0, rmsr;			\
91*819833afSPeter Tyser 			andi	%0, %0, ~"#val";		\
92*819833afSPeter Tyser 			mts	rmsr, %0;			\
93*819833afSPeter Tyser 			nop;"					\
94*819833afSPeter Tyser 			: "=r" (tmp)				\
95*819833afSPeter Tyser 			: "d" (val)				\
96*819833afSPeter Tyser 			: "memory");				\
97*819833afSPeter Tyser }
98*819833afSPeter Tyser #endif
99