xref: /dpdk/drivers/net/mlx5/mlx5_utils.h (revision a170a30d22a8c34c36541d0dd6bcc2fcc4c9ee2f)
18fd92a66SOlivier Matz /* SPDX-License-Identifier: BSD-3-Clause
2771fa900SAdrien Mazarguil  * Copyright 2015 6WIND S.A.
3771fa900SAdrien Mazarguil  * Copyright 2015 Mellanox.
4771fa900SAdrien Mazarguil  */
5771fa900SAdrien Mazarguil 
6771fa900SAdrien Mazarguil #ifndef RTE_PMD_MLX5_UTILS_H_
7771fa900SAdrien Mazarguil #define RTE_PMD_MLX5_UTILS_H_
8771fa900SAdrien Mazarguil 
9771fa900SAdrien Mazarguil #include <stddef.h>
10b113cb5eSEdward Makarov #include <stdint.h>
11771fa900SAdrien Mazarguil #include <stdio.h>
12771fa900SAdrien Mazarguil #include <limits.h>
13771fa900SAdrien Mazarguil #include <assert.h>
14771fa900SAdrien Mazarguil #include <errno.h>
15771fa900SAdrien Mazarguil 
16771fa900SAdrien Mazarguil #include "mlx5_defs.h"
17771fa900SAdrien Mazarguil 
18771fa900SAdrien Mazarguil /* Bit-field manipulation. */
19771fa900SAdrien Mazarguil #define BITFIELD_DECLARE(bf, type, size) \
20771fa900SAdrien Mazarguil 	type bf[(((size_t)(size) / (sizeof(type) * CHAR_BIT)) + \
21771fa900SAdrien Mazarguil 		 !!((size_t)(size) % (sizeof(type) * CHAR_BIT)))]
22771fa900SAdrien Mazarguil #define BITFIELD_DEFINE(bf, type, size) \
23771fa900SAdrien Mazarguil 	BITFIELD_DECLARE((bf), type, (size)) = { 0 }
24771fa900SAdrien Mazarguil #define BITFIELD_SET(bf, b) \
25771fa900SAdrien Mazarguil 	(assert((size_t)(b) < (sizeof(bf) * CHAR_BIT)), \
26771fa900SAdrien Mazarguil 	 (void)((bf)[((b) / (sizeof((bf)[0]) * CHAR_BIT))] |= \
27771fa900SAdrien Mazarguil 		((size_t)1 << ((b) % (sizeof((bf)[0]) * CHAR_BIT)))))
28771fa900SAdrien Mazarguil #define BITFIELD_RESET(bf, b) \
29771fa900SAdrien Mazarguil 	(assert((size_t)(b) < (sizeof(bf) * CHAR_BIT)), \
30771fa900SAdrien Mazarguil 	 (void)((bf)[((b) / (sizeof((bf)[0]) * CHAR_BIT))] &= \
31771fa900SAdrien Mazarguil 		~((size_t)1 << ((b) % (sizeof((bf)[0]) * CHAR_BIT)))))
32771fa900SAdrien Mazarguil #define BITFIELD_ISSET(bf, b) \
33771fa900SAdrien Mazarguil 	(assert((size_t)(b) < (sizeof(bf) * CHAR_BIT)), \
34771fa900SAdrien Mazarguil 	 !!(((bf)[((b) / (sizeof((bf)[0]) * CHAR_BIT))] & \
35771fa900SAdrien Mazarguil 	     ((size_t)1 << ((b) % (sizeof((bf)[0]) * CHAR_BIT))))))
36771fa900SAdrien Mazarguil 
37b113cb5eSEdward Makarov /* Convert a bit number to the corresponding 64-bit mask */
38b113cb5eSEdward Makarov #define MLX5_BITSHIFT(v) (UINT64_C(1) << (v))
39b113cb5eSEdward Makarov 
40771fa900SAdrien Mazarguil /* Save and restore errno around argument evaluation. */
41771fa900SAdrien Mazarguil #define ERRNO_SAFE(x) ((errno = (int []){ errno, ((x), 0) }[0]))
42771fa900SAdrien Mazarguil 
43771fa900SAdrien Mazarguil /*
44771fa900SAdrien Mazarguil  * Helper macros to work around __VA_ARGS__ limitations in a C99 compliant
45771fa900SAdrien Mazarguil  * manner.
46771fa900SAdrien Mazarguil  */
47771fa900SAdrien Mazarguil #define PMD_DRV_LOG_STRIP(a, b) a
48771fa900SAdrien Mazarguil #define PMD_DRV_LOG_OPAREN (
49771fa900SAdrien Mazarguil #define PMD_DRV_LOG_CPAREN )
50771fa900SAdrien Mazarguil #define PMD_DRV_LOG_COMMA ,
51771fa900SAdrien Mazarguil 
52771fa900SAdrien Mazarguil /* Return the file name part of a path. */
53771fa900SAdrien Mazarguil static inline const char *
54771fa900SAdrien Mazarguil pmd_drv_log_basename(const char *s)
55771fa900SAdrien Mazarguil {
56771fa900SAdrien Mazarguil 	const char *n = s;
57771fa900SAdrien Mazarguil 
58771fa900SAdrien Mazarguil 	while (*n)
59771fa900SAdrien Mazarguil 		if (*(n++) == '/')
60771fa900SAdrien Mazarguil 			s = n;
61771fa900SAdrien Mazarguil 	return s;
62771fa900SAdrien Mazarguil }
63771fa900SAdrien Mazarguil 
64*a170a30dSNélio Laranjeiro extern int mlx5_logtype;
65*a170a30dSNélio Laranjeiro 
66*a170a30dSNélio Laranjeiro #define PMD_DRV_LOG___(level, ...) \
67*a170a30dSNélio Laranjeiro 	rte_log(RTE_LOG_ ## level, \
68*a170a30dSNélio Laranjeiro 		mlx5_logtype, \
69*a170a30dSNélio Laranjeiro 		RTE_FMT(MLX5_DRIVER_NAME ": " \
70*a170a30dSNélio Laranjeiro 			RTE_FMT_HEAD(__VA_ARGS__,), \
71*a170a30dSNélio Laranjeiro 		RTE_FMT_TAIL(__VA_ARGS__,)))
72*a170a30dSNélio Laranjeiro 
73771fa900SAdrien Mazarguil /*
74771fa900SAdrien Mazarguil  * When debugging is enabled (NDEBUG not defined), file, line and function
75771fa900SAdrien Mazarguil  * information replace the driver name (MLX5_DRIVER_NAME) in log messages.
76771fa900SAdrien Mazarguil  */
77771fa900SAdrien Mazarguil #ifndef NDEBUG
78771fa900SAdrien Mazarguil 
79771fa900SAdrien Mazarguil #define PMD_DRV_LOG__(level, ...) \
80771fa900SAdrien Mazarguil 	PMD_DRV_LOG___(level, "%s:%u: %s(): " __VA_ARGS__)
81771fa900SAdrien Mazarguil #define PMD_DRV_LOG_(level, s, ...) \
82771fa900SAdrien Mazarguil 	PMD_DRV_LOG__(level, \
83771fa900SAdrien Mazarguil 		s "\n" PMD_DRV_LOG_COMMA \
84771fa900SAdrien Mazarguil 		pmd_drv_log_basename(__FILE__) PMD_DRV_LOG_COMMA \
85771fa900SAdrien Mazarguil 		__LINE__ PMD_DRV_LOG_COMMA \
86771fa900SAdrien Mazarguil 		__func__, \
87771fa900SAdrien Mazarguil 		__VA_ARGS__)
88771fa900SAdrien Mazarguil 
89771fa900SAdrien Mazarguil #else /* NDEBUG */
90771fa900SAdrien Mazarguil #define PMD_DRV_LOG__(level, ...) \
91771fa900SAdrien Mazarguil 	PMD_DRV_LOG___(level, __VA_ARGS__)
92771fa900SAdrien Mazarguil #define PMD_DRV_LOG_(level, s, ...) \
93771fa900SAdrien Mazarguil 	PMD_DRV_LOG__(level, s "\n", __VA_ARGS__)
94771fa900SAdrien Mazarguil 
95771fa900SAdrien Mazarguil #endif /* NDEBUG */
96771fa900SAdrien Mazarguil 
97771fa900SAdrien Mazarguil /* Generic printf()-like logging macro with automatic line feed. */
98*a170a30dSNélio Laranjeiro #define DRV_LOG(level, ...) \
99771fa900SAdrien Mazarguil 	PMD_DRV_LOG_(level, \
100771fa900SAdrien Mazarguil 		__VA_ARGS__ PMD_DRV_LOG_STRIP PMD_DRV_LOG_OPAREN, \
101771fa900SAdrien Mazarguil 		PMD_DRV_LOG_CPAREN)
102771fa900SAdrien Mazarguil 
103*a170a30dSNélio Laranjeiro /* claim_zero() does not perform any check when debugging is disabled. */
104771fa900SAdrien Mazarguil #ifndef NDEBUG
105771fa900SAdrien Mazarguil 
106771fa900SAdrien Mazarguil #define claim_zero(...) assert((__VA_ARGS__) == 0)
1074c7a0f5fSNélio Laranjeiro #define claim_nonzero(...) assert((__VA_ARGS__) != 0)
108771fa900SAdrien Mazarguil 
109771fa900SAdrien Mazarguil #else /* NDEBUG */
110771fa900SAdrien Mazarguil 
111771fa900SAdrien Mazarguil #define claim_zero(...) (__VA_ARGS__)
1124c7a0f5fSNélio Laranjeiro #define claim_nonzero(...) (__VA_ARGS__)
113771fa900SAdrien Mazarguil 
114771fa900SAdrien Mazarguil #endif /* NDEBUG */
115771fa900SAdrien Mazarguil 
1162e22920bSAdrien Mazarguil /* Convenience macros for accessing mbuf fields. */
1172e22920bSAdrien Mazarguil #define NEXT(m) ((m)->next)
1182e22920bSAdrien Mazarguil #define DATA_LEN(m) ((m)->data_len)
1192e22920bSAdrien Mazarguil #define PKT_LEN(m) ((m)->pkt_len)
1202e22920bSAdrien Mazarguil #define DATA_OFF(m) ((m)->data_off)
1212e22920bSAdrien Mazarguil #define SET_DATA_OFF(m, o) ((m)->data_off = (o))
1222e22920bSAdrien Mazarguil #define NB_SEGS(m) ((m)->nb_segs)
1232e22920bSAdrien Mazarguil #define PORT(m) ((m)->port)
1242e22920bSAdrien Mazarguil 
12567fa62bcSAdrien Mazarguil /* Transpose flags. Useful to convert IBV to DPDK flags. */
12667fa62bcSAdrien Mazarguil #define TRANSPOSE(val, from, to) \
12767fa62bcSAdrien Mazarguil 	(((from) >= (to)) ? \
12867fa62bcSAdrien Mazarguil 	 (((val) & (from)) / ((from) / (to))) : \
12967fa62bcSAdrien Mazarguil 	 (((val) & (from)) * ((to) / (from))))
13067fa62bcSAdrien Mazarguil 
131771fa900SAdrien Mazarguil /* Allocate a buffer on the stack and fill it with a printf format string. */
132771fa900SAdrien Mazarguil #define MKSTR(name, ...) \
133771fa900SAdrien Mazarguil 	char name[snprintf(NULL, 0, __VA_ARGS__) + 1]; \
134771fa900SAdrien Mazarguil 	\
135771fa900SAdrien Mazarguil 	snprintf(name, sizeof(name), __VA_ARGS__)
136771fa900SAdrien Mazarguil 
137634efbc2SNelio Laranjeiro /**
138634efbc2SNelio Laranjeiro  * Return nearest power of two above input value.
139634efbc2SNelio Laranjeiro  *
140634efbc2SNelio Laranjeiro  * @param v
141634efbc2SNelio Laranjeiro  *   Input value.
142634efbc2SNelio Laranjeiro  *
143634efbc2SNelio Laranjeiro  * @return
144634efbc2SNelio Laranjeiro  *   Nearest power of two above input value.
145634efbc2SNelio Laranjeiro  */
146634efbc2SNelio Laranjeiro static inline unsigned int
147634efbc2SNelio Laranjeiro log2above(unsigned int v)
148634efbc2SNelio Laranjeiro {
149634efbc2SNelio Laranjeiro 	unsigned int l;
150634efbc2SNelio Laranjeiro 	unsigned int r;
151634efbc2SNelio Laranjeiro 
152634efbc2SNelio Laranjeiro 	for (l = 0, r = 0; (v >> 1); ++l, v >>= 1)
153634efbc2SNelio Laranjeiro 		r |= (v & 1);
154693f715dSHuawei Xie 	return l + r;
155634efbc2SNelio Laranjeiro }
156634efbc2SNelio Laranjeiro 
157771fa900SAdrien Mazarguil #endif /* RTE_PMD_MLX5_UTILS_H_ */
158