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