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