net/mlx5_core: Use hardware registers description header file
Add an auto generated header file that describes hardware registers along with set of macros that set/get values. The macros do static checks to avoid overflow, handle endianess, and overall provide a clean way to code commands. Currently the header file is small and we will add structs as we make use of the macros. A few commands were removed from the commands enum since they are not supported currently and will be added when support is available. Signed-off-by: Eli Cohen <eli@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c7a08ac7ee
commit
d29b796ada
5 changed files with 188 additions and 114 deletions
|
@ -44,6 +44,50 @@
|
|||
#error Host endianness not defined
|
||||
#endif
|
||||
|
||||
/* helper macros */
|
||||
#define __mlx5_nullp(typ) ((struct mlx5_ifc_##typ##_bits *)0)
|
||||
#define __mlx5_bit_sz(typ, fld) sizeof(__mlx5_nullp(typ)->fld)
|
||||
#define __mlx5_bit_off(typ, fld) ((unsigned)(unsigned long)(&(__mlx5_nullp(typ)->fld)))
|
||||
#define __mlx5_dw_off(typ, fld) (__mlx5_bit_off(typ, fld) / 32)
|
||||
#define __mlx5_64_off(typ, fld) (__mlx5_bit_off(typ, fld) / 64)
|
||||
#define __mlx5_dw_bit_off(typ, fld) (32 - __mlx5_bit_sz(typ, fld) - (__mlx5_bit_off(typ, fld) & 0x1f))
|
||||
#define __mlx5_mask(typ, fld) ((u32)((1ull << __mlx5_bit_sz(typ, fld)) - 1))
|
||||
#define __mlx5_dw_mask(typ, fld) (__mlx5_mask(typ, fld) << __mlx5_dw_bit_off(typ, fld))
|
||||
#define __mlx5_st_sz_bits(typ) sizeof(struct mlx5_ifc_##typ##_bits)
|
||||
|
||||
#define MLX5_FLD_SZ_BYTES(typ, fld) (__mlx5_bit_sz(typ, fld) / 8)
|
||||
#define MLX5_ST_SZ_BYTES(typ) (sizeof(struct mlx5_ifc_##typ##_bits) / 8)
|
||||
#define MLX5_ST_SZ_DW(typ) (sizeof(struct mlx5_ifc_##typ##_bits) / 32)
|
||||
#define MLX5_BYTE_OFF(typ, fld) (__mlx5_bit_off(typ, fld) / 8)
|
||||
#define MLX5_ADDR_OF(typ, p, fld) ((char *)(p) + MLX5_BYTE_OFF(typ, fld))
|
||||
|
||||
/* insert a value to a struct */
|
||||
#define MLX5_SET(typ, p, fld, v) do { \
|
||||
BUILD_BUG_ON(__mlx5_st_sz_bits(typ) % 32); \
|
||||
*((__be32 *)(p) + __mlx5_dw_off(typ, fld)) = \
|
||||
cpu_to_be32((be32_to_cpu(*((__be32 *)(p) + __mlx5_dw_off(typ, fld))) & \
|
||||
(~__mlx5_dw_mask(typ, fld))) | (((v) & __mlx5_mask(typ, fld)) \
|
||||
<< __mlx5_dw_bit_off(typ, fld))); \
|
||||
} while (0)
|
||||
|
||||
#define MLX5_GET(typ, p, fld) ((be32_to_cpu(*((__be32 *)(p) +\
|
||||
__mlx5_dw_off(typ, fld))) >> __mlx5_dw_bit_off(typ, fld)) & \
|
||||
__mlx5_mask(typ, fld))
|
||||
|
||||
#define MLX5_GET_PR(typ, p, fld) ({ \
|
||||
u32 ___t = MLX5_GET(typ, p, fld); \
|
||||
pr_debug(#fld " = 0x%x\n", ___t); \
|
||||
___t; \
|
||||
})
|
||||
|
||||
#define MLX5_SET64(typ, p, fld, v) do { \
|
||||
BUILD_BUG_ON(__mlx5_bit_sz(typ, fld) != 64); \
|
||||
BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \
|
||||
*((__be64 *)(p) + __mlx5_64_off(typ, fld)) = cpu_to_be64(v); \
|
||||
} while (0)
|
||||
|
||||
#define MLX5_GET64(typ, p, fld) be64_to_cpu(*((__be64 *)(p) + __mlx5_64_off(typ, fld)))
|
||||
|
||||
enum {
|
||||
MLX5_MAX_COMMANDS = 32,
|
||||
MLX5_CMD_DATA_BLOCK_SIZE = 512,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue