1178786Skmacy/************************************************************************** 2178786Skmacy 3178786SkmacyCopyright (c) 2007, 2008 Chelsio Inc. 4178786SkmacyAll rights reserved. 5178786Skmacy 6178786SkmacyRedistribution and use in source and binary forms, with or without 7178786Skmacymodification, are permitted provided that the following conditions are met: 8178786Skmacy 9178786Skmacy 1. Redistributions of source code must retain the above copyright notice, 10178786Skmacy this list of conditions and the following disclaimer. 11178786Skmacy 12178786Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its 13178786Skmacy contributors may be used to endorse or promote products derived from 14178786Skmacy this software without specific prior written permission. 15178786Skmacy 16178786SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17178786SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18178786SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19178786SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20178786SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21178786SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22178786SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23178786SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24178786SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25178786SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26178786SkmacyPOSSIBILITY OF SUCH DAMAGE. 27178786Skmacy 28178786Skmacy$FreeBSD$ 29178786Skmacy 30178786Skmacy***************************************************************************/ 31178786Skmacy 32178786Skmacy#ifndef __IWCH_H__ 33178786Skmacy#define __IWCH_H__ 34178786Skmacy 35178786Skmacystruct iwch_pd; 36178786Skmacystruct iwch_cq; 37178786Skmacystruct iwch_qp; 38178786Skmacystruct iwch_mr; 39178786Skmacy 40237920Snpenum t3ctype { 41237920Snp T3A = 0, 42237920Snp T3B, 43237920Snp T3C 44237920Snp}; 45178786Skmacy 46237920Snp#define PAGE_MASK_IWARP (~(PAGE_SIZE-1)) 47237920Snp 48178786Skmacystruct iwch_rnic_attributes { 49178786Skmacy u32 vendor_id; 50178786Skmacy u32 vendor_part_id; 51178786Skmacy u32 max_qps; 52178786Skmacy u32 max_wrs; /* Max for any SQ/RQ */ 53178786Skmacy u32 max_sge_per_wr; 54178786Skmacy u32 max_sge_per_rdma_write_wr; /* for RDMA Write WR */ 55178786Skmacy u32 max_cqs; 56178786Skmacy u32 max_cqes_per_cq; 57178786Skmacy u32 max_mem_regs; 58178786Skmacy u32 max_phys_buf_entries; /* for phys buf list */ 59178786Skmacy u32 max_pds; 60178786Skmacy 61178786Skmacy /* 62178786Skmacy * The memory page sizes supported by this RNIC. 63178786Skmacy * Bit position i in bitmap indicates page of 64178786Skmacy * size (4k)^i. Phys block list mode unsupported. 65178786Skmacy */ 66178786Skmacy u32 mem_pgsizes_bitmask; 67237920Snp u64 max_mr_size; 68178786Skmacy u8 can_resize_wq; 69178786Skmacy 70178786Skmacy /* 71178786Skmacy * The maximum number of RDMA Reads that can be outstanding 72178786Skmacy * per QP with this RNIC as the target. 73178786Skmacy */ 74178786Skmacy u32 max_rdma_reads_per_qp; 75178786Skmacy 76178786Skmacy /* 77178786Skmacy * The maximum number of resources used for RDMA Reads 78178786Skmacy * by this RNIC with this RNIC as the target. 79178786Skmacy */ 80178786Skmacy u32 max_rdma_read_resources; 81178786Skmacy 82178786Skmacy /* 83178786Skmacy * The max depth per QP for initiation of RDMA Read 84178786Skmacy * by this RNIC. 85178786Skmacy */ 86178786Skmacy u32 max_rdma_read_qp_depth; 87178786Skmacy 88178786Skmacy /* 89178786Skmacy * The maximum depth for initiation of RDMA Read 90178786Skmacy * operations by this RNIC on all QPs 91178786Skmacy */ 92178786Skmacy u32 max_rdma_read_depth; 93178786Skmacy u8 rq_overflow_handled; 94178786Skmacy u32 can_modify_ird; 95178786Skmacy u32 can_modify_ord; 96178786Skmacy u32 max_mem_windows; 97178786Skmacy u32 stag0_value; 98178786Skmacy u8 zbva_support; 99178786Skmacy u8 local_invalidate_fence; 100178786Skmacy u32 cq_overflow_detection; 101178786Skmacy}; 102178786Skmacy 103178786Skmacystruct iwch_dev { 104178786Skmacy struct ib_device ibdev; 105178786Skmacy struct cxio_rdev rdev; 106178786Skmacy u32 device_cap_flags; 107178786Skmacy struct iwch_rnic_attributes attr; 108237920Snp struct idr cqidr; 109237920Snp struct idr qpidr; 110237920Snp struct idr mmidr; 111178786Skmacy struct mtx lock; 112178786Skmacy TAILQ_ENTRY(iwch_dev) entry; 113178786Skmacy}; 114178786Skmacy 115178786Skmacy#ifndef container_of 116178786Skmacy#define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field))) 117178786Skmacy#endif 118178786Skmacy 119178786Skmacystatic inline struct iwch_dev *to_iwch_dev(struct ib_device *ibdev) 120178786Skmacy{ 121178786Skmacy return container_of(ibdev, struct iwch_dev, ibdev); 122178786Skmacy} 123178786Skmacy 124237920Snpstatic inline int t3b_device(const struct iwch_dev *rhp __unused) 125178786Skmacy{ 126237920Snp return (0); 127178786Skmacy} 128178786Skmacy 129237920Snpstatic inline int t3a_device(const struct iwch_dev *rhp __unused) 130178786Skmacy{ 131237920Snp return (0); 132178786Skmacy} 133178786Skmacy 134178786Skmacystatic inline struct iwch_cq *get_chp(struct iwch_dev *rhp, u32 cqid) 135178786Skmacy{ 136237920Snp return idr_find(&rhp->cqidr, cqid); 137178786Skmacy} 138178786Skmacy 139178786Skmacystatic inline struct iwch_qp *get_qhp(struct iwch_dev *rhp, u32 qpid) 140178786Skmacy{ 141237920Snp return idr_find(&rhp->qpidr, qpid); 142178786Skmacy} 143178786Skmacy 144178786Skmacystatic inline struct iwch_mr *get_mhp(struct iwch_dev *rhp, u32 mmid) 145178786Skmacy{ 146237920Snp return idr_find(&rhp->mmidr, mmid); 147178786Skmacy} 148178786Skmacy 149237920Snpstatic inline int insert_handle(struct iwch_dev *rhp, struct idr *idr, 150178786Skmacy void *handle, u32 id) 151178786Skmacy{ 152178786Skmacy int ret; 153178786Skmacy u32 newid; 154178786Skmacy 155178786Skmacy do { 156237920Snp if (!idr_pre_get(idr, GFP_KERNEL)) { 157237920Snp return -ENOMEM; 158237920Snp } 159178786Skmacy mtx_lock(&rhp->lock); 160237920Snp ret = idr_get_new_above(idr, handle, id, &newid); 161178786Skmacy WARN_ON(ret != 0); 162178786Skmacy WARN_ON(!ret && newid != id); 163178786Skmacy mtx_unlock(&rhp->lock); 164178786Skmacy } while (ret == -EAGAIN); 165178786Skmacy 166178786Skmacy return ret; 167178786Skmacy} 168178786Skmacy 169237920Snpstatic inline void remove_handle(struct iwch_dev *rhp, struct idr *idr, u32 id) 170178786Skmacy{ 171178786Skmacy mtx_lock(&rhp->lock); 172237920Snp idr_remove(idr, id); 173178786Skmacy mtx_unlock(&rhp->lock); 174178786Skmacy} 175178786Skmacy 176237920Snpvoid iwch_ev_dispatch(struct iwch_dev *, struct mbuf *); 177178786Skmacy#endif 178