iw_cxgb_dbg.c revision 183292
1
2/**************************************************************************
3
4Copyright (c) 2007, Chelsio Inc.
5All rights reserved.
6
7Redistribution and use in source and binary forms, with or without
8modification, 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
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27POSSIBILITY OF SUCH DAMAGE.
28
29***************************************************************************/
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_dbg.c 183292 2008-09-23 03:16:54Z kmacy $");
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/kernel.h>
36#include <sys/bus.h>
37#include <sys/module.h>
38#include <sys/pciio.h>
39#include <sys/conf.h>
40#include <machine/bus.h>
41#include <machine/resource.h>
42#include <sys/bus_dma.h>
43#include <sys/rman.h>
44#include <sys/ioccom.h>
45#include <sys/mbuf.h>
46#include <sys/mutex.h>
47#include <sys/rwlock.h>
48#include <sys/linker.h>
49#include <sys/firmware.h>
50#include <sys/socket.h>
51#include <sys/sockio.h>
52#include <sys/smp.h>
53#include <sys/sysctl.h>
54#include <sys/syslog.h>
55#include <sys/queue.h>
56#include <sys/taskqueue.h>
57#include <sys/proc.h>
58#include <sys/queue.h>
59#include <sys/libkern.h>
60
61#include <netinet/in.h>
62
63#include <contrib/rdma/ib_verbs.h>
64#include <contrib/rdma/ib_umem.h>
65#include <contrib/rdma/ib_user_verbs.h>
66
67#ifdef DEBUG
68#include <cxgb_include.h>
69#include <ulp/iw_cxgb/iw_cxgb_wr.h>
70#include <ulp/iw_cxgb/iw_cxgb_hal.h>
71#include <ulp/iw_cxgb/iw_cxgb_provider.h>
72#include <ulp/iw_cxgb/iw_cxgb_cm.h>
73#include <ulp/iw_cxgb/iw_cxgb.h>
74#include <ulp/iw_cxgb/iw_cxgb_resource.h>
75#include <ulp/iw_cxgb/iw_cxgb_user.h>
76
77void cxio_dump_tpt(struct cxio_rdev *rdev, uint32_t stag)
78{
79	struct ch_mem_range *m;
80	u64 *data;
81	int rc;
82	int size = 32;
83
84	m = kmalloc(sizeof(*m) + size, M_NOWAIT);
85	if (!m) {
86		CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
87		return;
88	}
89	m->mem_id = MEM_PMRX;
90	m->addr = (stag>>8) * 32 + rdev->rnic_info.tpt_base;
91	m->len = size;
92	CTR3(KTR_IW_CXGB, "%s TPT addr 0x%x len %d", __FUNCTION__, m->addr, m->len);
93	rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
94	if (rc) {
95		CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
96		free(m, M_DEVBUF);
97		return;
98	}
99
100	data = (u64 *)m->buf;
101	while (size > 0) {
102		CTR2(KTR_IW_CXGB, "TPT %08x: %016llx", m->addr, (unsigned long long) *data);
103		size -= 8;
104		data++;
105		m->addr += 8;
106	}
107	free(m, M_DEVBUF);
108}
109
110void cxio_dump_pbl(struct cxio_rdev *rdev, uint32_t pbl_addr, uint32_t len, u8 shift)
111{
112	struct ch_mem_range *m;
113	u64 *data;
114	int rc;
115	int size, npages;
116
117	shift += 12;
118	npages = (len + (1ULL << shift) - 1) >> shift;
119	size = npages * sizeof(u64);
120
121	m = kmalloc(sizeof(*m) + size, M_NOWAIT);
122	if (!m) {
123		CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
124		return;
125	}
126	m->mem_id = MEM_PMRX;
127	m->addr = pbl_addr;
128	m->len = size;
129	CTR4(KTR_IW_CXGB, "%s PBL addr 0x%x len %d depth %d",
130		__FUNCTION__, m->addr, m->len, npages);
131	rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
132	if (rc) {
133		CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
134		free(m, M_DEVBUF);
135		return;
136	}
137
138	data = (u64 *)m->buf;
139	while (size > 0) {
140		CTR2(KTR_IW_CXGB, "PBL %08x: %016llx", m->addr, (unsigned long long) *data);
141		size -= 8;
142		data++;
143		m->addr += 8;
144	}
145	free(m, M_DEVBUF);
146}
147
148void cxio_dump_wqe(union t3_wr *wqe)
149{
150	uint64_t *data = (uint64_t *)wqe;
151	uint32_t size = (uint32_t)(be64toh(*data) & 0xff);
152
153	if (size == 0)
154		size = 8;
155	while (size > 0) {
156		CTR2(KTR_IW_CXGB, "WQE %p: %016llx", data,
157		     (unsigned long long) be64toh(*data));
158		size--;
159		data++;
160	}
161}
162
163void cxio_dump_wce(struct t3_cqe *wce)
164{
165	uint64_t *data = (uint64_t *)wce;
166	int size = sizeof(*wce);
167
168	while (size > 0) {
169		CTR2(KTR_IW_CXGB, "WCE %p: %016llx", data,
170		     (unsigned long long) be64toh(*data));
171		size -= 8;
172		data++;
173	}
174}
175
176void cxio_dump_rqt(struct cxio_rdev *rdev, uint32_t hwtid, int nents)
177{
178	struct ch_mem_range *m;
179	int size = nents * 64;
180	u64 *data;
181	int rc;
182
183	m = kmalloc(sizeof(*m) + size, M_NOWAIT);
184	if (!m) {
185		CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
186		return;
187	}
188	m->mem_id = MEM_PMRX;
189	m->addr = ((hwtid)<<10) + rdev->rnic_info.rqt_base;
190	m->len = size;
191	CTR3(KTR_IW_CXGB, "%s RQT addr 0x%x len %d", __FUNCTION__, m->addr, m->len);
192	rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
193	if (rc) {
194		CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
195		free(m, M_DEVBUF);
196		return;
197	}
198
199	data = (u64 *)m->buf;
200	while (size > 0) {
201		CTR2(KTR_IW_CXGB, "RQT %08x: %016llx", m->addr, (unsigned long long) *data);
202		size -= 8;
203		data++;
204		m->addr += 8;
205	}
206	free(m, M_DEVBUF);
207}
208
209void cxio_dump_tcb(struct cxio_rdev *rdev, uint32_t hwtid)
210{
211	struct ch_mem_range *m;
212	int size = TCB_SIZE;
213	uint32_t *data;
214	int rc;
215
216	m = kmalloc(sizeof(*m) + size, M_NOWAIT);
217	if (!m) {
218		CTR1(KTR_IW_CXGB, "%s couldn't allocate memory.", __FUNCTION__);
219		return;
220	}
221	m->mem_id = MEM_CM;
222	m->addr = hwtid * size;
223	m->len = size;
224	CTR3(KTR_IW_CXGB, "%s TCB %d len %d", __FUNCTION__, m->addr, m->len);
225	rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
226	if (rc) {
227		CTR2(KTR_IW_CXGB, "%s toectl returned error %d", __FUNCTION__, rc);
228		free(m, M_DEVBUF);
229		return;
230	}
231
232	data = (uint32_t *)m->buf;
233	while (size > 0) {
234		printf("%2u: %08x %08x %08x %08x %08x %08x %08x %08x\n",
235			m->addr,
236			*(data+2), *(data+3), *(data),*(data+1),
237			*(data+6), *(data+7), *(data+4), *(data+5));
238		size -= 32;
239		data += 8;
240		m->addr += 32;
241	}
242	free(m, M_DEVBUF);
243}
244#endif
245