xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/include/byteorder/swabb.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2007 - 2019 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef _LINUX_BYTEORDER_SWABB_H
16*4882a593Smuzhiyun #define _LINUX_BYTEORDER_SWABB_H
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /*
19*4882a593Smuzhiyun  * linux/byteorder/swabb.h
20*4882a593Smuzhiyun  * SWAp Bytes Bizarrely
21*4882a593Smuzhiyun  *	swaHHXX[ps]?(foo)
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * Support for obNUXIous pdp-endian and other bizarre architectures.
24*4882a593Smuzhiyun  * Will Linux ever run on such ancient beasts? if not, this file
25*4882a593Smuzhiyun  * will be but a programming pearl. Still, it's a reminder that we
26*4882a593Smuzhiyun  * shouldn't be making too many assumptions when trying to be portable.
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /*
31*4882a593Smuzhiyun  * Meaning of the names I chose (vaxlinux people feel free to correct them):
32*4882a593Smuzhiyun  * swahw32	swap 16-bit half-words in a 32-bit word
33*4882a593Smuzhiyun  * swahb32	swap 8-bit halves of each 16-bit half-word in a 32-bit word
34*4882a593Smuzhiyun  *
35*4882a593Smuzhiyun  * No 64-bit support yet. I don't know NUXI conventions for long longs.
36*4882a593Smuzhiyun  * I guarantee it will be a mess when it's there, though :->
37*4882a593Smuzhiyun  * It will be even worse if there are conflicting 64-bit conventions.
38*4882a593Smuzhiyun  * Hopefully, no one ever used 64-bit objects on NUXI machines.
39*4882a593Smuzhiyun  *
40*4882a593Smuzhiyun  */
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define ___swahw32(x) \
43*4882a593Smuzhiyun 	({ \
44*4882a593Smuzhiyun 		__u32 __x = (x); \
45*4882a593Smuzhiyun 		((__u32)(\
46*4882a593Smuzhiyun 			 (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \
47*4882a593Smuzhiyun 			 (((__u32)(__x) & (__u32)0xffff0000UL) >> 16))); \
48*4882a593Smuzhiyun 	})
49*4882a593Smuzhiyun #define ___swahb32(x) \
50*4882a593Smuzhiyun 	({ \
51*4882a593Smuzhiyun 		__u32 __x = (x); \
52*4882a593Smuzhiyun 		((__u32)(\
53*4882a593Smuzhiyun 			 (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \
54*4882a593Smuzhiyun 			 (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8))); \
55*4882a593Smuzhiyun 	})
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define ___constant_swahw32(x) \
58*4882a593Smuzhiyun 	((__u32)(\
59*4882a593Smuzhiyun 		 (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \
60*4882a593Smuzhiyun 		 (((__u32)(x) & (__u32)0xffff0000UL) >> 16)))
61*4882a593Smuzhiyun #define ___constant_swahb32(x) \
62*4882a593Smuzhiyun 	((__u32)(\
63*4882a593Smuzhiyun 		 (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \
64*4882a593Smuzhiyun 		 (((__u32)(x) & (__u32)0xff00ff00UL) >> 8)))
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /*
67*4882a593Smuzhiyun  * provide defaults when no architecture-specific optimization is detected
68*4882a593Smuzhiyun  */
69*4882a593Smuzhiyun #ifndef __arch__swahw32
70*4882a593Smuzhiyun 	#define __arch__swahw32(x) ___swahw32(x)
71*4882a593Smuzhiyun #endif
72*4882a593Smuzhiyun #ifndef __arch__swahb32
73*4882a593Smuzhiyun 	#define __arch__swahb32(x) ___swahb32(x)
74*4882a593Smuzhiyun #endif
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun #ifndef __arch__swahw32p
77*4882a593Smuzhiyun 	#define __arch__swahw32p(x) __swahw32(*(x))
78*4882a593Smuzhiyun #endif
79*4882a593Smuzhiyun #ifndef __arch__swahb32p
80*4882a593Smuzhiyun 	#define __arch__swahb32p(x) __swahb32(*(x))
81*4882a593Smuzhiyun #endif
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #ifndef __arch__swahw32s
84*4882a593Smuzhiyun 	#define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0)
85*4882a593Smuzhiyun #endif
86*4882a593Smuzhiyun #ifndef __arch__swahb32s
87*4882a593Smuzhiyun 	#define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0)
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /*
92*4882a593Smuzhiyun  * Allow constant folding
93*4882a593Smuzhiyun  */
94*4882a593Smuzhiyun #if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__)
95*4882a593Smuzhiyun #  define __swahw32(x) \
96*4882a593Smuzhiyun 	(__builtin_constant_p((__u32)(x)) ? \
97*4882a593Smuzhiyun 	 ___swahw32((x)) : \
98*4882a593Smuzhiyun 	 __fswahw32((x)))
99*4882a593Smuzhiyun #  define __swahb32(x) \
100*4882a593Smuzhiyun 	(__builtin_constant_p((__u32)(x)) ? \
101*4882a593Smuzhiyun 	 ___swahb32((x)) : \
102*4882a593Smuzhiyun 	 __fswahb32((x)))
103*4882a593Smuzhiyun #else
104*4882a593Smuzhiyun #  define __swahw32(x) __fswahw32(x)
105*4882a593Smuzhiyun #  define __swahb32(x) __fswahb32(x)
106*4882a593Smuzhiyun #endif /* OPTIMIZE */
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 
__fswahw32(__u32 x)109*4882a593Smuzhiyun __inline static__ __const__ __u32 __fswahw32(__u32 x)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	return __arch__swahw32(x);
112*4882a593Smuzhiyun }
__swahw32p(__u32 * x)113*4882a593Smuzhiyun __inline static__ __u32 __swahw32p(__u32 *x)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	return __arch__swahw32p(x);
116*4882a593Smuzhiyun }
__swahw32s(__u32 * addr)117*4882a593Smuzhiyun __inline static__ void __swahw32s(__u32 *addr)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	__arch__swahw32s(addr);
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 
__fswahb32(__u32 x)123*4882a593Smuzhiyun __inline static__ __const__ __u32 __fswahb32(__u32 x)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun 	return __arch__swahb32(x);
126*4882a593Smuzhiyun }
__swahb32p(__u32 * x)127*4882a593Smuzhiyun __inline static__ __u32 __swahb32p(__u32 *x)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	return __arch__swahb32p(x);
130*4882a593Smuzhiyun }
__swahb32s(__u32 * addr)131*4882a593Smuzhiyun __inline static__ void __swahb32s(__u32 *addr)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun 	__arch__swahb32s(addr);
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun #ifdef __BYTEORDER_HAS_U64__
137*4882a593Smuzhiyun 	/*
138*4882a593Smuzhiyun 	* Not supported yet
139*4882a593Smuzhiyun 	*/
140*4882a593Smuzhiyun #endif /* __BYTEORDER_HAS_U64__ */
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #if defined(PLATFORM_LINUX)
143*4882a593Smuzhiyun 	#define swahw32 __swahw32
144*4882a593Smuzhiyun 	#define swahb32 __swahb32
145*4882a593Smuzhiyun 	#define swahw32p __swahw32p
146*4882a593Smuzhiyun 	#define swahb32p __swahb32p
147*4882a593Smuzhiyun 	#define swahw32s __swahw32s
148*4882a593Smuzhiyun 	#define swahb32s __swahb32s
149*4882a593Smuzhiyun #endif
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #endif /* _LINUX_BYTEORDER_SWABB_H */
152