xref: /rk3399_ARM-atf/include/plat/marvell/odyssey/csr/ody-swap.h (revision 12d80bbbf6031228bdd910eccb03bb185e8df527)
1*4b8b8d74SJaiprakash Singh /***********************license start***********************************
2*4b8b8d74SJaiprakash Singh * Copyright (C) 2021-2026 Marvell.
3*4b8b8d74SJaiprakash Singh * SPDX-License-Identifier: BSD-3-Clause
4*4b8b8d74SJaiprakash Singh * https://spdx.org/licenses
5*4b8b8d74SJaiprakash Singh ***********************license end**************************************/
6*4b8b8d74SJaiprakash Singh 
7*4b8b8d74SJaiprakash Singh /**
8*4b8b8d74SJaiprakash Singh  * @file
9*4b8b8d74SJaiprakash Singh  *
10*4b8b8d74SJaiprakash Singh  * Utility functions for endian swapping
11*4b8b8d74SJaiprakash Singh  *
12*4b8b8d74SJaiprakash Singh  * <hr>$Revision: 32636 $<hr>
13*4b8b8d74SJaiprakash Singh  *
14*4b8b8d74SJaiprakash Singh  * @addtogroup hal
15*4b8b8d74SJaiprakash Singh  * @{
16*4b8b8d74SJaiprakash Singh  */
17*4b8b8d74SJaiprakash Singh 
18*4b8b8d74SJaiprakash Singh /**
19*4b8b8d74SJaiprakash Singh  * Byte swap a 16 bit number
20*4b8b8d74SJaiprakash Singh  *
21*4b8b8d74SJaiprakash Singh  * @param x      16 bit number
22*4b8b8d74SJaiprakash Singh  * @return Byte swapped result
23*4b8b8d74SJaiprakash Singh  */
ody_swap16(uint16_t x)24*4b8b8d74SJaiprakash Singh static inline uint16_t ody_swap16(uint16_t x)
25*4b8b8d74SJaiprakash Singh {
26*4b8b8d74SJaiprakash Singh 	return ((uint16_t)((((uint16_t)(x) & (uint16_t)0x00ffU) << 8) |
27*4b8b8d74SJaiprakash Singh 		(((uint16_t)(x) & (uint16_t)0xff00U) >> 8)));
28*4b8b8d74SJaiprakash Singh }
29*4b8b8d74SJaiprakash Singh 
30*4b8b8d74SJaiprakash Singh 
31*4b8b8d74SJaiprakash Singh /**
32*4b8b8d74SJaiprakash Singh  * Byte swap a 32 bit number
33*4b8b8d74SJaiprakash Singh  *
34*4b8b8d74SJaiprakash Singh  * @param x      32 bit number
35*4b8b8d74SJaiprakash Singh  * @return Byte swapped result
36*4b8b8d74SJaiprakash Singh  */
ody_swap32(uint32_t x)37*4b8b8d74SJaiprakash Singh static inline uint32_t ody_swap32(uint32_t x)
38*4b8b8d74SJaiprakash Singh {
39*4b8b8d74SJaiprakash Singh #if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
40*4b8b8d74SJaiprakash Singh 	return __builtin_bswap32(x);
41*4b8b8d74SJaiprakash Singh #else
42*4b8b8d74SJaiprakash Singh 	x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
43*4b8b8d74SJaiprakash Singh 	x = (x>>16) | (x<<16);
44*4b8b8d74SJaiprakash Singh 	return x;
45*4b8b8d74SJaiprakash Singh #endif
46*4b8b8d74SJaiprakash Singh }
47*4b8b8d74SJaiprakash Singh 
48*4b8b8d74SJaiprakash Singh 
49*4b8b8d74SJaiprakash Singh /**
50*4b8b8d74SJaiprakash Singh  * Byte swap a 64 bit number
51*4b8b8d74SJaiprakash Singh  *
52*4b8b8d74SJaiprakash Singh  * @param x      64 bit number
53*4b8b8d74SJaiprakash Singh  * @return Byte swapped result
54*4b8b8d74SJaiprakash Singh  */
ody_swap64(uint64_t x)55*4b8b8d74SJaiprakash Singh static inline uint64_t ody_swap64(uint64_t x)
56*4b8b8d74SJaiprakash Singh {
57*4b8b8d74SJaiprakash Singh #if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
58*4b8b8d74SJaiprakash Singh 	return __builtin_bswap64(x);
59*4b8b8d74SJaiprakash Singh #else
60*4b8b8d74SJaiprakash Singh 	x = ((x << 8)&0xFF00FF00FF00FF00ULL) | ((x >> 8)&0x00FF00FF00FF00FFULL);
61*4b8b8d74SJaiprakash Singh 	x = ((x<<16)&0xFFFF0000FFFF0000ULL) | ((x>>16)&0x0000FFFF0000FFFFULL);
62*4b8b8d74SJaiprakash Singh 	return (x>>32) | (x<<32);
63*4b8b8d74SJaiprakash Singh #endif
64*4b8b8d74SJaiprakash Singh }
65*4b8b8d74SJaiprakash Singh 
66*4b8b8d74SJaiprakash Singh 
67*4b8b8d74SJaiprakash Singh #if __BYTE_ORDER == __BIG_ENDIAN
68*4b8b8d74SJaiprakash Singh 
69*4b8b8d74SJaiprakash Singh #define ody_cpu_to_le16(x) ody_swap16(x)
70*4b8b8d74SJaiprakash Singh #define ody_cpu_to_le32(x) ody_swap32(x)
71*4b8b8d74SJaiprakash Singh #define ody_cpu_to_le64(x) ody_swap64(x)
72*4b8b8d74SJaiprakash Singh 
73*4b8b8d74SJaiprakash Singh #define ody_cpu_to_be16(x) (x)
74*4b8b8d74SJaiprakash Singh #define ody_cpu_to_be32(x) (x)
75*4b8b8d74SJaiprakash Singh #define ody_cpu_to_be64(x) (x)
76*4b8b8d74SJaiprakash Singh 
77*4b8b8d74SJaiprakash Singh #else
78*4b8b8d74SJaiprakash Singh 
79*4b8b8d74SJaiprakash Singh #define ody_cpu_to_le16(x) (x)
80*4b8b8d74SJaiprakash Singh #define ody_cpu_to_le32(x) (x)
81*4b8b8d74SJaiprakash Singh #define ody_cpu_to_le64(x) (x)
82*4b8b8d74SJaiprakash Singh 
83*4b8b8d74SJaiprakash Singh #define ody_cpu_to_be16(x) ody_swap16(x)
84*4b8b8d74SJaiprakash Singh #define ody_cpu_to_be32(x) ody_swap32(x)
85*4b8b8d74SJaiprakash Singh #define ody_cpu_to_be64(x) ody_swap64(x)
86*4b8b8d74SJaiprakash Singh 
87*4b8b8d74SJaiprakash Singh #endif
88*4b8b8d74SJaiprakash Singh 
89*4b8b8d74SJaiprakash Singh #define ody_le16_to_cpu(x) ody_cpu_to_le16(x)
90*4b8b8d74SJaiprakash Singh #define ody_le32_to_cpu(x) ody_cpu_to_le32(x)
91*4b8b8d74SJaiprakash Singh #define ody_le64_to_cpu(x) ody_cpu_to_le64(x)
92*4b8b8d74SJaiprakash Singh 
93*4b8b8d74SJaiprakash Singh #define ody_be16_to_cpu(x) ody_cpu_to_be16(x)
94*4b8b8d74SJaiprakash Singh #define ody_be32_to_cpu(x) ody_cpu_to_be32(x)
95*4b8b8d74SJaiprakash Singh #define ody_be64_to_cpu(x) ody_cpu_to_be64(x)
96*4b8b8d74SJaiprakash Singh 
97*4b8b8d74SJaiprakash Singh /** @} */
98