aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/mlx4.h
diff options
context:
space:
mode:
authorEli Cohen <eli@mellanox.co.il>2011-12-12 23:15:24 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-13 13:56:07 -0500
commitc82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6 (patch)
treed19f8112999c2a587bd33d68dd52653a95c1c6e9 /drivers/net/ethernet/mellanox/mlx4/mlx4.h
parentacba2420f9d20082b17d0cbeb1137fcffe0f5b7e (diff)
mlx4_core: resource tracking for HCA resources used by guests
The resource tracker is used to track usage of HCA resources by the different guests. Virtual functions (VFs) are attached to guest operating systems but resources are allocated from the same pool and are assigned to VFs. It is essential that hostile/buggy guests not be able to affect the operation of other VFs, possibly attached to other guest OSs since ConnectX firmware is not tolerant to misuse of resources. The resource tracker module associates each resource with a VF and maintains state information for the allocated object. It also defines allowed state transitions and enforces them. Relationships between resources are also referred to. For example, CQs are pointed to by QPs, so it is forbidden to destroy a CQ if a QP refers to it. ICM memory is always accessible through the primary function and hence it is allocated by the owner of the primary function. When a guest dies, an FLR is generated for all the VFs it owns and all the resources it used are freed. The tracked resource types are: QPs, CQs, SRQs, MPTs, MTTs, MACs, RES_EQs, and XRCDNs. Signed-off-by: Eli Cohen <eli@mellanox.co.il> Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/mlx4.h')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index 23701a25daa9..2488be8bb02a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -224,6 +224,91 @@ struct mlx4_icm_table {
224 struct mlx4_icm **icm; 224 struct mlx4_icm **icm;
225}; 225};
226 226
227/*
228 * Must be packed because mtt_seg is 64 bits but only aligned to 32 bits.
229 */
230struct mlx4_mpt_entry {
231 __be32 flags;
232 __be32 qpn;
233 __be32 key;
234 __be32 pd_flags;
235 __be64 start;
236 __be64 length;
237 __be32 lkey;
238 __be32 win_cnt;
239 u8 reserved1[3];
240 u8 mtt_rep;
241 __be64 mtt_seg;
242 __be32 mtt_sz;
243 __be32 entity_size;
244 __be32 first_byte_offset;
245} __packed;
246
247/*
248 * Must be packed because start is 64 bits but only aligned to 32 bits.
249 */
250struct mlx4_eq_context {
251 __be32 flags;
252 u16 reserved1[3];
253 __be16 page_offset;
254 u8 log_eq_size;
255 u8 reserved2[4];
256 u8 eq_period;
257 u8 reserved3;
258 u8 eq_max_count;
259 u8 reserved4[3];
260 u8 intr;
261 u8 log_page_size;
262 u8 reserved5[2];
263 u8 mtt_base_addr_h;
264 __be32 mtt_base_addr_l;
265 u32 reserved6[2];
266 __be32 consumer_index;
267 __be32 producer_index;
268 u32 reserved7[4];
269};
270
271struct mlx4_cq_context {
272 __be32 flags;
273 u16 reserved1[3];
274 __be16 page_offset;
275 __be32 logsize_usrpage;
276 __be16 cq_period;
277 __be16 cq_max_count;
278 u8 reserved2[3];
279 u8 comp_eqn;
280 u8 log_page_size;
281 u8 reserved3[2];
282 u8 mtt_base_addr_h;
283 __be32 mtt_base_addr_l;
284 __be32 last_notified_index;
285 __be32 solicit_producer_index;
286 __be32 consumer_index;
287 __be32 producer_index;
288 u32 reserved4[2];
289 __be64 db_rec_addr;
290};
291
292struct mlx4_srq_context {
293 __be32 state_logsize_srqn;
294 u8 logstride;
295 u8 reserved1;
296 __be16 xrcd;
297 __be32 pg_offset_cqn;
298 u32 reserved2;
299 u8 log_page_size;
300 u8 reserved3[2];
301 u8 mtt_base_addr_h;
302 __be32 mtt_base_addr_l;
303 __be32 pd;
304 __be16 limit_watermark;
305 __be16 wqe_cnt;
306 u16 reserved4;
307 __be16 wqe_counter;
308 u32 reserved5;
309 __be64 db_rec_addr;
310};
311
227struct mlx4_eqe { 312struct mlx4_eqe {
228 u8 reserved1; 313 u8 reserved1;
229 u8 type; 314 u8 type;
@@ -657,6 +742,18 @@ void mlx4_cleanup_cq_table(struct mlx4_dev *dev);
657void mlx4_cleanup_qp_table(struct mlx4_dev *dev); 742void mlx4_cleanup_qp_table(struct mlx4_dev *dev);
658void mlx4_cleanup_srq_table(struct mlx4_dev *dev); 743void mlx4_cleanup_srq_table(struct mlx4_dev *dev);
659void mlx4_cleanup_mcg_table(struct mlx4_dev *dev); 744void mlx4_cleanup_mcg_table(struct mlx4_dev *dev);
745int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn);
746void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn);
747int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn);
748void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn);
749int __mlx4_srq_alloc_icm(struct mlx4_dev *dev, int *srqn);
750void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn);
751int __mlx4_mr_reserve(struct mlx4_dev *dev);
752void __mlx4_mr_release(struct mlx4_dev *dev, u32 index);
753int __mlx4_mr_alloc_icm(struct mlx4_dev *dev, u32 index);
754void __mlx4_mr_free_icm(struct mlx4_dev *dev, u32 index);
755u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order);
756void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order);
660 757
661int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave, 758int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave,
662 struct mlx4_vhcr *vhcr, 759 struct mlx4_vhcr *vhcr,
@@ -693,6 +790,14 @@ int mlx4_DMA_wrapper(struct mlx4_dev *dev, int slave,
693 struct mlx4_cmd_mailbox *inbox, 790 struct mlx4_cmd_mailbox *inbox,
694 struct mlx4_cmd_mailbox *outbox, 791 struct mlx4_cmd_mailbox *outbox,
695 struct mlx4_cmd_info *cmd); 792 struct mlx4_cmd_info *cmd);
793int __mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align,
794 int *base);
795void __mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
796int __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac);
797void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac);
798int __mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac);
799int __mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
800 int start_index, int npages, u64 *page_list);
696 801
697void mlx4_start_catas_poll(struct mlx4_dev *dev); 802void mlx4_start_catas_poll(struct mlx4_dev *dev);
698void mlx4_stop_catas_poll(struct mlx4_dev *dev); 803void mlx4_stop_catas_poll(struct mlx4_dev *dev);
@@ -936,6 +1041,11 @@ static inline u32 get_param_h(u64 *arg)
936 return (u32)(*arg >> 32); 1041 return (u32)(*arg >> 32);
937} 1042}
938 1043
1044static inline spinlock_t *mlx4_tlock(struct mlx4_dev *dev)
1045{
1046 return &mlx4_priv(dev)->mfunc.master.res_tracker.lock;
1047}
1048
939#define NOT_MASKED_PD_BITS 17 1049#define NOT_MASKED_PD_BITS 17
940 1050
941#endif /* MLX4_H */ 1051#endif /* MLX4_H */