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
15static 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
32static 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