1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * (C) Copyright 2007 Michal Simek
4 *
5 * Michal  SIMEK <monstr@monstr.eu>
6 */
7
8/* FSL macros */
9#define NGET(val, fslnum) \
10	__asm__ __volatile__ ("nget %0, rfsl" #fslnum :"=r" (val));
11
12#define GET(val, fslnum) \
13	__asm__ __volatile__ ("get %0, rfsl" #fslnum :"=r" (val));
14
15#define NCGET(val, fslnum) \
16	__asm__ __volatile__ ("ncget %0, rfsl" #fslnum :"=r" (val));
17
18#define CGET(val, fslnum) \
19	__asm__ __volatile__ ("cget %0, rfsl" #fslnum :"=r" (val));
20
21#define NPUT(val, fslnum) \
22	__asm__ __volatile__ ("nput %0, rfsl" #fslnum ::"r" (val));
23
24#define PUT(val, fslnum) \
25	__asm__ __volatile__ ("put %0, rfsl" #fslnum ::"r" (val));
26
27#define NCPUT(val, fslnum) \
28	__asm__ __volatile__ ("ncput %0, rfsl" #fslnum ::"r" (val));
29
30#define CPUT(val, fslnum) \
31	__asm__ __volatile__ ("cput %0, rfsl" #fslnum ::"r" (val));
32
33/* CPU dependent */
34/* machine status register */
35#define MFS(val, reg) \
36	__asm__ __volatile__ ("mfs %0," #reg :"=r" (val));
37
38#define MTS(val, reg) \
39	__asm__ __volatile__ ("mts " #reg ", %0"::"r" (val));
40
41/* get return address from interrupt */
42#define R14(val) \
43	__asm__ __volatile__ ("addi %0, r14, 0":"=r" (val));
44
45/* get return address from interrupt */
46#define R17(val) \
47	__asm__ __volatile__ ("addi %0, r17, 0" : "=r" (val));
48
49#define NOP	__asm__ __volatile__ ("nop");
50
51/* use machine status registe USE_MSR_REG */
52#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 1
53#define MSRSET(val) \
54	__asm__ __volatile__ ("msrset r0," #val );
55
56#define MSRCLR(val) \
57	__asm__ __volatile__ ("msrclr r0," #val );
58
59#else
60#define MSRSET(val)						\
61{								\
62	register unsigned tmp;					\
63	__asm__ __volatile__ ("					\
64			mfs	%0, rmsr;			\
65			ori	%0, %0, "#val";			\
66			mts	rmsr, %0;			\
67			nop;"					\
68			: "=r" (tmp)				\
69			: "d" (val)				\
70			: "memory");				\
71}
72
73#define MSRCLR(val)						\
74{								\
75	register unsigned tmp;					\
76	__asm__ __volatile__ ("					\
77			mfs	%0, rmsr;			\
78			andi	%0, %0, ~"#val";		\
79			mts	rmsr, %0;			\
80			nop;"					\
81			: "=r" (tmp)				\
82			: "d" (val)				\
83			: "memory");				\
84}
85#endif
86