Merge tag 'rtc-5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlx5 / core / lib / hv_vhca.h
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
96 static inline int
97 mlx5_hv_vhca_write_agent(struct mlx5_hv_vhca_agent *agent,
98                          void *buf, int len)
99 {
100         return 0;
101 }
102 #endif
103
104 #endif /* __LIB_HV_VHCA_H__ */