|
111 | 111 | #define PAGES_SHIFT_24 24
|
112 | 112 | #define PAGES_SHIFT_32 32
|
113 | 113 |
|
| 114 | +#define HNS_ROCE_IDX_QUE_ENTRY_SZ 4 |
| 115 | +#define SRQ_DB_REG 0x230 |
| 116 | + |
114 | 117 | enum {
|
115 | 118 | HNS_ROCE_SUPPORT_RQ_RECORD_DB = 1 << 0,
|
116 | 119 | HNS_ROCE_SUPPORT_SQ_RECORD_DB = 1 << 1,
|
@@ -436,9 +439,37 @@ struct hns_roce_cq {
|
436 | 439 | struct completion free;
|
437 | 440 | };
|
438 | 441 |
|
| 442 | +struct hns_roce_idx_que { |
| 443 | + struct hns_roce_buf idx_buf; |
| 444 | + int entry_sz; |
| 445 | + u32 buf_size; |
| 446 | + struct ib_umem *umem; |
| 447 | + struct hns_roce_mtt mtt; |
| 448 | + u64 *bitmap; |
| 449 | +}; |
| 450 | + |
439 | 451 | struct hns_roce_srq {
|
440 | 452 | struct ib_srq ibsrq;
|
441 |
| - int srqn; |
| 453 | + void (*event)(struct hns_roce_srq *srq, enum hns_roce_event event); |
| 454 | + unsigned long srqn; |
| 455 | + int max; |
| 456 | + int max_gs; |
| 457 | + int wqe_shift; |
| 458 | + void __iomem *db_reg_l; |
| 459 | + |
| 460 | + atomic_t refcount; |
| 461 | + struct completion free; |
| 462 | + |
| 463 | + struct hns_roce_buf buf; |
| 464 | + u64 *wrid; |
| 465 | + struct ib_umem *umem; |
| 466 | + struct hns_roce_mtt mtt; |
| 467 | + struct hns_roce_idx_que idx_que; |
| 468 | + spinlock_t lock; |
| 469 | + int head; |
| 470 | + int tail; |
| 471 | + u16 wqe_ctr; |
| 472 | + struct mutex mutex; |
442 | 473 | };
|
443 | 474 |
|
444 | 475 | struct hns_roce_uar_table {
|
@@ -761,6 +792,12 @@ struct hns_roce_caps {
|
761 | 792 | u32 cqe_ba_pg_sz;
|
762 | 793 | u32 cqe_buf_pg_sz;
|
763 | 794 | u32 cqe_hop_num;
|
| 795 | + u32 srqwqe_ba_pg_sz; |
| 796 | + u32 srqwqe_buf_pg_sz; |
| 797 | + u32 srqwqe_hop_num; |
| 798 | + u32 idx_ba_pg_sz; |
| 799 | + u32 idx_buf_pg_sz; |
| 800 | + u32 idx_hop_num; |
764 | 801 | u32 eqe_ba_pg_sz;
|
765 | 802 | u32 eqe_buf_pg_sz;
|
766 | 803 | u32 eqe_hop_num;
|
@@ -829,6 +866,17 @@ struct hns_roce_hw {
|
829 | 866 | int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period);
|
830 | 867 | int (*init_eq)(struct hns_roce_dev *hr_dev);
|
831 | 868 | void (*cleanup_eq)(struct hns_roce_dev *hr_dev);
|
| 869 | + void (*write_srqc)(struct hns_roce_dev *hr_dev, |
| 870 | + struct hns_roce_srq *srq, u32 pdn, u16 xrcd, u32 cqn, |
| 871 | + void *mb_buf, u64 *mtts_wqe, u64 *mtts_idx, |
| 872 | + dma_addr_t dma_handle_wqe, |
| 873 | + dma_addr_t dma_handle_idx); |
| 874 | + int (*modify_srq)(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr, |
| 875 | + enum ib_srq_attr_mask srq_attr_mask, |
| 876 | + struct ib_udata *udata); |
| 877 | + int (*query_srq)(struct ib_srq *ibsrq, struct ib_srq_attr *attr); |
| 878 | + int (*post_srq_recv)(struct ib_srq *ibsrq, const struct ib_recv_wr *wr, |
| 879 | + const struct ib_recv_wr **bad_wr); |
832 | 880 | };
|
833 | 881 |
|
834 | 882 | struct hns_roce_dev {
|
@@ -1038,6 +1086,14 @@ int hns_roce_buf_alloc(struct hns_roce_dev *hr_dev, u32 size, u32 max_direct,
|
1038 | 1086 | int hns_roce_ib_umem_write_mtt(struct hns_roce_dev *hr_dev,
|
1039 | 1087 | struct hns_roce_mtt *mtt, struct ib_umem *umem);
|
1040 | 1088 |
|
| 1089 | +struct ib_srq *hns_roce_create_srq(struct ib_pd *pd, |
| 1090 | + struct ib_srq_init_attr *srq_init_attr, |
| 1091 | + struct ib_udata *udata); |
| 1092 | +int hns_roce_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr, |
| 1093 | + enum ib_srq_attr_mask srq_attr_mask, |
| 1094 | + struct ib_udata *udata); |
| 1095 | +int hns_roce_destroy_srq(struct ib_srq *ibsrq); |
| 1096 | + |
1041 | 1097 | struct ib_qp *hns_roce_create_qp(struct ib_pd *ib_pd,
|
1042 | 1098 | struct ib_qp_init_attr *init_attr,
|
1043 | 1099 | struct ib_udata *udata);
|
|
0 commit comments