/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* Copyright (c) 2019 Mellanox Technologies. */ #ifndef __LIB_HV_VHCA_H__ #define __LIB_HV_VHCA_H__ #include "en.h" #include "lib/hv.h" struct mlx5_hv_vhca_agent; struct mlx5_hv_vhca; struct mlx5_hv_vhca_control_block; enum mlx5_hv_vhca_agent_type { MLX5_HV_VHCA_AGENT_CONTROL = 0, MLX5_HV_VHCA_AGENT_STATS = 1, MLX5_HV_VHCA_AGENT_MAX = 32, }; #if IS_ENABLED(CONFIG_PCI_HYPERV_INTERFACE) struct mlx5_hv_vhca_control_block { u32 capabilities; u32 control; u16 command; u16 command_ack; u16 version; u16 rings; u32 reserved1[28]; }; struct mlx5_hv_vhca *mlx5_hv_vhca_create(struct mlx5_core_dev *dev); void mlx5_hv_vhca_destroy(struct mlx5_hv_vhca *hv_vhca); int mlx5_hv_vhca_init(struct mlx5_hv_vhca *hv_vhca); void mlx5_hv_vhca_cleanup(struct mlx5_hv_vhca *hv_vhca); void mlx5_hv_vhca_invalidate(void *context, u64 block_mask); struct mlx5_hv_vhca_agent * mlx5_hv_vhca_agent_create(struct mlx5_hv_vhca *hv_vhca, enum mlx5_hv_vhca_agent_type type, void (*control)(struct mlx5_hv_vhca_agent*, struct mlx5_hv_vhca_control_block *block), void (*invalidate)(struct mlx5_hv_vhca_agent*, u64 block_mask), void (*cleanup)(struct mlx5_hv_vhca_agent *agent), void *context); void mlx5_hv_vhca_agent_destroy(struct mlx5_hv_vhca_agent *agent); int mlx5_hv_vhca_agent_write(struct mlx5_hv_vhca_agent *agent, void *buf, int len); void *mlx5_hv_vhca_agent_priv(struct mlx5_hv_vhca_agent *agent); #else static inline struct mlx5_hv_vhca * mlx5_hv_vhca_create(struct mlx5_core_dev *dev) { return NULL; } static inline void mlx5_hv_vhca_destroy(struct mlx5_hv_vhca *hv_vhca) { } static inline int mlx5_hv_vhca_init(struct mlx5_hv_vhca *hv_vhca) { return 0; } static inline void mlx5_hv_vhca_cleanup(struct mlx5_hv_vhca *hv_vhca) { } static inline void mlx5_hv_vhca_invalidate(void *context, u64 block_mask) { } static inline struct mlx5_hv_vhca_agent * mlx5_hv_vhca_agent_create(struct mlx5_hv_vhca *hv_vhca, enum mlx5_hv_vhca_agent_type type, void (*control)(struct mlx5_hv_vhca_agent*, struct mlx5_hv_vhca_control_block *block), void (*invalidate)(struct mlx5_hv_vhca_agent*, u64 block_mask), void (*cleanup)(struct mlx5_hv_vhca_agent *agent), void *context) { return NULL; } static inline void mlx5_hv_vhca_agent_destroy(struct mlx5_hv_vhca_agent *agent) { } static inline int mlx5_hv_vhca_write_agent(struct mlx5_hv_vhca_agent *agent, void *buf, int len) { return 0; } #endif #endif /* __LIB_HV_VHCA_H__ */