1*538f6997SSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause 2*538f6997SSrikanth Yalavarthi * Copyright (c) 2023 Marvell. 3*538f6997SSrikanth Yalavarthi */ 4*538f6997SSrikanth Yalavarthi 5*538f6997SSrikanth Yalavarthi #include <errno.h> 6*538f6997SSrikanth Yalavarthi #include <math.h> 7*538f6997SSrikanth Yalavarthi #include <stdint.h> 8*538f6997SSrikanth Yalavarthi 9*538f6997SSrikanth Yalavarthi #include "mldev_utils.h" 10*538f6997SSrikanth Yalavarthi 11*538f6997SSrikanth Yalavarthi #ifndef BIT 12*538f6997SSrikanth Yalavarthi #define BIT(nr) (1UL << (nr)) 13*538f6997SSrikanth Yalavarthi #endif 14*538f6997SSrikanth Yalavarthi 15*538f6997SSrikanth Yalavarthi #ifndef BITS_PER_LONG 16*538f6997SSrikanth Yalavarthi #define BITS_PER_LONG (__SIZEOF_LONG__ * 8) 17*538f6997SSrikanth Yalavarthi #endif 18*538f6997SSrikanth Yalavarthi 19*538f6997SSrikanth Yalavarthi #ifndef GENMASK_U32 20*538f6997SSrikanth Yalavarthi #define GENMASK_U32(h, l) (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) 21*538f6997SSrikanth Yalavarthi #endif 22*538f6997SSrikanth Yalavarthi 23*538f6997SSrikanth Yalavarthi /* float32: bit index of MSB & LSB of sign, exponent and mantissa */ 24*538f6997SSrikanth Yalavarthi #define FP32_LSB_M 0 25*538f6997SSrikanth Yalavarthi #define FP32_MSB_M 22 26*538f6997SSrikanth Yalavarthi #define FP32_LSB_E 23 27*538f6997SSrikanth Yalavarthi #define FP32_MSB_E 30 28*538f6997SSrikanth Yalavarthi #define FP32_LSB_S 31 29*538f6997SSrikanth Yalavarthi #define FP32_MSB_S 31 30*538f6997SSrikanth Yalavarthi 31*538f6997SSrikanth Yalavarthi /* float32: bitmask for sign, exponent and mantissa */ 32*538f6997SSrikanth Yalavarthi #define FP32_MASK_S GENMASK_U32(FP32_MSB_S, FP32_LSB_S) 33*538f6997SSrikanth Yalavarthi #define FP32_MASK_E GENMASK_U32(FP32_MSB_E, FP32_LSB_E) 34*538f6997SSrikanth Yalavarthi #define FP32_MASK_M GENMASK_U32(FP32_MSB_M, FP32_LSB_M) 35*538f6997SSrikanth Yalavarthi 36*538f6997SSrikanth Yalavarthi /* float16: bit index of MSB & LSB of sign, exponent and mantissa */ 37*538f6997SSrikanth Yalavarthi #define FP16_LSB_M 0 38*538f6997SSrikanth Yalavarthi #define FP16_MSB_M 9 39*538f6997SSrikanth Yalavarthi #define FP16_LSB_E 10 40*538f6997SSrikanth Yalavarthi #define FP16_MSB_E 14 41*538f6997SSrikanth Yalavarthi #define FP16_LSB_S 15 42*538f6997SSrikanth Yalavarthi #define FP16_MSB_S 15 43*538f6997SSrikanth Yalavarthi 44*538f6997SSrikanth Yalavarthi /* float16: bitmask for sign, exponent and mantissa */ 45*538f6997SSrikanth Yalavarthi #define FP16_MASK_S GENMASK_U32(FP16_MSB_S, FP16_LSB_S) 46*538f6997SSrikanth Yalavarthi #define FP16_MASK_E GENMASK_U32(FP16_MSB_E, FP16_LSB_E) 47*538f6997SSrikanth Yalavarthi #define FP16_MASK_M GENMASK_U32(FP16_MSB_M, FP16_LSB_M) 48*538f6997SSrikanth Yalavarthi 49*538f6997SSrikanth Yalavarthi /* bfloat16: bit index of MSB & LSB of sign, exponent and mantissa */ 50*538f6997SSrikanth Yalavarthi #define BF16_LSB_M 0 51*538f6997SSrikanth Yalavarthi #define BF16_MSB_M 6 52*538f6997SSrikanth Yalavarthi #define BF16_LSB_E 7 53*538f6997SSrikanth Yalavarthi #define BF16_MSB_E 14 54*538f6997SSrikanth Yalavarthi #define BF16_LSB_S 15 55*538f6997SSrikanth Yalavarthi #define BF16_MSB_S 15 56*538f6997SSrikanth Yalavarthi 57*538f6997SSrikanth Yalavarthi /* bfloat16: bitmask for sign, exponent and mantissa */ 58*538f6997SSrikanth Yalavarthi #define BF16_MASK_S GENMASK_U32(BF16_MSB_S, BF16_LSB_S) 59*538f6997SSrikanth Yalavarthi #define BF16_MASK_E GENMASK_U32(BF16_MSB_E, BF16_LSB_E) 60*538f6997SSrikanth Yalavarthi #define BF16_MASK_M GENMASK_U32(BF16_MSB_M, BF16_LSB_M) 61*538f6997SSrikanth Yalavarthi 62*538f6997SSrikanth Yalavarthi /* Exponent bias */ 63*538f6997SSrikanth Yalavarthi #define FP32_BIAS_E 127 64*538f6997SSrikanth Yalavarthi #define FP16_BIAS_E 15 65*538f6997SSrikanth Yalavarthi #define BF16_BIAS_E 127 66*538f6997SSrikanth Yalavarthi 67*538f6997SSrikanth Yalavarthi #define FP32_PACK(sign, exponent, mantissa) \ 68*538f6997SSrikanth Yalavarthi (((sign) << FP32_LSB_S) | ((exponent) << FP32_LSB_E) | (mantissa)) 69*538f6997SSrikanth Yalavarthi 70*538f6997SSrikanth Yalavarthi #define FP16_PACK(sign, exponent, mantissa) \ 71*538f6997SSrikanth Yalavarthi (((sign) << FP16_LSB_S) | ((exponent) << FP16_LSB_E) | (mantissa)) 72*538f6997SSrikanth Yalavarthi 73*538f6997SSrikanth Yalavarthi #define BF16_PACK(sign, exponent, mantissa) \ 74*538f6997SSrikanth Yalavarthi (((sign) << BF16_LSB_S) | ((exponent) << BF16_LSB_E) | (mantissa)) 75*538f6997SSrikanth Yalavarthi 76*538f6997SSrikanth Yalavarthi /* Represent float32 as float and uint32_t */ 77*538f6997SSrikanth Yalavarthi union float32 { 78*538f6997SSrikanth Yalavarthi float f; 79*538f6997SSrikanth Yalavarthi uint32_t u; 80*538f6997SSrikanth Yalavarthi }; 81