mlx4: Implement QP paravirtualization and maintain phys_pkey_cache for smp_snoop
[cascardo/linux.git] / include / linux / mlx4 / device.h
index bd6c9fc..9803fd5 100644 (file)
@@ -54,7 +54,8 @@ enum {
 };
 
 enum {
-       MLX4_MAX_PORTS          = 2
+       MLX4_MAX_PORTS          = 2,
+       MLX4_MAX_PORT_PKEYS     = 128
 };
 
 /* base qkey for use in sriov tunnel-qp/proxy-qp communication.
@@ -389,6 +390,7 @@ struct mlx4_caps {
        enum mlx4_port_type     possible_type[MLX4_MAX_PORTS + 1];
        u32                     max_counters;
        u8                      port_ib_mtu[MLX4_MAX_PORTS + 1];
+       u16                     sqp_demux;
 };
 
 struct mlx4_buf_list {
@@ -692,7 +694,18 @@ static inline int mlx4_is_master(struct mlx4_dev *dev)
 
 static inline int mlx4_is_qp_reserved(struct mlx4_dev *dev, u32 qpn)
 {
-       return (qpn < dev->caps.sqp_start + 8);
+       return (qpn < dev->caps.base_sqpn + 8 +
+               16 * MLX4_MFUNC_MAX * !!mlx4_is_master(dev));
+}
+
+static inline int mlx4_is_guest_proxy(struct mlx4_dev *dev, int slave, u32 qpn)
+{
+       int base = dev->caps.sqp_start + slave * 8;
+
+       if (qpn >= base && qpn < base + 8)
+               return 1;
+
+       return 0;
 }
 
 static inline int mlx4_is_mfunc(struct mlx4_dev *dev)
@@ -796,6 +809,19 @@ enum mlx4_net_trans_rule_id {
        MLX4_NET_TRANS_RULE_NUM, /* should be last */
 };
 
+extern const u16 __sw_id_hw[];
+
+static inline int map_hw_to_sw_id(u16 header_id)
+{
+
+       int i;
+       for (i = 0; i < MLX4_NET_TRANS_RULE_NUM; i++) {
+               if (header_id == __sw_id_hw[i])
+                       return i;
+       }
+       return -EINVAL;
+}
+
 enum mlx4_net_trans_promisc_mode {
        MLX4_FS_PROMISC_NONE = 0,
        MLX4_FS_PROMISC_UPLINK,
@@ -914,6 +940,9 @@ int mlx4_flow_attach(struct mlx4_dev *dev,
                     struct mlx4_net_trans_rule *rule, u64 *reg_id);
 int mlx4_flow_detach(struct mlx4_dev *dev, u64 reg_id);
 
+void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port,
+                         int i, int val);
+
 int mlx4_get_parav_qkey(struct mlx4_dev *dev, u32 qpn, u32 *qkey);
 
 #endif /* MLX4_DEVICE_H */