1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2 /* Copyright (c) 2019 Mellanox Technologies. */ 3 4 #ifndef __LIB_HV_VHCA_H__ 5 #define __LIB_HV_VHCA_H__ 6 7 #include "en.h" 8 #include "lib/hv.h" 9 10 struct mlx5_hv_vhca_agent; 11 struct mlx5_hv_vhca; 12 struct mlx5_hv_vhca_control_block; 13 14 enum mlx5_hv_vhca_agent_type { 15 MLX5_HV_VHCA_AGENT_CONTROL = 0, 16 MLX5_HV_VHCA_AGENT_STATS = 1, 17 MLX5_HV_VHCA_AGENT_MAX = 32, 18 }; 19 20 #if IS_ENABLED(CONFIG_PCI_HYPERV_INTERFACE) 21 22 struct mlx5_hv_vhca_control_block { 23 u32 capabilities; 24 u32 control; 25 u16 command; 26 u16 command_ack; 27 u16 version; 28 u16 rings; 29 u32 reserved1[28]; 30 }; 31 32 struct mlx5_hv_vhca *mlx5_hv_vhca_create(struct mlx5_core_dev *dev); 33 void mlx5_hv_vhca_destroy(struct mlx5_hv_vhca *hv_vhca); 34 int mlx5_hv_vhca_init(struct mlx5_hv_vhca *hv_vhca); 35 void mlx5_hv_vhca_cleanup(struct mlx5_hv_vhca *hv_vhca); 36 void mlx5_hv_vhca_invalidate(void *context, u64 block_mask); 37 38 struct mlx5_hv_vhca_agent * 39 mlx5_hv_vhca_agent_create(struct mlx5_hv_vhca *hv_vhca, 40 enum mlx5_hv_vhca_agent_type type, 41 void (*control)(struct mlx5_hv_vhca_agent*, 42 struct mlx5_hv_vhca_control_block *block), 43 void (*invalidate)(struct mlx5_hv_vhca_agent*, 44 u64 block_mask), 45 void (*cleanup)(struct mlx5_hv_vhca_agent *agent), 46 void *context); 47 48 void mlx5_hv_vhca_agent_destroy(struct mlx5_hv_vhca_agent *agent); 49 int mlx5_hv_vhca_agent_write(struct mlx5_hv_vhca_agent *agent, 50 void *buf, int len); 51 void *mlx5_hv_vhca_agent_priv(struct mlx5_hv_vhca_agent *agent); 52 53 #else 54 55 static inline struct mlx5_hv_vhca * 56 mlx5_hv_vhca_create(struct mlx5_core_dev *dev) 57 { 58 return NULL; 59 } 60 61 static inline void mlx5_hv_vhca_destroy(struct mlx5_hv_vhca *hv_vhca) 62 { 63 } 64 65 static inline int mlx5_hv_vhca_init(struct mlx5_hv_vhca *hv_vhca) 66 { 67 return 0; 68 } 69 70 static inline void mlx5_hv_vhca_cleanup(struct mlx5_hv_vhca *hv_vhca) 71 { 72 } 73 74 static inline void mlx5_hv_vhca_invalidate(void *context, 75 u64 block_mask) 76 { 77 } 78 79 static inline struct mlx5_hv_vhca_agent * 80 mlx5_hv_vhca_agent_create(struct mlx5_hv_vhca *hv_vhca, 81 enum mlx5_hv_vhca_agent_type type, 82 void (*control)(struct mlx5_hv_vhca_agent*, 83 struct mlx5_hv_vhca_control_block *block), 84 void (*invalidate)(struct mlx5_hv_vhca_agent*, 85 u64 block_mask), 86 void (*cleanup)(struct mlx5_hv_vhca_agent *agent), 87 void *context) 88 { 89 return NULL; 90 } 91 92 static inline void mlx5_hv_vhca_agent_destroy(struct mlx5_hv_vhca_agent *agent) 93 { 94 } 95 #endif 96 97 #endif /* __LIB_HV_VHCA_H__ */ 98