diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb3/cxio_hal.h')
-rw-r--r-- | drivers/infiniband/hw/cxgb3/cxio_hal.h | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.h b/drivers/infiniband/hw/cxgb3/cxio_hal.h new file mode 100644 index 000000000000..1b97e80b8780 --- /dev/null +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.h | |||
@@ -0,0 +1,201 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2006 Chelsio, Inc. All rights reserved. | ||
3 | * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved. | ||
4 | * | ||
5 | * This software is available to you under a choice of one of two | ||
6 | * licenses. You may choose to be licensed under the terms of the GNU | ||
7 | * General Public License (GPL) Version 2, available from the file | ||
8 | * COPYING in the main directory of this source tree, or the | ||
9 | * OpenIB.org BSD license below: | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or | ||
12 | * without modification, are permitted provided that the following | ||
13 | * conditions are met: | ||
14 | * | ||
15 | * - Redistributions of source code must retain the above | ||
16 | * copyright notice, this list of conditions and the following | ||
17 | * disclaimer. | ||
18 | * | ||
19 | * - Redistributions in binary form must reproduce the above | ||
20 | * copyright notice, this list of conditions and the following | ||
21 | * disclaimer in the documentation and/or other materials | ||
22 | * provided with the distribution. | ||
23 | * | ||
24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
25 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
26 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
27 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
28 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
29 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
30 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
31 | * SOFTWARE. | ||
32 | */ | ||
33 | #ifndef __CXIO_HAL_H__ | ||
34 | #define __CXIO_HAL_H__ | ||
35 | |||
36 | #include <linux/list.h> | ||
37 | #include <linux/mutex.h> | ||
38 | |||
39 | #include "t3_cpl.h" | ||
40 | #include "t3cdev.h" | ||
41 | #include "cxgb3_ctl_defs.h" | ||
42 | #include "cxio_wr.h" | ||
43 | |||
44 | #define T3_CTRL_QP_ID FW_RI_SGEEC_START | ||
45 | #define T3_CTL_QP_TID FW_RI_TID_START | ||
46 | #define T3_CTRL_QP_SIZE_LOG2 8 | ||
47 | #define T3_CTRL_CQ_ID 0 | ||
48 | |||
49 | /* TBD */ | ||
50 | #define T3_MAX_NUM_RI (1<<15) | ||
51 | #define T3_MAX_NUM_QP (1<<15) | ||
52 | #define T3_MAX_NUM_CQ (1<<15) | ||
53 | #define T3_MAX_NUM_PD (1<<15) | ||
54 | #define T3_MAX_PBL_SIZE 256 | ||
55 | #define T3_MAX_RQ_SIZE 1024 | ||
56 | #define T3_MAX_NUM_STAG (1<<15) | ||
57 | |||
58 | #define T3_STAG_UNSET 0xffffffff | ||
59 | |||
60 | #define T3_MAX_DEV_NAME_LEN 32 | ||
61 | |||
62 | struct cxio_hal_ctrl_qp { | ||
63 | u32 wptr; | ||
64 | u32 rptr; | ||
65 | struct mutex lock; /* for the wtpr, can sleep */ | ||
66 | wait_queue_head_t waitq;/* wait for RspQ/CQE msg */ | ||
67 | union t3_wr *workq; /* the work request queue */ | ||
68 | dma_addr_t dma_addr; /* pci bus address of the workq */ | ||
69 | DECLARE_PCI_UNMAP_ADDR(mapping) | ||
70 | void __iomem *doorbell; | ||
71 | }; | ||
72 | |||
73 | struct cxio_hal_resource { | ||
74 | struct kfifo *tpt_fifo; | ||
75 | spinlock_t tpt_fifo_lock; | ||
76 | struct kfifo *qpid_fifo; | ||
77 | spinlock_t qpid_fifo_lock; | ||
78 | struct kfifo *cqid_fifo; | ||
79 | spinlock_t cqid_fifo_lock; | ||
80 | struct kfifo *pdid_fifo; | ||
81 | spinlock_t pdid_fifo_lock; | ||
82 | }; | ||
83 | |||
84 | struct cxio_qpid_list { | ||
85 | struct list_head entry; | ||
86 | u32 qpid; | ||
87 | }; | ||
88 | |||
89 | struct cxio_ucontext { | ||
90 | struct list_head qpids; | ||
91 | struct mutex lock; | ||
92 | }; | ||
93 | |||
94 | struct cxio_rdev { | ||
95 | char dev_name[T3_MAX_DEV_NAME_LEN]; | ||
96 | struct t3cdev *t3cdev_p; | ||
97 | struct rdma_info rnic_info; | ||
98 | struct adap_ports port_info; | ||
99 | struct cxio_hal_resource *rscp; | ||
100 | struct cxio_hal_ctrl_qp ctrl_qp; | ||
101 | void *ulp; | ||
102 | unsigned long qpshift; | ||
103 | u32 qpnr; | ||
104 | u32 qpmask; | ||
105 | struct cxio_ucontext uctx; | ||
106 | struct gen_pool *pbl_pool; | ||
107 | struct gen_pool *rqt_pool; | ||
108 | struct list_head entry; | ||
109 | }; | ||
110 | |||
111 | static inline int cxio_num_stags(struct cxio_rdev *rdev_p) | ||
112 | { | ||
113 | return min((int)T3_MAX_NUM_STAG, (int)((rdev_p->rnic_info.tpt_top - rdev_p->rnic_info.tpt_base) >> 5)); | ||
114 | } | ||
115 | |||
116 | typedef void (*cxio_hal_ev_callback_func_t) (struct cxio_rdev * rdev_p, | ||
117 | struct sk_buff * skb); | ||
118 | |||
119 | #define RSPQ_CQID(rsp) (be32_to_cpu(rsp->cq_ptrid) & 0xffff) | ||
120 | #define RSPQ_CQPTR(rsp) ((be32_to_cpu(rsp->cq_ptrid) >> 16) & 0xffff) | ||
121 | #define RSPQ_GENBIT(rsp) ((be32_to_cpu(rsp->flags) >> 16) & 1) | ||
122 | #define RSPQ_OVERFLOW(rsp) ((be32_to_cpu(rsp->flags) >> 17) & 1) | ||
123 | #define RSPQ_AN(rsp) ((be32_to_cpu(rsp->flags) >> 18) & 1) | ||
124 | #define RSPQ_SE(rsp) ((be32_to_cpu(rsp->flags) >> 19) & 1) | ||
125 | #define RSPQ_NOTIFY(rsp) ((be32_to_cpu(rsp->flags) >> 20) & 1) | ||
126 | #define RSPQ_CQBRANCH(rsp) ((be32_to_cpu(rsp->flags) >> 21) & 1) | ||
127 | #define RSPQ_CREDIT_THRESH(rsp) ((be32_to_cpu(rsp->flags) >> 22) & 1) | ||
128 | |||
129 | struct respQ_msg_t { | ||
130 | __be32 flags; /* flit 0 */ | ||
131 | __be32 cq_ptrid; | ||
132 | __be64 rsvd; /* flit 1 */ | ||
133 | struct t3_cqe cqe; /* flits 2-3 */ | ||
134 | }; | ||
135 | |||
136 | enum t3_cq_opcode { | ||
137 | CQ_ARM_AN = 0x2, | ||
138 | CQ_ARM_SE = 0x6, | ||
139 | CQ_FORCE_AN = 0x3, | ||
140 | CQ_CREDIT_UPDATE = 0x7 | ||
141 | }; | ||
142 | |||
143 | int cxio_rdev_open(struct cxio_rdev *rdev); | ||
144 | void cxio_rdev_close(struct cxio_rdev *rdev); | ||
145 | int cxio_hal_cq_op(struct cxio_rdev *rdev, struct t3_cq *cq, | ||
146 | enum t3_cq_opcode op, u32 credit); | ||
147 | int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev, u32 qpid); | ||
148 | int cxio_create_cq(struct cxio_rdev *rdev, struct t3_cq *cq); | ||
149 | int cxio_destroy_cq(struct cxio_rdev *rdev, struct t3_cq *cq); | ||
150 | int cxio_resize_cq(struct cxio_rdev *rdev, struct t3_cq *cq); | ||
151 | void cxio_release_ucontext(struct cxio_rdev *rdev, struct cxio_ucontext *uctx); | ||
152 | void cxio_init_ucontext(struct cxio_rdev *rdev, struct cxio_ucontext *uctx); | ||
153 | int cxio_create_qp(struct cxio_rdev *rdev, u32 kernel_domain, struct t3_wq *wq, | ||
154 | struct cxio_ucontext *uctx); | ||
155 | int cxio_destroy_qp(struct cxio_rdev *rdev, struct t3_wq *wq, | ||
156 | struct cxio_ucontext *uctx); | ||
157 | int cxio_peek_cq(struct t3_wq *wr, struct t3_cq *cq, int opcode); | ||
158 | int cxio_allocate_stag(struct cxio_rdev *rdev, u32 * stag, u32 pdid, | ||
159 | enum tpt_mem_perm perm, u32 * pbl_size, u32 * pbl_addr); | ||
160 | int cxio_register_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, | ||
161 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, | ||
162 | u8 page_size, __be64 *pbl, u32 *pbl_size, | ||
163 | u32 *pbl_addr); | ||
164 | int cxio_reregister_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, | ||
165 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, | ||
166 | u8 page_size, __be64 *pbl, u32 *pbl_size, | ||
167 | u32 *pbl_addr); | ||
168 | int cxio_dereg_mem(struct cxio_rdev *rdev, u32 stag, u32 pbl_size, | ||
169 | u32 pbl_addr); | ||
170 | int cxio_allocate_window(struct cxio_rdev *rdev, u32 * stag, u32 pdid); | ||
171 | int cxio_deallocate_window(struct cxio_rdev *rdev, u32 stag); | ||
172 | int cxio_rdma_init(struct cxio_rdev *rdev, struct t3_rdma_init_attr *attr); | ||
173 | void cxio_register_ev_cb(cxio_hal_ev_callback_func_t ev_cb); | ||
174 | void cxio_unregister_ev_cb(cxio_hal_ev_callback_func_t ev_cb); | ||
175 | u32 cxio_hal_get_rhdl(void); | ||
176 | void cxio_hal_put_rhdl(u32 rhdl); | ||
177 | u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp); | ||
178 | void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid); | ||
179 | int __init cxio_hal_init(void); | ||
180 | void __exit cxio_hal_exit(void); | ||
181 | void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count); | ||
182 | void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count); | ||
183 | void cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count); | ||
184 | void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count); | ||
185 | void cxio_flush_hw_cq(struct t3_cq *cq); | ||
186 | int cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe, | ||
187 | u8 *cqe_flushed, u64 *cookie, u32 *credit); | ||
188 | |||
189 | #define MOD "iw_cxgb3: " | ||
190 | #define PDBG(fmt, args...) pr_debug(MOD fmt, ## args) | ||
191 | |||
192 | #ifdef DEBUG | ||
193 | void cxio_dump_tpt(struct cxio_rdev *rev, u32 stag); | ||
194 | void cxio_dump_pbl(struct cxio_rdev *rev, u32 pbl_addr, uint len, u8 shift); | ||
195 | void cxio_dump_wqe(union t3_wr *wqe); | ||
196 | void cxio_dump_wce(struct t3_cqe *wce); | ||
197 | void cxio_dump_rqt(struct cxio_rdev *rdev, u32 hwtid, int nents); | ||
198 | void cxio_dump_tcb(struct cxio_rdev *rdev, u32 hwtid); | ||
199 | #endif | ||
200 | |||
201 | #endif | ||