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 Singhstatic 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 Singhstatic 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 Singhstatic 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