1
2 /**************************************************************************
3
4 Copyright (c) 2007, Chelsio Inc.
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9
10 1. Redistributions of source code must retain the above copyright notice,
11 this list of conditions and the following disclaimer.
12
13 2. Neither the name of the Chelsio Corporation nor the names of its
14 contributors may be used to endorse or promote products derived from
15 this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 POSSIBILITY OF SUCH DAMAGE.
28
29 ***************************************************************************/
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD: stable/9/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c 237920 2012-07-01 12:00:36Z np $");
32
33 #include "opt_inet.h"
34
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/kernel.h>
38 #include <sys/bus.h>
39 #include <sys/pciio.h>
40 #include <sys/conf.h>
41 #include <machine/bus.h>
42 #include <machine/resource.h>
43 #include <sys/bus_dma.h>
44 #include <sys/rman.h>
45 #include <sys/ioccom.h>
46 #include <sys/mbuf.h>
47 #include <sys/mutex.h>
48 #include <sys/rwlock.h>
49 #include <sys/linker.h>
50 #include <sys/firmware.h>
51 #include <sys/socket.h>
52 #include <sys/sockio.h>
53 #include <sys/smp.h>
54 #include <sys/sysctl.h>
55 #include <sys/syslog.h>
56 #include <sys/queue.h>
57 #include <sys/taskqueue.h>
58 #include <sys/proc.h>
59 #include <sys/queue.h>
60 #include <sys/libkern.h>
61
62 #include <netinet/in.h>
63
64 #include <rdma/ib_verbs.h>
65 #include <rdma/ib_umem.h>
66 #include <rdma/ib_user_verbs.h>
67 #include <linux/idr.h>
68 #include <ulp/iw_cxgb/iw_cxgb_ib_intfc.h>
69
70 #if defined(INVARIANTS) && defined(TCP_OFFLOAD)
71 #include <cxgb_include.h>
72 #include <ulp/iw_cxgb/iw_cxgb_wr.h>
73 #include <ulp/iw_cxgb/iw_cxgb_hal.h>
74 #include <ulp/iw_cxgb/iw_cxgb_provider.h>
75 #include <ulp/iw_cxgb/iw_cxgb_cm.h>
76 #include <ulp/iw_cxgb/iw_cxgb.h>
77 #include <ulp/iw_cxgb/iw_cxgb_resource.h>
78 #include <ulp/iw_cxgb/iw_cxgb_user.h>
79
80 static int
cxio_rdma_get_mem(struct cxio_rdev * rdev,struct ch_mem_range * m)81 cxio_rdma_get_mem(struct cxio_rdev *rdev, struct ch_mem_range *m)
82 {
83 struct adapter *sc = rdev->adap;
84 struct mc7 *mem;
85
86 if ((m->addr & 7) || (m->len & 7))
87 return (EINVAL);
88 if (m->mem_id == MEM_CM)
89 mem = &sc->cm;
90 else if (m->mem_id == MEM_PMRX)
91 mem = &sc->pmrx;
92 else if (m->mem_id == MEM_PMTX)
93 mem = &sc->pmtx;
94 else
95 return (EINVAL);
96
97 return (t3_mc7_bd_read(mem, m->addr/8, m->len/8, (u64 *)m->buf));
98 }
99
cxio_dump_tpt(struct cxio_rdev * rdev,uint32_t stag)100 void cxio_dump_tpt(struct cxio_rdev *rdev, uint32_t stag)
101 {
102 struct ch_mem_range m;
103 u64 *data;
104 u32 addr;
105 int rc;
106 int size = 32;
107
108 m.buf = malloc(size, M_DEVBUF, M_NOWAIT);
109 if (m.buf == NULL) {
110 CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
111 return;
112 }
113 m.mem_id = MEM_PMRX;
114 m.addr = (stag >> 8) * 32 + rdev->rnic_info.tpt_base;
115 m.len = size;
116 CTR3(KTR_IW_CXGB, "%s TPT addr 0x%x len %d", __FUNCTION__, m.addr, m.len);
117
118 rc = cxio_rdma_get_mem(rdev, &m);
119 if (rc) {
120 CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
121 free(m.buf, M_DEVBUF);
122 return;
123 }
124
125 data = (u64 *)m.buf;
126 addr = m.addr;
127 while (size > 0) {
128 CTR2(KTR_IW_CXGB, "TPT %08x: %016llx", addr, (unsigned long long) *data);
129 size -= 8;
130 data++;
131 addr += 8;
132 }
133 free(m.buf, M_DEVBUF);
134 }
135
cxio_dump_pbl(struct cxio_rdev * rdev,uint32_t pbl_addr,uint32_t len,u8 shift)136 void cxio_dump_pbl(struct cxio_rdev *rdev, uint32_t pbl_addr, uint32_t len, u8 shift)
137 {
138 struct ch_mem_range m;
139 u64 *data;
140 u32 addr;
141 int rc;
142 int size, npages;
143
144 shift += 12;
145 npages = (len + (1ULL << shift) - 1) >> shift;
146 size = npages * sizeof(u64);
147 m.buf = malloc(size, M_DEVBUF, M_NOWAIT);
148 if (m.buf == NULL) {
149 CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
150 return;
151 }
152 m.mem_id = MEM_PMRX;
153 m.addr = pbl_addr;
154 m.len = size;
155 CTR4(KTR_IW_CXGB, "%s PBL addr 0x%x len %d depth %d",
156 __FUNCTION__, m.addr, m.len, npages);
157
158 rc = cxio_rdma_get_mem(rdev, &m);
159 if (rc) {
160 CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
161 free(m.buf, M_DEVBUF);
162 return;
163 }
164
165 data = (u64 *)m.buf;
166 addr = m.addr;
167 while (size > 0) {
168 CTR2(KTR_IW_CXGB, "PBL %08x: %016llx", addr, (unsigned long long) *data);
169 size -= 8;
170 data++;
171 addr += 8;
172 }
173 free(m.buf, M_DEVBUF);
174 }
175
cxio_dump_wqe(union t3_wr * wqe)176 void cxio_dump_wqe(union t3_wr *wqe)
177 {
178 uint64_t *data = (uint64_t *)wqe;
179 uint32_t size = (uint32_t)(be64toh(*data) & 0xff);
180
181 if (size == 0)
182 size = 8;
183 while (size > 0) {
184 CTR2(KTR_IW_CXGB, "WQE %p: %016llx", data,
185 (unsigned long long) be64toh(*data));
186 size--;
187 data++;
188 }
189 }
190
cxio_dump_wce(struct t3_cqe * wce)191 void cxio_dump_wce(struct t3_cqe *wce)
192 {
193 uint64_t *data = (uint64_t *)wce;
194 int size = sizeof(*wce);
195
196 while (size > 0) {
197 CTR2(KTR_IW_CXGB, "WCE %p: %016llx", data,
198 (unsigned long long) be64toh(*data));
199 size -= 8;
200 data++;
201 }
202 }
203
cxio_dump_rqt(struct cxio_rdev * rdev,uint32_t hwtid,int nents)204 void cxio_dump_rqt(struct cxio_rdev *rdev, uint32_t hwtid, int nents)
205 {
206 struct ch_mem_range m;
207 int size = nents * 64;
208 u64 *data;
209 u32 addr;
210 int rc;
211
212 m.buf = malloc(size, M_DEVBUF, M_NOWAIT);
213 if (m.buf == NULL) {
214 CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
215 return;
216 }
217 m.mem_id = MEM_PMRX;
218 m.addr = ((hwtid)<<10) + rdev->rnic_info.rqt_base;
219 m.len = size;
220 CTR3(KTR_IW_CXGB, "%s RQT addr 0x%x len %d", __FUNCTION__, m.addr, m.len);
221
222 rc = cxio_rdma_get_mem(rdev, &m);
223 if (rc) {
224 CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
225 free(m.buf, M_DEVBUF);
226 return;
227 }
228
229 data = (u64 *)m.buf;
230 addr = m.addr;
231 while (size > 0) {
232 CTR2(KTR_IW_CXGB, "RQT %08x: %016llx", addr, (unsigned long long) *data);
233 size -= 8;
234 data++;
235 addr += 8;
236 }
237 free(m.buf, M_DEVBUF);
238 }
239
cxio_dump_tcb(struct cxio_rdev * rdev,uint32_t hwtid)240 void cxio_dump_tcb(struct cxio_rdev *rdev, uint32_t hwtid)
241 {
242 struct ch_mem_range m;
243 int size = TCB_SIZE;
244 uint32_t *data;
245 uint32_t addr;
246 int rc;
247
248 m.buf = malloc(size, M_DEVBUF, M_NOWAIT);
249 if (m.buf == NULL) {
250 CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
251 return;
252 }
253 m.mem_id = MEM_CM;
254 m.addr = hwtid * size;
255 m.len = size;
256 CTR3(KTR_IW_CXGB, "%s TCB %d len %d", __FUNCTION__, m.addr, m.len);
257
258 rc = cxio_rdma_get_mem(rdev, &m);
259 if (rc) {
260 CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
261 free(m.buf, M_DEVBUF);
262 return;
263 }
264
265 data = (uint32_t *)m.buf;
266 addr = m.addr;
267 while (size > 0) {
268 printf("%2u: %08x %08x %08x %08x %08x %08x %08x %08x\n",
269 addr,
270 *(data+2), *(data+3), *(data),*(data+1),
271 *(data+6), *(data+7), *(data+4), *(data+5));
272 size -= 32;
273 data += 8;
274 addr += 32;
275 }
276 free(m.buf, M_DEVBUF);
277 }
278 #endif
279