linda.h

Go to the documentation of this file.
00001 #ifndef _LINDA_H
00002 #define _LINDA_H
00003 
00004 /*
00005  * Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
00006  *
00007  * This program is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU General Public License as
00009  * published by the Free Software Foundation; either version 2 of the
00010  * License, or any later version.
00011  *
00012  * This program is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software
00019  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00020  */
00021 
00022 FILE_LICENCE ( GPL2_OR_LATER );
00023 
00024 /**
00025  * @file
00026  *
00027  * QLogic Linda Infiniband HCA
00028  *
00029  */
00030 
00031 #define BITOPS_LITTLE_ENDIAN
00032 #include <gpxe/bitops.h>
00033 #include "qib_7220_regs.h"
00034 
00035 struct ib_device;
00036 
00037 /** A Linda GPIO register */
00038 struct QIB_7220_GPIO_pb {
00039         pseudo_bit_t GPIO[16];
00040         pseudo_bit_t Reserved[48];
00041 };
00042 struct QIB_7220_GPIO {
00043         PSEUDO_BIT_STRUCT ( struct QIB_7220_GPIO_pb );
00044 };
00045 
00046 /** A Linda general scalar register */
00047 struct QIB_7220_scalar_pb {
00048         pseudo_bit_t Value[64];
00049 };
00050 struct QIB_7220_scalar {
00051         PSEUDO_BIT_STRUCT ( struct QIB_7220_scalar_pb );
00052 };
00053 
00054 /** Linda send per-buffer control word */
00055 struct QIB_7220_SendPbc_pb {
00056         pseudo_bit_t LengthP1_toibc[11];
00057         pseudo_bit_t Reserved1[4];
00058         pseudo_bit_t LengthP1_trigger[11];
00059         pseudo_bit_t Reserved2[3];
00060         pseudo_bit_t TestEbp[1];
00061         pseudo_bit_t Test[1];
00062         pseudo_bit_t Intr[1];
00063         pseudo_bit_t Reserved3[31];
00064         pseudo_bit_t VL15[1];
00065 };
00066 struct QIB_7220_SendPbc {
00067         PSEUDO_BIT_STRUCT ( struct QIB_7220_SendPbc_pb );
00068 };
00069 
00070 /** Linda send buffer availability */
00071 struct QIB_7220_SendBufAvail_pb {
00072         pseudo_bit_t InUseCheck[144][2];
00073         pseudo_bit_t Reserved[32];
00074 };
00075 struct QIB_7220_SendBufAvail {
00076         PSEUDO_BIT_STRUCT ( struct QIB_7220_SendBufAvail_pb );
00077 };
00078 
00079 /** DMA alignment for send buffer availability */
00080 #define LINDA_SENDBUFAVAIL_ALIGN 64
00081 
00082 /** A Linda eager receive descriptor */
00083 struct QIB_7220_RcvEgr_pb {
00084         pseudo_bit_t Addr[37];
00085         pseudo_bit_t BufSize[3];
00086         pseudo_bit_t Reserved[24];
00087 };
00088 struct QIB_7220_RcvEgr {
00089         PSEUDO_BIT_STRUCT ( struct QIB_7220_RcvEgr_pb );
00090 };
00091 
00092 /** Linda receive header flags */
00093 struct QIB_7220_RcvHdrFlags_pb {
00094         pseudo_bit_t PktLen[11];
00095         pseudo_bit_t RcvType[3];
00096         pseudo_bit_t SoftB[1];
00097         pseudo_bit_t SoftA[1];
00098         pseudo_bit_t EgrIndex[12];
00099         pseudo_bit_t Reserved1[3];
00100         pseudo_bit_t UseEgrBfr[1];
00101         pseudo_bit_t RcvSeq[4];
00102         pseudo_bit_t HdrqOffset[11];
00103         pseudo_bit_t Reserved2[8];
00104         pseudo_bit_t IBErr[1];
00105         pseudo_bit_t MKErr[1];
00106         pseudo_bit_t TIDErr[1];
00107         pseudo_bit_t KHdrErr[1];
00108         pseudo_bit_t MTUErr[1];
00109         pseudo_bit_t LenErr[1];
00110         pseudo_bit_t ParityErr[1];
00111         pseudo_bit_t VCRCErr[1];
00112         pseudo_bit_t ICRCErr[1];
00113 };
00114 struct QIB_7220_RcvHdrFlags {
00115         PSEUDO_BIT_STRUCT ( struct QIB_7220_RcvHdrFlags_pb );
00116 };
00117 
00118 /** Linda memory BAR size */
00119 #define LINDA_BAR0_SIZE 0x400000
00120 
00121 /** Linda I2C SCL line GPIO number */
00122 #define LINDA_GPIO_SCL 0
00123 
00124 /** Linda I2C SDA line GPIO number */
00125 #define LINDA_GPIO_SDA 1
00126 
00127 /** GUID offset within EEPROM */
00128 #define LINDA_EEPROM_GUID_OFFSET 3
00129 
00130 /** GUID size within EEPROM */
00131 #define LINDA_EEPROM_GUID_SIZE 8
00132 
00133 /** Board serial number offset within EEPROM */
00134 #define LINDA_EEPROM_SERIAL_OFFSET 12
00135 
00136 /** Board serial number size within EEPROM */
00137 #define LINDA_EEPROM_SERIAL_SIZE 12
00138 
00139 /** Maximum number of send buffers used
00140  *
00141  * This is a policy decision.  Must be less than or equal to the total
00142  * number of send buffers supported by the hardware (128).
00143  */
00144 #define LINDA_MAX_SEND_BUFS 32
00145 
00146 /** Linda send buffer size */
00147 #define LINDA_SEND_BUF_SIZE 4096
00148 
00149 /** Number of contexts (including kernel context)
00150  *
00151  * This is a policy decision.  Must be 5, 9 or 17.
00152  */
00153 #define LINDA_NUM_CONTEXTS 5
00154 
00155 /** PortCfg values for different numbers of contexts */
00156 enum linda_portcfg {
00157         LINDA_PORTCFG_5CTX = 0,
00158         LINDA_PORTCFG_9CTX = 1,
00159         LINDA_PORTCFG_17CTX = 2,
00160 };
00161 
00162 /** PortCfg values for different numbers of contexts */
00163 #define LINDA_EAGER_ARRAY_SIZE_5CTX_0 2048
00164 #define LINDA_EAGER_ARRAY_SIZE_5CTX_OTHER 4096
00165 #define LINDA_EAGER_ARRAY_SIZE_9CTX_0 2048
00166 #define LINDA_EAGER_ARRAY_SIZE_9CTX_OTHER 2048
00167 #define LINDA_EAGER_ARRAY_SIZE_17CTX_0 2048
00168 #define LINDA_EAGER_ARRAY_SIZE_17CTX_OTHER 1024
00169 
00170 /** Eager buffer required alignment */
00171 #define LINDA_EAGER_BUFFER_ALIGN 2048
00172 
00173 /** Eager buffer size encodings */
00174 enum linda_eager_buffer_size {
00175         LINDA_EAGER_BUFFER_NONE = 0,
00176         LINDA_EAGER_BUFFER_2K = 1,
00177         LINDA_EAGER_BUFFER_4K = 2,
00178         LINDA_EAGER_BUFFER_8K = 3,
00179         LINDA_EAGER_BUFFER_16K = 4,
00180         LINDA_EAGER_BUFFER_32K = 5,
00181         LINDA_EAGER_BUFFER_64K = 6,
00182 };
00183 
00184 /** Number of RX headers per context
00185  *
00186  * This is a policy decision.
00187  */
00188 #define LINDA_RECV_HEADER_COUNT 8
00189 
00190 /** Maximum size of each RX header
00191  *
00192  * This is a policy decision.  Must be divisible by 4.
00193  */
00194 #define LINDA_RECV_HEADER_SIZE 96
00195 
00196 /** Total size of an RX header ring */
00197 #define LINDA_RECV_HEADERS_SIZE \
00198         ( LINDA_RECV_HEADER_SIZE * LINDA_RECV_HEADER_COUNT )
00199 
00200 /** RX header alignment */
00201 #define LINDA_RECV_HEADERS_ALIGN 64
00202 
00203 /** RX payload size
00204  *
00205  * This is a policy decision.  Must be a valid eager buffer size.
00206  */
00207 #define LINDA_RECV_PAYLOAD_SIZE 2048
00208 
00209 /** QPN used for Infinipath Packets
00210  *
00211  * This is a policy decision.  Must have bit 0 clear.  Must not be a
00212  * QPN that we will use.
00213  */
00214 #define LINDA_QP_IDETH 0xdead0
00215 
00216 /** Maximum time for wait for external parallel bus request, in us */
00217 #define LINDA_EPB_REQUEST_MAX_WAIT_US 500
00218 
00219 /** Maximum time for wait for external parallel bus transaction, in us */
00220 #define LINDA_EPB_XACT_MAX_WAIT_US 500
00221 
00222 /** Linda external parallel bus chip selects */
00223 #define LINDA_EPB_CS_SERDES 1
00224 #define LINDA_EPB_CS_UC 2
00225 
00226 /** Linda external parallel bus read/write operations */
00227 #define LINDA_EPB_WRITE 0
00228 #define LINDA_EPB_READ 1
00229 
00230 /** Linda external parallel bus register addresses */
00231 #define LINDA_EPB_ADDRESS( _channel, _element, _reg ) \
00232         ( (_element) | ( (_channel) << 4 ) | ( (_reg) << 9 ) )
00233 #define LINDA_EPB_ADDRESS_CHANNEL( _address )   ( ( (_address) >> 4 ) & 0x1f )
00234 #define LINDA_EPB_ADDRESS_ELEMENT( _address )   ( ( (_address) >> 0 ) & 0x0f )
00235 #define LINDA_EPB_ADDRESS_REG( _address )       ( ( (_address) >> 9 ) & 0x3f )
00236 
00237 /** Linda external parallel bus locations
00238  *
00239  * The location is used by the driver to encode both the chip select
00240  * and the EPB address.
00241  */
00242 #define LINDA_EPB_LOC( _cs, _channel, _element, _reg) \
00243         ( ( (_cs) << 16 ) | LINDA_EPB_ADDRESS ( _channel, _element, _reg ) )
00244 #define LINDA_EPB_LOC_ADDRESS( _loc )   ( (_loc) & 0xffff )
00245 #define LINDA_EPB_LOC_CS( _loc )        ( (_loc) >> 16 )
00246 
00247 /** Linda external parallel bus microcontroller register addresses */
00248 #define LINDA_EPB_UC_CHANNEL 6
00249 #define LINDA_EPB_UC_LOC( _reg ) \
00250         LINDA_EPB_LOC ( LINDA_EPB_CS_UC, LINDA_EPB_UC_CHANNEL, 0, (_reg) )
00251 #define LINDA_EPB_UC_CTL        LINDA_EPB_UC_LOC ( 0 )
00252 #define LINDA_EPB_UC_CTL_WRITE  1
00253 #define LINDA_EPB_UC_CTL_READ   2
00254 #define LINDA_EPB_UC_ADDR_LO    LINDA_EPB_UC_LOC ( 2 )
00255 #define LINDA_EPB_UC_ADDR_HI    LINDA_EPB_UC_LOC ( 3 )
00256 #define LINDA_EPB_UC_DATA       LINDA_EPB_UC_LOC ( 4 )
00257 #define LINDA_EPB_UC_CHUNK_SIZE 64
00258 
00259 extern uint8_t linda_ib_fw[8192];
00260 
00261 /** Maximum time to wait for "trim done" signal, in ms */
00262 #define LINDA_TRIM_DONE_MAX_WAIT_MS 1000
00263 
00264 /** Linda link states */
00265 enum linda_link_state {
00266         LINDA_LINK_STATE_DOWN = 0,
00267         LINDA_LINK_STATE_INIT = 1,
00268         LINDA_LINK_STATE_ARM = 2,
00269         LINDA_LINK_STATE_ACTIVE = 3,
00270         LINDA_LINK_STATE_ACT_DEFER = 4,
00271 };
00272 
00273 /** Maximum time to wait for link state changes, in us */
00274 #define LINDA_LINK_STATE_MAX_WAIT_US 20
00275 
00276 #endif /* _LINDA_H */

Generated on Tue Apr 6 20:00:53 2010 for gPXE by  doxygen 1.5.7.1