|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 2008 Michael Brown <[email protected]>. ! 3: * ! 4: * This program is free software; you can redistribute it and/or ! 5: * modify it under the terms of the GNU General Public License as ! 6: * published by the Free Software Foundation; either version 2 of the ! 7: * License, or any later version. ! 8: * ! 9: * This program is distributed in the hope that it will be useful, but ! 10: * WITHOUT ANY WARRANTY; without even the implied warranty of ! 11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 12: * General Public License for more details. ! 13: * ! 14: * You should have received a copy of the GNU General Public License ! 15: * along with this program; if not, write to the Free Software ! 16: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 17: */ ! 18: ! 19: FILE_LICENCE ( GPL2_OR_LATER ); ! 20: ! 21: #include <stdint.h> ! 22: #include <stdlib.h> ! 23: #include <errno.h> ! 24: #include <unistd.h> ! 25: #include <assert.h> ! 26: #include <ipxe/io.h> ! 27: #include <ipxe/pci.h> ! 28: #include <ipxe/infiniband.h> ! 29: #include <ipxe/i2c.h> ! 30: #include <ipxe/bitbash.h> ! 31: #include <ipxe/malloc.h> ! 32: #include <ipxe/iobuf.h> ! 33: #include "linda.h" ! 34: ! 35: /** ! 36: * @file ! 37: * ! 38: * QLogic Linda Infiniband HCA ! 39: * ! 40: */ ! 41: ! 42: /** A Linda send work queue */ ! 43: struct linda_send_work_queue { ! 44: /** Send buffer usage */ ! 45: uint8_t *send_buf; ! 46: /** Producer index */ ! 47: unsigned int prod; ! 48: /** Consumer index */ ! 49: unsigned int cons; ! 50: }; ! 51: ! 52: /** A Linda receive work queue */ ! 53: struct linda_recv_work_queue { ! 54: /** Receive header ring */ ! 55: void *header; ! 56: /** Receive header producer offset (written by hardware) */ ! 57: struct QIB_7220_scalar header_prod; ! 58: /** Receive header consumer offset */ ! 59: unsigned int header_cons; ! 60: /** Offset within register space of the eager array */ ! 61: unsigned long eager_array; ! 62: /** Number of entries in eager array */ ! 63: unsigned int eager_entries; ! 64: /** Eager array producer index */ ! 65: unsigned int eager_prod; ! 66: /** Eager array consumer index */ ! 67: unsigned int eager_cons; ! 68: }; ! 69: ! 70: /** A Linda HCA */ ! 71: struct linda { ! 72: /** Registers */ ! 73: void *regs; ! 74: ! 75: /** In-use contexts */ ! 76: uint8_t used_ctx[LINDA_NUM_CONTEXTS]; ! 77: /** Send work queues */ ! 78: struct linda_send_work_queue send_wq[LINDA_NUM_CONTEXTS]; ! 79: /** Receive work queues */ ! 80: struct linda_recv_work_queue recv_wq[LINDA_NUM_CONTEXTS]; ! 81: ! 82: /** Offset within register space of the first send buffer */ ! 83: unsigned long send_buffer_base; ! 84: /** Send buffer availability (reported by hardware) */ ! 85: struct QIB_7220_SendBufAvail *sendbufavail; ! 86: /** Send buffer availability (maintained by software) */ ! 87: uint8_t send_buf[LINDA_MAX_SEND_BUFS]; ! 88: /** Send buffer availability producer counter */ ! 89: unsigned int send_buf_prod; ! 90: /** Send buffer availability consumer counter */ ! 91: unsigned int send_buf_cons; ! 92: /** Number of reserved send buffers (across all QPs) */ ! 93: unsigned int reserved_send_bufs; ! 94: ! 95: /** I2C bit-bashing interface */ ! 96: struct i2c_bit_basher i2c; ! 97: /** I2C serial EEPROM */ ! 98: struct i2c_device eeprom; ! 99: }; ! 100: ! 101: /*************************************************************************** ! 102: * ! 103: * Linda register access ! 104: * ! 105: *************************************************************************** ! 106: * ! 107: * This card requires atomic 64-bit accesses. Strange things happen ! 108: * if you try to use 32-bit accesses; sometimes they work, sometimes ! 109: * they don't, sometimes you get random data. ! 110: * ! 111: * These accessors use the "movq" MMX instruction, and so won't work ! 112: * on really old Pentiums (which won't have PCIe anyway, so this is ! 113: * something of a moot point). ! 114: */ ! 115: ! 116: /** ! 117: * Read Linda qword register ! 118: * ! 119: * @v linda Linda device ! 120: * @v dwords Register buffer to read into ! 121: * @v offset Register offset ! 122: */ ! 123: static void linda_readq ( struct linda *linda, uint32_t *dwords, ! 124: unsigned long offset ) { ! 125: void *addr = ( linda->regs + offset ); ! 126: ! 127: __asm__ __volatile__ ( "movq (%1), %%mm0\n\t" ! 128: "movq %%mm0, (%0)\n\t" ! 129: : : "r" ( dwords ), "r" ( addr ) : "memory" ); ! 130: ! 131: DBGIO ( "[%08lx] => %08x%08x\n", ! 132: virt_to_phys ( addr ), dwords[1], dwords[0] ); ! 133: } ! 134: #define linda_readq( _linda, _ptr, _offset ) \ ! 135: linda_readq ( (_linda), (_ptr)->u.dwords, (_offset) ) ! 136: #define linda_readq_array8b( _linda, _ptr, _offset, _idx ) \ ! 137: linda_readq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) ) ! 138: #define linda_readq_array64k( _linda, _ptr, _offset, _idx ) \ ! 139: linda_readq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 65536 ) ) ) ! 140: ! 141: /** ! 142: * Write Linda qword register ! 143: * ! 144: * @v linda Linda device ! 145: * @v dwords Register buffer to write ! 146: * @v offset Register offset ! 147: */ ! 148: static void linda_writeq ( struct linda *linda, const uint32_t *dwords, ! 149: unsigned long offset ) { ! 150: void *addr = ( linda->regs + offset ); ! 151: ! 152: DBGIO ( "[%08lx] <= %08x%08x\n", ! 153: virt_to_phys ( addr ), dwords[1], dwords[0] ); ! 154: ! 155: __asm__ __volatile__ ( "movq (%0), %%mm0\n\t" ! 156: "movq %%mm0, (%1)\n\t" ! 157: : : "r" ( dwords ), "r" ( addr ) : "memory" ); ! 158: } ! 159: #define linda_writeq( _linda, _ptr, _offset ) \ ! 160: linda_writeq ( (_linda), (_ptr)->u.dwords, (_offset) ) ! 161: #define linda_writeq_array8b( _linda, _ptr, _offset, _idx ) \ ! 162: linda_writeq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) ) ! 163: #define linda_writeq_array64k( _linda, _ptr, _offset, _idx ) \ ! 164: linda_writeq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 65536 ) ) ) ! 165: ! 166: /** ! 167: * Write Linda dword register ! 168: * ! 169: * @v linda Linda device ! 170: * @v dword Value to write ! 171: * @v offset Register offset ! 172: */ ! 173: static void linda_writel ( struct linda *linda, uint32_t dword, ! 174: unsigned long offset ) { ! 175: writel ( dword, ( linda->regs + offset ) ); ! 176: } ! 177: ! 178: /*************************************************************************** ! 179: * ! 180: * Link state management ! 181: * ! 182: *************************************************************************** ! 183: */ ! 184: ! 185: /** ! 186: * Textual representation of link state ! 187: * ! 188: * @v link_state Link state ! 189: * @ret link_text Link state text ! 190: */ ! 191: static const char * linda_link_state_text ( unsigned int link_state ) { ! 192: switch ( link_state ) { ! 193: case LINDA_LINK_STATE_DOWN: return "DOWN"; ! 194: case LINDA_LINK_STATE_INIT: return "INIT"; ! 195: case LINDA_LINK_STATE_ARM: return "ARM"; ! 196: case LINDA_LINK_STATE_ACTIVE: return "ACTIVE"; ! 197: case LINDA_LINK_STATE_ACT_DEFER:return "ACT_DEFER"; ! 198: default: return "UNKNOWN"; ! 199: } ! 200: } ! 201: ! 202: /** ! 203: * Handle link state change ! 204: * ! 205: * @v linda Linda device ! 206: */ ! 207: static void linda_link_state_changed ( struct ib_device *ibdev ) { ! 208: struct linda *linda = ib_get_drvdata ( ibdev ); ! 209: struct QIB_7220_IBCStatus ibcstatus; ! 210: struct QIB_7220_EXTCtrl extctrl; ! 211: unsigned int link_state; ! 212: unsigned int link_width; ! 213: unsigned int link_speed; ! 214: ! 215: /* Read link state */ ! 216: linda_readq ( linda, &ibcstatus, QIB_7220_IBCStatus_offset ); ! 217: link_state = BIT_GET ( &ibcstatus, LinkState ); ! 218: link_width = BIT_GET ( &ibcstatus, LinkWidthActive ); ! 219: link_speed = BIT_GET ( &ibcstatus, LinkSpeedActive ); ! 220: DBGC ( linda, "Linda %p link state %s (%s %s)\n", linda, ! 221: linda_link_state_text ( link_state ), ! 222: ( link_speed ? "DDR" : "SDR" ), ( link_width ? "x4" : "x1" ) ); ! 223: ! 224: /* Set LEDs according to link state */ ! 225: linda_readq ( linda, &extctrl, QIB_7220_EXTCtrl_offset ); ! 226: BIT_SET ( &extctrl, LEDPriPortGreenOn, ! 227: ( ( link_state >= LINDA_LINK_STATE_INIT ) ? 1 : 0 ) ); ! 228: BIT_SET ( &extctrl, LEDPriPortYellowOn, ! 229: ( ( link_state >= LINDA_LINK_STATE_ACTIVE ) ? 1 : 0 ) ); ! 230: linda_writeq ( linda, &extctrl, QIB_7220_EXTCtrl_offset ); ! 231: ! 232: /* Notify Infiniband core of link state change */ ! 233: ibdev->port_state = ( link_state + 1 ); ! 234: ibdev->link_width_active = ! 235: ( link_width ? IB_LINK_WIDTH_4X : IB_LINK_WIDTH_1X ); ! 236: ibdev->link_speed_active = ! 237: ( link_speed ? IB_LINK_SPEED_DDR : IB_LINK_SPEED_SDR ); ! 238: ib_link_state_changed ( ibdev ); ! 239: } ! 240: ! 241: /** ! 242: * Wait for link state change to take effect ! 243: * ! 244: * @v linda Linda device ! 245: * @v new_link_state Expected link state ! 246: * @ret rc Return status code ! 247: */ ! 248: static int linda_link_state_check ( struct linda *linda, ! 249: unsigned int new_link_state ) { ! 250: struct QIB_7220_IBCStatus ibcstatus; ! 251: unsigned int link_state; ! 252: unsigned int i; ! 253: ! 254: for ( i = 0 ; i < LINDA_LINK_STATE_MAX_WAIT_US ; i++ ) { ! 255: linda_readq ( linda, &ibcstatus, QIB_7220_IBCStatus_offset ); ! 256: link_state = BIT_GET ( &ibcstatus, LinkState ); ! 257: if ( link_state == new_link_state ) ! 258: return 0; ! 259: udelay ( 1 ); ! 260: } ! 261: ! 262: DBGC ( linda, "Linda %p timed out waiting for link state %s\n", ! 263: linda, linda_link_state_text ( link_state ) ); ! 264: return -ETIMEDOUT; ! 265: } ! 266: ! 267: /** ! 268: * Set port information ! 269: * ! 270: * @v ibdev Infiniband device ! 271: * @v mad Set port information MAD ! 272: */ ! 273: static int linda_set_port_info ( struct ib_device *ibdev, union ib_mad *mad ) { ! 274: struct linda *linda = ib_get_drvdata ( ibdev ); ! 275: struct ib_port_info *port_info = &mad->smp.smp_data.port_info; ! 276: struct QIB_7220_IBCCtrl ibcctrl; ! 277: unsigned int port_state; ! 278: unsigned int link_state; ! 279: ! 280: /* Set new link state */ ! 281: port_state = ( port_info->link_speed_supported__port_state & 0xf ); ! 282: if ( port_state ) { ! 283: link_state = ( port_state - 1 ); ! 284: DBGC ( linda, "Linda %p set link state to %s (%x)\n", linda, ! 285: linda_link_state_text ( link_state ), link_state ); ! 286: linda_readq ( linda, &ibcctrl, QIB_7220_IBCCtrl_offset ); ! 287: BIT_SET ( &ibcctrl, LinkCmd, link_state ); ! 288: linda_writeq ( linda, &ibcctrl, QIB_7220_IBCCtrl_offset ); ! 289: ! 290: /* Wait for link state change to take effect. Ignore ! 291: * errors; the current link state will be returned via ! 292: * the GetResponse MAD. ! 293: */ ! 294: linda_link_state_check ( linda, link_state ); ! 295: } ! 296: ! 297: /* Detect and report link state change */ ! 298: linda_link_state_changed ( ibdev ); ! 299: ! 300: return 0; ! 301: } ! 302: ! 303: /** ! 304: * Set partition key table ! 305: * ! 306: * @v ibdev Infiniband device ! 307: * @v mad Set partition key table MAD ! 308: */ ! 309: static int linda_set_pkey_table ( struct ib_device *ibdev __unused, ! 310: union ib_mad *mad __unused ) { ! 311: /* Nothing to do */ ! 312: return 0; ! 313: } ! 314: ! 315: /*************************************************************************** ! 316: * ! 317: * Context allocation ! 318: * ! 319: *************************************************************************** ! 320: */ ! 321: ! 322: /** ! 323: * Map context number to QPN ! 324: * ! 325: * @v ctx Context index ! 326: * @ret qpn Queue pair number ! 327: */ ! 328: static int linda_ctx_to_qpn ( unsigned int ctx ) { ! 329: /* This mapping is fixed by hardware */ ! 330: return ( ctx * 2 ); ! 331: } ! 332: ! 333: /** ! 334: * Map QPN to context number ! 335: * ! 336: * @v qpn Queue pair number ! 337: * @ret ctx Context index ! 338: */ ! 339: static int linda_qpn_to_ctx ( unsigned int qpn ) { ! 340: /* This mapping is fixed by hardware */ ! 341: return ( qpn / 2 ); ! 342: } ! 343: ! 344: /** ! 345: * Allocate a context ! 346: * ! 347: * @v linda Linda device ! 348: * @ret ctx Context index, or negative error ! 349: */ ! 350: static int linda_alloc_ctx ( struct linda *linda ) { ! 351: unsigned int ctx; ! 352: ! 353: for ( ctx = 0 ; ctx < LINDA_NUM_CONTEXTS ; ctx++ ) { ! 354: ! 355: if ( ! linda->used_ctx[ctx] ) { ! 356: linda->used_ctx[ctx ] = 1; ! 357: DBGC2 ( linda, "Linda %p CTX %d allocated\n", ! 358: linda, ctx ); ! 359: return ctx; ! 360: } ! 361: } ! 362: ! 363: DBGC ( linda, "Linda %p out of available contexts\n", linda ); ! 364: return -ENOENT; ! 365: } ! 366: ! 367: /** ! 368: * Free a context ! 369: * ! 370: * @v linda Linda device ! 371: * @v ctx Context index ! 372: */ ! 373: static void linda_free_ctx ( struct linda *linda, unsigned int ctx ) { ! 374: ! 375: linda->used_ctx[ctx] = 0; ! 376: DBGC2 ( linda, "Linda %p CTX %d freed\n", linda, ctx ); ! 377: } ! 378: ! 379: /*************************************************************************** ! 380: * ! 381: * Send datapath ! 382: * ! 383: *************************************************************************** ! 384: */ ! 385: ! 386: /** Send buffer toggle bit ! 387: * ! 388: * We encode send buffers as 7 bits of send buffer index plus a single ! 389: * bit which should match the "check" bit in the SendBufAvail array. ! 390: */ ! 391: #define LINDA_SEND_BUF_TOGGLE 0x80 ! 392: ! 393: /** ! 394: * Allocate a send buffer ! 395: * ! 396: * @v linda Linda device ! 397: * @ret send_buf Send buffer ! 398: * ! 399: * You must guarantee that a send buffer is available. This is done ! 400: * by refusing to allocate more TX WQEs in total than the number of ! 401: * available send buffers. ! 402: */ ! 403: static unsigned int linda_alloc_send_buf ( struct linda *linda ) { ! 404: unsigned int send_buf; ! 405: ! 406: send_buf = linda->send_buf[linda->send_buf_cons]; ! 407: send_buf ^= LINDA_SEND_BUF_TOGGLE; ! 408: linda->send_buf_cons = ( ( linda->send_buf_cons + 1 ) % ! 409: LINDA_MAX_SEND_BUFS ); ! 410: return send_buf; ! 411: } ! 412: ! 413: /** ! 414: * Free a send buffer ! 415: * ! 416: * @v linda Linda device ! 417: * @v send_buf Send buffer ! 418: */ ! 419: static void linda_free_send_buf ( struct linda *linda, ! 420: unsigned int send_buf ) { ! 421: linda->send_buf[linda->send_buf_prod] = send_buf; ! 422: linda->send_buf_prod = ( ( linda->send_buf_prod + 1 ) % ! 423: LINDA_MAX_SEND_BUFS ); ! 424: } ! 425: ! 426: /** ! 427: * Check to see if send buffer is in use ! 428: * ! 429: * @v linda Linda device ! 430: * @v send_buf Send buffer ! 431: * @ret in_use Send buffer is in use ! 432: */ ! 433: static int linda_send_buf_in_use ( struct linda *linda, ! 434: unsigned int send_buf ) { ! 435: unsigned int send_idx; ! 436: unsigned int send_check; ! 437: unsigned int inusecheck; ! 438: unsigned int inuse; ! 439: unsigned int check; ! 440: ! 441: send_idx = ( send_buf & ~LINDA_SEND_BUF_TOGGLE ); ! 442: send_check = ( !! ( send_buf & LINDA_SEND_BUF_TOGGLE ) ); ! 443: inusecheck = BIT_GET ( linda->sendbufavail, InUseCheck[send_idx] ); ! 444: inuse = ( !! ( inusecheck & 0x02 ) ); ! 445: check = ( !! ( inusecheck & 0x01 ) ); ! 446: return ( inuse || ( check != send_check ) ); ! 447: } ! 448: ! 449: /** ! 450: * Calculate starting offset for send buffer ! 451: * ! 452: * @v linda Linda device ! 453: * @v send_buf Send buffer ! 454: * @ret offset Starting offset ! 455: */ ! 456: static unsigned long linda_send_buffer_offset ( struct linda *linda, ! 457: unsigned int send_buf ) { ! 458: return ( linda->send_buffer_base + ! 459: ( ( send_buf & ~LINDA_SEND_BUF_TOGGLE ) * ! 460: LINDA_SEND_BUF_SIZE ) ); ! 461: } ! 462: ! 463: /** ! 464: * Create send work queue ! 465: * ! 466: * @v linda Linda device ! 467: * @v qp Queue pair ! 468: */ ! 469: static int linda_create_send_wq ( struct linda *linda, ! 470: struct ib_queue_pair *qp ) { ! 471: struct ib_work_queue *wq = &qp->send; ! 472: struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 473: int rc; ! 474: ! 475: /* Reserve send buffers */ ! 476: if ( ( linda->reserved_send_bufs + qp->send.num_wqes ) > ! 477: LINDA_MAX_SEND_BUFS ) { ! 478: DBGC ( linda, "Linda %p out of send buffers (have %d, used " ! 479: "%d, need %d)\n", linda, LINDA_MAX_SEND_BUFS, ! 480: linda->reserved_send_bufs, qp->send.num_wqes ); ! 481: rc = -ENOBUFS; ! 482: goto err_reserve_bufs; ! 483: } ! 484: linda->reserved_send_bufs += qp->send.num_wqes; ! 485: ! 486: /* Reset work queue */ ! 487: linda_wq->prod = 0; ! 488: linda_wq->cons = 0; ! 489: ! 490: /* Allocate space for send buffer uasge list */ ! 491: linda_wq->send_buf = zalloc ( qp->send.num_wqes * ! 492: sizeof ( linda_wq->send_buf[0] ) ); ! 493: if ( ! linda_wq->send_buf ) { ! 494: rc = -ENOBUFS; ! 495: goto err_alloc_send_buf; ! 496: } ! 497: ! 498: return 0; ! 499: ! 500: free ( linda_wq->send_buf ); ! 501: err_alloc_send_buf: ! 502: linda->reserved_send_bufs -= qp->send.num_wqes; ! 503: err_reserve_bufs: ! 504: return rc; ! 505: } ! 506: ! 507: /** ! 508: * Destroy send work queue ! 509: * ! 510: * @v linda Linda device ! 511: * @v qp Queue pair ! 512: */ ! 513: static void linda_destroy_send_wq ( struct linda *linda, ! 514: struct ib_queue_pair *qp ) { ! 515: struct ib_work_queue *wq = &qp->send; ! 516: struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 517: ! 518: free ( linda_wq->send_buf ); ! 519: linda->reserved_send_bufs -= qp->send.num_wqes; ! 520: } ! 521: ! 522: /** ! 523: * Initialise send datapath ! 524: * ! 525: * @v linda Linda device ! 526: * @ret rc Return status code ! 527: */ ! 528: static int linda_init_send ( struct linda *linda ) { ! 529: struct QIB_7220_SendBufBase sendbufbase; ! 530: struct QIB_7220_SendBufAvailAddr sendbufavailaddr; ! 531: struct QIB_7220_SendCtrl sendctrl; ! 532: unsigned int i; ! 533: int rc; ! 534: ! 535: /* Retrieve SendBufBase */ ! 536: linda_readq ( linda, &sendbufbase, QIB_7220_SendBufBase_offset ); ! 537: linda->send_buffer_base = BIT_GET ( &sendbufbase, ! 538: BaseAddr_SmallPIO ); ! 539: DBGC ( linda, "Linda %p send buffers at %lx\n", ! 540: linda, linda->send_buffer_base ); ! 541: ! 542: /* Initialise the send_buf[] array */ ! 543: for ( i = 0 ; i < LINDA_MAX_SEND_BUFS ; i++ ) ! 544: linda->send_buf[i] = i; ! 545: ! 546: /* Allocate space for the SendBufAvail array */ ! 547: linda->sendbufavail = malloc_dma ( sizeof ( *linda->sendbufavail ), ! 548: LINDA_SENDBUFAVAIL_ALIGN ); ! 549: if ( ! linda->sendbufavail ) { ! 550: rc = -ENOMEM; ! 551: goto err_alloc_sendbufavail; ! 552: } ! 553: memset ( linda->sendbufavail, 0, sizeof ( linda->sendbufavail ) ); ! 554: ! 555: /* Program SendBufAvailAddr into the hardware */ ! 556: memset ( &sendbufavailaddr, 0, sizeof ( sendbufavailaddr ) ); ! 557: BIT_FILL_1 ( &sendbufavailaddr, SendBufAvailAddr, ! 558: ( virt_to_bus ( linda->sendbufavail ) >> 6 ) ); ! 559: linda_writeq ( linda, &sendbufavailaddr, ! 560: QIB_7220_SendBufAvailAddr_offset ); ! 561: ! 562: /* Enable sending and DMA of SendBufAvail */ ! 563: memset ( &sendctrl, 0, sizeof ( sendctrl ) ); ! 564: BIT_FILL_2 ( &sendctrl, ! 565: SendBufAvailUpd, 1, ! 566: SPioEnable, 1 ); ! 567: linda_writeq ( linda, &sendctrl, QIB_7220_SendCtrl_offset ); ! 568: ! 569: return 0; ! 570: ! 571: free_dma ( linda->sendbufavail, sizeof ( *linda->sendbufavail ) ); ! 572: err_alloc_sendbufavail: ! 573: return rc; ! 574: } ! 575: ! 576: /** ! 577: * Shut down send datapath ! 578: * ! 579: * @v linda Linda device ! 580: */ ! 581: static void linda_fini_send ( struct linda *linda ) { ! 582: struct QIB_7220_SendCtrl sendctrl; ! 583: ! 584: /* Disable sending and DMA of SendBufAvail */ ! 585: memset ( &sendctrl, 0, sizeof ( sendctrl ) ); ! 586: linda_writeq ( linda, &sendctrl, QIB_7220_SendCtrl_offset ); ! 587: mb(); ! 588: ! 589: /* Ensure hardware has seen this disable */ ! 590: linda_readq ( linda, &sendctrl, QIB_7220_SendCtrl_offset ); ! 591: ! 592: free_dma ( linda->sendbufavail, sizeof ( *linda->sendbufavail ) ); ! 593: } ! 594: ! 595: /*************************************************************************** ! 596: * ! 597: * Receive datapath ! 598: * ! 599: *************************************************************************** ! 600: */ ! 601: ! 602: /** ! 603: * Create receive work queue ! 604: * ! 605: * @v linda Linda device ! 606: * @v qp Queue pair ! 607: * @ret rc Return status code ! 608: */ ! 609: static int linda_create_recv_wq ( struct linda *linda, ! 610: struct ib_queue_pair *qp ) { ! 611: struct ib_work_queue *wq = &qp->recv; ! 612: struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 613: struct QIB_7220_RcvHdrAddr0 rcvhdraddr; ! 614: struct QIB_7220_RcvHdrTailAddr0 rcvhdrtailaddr; ! 615: struct QIB_7220_RcvHdrHead0 rcvhdrhead; ! 616: struct QIB_7220_scalar rcvegrindexhead; ! 617: struct QIB_7220_RcvCtrl rcvctrl; ! 618: unsigned int ctx = linda_qpn_to_ctx ( qp->qpn ); ! 619: int rc; ! 620: ! 621: /* Reset context information */ ! 622: memset ( &linda_wq->header_prod, 0, ! 623: sizeof ( linda_wq->header_prod ) ); ! 624: linda_wq->header_cons = 0; ! 625: linda_wq->eager_prod = 0; ! 626: linda_wq->eager_cons = 0; ! 627: ! 628: /* Allocate receive header buffer */ ! 629: linda_wq->header = malloc_dma ( LINDA_RECV_HEADERS_SIZE, ! 630: LINDA_RECV_HEADERS_ALIGN ); ! 631: if ( ! linda_wq->header ) { ! 632: rc = -ENOMEM; ! 633: goto err_alloc_header; ! 634: } ! 635: ! 636: /* Enable context in hardware */ ! 637: memset ( &rcvhdraddr, 0, sizeof ( rcvhdraddr ) ); ! 638: BIT_FILL_1 ( &rcvhdraddr, RcvHdrAddr0, ! 639: ( virt_to_bus ( linda_wq->header ) >> 2 ) ); ! 640: linda_writeq_array8b ( linda, &rcvhdraddr, ! 641: QIB_7220_RcvHdrAddr0_offset, ctx ); ! 642: memset ( &rcvhdrtailaddr, 0, sizeof ( rcvhdrtailaddr ) ); ! 643: BIT_FILL_1 ( &rcvhdrtailaddr, RcvHdrTailAddr0, ! 644: ( virt_to_bus ( &linda_wq->header_prod ) >> 2 ) ); ! 645: linda_writeq_array8b ( linda, &rcvhdrtailaddr, ! 646: QIB_7220_RcvHdrTailAddr0_offset, ctx ); ! 647: memset ( &rcvhdrhead, 0, sizeof ( rcvhdrhead ) ); ! 648: BIT_FILL_1 ( &rcvhdrhead, counter, 1 ); ! 649: linda_writeq_array64k ( linda, &rcvhdrhead, ! 650: QIB_7220_RcvHdrHead0_offset, ctx ); ! 651: memset ( &rcvegrindexhead, 0, sizeof ( rcvegrindexhead ) ); ! 652: BIT_FILL_1 ( &rcvegrindexhead, Value, 1 ); ! 653: linda_writeq_array64k ( linda, &rcvegrindexhead, ! 654: QIB_7220_RcvEgrIndexHead0_offset, ctx ); ! 655: linda_readq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset ); ! 656: BIT_SET ( &rcvctrl, PortEnable[ctx], 1 ); ! 657: BIT_SET ( &rcvctrl, IntrAvail[ctx], 1 ); ! 658: linda_writeq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset ); ! 659: ! 660: DBGC ( linda, "Linda %p QPN %ld CTX %d hdrs [%lx,%lx) prod %lx\n", ! 661: linda, qp->qpn, ctx, virt_to_bus ( linda_wq->header ), ! 662: ( virt_to_bus ( linda_wq->header ) + LINDA_RECV_HEADERS_SIZE ), ! 663: virt_to_bus ( &linda_wq->header_prod ) ); ! 664: return 0; ! 665: ! 666: free_dma ( linda_wq->header, LINDA_RECV_HEADERS_SIZE ); ! 667: err_alloc_header: ! 668: return rc; ! 669: } ! 670: ! 671: /** ! 672: * Destroy receive work queue ! 673: * ! 674: * @v linda Linda device ! 675: * @v qp Queue pair ! 676: */ ! 677: static void linda_destroy_recv_wq ( struct linda *linda, ! 678: struct ib_queue_pair *qp ) { ! 679: struct ib_work_queue *wq = &qp->recv; ! 680: struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 681: struct QIB_7220_RcvCtrl rcvctrl; ! 682: unsigned int ctx = linda_qpn_to_ctx ( qp->qpn ); ! 683: ! 684: /* Disable context in hardware */ ! 685: linda_readq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset ); ! 686: BIT_SET ( &rcvctrl, PortEnable[ctx], 0 ); ! 687: BIT_SET ( &rcvctrl, IntrAvail[ctx], 0 ); ! 688: linda_writeq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset ); ! 689: ! 690: /* Make sure the hardware has seen that the context is disabled */ ! 691: linda_readq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset ); ! 692: mb(); ! 693: ! 694: /* Free headers ring */ ! 695: free_dma ( linda_wq->header, LINDA_RECV_HEADERS_SIZE ); ! 696: ! 697: /* Free context */ ! 698: linda_free_ctx ( linda, ctx ); ! 699: } ! 700: ! 701: /** ! 702: * Initialise receive datapath ! 703: * ! 704: * @v linda Linda device ! 705: * @ret rc Return status code ! 706: */ ! 707: static int linda_init_recv ( struct linda *linda ) { ! 708: struct QIB_7220_RcvCtrl rcvctrl; ! 709: struct QIB_7220_scalar rcvegrbase; ! 710: struct QIB_7220_scalar rcvhdrentsize; ! 711: struct QIB_7220_scalar rcvhdrcnt; ! 712: struct QIB_7220_RcvBTHQP rcvbthqp; ! 713: unsigned int portcfg; ! 714: unsigned long egrbase; ! 715: unsigned int eager_array_size_0; ! 716: unsigned int eager_array_size_other; ! 717: unsigned int ctx; ! 718: ! 719: /* Select configuration based on number of contexts */ ! 720: switch ( LINDA_NUM_CONTEXTS ) { ! 721: case 5: ! 722: portcfg = LINDA_PORTCFG_5CTX; ! 723: eager_array_size_0 = LINDA_EAGER_ARRAY_SIZE_5CTX_0; ! 724: eager_array_size_other = LINDA_EAGER_ARRAY_SIZE_5CTX_OTHER; ! 725: break; ! 726: case 9: ! 727: portcfg = LINDA_PORTCFG_9CTX; ! 728: eager_array_size_0 = LINDA_EAGER_ARRAY_SIZE_9CTX_0; ! 729: eager_array_size_other = LINDA_EAGER_ARRAY_SIZE_9CTX_OTHER; ! 730: break; ! 731: case 17: ! 732: portcfg = LINDA_PORTCFG_17CTX; ! 733: eager_array_size_0 = LINDA_EAGER_ARRAY_SIZE_17CTX_0; ! 734: eager_array_size_other = LINDA_EAGER_ARRAY_SIZE_17CTX_OTHER; ! 735: break; ! 736: default: ! 737: linker_assert ( 0, invalid_LINDA_NUM_CONTEXTS ); ! 738: return -EINVAL; ! 739: } ! 740: ! 741: /* Configure number of contexts */ ! 742: memset ( &rcvctrl, 0, sizeof ( rcvctrl ) ); ! 743: BIT_FILL_3 ( &rcvctrl, ! 744: TailUpd, 1, ! 745: PortCfg, portcfg, ! 746: RcvQPMapEnable, 1 ); ! 747: linda_writeq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset ); ! 748: ! 749: /* Configure receive header buffer sizes */ ! 750: memset ( &rcvhdrcnt, 0, sizeof ( rcvhdrcnt ) ); ! 751: BIT_FILL_1 ( &rcvhdrcnt, Value, LINDA_RECV_HEADER_COUNT ); ! 752: linda_writeq ( linda, &rcvhdrcnt, QIB_7220_RcvHdrCnt_offset ); ! 753: memset ( &rcvhdrentsize, 0, sizeof ( rcvhdrentsize ) ); ! 754: BIT_FILL_1 ( &rcvhdrentsize, Value, ( LINDA_RECV_HEADER_SIZE >> 2 ) ); ! 755: linda_writeq ( linda, &rcvhdrentsize, QIB_7220_RcvHdrEntSize_offset ); ! 756: ! 757: /* Calculate eager array start addresses for each context */ ! 758: linda_readq ( linda, &rcvegrbase, QIB_7220_RcvEgrBase_offset ); ! 759: egrbase = BIT_GET ( &rcvegrbase, Value ); ! 760: linda->recv_wq[0].eager_array = egrbase; ! 761: linda->recv_wq[0].eager_entries = eager_array_size_0; ! 762: egrbase += ( eager_array_size_0 * sizeof ( struct QIB_7220_RcvEgr ) ); ! 763: for ( ctx = 1 ; ctx < LINDA_NUM_CONTEXTS ; ctx++ ) { ! 764: linda->recv_wq[ctx].eager_array = egrbase; ! 765: linda->recv_wq[ctx].eager_entries = eager_array_size_other; ! 766: egrbase += ( eager_array_size_other * ! 767: sizeof ( struct QIB_7220_RcvEgr ) ); ! 768: } ! 769: for ( ctx = 0 ; ctx < LINDA_NUM_CONTEXTS ; ctx++ ) { ! 770: DBGC ( linda, "Linda %p CTX %d eager array at %lx (%d " ! 771: "entries)\n", linda, ctx, ! 772: linda->recv_wq[ctx].eager_array, ! 773: linda->recv_wq[ctx].eager_entries ); ! 774: } ! 775: ! 776: /* Set the BTH QP for Infinipath packets to an unused value */ ! 777: memset ( &rcvbthqp, 0, sizeof ( rcvbthqp ) ); ! 778: BIT_FILL_1 ( &rcvbthqp, RcvBTHQP, LINDA_QP_IDETH ); ! 779: linda_writeq ( linda, &rcvbthqp, QIB_7220_RcvBTHQP_offset ); ! 780: ! 781: return 0; ! 782: } ! 783: ! 784: /** ! 785: * Shut down receive datapath ! 786: * ! 787: * @v linda Linda device ! 788: */ ! 789: static void linda_fini_recv ( struct linda *linda __unused ) { ! 790: /* Nothing to do; all contexts were already disabled when the ! 791: * queue pairs were destroyed ! 792: */ ! 793: } ! 794: ! 795: /*************************************************************************** ! 796: * ! 797: * Completion queue operations ! 798: * ! 799: *************************************************************************** ! 800: */ ! 801: ! 802: /** ! 803: * Create completion queue ! 804: * ! 805: * @v ibdev Infiniband device ! 806: * @v cq Completion queue ! 807: * @ret rc Return status code ! 808: */ ! 809: static int linda_create_cq ( struct ib_device *ibdev, ! 810: struct ib_completion_queue *cq ) { ! 811: struct linda *linda = ib_get_drvdata ( ibdev ); ! 812: static int cqn; ! 813: ! 814: /* The hardware has no concept of completion queues. We ! 815: * simply use the association between CQs and WQs (already ! 816: * handled by the IB core) to decide which WQs to poll. ! 817: * ! 818: * We do set a CQN, just to avoid confusing debug messages ! 819: * from the IB core. ! 820: */ ! 821: cq->cqn = ++cqn; ! 822: DBGC ( linda, "Linda %p CQN %ld created\n", linda, cq->cqn ); ! 823: ! 824: return 0; ! 825: } ! 826: ! 827: /** ! 828: * Destroy completion queue ! 829: * ! 830: * @v ibdev Infiniband device ! 831: * @v cq Completion queue ! 832: */ ! 833: static void linda_destroy_cq ( struct ib_device *ibdev, ! 834: struct ib_completion_queue *cq ) { ! 835: struct linda *linda = ib_get_drvdata ( ibdev ); ! 836: ! 837: /* Nothing to do */ ! 838: DBGC ( linda, "Linda %p CQN %ld destroyed\n", linda, cq->cqn ); ! 839: } ! 840: ! 841: /*************************************************************************** ! 842: * ! 843: * Queue pair operations ! 844: * ! 845: *************************************************************************** ! 846: */ ! 847: ! 848: /** ! 849: * Create queue pair ! 850: * ! 851: * @v ibdev Infiniband device ! 852: * @v qp Queue pair ! 853: * @ret rc Return status code ! 854: */ ! 855: static int linda_create_qp ( struct ib_device *ibdev, ! 856: struct ib_queue_pair *qp ) { ! 857: struct linda *linda = ib_get_drvdata ( ibdev ); ! 858: int ctx; ! 859: int rc; ! 860: ! 861: /* Locate an available context */ ! 862: ctx = linda_alloc_ctx ( linda ); ! 863: if ( ctx < 0 ) { ! 864: rc = ctx; ! 865: goto err_alloc_ctx; ! 866: } ! 867: ! 868: /* Set queue pair number based on context index */ ! 869: qp->qpn = linda_ctx_to_qpn ( ctx ); ! 870: ! 871: /* Set work-queue private data pointers */ ! 872: ib_wq_set_drvdata ( &qp->send, &linda->send_wq[ctx] ); ! 873: ib_wq_set_drvdata ( &qp->recv, &linda->recv_wq[ctx] ); ! 874: ! 875: /* Create receive work queue */ ! 876: if ( ( rc = linda_create_recv_wq ( linda, qp ) ) != 0 ) ! 877: goto err_create_recv_wq; ! 878: ! 879: /* Create send work queue */ ! 880: if ( ( rc = linda_create_send_wq ( linda, qp ) ) != 0 ) ! 881: goto err_create_send_wq; ! 882: ! 883: return 0; ! 884: ! 885: linda_destroy_send_wq ( linda, qp ); ! 886: err_create_send_wq: ! 887: linda_destroy_recv_wq ( linda, qp ); ! 888: err_create_recv_wq: ! 889: linda_free_ctx ( linda, ctx ); ! 890: err_alloc_ctx: ! 891: return rc; ! 892: } ! 893: ! 894: /** ! 895: * Modify queue pair ! 896: * ! 897: * @v ibdev Infiniband device ! 898: * @v qp Queue pair ! 899: * @ret rc Return status code ! 900: */ ! 901: static int linda_modify_qp ( struct ib_device *ibdev, ! 902: struct ib_queue_pair *qp ) { ! 903: struct linda *linda = ib_get_drvdata ( ibdev ); ! 904: ! 905: /* Nothing to do; the hardware doesn't have a notion of queue ! 906: * keys ! 907: */ ! 908: DBGC ( linda, "Linda %p QPN %ld modified\n", linda, qp->qpn ); ! 909: return 0; ! 910: } ! 911: ! 912: /** ! 913: * Destroy queue pair ! 914: * ! 915: * @v ibdev Infiniband device ! 916: * @v qp Queue pair ! 917: */ ! 918: static void linda_destroy_qp ( struct ib_device *ibdev, ! 919: struct ib_queue_pair *qp ) { ! 920: struct linda *linda = ib_get_drvdata ( ibdev ); ! 921: ! 922: linda_destroy_send_wq ( linda, qp ); ! 923: linda_destroy_recv_wq ( linda, qp ); ! 924: } ! 925: ! 926: /*************************************************************************** ! 927: * ! 928: * Work request operations ! 929: * ! 930: *************************************************************************** ! 931: */ ! 932: ! 933: /** ! 934: * Post send work queue entry ! 935: * ! 936: * @v ibdev Infiniband device ! 937: * @v qp Queue pair ! 938: * @v av Address vector ! 939: * @v iobuf I/O buffer ! 940: * @ret rc Return status code ! 941: */ ! 942: static int linda_post_send ( struct ib_device *ibdev, ! 943: struct ib_queue_pair *qp, ! 944: struct ib_address_vector *av, ! 945: struct io_buffer *iobuf ) { ! 946: struct linda *linda = ib_get_drvdata ( ibdev ); ! 947: struct ib_work_queue *wq = &qp->send; ! 948: struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 949: struct QIB_7220_SendPbc sendpbc; ! 950: uint8_t header_buf[IB_MAX_HEADER_SIZE]; ! 951: struct io_buffer headers; ! 952: unsigned int send_buf; ! 953: unsigned long start_offset; ! 954: unsigned long offset; ! 955: size_t len; ! 956: ssize_t frag_len; ! 957: uint32_t *data; ! 958: ! 959: /* Allocate send buffer and calculate offset */ ! 960: send_buf = linda_alloc_send_buf ( linda ); ! 961: start_offset = offset = linda_send_buffer_offset ( linda, send_buf ); ! 962: ! 963: /* Store I/O buffer and send buffer index */ ! 964: assert ( wq->iobufs[linda_wq->prod] == NULL ); ! 965: wq->iobufs[linda_wq->prod] = iobuf; ! 966: linda_wq->send_buf[linda_wq->prod] = send_buf; ! 967: ! 968: /* Construct headers */ ! 969: iob_populate ( &headers, header_buf, 0, sizeof ( header_buf ) ); ! 970: iob_reserve ( &headers, sizeof ( header_buf ) ); ! 971: ib_push ( ibdev, &headers, qp, iob_len ( iobuf ), av ); ! 972: ! 973: /* Calculate packet length */ ! 974: len = ( ( sizeof ( sendpbc ) + iob_len ( &headers ) + ! 975: iob_len ( iobuf ) + 3 ) & ~3 ); ! 976: ! 977: /* Construct send per-buffer control word */ ! 978: memset ( &sendpbc, 0, sizeof ( sendpbc ) ); ! 979: BIT_FILL_2 ( &sendpbc, ! 980: LengthP1_toibc, ( ( len >> 2 ) - 1 ), ! 981: VL15, 1 ); ! 982: ! 983: /* Write SendPbc */ ! 984: DBG_DISABLE ( DBGLVL_IO ); ! 985: linda_writeq ( linda, &sendpbc, offset ); ! 986: offset += sizeof ( sendpbc ); ! 987: ! 988: /* Write headers */ ! 989: for ( data = headers.data, frag_len = iob_len ( &headers ) ; ! 990: frag_len > 0 ; data++, offset += 4, frag_len -= 4 ) { ! 991: linda_writel ( linda, *data, offset ); ! 992: } ! 993: ! 994: /* Write data */ ! 995: for ( data = iobuf->data, frag_len = iob_len ( iobuf ) ; ! 996: frag_len > 0 ; data++, offset += 4, frag_len -= 4 ) { ! 997: linda_writel ( linda, *data, offset ); ! 998: } ! 999: DBG_ENABLE ( DBGLVL_IO ); ! 1000: ! 1001: assert ( ( start_offset + len ) == offset ); ! 1002: DBGC2 ( linda, "Linda %p QPN %ld TX %d(%d) posted [%lx,%lx)\n", ! 1003: linda, qp->qpn, send_buf, linda_wq->prod, ! 1004: start_offset, offset ); ! 1005: ! 1006: /* Increment producer counter */ ! 1007: linda_wq->prod = ( ( linda_wq->prod + 1 ) & ( wq->num_wqes - 1 ) ); ! 1008: ! 1009: return 0; ! 1010: } ! 1011: ! 1012: /** ! 1013: * Complete send work queue entry ! 1014: * ! 1015: * @v ibdev Infiniband device ! 1016: * @v qp Queue pair ! 1017: * @v wqe_idx Work queue entry index ! 1018: */ ! 1019: static void linda_complete_send ( struct ib_device *ibdev, ! 1020: struct ib_queue_pair *qp, ! 1021: unsigned int wqe_idx ) { ! 1022: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1023: struct ib_work_queue *wq = &qp->send; ! 1024: struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 1025: struct io_buffer *iobuf; ! 1026: unsigned int send_buf; ! 1027: ! 1028: /* Parse completion */ ! 1029: send_buf = linda_wq->send_buf[wqe_idx]; ! 1030: DBGC2 ( linda, "Linda %p QPN %ld TX %d(%d) complete\n", ! 1031: linda, qp->qpn, send_buf, wqe_idx ); ! 1032: ! 1033: /* Complete work queue entry */ ! 1034: iobuf = wq->iobufs[wqe_idx]; ! 1035: assert ( iobuf != NULL ); ! 1036: ib_complete_send ( ibdev, qp, iobuf, 0 ); ! 1037: wq->iobufs[wqe_idx] = NULL; ! 1038: ! 1039: /* Free send buffer */ ! 1040: linda_free_send_buf ( linda, send_buf ); ! 1041: } ! 1042: ! 1043: /** ! 1044: * Poll send work queue ! 1045: * ! 1046: * @v ibdev Infiniband device ! 1047: * @v qp Queue pair ! 1048: */ ! 1049: static void linda_poll_send_wq ( struct ib_device *ibdev, ! 1050: struct ib_queue_pair *qp ) { ! 1051: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1052: struct ib_work_queue *wq = &qp->send; ! 1053: struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 1054: unsigned int send_buf; ! 1055: ! 1056: /* Look for completions */ ! 1057: while ( wq->fill ) { ! 1058: ! 1059: /* Check to see if send buffer has completed */ ! 1060: send_buf = linda_wq->send_buf[linda_wq->cons]; ! 1061: if ( linda_send_buf_in_use ( linda, send_buf ) ) ! 1062: break; ! 1063: ! 1064: /* Complete this buffer */ ! 1065: linda_complete_send ( ibdev, qp, linda_wq->cons ); ! 1066: ! 1067: /* Increment consumer counter */ ! 1068: linda_wq->cons = ( ( linda_wq->cons + 1 ) & ! 1069: ( wq->num_wqes - 1 ) ); ! 1070: } ! 1071: } ! 1072: ! 1073: /** ! 1074: * Post receive work queue entry ! 1075: * ! 1076: * @v ibdev Infiniband device ! 1077: * @v qp Queue pair ! 1078: * @v iobuf I/O buffer ! 1079: * @ret rc Return status code ! 1080: */ ! 1081: static int linda_post_recv ( struct ib_device *ibdev, ! 1082: struct ib_queue_pair *qp, ! 1083: struct io_buffer *iobuf ) { ! 1084: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1085: struct ib_work_queue *wq = &qp->recv; ! 1086: struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 1087: struct QIB_7220_RcvEgr rcvegr; ! 1088: struct QIB_7220_scalar rcvegrindexhead; ! 1089: unsigned int ctx = linda_qpn_to_ctx ( qp->qpn ); ! 1090: physaddr_t addr; ! 1091: size_t len; ! 1092: unsigned int wqe_idx; ! 1093: unsigned int bufsize; ! 1094: ! 1095: /* Sanity checks */ ! 1096: addr = virt_to_bus ( iobuf->data ); ! 1097: len = iob_tailroom ( iobuf ); ! 1098: if ( addr & ( LINDA_EAGER_BUFFER_ALIGN - 1 ) ) { ! 1099: DBGC ( linda, "Linda %p QPN %ld misaligned RX buffer " ! 1100: "(%08lx)\n", linda, qp->qpn, addr ); ! 1101: return -EINVAL; ! 1102: } ! 1103: if ( len != LINDA_RECV_PAYLOAD_SIZE ) { ! 1104: DBGC ( linda, "Linda %p QPN %ld wrong RX buffer size (%zd)\n", ! 1105: linda, qp->qpn, len ); ! 1106: return -EINVAL; ! 1107: } ! 1108: ! 1109: /* Calculate eager producer index and WQE index */ ! 1110: wqe_idx = ( linda_wq->eager_prod & ( wq->num_wqes - 1 ) ); ! 1111: assert ( wq->iobufs[wqe_idx] == NULL ); ! 1112: ! 1113: /* Store I/O buffer */ ! 1114: wq->iobufs[wqe_idx] = iobuf; ! 1115: ! 1116: /* Calculate buffer size */ ! 1117: switch ( LINDA_RECV_PAYLOAD_SIZE ) { ! 1118: case 2048: bufsize = LINDA_EAGER_BUFFER_2K; break; ! 1119: case 4096: bufsize = LINDA_EAGER_BUFFER_4K; break; ! 1120: case 8192: bufsize = LINDA_EAGER_BUFFER_8K; break; ! 1121: case 16384: bufsize = LINDA_EAGER_BUFFER_16K; break; ! 1122: case 32768: bufsize = LINDA_EAGER_BUFFER_32K; break; ! 1123: case 65536: bufsize = LINDA_EAGER_BUFFER_64K; break; ! 1124: default: linker_assert ( 0, invalid_rx_payload_size ); ! 1125: bufsize = LINDA_EAGER_BUFFER_NONE; ! 1126: } ! 1127: ! 1128: /* Post eager buffer */ ! 1129: memset ( &rcvegr, 0, sizeof ( rcvegr ) ); ! 1130: BIT_FILL_2 ( &rcvegr, ! 1131: Addr, ( addr >> 11 ), ! 1132: BufSize, bufsize ); ! 1133: linda_writeq_array8b ( linda, &rcvegr, ! 1134: linda_wq->eager_array, linda_wq->eager_prod ); ! 1135: DBGC2 ( linda, "Linda %p QPN %ld RX egr %d(%d) posted [%lx,%lx)\n", ! 1136: linda, qp->qpn, linda_wq->eager_prod, wqe_idx, ! 1137: addr, ( addr + len ) ); ! 1138: ! 1139: /* Increment producer index */ ! 1140: linda_wq->eager_prod = ( ( linda_wq->eager_prod + 1 ) & ! 1141: ( linda_wq->eager_entries - 1 ) ); ! 1142: ! 1143: /* Update head index */ ! 1144: memset ( &rcvegrindexhead, 0, sizeof ( rcvegrindexhead ) ); ! 1145: BIT_FILL_1 ( &rcvegrindexhead, ! 1146: Value, ( ( linda_wq->eager_prod + 1 ) & ! 1147: ( linda_wq->eager_entries - 1 ) ) ); ! 1148: linda_writeq_array64k ( linda, &rcvegrindexhead, ! 1149: QIB_7220_RcvEgrIndexHead0_offset, ctx ); ! 1150: ! 1151: return 0; ! 1152: } ! 1153: ! 1154: /** ! 1155: * Complete receive work queue entry ! 1156: * ! 1157: * @v ibdev Infiniband device ! 1158: * @v qp Queue pair ! 1159: * @v header_offs Header offset ! 1160: */ ! 1161: static void linda_complete_recv ( struct ib_device *ibdev, ! 1162: struct ib_queue_pair *qp, ! 1163: unsigned int header_offs ) { ! 1164: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1165: struct ib_work_queue *wq = &qp->recv; ! 1166: struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 1167: struct QIB_7220_RcvHdrFlags *rcvhdrflags; ! 1168: struct QIB_7220_RcvEgr rcvegr; ! 1169: struct io_buffer headers; ! 1170: struct io_buffer *iobuf; ! 1171: struct ib_queue_pair *intended_qp; ! 1172: struct ib_address_vector av; ! 1173: unsigned int rcvtype; ! 1174: unsigned int pktlen; ! 1175: unsigned int egrindex; ! 1176: unsigned int useegrbfr; ! 1177: unsigned int iberr, mkerr, tiderr, khdrerr, mtuerr; ! 1178: unsigned int lenerr, parityerr, vcrcerr, icrcerr; ! 1179: unsigned int err; ! 1180: unsigned int hdrqoffset; ! 1181: unsigned int header_len; ! 1182: unsigned int padded_payload_len; ! 1183: unsigned int wqe_idx; ! 1184: size_t payload_len; ! 1185: int qp0; ! 1186: int rc; ! 1187: ! 1188: /* RcvHdrFlags are at the end of the header entry */ ! 1189: rcvhdrflags = ( linda_wq->header + header_offs + ! 1190: LINDA_RECV_HEADER_SIZE - sizeof ( *rcvhdrflags ) ); ! 1191: rcvtype = BIT_GET ( rcvhdrflags, RcvType ); ! 1192: pktlen = ( BIT_GET ( rcvhdrflags, PktLen ) << 2 ); ! 1193: egrindex = BIT_GET ( rcvhdrflags, EgrIndex ); ! 1194: useegrbfr = BIT_GET ( rcvhdrflags, UseEgrBfr ); ! 1195: hdrqoffset = ( BIT_GET ( rcvhdrflags, HdrqOffset ) << 2 ); ! 1196: iberr = BIT_GET ( rcvhdrflags, IBErr ); ! 1197: mkerr = BIT_GET ( rcvhdrflags, MKErr ); ! 1198: tiderr = BIT_GET ( rcvhdrflags, TIDErr ); ! 1199: khdrerr = BIT_GET ( rcvhdrflags, KHdrErr ); ! 1200: mtuerr = BIT_GET ( rcvhdrflags, MTUErr ); ! 1201: lenerr = BIT_GET ( rcvhdrflags, LenErr ); ! 1202: parityerr = BIT_GET ( rcvhdrflags, ParityErr ); ! 1203: vcrcerr = BIT_GET ( rcvhdrflags, VCRCErr ); ! 1204: icrcerr = BIT_GET ( rcvhdrflags, ICRCErr ); ! 1205: header_len = ( LINDA_RECV_HEADER_SIZE - hdrqoffset - ! 1206: sizeof ( *rcvhdrflags ) ); ! 1207: padded_payload_len = ( pktlen - header_len - 4 /* ICRC */ ); ! 1208: err = ( iberr | mkerr | tiderr | khdrerr | mtuerr | ! 1209: lenerr | parityerr | vcrcerr | icrcerr ); ! 1210: /* IB header is placed immediately before RcvHdrFlags */ ! 1211: iob_populate ( &headers, ( ( ( void * ) rcvhdrflags ) - header_len ), ! 1212: header_len, header_len ); ! 1213: ! 1214: /* Dump diagnostic information */ ! 1215: if ( err || ( ! useegrbfr ) ) { ! 1216: DBGC ( linda, "Linda %p QPN %ld RX egr %d%s hdr %d type %d " ! 1217: "len %d(%d+%d+4)%s%s%s%s%s%s%s%s%s%s%s\n", linda, ! 1218: qp->qpn, egrindex, ( useegrbfr ? "" : "(unused)" ), ! 1219: ( header_offs / LINDA_RECV_HEADER_SIZE ), rcvtype, ! 1220: pktlen, header_len, padded_payload_len, ! 1221: ( err ? " [Err" : "" ), ( iberr ? " IB" : "" ), ! 1222: ( mkerr ? " MK" : "" ), ( tiderr ? " TID" : "" ), ! 1223: ( khdrerr ? " KHdr" : "" ), ( mtuerr ? " MTU" : "" ), ! 1224: ( lenerr ? " Len" : "" ), ( parityerr ? " Parity" : ""), ! 1225: ( vcrcerr ? " VCRC" : "" ), ( icrcerr ? " ICRC" : "" ), ! 1226: ( err ? "]" : "" ) ); ! 1227: } else { ! 1228: DBGC2 ( linda, "Linda %p QPN %ld RX egr %d hdr %d type %d " ! 1229: "len %d(%d+%d+4)\n", linda, qp->qpn, egrindex, ! 1230: ( header_offs / LINDA_RECV_HEADER_SIZE ), rcvtype, ! 1231: pktlen, header_len, padded_payload_len ); ! 1232: } ! 1233: DBGCP_HDA ( linda, hdrqoffset, headers.data, ! 1234: ( header_len + sizeof ( *rcvhdrflags ) ) ); ! 1235: ! 1236: /* Parse header to generate address vector */ ! 1237: qp0 = ( qp->qpn == 0 ); ! 1238: intended_qp = NULL; ! 1239: if ( ( rc = ib_pull ( ibdev, &headers, ( qp0 ? &intended_qp : NULL ), ! 1240: &payload_len, &av ) ) != 0 ) { ! 1241: DBGC ( linda, "Linda %p could not parse headers: %s\n", ! 1242: linda, strerror ( rc ) ); ! 1243: err = 1; ! 1244: } ! 1245: if ( ! intended_qp ) ! 1246: intended_qp = qp; ! 1247: ! 1248: /* Complete this buffer and any skipped buffers. Note that ! 1249: * when the hardware runs out of buffers, it will repeatedly ! 1250: * report the same buffer (the tail) as a TID error, and that ! 1251: * it also has a habit of sometimes skipping over several ! 1252: * buffers at once. ! 1253: */ ! 1254: while ( 1 ) { ! 1255: ! 1256: /* If we have caught up to the producer counter, stop. ! 1257: * This will happen when the hardware first runs out ! 1258: * of buffers and starts reporting TID errors against ! 1259: * the eager buffer it wants to use next. ! 1260: */ ! 1261: if ( linda_wq->eager_cons == linda_wq->eager_prod ) ! 1262: break; ! 1263: ! 1264: /* If we have caught up to where we should be after ! 1265: * completing this egrindex, stop. We phrase the test ! 1266: * this way to avoid completing the entire ring when ! 1267: * we receive the same egrindex twice in a row. ! 1268: */ ! 1269: if ( ( linda_wq->eager_cons == ! 1270: ( ( egrindex + 1 ) & ( linda_wq->eager_entries - 1 ) ))) ! 1271: break; ! 1272: ! 1273: /* Identify work queue entry and corresponding I/O ! 1274: * buffer. ! 1275: */ ! 1276: wqe_idx = ( linda_wq->eager_cons & ( wq->num_wqes - 1 ) ); ! 1277: iobuf = wq->iobufs[wqe_idx]; ! 1278: assert ( iobuf != NULL ); ! 1279: wq->iobufs[wqe_idx] = NULL; ! 1280: ! 1281: /* Complete the eager buffer */ ! 1282: if ( linda_wq->eager_cons == egrindex ) { ! 1283: /* Completing the eager buffer described in ! 1284: * this header entry. ! 1285: */ ! 1286: iob_put ( iobuf, payload_len ); ! 1287: rc = ( err ? -EIO : ( useegrbfr ? 0 : -ECANCELED ) ); ! 1288: /* Redirect to target QP if necessary */ ! 1289: if ( qp != intended_qp ) { ! 1290: DBGC ( linda, "Linda %p redirecting QPN %ld " ! 1291: "=> %ld\n", ! 1292: linda, qp->qpn, intended_qp->qpn ); ! 1293: /* Compensate for incorrect fill levels */ ! 1294: qp->recv.fill--; ! 1295: intended_qp->recv.fill++; ! 1296: } ! 1297: ib_complete_recv ( ibdev, intended_qp, &av, iobuf, rc); ! 1298: } else { ! 1299: /* Completing on a skipped-over eager buffer */ ! 1300: ib_complete_recv ( ibdev, qp, &av, iobuf, -ECANCELED ); ! 1301: } ! 1302: ! 1303: /* Clear eager buffer */ ! 1304: memset ( &rcvegr, 0, sizeof ( rcvegr ) ); ! 1305: linda_writeq_array8b ( linda, &rcvegr, linda_wq->eager_array, ! 1306: linda_wq->eager_cons ); ! 1307: ! 1308: /* Increment consumer index */ ! 1309: linda_wq->eager_cons = ( ( linda_wq->eager_cons + 1 ) & ! 1310: ( linda_wq->eager_entries - 1 ) ); ! 1311: } ! 1312: } ! 1313: ! 1314: /** ! 1315: * Poll receive work queue ! 1316: * ! 1317: * @v ibdev Infiniband device ! 1318: * @v qp Queue pair ! 1319: */ ! 1320: static void linda_poll_recv_wq ( struct ib_device *ibdev, ! 1321: struct ib_queue_pair *qp ) { ! 1322: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1323: struct ib_work_queue *wq = &qp->recv; ! 1324: struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq ); ! 1325: struct QIB_7220_RcvHdrHead0 rcvhdrhead; ! 1326: unsigned int ctx = linda_qpn_to_ctx ( qp->qpn ); ! 1327: unsigned int header_prod; ! 1328: ! 1329: /* Check for received packets */ ! 1330: header_prod = ( BIT_GET ( &linda_wq->header_prod, Value ) << 2 ); ! 1331: if ( header_prod == linda_wq->header_cons ) ! 1332: return; ! 1333: ! 1334: /* Process all received packets */ ! 1335: while ( linda_wq->header_cons != header_prod ) { ! 1336: ! 1337: /* Complete the receive */ ! 1338: linda_complete_recv ( ibdev, qp, linda_wq->header_cons ); ! 1339: ! 1340: /* Increment the consumer offset */ ! 1341: linda_wq->header_cons += LINDA_RECV_HEADER_SIZE; ! 1342: linda_wq->header_cons %= LINDA_RECV_HEADERS_SIZE; ! 1343: } ! 1344: ! 1345: /* Update consumer offset */ ! 1346: memset ( &rcvhdrhead, 0, sizeof ( rcvhdrhead ) ); ! 1347: BIT_FILL_2 ( &rcvhdrhead, ! 1348: RcvHeadPointer, ( linda_wq->header_cons >> 2 ), ! 1349: counter, 1 ); ! 1350: linda_writeq_array64k ( linda, &rcvhdrhead, ! 1351: QIB_7220_RcvHdrHead0_offset, ctx ); ! 1352: } ! 1353: ! 1354: /** ! 1355: * Poll completion queue ! 1356: * ! 1357: * @v ibdev Infiniband device ! 1358: * @v cq Completion queue ! 1359: */ ! 1360: static void linda_poll_cq ( struct ib_device *ibdev, ! 1361: struct ib_completion_queue *cq ) { ! 1362: struct ib_work_queue *wq; ! 1363: ! 1364: /* Poll associated send and receive queues */ ! 1365: list_for_each_entry ( wq, &cq->work_queues, list ) { ! 1366: if ( wq->is_send ) { ! 1367: linda_poll_send_wq ( ibdev, wq->qp ); ! 1368: } else { ! 1369: linda_poll_recv_wq ( ibdev, wq->qp ); ! 1370: } ! 1371: } ! 1372: } ! 1373: ! 1374: /*************************************************************************** ! 1375: * ! 1376: * Event queues ! 1377: * ! 1378: *************************************************************************** ! 1379: */ ! 1380: ! 1381: /** ! 1382: * Poll event queue ! 1383: * ! 1384: * @v ibdev Infiniband device ! 1385: */ ! 1386: static void linda_poll_eq ( struct ib_device *ibdev ) { ! 1387: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1388: struct QIB_7220_ErrStatus errstatus; ! 1389: struct QIB_7220_ErrClear errclear; ! 1390: ! 1391: /* Check for link status changes */ ! 1392: DBG_DISABLE ( DBGLVL_IO ); ! 1393: linda_readq ( linda, &errstatus, QIB_7220_ErrStatus_offset ); ! 1394: DBG_ENABLE ( DBGLVL_IO ); ! 1395: if ( BIT_GET ( &errstatus, IBStatusChanged ) ) { ! 1396: linda_link_state_changed ( ibdev ); ! 1397: memset ( &errclear, 0, sizeof ( errclear ) ); ! 1398: BIT_FILL_1 ( &errclear, IBStatusChangedClear, 1 ); ! 1399: linda_writeq ( linda, &errclear, QIB_7220_ErrClear_offset ); ! 1400: } ! 1401: } ! 1402: ! 1403: /*************************************************************************** ! 1404: * ! 1405: * Infiniband link-layer operations ! 1406: * ! 1407: *************************************************************************** ! 1408: */ ! 1409: ! 1410: /** ! 1411: * Initialise Infiniband link ! 1412: * ! 1413: * @v ibdev Infiniband device ! 1414: * @ret rc Return status code ! 1415: */ ! 1416: static int linda_open ( struct ib_device *ibdev ) { ! 1417: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1418: struct QIB_7220_Control control; ! 1419: ! 1420: /* Disable link */ ! 1421: linda_readq ( linda, &control, QIB_7220_Control_offset ); ! 1422: BIT_SET ( &control, LinkEn, 1 ); ! 1423: linda_writeq ( linda, &control, QIB_7220_Control_offset ); ! 1424: return 0; ! 1425: } ! 1426: ! 1427: /** ! 1428: * Close Infiniband link ! 1429: * ! 1430: * @v ibdev Infiniband device ! 1431: */ ! 1432: static void linda_close ( struct ib_device *ibdev ) { ! 1433: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1434: struct QIB_7220_Control control; ! 1435: ! 1436: /* Disable link */ ! 1437: linda_readq ( linda, &control, QIB_7220_Control_offset ); ! 1438: BIT_SET ( &control, LinkEn, 0 ); ! 1439: linda_writeq ( linda, &control, QIB_7220_Control_offset ); ! 1440: } ! 1441: ! 1442: /*************************************************************************** ! 1443: * ! 1444: * Multicast group operations ! 1445: * ! 1446: *************************************************************************** ! 1447: */ ! 1448: ! 1449: /** ! 1450: * Attach to multicast group ! 1451: * ! 1452: * @v ibdev Infiniband device ! 1453: * @v qp Queue pair ! 1454: * @v gid Multicast GID ! 1455: * @ret rc Return status code ! 1456: */ ! 1457: static int linda_mcast_attach ( struct ib_device *ibdev, ! 1458: struct ib_queue_pair *qp, ! 1459: union ib_gid *gid ) { ! 1460: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1461: ! 1462: ( void ) linda; ! 1463: ( void ) qp; ! 1464: ( void ) gid; ! 1465: return 0; ! 1466: } ! 1467: ! 1468: /** ! 1469: * Detach from multicast group ! 1470: * ! 1471: * @v ibdev Infiniband device ! 1472: * @v qp Queue pair ! 1473: * @v gid Multicast GID ! 1474: */ ! 1475: static void linda_mcast_detach ( struct ib_device *ibdev, ! 1476: struct ib_queue_pair *qp, ! 1477: union ib_gid *gid ) { ! 1478: struct linda *linda = ib_get_drvdata ( ibdev ); ! 1479: ! 1480: ( void ) linda; ! 1481: ( void ) qp; ! 1482: ( void ) gid; ! 1483: } ! 1484: ! 1485: /** Linda Infiniband operations */ ! 1486: static struct ib_device_operations linda_ib_operations = { ! 1487: .create_cq = linda_create_cq, ! 1488: .destroy_cq = linda_destroy_cq, ! 1489: .create_qp = linda_create_qp, ! 1490: .modify_qp = linda_modify_qp, ! 1491: .destroy_qp = linda_destroy_qp, ! 1492: .post_send = linda_post_send, ! 1493: .post_recv = linda_post_recv, ! 1494: .poll_cq = linda_poll_cq, ! 1495: .poll_eq = linda_poll_eq, ! 1496: .open = linda_open, ! 1497: .close = linda_close, ! 1498: .mcast_attach = linda_mcast_attach, ! 1499: .mcast_detach = linda_mcast_detach, ! 1500: .set_port_info = linda_set_port_info, ! 1501: .set_pkey_table = linda_set_pkey_table, ! 1502: }; ! 1503: ! 1504: /*************************************************************************** ! 1505: * ! 1506: * I2C bus operations ! 1507: * ! 1508: *************************************************************************** ! 1509: */ ! 1510: ! 1511: /** Linda I2C bit to GPIO mappings */ ! 1512: static unsigned int linda_i2c_bits[] = { ! 1513: [I2C_BIT_SCL] = ( 1 << LINDA_GPIO_SCL ), ! 1514: [I2C_BIT_SDA] = ( 1 << LINDA_GPIO_SDA ), ! 1515: }; ! 1516: ! 1517: /** ! 1518: * Read Linda I2C line status ! 1519: * ! 1520: * @v basher Bit-bashing interface ! 1521: * @v bit_id Bit number ! 1522: * @ret zero Input is a logic 0 ! 1523: * @ret non-zero Input is a logic 1 ! 1524: */ ! 1525: static int linda_i2c_read_bit ( struct bit_basher *basher, ! 1526: unsigned int bit_id ) { ! 1527: struct linda *linda = ! 1528: container_of ( basher, struct linda, i2c.basher ); ! 1529: struct QIB_7220_EXTStatus extstatus; ! 1530: unsigned int status; ! 1531: ! 1532: DBG_DISABLE ( DBGLVL_IO ); ! 1533: ! 1534: linda_readq ( linda, &extstatus, QIB_7220_EXTStatus_offset ); ! 1535: status = ( BIT_GET ( &extstatus, GPIOIn ) & linda_i2c_bits[bit_id] ); ! 1536: ! 1537: DBG_ENABLE ( DBGLVL_IO ); ! 1538: ! 1539: return status; ! 1540: } ! 1541: ! 1542: /** ! 1543: * Write Linda I2C line status ! 1544: * ! 1545: * @v basher Bit-bashing interface ! 1546: * @v bit_id Bit number ! 1547: * @v data Value to write ! 1548: */ ! 1549: static void linda_i2c_write_bit ( struct bit_basher *basher, ! 1550: unsigned int bit_id, unsigned long data ) { ! 1551: struct linda *linda = ! 1552: container_of ( basher, struct linda, i2c.basher ); ! 1553: struct QIB_7220_EXTCtrl extctrl; ! 1554: struct QIB_7220_GPIO gpioout; ! 1555: unsigned int bit = linda_i2c_bits[bit_id]; ! 1556: unsigned int outputs = 0; ! 1557: unsigned int output_enables = 0; ! 1558: ! 1559: DBG_DISABLE ( DBGLVL_IO ); ! 1560: ! 1561: /* Read current GPIO mask and outputs */ ! 1562: linda_readq ( linda, &extctrl, QIB_7220_EXTCtrl_offset ); ! 1563: linda_readq ( linda, &gpioout, QIB_7220_GPIOOut_offset ); ! 1564: ! 1565: /* Update outputs and output enables. I2C lines are tied ! 1566: * high, so we always set the output to 0 and use the output ! 1567: * enable to control the line. ! 1568: */ ! 1569: output_enables = BIT_GET ( &extctrl, GPIOOe ); ! 1570: output_enables = ( ( output_enables & ~bit ) | ( ~data & bit ) ); ! 1571: outputs = BIT_GET ( &gpioout, GPIO ); ! 1572: outputs = ( outputs & ~bit ); ! 1573: BIT_SET ( &extctrl, GPIOOe, output_enables ); ! 1574: BIT_SET ( &gpioout, GPIO, outputs ); ! 1575: ! 1576: /* Write the output enable first; that way we avoid logic ! 1577: * hazards. ! 1578: */ ! 1579: linda_writeq ( linda, &extctrl, QIB_7220_EXTCtrl_offset ); ! 1580: linda_writeq ( linda, &gpioout, QIB_7220_GPIOOut_offset ); ! 1581: mb(); ! 1582: ! 1583: DBG_ENABLE ( DBGLVL_IO ); ! 1584: } ! 1585: ! 1586: /** Linda I2C bit-bashing interface operations */ ! 1587: static struct bit_basher_operations linda_i2c_basher_ops = { ! 1588: .read = linda_i2c_read_bit, ! 1589: .write = linda_i2c_write_bit, ! 1590: }; ! 1591: ! 1592: /** ! 1593: * Initialise Linda I2C subsystem ! 1594: * ! 1595: * @v linda Linda device ! 1596: * @ret rc Return status code ! 1597: */ ! 1598: static int linda_init_i2c ( struct linda *linda ) { ! 1599: static int try_eeprom_address[] = { 0x51, 0x50 }; ! 1600: unsigned int i; ! 1601: int rc; ! 1602: ! 1603: /* Initialise bus */ ! 1604: if ( ( rc = init_i2c_bit_basher ( &linda->i2c, ! 1605: &linda_i2c_basher_ops ) ) != 0 ) { ! 1606: DBGC ( linda, "Linda %p could not initialise I2C bus: %s\n", ! 1607: linda, strerror ( rc ) ); ! 1608: return rc; ! 1609: } ! 1610: ! 1611: /* Probe for devices */ ! 1612: for ( i = 0 ; i < ( sizeof ( try_eeprom_address ) / ! 1613: sizeof ( try_eeprom_address[0] ) ) ; i++ ) { ! 1614: init_i2c_eeprom ( &linda->eeprom, try_eeprom_address[i] ); ! 1615: if ( ( rc = i2c_check_presence ( &linda->i2c.i2c, ! 1616: &linda->eeprom ) ) == 0 ) { ! 1617: DBGC2 ( linda, "Linda %p found EEPROM at %02x\n", ! 1618: linda, try_eeprom_address[i] ); ! 1619: return 0; ! 1620: } ! 1621: } ! 1622: ! 1623: DBGC ( linda, "Linda %p could not find EEPROM\n", linda ); ! 1624: return -ENODEV; ! 1625: } ! 1626: ! 1627: /** ! 1628: * Read EEPROM parameters ! 1629: * ! 1630: * @v linda Linda device ! 1631: * @v guid GUID to fill in ! 1632: * @ret rc Return status code ! 1633: */ ! 1634: static int linda_read_eeprom ( struct linda *linda, union ib_guid *guid ) { ! 1635: struct i2c_interface *i2c = &linda->i2c.i2c; ! 1636: int rc; ! 1637: ! 1638: /* Read GUID */ ! 1639: if ( ( rc = i2c->read ( i2c, &linda->eeprom, LINDA_EEPROM_GUID_OFFSET, ! 1640: guid->bytes, sizeof ( *guid ) ) ) != 0 ) { ! 1641: DBGC ( linda, "Linda %p could not read GUID: %s\n", ! 1642: linda, strerror ( rc ) ); ! 1643: return rc; ! 1644: } ! 1645: DBGC2 ( linda, "Linda %p has GUID " IB_GUID_FMT "\n", ! 1646: linda, IB_GUID_ARGS ( guid ) ); ! 1647: ! 1648: /* Read serial number (debug only) */ ! 1649: if ( DBG_LOG ) { ! 1650: uint8_t serial[LINDA_EEPROM_SERIAL_SIZE + 1]; ! 1651: ! 1652: serial[ sizeof ( serial ) - 1 ] = '\0'; ! 1653: if ( ( rc = i2c->read ( i2c, &linda->eeprom, ! 1654: LINDA_EEPROM_SERIAL_OFFSET, serial, ! 1655: ( sizeof ( serial ) - 1 ) ) ) != 0 ) { ! 1656: DBGC ( linda, "Linda %p could not read serial: %s\n", ! 1657: linda, strerror ( rc ) ); ! 1658: return rc; ! 1659: } ! 1660: DBGC2 ( linda, "Linda %p has serial number \"%s\"\n", ! 1661: linda, serial ); ! 1662: } ! 1663: ! 1664: return 0; ! 1665: } ! 1666: ! 1667: /*************************************************************************** ! 1668: * ! 1669: * External parallel bus access ! 1670: * ! 1671: *************************************************************************** ! 1672: */ ! 1673: ! 1674: /** ! 1675: * Request ownership of the IB external parallel bus ! 1676: * ! 1677: * @v linda Linda device ! 1678: * @ret rc Return status code ! 1679: */ ! 1680: static int linda_ib_epb_request ( struct linda *linda ) { ! 1681: struct QIB_7220_ibsd_epb_access_ctrl access; ! 1682: unsigned int i; ! 1683: ! 1684: /* Request ownership */ ! 1685: memset ( &access, 0, sizeof ( access ) ); ! 1686: BIT_FILL_1 ( &access, sw_ib_epb_req, 1 ); ! 1687: linda_writeq ( linda, &access, QIB_7220_ibsd_epb_access_ctrl_offset ); ! 1688: ! 1689: /* Wait for ownership to be granted */ ! 1690: for ( i = 0 ; i < LINDA_EPB_REQUEST_MAX_WAIT_US ; i++ ) { ! 1691: linda_readq ( linda, &access, ! 1692: QIB_7220_ibsd_epb_access_ctrl_offset ); ! 1693: if ( BIT_GET ( &access, sw_ib_epb_req_granted ) ) ! 1694: return 0; ! 1695: udelay ( 1 ); ! 1696: } ! 1697: ! 1698: DBGC ( linda, "Linda %p timed out waiting for IB EPB request\n", ! 1699: linda ); ! 1700: return -ETIMEDOUT; ! 1701: } ! 1702: ! 1703: /** ! 1704: * Wait for IB external parallel bus transaction to complete ! 1705: * ! 1706: * @v linda Linda device ! 1707: * @v xact Buffer to hold transaction result ! 1708: * @ret rc Return status code ! 1709: */ ! 1710: static int linda_ib_epb_wait ( struct linda *linda, ! 1711: struct QIB_7220_ibsd_epb_transaction_reg *xact ) { ! 1712: unsigned int i; ! 1713: ! 1714: /* Discard first read to allow for signals crossing clock domains */ ! 1715: linda_readq ( linda, xact, QIB_7220_ibsd_epb_transaction_reg_offset ); ! 1716: ! 1717: for ( i = 0 ; i < LINDA_EPB_XACT_MAX_WAIT_US ; i++ ) { ! 1718: linda_readq ( linda, xact, ! 1719: QIB_7220_ibsd_epb_transaction_reg_offset ); ! 1720: if ( BIT_GET ( xact, ib_epb_rdy ) ) { ! 1721: if ( BIT_GET ( xact, ib_epb_req_error ) ) { ! 1722: DBGC ( linda, "Linda %p EPB transaction " ! 1723: "failed\n", linda ); ! 1724: return -EIO; ! 1725: } else { ! 1726: return 0; ! 1727: } ! 1728: } ! 1729: udelay ( 1 ); ! 1730: } ! 1731: ! 1732: DBGC ( linda, "Linda %p timed out waiting for IB EPB transaction\n", ! 1733: linda ); ! 1734: return -ETIMEDOUT; ! 1735: } ! 1736: ! 1737: /** ! 1738: * Release ownership of the IB external parallel bus ! 1739: * ! 1740: * @v linda Linda device ! 1741: */ ! 1742: static void linda_ib_epb_release ( struct linda *linda ) { ! 1743: struct QIB_7220_ibsd_epb_access_ctrl access; ! 1744: ! 1745: memset ( &access, 0, sizeof ( access ) ); ! 1746: BIT_FILL_1 ( &access, sw_ib_epb_req, 0 ); ! 1747: linda_writeq ( linda, &access, QIB_7220_ibsd_epb_access_ctrl_offset ); ! 1748: } ! 1749: ! 1750: /** ! 1751: * Read data via IB external parallel bus ! 1752: * ! 1753: * @v linda Linda device ! 1754: * @v location EPB location ! 1755: * @ret data Data read, or negative error ! 1756: * ! 1757: * You must have already acquired ownership of the IB external ! 1758: * parallel bus. ! 1759: */ ! 1760: static int linda_ib_epb_read ( struct linda *linda, unsigned int location ) { ! 1761: struct QIB_7220_ibsd_epb_transaction_reg xact; ! 1762: unsigned int data; ! 1763: int rc; ! 1764: ! 1765: /* Ensure no transaction is currently in progress */ ! 1766: if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 ) ! 1767: return rc; ! 1768: ! 1769: /* Process data */ ! 1770: memset ( &xact, 0, sizeof ( xact ) ); ! 1771: BIT_FILL_3 ( &xact, ! 1772: ib_epb_address, LINDA_EPB_LOC_ADDRESS ( location ), ! 1773: ib_epb_read_write, LINDA_EPB_READ, ! 1774: ib_epb_cs, LINDA_EPB_LOC_CS ( location ) ); ! 1775: linda_writeq ( linda, &xact, ! 1776: QIB_7220_ibsd_epb_transaction_reg_offset ); ! 1777: ! 1778: /* Wait for transaction to complete */ ! 1779: if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 ) ! 1780: return rc; ! 1781: ! 1782: data = BIT_GET ( &xact, ib_epb_data ); ! 1783: return data; ! 1784: } ! 1785: ! 1786: /** ! 1787: * Write data via IB external parallel bus ! 1788: * ! 1789: * @v linda Linda device ! 1790: * @v location EPB location ! 1791: * @v data Data to write ! 1792: * @ret rc Return status code ! 1793: * ! 1794: * You must have already acquired ownership of the IB external ! 1795: * parallel bus. ! 1796: */ ! 1797: static int linda_ib_epb_write ( struct linda *linda, unsigned int location, ! 1798: unsigned int data ) { ! 1799: struct QIB_7220_ibsd_epb_transaction_reg xact; ! 1800: int rc; ! 1801: ! 1802: /* Ensure no transaction is currently in progress */ ! 1803: if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 ) ! 1804: return rc; ! 1805: ! 1806: /* Process data */ ! 1807: memset ( &xact, 0, sizeof ( xact ) ); ! 1808: BIT_FILL_4 ( &xact, ! 1809: ib_epb_data, data, ! 1810: ib_epb_address, LINDA_EPB_LOC_ADDRESS ( location ), ! 1811: ib_epb_read_write, LINDA_EPB_WRITE, ! 1812: ib_epb_cs, LINDA_EPB_LOC_CS ( location ) ); ! 1813: linda_writeq ( linda, &xact, ! 1814: QIB_7220_ibsd_epb_transaction_reg_offset ); ! 1815: ! 1816: /* Wait for transaction to complete */ ! 1817: if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 ) ! 1818: return rc; ! 1819: ! 1820: return 0; ! 1821: } ! 1822: ! 1823: /** ! 1824: * Read/modify/write EPB register ! 1825: * ! 1826: * @v linda Linda device ! 1827: * @v cs Chip select ! 1828: * @v channel Channel ! 1829: * @v element Element ! 1830: * @v reg Register ! 1831: * @v value Value to set ! 1832: * @v mask Mask to apply to old value ! 1833: * @ret rc Return status code ! 1834: */ ! 1835: static int linda_ib_epb_mod_reg ( struct linda *linda, unsigned int cs, ! 1836: unsigned int channel, unsigned int element, ! 1837: unsigned int reg, unsigned int value, ! 1838: unsigned int mask ) { ! 1839: unsigned int location; ! 1840: int old_value; ! 1841: int rc; ! 1842: ! 1843: DBG_DISABLE ( DBGLVL_IO ); ! 1844: ! 1845: /* Sanity check */ ! 1846: assert ( ( value & mask ) == value ); ! 1847: ! 1848: /* Acquire bus ownership */ ! 1849: if ( ( rc = linda_ib_epb_request ( linda ) ) != 0 ) ! 1850: goto out; ! 1851: ! 1852: /* Read existing value, if necessary */ ! 1853: location = LINDA_EPB_LOC ( cs, channel, element, reg ); ! 1854: if ( (~mask) & 0xff ) { ! 1855: old_value = linda_ib_epb_read ( linda, location ); ! 1856: if ( old_value < 0 ) { ! 1857: rc = old_value; ! 1858: goto out_release; ! 1859: } ! 1860: } else { ! 1861: old_value = 0; ! 1862: } ! 1863: ! 1864: /* Update value */ ! 1865: value = ( ( old_value & ~mask ) | value ); ! 1866: DBGCP ( linda, "Linda %p CS %d EPB(%d,%d,%#02x) %#02x => %#02x\n", ! 1867: linda, cs, channel, element, reg, old_value, value ); ! 1868: if ( ( rc = linda_ib_epb_write ( linda, location, value ) ) != 0 ) ! 1869: goto out_release; ! 1870: ! 1871: out_release: ! 1872: /* Release bus */ ! 1873: linda_ib_epb_release ( linda ); ! 1874: out: ! 1875: DBG_ENABLE ( DBGLVL_IO ); ! 1876: return rc; ! 1877: } ! 1878: ! 1879: /** ! 1880: * Transfer data to/from microcontroller RAM ! 1881: * ! 1882: * @v linda Linda device ! 1883: * @v address Starting address ! 1884: * @v write Data to write, or NULL ! 1885: * @v read Data to read, or NULL ! 1886: * @v len Length of data ! 1887: * @ret rc Return status code ! 1888: */ ! 1889: static int linda_ib_epb_ram_xfer ( struct linda *linda, unsigned int address, ! 1890: const void *write, void *read, ! 1891: size_t len ) { ! 1892: unsigned int control; ! 1893: unsigned int address_hi; ! 1894: unsigned int address_lo; ! 1895: int data; ! 1896: int rc; ! 1897: ! 1898: DBG_DISABLE ( DBGLVL_IO ); ! 1899: ! 1900: assert ( ! ( write && read ) ); ! 1901: assert ( ( address % LINDA_EPB_UC_CHUNK_SIZE ) == 0 ); ! 1902: assert ( ( len % LINDA_EPB_UC_CHUNK_SIZE ) == 0 ); ! 1903: ! 1904: /* Acquire bus ownership */ ! 1905: if ( ( rc = linda_ib_epb_request ( linda ) ) != 0 ) ! 1906: goto out; ! 1907: ! 1908: /* Process data */ ! 1909: while ( len ) { ! 1910: ! 1911: /* Reset the address for each new chunk */ ! 1912: if ( ( address % LINDA_EPB_UC_CHUNK_SIZE ) == 0 ) { ! 1913: ! 1914: /* Write the control register */ ! 1915: control = ( read ? LINDA_EPB_UC_CTL_READ : ! 1916: LINDA_EPB_UC_CTL_WRITE ); ! 1917: if ( ( rc = linda_ib_epb_write ( linda, ! 1918: LINDA_EPB_UC_CTL, ! 1919: control ) ) != 0 ) ! 1920: break; ! 1921: ! 1922: /* Write the address registers */ ! 1923: address_hi = ( address >> 8 ); ! 1924: if ( ( rc = linda_ib_epb_write ( linda, ! 1925: LINDA_EPB_UC_ADDR_HI, ! 1926: address_hi ) ) != 0 ) ! 1927: break; ! 1928: address_lo = ( address & 0xff ); ! 1929: if ( ( rc = linda_ib_epb_write ( linda, ! 1930: LINDA_EPB_UC_ADDR_LO, ! 1931: address_lo ) ) != 0 ) ! 1932: break; ! 1933: } ! 1934: ! 1935: /* Read or write the data */ ! 1936: if ( read ) { ! 1937: data = linda_ib_epb_read ( linda, LINDA_EPB_UC_DATA ); ! 1938: if ( data < 0 ) { ! 1939: rc = data; ! 1940: break; ! 1941: } ! 1942: *( ( uint8_t * ) read++ ) = data; ! 1943: } else { ! 1944: data = *( ( uint8_t * ) write++ ); ! 1945: if ( ( rc = linda_ib_epb_write ( linda, ! 1946: LINDA_EPB_UC_DATA, ! 1947: data ) ) != 0 ) ! 1948: break; ! 1949: } ! 1950: address++; ! 1951: len--; ! 1952: ! 1953: /* Reset the control byte after each chunk */ ! 1954: if ( ( address % LINDA_EPB_UC_CHUNK_SIZE ) == 0 ) { ! 1955: if ( ( rc = linda_ib_epb_write ( linda, ! 1956: LINDA_EPB_UC_CTL, ! 1957: 0 ) ) != 0 ) ! 1958: break; ! 1959: } ! 1960: } ! 1961: ! 1962: /* Release bus */ ! 1963: linda_ib_epb_release ( linda ); ! 1964: ! 1965: out: ! 1966: DBG_ENABLE ( DBGLVL_IO ); ! 1967: return rc; ! 1968: } ! 1969: ! 1970: /*************************************************************************** ! 1971: * ! 1972: * Infiniband SerDes initialisation ! 1973: * ! 1974: *************************************************************************** ! 1975: */ ! 1976: ! 1977: /** A Linda SerDes parameter */ ! 1978: struct linda_serdes_param { ! 1979: /** EPB address as constructed by LINDA_EPB_ADDRESS() */ ! 1980: uint16_t address; ! 1981: /** Value to set */ ! 1982: uint8_t value; ! 1983: /** Mask to apply to old value */ ! 1984: uint8_t mask; ! 1985: } __packed; ! 1986: ! 1987: /** Magic "all channels" channel number */ ! 1988: #define LINDA_EPB_ALL_CHANNELS 31 ! 1989: ! 1990: /** End of SerDes parameter list marker */ ! 1991: #define LINDA_SERDES_PARAM_END { 0, 0, 0 } ! 1992: ! 1993: /** ! 1994: * Program IB SerDes register(s) ! 1995: * ! 1996: * @v linda Linda device ! 1997: * @v param SerDes parameter ! 1998: * @ret rc Return status code ! 1999: */ ! 2000: static int linda_set_serdes_param ( struct linda *linda, ! 2001: struct linda_serdes_param *param ) { ! 2002: unsigned int channel; ! 2003: unsigned int channel_start; ! 2004: unsigned int channel_end; ! 2005: unsigned int element; ! 2006: unsigned int reg; ! 2007: int rc; ! 2008: ! 2009: /* Break down the EPB address and determine channels */ ! 2010: channel = LINDA_EPB_ADDRESS_CHANNEL ( param->address ); ! 2011: element = LINDA_EPB_ADDRESS_ELEMENT ( param->address ); ! 2012: reg = LINDA_EPB_ADDRESS_REG ( param->address ); ! 2013: if ( channel == LINDA_EPB_ALL_CHANNELS ) { ! 2014: channel_start = 0; ! 2015: channel_end = 3; ! 2016: } else { ! 2017: channel_start = channel_end = channel; ! 2018: } ! 2019: ! 2020: /* Modify register for each specified channel */ ! 2021: for ( channel = channel_start ; channel <= channel_end ; channel++ ) { ! 2022: if ( ( rc = linda_ib_epb_mod_reg ( linda, LINDA_EPB_CS_SERDES, ! 2023: channel, element, reg, ! 2024: param->value, ! 2025: param->mask ) ) != 0 ) ! 2026: return rc; ! 2027: } ! 2028: ! 2029: return 0; ! 2030: } ! 2031: ! 2032: /** ! 2033: * Program IB SerDes registers ! 2034: * ! 2035: * @v linda Linda device ! 2036: * @v param SerDes parameters ! 2037: * @v count Number of parameters ! 2038: * @ret rc Return status code ! 2039: */ ! 2040: static int linda_set_serdes_params ( struct linda *linda, ! 2041: struct linda_serdes_param *params ) { ! 2042: int rc; ! 2043: ! 2044: for ( ; params->mask != 0 ; params++ ){ ! 2045: if ( ( rc = linda_set_serdes_param ( linda, ! 2046: params ) ) != 0 ) ! 2047: return rc; ! 2048: } ! 2049: ! 2050: return 0; ! 2051: } ! 2052: ! 2053: #define LINDA_DDS_VAL( amp_d, main_d, ipst_d, ipre_d, \ ! 2054: amp_s, main_s, ipst_s, ipre_s ) \ ! 2055: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x00 ), \ ! 2056: ( ( ( amp_d & 0x1f ) << 1 ) | 1 ), 0xff }, \ ! 2057: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x01 ), \ ! 2058: ( ( ( amp_s & 0x1f ) << 1 ) | 1 ), 0xff }, \ ! 2059: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x09 ), \ ! 2060: ( ( main_d << 3 ) | 4 | ( ipre_d >> 2 ) ), 0xff }, \ ! 2061: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x0a ), \ ! 2062: ( ( main_s << 3 ) | 4 | ( ipre_s >> 2 ) ), 0xff }, \ ! 2063: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x06 ), \ ! 2064: ( ( ( ipst_d & 0xf ) << 1 ) | \ ! 2065: ( ( ipre_d & 3 ) << 6 ) | 0x21 ), 0xff }, \ ! 2066: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x07 ), \ ! 2067: ( ( ( ipst_s & 0xf ) << 1 ) | \ ! 2068: ( ( ipre_s & 3 ) << 6) | 0x21 ), 0xff } ! 2069: ! 2070: /** ! 2071: * Linda SerDes default parameters ! 2072: * ! 2073: * These magic start-of-day values are taken from the Linux driver. ! 2074: */ ! 2075: static struct linda_serdes_param linda_serdes_defaults1[] = { ! 2076: /* RXHSCTRL0 */ ! 2077: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x00 ), 0xd4, 0xff }, ! 2078: /* VCDL_DAC2 */ ! 2079: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x05 ), 0x2d, 0xff }, ! 2080: /* VCDL_CTRL2 */ ! 2081: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x08 ), 0x03, 0x0f }, ! 2082: /* START_EQ1 */ ! 2083: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x27 ), 0x10, 0xff }, ! 2084: /* START_EQ2 */ ! 2085: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x28 ), 0x30, 0xff }, ! 2086: /* BACTRL */ ! 2087: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x0e ), 0x40, 0xff }, ! 2088: /* LDOUTCTRL1 */ ! 2089: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x06 ), 0x04, 0xff }, ! 2090: /* RXHSSTATUS */ ! 2091: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x0f ), 0x04, 0xff }, ! 2092: /* End of this block */ ! 2093: LINDA_SERDES_PARAM_END ! 2094: }; ! 2095: static struct linda_serdes_param linda_serdes_defaults2[] = { ! 2096: /* LDOUTCTRL1 */ ! 2097: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x06 ), 0x00, 0xff }, ! 2098: /* DDS values */ ! 2099: LINDA_DDS_VAL ( 31, 19, 12, 0, 29, 22, 9, 0 ), ! 2100: /* Set Rcv Eq. to Preset node */ ! 2101: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x27 ), 0x10, 0xff }, ! 2102: /* DFELTHFDR */ ! 2103: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x08 ), 0x00, 0xff }, ! 2104: /* DFELTHHDR */ ! 2105: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x21 ), 0x00, 0xff }, ! 2106: /* TLTHFDR */ ! 2107: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x09 ), 0x02, 0xff }, ! 2108: /* TLTHHDR */ ! 2109: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x23 ), 0x02, 0xff }, ! 2110: /* ZFR */ ! 2111: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1b ), 0x0c, 0xff }, ! 2112: /* ZCNT) */ ! 2113: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1c ), 0x0c, 0xff }, ! 2114: /* GFR */ ! 2115: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1e ), 0x10, 0xff }, ! 2116: /* GHR */ ! 2117: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1f ), 0x10, 0xff }, ! 2118: /* VCDL_CTRL0 toggle */ ! 2119: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x06 ), 0x20, 0xff }, ! 2120: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x06 ), 0x00, 0xff }, ! 2121: /* CMUCTRL5 */ ! 2122: { LINDA_EPB_ADDRESS ( 7, 0, 0x15 ), 0x80, 0xff }, ! 2123: /* End of this block */ ! 2124: LINDA_SERDES_PARAM_END ! 2125: }; ! 2126: static struct linda_serdes_param linda_serdes_defaults3[] = { ! 2127: /* START_EQ1 */ ! 2128: { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x27 ), 0x00, 0x38 }, ! 2129: /* End of this block */ ! 2130: LINDA_SERDES_PARAM_END ! 2131: }; ! 2132: ! 2133: /** ! 2134: * Program the microcontroller RAM ! 2135: * ! 2136: * @v linda Linda device ! 2137: * @ret rc Return status code ! 2138: */ ! 2139: static int linda_program_uc_ram ( struct linda *linda ) { ! 2140: int rc; ! 2141: ! 2142: if ( ( rc = linda_ib_epb_ram_xfer ( linda, 0, linda_ib_fw, NULL, ! 2143: sizeof ( linda_ib_fw ) ) ) != 0 ){ ! 2144: DBGC ( linda, "Linda %p could not load IB firmware: %s\n", ! 2145: linda, strerror ( rc ) ); ! 2146: return rc; ! 2147: } ! 2148: ! 2149: return 0; ! 2150: } ! 2151: ! 2152: /** ! 2153: * Verify the microcontroller RAM ! 2154: * ! 2155: * @v linda Linda device ! 2156: * @ret rc Return status code ! 2157: */ ! 2158: static int linda_verify_uc_ram ( struct linda *linda ) { ! 2159: uint8_t verify[LINDA_EPB_UC_CHUNK_SIZE]; ! 2160: unsigned int offset; ! 2161: int rc; ! 2162: ! 2163: for ( offset = 0 ; offset < sizeof ( linda_ib_fw ); ! 2164: offset += sizeof ( verify ) ) { ! 2165: if ( ( rc = linda_ib_epb_ram_xfer ( linda, offset, ! 2166: NULL, verify, ! 2167: sizeof (verify) )) != 0 ){ ! 2168: DBGC ( linda, "Linda %p could not read back IB " ! 2169: "firmware: %s\n", linda, strerror ( rc ) ); ! 2170: return rc; ! 2171: } ! 2172: if ( memcmp ( ( linda_ib_fw + offset ), verify, ! 2173: sizeof ( verify ) ) != 0 ) { ! 2174: DBGC ( linda, "Linda %p firmware verification failed " ! 2175: "at offset %#x\n", linda, offset ); ! 2176: DBGC_HDA ( linda, offset, ( linda_ib_fw + offset ), ! 2177: sizeof ( verify ) ); ! 2178: DBGC_HDA ( linda, offset, verify, sizeof ( verify ) ); ! 2179: return -EIO; ! 2180: } ! 2181: } ! 2182: ! 2183: DBGC2 ( linda, "Linda %p firmware verified ok\n", linda ); ! 2184: return 0; ! 2185: } ! 2186: ! 2187: /** ! 2188: * Use the microcontroller to trim the IB link ! 2189: * ! 2190: * @v linda Linda device ! 2191: * @ret rc Return status code ! 2192: */ ! 2193: static int linda_trim_ib ( struct linda *linda ) { ! 2194: struct QIB_7220_IBSerDesCtrl ctrl; ! 2195: struct QIB_7220_IntStatus intstatus; ! 2196: unsigned int i; ! 2197: int rc; ! 2198: ! 2199: /* Bring the microcontroller out of reset */ ! 2200: linda_readq ( linda, &ctrl, QIB_7220_IBSerDesCtrl_offset ); ! 2201: BIT_SET ( &ctrl, ResetIB_uC_Core, 0 ); ! 2202: linda_writeq ( linda, &ctrl, QIB_7220_IBSerDesCtrl_offset ); ! 2203: ! 2204: /* Wait for the "trim done" signal */ ! 2205: for ( i = 0 ; i < LINDA_TRIM_DONE_MAX_WAIT_MS ; i++ ) { ! 2206: linda_readq ( linda, &intstatus, QIB_7220_IntStatus_offset ); ! 2207: if ( BIT_GET ( &intstatus, IBSerdesTrimDone ) ) { ! 2208: rc = 0; ! 2209: goto out_reset; ! 2210: } ! 2211: mdelay ( 1 ); ! 2212: } ! 2213: ! 2214: DBGC ( linda, "Linda %p timed out waiting for trim done\n", linda ); ! 2215: rc = -ETIMEDOUT; ! 2216: out_reset: ! 2217: /* Put the microcontroller back into reset */ ! 2218: BIT_SET ( &ctrl, ResetIB_uC_Core, 1 ); ! 2219: linda_writeq ( linda, &ctrl, QIB_7220_IBSerDesCtrl_offset ); ! 2220: ! 2221: return rc; ! 2222: } ! 2223: ! 2224: /** ! 2225: * Initialise the IB SerDes ! 2226: * ! 2227: * @v linda Linda device ! 2228: * @ret rc Return status code ! 2229: */ ! 2230: static int linda_init_ib_serdes ( struct linda *linda ) { ! 2231: struct QIB_7220_Control control; ! 2232: struct QIB_7220_IBCCtrl ibcctrl; ! 2233: struct QIB_7220_IBCDDRCtrl ibcddrctrl; ! 2234: struct QIB_7220_XGXSCfg xgxscfg; ! 2235: int rc; ! 2236: ! 2237: /* Disable link */ ! 2238: linda_readq ( linda, &control, QIB_7220_Control_offset ); ! 2239: BIT_SET ( &control, LinkEn, 0 ); ! 2240: linda_writeq ( linda, &control, QIB_7220_Control_offset ); ! 2241: ! 2242: /* Configure sensible defaults for IBC */ ! 2243: memset ( &ibcctrl, 0, sizeof ( ibcctrl ) ); ! 2244: BIT_FILL_6 ( &ibcctrl, /* Tuning values taken from Linux driver */ ! 2245: FlowCtrlPeriod, 0x03, ! 2246: FlowCtrlWaterMark, 0x05, ! 2247: MaxPktLen, ( ( LINDA_RECV_HEADER_SIZE + ! 2248: LINDA_RECV_PAYLOAD_SIZE + ! 2249: 4 /* ICRC */ ) >> 2 ), ! 2250: PhyerrThreshold, 0xf, ! 2251: OverrunThreshold, 0xf, ! 2252: CreditScale, 0x4 ); ! 2253: linda_writeq ( linda, &ibcctrl, QIB_7220_IBCCtrl_offset ); ! 2254: ! 2255: /* Force SDR only to avoid needing all the DDR tuning, ! 2256: * Mellanox compatibility hacks etc. SDR is plenty for ! 2257: * boot-time operation. ! 2258: */ ! 2259: linda_readq ( linda, &ibcddrctrl, QIB_7220_IBCDDRCtrl_offset ); ! 2260: BIT_SET ( &ibcddrctrl, IB_ENHANCED_MODE, 0 ); ! 2261: BIT_SET ( &ibcddrctrl, SD_SPEED_SDR, 1 ); ! 2262: BIT_SET ( &ibcddrctrl, SD_SPEED_DDR, 0 ); ! 2263: BIT_SET ( &ibcddrctrl, SD_SPEED_QDR, 0 ); ! 2264: BIT_SET ( &ibcddrctrl, HRTBT_ENB, 0 ); ! 2265: BIT_SET ( &ibcddrctrl, HRTBT_AUTO, 0 ); ! 2266: linda_writeq ( linda, &ibcddrctrl, QIB_7220_IBCDDRCtrl_offset ); ! 2267: ! 2268: /* Set default SerDes parameters */ ! 2269: if ( ( rc = linda_set_serdes_params ( linda, ! 2270: linda_serdes_defaults1 ) ) != 0 ) ! 2271: return rc; ! 2272: udelay ( 415 ); /* Magic delay while SerDes sorts itself out */ ! 2273: if ( ( rc = linda_set_serdes_params ( linda, ! 2274: linda_serdes_defaults2 ) ) != 0 ) ! 2275: return rc; ! 2276: ! 2277: /* Program the microcontroller RAM */ ! 2278: if ( ( rc = linda_program_uc_ram ( linda ) ) != 0 ) ! 2279: return rc; ! 2280: ! 2281: /* Verify the microcontroller RAM contents */ ! 2282: if ( DBGLVL_LOG ) { ! 2283: if ( ( rc = linda_verify_uc_ram ( linda ) ) != 0 ) ! 2284: return rc; ! 2285: } ! 2286: ! 2287: /* More SerDes tuning */ ! 2288: if ( ( rc = linda_set_serdes_params ( linda, ! 2289: linda_serdes_defaults3 ) ) != 0 ) ! 2290: return rc; ! 2291: ! 2292: /* Use the microcontroller to trim the IB link */ ! 2293: if ( ( rc = linda_trim_ib ( linda ) ) != 0 ) ! 2294: return rc; ! 2295: ! 2296: /* Bring XGXS out of reset */ ! 2297: linda_readq ( linda, &xgxscfg, QIB_7220_XGXSCfg_offset ); ! 2298: BIT_SET ( &xgxscfg, tx_rx_reset, 0 ); ! 2299: BIT_SET ( &xgxscfg, xcv_reset, 0 ); ! 2300: linda_writeq ( linda, &xgxscfg, QIB_7220_XGXSCfg_offset ); ! 2301: ! 2302: return rc; ! 2303: } ! 2304: ! 2305: /*************************************************************************** ! 2306: * ! 2307: * PCI layer interface ! 2308: * ! 2309: *************************************************************************** ! 2310: */ ! 2311: ! 2312: /** ! 2313: * Probe PCI device ! 2314: * ! 2315: * @v pci PCI device ! 2316: * @v id PCI ID ! 2317: * @ret rc Return status code ! 2318: */ ! 2319: static int linda_probe ( struct pci_device *pci ) { ! 2320: struct ib_device *ibdev; ! 2321: struct linda *linda; ! 2322: struct QIB_7220_Revision revision; ! 2323: int rc; ! 2324: ! 2325: /* Allocate Infiniband device */ ! 2326: ibdev = alloc_ibdev ( sizeof ( *linda ) ); ! 2327: if ( ! ibdev ) { ! 2328: rc = -ENOMEM; ! 2329: goto err_alloc_ibdev; ! 2330: } ! 2331: pci_set_drvdata ( pci, ibdev ); ! 2332: linda = ib_get_drvdata ( ibdev ); ! 2333: ibdev->op = &linda_ib_operations; ! 2334: ibdev->dev = &pci->dev; ! 2335: ibdev->port = 1; ! 2336: ! 2337: /* Fix up PCI device */ ! 2338: adjust_pci_device ( pci ); ! 2339: ! 2340: /* Get PCI BARs */ ! 2341: linda->regs = ioremap ( pci->membase, LINDA_BAR0_SIZE ); ! 2342: DBGC2 ( linda, "Linda %p has BAR at %08lx\n", linda, pci->membase ); ! 2343: ! 2344: /* Print some general data */ ! 2345: linda_readq ( linda, &revision, QIB_7220_Revision_offset ); ! 2346: DBGC2 ( linda, "Linda %p board %02lx v%ld.%ld.%ld.%ld\n", linda, ! 2347: BIT_GET ( &revision, BoardID ), ! 2348: BIT_GET ( &revision, R_SW ), ! 2349: BIT_GET ( &revision, R_Arch ), ! 2350: BIT_GET ( &revision, R_ChipRevMajor ), ! 2351: BIT_GET ( &revision, R_ChipRevMinor ) ); ! 2352: ! 2353: /* Record link capabilities. Note that we force SDR only to ! 2354: * avoid having to carry extra code for DDR tuning etc. ! 2355: */ ! 2356: ibdev->link_width_enabled = ibdev->link_width_supported = ! 2357: ( IB_LINK_WIDTH_4X | IB_LINK_WIDTH_1X ); ! 2358: ibdev->link_speed_enabled = ibdev->link_speed_supported = ! 2359: IB_LINK_SPEED_SDR; ! 2360: ! 2361: /* Initialise I2C subsystem */ ! 2362: if ( ( rc = linda_init_i2c ( linda ) ) != 0 ) ! 2363: goto err_init_i2c; ! 2364: ! 2365: /* Read EEPROM parameters */ ! 2366: if ( ( rc = linda_read_eeprom ( linda, &ibdev->node_guid ) ) != 0 ) ! 2367: goto err_read_eeprom; ! 2368: memcpy ( &ibdev->gid.s.guid, &ibdev->node_guid, ! 2369: sizeof ( ibdev->gid.s.guid ) ); ! 2370: ! 2371: /* Initialise send datapath */ ! 2372: if ( ( rc = linda_init_send ( linda ) ) != 0 ) ! 2373: goto err_init_send; ! 2374: ! 2375: /* Initialise receive datapath */ ! 2376: if ( ( rc = linda_init_recv ( linda ) ) != 0 ) ! 2377: goto err_init_recv; ! 2378: ! 2379: /* Initialise the IB SerDes */ ! 2380: if ( ( rc = linda_init_ib_serdes ( linda ) ) != 0 ) ! 2381: goto err_init_ib_serdes; ! 2382: ! 2383: /* Register Infiniband device */ ! 2384: if ( ( rc = register_ibdev ( ibdev ) ) != 0 ) { ! 2385: DBGC ( linda, "Linda %p could not register IB " ! 2386: "device: %s\n", linda, strerror ( rc ) ); ! 2387: goto err_register_ibdev; ! 2388: } ! 2389: ! 2390: return 0; ! 2391: ! 2392: unregister_ibdev ( ibdev ); ! 2393: err_register_ibdev: ! 2394: linda_fini_recv ( linda ); ! 2395: err_init_recv: ! 2396: linda_fini_send ( linda ); ! 2397: err_init_send: ! 2398: err_init_ib_serdes: ! 2399: err_read_eeprom: ! 2400: err_init_i2c: ! 2401: ibdev_put ( ibdev ); ! 2402: err_alloc_ibdev: ! 2403: return rc; ! 2404: } ! 2405: ! 2406: /** ! 2407: * Remove PCI device ! 2408: * ! 2409: * @v pci PCI device ! 2410: */ ! 2411: static void linda_remove ( struct pci_device *pci ) { ! 2412: struct ib_device *ibdev = pci_get_drvdata ( pci ); ! 2413: struct linda *linda = ib_get_drvdata ( ibdev ); ! 2414: ! 2415: unregister_ibdev ( ibdev ); ! 2416: linda_fini_recv ( linda ); ! 2417: linda_fini_send ( linda ); ! 2418: ibdev_put ( ibdev ); ! 2419: } ! 2420: ! 2421: static struct pci_device_id linda_nics[] = { ! 2422: PCI_ROM ( 0x1077, 0x7220, "iba7220", "QLE7240/7280 HCA driver", 0 ), ! 2423: }; ! 2424: ! 2425: struct pci_driver linda_driver __pci_driver = { ! 2426: .ids = linda_nics, ! 2427: .id_count = ( sizeof ( linda_nics ) / sizeof ( linda_nics[0] ) ), ! 2428: .probe = linda_probe, ! 2429: .remove = linda_remove, ! 2430: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.