Merge tag 'docs-for-linus' of git://git.lwn.net/linux-2.6
[cascardo/linux.git] / drivers / net / ethernet / mellanox / mlx4 / mlx4.h
index f8fc7bd..bdd4eea 100644 (file)
@@ -43,6 +43,8 @@
 #include <linux/timer.h>
 #include <linux/semaphore.h>
 #include <linux/workqueue.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
 
 #include <linux/mlx4/device.h>
 #include <linux/mlx4/driver.h>
@@ -243,6 +245,7 @@ struct mlx4_bitmap {
        u32                     reserved_top;
        u32                     mask;
        u32                     avail;
+       u32                     effective_len;
        spinlock_t              lock;
        unsigned long          *table;
 };
@@ -373,6 +376,14 @@ struct mlx4_srq_context {
        __be64                  db_rec_addr;
 };
 
+struct mlx4_eq_tasklet {
+       struct list_head list;
+       struct list_head process_list;
+       struct tasklet_struct task;
+       /* lock on completion tasklet list */
+       spinlock_t lock;
+};
+
 struct mlx4_eq {
        struct mlx4_dev        *dev;
        void __iomem           *doorbell;
@@ -383,6 +394,7 @@ struct mlx4_eq {
        int                     nent;
        struct mlx4_buf_list   *page_list;
        struct mlx4_mtt         mtt;
+       struct mlx4_eq_tasklet  tasklet_ctx;
 };
 
 struct mlx4_slave_eqe {
@@ -606,6 +618,7 @@ struct mlx4_cmd {
        u8                      use_events;
        u8                      toggle;
        u8                      comm_toggle;
+       u8                      initialized;
 };
 
 enum {
@@ -669,8 +682,17 @@ struct mlx4_srq_table {
        struct mlx4_icm_table   cmpt_table;
 };
 
+enum mlx4_qp_table_zones {
+       MLX4_QP_TABLE_ZONE_GENERAL,
+       MLX4_QP_TABLE_ZONE_RSS,
+       MLX4_QP_TABLE_ZONE_RAW_ETH,
+       MLX4_QP_TABLE_ZONE_NUM
+};
+
 struct mlx4_qp_table {
-       struct mlx4_bitmap      bitmap;
+       struct mlx4_bitmap      *bitmap_gen;
+       struct mlx4_zone_allocator *zones;
+       u32                     zones_uids[MLX4_QP_TABLE_ZONE_NUM];
        u32                     rdmarc_base;
        int                     rdmarc_shift;
        spinlock_t              lock;
@@ -872,7 +894,8 @@ extern struct workqueue_struct *mlx4_wq;
 
 u32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap);
 void mlx4_bitmap_free(struct mlx4_bitmap *bitmap, u32 obj, int use_rr);
-u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align);
+u32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt,
+                           int align, u32 skip_mask);
 void mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt,
                            int use_rr);
 u32 mlx4_bitmap_avail(struct mlx4_bitmap *bitmap);
@@ -958,7 +981,7 @@ int mlx4_DMA_wrapper(struct mlx4_dev *dev, int slave,
                     struct mlx4_cmd_mailbox *outbox,
                     struct mlx4_cmd_info *cmd);
 int __mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align,
-                           int *base);
+                           int *base, u8 flags);
 void __mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
 int __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac);
 void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac);
@@ -1126,8 +1149,16 @@ int mlx4_QUERY_QP_wrapper(struct mlx4_dev *dev, int slave,
 
 int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe);
 
+enum {
+       MLX4_CMD_CLEANUP_STRUCT = 1UL << 0,
+       MLX4_CMD_CLEANUP_POOL   = 1UL << 1,
+       MLX4_CMD_CLEANUP_HCR    = 1UL << 2,
+       MLX4_CMD_CLEANUP_VHCR   = 1UL << 3,
+       MLX4_CMD_CLEANUP_ALL    = (MLX4_CMD_CLEANUP_VHCR << 1) - 1
+};
+
 int mlx4_cmd_init(struct mlx4_dev *dev);
-void mlx4_cmd_cleanup(struct mlx4_dev *dev);
+void mlx4_cmd_cleanup(struct mlx4_dev *dev, int cleanup_mask);
 int mlx4_multi_func_init(struct mlx4_dev *dev);
 void mlx4_multi_func_cleanup(struct mlx4_dev *dev);
 void mlx4_cmd_event(struct mlx4_dev *dev, u16 token, u8 status, u64 out_param);
@@ -1137,6 +1168,7 @@ void mlx4_cmd_use_polling(struct mlx4_dev *dev);
 int mlx4_comm_cmd(struct mlx4_dev *dev, u8 cmd, u16 param,
                  unsigned long timeout);
 
+void mlx4_cq_tasklet_cb(unsigned long data);
 void mlx4_cq_completion(struct mlx4_dev *dev, u32 cqn);
 void mlx4_cq_event(struct mlx4_dev *dev, u32 cqn, int event_type);
 
@@ -1323,4 +1355,72 @@ int mlx4_get_slave_num_gids(struct mlx4_dev *dev, int slave, int port);
 int mlx4_get_vf_indx(struct mlx4_dev *dev, int slave);
 int mlx4_config_mad_demux(struct mlx4_dev *dev);
 
+enum mlx4_zone_flags {
+       MLX4_ZONE_ALLOW_ALLOC_FROM_LOWER_PRIO   = 1UL << 0,
+       MLX4_ZONE_ALLOW_ALLOC_FROM_EQ_PRIO      = 1UL << 1,
+       MLX4_ZONE_FALLBACK_TO_HIGHER_PRIO       = 1UL << 2,
+       MLX4_ZONE_USE_RR                        = 1UL << 3,
+};
+
+enum mlx4_zone_alloc_flags {
+       /* No two objects could overlap between zones. UID
+        * could be left unused. If this flag is given and
+        * two overlapped zones are used, an object will be free'd
+        * from the smallest possible matching zone.
+        */
+       MLX4_ZONE_ALLOC_FLAGS_NO_OVERLAP        = 1UL << 0,
+};
+
+struct mlx4_zone_allocator;
+
+/* Create a new zone allocator */
+struct mlx4_zone_allocator *mlx4_zone_allocator_create(enum mlx4_zone_alloc_flags flags);
+
+/* Attach a mlx4_bitmap <bitmap> of priority <priority> to the zone allocator
+ * <zone_alloc>. Allocating an object from this zone adds an offset <offset>.
+ * Similarly, when searching for an object to free, this offset it taken into
+ * account. The use_rr mlx4_ib parameter for allocating objects from this <bitmap>
+ * is given through the MLX4_ZONE_USE_RR flag in <flags>.
+ * When an allocation fails, <zone_alloc> tries to allocate from other zones
+ * according to the policy set by <flags>. <puid> is the unique identifier
+ * received to this zone.
+ */
+int mlx4_zone_add_one(struct mlx4_zone_allocator *zone_alloc,
+                     struct mlx4_bitmap *bitmap,
+                     u32 flags,
+                     int priority,
+                     int offset,
+                     u32 *puid);
+
+/* Remove bitmap indicated by <uid> from <zone_alloc> */
+int mlx4_zone_remove_one(struct mlx4_zone_allocator *zone_alloc, u32 uid);
+
+/* Delete the zone allocator <zone_alloc. This function doesn't destroy
+ * the attached bitmaps.
+ */
+void mlx4_zone_allocator_destroy(struct mlx4_zone_allocator *zone_alloc);
+
+/* Allocate <count> objects with align <align> and skip_mask <skip_mask>
+ * from the mlx4_bitmap whose uid is <uid>. The bitmap which we actually
+ * allocated from is returned in <puid>. If the allocation fails, a negative
+ * number is returned. Otherwise, the offset of the first object is returned.
+ */
+u32 mlx4_zone_alloc_entries(struct mlx4_zone_allocator *zones, u32 uid, int count,
+                           int align, u32 skip_mask, u32 *puid);
+
+/* Free <count> objects, start from <obj> of the uid <uid> from zone_allocator
+ * <zones>.
+ */
+u32 mlx4_zone_free_entries(struct mlx4_zone_allocator *zones,
+                          u32 uid, u32 obj, u32 count);
+
+/* If <zones> was allocated with MLX4_ZONE_ALLOC_FLAGS_NO_OVERLAP, instead of
+ * specifying the uid when freeing an object, zone allocator could figure it by
+ * itself. Other parameters are similar to mlx4_zone_free.
+ */
+u32 mlx4_zone_free_entries_unique(struct mlx4_zone_allocator *zones, u32 obj, u32 count);
+
+/* Returns a pointer to mlx4_bitmap that was attached to <zones> with <uid> */
+struct mlx4_bitmap *mlx4_zone_get_bitmap(struct mlx4_zone_allocator *zones, u32 uid);
+
 #endif /* MLX4_H */