1*f48ad614SDennis Dalessandro /* 2*f48ad614SDennis Dalessandro * Copyright(c) 2015, 2016 Intel Corporation. 3*f48ad614SDennis Dalessandro * 4*f48ad614SDennis Dalessandro * This file is provided under a dual BSD/GPLv2 license. When using or 5*f48ad614SDennis Dalessandro * redistributing this file, you may do so under either license. 6*f48ad614SDennis Dalessandro * 7*f48ad614SDennis Dalessandro * GPL LICENSE SUMMARY 8*f48ad614SDennis Dalessandro * 9*f48ad614SDennis Dalessandro * This program is free software; you can redistribute it and/or modify 10*f48ad614SDennis Dalessandro * it under the terms of version 2 of the GNU General Public License as 11*f48ad614SDennis Dalessandro * published by the Free Software Foundation. 12*f48ad614SDennis Dalessandro * 13*f48ad614SDennis Dalessandro * This program is distributed in the hope that it will be useful, but 14*f48ad614SDennis Dalessandro * WITHOUT ANY WARRANTY; without even the implied warranty of 15*f48ad614SDennis Dalessandro * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16*f48ad614SDennis Dalessandro * General Public License for more details. 17*f48ad614SDennis Dalessandro * 18*f48ad614SDennis Dalessandro * BSD LICENSE 19*f48ad614SDennis Dalessandro * 20*f48ad614SDennis Dalessandro * Redistribution and use in source and binary forms, with or without 21*f48ad614SDennis Dalessandro * modification, are permitted provided that the following conditions 22*f48ad614SDennis Dalessandro * are met: 23*f48ad614SDennis Dalessandro * 24*f48ad614SDennis Dalessandro * - Redistributions of source code must retain the above copyright 25*f48ad614SDennis Dalessandro * notice, this list of conditions and the following disclaimer. 26*f48ad614SDennis Dalessandro * - Redistributions in binary form must reproduce the above copyright 27*f48ad614SDennis Dalessandro * notice, this list of conditions and the following disclaimer in 28*f48ad614SDennis Dalessandro * the documentation and/or other materials provided with the 29*f48ad614SDennis Dalessandro * distribution. 30*f48ad614SDennis Dalessandro * - Neither the name of Intel Corporation nor the names of its 31*f48ad614SDennis Dalessandro * contributors may be used to endorse or promote products derived 32*f48ad614SDennis Dalessandro * from this software without specific prior written permission. 33*f48ad614SDennis Dalessandro * 34*f48ad614SDennis Dalessandro * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 35*f48ad614SDennis Dalessandro * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 36*f48ad614SDennis Dalessandro * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 37*f48ad614SDennis Dalessandro * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 38*f48ad614SDennis Dalessandro * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 39*f48ad614SDennis Dalessandro * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 40*f48ad614SDennis Dalessandro * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 41*f48ad614SDennis Dalessandro * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 42*f48ad614SDennis Dalessandro * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 43*f48ad614SDennis Dalessandro * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 44*f48ad614SDennis Dalessandro * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 45*f48ad614SDennis Dalessandro * 46*f48ad614SDennis Dalessandro */ 47*f48ad614SDennis Dalessandro #ifndef _HFI1_MAD_H 48*f48ad614SDennis Dalessandro #define _HFI1_MAD_H 49*f48ad614SDennis Dalessandro 50*f48ad614SDennis Dalessandro #include <rdma/ib_pma.h> 51*f48ad614SDennis Dalessandro #define USE_PI_LED_ENABLE 1 /* 52*f48ad614SDennis Dalessandro * use led enabled bit in struct 53*f48ad614SDennis Dalessandro * opa_port_states, if available 54*f48ad614SDennis Dalessandro */ 55*f48ad614SDennis Dalessandro #include <rdma/opa_smi.h> 56*f48ad614SDennis Dalessandro #include <rdma/opa_port_info.h> 57*f48ad614SDennis Dalessandro #ifndef PI_LED_ENABLE_SUP 58*f48ad614SDennis Dalessandro #define PI_LED_ENABLE_SUP 0 59*f48ad614SDennis Dalessandro #endif 60*f48ad614SDennis Dalessandro #include "opa_compat.h" 61*f48ad614SDennis Dalessandro 62*f48ad614SDennis Dalessandro /* 63*f48ad614SDennis Dalessandro * OPA Traps 64*f48ad614SDennis Dalessandro */ 65*f48ad614SDennis Dalessandro #define OPA_TRAP_GID_NOW_IN_SERVICE cpu_to_be16(64) 66*f48ad614SDennis Dalessandro #define OPA_TRAP_GID_OUT_OF_SERVICE cpu_to_be16(65) 67*f48ad614SDennis Dalessandro #define OPA_TRAP_ADD_MULTICAST_GROUP cpu_to_be16(66) 68*f48ad614SDennis Dalessandro #define OPA_TRAL_DEL_MULTICAST_GROUP cpu_to_be16(67) 69*f48ad614SDennis Dalessandro #define OPA_TRAP_UNPATH cpu_to_be16(68) 70*f48ad614SDennis Dalessandro #define OPA_TRAP_REPATH cpu_to_be16(69) 71*f48ad614SDennis Dalessandro #define OPA_TRAP_PORT_CHANGE_STATE cpu_to_be16(128) 72*f48ad614SDennis Dalessandro #define OPA_TRAP_LINK_INTEGRITY cpu_to_be16(129) 73*f48ad614SDennis Dalessandro #define OPA_TRAP_EXCESSIVE_BUFFER_OVERRUN cpu_to_be16(130) 74*f48ad614SDennis Dalessandro #define OPA_TRAP_FLOW_WATCHDOG cpu_to_be16(131) 75*f48ad614SDennis Dalessandro #define OPA_TRAP_CHANGE_CAPABILITY cpu_to_be16(144) 76*f48ad614SDennis Dalessandro #define OPA_TRAP_CHANGE_SYSGUID cpu_to_be16(145) 77*f48ad614SDennis Dalessandro #define OPA_TRAP_BAD_M_KEY cpu_to_be16(256) 78*f48ad614SDennis Dalessandro #define OPA_TRAP_BAD_P_KEY cpu_to_be16(257) 79*f48ad614SDennis Dalessandro #define OPA_TRAP_BAD_Q_KEY cpu_to_be16(258) 80*f48ad614SDennis Dalessandro #define OPA_TRAP_SWITCH_BAD_PKEY cpu_to_be16(259) 81*f48ad614SDennis Dalessandro #define OPA_SMA_TRAP_DATA_LINK_WIDTH cpu_to_be16(2048) 82*f48ad614SDennis Dalessandro 83*f48ad614SDennis Dalessandro /* 84*f48ad614SDennis Dalessandro * Generic trap/notice other local changes flags (trap 144). 85*f48ad614SDennis Dalessandro */ 86*f48ad614SDennis Dalessandro #define OPA_NOTICE_TRAP_LWDE_CHG 0x08 /* Link Width Downgrade Enable 87*f48ad614SDennis Dalessandro * changed 88*f48ad614SDennis Dalessandro */ 89*f48ad614SDennis Dalessandro #define OPA_NOTICE_TRAP_LSE_CHG 0x04 /* Link Speed Enable changed */ 90*f48ad614SDennis Dalessandro #define OPA_NOTICE_TRAP_LWE_CHG 0x02 /* Link Width Enable changed */ 91*f48ad614SDennis Dalessandro #define OPA_NOTICE_TRAP_NODE_DESC_CHG 0x01 92*f48ad614SDennis Dalessandro 93*f48ad614SDennis Dalessandro struct opa_mad_notice_attr { 94*f48ad614SDennis Dalessandro u8 generic_type; 95*f48ad614SDennis Dalessandro u8 prod_type_msb; 96*f48ad614SDennis Dalessandro __be16 prod_type_lsb; 97*f48ad614SDennis Dalessandro __be16 trap_num; 98*f48ad614SDennis Dalessandro __be16 toggle_count; 99*f48ad614SDennis Dalessandro __be32 issuer_lid; 100*f48ad614SDennis Dalessandro __be32 reserved1; 101*f48ad614SDennis Dalessandro union ib_gid issuer_gid; 102*f48ad614SDennis Dalessandro 103*f48ad614SDennis Dalessandro union { 104*f48ad614SDennis Dalessandro struct { 105*f48ad614SDennis Dalessandro u8 details[64]; 106*f48ad614SDennis Dalessandro } raw_data; 107*f48ad614SDennis Dalessandro 108*f48ad614SDennis Dalessandro struct { 109*f48ad614SDennis Dalessandro union ib_gid gid; 110*f48ad614SDennis Dalessandro } __packed ntc_64_65_66_67; 111*f48ad614SDennis Dalessandro 112*f48ad614SDennis Dalessandro struct { 113*f48ad614SDennis Dalessandro __be32 lid; 114*f48ad614SDennis Dalessandro } __packed ntc_128; 115*f48ad614SDennis Dalessandro 116*f48ad614SDennis Dalessandro struct { 117*f48ad614SDennis Dalessandro __be32 lid; /* where violation happened */ 118*f48ad614SDennis Dalessandro u8 port_num; /* where violation happened */ 119*f48ad614SDennis Dalessandro } __packed ntc_129_130_131; 120*f48ad614SDennis Dalessandro 121*f48ad614SDennis Dalessandro struct { 122*f48ad614SDennis Dalessandro __be32 lid; /* LID where change occurred */ 123*f48ad614SDennis Dalessandro __be32 new_cap_mask; /* new capability mask */ 124*f48ad614SDennis Dalessandro __be16 reserved2; 125*f48ad614SDennis Dalessandro __be16 cap_mask; 126*f48ad614SDennis Dalessandro __be16 change_flags; /* low 4 bits only */ 127*f48ad614SDennis Dalessandro } __packed ntc_144; 128*f48ad614SDennis Dalessandro 129*f48ad614SDennis Dalessandro struct { 130*f48ad614SDennis Dalessandro __be64 new_sys_guid; 131*f48ad614SDennis Dalessandro __be32 lid; /* lid where sys guid changed */ 132*f48ad614SDennis Dalessandro } __packed ntc_145; 133*f48ad614SDennis Dalessandro 134*f48ad614SDennis Dalessandro struct { 135*f48ad614SDennis Dalessandro __be32 lid; 136*f48ad614SDennis Dalessandro __be32 dr_slid; 137*f48ad614SDennis Dalessandro u8 method; 138*f48ad614SDennis Dalessandro u8 dr_trunc_hop; 139*f48ad614SDennis Dalessandro __be16 attr_id; 140*f48ad614SDennis Dalessandro __be32 attr_mod; 141*f48ad614SDennis Dalessandro __be64 mkey; 142*f48ad614SDennis Dalessandro u8 dr_rtn_path[30]; 143*f48ad614SDennis Dalessandro } __packed ntc_256; 144*f48ad614SDennis Dalessandro 145*f48ad614SDennis Dalessandro struct { 146*f48ad614SDennis Dalessandro __be32 lid1; 147*f48ad614SDennis Dalessandro __be32 lid2; 148*f48ad614SDennis Dalessandro __be32 key; 149*f48ad614SDennis Dalessandro u8 sl; /* SL: high 5 bits */ 150*f48ad614SDennis Dalessandro u8 reserved3[3]; 151*f48ad614SDennis Dalessandro union ib_gid gid1; 152*f48ad614SDennis Dalessandro union ib_gid gid2; 153*f48ad614SDennis Dalessandro __be32 qp1; /* high 8 bits reserved */ 154*f48ad614SDennis Dalessandro __be32 qp2; /* high 8 bits reserved */ 155*f48ad614SDennis Dalessandro } __packed ntc_257_258; 156*f48ad614SDennis Dalessandro 157*f48ad614SDennis Dalessandro struct { 158*f48ad614SDennis Dalessandro __be16 flags; /* low 8 bits reserved */ 159*f48ad614SDennis Dalessandro __be16 pkey; 160*f48ad614SDennis Dalessandro __be32 lid1; 161*f48ad614SDennis Dalessandro __be32 lid2; 162*f48ad614SDennis Dalessandro u8 sl; /* SL: high 5 bits */ 163*f48ad614SDennis Dalessandro u8 reserved4[3]; 164*f48ad614SDennis Dalessandro union ib_gid gid1; 165*f48ad614SDennis Dalessandro union ib_gid gid2; 166*f48ad614SDennis Dalessandro __be32 qp1; /* high 8 bits reserved */ 167*f48ad614SDennis Dalessandro __be32 qp2; /* high 8 bits reserved */ 168*f48ad614SDennis Dalessandro } __packed ntc_259; 169*f48ad614SDennis Dalessandro 170*f48ad614SDennis Dalessandro struct { 171*f48ad614SDennis Dalessandro __be32 lid; 172*f48ad614SDennis Dalessandro } __packed ntc_2048; 173*f48ad614SDennis Dalessandro 174*f48ad614SDennis Dalessandro }; 175*f48ad614SDennis Dalessandro u8 class_data[0]; 176*f48ad614SDennis Dalessandro }; 177*f48ad614SDennis Dalessandro 178*f48ad614SDennis Dalessandro #define IB_VLARB_LOWPRI_0_31 1 179*f48ad614SDennis Dalessandro #define IB_VLARB_LOWPRI_32_63 2 180*f48ad614SDennis Dalessandro #define IB_VLARB_HIGHPRI_0_31 3 181*f48ad614SDennis Dalessandro #define IB_VLARB_HIGHPRI_32_63 4 182*f48ad614SDennis Dalessandro 183*f48ad614SDennis Dalessandro #define OPA_MAX_PREEMPT_CAP 32 184*f48ad614SDennis Dalessandro #define OPA_VLARB_LOW_ELEMENTS 0 185*f48ad614SDennis Dalessandro #define OPA_VLARB_HIGH_ELEMENTS 1 186*f48ad614SDennis Dalessandro #define OPA_VLARB_PREEMPT_ELEMENTS 2 187*f48ad614SDennis Dalessandro #define OPA_VLARB_PREEMPT_MATRIX 3 188*f48ad614SDennis Dalessandro 189*f48ad614SDennis Dalessandro #define IB_PMA_PORT_COUNTERS_CONG cpu_to_be16(0xFF00) 190*f48ad614SDennis Dalessandro 191*f48ad614SDennis Dalessandro struct ib_pma_portcounters_cong { 192*f48ad614SDennis Dalessandro u8 reserved; 193*f48ad614SDennis Dalessandro u8 reserved1; 194*f48ad614SDennis Dalessandro __be16 port_check_rate; 195*f48ad614SDennis Dalessandro __be16 symbol_error_counter; 196*f48ad614SDennis Dalessandro u8 link_error_recovery_counter; 197*f48ad614SDennis Dalessandro u8 link_downed_counter; 198*f48ad614SDennis Dalessandro __be16 port_rcv_errors; 199*f48ad614SDennis Dalessandro __be16 port_rcv_remphys_errors; 200*f48ad614SDennis Dalessandro __be16 port_rcv_switch_relay_errors; 201*f48ad614SDennis Dalessandro __be16 port_xmit_discards; 202*f48ad614SDennis Dalessandro u8 port_xmit_constraint_errors; 203*f48ad614SDennis Dalessandro u8 port_rcv_constraint_errors; 204*f48ad614SDennis Dalessandro u8 reserved2; 205*f48ad614SDennis Dalessandro u8 link_overrun_errors; /* LocalLink: 7:4, BufferOverrun: 3:0 */ 206*f48ad614SDennis Dalessandro __be16 reserved3; 207*f48ad614SDennis Dalessandro __be16 vl15_dropped; 208*f48ad614SDennis Dalessandro __be64 port_xmit_data; 209*f48ad614SDennis Dalessandro __be64 port_rcv_data; 210*f48ad614SDennis Dalessandro __be64 port_xmit_packets; 211*f48ad614SDennis Dalessandro __be64 port_rcv_packets; 212*f48ad614SDennis Dalessandro __be64 port_xmit_wait; 213*f48ad614SDennis Dalessandro __be64 port_adr_events; 214*f48ad614SDennis Dalessandro } __packed; 215*f48ad614SDennis Dalessandro 216*f48ad614SDennis Dalessandro #define IB_SMP_UNSUP_VERSION cpu_to_be16(0x0004) 217*f48ad614SDennis Dalessandro #define IB_SMP_UNSUP_METHOD cpu_to_be16(0x0008) 218*f48ad614SDennis Dalessandro #define IB_SMP_UNSUP_METH_ATTR cpu_to_be16(0x000C) 219*f48ad614SDennis Dalessandro #define IB_SMP_INVALID_FIELD cpu_to_be16(0x001C) 220*f48ad614SDennis Dalessandro 221*f48ad614SDennis Dalessandro #define OPA_MAX_PREEMPT_CAP 32 222*f48ad614SDennis Dalessandro #define OPA_VLARB_LOW_ELEMENTS 0 223*f48ad614SDennis Dalessandro #define OPA_VLARB_HIGH_ELEMENTS 1 224*f48ad614SDennis Dalessandro #define OPA_VLARB_PREEMPT_ELEMENTS 2 225*f48ad614SDennis Dalessandro #define OPA_VLARB_PREEMPT_MATRIX 3 226*f48ad614SDennis Dalessandro 227*f48ad614SDennis Dalessandro #define HFI1_XMIT_RATE_UNSUPPORTED 0x0 228*f48ad614SDennis Dalessandro #define HFI1_XMIT_RATE_PICO 0x7 229*f48ad614SDennis Dalessandro /* number of 4nsec cycles equaling 2secs */ 230*f48ad614SDennis Dalessandro #define HFI1_CONG_TIMER_PSINTERVAL 0x1DCD64EC 231*f48ad614SDennis Dalessandro 232*f48ad614SDennis Dalessandro #define IB_CC_SVCTYPE_RC 0x0 233*f48ad614SDennis Dalessandro #define IB_CC_SVCTYPE_UC 0x1 234*f48ad614SDennis Dalessandro #define IB_CC_SVCTYPE_RD 0x2 235*f48ad614SDennis Dalessandro #define IB_CC_SVCTYPE_UD 0x3 236*f48ad614SDennis Dalessandro 237*f48ad614SDennis Dalessandro /* 238*f48ad614SDennis Dalessandro * There should be an equivalent IB #define for the following, but 239*f48ad614SDennis Dalessandro * I cannot find it. 240*f48ad614SDennis Dalessandro */ 241*f48ad614SDennis Dalessandro #define OPA_CC_LOG_TYPE_HFI 2 242*f48ad614SDennis Dalessandro 243*f48ad614SDennis Dalessandro struct opa_hfi1_cong_log_event_internal { 244*f48ad614SDennis Dalessandro u32 lqpn; 245*f48ad614SDennis Dalessandro u32 rqpn; 246*f48ad614SDennis Dalessandro u8 sl; 247*f48ad614SDennis Dalessandro u8 svc_type; 248*f48ad614SDennis Dalessandro u32 rlid; 249*f48ad614SDennis Dalessandro s64 timestamp; /* wider than 32 bits to detect 32 bit rollover */ 250*f48ad614SDennis Dalessandro }; 251*f48ad614SDennis Dalessandro 252*f48ad614SDennis Dalessandro struct opa_hfi1_cong_log_event { 253*f48ad614SDennis Dalessandro u8 local_qp_cn_entry[3]; 254*f48ad614SDennis Dalessandro u8 remote_qp_number_cn_entry[3]; 255*f48ad614SDennis Dalessandro u8 sl_svc_type_cn_entry; /* 5 bits SL, 3 bits svc type */ 256*f48ad614SDennis Dalessandro u8 reserved; 257*f48ad614SDennis Dalessandro __be32 remote_lid_cn_entry; 258*f48ad614SDennis Dalessandro __be32 timestamp_cn_entry; 259*f48ad614SDennis Dalessandro } __packed; 260*f48ad614SDennis Dalessandro 261*f48ad614SDennis Dalessandro #define OPA_CONG_LOG_ELEMS 96 262*f48ad614SDennis Dalessandro 263*f48ad614SDennis Dalessandro struct opa_hfi1_cong_log { 264*f48ad614SDennis Dalessandro u8 log_type; 265*f48ad614SDennis Dalessandro u8 congestion_flags; 266*f48ad614SDennis Dalessandro __be16 threshold_event_counter; 267*f48ad614SDennis Dalessandro __be32 current_time_stamp; 268*f48ad614SDennis Dalessandro u8 threshold_cong_event_map[OPA_MAX_SLS / 8]; 269*f48ad614SDennis Dalessandro struct opa_hfi1_cong_log_event events[OPA_CONG_LOG_ELEMS]; 270*f48ad614SDennis Dalessandro } __packed; 271*f48ad614SDennis Dalessandro 272*f48ad614SDennis Dalessandro #define IB_CC_TABLE_CAP_DEFAULT 31 273*f48ad614SDennis Dalessandro 274*f48ad614SDennis Dalessandro /* Port control flags */ 275*f48ad614SDennis Dalessandro #define IB_CC_CCS_PC_SL_BASED 0x01 276*f48ad614SDennis Dalessandro 277*f48ad614SDennis Dalessandro struct opa_congestion_setting_entry { 278*f48ad614SDennis Dalessandro u8 ccti_increase; 279*f48ad614SDennis Dalessandro u8 reserved; 280*f48ad614SDennis Dalessandro __be16 ccti_timer; 281*f48ad614SDennis Dalessandro u8 trigger_threshold; 282*f48ad614SDennis Dalessandro u8 ccti_min; /* min CCTI for cc table */ 283*f48ad614SDennis Dalessandro } __packed; 284*f48ad614SDennis Dalessandro 285*f48ad614SDennis Dalessandro struct opa_congestion_setting_entry_shadow { 286*f48ad614SDennis Dalessandro u8 ccti_increase; 287*f48ad614SDennis Dalessandro u8 reserved; 288*f48ad614SDennis Dalessandro u16 ccti_timer; 289*f48ad614SDennis Dalessandro u8 trigger_threshold; 290*f48ad614SDennis Dalessandro u8 ccti_min; /* min CCTI for cc table */ 291*f48ad614SDennis Dalessandro } __packed; 292*f48ad614SDennis Dalessandro 293*f48ad614SDennis Dalessandro struct opa_congestion_setting_attr { 294*f48ad614SDennis Dalessandro __be32 control_map; 295*f48ad614SDennis Dalessandro __be16 port_control; 296*f48ad614SDennis Dalessandro struct opa_congestion_setting_entry entries[OPA_MAX_SLS]; 297*f48ad614SDennis Dalessandro } __packed; 298*f48ad614SDennis Dalessandro 299*f48ad614SDennis Dalessandro struct opa_congestion_setting_attr_shadow { 300*f48ad614SDennis Dalessandro u32 control_map; 301*f48ad614SDennis Dalessandro u16 port_control; 302*f48ad614SDennis Dalessandro struct opa_congestion_setting_entry_shadow entries[OPA_MAX_SLS]; 303*f48ad614SDennis Dalessandro } __packed; 304*f48ad614SDennis Dalessandro 305*f48ad614SDennis Dalessandro #define IB_CC_TABLE_ENTRY_INCREASE_DEFAULT 1 306*f48ad614SDennis Dalessandro #define IB_CC_TABLE_ENTRY_TIMER_DEFAULT 1 307*f48ad614SDennis Dalessandro 308*f48ad614SDennis Dalessandro /* 64 Congestion Control table entries in a single MAD */ 309*f48ad614SDennis Dalessandro #define IB_CCT_ENTRIES 64 310*f48ad614SDennis Dalessandro #define IB_CCT_MIN_ENTRIES (IB_CCT_ENTRIES * 2) 311*f48ad614SDennis Dalessandro 312*f48ad614SDennis Dalessandro struct ib_cc_table_entry { 313*f48ad614SDennis Dalessandro __be16 entry; /* shift:2, multiplier:14 */ 314*f48ad614SDennis Dalessandro }; 315*f48ad614SDennis Dalessandro 316*f48ad614SDennis Dalessandro struct ib_cc_table_entry_shadow { 317*f48ad614SDennis Dalessandro u16 entry; /* shift:2, multiplier:14 */ 318*f48ad614SDennis Dalessandro }; 319*f48ad614SDennis Dalessandro 320*f48ad614SDennis Dalessandro struct ib_cc_table_attr { 321*f48ad614SDennis Dalessandro __be16 ccti_limit; /* max CCTI for cc table */ 322*f48ad614SDennis Dalessandro struct ib_cc_table_entry ccti_entries[IB_CCT_ENTRIES]; 323*f48ad614SDennis Dalessandro } __packed; 324*f48ad614SDennis Dalessandro 325*f48ad614SDennis Dalessandro struct ib_cc_table_attr_shadow { 326*f48ad614SDennis Dalessandro u16 ccti_limit; /* max CCTI for cc table */ 327*f48ad614SDennis Dalessandro struct ib_cc_table_entry_shadow ccti_entries[IB_CCT_ENTRIES]; 328*f48ad614SDennis Dalessandro } __packed; 329*f48ad614SDennis Dalessandro 330*f48ad614SDennis Dalessandro #define CC_TABLE_SHADOW_MAX \ 331*f48ad614SDennis Dalessandro (IB_CC_TABLE_CAP_DEFAULT * IB_CCT_ENTRIES) 332*f48ad614SDennis Dalessandro 333*f48ad614SDennis Dalessandro struct cc_table_shadow { 334*f48ad614SDennis Dalessandro u16 ccti_limit; /* max CCTI for cc table */ 335*f48ad614SDennis Dalessandro struct ib_cc_table_entry_shadow entries[CC_TABLE_SHADOW_MAX]; 336*f48ad614SDennis Dalessandro } __packed; 337*f48ad614SDennis Dalessandro 338*f48ad614SDennis Dalessandro /* 339*f48ad614SDennis Dalessandro * struct cc_state combines the (active) per-port congestion control 340*f48ad614SDennis Dalessandro * table, and the (active) per-SL congestion settings. cc_state data 341*f48ad614SDennis Dalessandro * may need to be read in code paths that we want to be fast, so it 342*f48ad614SDennis Dalessandro * is an RCU protected structure. 343*f48ad614SDennis Dalessandro */ 344*f48ad614SDennis Dalessandro struct cc_state { 345*f48ad614SDennis Dalessandro struct rcu_head rcu; 346*f48ad614SDennis Dalessandro struct cc_table_shadow cct; 347*f48ad614SDennis Dalessandro struct opa_congestion_setting_attr_shadow cong_setting; 348*f48ad614SDennis Dalessandro }; 349*f48ad614SDennis Dalessandro 350*f48ad614SDennis Dalessandro /* 351*f48ad614SDennis Dalessandro * OPA BufferControl MAD 352*f48ad614SDennis Dalessandro */ 353*f48ad614SDennis Dalessandro 354*f48ad614SDennis Dalessandro /* attribute modifier macros */ 355*f48ad614SDennis Dalessandro #define OPA_AM_NPORT_SHIFT 24 356*f48ad614SDennis Dalessandro #define OPA_AM_NPORT_MASK 0xff 357*f48ad614SDennis Dalessandro #define OPA_AM_NPORT_SMASK (OPA_AM_NPORT_MASK << OPA_AM_NPORT_SHIFT) 358*f48ad614SDennis Dalessandro #define OPA_AM_NPORT(am) (((am) >> OPA_AM_NPORT_SHIFT) & \ 359*f48ad614SDennis Dalessandro OPA_AM_NPORT_MASK) 360*f48ad614SDennis Dalessandro 361*f48ad614SDennis Dalessandro #define OPA_AM_NBLK_SHIFT 24 362*f48ad614SDennis Dalessandro #define OPA_AM_NBLK_MASK 0xff 363*f48ad614SDennis Dalessandro #define OPA_AM_NBLK_SMASK (OPA_AM_NBLK_MASK << OPA_AM_NBLK_SHIFT) 364*f48ad614SDennis Dalessandro #define OPA_AM_NBLK(am) (((am) >> OPA_AM_NBLK_SHIFT) & \ 365*f48ad614SDennis Dalessandro OPA_AM_NBLK_MASK) 366*f48ad614SDennis Dalessandro 367*f48ad614SDennis Dalessandro #define OPA_AM_START_BLK_SHIFT 0 368*f48ad614SDennis Dalessandro #define OPA_AM_START_BLK_MASK 0xff 369*f48ad614SDennis Dalessandro #define OPA_AM_START_BLK_SMASK (OPA_AM_START_BLK_MASK << \ 370*f48ad614SDennis Dalessandro OPA_AM_START_BLK_SHIFT) 371*f48ad614SDennis Dalessandro #define OPA_AM_START_BLK(am) (((am) >> OPA_AM_START_BLK_SHIFT) & \ 372*f48ad614SDennis Dalessandro OPA_AM_START_BLK_MASK) 373*f48ad614SDennis Dalessandro 374*f48ad614SDennis Dalessandro #define OPA_AM_PORTNUM_SHIFT 0 375*f48ad614SDennis Dalessandro #define OPA_AM_PORTNUM_MASK 0xff 376*f48ad614SDennis Dalessandro #define OPA_AM_PORTNUM_SMASK (OPA_AM_PORTNUM_MASK << OPA_AM_PORTNUM_SHIFT) 377*f48ad614SDennis Dalessandro #define OPA_AM_PORTNUM(am) (((am) >> OPA_AM_PORTNUM_SHIFT) & \ 378*f48ad614SDennis Dalessandro OPA_AM_PORTNUM_MASK) 379*f48ad614SDennis Dalessandro 380*f48ad614SDennis Dalessandro #define OPA_AM_ASYNC_SHIFT 12 381*f48ad614SDennis Dalessandro #define OPA_AM_ASYNC_MASK 0x1 382*f48ad614SDennis Dalessandro #define OPA_AM_ASYNC_SMASK (OPA_AM_ASYNC_MASK << OPA_AM_ASYNC_SHIFT) 383*f48ad614SDennis Dalessandro #define OPA_AM_ASYNC(am) (((am) >> OPA_AM_ASYNC_SHIFT) & \ 384*f48ad614SDennis Dalessandro OPA_AM_ASYNC_MASK) 385*f48ad614SDennis Dalessandro 386*f48ad614SDennis Dalessandro #define OPA_AM_START_SM_CFG_SHIFT 9 387*f48ad614SDennis Dalessandro #define OPA_AM_START_SM_CFG_MASK 0x1 388*f48ad614SDennis Dalessandro #define OPA_AM_START_SM_CFG_SMASK (OPA_AM_START_SM_CFG_MASK << \ 389*f48ad614SDennis Dalessandro OPA_AM_START_SM_CFG_SHIFT) 390*f48ad614SDennis Dalessandro #define OPA_AM_START_SM_CFG(am) (((am) >> OPA_AM_START_SM_CFG_SHIFT) \ 391*f48ad614SDennis Dalessandro & OPA_AM_START_SM_CFG_MASK) 392*f48ad614SDennis Dalessandro 393*f48ad614SDennis Dalessandro #define OPA_AM_CI_ADDR_SHIFT 19 394*f48ad614SDennis Dalessandro #define OPA_AM_CI_ADDR_MASK 0xfff 395*f48ad614SDennis Dalessandro #define OPA_AM_CI_ADDR_SMASK (OPA_AM_CI_ADDR_MASK << OPA_CI_ADDR_SHIFT) 396*f48ad614SDennis Dalessandro #define OPA_AM_CI_ADDR(am) (((am) >> OPA_AM_CI_ADDR_SHIFT) & \ 397*f48ad614SDennis Dalessandro OPA_AM_CI_ADDR_MASK) 398*f48ad614SDennis Dalessandro 399*f48ad614SDennis Dalessandro #define OPA_AM_CI_LEN_SHIFT 13 400*f48ad614SDennis Dalessandro #define OPA_AM_CI_LEN_MASK 0x3f 401*f48ad614SDennis Dalessandro #define OPA_AM_CI_LEN_SMASK (OPA_AM_CI_LEN_MASK << OPA_CI_LEN_SHIFT) 402*f48ad614SDennis Dalessandro #define OPA_AM_CI_LEN(am) (((am) >> OPA_AM_CI_LEN_SHIFT) & \ 403*f48ad614SDennis Dalessandro OPA_AM_CI_LEN_MASK) 404*f48ad614SDennis Dalessandro 405*f48ad614SDennis Dalessandro /* error info macros */ 406*f48ad614SDennis Dalessandro #define OPA_EI_STATUS_SMASK 0x80 407*f48ad614SDennis Dalessandro #define OPA_EI_CODE_SMASK 0x0f 408*f48ad614SDennis Dalessandro 409*f48ad614SDennis Dalessandro struct vl_limit { 410*f48ad614SDennis Dalessandro __be16 dedicated; 411*f48ad614SDennis Dalessandro __be16 shared; 412*f48ad614SDennis Dalessandro }; 413*f48ad614SDennis Dalessandro 414*f48ad614SDennis Dalessandro struct buffer_control { 415*f48ad614SDennis Dalessandro __be16 reserved; 416*f48ad614SDennis Dalessandro __be16 overall_shared_limit; 417*f48ad614SDennis Dalessandro struct vl_limit vl[OPA_MAX_VLS]; 418*f48ad614SDennis Dalessandro }; 419*f48ad614SDennis Dalessandro 420*f48ad614SDennis Dalessandro struct sc2vlnt { 421*f48ad614SDennis Dalessandro u8 vlnt[32]; /* 5 bit VL, 3 bits reserved */ 422*f48ad614SDennis Dalessandro }; 423*f48ad614SDennis Dalessandro 424*f48ad614SDennis Dalessandro /* 425*f48ad614SDennis Dalessandro * The PortSamplesControl.CounterMasks field is an array of 3 bit fields 426*f48ad614SDennis Dalessandro * which specify the N'th counter's capabilities. See ch. 16.1.3.2. 427*f48ad614SDennis Dalessandro * We support 5 counters which only count the mandatory quantities. 428*f48ad614SDennis Dalessandro */ 429*f48ad614SDennis Dalessandro #define COUNTER_MASK(q, n) (q << ((9 - n) * 3)) 430*f48ad614SDennis Dalessandro #define COUNTER_MASK0_9 \ 431*f48ad614SDennis Dalessandro cpu_to_be32(COUNTER_MASK(1, 0) | \ 432*f48ad614SDennis Dalessandro COUNTER_MASK(1, 1) | \ 433*f48ad614SDennis Dalessandro COUNTER_MASK(1, 2) | \ 434*f48ad614SDennis Dalessandro COUNTER_MASK(1, 3) | \ 435*f48ad614SDennis Dalessandro COUNTER_MASK(1, 4)) 436*f48ad614SDennis Dalessandro 437*f48ad614SDennis Dalessandro #endif /* _HFI1_MAD_H */ 438