1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source. A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * This file is part of the Chelsio T4 support code.
14  *
15  * Copyright (C) 2011-2013 Chelsio Communications.  All rights reserved.
16  *
17  * This program is distributed in the hope that it will be useful, but WITHOUT
18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19  * FITNESS FOR A PARTICULAR PURPOSE.  See the LICENSE file included in this
20  * release for licensing terms and conditions.
21  */
22 
23 #include <sys/ddi.h>
24 #include <sys/sunddi.h>
25 #include <sys/queue.h>
26 
27 #include "t4nex.h"
28 #include "common/common.h"
29 #include "common/t4_regs.h"
30 #include "cudbg.h"
31 
32 /* helpers */
33 static int pci_rw(struct adapter *sc, void *data, int flags, int write);
34 static int reg_rw(struct adapter *sc, void *data, int flags, int write);
35 static void reg_block_dump(struct adapter *sc, uint8_t *buf, unsigned int start,
36     unsigned int end);
37 static int regdump(struct adapter *sc, void *data, int flags);
38 static int get_sge_context(struct adapter *sc, void *data, int flags);
39 static int get_devlog(struct adapter *sc, void *data, int flags);
40 static int validate_mem_range(struct adapter *, uint32_t, int);
41 static int read_card_mem(struct adapter *sc, void *data, int flags);
42 static int read_tid_tab(struct adapter *sc, void *data, int flags);
43 static int read_mbox(struct adapter *sc, void *data, int flags);
44 static int read_cim_la(struct adapter *sc, void *data, int flags);
45 static int read_cim_qcfg(struct adapter *sc, void *data, int flags);
46 static int read_cim_ibq(struct adapter *sc, void *data, int flags);
47 static int read_edc(struct adapter *sc, void *data, int flags);
48 static int flash_fw(struct adapter *, void *, int);
49 static int get_cudbg(struct adapter *, void *, int);
50 
51 int
t4_ioctl(struct adapter * sc,int cmd,void * data,int mode)52 t4_ioctl(struct adapter *sc, int cmd, void *data, int mode)
53 {
54 	int rc = ENOTSUP;
55 
56 	switch (cmd) {
57 	case T4_IOCTL_PCIGET32:
58 	case T4_IOCTL_PCIPUT32:
59 		rc = pci_rw(sc, data, mode, cmd == T4_IOCTL_PCIPUT32);
60 		break;
61 	case T4_IOCTL_GET32:
62 	case T4_IOCTL_PUT32:
63 		rc = reg_rw(sc, data, mode, cmd == T4_IOCTL_PUT32);
64 		break;
65 	case T4_IOCTL_REGDUMP:
66 		rc = regdump(sc, data, mode);
67 		break;
68 	case T4_IOCTL_SGE_CONTEXT:
69 		rc = get_sge_context(sc, data, mode);
70 		break;
71 	case T4_IOCTL_DEVLOG:
72 		rc = get_devlog(sc, data, mode);
73 		break;
74 	case T4_IOCTL_GET_MEM:
75 		rc = read_card_mem(sc, data, mode);
76 		break;
77 	case T4_IOCTL_GET_TID_TAB:
78 		rc = read_tid_tab(sc, data, mode);
79 		break;
80 	case T4_IOCTL_GET_MBOX:
81 		rc = read_mbox(sc, data, mode);
82 		break;
83 	case T4_IOCTL_GET_CIM_LA:
84 		rc = read_cim_la(sc, data, mode);
85 		break;
86 	case T4_IOCTL_GET_CIM_QCFG:
87 		rc = read_cim_qcfg(sc, data, mode);
88 		break;
89 	case T4_IOCTL_GET_CIM_IBQ:
90 		rc = read_cim_ibq(sc, data, mode);
91 		break;
92 	case T4_IOCTL_GET_EDC:
93 		rc = read_edc(sc, data, mode);
94 		break;
95 	case T4_IOCTL_LOAD_FW:
96 		rc = flash_fw(sc, data, mode);
97 		break;
98 	case T4_IOCTL_GET_CUDBG:
99 		rc = get_cudbg(sc, data, mode);
100 		break;
101 	default:
102 		return (EINVAL);
103 	}
104 
105 	return (rc);
106 }
107 
108 static int
pci_rw(struct adapter * sc,void * data,int flags,int write)109 pci_rw(struct adapter *sc, void *data, int flags, int write)
110 {
111 	struct t4_reg32_cmd r;
112 
113 	if (ddi_copyin(data, &r, sizeof (r), flags) < 0)
114 		return (EFAULT);
115 
116 	/* address must be 32 bit aligned */
117 	r.reg &= ~0x3;
118 
119 	if (write != 0)
120 		t4_os_pci_write_cfg4(sc, r.reg, r.value);
121 	else {
122 		t4_os_pci_read_cfg4(sc, r.reg, &r.value);
123 		if (ddi_copyout(&r, data, sizeof (r), flags) < 0)
124 			return (EFAULT);
125 	}
126 
127 	return (0);
128 }
129 
130 static int
reg_rw(struct adapter * sc,void * data,int flags,int write)131 reg_rw(struct adapter *sc, void *data, int flags, int write)
132 {
133 	struct t4_reg32_cmd r;
134 
135 	if (ddi_copyin(data, &r, sizeof (r), flags) < 0)
136 		return (EFAULT);
137 
138 	/* Register address must be 32 bit aligned */
139 	r.reg &= ~0x3;
140 
141 	if (write != 0)
142 		t4_write_reg(sc, r.reg, r.value);
143 	else {
144 		r.value = t4_read_reg(sc, r.reg);
145 		if (ddi_copyout(&r, data, sizeof (r), flags) < 0)
146 			return (EFAULT);
147 	}
148 
149 	return (0);
150 }
151 
152 static void
reg_block_dump(struct adapter * sc,uint8_t * buf,unsigned int start,unsigned int end)153 reg_block_dump(struct adapter *sc, uint8_t *buf, unsigned int start,
154     unsigned int end)
155 {
156 	/* LINTED: E_BAD_PTR_CAST_ALIGN */
157 	uint32_t *p = (uint32_t *)(buf + start);
158 
159 	for (/* */; start <= end; start += sizeof (uint32_t))
160 		*p++ = t4_read_reg(sc, start);
161 }
162 
163 /*
164  * Return a version number to identify the type of adapter.  The scheme is:
165  * - bits 0..9: chip version
166  * - bits 10..15: chip revision
167  * - bits 16..23: register dump version
168  */
169 static inline
mk_adap_vers(const struct adapter * sc)170 unsigned int mk_adap_vers(const struct adapter *sc)
171 {
172 	return CHELSIO_CHIP_VERSION(sc->params.chip) |
173 		(CHELSIO_CHIP_RELEASE(sc->params.chip) << 10) | (1 << 16);
174 }
175 
176 static int
regdump(struct adapter * sc,void * data,int flags)177 regdump(struct adapter *sc, void *data, int flags)
178 {
179 	struct t4_regdump r;
180 	uint8_t *buf;
181 	static const unsigned int *reg_ranges;
182 	int rc = 0, arr_size = 0, buf_size = 0, i;
183 	static const unsigned int t4_reg_ranges[] = {
184 		0x1008, 0x1108,
185 		0x1180, 0x11b4,
186 		0x11fc, 0x123c,
187 		0x1300, 0x173c,
188 		0x1800, 0x18fc,
189 		0x3000, 0x30d8,
190 		0x30e0, 0x5924,
191 		0x5960, 0x59d4,
192 		0x5a00, 0x5af8,
193 		0x6000, 0x6098,
194 		0x6100, 0x6150,
195 		0x6200, 0x6208,
196 		0x6240, 0x6248,
197 		0x6280, 0x6338,
198 		0x6370, 0x638c,
199 		0x6400, 0x643c,
200 		0x6500, 0x6524,
201 		0x6a00, 0x6a38,
202 		0x6a60, 0x6a78,
203 		0x6b00, 0x6b84,
204 		0x6bf0, 0x6c84,
205 		0x6cf0, 0x6d84,
206 		0x6df0, 0x6e84,
207 		0x6ef0, 0x6f84,
208 		0x6ff0, 0x7084,
209 		0x70f0, 0x7184,
210 		0x71f0, 0x7284,
211 		0x72f0, 0x7384,
212 		0x73f0, 0x7450,
213 		0x7500, 0x7530,
214 		0x7600, 0x761c,
215 		0x7680, 0x76cc,
216 		0x7700, 0x7798,
217 		0x77c0, 0x77fc,
218 		0x7900, 0x79fc,
219 		0x7b00, 0x7c38,
220 		0x7d00, 0x7efc,
221 		0x8dc0, 0x8e1c,
222 		0x8e30, 0x8e78,
223 		0x8ea0, 0x8f6c,
224 		0x8fc0, 0x9074,
225 		0x90fc, 0x90fc,
226 		0x9400, 0x9458,
227 		0x9600, 0x96bc,
228 		0x9800, 0x9808,
229 		0x9820, 0x983c,
230 		0x9850, 0x9864,
231 		0x9c00, 0x9c6c,
232 		0x9c80, 0x9cec,
233 		0x9d00, 0x9d6c,
234 		0x9d80, 0x9dec,
235 		0x9e00, 0x9e6c,
236 		0x9e80, 0x9eec,
237 		0x9f00, 0x9f6c,
238 		0x9f80, 0x9fec,
239 		0xd004, 0xd03c,
240 		0xdfc0, 0xdfe0,
241 		0xe000, 0xea7c,
242 		0xf000, 0x11190,
243 		0x19040, 0x19124,
244 		0x19150, 0x191b0,
245 		0x191d0, 0x191e8,
246 		0x19238, 0x1924c,
247 		0x193f8, 0x19474,
248 		0x19490, 0x194f8,
249 		0x19800, 0x19f30,
250 		0x1a000, 0x1a06c,
251 		0x1a0b0, 0x1a120,
252 		0x1a128, 0x1a138,
253 		0x1a190, 0x1a1c4,
254 		0x1a1fc, 0x1a1fc,
255 		0x1e040, 0x1e04c,
256 		0x1e240, 0x1e28c,
257 		0x1e2c0, 0x1e2c0,
258 		0x1e2e0, 0x1e2e0,
259 		0x1e300, 0x1e384,
260 		0x1e3c0, 0x1e3c8,
261 		0x1e440, 0x1e44c,
262 		0x1e640, 0x1e68c,
263 		0x1e6c0, 0x1e6c0,
264 		0x1e6e0, 0x1e6e0,
265 		0x1e700, 0x1e784,
266 		0x1e7c0, 0x1e7c8,
267 		0x1e840, 0x1e84c,
268 		0x1ea40, 0x1ea8c,
269 		0x1eac0, 0x1eac0,
270 		0x1eae0, 0x1eae0,
271 		0x1eb00, 0x1eb84,
272 		0x1ebc0, 0x1ebc8,
273 		0x1ec40, 0x1ec4c,
274 		0x1ee40, 0x1ee8c,
275 		0x1eec0, 0x1eec0,
276 		0x1eee0, 0x1eee0,
277 		0x1ef00, 0x1ef84,
278 		0x1efc0, 0x1efc8,
279 		0x1f040, 0x1f04c,
280 		0x1f240, 0x1f28c,
281 		0x1f2c0, 0x1f2c0,
282 		0x1f2e0, 0x1f2e0,
283 		0x1f300, 0x1f384,
284 		0x1f3c0, 0x1f3c8,
285 		0x1f440, 0x1f44c,
286 		0x1f640, 0x1f68c,
287 		0x1f6c0, 0x1f6c0,
288 		0x1f6e0, 0x1f6e0,
289 		0x1f700, 0x1f784,
290 		0x1f7c0, 0x1f7c8,
291 		0x1f840, 0x1f84c,
292 		0x1fa40, 0x1fa8c,
293 		0x1fac0, 0x1fac0,
294 		0x1fae0, 0x1fae0,
295 		0x1fb00, 0x1fb84,
296 		0x1fbc0, 0x1fbc8,
297 		0x1fc40, 0x1fc4c,
298 		0x1fe40, 0x1fe8c,
299 		0x1fec0, 0x1fec0,
300 		0x1fee0, 0x1fee0,
301 		0x1ff00, 0x1ff84,
302 		0x1ffc0, 0x1ffc8,
303 		0x20000, 0x2002c,
304 		0x20100, 0x2013c,
305 		0x20190, 0x201c8,
306 		0x20200, 0x20318,
307 		0x20400, 0x20528,
308 		0x20540, 0x20614,
309 		0x21000, 0x21040,
310 		0x2104c, 0x21060,
311 		0x210c0, 0x210ec,
312 		0x21200, 0x21268,
313 		0x21270, 0x21284,
314 		0x212fc, 0x21388,
315 		0x21400, 0x21404,
316 		0x21500, 0x21518,
317 		0x2152c, 0x2153c,
318 		0x21550, 0x21554,
319 		0x21600, 0x21600,
320 		0x21608, 0x21628,
321 		0x21630, 0x2163c,
322 		0x21700, 0x2171c,
323 		0x21780, 0x2178c,
324 		0x21800, 0x21c38,
325 		0x21c80, 0x21d7c,
326 		0x21e00, 0x21e04,
327 		0x22000, 0x2202c,
328 		0x22100, 0x2213c,
329 		0x22190, 0x221c8,
330 		0x22200, 0x22318,
331 		0x22400, 0x22528,
332 		0x22540, 0x22614,
333 		0x23000, 0x23040,
334 		0x2304c, 0x23060,
335 		0x230c0, 0x230ec,
336 		0x23200, 0x23268,
337 		0x23270, 0x23284,
338 		0x232fc, 0x23388,
339 		0x23400, 0x23404,
340 		0x23500, 0x23518,
341 		0x2352c, 0x2353c,
342 		0x23550, 0x23554,
343 		0x23600, 0x23600,
344 		0x23608, 0x23628,
345 		0x23630, 0x2363c,
346 		0x23700, 0x2371c,
347 		0x23780, 0x2378c,
348 		0x23800, 0x23c38,
349 		0x23c80, 0x23d7c,
350 		0x23e00, 0x23e04,
351 		0x24000, 0x2402c,
352 		0x24100, 0x2413c,
353 		0x24190, 0x241c8,
354 		0x24200, 0x24318,
355 		0x24400, 0x24528,
356 		0x24540, 0x24614,
357 		0x25000, 0x25040,
358 		0x2504c, 0x25060,
359 		0x250c0, 0x250ec,
360 		0x25200, 0x25268,
361 		0x25270, 0x25284,
362 		0x252fc, 0x25388,
363 		0x25400, 0x25404,
364 		0x25500, 0x25518,
365 		0x2552c, 0x2553c,
366 		0x25550, 0x25554,
367 		0x25600, 0x25600,
368 		0x25608, 0x25628,
369 		0x25630, 0x2563c,
370 		0x25700, 0x2571c,
371 		0x25780, 0x2578c,
372 		0x25800, 0x25c38,
373 		0x25c80, 0x25d7c,
374 		0x25e00, 0x25e04,
375 		0x26000, 0x2602c,
376 		0x26100, 0x2613c,
377 		0x26190, 0x261c8,
378 		0x26200, 0x26318,
379 		0x26400, 0x26528,
380 		0x26540, 0x26614,
381 		0x27000, 0x27040,
382 		0x2704c, 0x27060,
383 		0x270c0, 0x270ec,
384 		0x27200, 0x27268,
385 		0x27270, 0x27284,
386 		0x272fc, 0x27388,
387 		0x27400, 0x27404,
388 		0x27500, 0x27518,
389 		0x2752c, 0x2753c,
390 		0x27550, 0x27554,
391 		0x27600, 0x27600,
392 		0x27608, 0x27628,
393 		0x27630, 0x2763c,
394 		0x27700, 0x2771c,
395 		0x27780, 0x2778c,
396 		0x27800, 0x27c38,
397 		0x27c80, 0x27d7c,
398 		0x27e00, 0x27e04
399 	};
400 
401 	static const unsigned int t5_reg_ranges[] = {
402 		0x1008, 0x10c0,
403 		0x10cc, 0x10f8,
404 		0x1100, 0x1100,
405 		0x110c, 0x1148,
406 		0x1180, 0x1184,
407 		0x1190, 0x1194,
408 		0x11a0, 0x11a4,
409 		0x11b0, 0x11b4,
410 		0x11fc, 0x123c,
411 		0x1280, 0x173c,
412 		0x1800, 0x18fc,
413 		0x3000, 0x3028,
414 		0x3060, 0x30b0,
415 		0x30b8, 0x30d8,
416 		0x30e0, 0x30fc,
417 		0x3140, 0x357c,
418 		0x35a8, 0x35cc,
419 		0x35ec, 0x35ec,
420 		0x3600, 0x5624,
421 		0x56cc, 0x56ec,
422 		0x56f4, 0x5720,
423 		0x5728, 0x575c,
424 		0x580c, 0x5814,
425 		0x5890, 0x589c,
426 		0x58a4, 0x58ac,
427 		0x58b8, 0x58bc,
428 		0x5940, 0x59c8,
429 		0x59d0, 0x59dc,
430 		0x59fc, 0x5a18,
431 		0x5a60, 0x5a70,
432 		0x5a80, 0x5a9c,
433 		0x5b94, 0x5bfc,
434 		0x6000, 0x6020,
435 		0x6028, 0x6040,
436 		0x6058, 0x609c,
437 		0x60a8, 0x614c,
438 		0x7700, 0x7798,
439 		0x77c0, 0x78fc,
440 		0x7b00, 0x7b58,
441 		0x7b60, 0x7b84,
442 		0x7b8c, 0x7c54,
443 		0x7d00, 0x7d38,
444 		0x7d40, 0x7d80,
445 		0x7d8c, 0x7ddc,
446 		0x7de4, 0x7e04,
447 		0x7e10, 0x7e1c,
448 		0x7e24, 0x7e38,
449 		0x7e40, 0x7e44,
450 		0x7e4c, 0x7e78,
451 		0x7e80, 0x7edc,
452 		0x7ee8, 0x7efc,
453 		0x8dc0, 0x8de0,
454 		0x8df8, 0x8e04,
455 		0x8e10, 0x8e84,
456 		0x8ea0, 0x8f84,
457 		0x8fc0, 0x9058,
458 		0x9060, 0x9060,
459 		0x9068, 0x90f8,
460 		0x9400, 0x9408,
461 		0x9410, 0x9470,
462 		0x9600, 0x9600,
463 		0x9608, 0x9638,
464 		0x9640, 0x96f4,
465 		0x9800, 0x9808,
466 		0x9820, 0x983c,
467 		0x9850, 0x9864,
468 		0x9c00, 0x9c6c,
469 		0x9c80, 0x9cec,
470 		0x9d00, 0x9d6c,
471 		0x9d80, 0x9dec,
472 		0x9e00, 0x9e6c,
473 		0x9e80, 0x9eec,
474 		0x9f00, 0x9f6c,
475 		0x9f80, 0xa020,
476 		0xd004, 0xd004,
477 		0xd010, 0xd03c,
478 		0xdfc0, 0xdfe0,
479 		0xe000, 0x1106c,
480 		0x11074, 0x11088,
481 		0x1109c, 0x1117c,
482 		0x11190, 0x11204,
483 		0x19040, 0x1906c,
484 		0x19078, 0x19080,
485 		0x1908c, 0x190e8,
486 		0x190f0, 0x190f8,
487 		0x19100, 0x19110,
488 		0x19120, 0x19124,
489 		0x19150, 0x19194,
490 		0x1919c, 0x191b0,
491 		0x191d0, 0x191e8,
492 		0x19238, 0x19290,
493 		0x193f8, 0x19428,
494 		0x19430, 0x19444,
495 		0x1944c, 0x1946c,
496 		0x19474, 0x19474,
497 		0x19490, 0x194cc,
498 		0x194f0, 0x194f8,
499 		0x19c00, 0x19c08,
500 		0x19c10, 0x19c60,
501 		0x19c94, 0x19ce4,
502 		0x19cf0, 0x19d40,
503 		0x19d50, 0x19d94,
504 		0x19da0, 0x19de8,
505 		0x19df0, 0x19e10,
506 		0x19e50, 0x19e90,
507 		0x19ea0, 0x19f24,
508 		0x19f34, 0x19f34,
509 		0x19f40, 0x19f50,
510 		0x19f90, 0x19fb4,
511 		0x19fc4, 0x19fe4,
512 		0x1a000, 0x1a004,
513 		0x1a010, 0x1a06c,
514 		0x1a0b0, 0x1a0e4,
515 		0x1a0ec, 0x1a0f8,
516 		0x1a100, 0x1a108,
517 		0x1a114, 0x1a120,
518 		0x1a128, 0x1a130,
519 		0x1a138, 0x1a138,
520 		0x1a190, 0x1a1c4,
521 		0x1a1fc, 0x1a1fc,
522 		0x1e008, 0x1e00c,
523 		0x1e040, 0x1e044,
524 		0x1e04c, 0x1e04c,
525 		0x1e284, 0x1e290,
526 		0x1e2c0, 0x1e2c0,
527 		0x1e2e0, 0x1e2e0,
528 		0x1e300, 0x1e384,
529 		0x1e3c0, 0x1e3c8,
530 		0x1e408, 0x1e40c,
531 		0x1e440, 0x1e444,
532 		0x1e44c, 0x1e44c,
533 		0x1e684, 0x1e690,
534 		0x1e6c0, 0x1e6c0,
535 		0x1e6e0, 0x1e6e0,
536 		0x1e700, 0x1e784,
537 		0x1e7c0, 0x1e7c8,
538 		0x1e808, 0x1e80c,
539 		0x1e840, 0x1e844,
540 		0x1e84c, 0x1e84c,
541 		0x1ea84, 0x1ea90,
542 		0x1eac0, 0x1eac0,
543 		0x1eae0, 0x1eae0,
544 		0x1eb00, 0x1eb84,
545 		0x1ebc0, 0x1ebc8,
546 		0x1ec08, 0x1ec0c,
547 		0x1ec40, 0x1ec44,
548 		0x1ec4c, 0x1ec4c,
549 		0x1ee84, 0x1ee90,
550 		0x1eec0, 0x1eec0,
551 		0x1eee0, 0x1eee0,
552 		0x1ef00, 0x1ef84,
553 		0x1efc0, 0x1efc8,
554 		0x1f008, 0x1f00c,
555 		0x1f040, 0x1f044,
556 		0x1f04c, 0x1f04c,
557 		0x1f284, 0x1f290,
558 		0x1f2c0, 0x1f2c0,
559 		0x1f2e0, 0x1f2e0,
560 		0x1f300, 0x1f384,
561 		0x1f3c0, 0x1f3c8,
562 		0x1f408, 0x1f40c,
563 		0x1f440, 0x1f444,
564 		0x1f44c, 0x1f44c,
565 		0x1f684, 0x1f690,
566 		0x1f6c0, 0x1f6c0,
567 		0x1f6e0, 0x1f6e0,
568 		0x1f700, 0x1f784,
569 		0x1f7c0, 0x1f7c8,
570 		0x1f808, 0x1f80c,
571 		0x1f840, 0x1f844,
572 		0x1f84c, 0x1f84c,
573 		0x1fa84, 0x1fa90,
574 		0x1fac0, 0x1fac0,
575 		0x1fae0, 0x1fae0,
576 		0x1fb00, 0x1fb84,
577 		0x1fbc0, 0x1fbc8,
578 		0x1fc08, 0x1fc0c,
579 		0x1fc40, 0x1fc44,
580 		0x1fc4c, 0x1fc4c,
581 		0x1fe84, 0x1fe90,
582 		0x1fec0, 0x1fec0,
583 		0x1fee0, 0x1fee0,
584 		0x1ff00, 0x1ff84,
585 		0x1ffc0, 0x1ffc8,
586 		0x30000, 0x30030,
587 		0x30038, 0x30038,
588 		0x30040, 0x30040,
589 		0x30100, 0x30144,
590 		0x30190, 0x301a0,
591 		0x301a8, 0x301b8,
592 		0x301c4, 0x301c8,
593 		0x301d0, 0x301d0,
594 		0x30200, 0x30318,
595 		0x30400, 0x304b4,
596 		0x304c0, 0x3052c,
597 		0x30540, 0x3061c,
598 		0x30800, 0x30828,
599 		0x30834, 0x30834,
600 		0x308c0, 0x30908,
601 		0x30910, 0x309ac,
602 		0x30a00, 0x30a14,
603 		0x30a1c, 0x30a2c,
604 		0x30a44, 0x30a50,
605 		0x30a74, 0x30a74,
606 		0x30a7c, 0x30afc,
607 		0x30b08, 0x30c24,
608 		0x30d00, 0x30d00,
609 		0x30d08, 0x30d14,
610 		0x30d1c, 0x30d20,
611 		0x30d3c, 0x30d3c,
612 		0x30d48, 0x30d50,
613 		0x31200, 0x3120c,
614 		0x31220, 0x31220,
615 		0x31240, 0x31240,
616 		0x31600, 0x3160c,
617 		0x31a00, 0x31a1c,
618 		0x31e00, 0x31e20,
619 		0x31e38, 0x31e3c,
620 		0x31e80, 0x31e80,
621 		0x31e88, 0x31ea8,
622 		0x31eb0, 0x31eb4,
623 		0x31ec8, 0x31ed4,
624 		0x31fb8, 0x32004,
625 		0x32200, 0x32200,
626 		0x32208, 0x32240,
627 		0x32248, 0x32280,
628 		0x32288, 0x322c0,
629 		0x322c8, 0x322fc,
630 		0x32600, 0x32630,
631 		0x32a00, 0x32abc,
632 		0x32b00, 0x32b10,
633 		0x32b20, 0x32b30,
634 		0x32b40, 0x32b50,
635 		0x32b60, 0x32b70,
636 		0x33000, 0x33028,
637 		0x33030, 0x33048,
638 		0x33060, 0x33068,
639 		0x33070, 0x3309c,
640 		0x330f0, 0x33128,
641 		0x33130, 0x33148,
642 		0x33160, 0x33168,
643 		0x33170, 0x3319c,
644 		0x331f0, 0x33238,
645 		0x33240, 0x33240,
646 		0x33248, 0x33250,
647 		0x3325c, 0x33264,
648 		0x33270, 0x332b8,
649 		0x332c0, 0x332e4,
650 		0x332f8, 0x33338,
651 		0x33340, 0x33340,
652 		0x33348, 0x33350,
653 		0x3335c, 0x33364,
654 		0x33370, 0x333b8,
655 		0x333c0, 0x333e4,
656 		0x333f8, 0x33428,
657 		0x33430, 0x33448,
658 		0x33460, 0x33468,
659 		0x33470, 0x3349c,
660 		0x334f0, 0x33528,
661 		0x33530, 0x33548,
662 		0x33560, 0x33568,
663 		0x33570, 0x3359c,
664 		0x335f0, 0x33638,
665 		0x33640, 0x33640,
666 		0x33648, 0x33650,
667 		0x3365c, 0x33664,
668 		0x33670, 0x336b8,
669 		0x336c0, 0x336e4,
670 		0x336f8, 0x33738,
671 		0x33740, 0x33740,
672 		0x33748, 0x33750,
673 		0x3375c, 0x33764,
674 		0x33770, 0x337b8,
675 		0x337c0, 0x337e4,
676 		0x337f8, 0x337fc,
677 		0x33814, 0x33814,
678 		0x3382c, 0x3382c,
679 		0x33880, 0x3388c,
680 		0x338e8, 0x338ec,
681 		0x33900, 0x33928,
682 		0x33930, 0x33948,
683 		0x33960, 0x33968,
684 		0x33970, 0x3399c,
685 		0x339f0, 0x33a38,
686 		0x33a40, 0x33a40,
687 		0x33a48, 0x33a50,
688 		0x33a5c, 0x33a64,
689 		0x33a70, 0x33ab8,
690 		0x33ac0, 0x33ae4,
691 		0x33af8, 0x33b10,
692 		0x33b28, 0x33b28,
693 		0x33b3c, 0x33b50,
694 		0x33bf0, 0x33c10,
695 		0x33c28, 0x33c28,
696 		0x33c3c, 0x33c50,
697 		0x33cf0, 0x33cfc,
698 		0x34000, 0x34030,
699 		0x34038, 0x34038,
700 		0x34040, 0x34040,
701 		0x34100, 0x34144,
702 		0x34190, 0x341a0,
703 		0x341a8, 0x341b8,
704 		0x341c4, 0x341c8,
705 		0x341d0, 0x341d0,
706 		0x34200, 0x34318,
707 		0x34400, 0x344b4,
708 		0x344c0, 0x3452c,
709 		0x34540, 0x3461c,
710 		0x34800, 0x34828,
711 		0x34834, 0x34834,
712 		0x348c0, 0x34908,
713 		0x34910, 0x349ac,
714 		0x34a00, 0x34a14,
715 		0x34a1c, 0x34a2c,
716 		0x34a44, 0x34a50,
717 		0x34a74, 0x34a74,
718 		0x34a7c, 0x34afc,
719 		0x34b08, 0x34c24,
720 		0x34d00, 0x34d00,
721 		0x34d08, 0x34d14,
722 		0x34d1c, 0x34d20,
723 		0x34d3c, 0x34d3c,
724 		0x34d48, 0x34d50,
725 		0x35200, 0x3520c,
726 		0x35220, 0x35220,
727 		0x35240, 0x35240,
728 		0x35600, 0x3560c,
729 		0x35a00, 0x35a1c,
730 		0x35e00, 0x35e20,
731 		0x35e38, 0x35e3c,
732 		0x35e80, 0x35e80,
733 		0x35e88, 0x35ea8,
734 		0x35eb0, 0x35eb4,
735 		0x35ec8, 0x35ed4,
736 		0x35fb8, 0x36004,
737 		0x36200, 0x36200,
738 		0x36208, 0x36240,
739 		0x36248, 0x36280,
740 		0x36288, 0x362c0,
741 		0x362c8, 0x362fc,
742 		0x36600, 0x36630,
743 		0x36a00, 0x36abc,
744 		0x36b00, 0x36b10,
745 		0x36b20, 0x36b30,
746 		0x36b40, 0x36b50,
747 		0x36b60, 0x36b70,
748 		0x37000, 0x37028,
749 		0x37030, 0x37048,
750 		0x37060, 0x37068,
751 		0x37070, 0x3709c,
752 		0x370f0, 0x37128,
753 		0x37130, 0x37148,
754 		0x37160, 0x37168,
755 		0x37170, 0x3719c,
756 		0x371f0, 0x37238,
757 		0x37240, 0x37240,
758 		0x37248, 0x37250,
759 		0x3725c, 0x37264,
760 		0x37270, 0x372b8,
761 		0x372c0, 0x372e4,
762 		0x372f8, 0x37338,
763 		0x37340, 0x37340,
764 		0x37348, 0x37350,
765 		0x3735c, 0x37364,
766 		0x37370, 0x373b8,
767 		0x373c0, 0x373e4,
768 		0x373f8, 0x37428,
769 		0x37430, 0x37448,
770 		0x37460, 0x37468,
771 		0x37470, 0x3749c,
772 		0x374f0, 0x37528,
773 		0x37530, 0x37548,
774 		0x37560, 0x37568,
775 		0x37570, 0x3759c,
776 		0x375f0, 0x37638,
777 		0x37640, 0x37640,
778 		0x37648, 0x37650,
779 		0x3765c, 0x37664,
780 		0x37670, 0x376b8,
781 		0x376c0, 0x376e4,
782 		0x376f8, 0x37738,
783 		0x37740, 0x37740,
784 		0x37748, 0x37750,
785 		0x3775c, 0x37764,
786 		0x37770, 0x377b8,
787 		0x377c0, 0x377e4,
788 		0x377f8, 0x377fc,
789 		0x37814, 0x37814,
790 		0x3782c, 0x3782c,
791 		0x37880, 0x3788c,
792 		0x378e8, 0x378ec,
793 		0x37900, 0x37928,
794 		0x37930, 0x37948,
795 		0x37960, 0x37968,
796 		0x37970, 0x3799c,
797 		0x379f0, 0x37a38,
798 		0x37a40, 0x37a40,
799 		0x37a48, 0x37a50,
800 		0x37a5c, 0x37a64,
801 		0x37a70, 0x37ab8,
802 		0x37ac0, 0x37ae4,
803 		0x37af8, 0x37b10,
804 		0x37b28, 0x37b28,
805 		0x37b3c, 0x37b50,
806 		0x37bf0, 0x37c10,
807 		0x37c28, 0x37c28,
808 		0x37c3c, 0x37c50,
809 		0x37cf0, 0x37cfc,
810 		0x38000, 0x38030,
811 		0x38038, 0x38038,
812 		0x38040, 0x38040,
813 		0x38100, 0x38144,
814 		0x38190, 0x381a0,
815 		0x381a8, 0x381b8,
816 		0x381c4, 0x381c8,
817 		0x381d0, 0x381d0,
818 		0x38200, 0x38318,
819 		0x38400, 0x384b4,
820 		0x384c0, 0x3852c,
821 		0x38540, 0x3861c,
822 		0x38800, 0x38828,
823 		0x38834, 0x38834,
824 		0x388c0, 0x38908,
825 		0x38910, 0x389ac,
826 		0x38a00, 0x38a14,
827 		0x38a1c, 0x38a2c,
828 		0x38a44, 0x38a50,
829 		0x38a74, 0x38a74,
830 		0x38a7c, 0x38afc,
831 		0x38b08, 0x38c24,
832 		0x38d00, 0x38d00,
833 		0x38d08, 0x38d14,
834 		0x38d1c, 0x38d20,
835 		0x38d3c, 0x38d3c,
836 		0x38d48, 0x38d50,
837 		0x39200, 0x3920c,
838 		0x39220, 0x39220,
839 		0x39240, 0x39240,
840 		0x39600, 0x3960c,
841 		0x39a00, 0x39a1c,
842 		0x39e00, 0x39e20,
843 		0x39e38, 0x39e3c,
844 		0x39e80, 0x39e80,
845 		0x39e88, 0x39ea8,
846 		0x39eb0, 0x39eb4,
847 		0x39ec8, 0x39ed4,
848 		0x39fb8, 0x3a004,
849 		0x3a200, 0x3a200,
850 		0x3a208, 0x3a240,
851 		0x3a248, 0x3a280,
852 		0x3a288, 0x3a2c0,
853 		0x3a2c8, 0x3a2fc,
854 		0x3a600, 0x3a630,
855 		0x3aa00, 0x3aabc,
856 		0x3ab00, 0x3ab10,
857 		0x3ab20, 0x3ab30,
858 		0x3ab40, 0x3ab50,
859 		0x3ab60, 0x3ab70,
860 		0x3b000, 0x3b028,
861 		0x3b030, 0x3b048,
862 		0x3b060, 0x3b068,
863 		0x3b070, 0x3b09c,
864 		0x3b0f0, 0x3b128,
865 		0x3b130, 0x3b148,
866 		0x3b160, 0x3b168,
867 		0x3b170, 0x3b19c,
868 		0x3b1f0, 0x3b238,
869 		0x3b240, 0x3b240,
870 		0x3b248, 0x3b250,
871 		0x3b25c, 0x3b264,
872 		0x3b270, 0x3b2b8,
873 		0x3b2c0, 0x3b2e4,
874 		0x3b2f8, 0x3b338,
875 		0x3b340, 0x3b340,
876 		0x3b348, 0x3b350,
877 		0x3b35c, 0x3b364,
878 		0x3b370, 0x3b3b8,
879 		0x3b3c0, 0x3b3e4,
880 		0x3b3f8, 0x3b428,
881 		0x3b430, 0x3b448,
882 		0x3b460, 0x3b468,
883 		0x3b470, 0x3b49c,
884 		0x3b4f0, 0x3b528,
885 		0x3b530, 0x3b548,
886 		0x3b560, 0x3b568,
887 		0x3b570, 0x3b59c,
888 		0x3b5f0, 0x3b638,
889 		0x3b640, 0x3b640,
890 		0x3b648, 0x3b650,
891 		0x3b65c, 0x3b664,
892 		0x3b670, 0x3b6b8,
893 		0x3b6c0, 0x3b6e4,
894 		0x3b6f8, 0x3b738,
895 		0x3b740, 0x3b740,
896 		0x3b748, 0x3b750,
897 		0x3b75c, 0x3b764,
898 		0x3b770, 0x3b7b8,
899 		0x3b7c0, 0x3b7e4,
900 		0x3b7f8, 0x3b7fc,
901 		0x3b814, 0x3b814,
902 		0x3b82c, 0x3b82c,
903 		0x3b880, 0x3b88c,
904 		0x3b8e8, 0x3b8ec,
905 		0x3b900, 0x3b928,
906 		0x3b930, 0x3b948,
907 		0x3b960, 0x3b968,
908 		0x3b970, 0x3b99c,
909 		0x3b9f0, 0x3ba38,
910 		0x3ba40, 0x3ba40,
911 		0x3ba48, 0x3ba50,
912 		0x3ba5c, 0x3ba64,
913 		0x3ba70, 0x3bab8,
914 		0x3bac0, 0x3bae4,
915 		0x3baf8, 0x3bb10,
916 		0x3bb28, 0x3bb28,
917 		0x3bb3c, 0x3bb50,
918 		0x3bbf0, 0x3bc10,
919 		0x3bc28, 0x3bc28,
920 		0x3bc3c, 0x3bc50,
921 		0x3bcf0, 0x3bcfc,
922 		0x3c000, 0x3c030,
923 		0x3c038, 0x3c038,
924 		0x3c040, 0x3c040,
925 		0x3c100, 0x3c144,
926 		0x3c190, 0x3c1a0,
927 		0x3c1a8, 0x3c1b8,
928 		0x3c1c4, 0x3c1c8,
929 		0x3c1d0, 0x3c1d0,
930 		0x3c200, 0x3c318,
931 		0x3c400, 0x3c4b4,
932 		0x3c4c0, 0x3c52c,
933 		0x3c540, 0x3c61c,
934 		0x3c800, 0x3c828,
935 		0x3c834, 0x3c834,
936 		0x3c8c0, 0x3c908,
937 		0x3c910, 0x3c9ac,
938 		0x3ca00, 0x3ca14,
939 		0x3ca1c, 0x3ca2c,
940 		0x3ca44, 0x3ca50,
941 		0x3ca74, 0x3ca74,
942 		0x3ca7c, 0x3cafc,
943 		0x3cb08, 0x3cc24,
944 		0x3cd00, 0x3cd00,
945 		0x3cd08, 0x3cd14,
946 		0x3cd1c, 0x3cd20,
947 		0x3cd3c, 0x3cd3c,
948 		0x3cd48, 0x3cd50,
949 		0x3d200, 0x3d20c,
950 		0x3d220, 0x3d220,
951 		0x3d240, 0x3d240,
952 		0x3d600, 0x3d60c,
953 		0x3da00, 0x3da1c,
954 		0x3de00, 0x3de20,
955 		0x3de38, 0x3de3c,
956 		0x3de80, 0x3de80,
957 		0x3de88, 0x3dea8,
958 		0x3deb0, 0x3deb4,
959 		0x3dec8, 0x3ded4,
960 		0x3dfb8, 0x3e004,
961 		0x3e200, 0x3e200,
962 		0x3e208, 0x3e240,
963 		0x3e248, 0x3e280,
964 		0x3e288, 0x3e2c0,
965 		0x3e2c8, 0x3e2fc,
966 		0x3e600, 0x3e630,
967 		0x3ea00, 0x3eabc,
968 		0x3eb00, 0x3eb10,
969 		0x3eb20, 0x3eb30,
970 		0x3eb40, 0x3eb50,
971 		0x3eb60, 0x3eb70,
972 		0x3f000, 0x3f028,
973 		0x3f030, 0x3f048,
974 		0x3f060, 0x3f068,
975 		0x3f070, 0x3f09c,
976 		0x3f0f0, 0x3f128,
977 		0x3f130, 0x3f148,
978 		0x3f160, 0x3f168,
979 		0x3f170, 0x3f19c,
980 		0x3f1f0, 0x3f238,
981 		0x3f240, 0x3f240,
982 		0x3f248, 0x3f250,
983 		0x3f25c, 0x3f264,
984 		0x3f270, 0x3f2b8,
985 		0x3f2c0, 0x3f2e4,
986 		0x3f2f8, 0x3f338,
987 		0x3f340, 0x3f340,
988 		0x3f348, 0x3f350,
989 		0x3f35c, 0x3f364,
990 		0x3f370, 0x3f3b8,
991 		0x3f3c0, 0x3f3e4,
992 		0x3f3f8, 0x3f428,
993 		0x3f430, 0x3f448,
994 		0x3f460, 0x3f468,
995 		0x3f470, 0x3f49c,
996 		0x3f4f0, 0x3f528,
997 		0x3f530, 0x3f548,
998 		0x3f560, 0x3f568,
999 		0x3f570, 0x3f59c,
1000 		0x3f5f0, 0x3f638,
1001 		0x3f640, 0x3f640,
1002 		0x3f648, 0x3f650,
1003 		0x3f65c, 0x3f664,
1004 		0x3f670, 0x3f6b8,
1005 		0x3f6c0, 0x3f6e4,
1006 		0x3f6f8, 0x3f738,
1007 		0x3f740, 0x3f740,
1008 		0x3f748, 0x3f750,
1009 		0x3f75c, 0x3f764,
1010 		0x3f770, 0x3f7b8,
1011 		0x3f7c0, 0x3f7e4,
1012 		0x3f7f8, 0x3f7fc,
1013 		0x3f814, 0x3f814,
1014 		0x3f82c, 0x3f82c,
1015 		0x3f880, 0x3f88c,
1016 		0x3f8e8, 0x3f8ec,
1017 		0x3f900, 0x3f928,
1018 		0x3f930, 0x3f948,
1019 		0x3f960, 0x3f968,
1020 		0x3f970, 0x3f99c,
1021 		0x3f9f0, 0x3fa38,
1022 		0x3fa40, 0x3fa40,
1023 		0x3fa48, 0x3fa50,
1024 		0x3fa5c, 0x3fa64,
1025 		0x3fa70, 0x3fab8,
1026 		0x3fac0, 0x3fae4,
1027 		0x3faf8, 0x3fb10,
1028 		0x3fb28, 0x3fb28,
1029 		0x3fb3c, 0x3fb50,
1030 		0x3fbf0, 0x3fc10,
1031 		0x3fc28, 0x3fc28,
1032 		0x3fc3c, 0x3fc50,
1033 		0x3fcf0, 0x3fcfc,
1034 		0x40000, 0x4000c,
1035 		0x40040, 0x40050,
1036 		0x40060, 0x40068,
1037 		0x4007c, 0x4008c,
1038 		0x40094, 0x400b0,
1039 		0x400c0, 0x40144,
1040 		0x40180, 0x4018c,
1041 		0x40200, 0x40254,
1042 		0x40260, 0x40264,
1043 		0x40270, 0x40288,
1044 		0x40290, 0x40298,
1045 		0x402ac, 0x402c8,
1046 		0x402d0, 0x402e0,
1047 		0x402f0, 0x402f0,
1048 		0x40300, 0x4033c,
1049 		0x403f8, 0x403fc,
1050 		0x41304, 0x413c4,
1051 		0x41400, 0x4140c,
1052 		0x41414, 0x4141c,
1053 		0x41480, 0x414d0,
1054 		0x44000, 0x44054,
1055 		0x4405c, 0x44078,
1056 		0x440c0, 0x44174,
1057 		0x44180, 0x441ac,
1058 		0x441b4, 0x441b8,
1059 		0x441c0, 0x44254,
1060 		0x4425c, 0x44278,
1061 		0x442c0, 0x44374,
1062 		0x44380, 0x443ac,
1063 		0x443b4, 0x443b8,
1064 		0x443c0, 0x44454,
1065 		0x4445c, 0x44478,
1066 		0x444c0, 0x44574,
1067 		0x44580, 0x445ac,
1068 		0x445b4, 0x445b8,
1069 		0x445c0, 0x44654,
1070 		0x4465c, 0x44678,
1071 		0x446c0, 0x44774,
1072 		0x44780, 0x447ac,
1073 		0x447b4, 0x447b8,
1074 		0x447c0, 0x44854,
1075 		0x4485c, 0x44878,
1076 		0x448c0, 0x44974,
1077 		0x44980, 0x449ac,
1078 		0x449b4, 0x449b8,
1079 		0x449c0, 0x449fc,
1080 		0x45000, 0x45004,
1081 		0x45010, 0x45030,
1082 		0x45040, 0x45060,
1083 		0x45068, 0x45068,
1084 		0x45080, 0x45084,
1085 		0x450a0, 0x450b0,
1086 		0x45200, 0x45204,
1087 		0x45210, 0x45230,
1088 		0x45240, 0x45260,
1089 		0x45268, 0x45268,
1090 		0x45280, 0x45284,
1091 		0x452a0, 0x452b0,
1092 		0x460c0, 0x460e4,
1093 		0x47000, 0x4703c,
1094 		0x47044, 0x4708c,
1095 		0x47200, 0x47250,
1096 		0x47400, 0x47408,
1097 		0x47414, 0x47420,
1098 		0x47600, 0x47618,
1099 		0x47800, 0x47814,
1100 		0x48000, 0x4800c,
1101 		0x48040, 0x48050,
1102 		0x48060, 0x48068,
1103 		0x4807c, 0x4808c,
1104 		0x48094, 0x480b0,
1105 		0x480c0, 0x48144,
1106 		0x48180, 0x4818c,
1107 		0x48200, 0x48254,
1108 		0x48260, 0x48264,
1109 		0x48270, 0x48288,
1110 		0x48290, 0x48298,
1111 		0x482ac, 0x482c8,
1112 		0x482d0, 0x482e0,
1113 		0x482f0, 0x482f0,
1114 		0x48300, 0x4833c,
1115 		0x483f8, 0x483fc,
1116 		0x49304, 0x493c4,
1117 		0x49400, 0x4940c,
1118 		0x49414, 0x4941c,
1119 		0x49480, 0x494d0,
1120 		0x4c000, 0x4c054,
1121 		0x4c05c, 0x4c078,
1122 		0x4c0c0, 0x4c174,
1123 		0x4c180, 0x4c1ac,
1124 		0x4c1b4, 0x4c1b8,
1125 		0x4c1c0, 0x4c254,
1126 		0x4c25c, 0x4c278,
1127 		0x4c2c0, 0x4c374,
1128 		0x4c380, 0x4c3ac,
1129 		0x4c3b4, 0x4c3b8,
1130 		0x4c3c0, 0x4c454,
1131 		0x4c45c, 0x4c478,
1132 		0x4c4c0, 0x4c574,
1133 		0x4c580, 0x4c5ac,
1134 		0x4c5b4, 0x4c5b8,
1135 		0x4c5c0, 0x4c654,
1136 		0x4c65c, 0x4c678,
1137 		0x4c6c0, 0x4c774,
1138 		0x4c780, 0x4c7ac,
1139 		0x4c7b4, 0x4c7b8,
1140 		0x4c7c0, 0x4c854,
1141 		0x4c85c, 0x4c878,
1142 		0x4c8c0, 0x4c974,
1143 		0x4c980, 0x4c9ac,
1144 		0x4c9b4, 0x4c9b8,
1145 		0x4c9c0, 0x4c9fc,
1146 		0x4d000, 0x4d004,
1147 		0x4d010, 0x4d030,
1148 		0x4d040, 0x4d060,
1149 		0x4d068, 0x4d068,
1150 		0x4d080, 0x4d084,
1151 		0x4d0a0, 0x4d0b0,
1152 		0x4d200, 0x4d204,
1153 		0x4d210, 0x4d230,
1154 		0x4d240, 0x4d260,
1155 		0x4d268, 0x4d268,
1156 		0x4d280, 0x4d284,
1157 		0x4d2a0, 0x4d2b0,
1158 		0x4e0c0, 0x4e0e4,
1159 		0x4f000, 0x4f03c,
1160 		0x4f044, 0x4f08c,
1161 		0x4f200, 0x4f250,
1162 		0x4f400, 0x4f408,
1163 		0x4f414, 0x4f420,
1164 		0x4f600, 0x4f618,
1165 		0x4f800, 0x4f814,
1166 		0x50000, 0x50084,
1167 		0x50090, 0x500cc,
1168 		0x50400, 0x50400,
1169 		0x50800, 0x50884,
1170 		0x50890, 0x508cc,
1171 		0x50c00, 0x50c00,
1172 		0x51000, 0x5101c,
1173 		0x51300, 0x51308,
1174 	};
1175 
1176 	if (ddi_copyin(data, &r, sizeof (r), flags) < 0)
1177 		return (EFAULT);
1178 
1179 	if (r.len > T4_REGDUMP_SIZE)
1180 		r.len = T4_REGDUMP_SIZE;
1181 	else if (r.len < T4_REGDUMP_SIZE)
1182 		return (E2BIG);
1183 
1184 	r.version = mk_adap_vers(sc);
1185 
1186 	if (is_t4(sc->params.chip)) {
1187 		reg_ranges = &t4_reg_ranges[0];
1188 		arr_size = ARRAY_SIZE(t4_reg_ranges);
1189 		buf_size = T4_REGDUMP_SIZE;
1190 	} else {
1191 		reg_ranges = &t5_reg_ranges[0];
1192 		arr_size = ARRAY_SIZE(t5_reg_ranges);
1193 		buf_size = T5_REGDUMP_SIZE;
1194 	}
1195 
1196 	buf = kmem_zalloc(buf_size, KM_SLEEP);
1197 	if (buf == NULL)
1198 		return (ENOMEM);
1199 
1200 	for (i = 0; i < arr_size; i += 2)
1201 		reg_block_dump(sc, buf, reg_ranges[i], reg_ranges[i + 1]);
1202 
1203 	if (ddi_copyout(buf, r.data, r.len, flags) < 0)
1204 		rc = EFAULT;
1205 
1206 	if (rc == 0 && ddi_copyout(&r, data, sizeof (r), flags) < 0)
1207 		rc = EFAULT;
1208 
1209 	kmem_free(buf, buf_size);
1210 	return (rc);
1211 }
1212 
1213 static int
get_sge_context(struct adapter * sc,void * data,int flags)1214 get_sge_context(struct adapter *sc, void *data, int flags)
1215 {
1216 	struct t4_sge_context sgec;
1217 	uint32_t buff[SGE_CTXT_SIZE / 4];
1218 	int rc = 0;
1219 
1220 	if (ddi_copyin(data, &sgec, sizeof (sgec), flags) < 0) {
1221 		rc = EFAULT;
1222 		goto _exit;
1223 	}
1224 
1225 	if (sgec.len < SGE_CTXT_SIZE || sgec.addr > M_CTXTQID) {
1226 		rc = EINVAL;
1227 		goto _exit;
1228 	}
1229 
1230 	if ((sgec.mem_id != T4_CTXT_EGRESS) && (sgec.mem_id != T4_CTXT_FLM) &&
1231 	    (sgec.mem_id != T4_CTXT_INGRESS)) {
1232 		rc = EINVAL;
1233 		goto _exit;
1234 	}
1235 
1236 	rc = (sc->flags & FW_OK) ?
1237 	    -t4_sge_ctxt_rd(sc, sc->mbox, sgec.addr, sgec.mem_id, buff) :
1238 	    -t4_sge_ctxt_rd_bd(sc, sgec.addr, sgec.mem_id, buff);
1239 	if (rc != 0)
1240 		goto _exit;
1241 
1242 	sgec.version = 4 | (sc->params.chip << 10);
1243 
1244 	/* copyout data and then t4_sge_context */
1245 	rc = ddi_copyout(buff, sgec.data, sgec.len, flags);
1246 	if (rc == 0)
1247 		rc = ddi_copyout(&sgec, data, sizeof (sgec), flags);
1248 	/* if ddi_copyout fails, return EFAULT - for either of the two */
1249 	if (rc != 0)
1250 		rc = EFAULT;
1251 
1252 _exit:
1253 	return (rc);
1254 }
1255 
1256 static int
read_tid_tab(struct adapter * sc,void * data,int flags)1257 read_tid_tab(struct adapter *sc, void *data, int flags)
1258 {
1259 	struct t4_tid_info t4tid;
1260 	uint32_t *buf, *b;
1261 	struct tid_info *t = &sc->tids;
1262 	int rc = 0;
1263 
1264 	if (ddi_copyin(data, &t4tid, sizeof (t4tid), flags) < 0) {
1265 		rc = EFAULT;
1266 		goto _exit;
1267 	}
1268 
1269 	buf = b = kmem_zalloc(t4tid.len, KM_NOSLEEP);
1270 	if (buf == NULL) {
1271 		rc = ENOMEM;
1272 		goto _exit;
1273 	}
1274 
1275 	*b++ = t->tids_in_use;
1276 	*b++ = t->atids_in_use;
1277 	*b = t->stids_in_use;
1278 
1279 	if (ddi_copyout(buf, t4tid.data, t4tid.len, flags) < 0)
1280 		rc = EFAULT;
1281 
1282 	kmem_free(buf, t4tid.len);
1283 
1284 _exit:
1285 	return (rc);
1286 }
1287 
1288 /*
1289  * Verify that the memory range specified by the addr/len pair is valid and lies
1290  * entirely within a single region (EDCx or MCx).
1291  */
1292 static int
validate_mem_range(struct adapter * sc,uint32_t addr,int len)1293 validate_mem_range(struct adapter *sc, uint32_t addr, int len)
1294 {
1295 	uint32_t em, addr_len, maddr, mlen;
1296 
1297 	/* Memory can only be accessed in naturally aligned 4 byte units */
1298 	if (addr & 3 || len & 3 || len == 0)
1299 		return (EINVAL);
1300 
1301 	/* Enabled memories */
1302 	em = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
1303 	if (em & F_EDRAM0_ENABLE) {
1304 		addr_len = t4_read_reg(sc, A_MA_EDRAM0_BAR);
1305 		maddr = G_EDRAM0_BASE(addr_len) << 20;
1306 		mlen = G_EDRAM0_SIZE(addr_len) << 20;
1307 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1308 				addr + len <= maddr + mlen)
1309 			return (0);
1310 	}
1311 	if (em & F_EDRAM1_ENABLE) {
1312 		addr_len = t4_read_reg(sc, A_MA_EDRAM1_BAR);
1313 		maddr = G_EDRAM1_BASE(addr_len) << 20;
1314 		mlen = G_EDRAM1_SIZE(addr_len) << 20;
1315 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1316 				addr + len <= maddr + mlen)
1317 			return (0);
1318 	}
1319 	if (em & F_EXT_MEM_ENABLE) {
1320 		addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
1321 		maddr = G_EXT_MEM_BASE(addr_len) << 20;
1322 		mlen = G_EXT_MEM_SIZE(addr_len) << 20;
1323 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1324 				addr + len <= maddr + mlen)
1325 			return (0);
1326 	}
1327 	if (!is_t4(sc->params.chip) && em & F_EXT_MEM1_ENABLE) {
1328 		addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
1329 		maddr = G_EXT_MEM1_BASE(addr_len) << 20;
1330 		mlen = G_EXT_MEM1_SIZE(addr_len) << 20;
1331 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1332 				addr + len <= maddr + mlen)
1333 			return (0);
1334 	}
1335 
1336 	return (EFAULT);
1337 }
1338 
1339 static int
read_card_mem(struct adapter * sc,void * data,int flags)1340 read_card_mem(struct adapter *sc, void *data, int flags)
1341 {
1342 	struct t4_mem_range mr;
1343 	uint32_t addr, off, remaining, i, n;
1344 	uint32_t *buf, *b;
1345 	int rc = 0;
1346 	uint32_t mw_base, mw_aperture;
1347 	uint8_t *dst;
1348 
1349 	if (ddi_copyin(data, &mr, sizeof (mr), flags) < 0) {
1350 		rc = EFAULT;
1351 		goto _exit;
1352 	}
1353 
1354 	rc = validate_mem_range(sc, mr.addr, mr.len);
1355 	if (rc != 0)
1356 		return (rc);
1357 
1358 	memwin_info(sc, 2, &mw_base, &mw_aperture);
1359 	buf = b = kmem_zalloc(min(mr.len, mw_aperture), KM_NOSLEEP);
1360 	if (buf == NULL) {
1361 		rc = ENOMEM;
1362 		goto _exit;
1363 	}
1364 
1365 	addr = mr.addr;
1366 	remaining = mr.len;
1367 	dst = (void *)mr.data;
1368 
1369 	while (remaining) {
1370 		off = position_memwin(sc, 2, addr);
1371 
1372 		/* number of bytes that we'll copy in the inner loop */
1373 		n = min(remaining, mw_aperture - off);
1374 
1375 		for (i = 0; i < n; i += 4)
1376 			*b++ = t4_read_reg(sc, mw_base + off + i);
1377 		rc = ddi_copyout(buf, dst, n, flags);
1378 		if (rc != 0) {
1379 			rc = EFAULT;
1380 			break;
1381 		}
1382 
1383 		b = buf;
1384 		dst += n;
1385 		remaining -= n;
1386 		addr += n;
1387 	}
1388 
1389 	kmem_free(buf, min(mr.len, mw_aperture));
1390 _exit:
1391 	return (rc);
1392 }
1393 
1394 static int
get_devlog(struct adapter * sc,void * data,int flags)1395 get_devlog(struct adapter *sc, void *data, int flags)
1396 {
1397 	struct devlog_params *dparams = &sc->params.devlog;
1398 	struct fw_devlog_e *buf;
1399 	struct t4_devlog dl;
1400 	int rc = 0;
1401 
1402 	if (ddi_copyin(data, &dl, sizeof (dl), flags) < 0) {
1403 		rc = EFAULT;
1404 		goto done;
1405 	}
1406 
1407 	if (dparams->start == 0) {
1408 		dparams->memtype = 0;
1409 		dparams->start = 0x84000;
1410 		dparams->size = 32768;
1411 	}
1412 
1413 	if (dl.len < dparams->size) {
1414 		dl.len = dparams->size;
1415 		rc = ddi_copyout(&dl, data, sizeof (dl), flags);
1416 		/*
1417 		 * rc = 0 indicates copyout was successful, then return ENOBUFS
1418 		 * to indicate that the buffer size was not enough. Return of
1419 		 * EFAULT indicates that the copyout was not successful.
1420 		 */
1421 		rc = (rc == 0) ? ENOBUFS : EFAULT;
1422 		goto done;
1423 	}
1424 
1425 	buf = kmem_zalloc(dparams->size, KM_NOSLEEP);
1426 	if (buf == NULL) {
1427 		rc = ENOMEM;
1428 		goto done;
1429 	}
1430 
1431 	rc = -t4_memory_rw(sc, sc->params.drv_memwin, dparams->memtype,
1432 			   dparams->start, dparams->size, (void *)buf,
1433 			   T4_MEMORY_READ);
1434 	if (rc != 0)
1435 		goto done1;
1436 
1437 	/* Copyout device log buffer and then carrier buffer */
1438 	if (ddi_copyout(buf, (void *)((uintptr_t)data + sizeof(dl)), dl.len,
1439 	    flags) < 0)
1440 		rc = EFAULT;
1441 
1442 	if (ddi_copyout(&dl, data, sizeof(dl), flags) < 0)
1443 		rc = EFAULT;
1444 
1445 done1:
1446 	kmem_free(buf, dparams->size);
1447 
1448 done:
1449 	return (rc);
1450 }
1451 
1452 static int
read_cim_qcfg(struct adapter * sc,void * data,int flags)1453 read_cim_qcfg(struct adapter *sc, void *data, int flags)
1454 {
1455 	struct t4_cim_qcfg t4cimqcfg;
1456 	int rc = 0;
1457 	unsigned int ibq_rdaddr, obq_rdaddr, nq;
1458 
1459 	if (ddi_copyin(data, &t4cimqcfg, sizeof (t4cimqcfg), flags) < 0) {
1460 		rc = EFAULT;
1461 		goto _exit;
1462 	}
1463 
1464         if (is_t4(sc->params.chip)) {
1465 		t4cimqcfg.num_obq = CIM_NUM_OBQ;
1466                 ibq_rdaddr = A_UP_IBQ_0_RDADDR;
1467                 obq_rdaddr = A_UP_OBQ_0_REALADDR;
1468         } else {
1469                 t4cimqcfg.num_obq = CIM_NUM_OBQ_T5;
1470                 ibq_rdaddr = A_UP_IBQ_0_SHADOW_RDADDR;
1471                 obq_rdaddr = A_UP_OBQ_0_SHADOW_REALADDR;
1472         }
1473 	nq = CIM_NUM_IBQ + t4cimqcfg.num_obq;
1474 
1475 	rc = -t4_cim_read(sc, ibq_rdaddr, 4 * nq, t4cimqcfg.stat);
1476 	if (rc == 0)
1477 		rc = -t4_cim_read(sc, obq_rdaddr, 2 * t4cimqcfg.num_obq,
1478 		    t4cimqcfg.obq_wr);
1479 	if (rc != 0)
1480 		return (rc);
1481 
1482 	t4_read_cimq_cfg(sc, t4cimqcfg.base, t4cimqcfg.size, t4cimqcfg.thres);
1483 
1484 	if (ddi_copyout(&t4cimqcfg, data, sizeof (t4cimqcfg), flags) < 0)
1485 		rc = EFAULT;
1486 
1487 _exit:
1488 	return (rc);
1489 }
1490 
1491 static int
read_edc(struct adapter * sc,void * data,int flags)1492 read_edc(struct adapter *sc, void *data, int flags)
1493 {
1494 	struct t4_edc t4edc;
1495 	int rc = 0;
1496 	u32 count, pos = 0;
1497 	u32 memoffset;
1498 	__be32 *edc = NULL;
1499 
1500 	if (ddi_copyin(data, &t4edc, sizeof (t4edc), flags) < 0) {
1501 		rc = EFAULT;
1502 		goto _exit;
1503 	}
1504 
1505 	if (t4edc.mem > 2)
1506 		goto _exit;
1507 
1508 	edc = kmem_zalloc(t4edc.len, KM_NOSLEEP);
1509 	if (edc == NULL) {
1510 		rc = ENOMEM;
1511 		goto _exit;
1512 	}
1513 	/*
1514 	 * Offset into the region of memory which is being accessed
1515 	 * MEM_EDC0 = 0
1516 	 * MEM_EDC1 = 1
1517 	 * MEM_MC   = 2
1518 	 */
1519 	memoffset = (t4edc.mem * (5 * 1024 * 1024));
1520 	count = t4edc.len;
1521 	pos = t4edc.pos;
1522 
1523 	while (count) {
1524 		u32 len;
1525 
1526 		rc = t4_memory_rw(sc, sc->params.drv_memwin, memoffset, pos,
1527 				  count, edc, T4_MEMORY_READ);
1528 		if (rc != 0) {
1529 			kmem_free(edc, t4edc.len);
1530 			goto _exit;
1531 		}
1532 
1533 		len = MEMWIN0_APERTURE;
1534 		pos += len;
1535 		count -= len;
1536 	}
1537 
1538 	if (ddi_copyout(edc, t4edc.data, t4edc.len, flags) < 0)
1539 		rc = EFAULT;
1540 
1541 	kmem_free(edc, t4edc.len);
1542 _exit:
1543 	return (rc);
1544 }
1545 
1546 static int
read_cim_ibq(struct adapter * sc,void * data,int flags)1547 read_cim_ibq(struct adapter *sc, void *data, int flags)
1548 {
1549 	struct t4_ibq t4ibq;
1550 	int rc = 0;
1551 	__be64 *buf;
1552 
1553 	if (ddi_copyin(data, &t4ibq, sizeof (t4ibq), flags) < 0) {
1554 		rc = EFAULT;
1555 		goto _exit;
1556 	}
1557 
1558 	buf = kmem_zalloc(t4ibq.len, KM_NOSLEEP);
1559 	if (buf == NULL) {
1560 		rc = ENOMEM;
1561 		goto _exit;
1562 	}
1563 
1564 	rc = t4_read_cim_ibq(sc, 3, (u32 *)buf, CIM_IBQ_SIZE * 4);
1565 	if (rc < 0) {
1566 		kmem_free(buf, t4ibq.len);
1567 		return (rc);
1568 	} else
1569 		rc = 0;
1570 
1571 	if (ddi_copyout(buf, t4ibq.data, t4ibq.len, flags) < 0)
1572 		rc = EFAULT;
1573 
1574 	kmem_free(buf, t4ibq.len);
1575 
1576 _exit:
1577 	return (rc);
1578 }
1579 
1580 static int
read_cim_la(struct adapter * sc,void * data,int flags)1581 read_cim_la(struct adapter *sc, void *data, int flags)
1582 {
1583 	struct t4_cim_la t4cimla;
1584 	int rc = 0;
1585 	unsigned int cfg;
1586 	__be64 *buf;
1587 
1588 	rc = t4_cim_read(sc, A_UP_UP_DBG_LA_CFG, 1, &cfg);
1589 	if (rc != 0)
1590 		return (rc);
1591 
1592 	if (ddi_copyin(data, &t4cimla, sizeof (t4cimla), flags) < 0) {
1593 		rc = EFAULT;
1594 		goto _exit;
1595 	}
1596 
1597 	buf = kmem_zalloc(t4cimla.len, KM_NOSLEEP);
1598 	if (buf == NULL) {
1599 		rc = ENOMEM;
1600 		goto _exit;
1601 	}
1602 
1603 	rc = t4_cim_read_la(sc, (u32 *)buf, NULL);
1604 	if (rc != 0) {
1605 		kmem_free(buf, t4cimla.len);
1606 		return (rc);
1607 	}
1608 
1609 	if (ddi_copyout(buf, t4cimla.data, t4cimla.len, flags) < 0)
1610 		rc = EFAULT;
1611 
1612 	kmem_free(buf, t4cimla.len);
1613 
1614 _exit:
1615 	return (rc);
1616 }
1617 
1618 static int
read_mbox(struct adapter * sc,void * data,int flags)1619 read_mbox(struct adapter *sc, void *data, int flags)
1620 {
1621 	struct t4_mbox t4mbox;
1622 	int rc = 0, i;
1623 	__be64 *p, *buf;
1624 
1625 	u32 data_reg = PF_REG(4, A_CIM_PF_MAILBOX_DATA);
1626 
1627 	if (ddi_copyin(data, &t4mbox, sizeof (t4mbox), flags) < 0) {
1628 		rc = EFAULT;
1629 		goto _exit;
1630 	}
1631 
1632 	buf = p = kmem_zalloc(t4mbox.len, KM_NOSLEEP);
1633 	if (buf == NULL) {
1634 		rc = ENOMEM;
1635 		goto _exit;
1636 	}
1637 
1638 	for (i = 0; i < t4mbox.len; i += 8, p++)
1639 		*p =  t4_read_reg64(sc, data_reg + i);
1640 
1641 	if (ddi_copyout(buf, t4mbox.data, t4mbox.len, flags) < 0)
1642 		rc = EFAULT;
1643 
1644 	kmem_free(buf, t4mbox.len);
1645 
1646 _exit:
1647 	return (rc);
1648 }
1649 
1650 static int
flash_fw(struct adapter * sc,void * data,int flags)1651 flash_fw(struct adapter *sc, void *data, int flags)
1652 {
1653 	unsigned int mbox = M_PCIE_FW_MASTER + 1;
1654 	struct t4_ldfw fw;
1655 	u8 *ptr = NULL;
1656 	int rc = 0;
1657 
1658 	if (ddi_copyin(data, &fw, sizeof(struct t4_ldfw), flags) < 0)
1659 		return EFAULT;
1660 
1661 	if (!fw.len)
1662 		return EINVAL;
1663 
1664 	ptr = (u8 *)kmem_zalloc(fw.len, KM_NOSLEEP);
1665 	if (ptr == NULL)
1666 		return ENOMEM;
1667 
1668 	if (ddi_copyin((void *)((uintptr_t)data + sizeof(fw)), ptr, fw.len,
1669 	    flags) < 0) {
1670 		kmem_free(ptr, fw.len);
1671 		return EFAULT;
1672 	}
1673 
1674 	if (sc->flags & FULL_INIT_DONE)
1675 		mbox = sc->mbox;
1676 
1677 	rc = -t4_fw_upgrade(sc, mbox, ptr, fw.len, true);
1678 	ddi_ufm_update(sc->ufm_hdl);
1679 
1680 	kmem_free(ptr, fw.len);
1681 
1682 	return (rc);
1683 }
1684 
1685 static int
get_cudbg(struct adapter * sc,void * data,int flags)1686 get_cudbg(struct adapter *sc, void *data, int flags)
1687 {
1688 	struct t4_cudbg_dump dump;
1689 	struct cudbg_init *cudbg;
1690 	void *handle, *buf;
1691 	int size;
1692 	int rc = 0;
1693 
1694 	if (ddi_copyin(data, &dump, sizeof(struct t4_cudbg_dump), flags) < 0)
1695 		return EFAULT;
1696 
1697 	size = dump.len;
1698 	buf = (u8 *)kmem_zalloc(dump.len, KM_NOSLEEP);
1699 	if (buf == NULL)
1700 		return ENOMEM;
1701 
1702 	handle = cudbg_alloc_handle();
1703 	if (handle == NULL) {
1704 		rc = ENOMEM;
1705 		goto free;
1706 	}
1707 
1708 	cudbg = cudbg_get_init(handle);
1709 	cudbg->adap = sc;
1710 	cudbg->print = cxgb_printf;
1711 
1712 	memcpy(cudbg->dbg_bitmap, dump.bitmap, sizeof(cudbg->dbg_bitmap));
1713 
1714 	rc = cudbg_collect(handle, buf, &dump.len);
1715 	if (rc != 0) {
1716 		cxgb_printf(sc->dip, CE_WARN, "cudbg collect failed\n");
1717 		goto exit;
1718 	}
1719 
1720 	if(ddi_copyout(buf, (void *)((uintptr_t)data + sizeof(dump)),
1721 	   dump.len, flags) < 0){
1722 		rc = EFAULT;
1723 	}
1724 
1725 	if (ddi_copyout(&dump, data, sizeof(dump), flags) < 0){
1726 		rc = EFAULT;
1727 	}
1728 exit:
1729 	cudbg_free_handle(handle);
1730 free:
1731 	kmem_free(buf, size);
1732 
1733 	return rc;
1734 }
1735