]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/infiniband/hw/hns/hns_roce_device.h
RDMA/hns: Support rq record doorbell for the user space
[mirror_ubuntu-bionic-kernel.git] / drivers / infiniband / hw / hns / hns_roce_device.h
index 2503d7f25e66ae3729a0f3eeb545db1584799c98..354882271928200b13789b1aa2b4d6d03fdefd2d 100644 (file)
 #define PAGES_SHIFT_24                         24
 #define PAGES_SHIFT_32                         32
 
+enum {
+       HNS_ROCE_SUPPORT_RQ_RECORD_DB = 1 << 0,
+};
+
 enum hns_roce_qp_state {
        HNS_ROCE_QP_STATE_RST,
        HNS_ROCE_QP_STATE_INIT,
@@ -178,7 +182,8 @@ enum {
 enum {
        HNS_ROCE_CAP_FLAG_REREG_MR              = BIT(0),
        HNS_ROCE_CAP_FLAG_ROCE_V1_V2            = BIT(1),
-       HNS_ROCE_CAP_FLAG_RQ_INLINE             = BIT(2)
+       HNS_ROCE_CAP_FLAG_RQ_INLINE             = BIT(2),
+       HNS_ROCE_CAP_FLAG_RECORD_DB             = BIT(3)
 };
 
 enum hns_roce_mtt_type {
@@ -186,6 +191,10 @@ enum hns_roce_mtt_type {
        MTT_TYPE_CQE,
 };
 
+enum {
+       HNS_ROCE_DB_PER_PAGE = PAGE_SIZE / 4
+};
+
 #define HNS_ROCE_CMD_SUCCESS                   1
 
 #define HNS_ROCE_PORT_DOWN                     0
@@ -203,6 +212,8 @@ struct hns_roce_uar {
 struct hns_roce_ucontext {
        struct ib_ucontext      ibucontext;
        struct hns_roce_uar     uar;
+       struct list_head        page_list;
+       struct mutex            page_mutex;
 };
 
 struct hns_roce_pd {
@@ -335,6 +346,33 @@ struct hns_roce_buf {
        int                             page_shift;
 };
 
+struct hns_roce_db_pgdir {
+       struct list_head        list;
+       DECLARE_BITMAP(order0, HNS_ROCE_DB_PER_PAGE);
+       DECLARE_BITMAP(order1, HNS_ROCE_DB_PER_PAGE / 2);
+       unsigned long           *bits[2];
+       u32                     *page;
+       dma_addr_t              db_dma;
+};
+
+struct hns_roce_user_db_page {
+       struct list_head        list;
+       struct ib_umem          *umem;
+       unsigned long           user_virt;
+       refcount_t              refcount;
+};
+
+struct hns_roce_db {
+       u32             *db_record;
+       union {
+               struct hns_roce_db_pgdir *pgdir;
+               struct hns_roce_user_db_page *user_page;
+       } u;
+       dma_addr_t      dma;
+       int             index;
+       int             order;
+};
+
 struct hns_roce_cq_buf {
        struct hns_roce_buf hr_buf;
        struct hns_roce_mtt hr_mtt;
@@ -466,6 +504,8 @@ struct hns_roce_qp {
        struct ib_qp            ibqp;
        struct hns_roce_buf     hr_buf;
        struct hns_roce_wq      rq;
+       struct hns_roce_db      rdb;
+       u8                      rdb_en;
        u32                     doorbell_qpn;
        __le32                  sq_signal_bits;
        u32                     sq_next_wqe;
@@ -930,6 +970,10 @@ struct ib_cq *hns_roce_ib_create_cq(struct ib_device *ib_dev,
 int hns_roce_ib_destroy_cq(struct ib_cq *ib_cq);
 void hns_roce_free_cq(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq);
 
+int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
+                        struct hns_roce_db *db);
+void hns_roce_db_unmap_user(struct hns_roce_ucontext *context,
+                           struct hns_roce_db *db);
 void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);
 void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type);
 void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type);