Annotation of qemu/roms/ipxe/src/drivers/infiniband/hermon.h, revision 1.1

1.1     ! root        1: #ifndef _HERMON_H
        !             2: #define _HERMON_H
        !             3: 
        !             4: /** @file
        !             5:  *
        !             6:  * Mellanox Hermon Infiniband HCA driver
        !             7:  *
        !             8:  */
        !             9: 
        !            10: FILE_LICENCE ( GPL2_OR_LATER );
        !            11: 
        !            12: #include <stdint.h>
        !            13: #include <ipxe/uaccess.h>
        !            14: #include <ipxe/ib_packet.h>
        !            15: #include <ipxe/bofm.h>
        !            16: #include "mlx_bitops.h"
        !            17: #include "MT25408_PRM.h"
        !            18: 
        !            19: /*
        !            20:  * Hardware constants
        !            21:  *
        !            22:  */
        !            23: 
        !            24: /* Ports in existence */
        !            25: #define HERMON_MAX_PORTS               2
        !            26: #define HERMON_PORT_BASE               1
        !            27: 
        !            28: /* PCI BARs */
        !            29: #define HERMON_PCI_CONFIG_BAR          PCI_BASE_ADDRESS_0
        !            30: #define HERMON_PCI_CONFIG_BAR_SIZE     0x100000
        !            31: #define HERMON_PCI_UAR_BAR             PCI_BASE_ADDRESS_2
        !            32: 
        !            33: /* Device reset */
        !            34: #define HERMON_RESET_OFFSET            0x0f0010
        !            35: #define HERMON_RESET_MAGIC             0x01000000UL
        !            36: #define HERMON_RESET_WAIT_TIME_MS      1000
        !            37: 
        !            38: /* Work queue entry and completion queue entry opcodes */
        !            39: #define HERMON_OPCODE_NOP              0x00
        !            40: #define HERMON_OPCODE_SEND             0x0a
        !            41: #define HERMON_OPCODE_RECV_ERROR       0xfe
        !            42: #define HERMON_OPCODE_SEND_ERROR       0xff
        !            43: 
        !            44: /* HCA command register opcodes */
        !            45: #define HERMON_HCR_QUERY_DEV_CAP       0x0003
        !            46: #define HERMON_HCR_QUERY_FW            0x0004
        !            47: #define HERMON_HCR_INIT_HCA            0x0007
        !            48: #define HERMON_HCR_CLOSE_HCA           0x0008
        !            49: #define HERMON_HCR_INIT_PORT           0x0009
        !            50: #define HERMON_HCR_CLOSE_PORT          0x000a
        !            51: #define HERMON_HCR_SET_PORT            0x000c
        !            52: #define HERMON_HCR_SW2HW_MPT           0x000d
        !            53: #define HERMON_HCR_WRITE_MTT           0x0011
        !            54: #define HERMON_HCR_MAP_EQ              0x0012
        !            55: #define HERMON_HCR_SW2HW_EQ            0x0013
        !            56: #define HERMON_HCR_HW2SW_EQ            0x0014
        !            57: #define HERMON_HCR_QUERY_EQ            0x0015
        !            58: #define HERMON_HCR_SW2HW_CQ            0x0016
        !            59: #define HERMON_HCR_HW2SW_CQ            0x0017
        !            60: #define HERMON_HCR_QUERY_CQ            0x0018
        !            61: #define HERMON_HCR_RST2INIT_QP         0x0019
        !            62: #define HERMON_HCR_INIT2RTR_QP         0x001a
        !            63: #define HERMON_HCR_RTR2RTS_QP          0x001b
        !            64: #define HERMON_HCR_RTS2RTS_QP          0x001c
        !            65: #define HERMON_HCR_2RST_QP             0x0021
        !            66: #define HERMON_HCR_QUERY_QP            0x0022
        !            67: #define HERMON_HCR_CONF_SPECIAL_QP     0x0023
        !            68: #define HERMON_HCR_MAD_IFC             0x0024
        !            69: #define HERMON_HCR_READ_MCG            0x0025
        !            70: #define HERMON_HCR_WRITE_MCG           0x0026
        !            71: #define HERMON_HCR_MGID_HASH           0x0027
        !            72: #define HERMON_HCR_MOD_STAT_CFG                0x0034
        !            73: #define HERMON_HCR_QUERY_PORT          0x0043
        !            74: #define HERMON_HCR_SENSE_PORT          0x004d
        !            75: #define HERMON_HCR_RUN_FW              0x0ff6
        !            76: #define HERMON_HCR_DISABLE_LAM         0x0ff7
        !            77: #define HERMON_HCR_ENABLE_LAM          0x0ff8
        !            78: #define HERMON_HCR_UNMAP_ICM           0x0ff9
        !            79: #define HERMON_HCR_MAP_ICM             0x0ffa
        !            80: #define HERMON_HCR_UNMAP_ICM_AUX       0x0ffb
        !            81: #define HERMON_HCR_MAP_ICM_AUX         0x0ffc
        !            82: #define HERMON_HCR_SET_ICM_SIZE                0x0ffd
        !            83: #define HERMON_HCR_UNMAP_FA            0x0ffe
        !            84: #define HERMON_HCR_MAP_FA              0x0fff
        !            85: 
        !            86: /* Service types */
        !            87: #define HERMON_ST_RC                   0x00
        !            88: #define HERMON_ST_UD                   0x03
        !            89: #define HERMON_ST_MLX                  0x07
        !            90: 
        !            91: /* Port types */
        !            92: #define HERMON_PORT_TYPE_UNKNOWN       0
        !            93: #define HERMON_PORT_TYPE_IB            1
        !            94: #define HERMON_PORT_TYPE_ETH           2
        !            95: 
        !            96: /* MTUs */
        !            97: #define HERMON_MTU_2048                        0x04
        !            98: #define HERMON_MTU_ETH                 0x07
        !            99: 
        !           100: #define HERMON_INVALID_LKEY            0x00000100UL
        !           101: 
        !           102: #define HERMON_PAGE_SIZE               ( ( size_t ) 4096 )
        !           103: 
        !           104: #define HERMON_DB_POST_SND_OFFSET      0x14
        !           105: #define HERMON_DB_EQ_OFFSET(_eqn)      \
        !           106:        ( 0x800 + HERMON_PAGE_SIZE * ( (_eqn) / 4 ) + 0x08 * ( (_eqn) % 4 ) )
        !           107: 
        !           108: #define HERMON_QP_OPT_PARAM_PM_STATE   0x00000400UL
        !           109: #define HERMON_QP_OPT_PARAM_QKEY       0x00000020UL
        !           110: #define HERMON_QP_OPT_PARAM_ALT_PATH   0x00000001UL
        !           111: 
        !           112: #define HERMON_MAP_EQ                  ( 0UL << 31 )
        !           113: #define HERMON_UNMAP_EQ                        ( 1UL << 31 )
        !           114: 
        !           115: #define HERMON_SET_PORT_GENERAL_PARAM  0x0000
        !           116: #define HERMON_SET_PORT_RECEIVE_QP     0x0100
        !           117: #define HERMON_SET_PORT_MAC_TABLE      0x0200
        !           118: #define HERMON_SET_PORT_VLAN_TABLE     0x0300
        !           119: #define HERMON_SET_PORT_PRIORITY_TABLE 0x0400
        !           120: #define HERMON_SET_PORT_GID_TABLE      0x0500
        !           121: 
        !           122: #define HERMON_EV_PORT_STATE_CHANGE    0x09
        !           123: 
        !           124: #define HERMON_SCHED_QP0               0x3f
        !           125: #define HERMON_SCHED_DEFAULT           0x83
        !           126: 
        !           127: #define HERMON_LOG_MULTICAST_HASH_SIZE 7
        !           128: 
        !           129: #define HERMON_PM_STATE_ARMED          0x00
        !           130: #define HERMON_PM_STATE_REARM          0x01
        !           131: #define HERMON_PM_STATE_MIGRATED       0x03
        !           132: 
        !           133: #define HERMON_RETRY_MAX               0x07
        !           134: 
        !           135: #define HERMON_MOD_STAT_CFG_SET                0x01
        !           136: #define HERMON_MOD_STAT_CFG_QUERY      0x03
        !           137: 
        !           138: /*
        !           139:  * Datatypes that seem to be missing from the autogenerated documentation
        !           140:  *
        !           141:  */
        !           142: struct hermonprm_mgm_hash_st {
        !           143:        pseudo_bit_t reserved0[0x00020];
        !           144: /* -------------- */
        !           145:        pseudo_bit_t hash[0x00010];
        !           146:        pseudo_bit_t reserved1[0x00010];
        !           147: } __attribute__ (( packed ));
        !           148: 
        !           149: struct hermonprm_mcg_entry_st {
        !           150:        struct hermonprm_mcg_hdr_st hdr;
        !           151:        struct hermonprm_mcg_qp_dw_st qp[8];
        !           152: } __attribute__ (( packed ));
        !           153: 
        !           154: struct hermonprm_cq_db_record_st {
        !           155:        pseudo_bit_t update_ci[0x00018];
        !           156:        pseudo_bit_t reserved0[0x00008];
        !           157: /* -------------- */
        !           158:        pseudo_bit_t arm_ci[0x00018];
        !           159:        pseudo_bit_t cmd[0x00003];
        !           160:        pseudo_bit_t reserved1[0x00001];
        !           161:        pseudo_bit_t cmd_sn[0x00002];
        !           162:        pseudo_bit_t reserved2[0x00002];
        !           163: } __attribute__ (( packed ));
        !           164: 
        !           165: struct hermonprm_send_db_register_st {
        !           166:        pseudo_bit_t reserved[0x00008];
        !           167:        pseudo_bit_t qn[0x00018];
        !           168: } __attribute__ (( packed ));
        !           169: 
        !           170: struct hermonprm_event_db_register_st {
        !           171:        pseudo_bit_t ci[0x00018];
        !           172:        pseudo_bit_t reserver[0x00007];
        !           173:        pseudo_bit_t a[0x00001];
        !           174: } __attribute__ (( packed ));
        !           175: 
        !           176: struct hermonprm_scalar_parameter_st {
        !           177:        pseudo_bit_t value_hi[0x00020];
        !           178: /* -------------- */
        !           179:        pseudo_bit_t value[0x00020];
        !           180: } __attribute__ (( packed ));
        !           181: 
        !           182: struct hermonprm_event_mask_st {
        !           183:        pseudo_bit_t reserved0[0x00020];
        !           184: /* -------------- */
        !           185:        pseudo_bit_t completion[0x00001];
        !           186:        pseudo_bit_t path_migration_succeeded[0x00001];
        !           187:        pseudo_bit_t communication_established[0x00001];
        !           188:        pseudo_bit_t send_queue_drained[0x00001];
        !           189:        pseudo_bit_t cq_error[0x00001];
        !           190:        pseudo_bit_t wq_catastrophe[0x00001];
        !           191:        pseudo_bit_t qpc_catastrophe[0x00001];
        !           192:        pseudo_bit_t path_migration_failed[0x00001];
        !           193:        pseudo_bit_t internal_error[0x00001];
        !           194:        pseudo_bit_t port_state_change[0x00001];
        !           195:        pseudo_bit_t command_done[0x00001];
        !           196:        pseudo_bit_t fexch_error[0x00001];
        !           197:        pseudo_bit_t reserved1[0x00004];
        !           198:        pseudo_bit_t wq_invalid_request[0x00001];
        !           199:        pseudo_bit_t wq_access_violation[0x00001];
        !           200:        pseudo_bit_t srq_catastrophe[0x00001];
        !           201:        pseudo_bit_t srq_last_wqe[0x00001];
        !           202:        pseudo_bit_t srq_rq_limit[0x00001];
        !           203:        pseudo_bit_t gpio[0x00001];
        !           204:        pseudo_bit_t clientreregister[0x00001];
        !           205:        pseudo_bit_t reserved2[0x00009];
        !           206: } __attribute__ (( packed ));
        !           207: 
        !           208: struct hermonprm_port_state_change_event_st {
        !           209:        pseudo_bit_t reserved[0x00020];
        !           210: /* -------------- */
        !           211:        struct hermonprm_port_state_change_st data;
        !           212: } __attribute__ (( packed ));
        !           213: 
        !           214: struct hermonprm_sense_port_st {
        !           215:        pseudo_bit_t reserved0[0x00020];
        !           216: /* -------------- */
        !           217:        pseudo_bit_t port_type[0x00002];
        !           218:        pseudo_bit_t reserved1[0x0001e];
        !           219: } __attribute__ (( packed ));
        !           220: 
        !           221: struct hermonprm_set_port_ib_st {
        !           222:        pseudo_bit_t rqk[0x00001];
        !           223:        pseudo_bit_t rcm[0x00001];
        !           224:        pseudo_bit_t reserved0[0x00002];
        !           225:        pseudo_bit_t vl_cap[0x00004];
        !           226:        pseudo_bit_t reserved1[0x00004];
        !           227:        pseudo_bit_t mtu_cap[0x00004];
        !           228:        pseudo_bit_t g0[0x00001];
        !           229:        pseudo_bit_t ng[0x00001];
        !           230:        pseudo_bit_t sig[0x00001];
        !           231:        pseudo_bit_t mg[0x00001];
        !           232:        pseudo_bit_t mp[0x00001];
        !           233:        pseudo_bit_t mvc[0x00001];
        !           234:        pseudo_bit_t mmc[0x00001];
        !           235:        pseudo_bit_t reserved2[0x00004];
        !           236:        pseudo_bit_t lws[0x00001];
        !           237:        pseudo_bit_t lss[0x00001];
        !           238:        pseudo_bit_t reserved3[0x00003];
        !           239: /* -------------- */
        !           240:        pseudo_bit_t capability_mask[0x00020];
        !           241: /* -------------- */
        !           242:        pseudo_bit_t system_image_guid_h[0x00020];
        !           243: /* -------------- */
        !           244:        pseudo_bit_t system_image_guid_l[0x00020];
        !           245: /* -------------- */
        !           246:        pseudo_bit_t guid0_h[0x00020];
        !           247: /* -------------- */
        !           248:        pseudo_bit_t guid0_l[0x00020];
        !           249: /* -------------- */
        !           250:        pseudo_bit_t node_guid_h[0x00020];
        !           251: /* -------------- */
        !           252:        pseudo_bit_t node_guid_l[0x00020];
        !           253: /* -------------- */
        !           254:        pseudo_bit_t egress_sniff_qpn[0x00018];
        !           255:        pseudo_bit_t egress_sniff_mode[0x00002];
        !           256:        pseudo_bit_t reserved4[0x00006];
        !           257: /* -------------- */
        !           258:        pseudo_bit_t ingress_sniff_qpn[0x00018];
        !           259:        pseudo_bit_t ingress_sniff_mode[0x00002];
        !           260:        pseudo_bit_t reserved5[0x00006];
        !           261: /* -------------- */
        !           262:        pseudo_bit_t max_gid[0x00010];
        !           263:        pseudo_bit_t max_pkey[0x00010];
        !           264: /* -------------- */
        !           265:        pseudo_bit_t reserved6[0x00020];
        !           266: /* -------------- */
        !           267:        pseudo_bit_t reserved7[0x00020];
        !           268: /* -------------- */
        !           269:        pseudo_bit_t reserved8[0x00020];
        !           270: /* -------------- */
        !           271:        pseudo_bit_t reserved9[0x00020];
        !           272: /* -------------- */
        !           273:        pseudo_bit_t reserved10[0x00020];
        !           274: /* -------------- */
        !           275:        pseudo_bit_t reserved11[0x00020];
        !           276: /* -------------- */
        !           277:        pseudo_bit_t reserved12[0x00020];
        !           278: /* -------------- */
        !           279:        pseudo_bit_t reserved13[0x00020];
        !           280: /* -------------- */
        !           281:        pseudo_bit_t reserved14[0x00020];
        !           282: /* -------------- */
        !           283:        pseudo_bit_t reserved15[0x00020];
        !           284: /* -------------- */
        !           285:        pseudo_bit_t reserved16[0x00020];
        !           286: /* -------------- */
        !           287:        pseudo_bit_t reserved17[0x00020];
        !           288: /* -------------- */
        !           289:        pseudo_bit_t reserved18[0x00020];
        !           290: /* -------------- */
        !           291:        pseudo_bit_t reserved19[0x00020];
        !           292: /* -------------- */
        !           293:        pseudo_bit_t reserved20[0x00020];
        !           294: /* -------------- */
        !           295:        pseudo_bit_t reserved21[0x00020];
        !           296: /* -------------- */
        !           297:        pseudo_bit_t reserved22[0x00020];
        !           298: /* -------------- */
        !           299:        pseudo_bit_t link_width_supported[0x00004];
        !           300:        pseudo_bit_t link_speed_supported[0x00004];
        !           301:        pseudo_bit_t reserved23[0x00018];
        !           302: /* -------------- */
        !           303: } __attribute__ (( packed ));
        !           304: 
        !           305: struct hermonprm_query_port_cap_st {
        !           306:        pseudo_bit_t eth_mtu[0x00010];
        !           307:        pseudo_bit_t ib_mtu[0x00004];
        !           308:        pseudo_bit_t reserved0[0x00004];
        !           309:        pseudo_bit_t ib[0x00001];
        !           310:        pseudo_bit_t eth[0x00001];
        !           311:        pseudo_bit_t reserved1[0x00005];
        !           312:        pseudo_bit_t link_state[0x00001];
        !           313: /* -------------- */
        !           314:        pseudo_bit_t log_max_pkey[0x00004];
        !           315:        pseudo_bit_t log_max_gid[0x00004];
        !           316:        pseudo_bit_t ib_port_width[0x00004];
        !           317:        pseudo_bit_t reserved2[0x00004];
        !           318:        pseudo_bit_t eth_link_speed[0x00004];
        !           319:        pseudo_bit_t reserved3[0x00004];
        !           320:        pseudo_bit_t ib_link_speed[0x00004];
        !           321:        pseudo_bit_t reserved4[0x00004];
        !           322: /* -------------- */
        !           323:        pseudo_bit_t max_vl_ib[0x00004];
        !           324:        pseudo_bit_t reserved5[0x00004];
        !           325:        pseudo_bit_t log_max_mac[0x00004];
        !           326:        pseudo_bit_t log_max_vlan[0x00004];
        !           327:        pseudo_bit_t reserved6[0x00010];
        !           328: /* -------------- */
        !           329:        pseudo_bit_t reserved7[0x00020];
        !           330: /* -------------- */
        !           331:        pseudo_bit_t mac_47_32[0x00010];
        !           332:        pseudo_bit_t reserved8[0x00010];
        !           333: /* -------------- */
        !           334:        pseudo_bit_t mac_31_0[0x00020];
        !           335: /* -------------- */
        !           336:        pseudo_bit_t vendor_oui[0x00018];
        !           337:        pseudo_bit_t transceiver_type[0x00008];
        !           338: /* -------------- */
        !           339:        pseudo_bit_t reserved9[0x00010];
        !           340:        pseudo_bit_t wavelength[0x00010];
        !           341: /* -------------- */
        !           342:        pseudo_bit_t transceiver_code_hi[0x00020];
        !           343: /* -------------- */
        !           344:        pseudo_bit_t transceiver_code_lo[0x00020];
        !           345: /* -------------- */
        !           346:        pseudo_bit_t reserved10[0x000c0];
        !           347: } __attribute__ (( packed ));
        !           348: 
        !           349: struct hermonprm_set_port_general_context_st {
        !           350:        pseudo_bit_t v_mtu[0x00001];
        !           351:        pseudo_bit_t v_pprx[0x00001];
        !           352:        pseudo_bit_t v_pptx[0x00001];
        !           353:        pseudo_bit_t reserved0[0x0001d];
        !           354: /* -------------- */
        !           355:        pseudo_bit_t mtu[0x00010];
        !           356:        pseudo_bit_t reserved1[0x00010];
        !           357: /* -------------- */
        !           358:        pseudo_bit_t reserved2[0x00010];
        !           359:        pseudo_bit_t pfctx[0x00008];
        !           360:        pseudo_bit_t reserved3[0x00007];
        !           361:        pseudo_bit_t pptx[0x00001];
        !           362: /* -------------- */
        !           363:        pseudo_bit_t reserved4[0x00010];
        !           364:        pseudo_bit_t pfcrx[0x00008];
        !           365:        pseudo_bit_t reserved5[0x00007];
        !           366:        pseudo_bit_t pprx[0x00001];
        !           367: /* -------------- */
        !           368: } __attribute__ (( packed ));
        !           369: 
        !           370: struct hermonprm_set_port_rqp_calc_st {
        !           371:        pseudo_bit_t base_qpn[0x00018];
        !           372:        pseudo_bit_t reserved0[0x00008];
        !           373: /* -------------- */
        !           374:        pseudo_bit_t n_p[0x00002];
        !           375:        pseudo_bit_t reserved1[0x00006];
        !           376:        pseudo_bit_t n_v[0x00003];
        !           377:        pseudo_bit_t reserved2[0x00005];
        !           378:        pseudo_bit_t n_m[0x00004];
        !           379:        pseudo_bit_t reserved3[0x0000c];
        !           380: /* -------------- */
        !           381:        pseudo_bit_t mac_miss_index[0x00008];
        !           382:        pseudo_bit_t reserved4[0x00018];
        !           383: /* -------------- */
        !           384:        pseudo_bit_t vlan_miss_index[0x00007];
        !           385:        pseudo_bit_t reserved5[0x00008];
        !           386:        pseudo_bit_t intra_miss[0x00001];
        !           387:        pseudo_bit_t no_vlan_index[0x00007];
        !           388:        pseudo_bit_t reserved6[0x00008];
        !           389:        pseudo_bit_t intra_no_vlan[0x00001];
        !           390: /* -------------- */
        !           391:        pseudo_bit_t no_vlan_prio[0x00003];
        !           392:        pseudo_bit_t reserved7[0x0001d];
        !           393: /* -------------- */
        !           394:        pseudo_bit_t promisc_qpn[0x00018];
        !           395:        pseudo_bit_t reserved8[0x00007];
        !           396:        pseudo_bit_t en_uc_promisc[0x00001];
        !           397: /* -------------- */
        !           398:        pseudo_bit_t def_mcast_qpn[0x00018];
        !           399:        pseudo_bit_t reserved9[0x00005];
        !           400:        pseudo_bit_t mc_by_vlan[0x00001];
        !           401:        pseudo_bit_t mc_promisc_mode[0x00002];
        !           402: /* -------------- */
        !           403:        pseudo_bit_t reserved10[0x00020];
        !           404: /* -------------- */
        !           405: } __attribute__ (( packed ));
        !           406: 
        !           407: struct hermonprm_set_port_mac_table_st {
        !           408:        pseudo_bit_t mac_h[0x00010];
        !           409:        pseudo_bit_t reserved0[0x0000f];
        !           410:        pseudo_bit_t v[0x00001];
        !           411: /* -------------- */
        !           412:        pseudo_bit_t mac_l[0x00020];
        !           413: /* -------------- */
        !           414: } __attribute__ (( packed ));
        !           415: 
        !           416: struct hermonprm_set_port_vlan_st {
        !           417:        pseudo_bit_t vlan_id[0x0000c];
        !           418:        pseudo_bit_t reserved0[0x00012];
        !           419:        pseudo_bit_t intra[0x00001];
        !           420:        pseudo_bit_t v[0x00001];
        !           421: /* -------------- */
        !           422: } __attribute__ (( packed ));
        !           423: 
        !           424: struct hermonprm_mod_stat_cfg_input_mod_st {
        !           425:        pseudo_bit_t offset[0x00008];
        !           426:        pseudo_bit_t portnum[0x00008];
        !           427:        pseudo_bit_t xnum[0x00004];
        !           428:        pseudo_bit_t linkspeed[0x00003];
        !           429:        pseudo_bit_t autoneg[0x00001];
        !           430:        pseudo_bit_t reserved[0x00004];
        !           431:        pseudo_bit_t setup_mode[0x00004];
        !           432: } __attribute__ (( packed ));
        !           433: 
        !           434: /*
        !           435:  * Wrapper structures for hardware datatypes
        !           436:  *
        !           437:  */
        !           438: 
        !           439: struct MLX_DECLARE_STRUCT ( hermonprm_completion_queue_context );
        !           440: struct MLX_DECLARE_STRUCT ( hermonprm_completion_queue_entry );
        !           441: struct MLX_DECLARE_STRUCT ( hermonprm_completion_with_error );
        !           442: struct MLX_DECLARE_STRUCT ( hermonprm_cq_db_record );
        !           443: struct MLX_DECLARE_STRUCT ( hermonprm_eqc );
        !           444: struct MLX_DECLARE_STRUCT ( hermonprm_event_db_register );
        !           445: struct MLX_DECLARE_STRUCT ( hermonprm_event_mask );
        !           446: struct MLX_DECLARE_STRUCT ( hermonprm_event_queue_entry );
        !           447: struct MLX_DECLARE_STRUCT ( hermonprm_hca_command_register );
        !           448: struct MLX_DECLARE_STRUCT ( hermonprm_init_hca );
        !           449: struct MLX_DECLARE_STRUCT ( hermonprm_mad_ifc );
        !           450: struct MLX_DECLARE_STRUCT ( hermonprm_mcg_entry );
        !           451: struct MLX_DECLARE_STRUCT ( hermonprm_mgm_hash );
        !           452: struct MLX_DECLARE_STRUCT ( hermonprm_mod_stat_cfg );
        !           453: struct MLX_DECLARE_STRUCT ( hermonprm_mod_stat_cfg_input_mod );
        !           454: struct MLX_DECLARE_STRUCT ( hermonprm_mpt );
        !           455: struct MLX_DECLARE_STRUCT ( hermonprm_mtt );
        !           456: struct MLX_DECLARE_STRUCT ( hermonprm_port_state_change_event );
        !           457: struct MLX_DECLARE_STRUCT ( hermonprm_qp_db_record );
        !           458: struct MLX_DECLARE_STRUCT ( hermonprm_qp_ee_state_transitions );
        !           459: struct MLX_DECLARE_STRUCT ( hermonprm_query_dev_cap );
        !           460: struct MLX_DECLARE_STRUCT ( hermonprm_query_fw );
        !           461: struct MLX_DECLARE_STRUCT ( hermonprm_query_port_cap );
        !           462: struct MLX_DECLARE_STRUCT ( hermonprm_queue_pair_ee_context_entry );
        !           463: struct MLX_DECLARE_STRUCT ( hermonprm_scalar_parameter );
        !           464: struct MLX_DECLARE_STRUCT ( hermonprm_sense_port );
        !           465: struct MLX_DECLARE_STRUCT ( hermonprm_send_db_register );
        !           466: struct MLX_DECLARE_STRUCT ( hermonprm_set_port_ib );
        !           467: struct MLX_DECLARE_STRUCT ( hermonprm_set_port_general_context );
        !           468: struct MLX_DECLARE_STRUCT ( hermonprm_set_port_mac_table );
        !           469: struct MLX_DECLARE_STRUCT ( hermonprm_set_port_rqp_calc );
        !           470: struct MLX_DECLARE_STRUCT ( hermonprm_set_port_vlan );
        !           471: struct MLX_DECLARE_STRUCT ( hermonprm_ud_address_vector );
        !           472: struct MLX_DECLARE_STRUCT ( hermonprm_virtual_physical_mapping );
        !           473: struct MLX_DECLARE_STRUCT ( hermonprm_wqe_segment_ctrl_mlx );
        !           474: struct MLX_DECLARE_STRUCT ( hermonprm_wqe_segment_ctrl_send );
        !           475: struct MLX_DECLARE_STRUCT ( hermonprm_wqe_segment_data_ptr );
        !           476: struct MLX_DECLARE_STRUCT ( hermonprm_wqe_segment_ud );
        !           477: 
        !           478: /*
        !           479:  * Composite hardware datatypes
        !           480:  *
        !           481:  */
        !           482: 
        !           483: struct hermonprm_write_mtt {
        !           484:        struct hermonprm_scalar_parameter mtt_base_addr;
        !           485:        struct hermonprm_scalar_parameter reserved;
        !           486:        struct hermonprm_mtt mtt;
        !           487: } __attribute__ (( packed ));
        !           488: 
        !           489: #define HERMON_MAX_GATHER 2
        !           490: 
        !           491: struct hermonprm_ud_send_wqe {
        !           492:        struct hermonprm_wqe_segment_ctrl_send ctrl;
        !           493:        struct hermonprm_wqe_segment_ud ud;
        !           494:        struct hermonprm_wqe_segment_data_ptr data[HERMON_MAX_GATHER];
        !           495: } __attribute__ (( packed ));
        !           496: 
        !           497: struct hermonprm_mlx_send_wqe {
        !           498:        struct hermonprm_wqe_segment_ctrl_mlx ctrl;
        !           499:        struct hermonprm_wqe_segment_data_ptr data[HERMON_MAX_GATHER];
        !           500:        uint8_t headers[IB_MAX_HEADER_SIZE];
        !           501: } __attribute__ (( packed ));
        !           502: 
        !           503: struct hermonprm_rc_send_wqe {
        !           504:        struct hermonprm_wqe_segment_ctrl_send ctrl;
        !           505:        struct hermonprm_wqe_segment_data_ptr data[HERMON_MAX_GATHER];
        !           506: } __attribute__ (( packed ));
        !           507: 
        !           508: struct hermonprm_eth_send_wqe {
        !           509:        struct hermonprm_wqe_segment_ctrl_send ctrl;
        !           510:        struct hermonprm_wqe_segment_data_ptr data[HERMON_MAX_GATHER];
        !           511: } __attribute__ (( packed ));
        !           512: 
        !           513: #define HERMON_MAX_SCATTER 1
        !           514: 
        !           515: struct hermonprm_recv_wqe {
        !           516:        struct hermonprm_wqe_segment_data_ptr data[HERMON_MAX_SCATTER];
        !           517: } __attribute__ (( packed ));
        !           518: 
        !           519: union hermonprm_completion_entry {
        !           520:        struct hermonprm_completion_queue_entry normal;
        !           521:        struct hermonprm_completion_with_error error;
        !           522: } __attribute__ (( packed ));
        !           523: 
        !           524: union hermonprm_event_entry {
        !           525:        struct hermonprm_event_queue_entry generic;
        !           526:        struct hermonprm_port_state_change_event port_state_change;
        !           527: } __attribute__ (( packed ));
        !           528: 
        !           529: union hermonprm_doorbell_register {
        !           530:        struct hermonprm_send_db_register send;
        !           531:        struct hermonprm_event_db_register event;
        !           532:        uint32_t dword[1];
        !           533: } __attribute__ (( packed ));
        !           534: 
        !           535: union hermonprm_mad {
        !           536:        struct hermonprm_mad_ifc ifc;
        !           537:        union ib_mad mad;
        !           538: } __attribute__ (( packed ));
        !           539: 
        !           540: union hermonprm_set_port {
        !           541:        struct hermonprm_set_port_ib ib;
        !           542:        struct hermonprm_set_port_general_context general;
        !           543:        struct hermonprm_set_port_rqp_calc rqp_calc;
        !           544:        struct hermonprm_set_port_mac_table mac_table[128];
        !           545:        struct hermonprm_set_port_vlan vlan;
        !           546: } __attribute__ (( packed ));
        !           547: 
        !           548: /*
        !           549:  * iPXE-specific definitions
        !           550:  *
        !           551:  */
        !           552: 
        !           553: /** Hermon device capabilitiess */
        !           554: struct hermon_dev_cap {
        !           555:        /** CMPT entry size */
        !           556:        size_t cmpt_entry_size;
        !           557:        /** Number of reserved QPs */
        !           558:        unsigned int reserved_qps;
        !           559:        /** QP context entry size */
        !           560:        size_t qpc_entry_size;
        !           561:        /** Alternate path context entry size */
        !           562:        size_t altc_entry_size;
        !           563:        /** Auxiliary context entry size */
        !           564:        size_t auxc_entry_size;
        !           565:        /** Number of reserved SRQs */
        !           566:        unsigned int reserved_srqs;
        !           567:        /** SRQ context entry size */
        !           568:        size_t srqc_entry_size;
        !           569:        /** Number of reserved CQs */
        !           570:        unsigned int reserved_cqs;
        !           571:        /** CQ context entry size */
        !           572:        size_t cqc_entry_size;
        !           573:        /** Number of reserved EQs */
        !           574:        unsigned int reserved_eqs;
        !           575:        /** EQ context entry size */
        !           576:        size_t eqc_entry_size;
        !           577:        /** Number of reserved MTTs */
        !           578:        unsigned int reserved_mtts;
        !           579:        /** MTT entry size */
        !           580:        size_t mtt_entry_size;
        !           581:        /** Number of reserved MRWs */
        !           582:        unsigned int reserved_mrws;
        !           583:        /** DMPT entry size */
        !           584:        size_t dmpt_entry_size;
        !           585:        /** Number of reserved UARs */
        !           586:        unsigned int reserved_uars;
        !           587:        /** Number of ports */
        !           588:        unsigned int num_ports;
        !           589:        /** Dual-port different protocol */
        !           590:        int dpdp;
        !           591: };
        !           592: 
        !           593: /** Number of cMPT entries of each type */
        !           594: #define HERMON_CMPT_MAX_ENTRIES ( 1 << 24 )
        !           595: 
        !           596: /** Hermon ICM memory map entry */
        !           597: struct hermon_icm_map {
        !           598:        /** Offset (virtual address within ICM) */
        !           599:        uint64_t offset;
        !           600:        /** Length */
        !           601:        size_t len;
        !           602: };
        !           603: 
        !           604: /** Discontiguous regions within Hermon ICM */
        !           605: enum hermon_icm_map_regions {
        !           606:        HERMON_ICM_QP_CMPT = 0,
        !           607:        HERMON_ICM_SRQ_CMPT,
        !           608:        HERMON_ICM_CQ_CMPT,
        !           609:        HERMON_ICM_EQ_CMPT,
        !           610:        HERMON_ICM_OTHER,
        !           611:        HERMON_ICM_NUM_REGIONS
        !           612: };
        !           613: 
        !           614: /** UAR page for doorbell accesses
        !           615:  *
        !           616:  * Pages 0-127 are reserved for event queue doorbells only, so we use
        !           617:  * page 128.
        !           618:  */
        !           619: #define HERMON_UAR_NON_EQ_PAGE 128
        !           620: 
        !           621: /** Maximum number of allocatable MTT entries
        !           622:  *
        !           623:  * This is a policy decision, not a device limit.
        !           624:  */
        !           625: #define HERMON_MAX_MTTS                64
        !           626: 
        !           627: /** A Hermon MTT descriptor */
        !           628: struct hermon_mtt {
        !           629:        /** MTT offset */
        !           630:        unsigned int mtt_offset;
        !           631:        /** Number of pages */
        !           632:        unsigned int num_pages;
        !           633:        /** MTT base address */
        !           634:        unsigned int mtt_base_addr;
        !           635:        /** Offset within page */
        !           636:        unsigned int page_offset;
        !           637: };
        !           638: 
        !           639: /** Alignment of Hermon send work queue entries */
        !           640: #define HERMON_SEND_WQE_ALIGN 128
        !           641: 
        !           642: /** A Hermon send work queue entry */
        !           643: union hermon_send_wqe {
        !           644:        struct hermonprm_wqe_segment_ctrl_send ctrl;
        !           645:        struct hermonprm_ud_send_wqe ud;
        !           646:        struct hermonprm_mlx_send_wqe mlx;
        !           647:        struct hermonprm_rc_send_wqe rc;
        !           648:        struct hermonprm_eth_send_wqe eth;
        !           649:        uint8_t force_align[HERMON_SEND_WQE_ALIGN];
        !           650: } __attribute__ (( packed ));
        !           651: 
        !           652: /** A Hermon send work queue */
        !           653: struct hermon_send_work_queue {
        !           654:        /** Number of work queue entries, including headroom
        !           655:         *
        !           656:         * Hermon requires us to leave unused space within the send
        !           657:         * WQ, so we create a send WQ with more entries than are
        !           658:         * requested in the create_qp() call.
        !           659:         */
        !           660:        unsigned int num_wqes;
        !           661:        /** Work queue entries */
        !           662:        union hermon_send_wqe *wqe;
        !           663:        /** Size of work queue */
        !           664:        size_t wqe_size;
        !           665:        /** Doorbell register */
        !           666:        void *doorbell;
        !           667: };
        !           668: 
        !           669: /** Alignment of Hermon receive work queue entries */
        !           670: #define HERMON_RECV_WQE_ALIGN 16
        !           671: 
        !           672: /** A Hermon receive work queue entry */
        !           673: union hermon_recv_wqe {
        !           674:        struct hermonprm_recv_wqe recv;
        !           675:        uint8_t force_align[HERMON_RECV_WQE_ALIGN];
        !           676: } __attribute__ (( packed ));
        !           677: 
        !           678: /** A Hermon receive work queue */
        !           679: struct hermon_recv_work_queue {
        !           680:        /** Work queue entries */
        !           681:        union hermon_recv_wqe *wqe;
        !           682:        /** Size of work queue */
        !           683:        size_t wqe_size;
        !           684:        /** Doorbell record */
        !           685:        struct hermonprm_qp_db_record *doorbell;
        !           686: };
        !           687: 
        !           688: /** Number of special queue pairs */
        !           689: #define HERMON_NUM_SPECIAL_QPS 8
        !           690: 
        !           691: /** Number of queue pairs reserved for the "special QP" block
        !           692:  *
        !           693:  * The special QPs must be within a contiguous block aligned on its
        !           694:  * own size.
        !           695:  */
        !           696: #define HERMON_RSVD_SPECIAL_QPS        ( ( HERMON_NUM_SPECIAL_QPS << 1 ) - 1 )
        !           697: 
        !           698: /** Maximum number of allocatable queue pairs
        !           699:  *
        !           700:  * This is a policy decision, not a device limit.
        !           701:  */
        !           702: #define HERMON_MAX_QPS         8
        !           703: 
        !           704: /** Queue pair number randomisation mask */
        !           705: #define HERMON_QPN_RANDOM_MASK 0xfff000
        !           706: 
        !           707: /** Hermon queue pair state */
        !           708: enum hermon_queue_pair_state {
        !           709:        HERMON_QP_ST_RST = 0,
        !           710:        HERMON_QP_ST_INIT,
        !           711:        HERMON_QP_ST_RTR,
        !           712:        HERMON_QP_ST_RTS,
        !           713: };
        !           714: 
        !           715: /** A Hermon queue pair */
        !           716: struct hermon_queue_pair {
        !           717:        /** Work queue buffer */
        !           718:        void *wqe;
        !           719:        /** Size of work queue buffer */
        !           720:        size_t wqe_size;
        !           721:        /** MTT descriptor */
        !           722:        struct hermon_mtt mtt;
        !           723:        /** Send work queue */
        !           724:        struct hermon_send_work_queue send;
        !           725:        /** Receive work queue */
        !           726:        struct hermon_recv_work_queue recv;
        !           727:        /** Queue state */
        !           728:        enum hermon_queue_pair_state state;
        !           729: };
        !           730: 
        !           731: /** Maximum number of allocatable completion queues
        !           732:  *
        !           733:  * This is a policy decision, not a device limit.
        !           734:  */
        !           735: #define HERMON_MAX_CQS         8
        !           736: 
        !           737: /** A Hermon completion queue */
        !           738: struct hermon_completion_queue {
        !           739:        /** Completion queue entries */
        !           740:        union hermonprm_completion_entry *cqe;
        !           741:        /** Size of completion queue */
        !           742:        size_t cqe_size;
        !           743:        /** MTT descriptor */
        !           744:        struct hermon_mtt mtt;
        !           745:        /** Doorbell record */
        !           746:        struct hermonprm_cq_db_record *doorbell;
        !           747: };
        !           748: 
        !           749: /** Maximum number of allocatable event queues
        !           750:  *
        !           751:  * This is a policy decision, not a device limit.
        !           752:  */
        !           753: #define HERMON_MAX_EQS         8
        !           754: 
        !           755: /** A Hermon event queue */
        !           756: struct hermon_event_queue {
        !           757:        /** Event queue entries */
        !           758:        union hermonprm_event_entry *eqe;
        !           759:        /** Size of event queue */
        !           760:        size_t eqe_size;
        !           761:        /** MTT descriptor */
        !           762:        struct hermon_mtt mtt;
        !           763:        /** Event queue number */
        !           764:        unsigned long eqn;
        !           765:        /** Next event queue entry index */
        !           766:        unsigned long next_idx;
        !           767:        /** Doorbell register */
        !           768:        void *doorbell;
        !           769: };
        !           770: 
        !           771: /** Number of event queue entries
        !           772:  *
        !           773:  * This is a policy decision.
        !           774:  */
        !           775: #define HERMON_NUM_EQES                8
        !           776: 
        !           777: /** A Hermon resource bitmask */
        !           778: typedef uint32_t hermon_bitmask_t;
        !           779: 
        !           780: /** Size of a hermon resource bitmask */
        !           781: #define HERMON_BITMASK_SIZE(max_entries)                                    \
        !           782:        ( ( (max_entries) + ( 8 * sizeof ( hermon_bitmask_t ) ) - 1 ) /      \
        !           783:          ( 8 * sizeof ( hermon_bitmask_t ) ) )
        !           784: 
        !           785: struct hermon;
        !           786: struct hermon_port;
        !           787: 
        !           788: /** A Hermon port type */
        !           789: struct hermon_port_type {
        !           790:        /** Register port
        !           791:         *
        !           792:         * @v hermon            Hermon device
        !           793:         * @v port              Hermon port
        !           794:         * @ret rc              Return status code
        !           795:         */
        !           796:        int ( * register_dev ) ( struct hermon *hermon,
        !           797:                                 struct hermon_port *port );
        !           798:        /** Port state changed
        !           799:         *
        !           800:         * @v hermon            Hermon device
        !           801:         * @v port              Hermon port
        !           802:         * @v link_up           Link is up
        !           803:         */
        !           804:        void ( * state_change ) ( struct hermon *hermon,
        !           805:                                  struct hermon_port *port,
        !           806:                                  int link_up );
        !           807:        /** Unregister port
        !           808:         *
        !           809:         * @v hermon            Hermon device
        !           810:         * @v port              Hermon port
        !           811:         */
        !           812:        void ( * unregister_dev ) ( struct hermon *hermon,
        !           813:                                    struct hermon_port *port );
        !           814: };
        !           815: 
        !           816: /** A Hermon port */
        !           817: struct hermon_port {
        !           818:        /** Infiniband device */
        !           819:        struct ib_device *ibdev;
        !           820:        /** Network device */
        !           821:        struct net_device *netdev;
        !           822:        /** Ethernet completion queue */
        !           823:        struct ib_completion_queue *eth_cq;
        !           824:        /** Ethernet queue pair */
        !           825:        struct ib_queue_pair *eth_qp;
        !           826:        /** Port type */
        !           827:        struct hermon_port_type *type;
        !           828: };
        !           829: 
        !           830: /** A Hermon device */
        !           831: struct hermon {
        !           832:        /** PCI configuration registers */
        !           833:        void *config;
        !           834:        /** PCI user Access Region */
        !           835:        void *uar;
        !           836: 
        !           837:        /** Command toggle */
        !           838:        unsigned int toggle;
        !           839:        /** Command input mailbox */
        !           840:        void *mailbox_in;
        !           841:        /** Command output mailbox */
        !           842:        void *mailbox_out;
        !           843: 
        !           844:        /** Firmware area in external memory */
        !           845:        userptr_t firmware_area;
        !           846:        /** ICM map */
        !           847:        struct hermon_icm_map icm_map[HERMON_ICM_NUM_REGIONS];
        !           848:        /** ICM area */
        !           849:        userptr_t icm;
        !           850: 
        !           851:        /** Event queue */
        !           852:        struct hermon_event_queue eq;
        !           853:        /** Unrestricted LKey
        !           854:         *
        !           855:         * Used to get unrestricted memory access.
        !           856:         */
        !           857:        unsigned long lkey;
        !           858: 
        !           859:        /** Completion queue in-use bitmask */
        !           860:        hermon_bitmask_t cq_inuse[ HERMON_BITMASK_SIZE ( HERMON_MAX_CQS ) ];
        !           861:        /** Queue pair in-use bitmask */
        !           862:        hermon_bitmask_t qp_inuse[ HERMON_BITMASK_SIZE ( HERMON_MAX_QPS ) ];
        !           863:        /** MTT entry in-use bitmask */
        !           864:        hermon_bitmask_t mtt_inuse[ HERMON_BITMASK_SIZE ( HERMON_MAX_MTTS ) ];
        !           865: 
        !           866:        /** Device capabilities */
        !           867:        struct hermon_dev_cap cap;
        !           868:        /** Special QPN base */
        !           869:        unsigned long special_qpn_base;
        !           870:        /** QPN base */
        !           871:        unsigned long qpn_base;
        !           872: 
        !           873:        /** Ports */
        !           874:        struct hermon_port port[HERMON_MAX_PORTS];
        !           875: 
        !           876:        /** BOFM device */
        !           877:        struct bofm_device bofm;
        !           878: };
        !           879: 
        !           880: /** Global protection domain */
        !           881: #define HERMON_GLOBAL_PD               0x123456
        !           882: 
        !           883: /** Memory key prefix */
        !           884: #define HERMON_MKEY_PREFIX             0x77000000UL
        !           885: 
        !           886: /*
        !           887:  * HCA commands
        !           888:  *
        !           889:  */
        !           890: 
        !           891: #define HERMON_HCR_BASE                        0x80680
        !           892: #define HERMON_HCR_REG(x)              ( HERMON_HCR_BASE + 4 * (x) )
        !           893: #define HERMON_HCR_MAX_WAIT_MS         2000
        !           894: #define HERMON_MBOX_ALIGN              4096
        !           895: #define HERMON_MBOX_SIZE               1024
        !           896: 
        !           897: /* HCA command is split into
        !           898:  *
        !           899:  * bits  11:0  Opcode
        !           900:  * bit     12  Input uses mailbox
        !           901:  * bit     13  Output uses mailbox
        !           902:  * bits 22:14  Input parameter length (in dwords)
        !           903:  * bits 31:23  Output parameter length (in dwords)
        !           904:  *
        !           905:  * Encoding the information in this way allows us to cut out several
        !           906:  * parameters to the hermon_command() call.
        !           907:  */
        !           908: #define HERMON_HCR_IN_MBOX             0x00001000UL
        !           909: #define HERMON_HCR_OUT_MBOX            0x00002000UL
        !           910: #define HERMON_HCR_OPCODE( _command )  ( (_command) & 0xfff )
        !           911: #define HERMON_HCR_IN_LEN( _command )  ( ( (_command) >> 12 ) & 0x7fc )
        !           912: #define HERMON_HCR_OUT_LEN( _command ) ( ( (_command) >> 21 ) & 0x7fc )
        !           913: 
        !           914: /** Build HCR command from component parts */
        !           915: #define HERMON_HCR_INOUT_CMD( _opcode, _in_mbox, _in_len,                   \
        !           916:                             _out_mbox, _out_len )                           \
        !           917:        ( (_opcode) |                                                        \
        !           918:          ( (_in_mbox) ? HERMON_HCR_IN_MBOX : 0 ) |                          \
        !           919:          ( ( (_in_len) / 4 ) << 14 ) |                                      \
        !           920:          ( (_out_mbox) ? HERMON_HCR_OUT_MBOX : 0 ) |                        \
        !           921:          ( ( (_out_len) / 4 ) << 23 ) )
        !           922: 
        !           923: #define HERMON_HCR_IN_CMD( _opcode, _in_mbox, _in_len )                             \
        !           924:        HERMON_HCR_INOUT_CMD ( _opcode, _in_mbox, _in_len, 0, 0 )
        !           925: 
        !           926: #define HERMON_HCR_OUT_CMD( _opcode, _out_mbox, _out_len )                  \
        !           927:        HERMON_HCR_INOUT_CMD ( _opcode, 0, 0, _out_mbox, _out_len )
        !           928: 
        !           929: #define HERMON_HCR_VOID_CMD( _opcode )                                      \
        !           930:        HERMON_HCR_INOUT_CMD ( _opcode, 0, 0, 0, 0 )
        !           931: 
        !           932: #endif /* _HERMON_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.