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