diff options
Diffstat (limited to 'include/rdma/ib_verbs.h')
-rw-r--r-- | include/rdma/ib_verbs.h | 83 |
1 files changed, 81 insertions, 2 deletions
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 5f5621bf70bd..74c24b908908 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -103,6 +103,7 @@ enum ib_device_cap_flags { | |||
103 | */ | 103 | */ |
104 | IB_DEVICE_UD_IP_CSUM = (1<<18), | 104 | IB_DEVICE_UD_IP_CSUM = (1<<18), |
105 | IB_DEVICE_UD_TSO = (1<<19), | 105 | IB_DEVICE_UD_TSO = (1<<19), |
106 | IB_DEVICE_MEM_MGT_EXTENSIONS = (1<<21), | ||
106 | }; | 107 | }; |
107 | 108 | ||
108 | enum ib_atomic_cap { | 109 | enum ib_atomic_cap { |
@@ -148,6 +149,7 @@ struct ib_device_attr { | |||
148 | int max_srq; | 149 | int max_srq; |
149 | int max_srq_wr; | 150 | int max_srq_wr; |
150 | int max_srq_sge; | 151 | int max_srq_sge; |
152 | unsigned int max_fast_reg_page_list_len; | ||
151 | u16 max_pkeys; | 153 | u16 max_pkeys; |
152 | u8 local_ca_ack_delay; | 154 | u8 local_ca_ack_delay; |
153 | }; | 155 | }; |
@@ -411,6 +413,8 @@ enum ib_wc_opcode { | |||
411 | IB_WC_FETCH_ADD, | 413 | IB_WC_FETCH_ADD, |
412 | IB_WC_BIND_MW, | 414 | IB_WC_BIND_MW, |
413 | IB_WC_LSO, | 415 | IB_WC_LSO, |
416 | IB_WC_LOCAL_INV, | ||
417 | IB_WC_FAST_REG_MR, | ||
414 | /* | 418 | /* |
415 | * Set value of IB_WC_RECV so consumers can test if a completion is a | 419 | * Set value of IB_WC_RECV so consumers can test if a completion is a |
416 | * receive by testing (opcode & IB_WC_RECV). | 420 | * receive by testing (opcode & IB_WC_RECV). |
@@ -421,7 +425,8 @@ enum ib_wc_opcode { | |||
421 | 425 | ||
422 | enum ib_wc_flags { | 426 | enum ib_wc_flags { |
423 | IB_WC_GRH = 1, | 427 | IB_WC_GRH = 1, |
424 | IB_WC_WITH_IMM = (1<<1) | 428 | IB_WC_WITH_IMM = (1<<1), |
429 | IB_WC_WITH_INVALIDATE = (1<<2), | ||
425 | }; | 430 | }; |
426 | 431 | ||
427 | struct ib_wc { | 432 | struct ib_wc { |
@@ -431,7 +436,10 @@ struct ib_wc { | |||
431 | u32 vendor_err; | 436 | u32 vendor_err; |
432 | u32 byte_len; | 437 | u32 byte_len; |
433 | struct ib_qp *qp; | 438 | struct ib_qp *qp; |
434 | __be32 imm_data; | 439 | union { |
440 | __be32 imm_data; | ||
441 | u32 invalidate_rkey; | ||
442 | } ex; | ||
435 | u32 src_qp; | 443 | u32 src_qp; |
436 | int wc_flags; | 444 | int wc_flags; |
437 | u16 pkey_index; | 445 | u16 pkey_index; |
@@ -625,6 +633,9 @@ enum ib_wr_opcode { | |||
625 | IB_WR_ATOMIC_FETCH_AND_ADD, | 633 | IB_WR_ATOMIC_FETCH_AND_ADD, |
626 | IB_WR_LSO, | 634 | IB_WR_LSO, |
627 | IB_WR_SEND_WITH_INV, | 635 | IB_WR_SEND_WITH_INV, |
636 | IB_WR_RDMA_READ_WITH_INV, | ||
637 | IB_WR_LOCAL_INV, | ||
638 | IB_WR_FAST_REG_MR, | ||
628 | }; | 639 | }; |
629 | 640 | ||
630 | enum ib_send_flags { | 641 | enum ib_send_flags { |
@@ -641,6 +652,12 @@ struct ib_sge { | |||
641 | u32 lkey; | 652 | u32 lkey; |
642 | }; | 653 | }; |
643 | 654 | ||
655 | struct ib_fast_reg_page_list { | ||
656 | struct ib_device *device; | ||
657 | u64 *page_list; | ||
658 | unsigned int max_page_list_len; | ||
659 | }; | ||
660 | |||
644 | struct ib_send_wr { | 661 | struct ib_send_wr { |
645 | struct ib_send_wr *next; | 662 | struct ib_send_wr *next; |
646 | u64 wr_id; | 663 | u64 wr_id; |
@@ -673,6 +690,15 @@ struct ib_send_wr { | |||
673 | u16 pkey_index; /* valid for GSI only */ | 690 | u16 pkey_index; /* valid for GSI only */ |
674 | u8 port_num; /* valid for DR SMPs on switch only */ | 691 | u8 port_num; /* valid for DR SMPs on switch only */ |
675 | } ud; | 692 | } ud; |
693 | struct { | ||
694 | u64 iova_start; | ||
695 | struct ib_fast_reg_page_list *page_list; | ||
696 | unsigned int page_shift; | ||
697 | unsigned int page_list_len; | ||
698 | u32 length; | ||
699 | int access_flags; | ||
700 | u32 rkey; | ||
701 | } fast_reg; | ||
676 | } wr; | 702 | } wr; |
677 | }; | 703 | }; |
678 | 704 | ||
@@ -1011,6 +1037,11 @@ struct ib_device { | |||
1011 | int (*query_mr)(struct ib_mr *mr, | 1037 | int (*query_mr)(struct ib_mr *mr, |
1012 | struct ib_mr_attr *mr_attr); | 1038 | struct ib_mr_attr *mr_attr); |
1013 | int (*dereg_mr)(struct ib_mr *mr); | 1039 | int (*dereg_mr)(struct ib_mr *mr); |
1040 | struct ib_mr * (*alloc_fast_reg_mr)(struct ib_pd *pd, | ||
1041 | int max_page_list_len); | ||
1042 | struct ib_fast_reg_page_list * (*alloc_fast_reg_page_list)(struct ib_device *device, | ||
1043 | int page_list_len); | ||
1044 | void (*free_fast_reg_page_list)(struct ib_fast_reg_page_list *page_list); | ||
1014 | int (*rereg_phys_mr)(struct ib_mr *mr, | 1045 | int (*rereg_phys_mr)(struct ib_mr *mr, |
1015 | int mr_rereg_mask, | 1046 | int mr_rereg_mask, |
1016 | struct ib_pd *pd, | 1047 | struct ib_pd *pd, |
@@ -1805,6 +1836,54 @@ int ib_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr); | |||
1805 | int ib_dereg_mr(struct ib_mr *mr); | 1836 | int ib_dereg_mr(struct ib_mr *mr); |
1806 | 1837 | ||
1807 | /** | 1838 | /** |
1839 | * ib_alloc_fast_reg_mr - Allocates memory region usable with the | ||
1840 | * IB_WR_FAST_REG_MR send work request. | ||
1841 | * @pd: The protection domain associated with the region. | ||
1842 | * @max_page_list_len: requested max physical buffer list length to be | ||
1843 | * used with fast register work requests for this MR. | ||
1844 | */ | ||
1845 | struct ib_mr *ib_alloc_fast_reg_mr(struct ib_pd *pd, int max_page_list_len); | ||
1846 | |||
1847 | /** | ||
1848 | * ib_alloc_fast_reg_page_list - Allocates a page list array | ||
1849 | * @device - ib device pointer. | ||
1850 | * @page_list_len - size of the page list array to be allocated. | ||
1851 | * | ||
1852 | * This allocates and returns a struct ib_fast_reg_page_list * and a | ||
1853 | * page_list array that is at least page_list_len in size. The actual | ||
1854 | * size is returned in max_page_list_len. The caller is responsible | ||
1855 | * for initializing the contents of the page_list array before posting | ||
1856 | * a send work request with the IB_WC_FAST_REG_MR opcode. | ||
1857 | * | ||
1858 | * The page_list array entries must be translated using one of the | ||
1859 | * ib_dma_*() functions just like the addresses passed to | ||
1860 | * ib_map_phys_fmr(). Once the ib_post_send() is issued, the struct | ||
1861 | * ib_fast_reg_page_list must not be modified by the caller until the | ||
1862 | * IB_WC_FAST_REG_MR work request completes. | ||
1863 | */ | ||
1864 | struct ib_fast_reg_page_list *ib_alloc_fast_reg_page_list( | ||
1865 | struct ib_device *device, int page_list_len); | ||
1866 | |||
1867 | /** | ||
1868 | * ib_free_fast_reg_page_list - Deallocates a previously allocated | ||
1869 | * page list array. | ||
1870 | * @page_list - struct ib_fast_reg_page_list pointer to be deallocated. | ||
1871 | */ | ||
1872 | void ib_free_fast_reg_page_list(struct ib_fast_reg_page_list *page_list); | ||
1873 | |||
1874 | /** | ||
1875 | * ib_update_fast_reg_key - updates the key portion of the fast_reg MR | ||
1876 | * R_Key and L_Key. | ||
1877 | * @mr - struct ib_mr pointer to be updated. | ||
1878 | * @newkey - new key to be used. | ||
1879 | */ | ||
1880 | static inline void ib_update_fast_reg_key(struct ib_mr *mr, u8 newkey) | ||
1881 | { | ||
1882 | mr->lkey = (mr->lkey & 0xffffff00) | newkey; | ||
1883 | mr->rkey = (mr->rkey & 0xffffff00) | newkey; | ||
1884 | } | ||
1885 | |||
1886 | /** | ||
1808 | * ib_alloc_mw - Allocates a memory window. | 1887 | * ib_alloc_mw - Allocates a memory window. |
1809 | * @pd: The protection domain associated with the memory window. | 1888 | * @pd: The protection domain associated with the memory window. |
1810 | */ | 1889 | */ |