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