1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2015 6WIND S.A. 3 * Copyright 2015 Mellanox Technologies, Ltd 4 */ 5 6 #ifndef RTE_PMD_MLX5_UTILS_H_ 7 #define RTE_PMD_MLX5_UTILS_H_ 8 9 #include <stddef.h> 10 #include <stdint.h> 11 #include <stdio.h> 12 #include <limits.h> 13 #include <assert.h> 14 #include <errno.h> 15 16 #include "mlx5_defs.h" 17 18 /* Bit-field manipulation. */ 19 #define BITFIELD_DECLARE(bf, type, size) \ 20 type bf[(((size_t)(size) / (sizeof(type) * CHAR_BIT)) + \ 21 !!((size_t)(size) % (sizeof(type) * CHAR_BIT)))] 22 #define BITFIELD_DEFINE(bf, type, size) \ 23 BITFIELD_DECLARE((bf), type, (size)) = { 0 } 24 #define BITFIELD_SET(bf, b) \ 25 (assert((size_t)(b) < (sizeof(bf) * CHAR_BIT)), \ 26 (void)((bf)[((b) / (sizeof((bf)[0]) * CHAR_BIT))] |= \ 27 ((size_t)1 << ((b) % (sizeof((bf)[0]) * CHAR_BIT))))) 28 #define BITFIELD_RESET(bf, b) \ 29 (assert((size_t)(b) < (sizeof(bf) * CHAR_BIT)), \ 30 (void)((bf)[((b) / (sizeof((bf)[0]) * CHAR_BIT))] &= \ 31 ~((size_t)1 << ((b) % (sizeof((bf)[0]) * CHAR_BIT))))) 32 #define BITFIELD_ISSET(bf, b) \ 33 (assert((size_t)(b) < (sizeof(bf) * CHAR_BIT)), \ 34 !!(((bf)[((b) / (sizeof((bf)[0]) * CHAR_BIT))] & \ 35 ((size_t)1 << ((b) % (sizeof((bf)[0]) * CHAR_BIT)))))) 36 37 /* Convert a bit number to the corresponding 64-bit mask */ 38 #define MLX5_BITSHIFT(v) (UINT64_C(1) << (v)) 39 40 /* Save and restore errno around argument evaluation. */ 41 #define ERRNO_SAFE(x) ((errno = (int []){ errno, ((x), 0) }[0])) 42 43 /* 44 * Helper macros to work around __VA_ARGS__ limitations in a C99 compliant 45 * manner. 46 */ 47 #define PMD_DRV_LOG_STRIP(a, b) a 48 #define PMD_DRV_LOG_OPAREN ( 49 #define PMD_DRV_LOG_CPAREN ) 50 #define PMD_DRV_LOG_COMMA , 51 52 /* Return the file name part of a path. */ 53 static inline const char * 54 pmd_drv_log_basename(const char *s) 55 { 56 const char *n = s; 57 58 while (*n) 59 if (*(n++) == '/') 60 s = n; 61 return s; 62 } 63 64 extern int mlx5_logtype; 65 66 #define PMD_DRV_LOG___(level, ...) \ 67 rte_log(RTE_LOG_ ## level, \ 68 mlx5_logtype, \ 69 RTE_FMT(MLX5_DRIVER_NAME ": " \ 70 RTE_FMT_HEAD(__VA_ARGS__,), \ 71 RTE_FMT_TAIL(__VA_ARGS__,))) 72 73 /* 74 * When debugging is enabled (NDEBUG not defined), file, line and function 75 * information replace the driver name (MLX5_DRIVER_NAME) in log messages. 76 */ 77 #ifndef NDEBUG 78 79 #define PMD_DRV_LOG__(level, ...) \ 80 PMD_DRV_LOG___(level, "%s:%u: %s(): " __VA_ARGS__) 81 #define PMD_DRV_LOG_(level, s, ...) \ 82 PMD_DRV_LOG__(level, \ 83 s "\n" PMD_DRV_LOG_COMMA \ 84 pmd_drv_log_basename(__FILE__) PMD_DRV_LOG_COMMA \ 85 __LINE__ PMD_DRV_LOG_COMMA \ 86 __func__, \ 87 __VA_ARGS__) 88 89 #else /* NDEBUG */ 90 #define PMD_DRV_LOG__(level, ...) \ 91 PMD_DRV_LOG___(level, __VA_ARGS__) 92 #define PMD_DRV_LOG_(level, s, ...) \ 93 PMD_DRV_LOG__(level, s "\n", __VA_ARGS__) 94 95 #endif /* NDEBUG */ 96 97 /* Generic printf()-like logging macro with automatic line feed. */ 98 #define DRV_LOG(level, ...) \ 99 PMD_DRV_LOG_(level, \ 100 __VA_ARGS__ PMD_DRV_LOG_STRIP PMD_DRV_LOG_OPAREN, \ 101 PMD_DRV_LOG_CPAREN) 102 103 /* claim_zero() does not perform any check when debugging is disabled. */ 104 #ifndef NDEBUG 105 106 #define DEBUG(...) DRV_LOG(DEBUG, __VA_ARGS__) 107 #define claim_zero(...) assert((__VA_ARGS__) == 0) 108 #define claim_nonzero(...) assert((__VA_ARGS__) != 0) 109 110 #else /* NDEBUG */ 111 112 #define DEBUG(...) (void)0 113 #define claim_zero(...) (__VA_ARGS__) 114 #define claim_nonzero(...) (__VA_ARGS__) 115 116 #endif /* NDEBUG */ 117 118 #define INFO(...) DRV_LOG(INFO, __VA_ARGS__) 119 #define WARN(...) DRV_LOG(WARNING, __VA_ARGS__) 120 #define ERROR(...) DRV_LOG(ERR, __VA_ARGS__) 121 122 /* Convenience macros for accessing mbuf fields. */ 123 #define NEXT(m) ((m)->next) 124 #define DATA_LEN(m) ((m)->data_len) 125 #define PKT_LEN(m) ((m)->pkt_len) 126 #define DATA_OFF(m) ((m)->data_off) 127 #define SET_DATA_OFF(m, o) ((m)->data_off = (o)) 128 #define NB_SEGS(m) ((m)->nb_segs) 129 #define PORT(m) ((m)->port) 130 131 /* Transpose flags. Useful to convert IBV to DPDK flags. */ 132 #define TRANSPOSE(val, from, to) \ 133 (((from) >= (to)) ? \ 134 (((val) & (from)) / ((from) / (to))) : \ 135 (((val) & (from)) * ((to) / (from)))) 136 137 /* Allocate a buffer on the stack and fill it with a printf format string. */ 138 #define MKSTR(name, ...) \ 139 char name[snprintf(NULL, 0, __VA_ARGS__) + 1]; \ 140 \ 141 snprintf(name, sizeof(name), __VA_ARGS__) 142 143 /** 144 * Return nearest power of two above input value. 145 * 146 * @param v 147 * Input value. 148 * 149 * @return 150 * Nearest power of two above input value. 151 */ 152 static inline unsigned int 153 log2above(unsigned int v) 154 { 155 unsigned int l; 156 unsigned int r; 157 158 for (l = 0, r = 0; (v >> 1); ++l, v >>= 1) 159 r |= (v & 1); 160 return l + r; 161 } 162 163 #endif /* RTE_PMD_MLX5_UTILS_H_ */ 164