182092c87SOlivier Matz /* SPDX-License-Identifier: BSD-3-Clause 276df01ffSAdrien Mazarguil * Copyright 2017 6WIND S.A. 35feecc57SShahaf Shuler * Copyright 2017 Mellanox Technologies, Ltd 476df01ffSAdrien Mazarguil */ 576df01ffSAdrien Mazarguil 676df01ffSAdrien Mazarguil #ifndef MLX4_UTILS_H_ 776df01ffSAdrien Mazarguil #define MLX4_UTILS_H_ 876df01ffSAdrien Mazarguil 961cbdd41SAdrien Mazarguil #include <stddef.h> 1061cbdd41SAdrien Mazarguil #include <stdio.h> 1161cbdd41SAdrien Mazarguil 1276df01ffSAdrien Mazarguil #include <rte_common.h> 1376df01ffSAdrien Mazarguil #include <rte_log.h> 1476df01ffSAdrien Mazarguil 1576df01ffSAdrien Mazarguil #include "mlx4.h" 1676df01ffSAdrien Mazarguil 17ceadf1a4SChristian Ehrhardt /* 18ceadf1a4SChristian Ehrhardt * Compilation workaround for PPC64 when AltiVec is fully enabled, e.g. std=c11. 19ceadf1a4SChristian Ehrhardt * Otherwise there would be a type conflict between stdbool and altivec. 20ceadf1a4SChristian Ehrhardt */ 21ceadf1a4SChristian Ehrhardt #if defined(__PPC64__) && !defined(__APPLE_ALTIVEC__) 22ceadf1a4SChristian Ehrhardt #undef bool 23ceadf1a4SChristian Ehrhardt /* redefine as in stdbool.h */ 24ceadf1a4SChristian Ehrhardt #define bool _Bool 25ceadf1a4SChristian Ehrhardt #endif 26ceadf1a4SChristian Ehrhardt 2711a34bf2SStephen Hemminger extern int mlx4_logtype; 28*2b843cacSDavid Marchand #define RTE_LOGTYPE_MLX4 mlx4_logtype 2911a34bf2SStephen Hemminger 30e99fdaa7SAlexander Kozyrev #ifdef RTE_LIBRTE_MLX4_DEBUG 3176df01ffSAdrien Mazarguil 3276df01ffSAdrien Mazarguil /* 33e99fdaa7SAlexander Kozyrev * When debugging is enabled (MLX4_DEBUG is defined), file, line and function 3476df01ffSAdrien Mazarguil * information replace the driver name (MLX4_DRIVER_NAME) in log messages. 3576df01ffSAdrien Mazarguil */ 3676df01ffSAdrien Mazarguil 37ed0cc677SAdrien Mazarguil /** Return the file name part of a path. */ 3876df01ffSAdrien Mazarguil static inline const char * 3976df01ffSAdrien Mazarguil pmd_drv_log_basename(const char *s) 4076df01ffSAdrien Mazarguil { 4176df01ffSAdrien Mazarguil const char *n = s; 4276df01ffSAdrien Mazarguil 4376df01ffSAdrien Mazarguil while (*n) 4476df01ffSAdrien Mazarguil if (*(n++) == '/') 4576df01ffSAdrien Mazarguil s = n; 4676df01ffSAdrien Mazarguil return s; 4776df01ffSAdrien Mazarguil } 4876df01ffSAdrien Mazarguil 4976df01ffSAdrien Mazarguil #define PMD_DRV_LOG(level, ...) \ 50*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(level, MLX4, "%s:%u: %s(): ", \ 51*2b843cacSDavid Marchand pmd_drv_log_basename(__FILE__) RTE_LOG_COMMA __LINE__ RTE_LOG_COMMA __func__, \ 52*2b843cacSDavid Marchand __VA_ARGS__) 538e08df22SAlexander Kozyrev #define MLX4_ASSERT(exp) RTE_VERIFY(exp) 548e08df22SAlexander Kozyrev #define claim_zero(...) MLX4_ASSERT((__VA_ARGS__) == 0) 5576df01ffSAdrien Mazarguil 56e99fdaa7SAlexander Kozyrev #else /* RTE_LIBRTE_MLX4_DEBUG */ 5776df01ffSAdrien Mazarguil 5876df01ffSAdrien Mazarguil /* 597bc56bd0SThomas Monjalon * Like MLX4_ASSERT(), claim_zero() does not perform 6076df01ffSAdrien Mazarguil * any check when debugging is disabled. 6176df01ffSAdrien Mazarguil */ 6276df01ffSAdrien Mazarguil 6376df01ffSAdrien Mazarguil #define PMD_DRV_LOG(level, ...) \ 64*2b843cacSDavid Marchand RTE_LOG_LINE(level, MLX4, MLX4_DRIVER_NAME ": " __VA_ARGS__) 658e08df22SAlexander Kozyrev #define MLX4_ASSERT(exp) RTE_ASSERT(exp) 6676df01ffSAdrien Mazarguil #define claim_zero(...) (__VA_ARGS__) 6776df01ffSAdrien Mazarguil 68e99fdaa7SAlexander Kozyrev #endif /* RTE_LIBRTE_MLX4_DEBUG */ 6976df01ffSAdrien Mazarguil 707bc56bd0SThomas Monjalon #define DEBUG(...) PMD_DRV_LOG(DEBUG, __VA_ARGS__) 7176df01ffSAdrien Mazarguil #define INFO(...) PMD_DRV_LOG(INFO, __VA_ARGS__) 7276df01ffSAdrien Mazarguil #define WARN(...) PMD_DRV_LOG(WARNING, __VA_ARGS__) 7376df01ffSAdrien Mazarguil #define ERROR(...) PMD_DRV_LOG(ERR, __VA_ARGS__) 7476df01ffSAdrien Mazarguil 75ed0cc677SAdrien Mazarguil /** Allocate a buffer on the stack and fill it with a printf format string. */ 7661cbdd41SAdrien Mazarguil #define MKSTR(name, ...) \ 77c3e89f69SAli Alnubani int mkstr_size_##name = snprintf(NULL, 0, "" __VA_ARGS__); \ 78c3e89f69SAli Alnubani char name[mkstr_size_##name + 1]; \ 7961cbdd41SAdrien Mazarguil \ 80c3e89f69SAli Alnubani snprintf(name, sizeof(name), "" __VA_ARGS__) 8161cbdd41SAdrien Mazarguil 82a5171594SAdrien Mazarguil /** Generate a string out of the provided arguments. */ 83a5171594SAdrien Mazarguil #define MLX4_STR(...) # __VA_ARGS__ 84a5171594SAdrien Mazarguil 85a5171594SAdrien Mazarguil /** Similar to MLX4_STR() with enclosed macros expanded first. */ 86a5171594SAdrien Mazarguil #define MLX4_STR_EXPAND(...) MLX4_STR(__VA_ARGS__) 87a5171594SAdrien Mazarguil 88f1c9ac9fSAdrien Mazarguil /** Object description used with mlx4_mallocv() and similar functions. */ 89f1c9ac9fSAdrien Mazarguil struct mlx4_malloc_vec { 90f1c9ac9fSAdrien Mazarguil size_t align; /**< Alignment constraint (power of 2), 0 if unknown. */ 91f1c9ac9fSAdrien Mazarguil size_t size; /**< Object size. */ 92f1c9ac9fSAdrien Mazarguil void **addr; /**< Storage for allocation address. */ 93f1c9ac9fSAdrien Mazarguil }; 94f1c9ac9fSAdrien Mazarguil 9535d02c54SAdrien Mazarguil /* mlx4_utils.c */ 9635d02c54SAdrien Mazarguil 9735d02c54SAdrien Mazarguil int mlx4_fd_set_non_blocking(int fd); 98f1c9ac9fSAdrien Mazarguil size_t mlx4_mallocv(const char *type, const struct mlx4_malloc_vec *vec, 99f1c9ac9fSAdrien Mazarguil unsigned int cnt); 100f1c9ac9fSAdrien Mazarguil size_t mlx4_zmallocv(const char *type, const struct mlx4_malloc_vec *vec, 101f1c9ac9fSAdrien Mazarguil unsigned int cnt); 102f1c9ac9fSAdrien Mazarguil size_t mlx4_mallocv_socket(const char *type, const struct mlx4_malloc_vec *vec, 103f1c9ac9fSAdrien Mazarguil unsigned int cnt, int socket); 104f1c9ac9fSAdrien Mazarguil size_t mlx4_zmallocv_socket(const char *type, const struct mlx4_malloc_vec *vec, 105f1c9ac9fSAdrien Mazarguil unsigned int cnt, int socket); 10635d02c54SAdrien Mazarguil 10776df01ffSAdrien Mazarguil #endif /* MLX4_UTILS_H_ */ 108