1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2003, 2004 Ralf Baechle
7  */
8 #ifndef __ASM_MACH_GENERIC_MANGLE_PORT_H
9 #define __ASM_MACH_GENERIC_MANGLE_PORT_H
10 
11 #include <asm/byteorder.h>
12 
13 #ifdef __BIG_ENDIAN
14 
15 static inline bool __should_swizzle_bits(volatile void *a)
16 {
17 	extern const bool octeon_should_swizzle_table[];
18 	u64 did = ((u64)(uintptr_t)a >> 40) & 0xff;
19 
20 	return octeon_should_swizzle_table[did];
21 }
22 
23 # define __swizzle_addr_b(port)	(port)
24 # define __swizzle_addr_w(port)	(port)
25 # define __swizzle_addr_l(port)	(port)
26 # define __swizzle_addr_q(port)	(port)
27 
28 #else /* __LITTLE_ENDIAN */
29 
30 #define __should_swizzle_bits(a)	false
31 
32 static inline bool __should_swizzle_addr(u64 p)
33 {
34 	/* boot bus? */
35 	return ((p >> 40) & 0xff) == 0;
36 }
37 
38 # define __swizzle_addr_b(port)	\
39 	(__should_swizzle_addr(port) ? (port) ^ 7 : (port))
40 # define __swizzle_addr_w(port)	\
41 	(__should_swizzle_addr(port) ? (port) ^ 6 : (port))
42 # define __swizzle_addr_l(port)	\
43 	(__should_swizzle_addr(port) ? (port) ^ 4 : (port))
44 # define __swizzle_addr_q(port)	(port)
45 
46 #endif /* __BIG_ENDIAN */
47 
48 
49 # define ioswabb(a, x)		(x)
50 # define __mem_ioswabb(a, x)	(x)
51 # define ioswabw(a, x)		(__should_swizzle_bits(a) ?		\
52 				 le16_to_cpu((__force __le16)(x)) :	\
53 				 (x))
54 # define __mem_ioswabw(a, x)	(x)
55 # define ioswabl(a, x)		(__should_swizzle_bits(a) ?		\
56 				 le32_to_cpu((__force __le32)(x)) :	\
57 				 (x))
58 # define __mem_ioswabl(a, x)	(x)
59 # define ioswabq(a, x)		(__should_swizzle_bits(a) ?		\
60 				 le64_to_cpu((__force __le64)(x)) :	\
61 				 (x))
62 # define __mem_ioswabq(a, x)	(x)
63 
64 #endif /* __ASM_MACH_GENERIC_MANGLE_PORT_H */
65