move new files out from platform support patch
[openwrt/openwrt.git] / target / linux / ubicom32 / files / arch / ubicom32 / include / asm / ip5000-asm.h
1 /*
2 * arch/ubicom32/include/asm/ip5000-asm.h
3 * Instruction macros for the IP5000.
4 *
5 * (C) Copyright 2009, Ubicom, Inc.
6 *
7 * This file is part of the Ubicom32 Linux Kernel Port.
8 *
9 * The Ubicom32 Linux Kernel Port is free software: you can redistribute
10 * it and/or modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation, either version 2 of the
12 * License, or (at your option) any later version.
13 *
14 * The Ubicom32 Linux Kernel Port is distributed in the hope that it
15 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
16 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17 * the GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with the Ubicom32 Linux Kernel Port. If not,
21 * see <http://www.gnu.org/licenses/>.
22 *
23 * Ubicom32 implementation derived from (with many thanks):
24 * arch/m68knommu
25 * arch/blackfin
26 * arch/parisc
27 */
28
29 #ifndef _ASM_UBICOM32_IP5000_ASM_H
30 #define _ASM_UBICOM32_IP5000_ASM_H
31
32 #if !defined(__LINKER__)
33
34 #if defined(__ASSEMBLY__)
35 .macro cycles quant
36 .if (\quant) == 1
37 nop
38 .else
39 .if (((\quant) + 3) / 8) > 0
40 .rept (((\quant) + 3) / 8)
41 jmpt.f .+4
42 .endr
43 .endif
44 .if ((((\quant) + 3) % 8) / 4) > 0
45 jmpt.t .+4
46 .endif
47 .endif
48 .endm
49 #else
50 /*
51 * Same macro as above just in C inline asm
52 */
53 asm (" \n\
54 .macro cycles quant \n\
55 .if (\\quant) == 1 \n\
56 nop \n\
57 .else \n\
58 .if (((\\quant) + 3) / 8) > 0 \n\
59 .rept (((\\quant) + 3) / 8) \n\
60 jmpt.f .+4 \n\
61 .endr \n\
62 .endif \n\
63 .if ((((\\quant) + 3) % 8) / 4) > 0 \n\
64 jmpt.t .+4 \n\
65 .endif \n\
66 .endif \n\
67 .endm \n\
68 ");
69 #endif
70
71
72 #if defined(__ASSEMBLY__)
73 .macro pipe_flush cyc
74 cycles 11 - (\cyc)
75 .endm
76 #else
77 /*
78 * Same macro as above just in C inline asm
79 */
80 asm (" \n\
81 .macro pipe_flush cyc \n\
82 cycles 11 - (\\cyc) \n\
83 .endm \n\
84 ");
85
86 #endif
87
88 #if defined(__ASSEMBLY__)
89 .macro setcsr_flush cyc
90 cycles 5 - (\cyc)
91 .endm
92 #else
93 /*
94 * Same macro as above just in C inline asm
95 */
96 asm (" \n\
97 .macro setcsr_flush cyc \n\
98 cycles 5 - (\\cyc) \n\
99 .endm \n\
100 ");
101 #endif
102
103 /*
104 * Macros for prefetch (using miss-aligned memory write)
105 */
106 #if defined(__ASSEMBLY__)
107
108 .macro pre_fetch_macro thread_num, Ascratch, Aaddress length
109 bclr MT_TRAP_EN, MT_TRAP_EN, #(\thread_num)
110 bset \Ascratch, \Aaddress, #0 ; force a miss-aligned address
111 jmpt.t .+4 ; delay for both address setup and trap disable
112 move.4 (\Ascratch), #0
113 .if (\length > 32)
114 move.4 32(\Ascratch), #0
115 .endif
116 .if (\length > 64)
117 move.4 64(\Ascratch), #0
118 .endif
119 .if (\length > 96)
120 move.4 96(\Ascratch), #0
121 .endif
122 .if (\length > 128)
123 invalid_instruction ; maximum pre-fetch size is 4 cache lines
124 .endif
125 bset MT_TRAP_EN, MT_TRAP_EN, #(\thread_num)
126 .endm
127
128 #else
129 /*
130 * Same macro as above just in C inline asm
131 */
132 asm (" \n\
133 .macro pre_fetch_macro thread_num, Ascratch, Aaddress length \n\
134 bclr MT_TRAP_EN, MT_TRAP_EN, #(\thread_num) \n\
135 bset \\Ascratch, \\Aaddress, #0 ; force a miss-aligned address \n\
136 jmpt.t .+4 ; delay for both address setup and trap disable \n\
137 move.4 (\\Ascratch), #0 \n\
138 .if (\\length > 32) \n\
139 move.4 32(\\Ascratch), #0 \n\
140 .endif \n\
141 .if (\\length > 64) \n\
142 move.4 64(\\Ascratch), #0 \n\
143 .endif \n\
144 .if (\\length > 96) \n\
145 move.4 96(\\Ascratch), #0 \n\
146 .endif \n\
147 .if (\\length > 128) \n\
148 invalid_instruction ; maximum pre-fetch size is 4 cache lines \n\
149 .endif \n\
150 bset MT_TRAP_EN, MT_TRAP_EN, #(\\thread_num) \n\
151 .endm \n\
152 ");
153 #endif
154
155 #endif /* !defined(__LINKER__) */
156 #endif /* defined _ASM_UBICOM32_IP5000_ASM_H */