1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 | /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (C) 2005-2016 Broadcom. * All rights reserved. * * Contact Information: * linux-drivers@emulex.com * * Emulex * 3333 Susan Street * Costa Mesa, CA 92626 */ /********* Mailbox door bell *************/ /* Used for driver communication with the FW. * The software must write this register twice to post any command. First, * it writes the register with hi=1 and the upper bits of the physical address * for the MAILBOX structure. Software must poll the ready bit until this * is acknowledged. Then, sotware writes the register with hi=0 with the lower * bits in the address. It must poll the ready bit until the command is * complete. Upon completion, the MAILBOX will contain a valid completion * queue entry. */ #define MPU_MAILBOX_DB_OFFSET 0x160 #define MPU_MAILBOX_DB_RDY_MASK 0x1 /* bit 0 */ #define MPU_MAILBOX_DB_HI_MASK 0x2 /* bit 1 */ #define MPU_EP_CONTROL 0 /********** MPU semphore: used for SH & BE *************/ #define SLIPORT_SOFTRESET_OFFSET 0x5c /* CSR BAR offset */ #define SLIPORT_SEMAPHORE_OFFSET_BEx 0xac /* CSR BAR offset */ #define SLIPORT_SEMAPHORE_OFFSET_SH 0x94 /* PCI-CFG offset */ #define POST_STAGE_MASK 0x0000FFFF #define POST_ERR_MASK 0x1 #define POST_ERR_SHIFT 31 #define POST_ERR_RECOVERY_CODE_MASK 0xFFF /* Soft Reset register masks */ #define SLIPORT_SOFTRESET_SR_MASK 0x00000080 /* SR bit */ /* MPU semphore POST stage values */ #define POST_STAGE_AWAITING_HOST_RDY 0x1 /* FW awaiting goahead from host */ #define POST_STAGE_HOST_RDY 0x2 /* Host has given go-ahed to FW */ #define POST_STAGE_BE_RESET 0x3 /* Host wants to reset chip */ #define POST_STAGE_ARMFW_RDY 0xc000 /* FW is done with POST */ #define POST_STAGE_RECOVERABLE_ERR 0xE000 /* Recoverable err detected */ /* FW has detected a UE and is dumping FAT log data */ #define POST_STAGE_FAT_LOG_START 0x0D00 #define POST_STAGE_ARMFW_UE 0xF000 /*FW has asserted an UE*/ /* Lancer SLIPORT registers */ #define SLIPORT_STATUS_OFFSET 0x404 #define SLIPORT_CONTROL_OFFSET 0x408 #define SLIPORT_ERROR1_OFFSET 0x40C #define SLIPORT_ERROR2_OFFSET 0x410 #define PHYSDEV_CONTROL_OFFSET 0x414 #define SLIPORT_STATUS_ERR_MASK 0x80000000 #define SLIPORT_STATUS_DIP_MASK 0x02000000 #define SLIPORT_STATUS_RN_MASK 0x01000000 #define SLIPORT_STATUS_RDY_MASK 0x00800000 #define SLI_PORT_CONTROL_IP_MASK 0x08000000 #define PHYSDEV_CONTROL_FW_RESET_MASK 0x00000002 #define PHYSDEV_CONTROL_DD_MASK 0x00000004 #define PHYSDEV_CONTROL_INP_MASK 0x40000000 #define SLIPORT_ERROR_NO_RESOURCE1 0x2 #define SLIPORT_ERROR_NO_RESOURCE2 0x9 #define SLIPORT_ERROR_FW_RESET1 0x2 #define SLIPORT_ERROR_FW_RESET2 0x0 /********* Memory BAR register ************/ #define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 0xfc /* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt * Disable" may still globally block interrupts in addition to individual * interrupt masks; a mechanism for the device driver to block all interrupts * atomically without having to arbitrate for the PCI Interrupt Disable bit * with the OS. */ #define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK BIT(29) /* bit 29 */ /********* PCI Function Capability *********/ #define BE_FUNCTION_CAPS_RSS 0x2 #define BE_FUNCTION_CAPS_SUPER_NIC 0x40 /********* Power management (WOL) **********/ #define PCICFG_PM_CONTROL_OFFSET 0x44 #define PCICFG_PM_CONTROL_MASK 0x108 /* bits 3 & 8 */ /********* Online Control Registers *******/ #define PCICFG_ONLINE0 0xB0 #define PCICFG_ONLINE1 0xB4 /********* UE Status and Mask Registers ***/ #define PCICFG_UE_STATUS_LOW 0xA0 #define PCICFG_UE_STATUS_HIGH 0xA4 #define PCICFG_UE_STATUS_LOW_MASK 0xA8 #define PCICFG_UE_STATUS_HI_MASK 0xAC /******** SLI_INTF ***********************/ #define SLI_INTF_REG_OFFSET 0x58 #define SLI_INTF_VALID_MASK 0xE0000000 #define SLI_INTF_VALID 0xC0000000 #define SLI_INTF_HINT2_MASK 0x1F000000 #define SLI_INTF_HINT2_SHIFT 24 #define SLI_INTF_HINT1_MASK 0x00FF0000 #define SLI_INTF_HINT1_SHIFT 16 #define SLI_INTF_FAMILY_MASK 0x00000F00 #define SLI_INTF_FAMILY_SHIFT 8 #define SLI_INTF_IF_TYPE_MASK 0x0000F000 #define SLI_INTF_IF_TYPE_SHIFT 12 #define SLI_INTF_REV_MASK 0x000000F0 #define SLI_INTF_REV_SHIFT 4 #define SLI_INTF_FT_MASK 0x00000001 #define SLI_INTF_TYPE_2 2 #define SLI_INTF_TYPE_3 3 /********* ISR0 Register offset **********/ #define CEV_ISR0_OFFSET 0xC18 #define CEV_ISR_SIZE 4 /********* Event Q door bell *************/ #define DB_EQ_OFFSET DB_CQ_OFFSET #define DB_EQ_RING_ID_MASK 0x1FF /* bits 0 - 8 */ #define DB_EQ_RING_ID_EXT_MASK 0x3e00 /* bits 9-13 */ #define DB_EQ_RING_ID_EXT_MASK_SHIFT (2) /* qid bits 9-13 placing at 11-15 */ /* Clear the interrupt for this eq */ #define DB_EQ_CLR_SHIFT (9) /* bit 9 */ /* Must be 1 */ #define DB_EQ_EVNT_SHIFT (10) /* bit 10 */ /* Number of event entries processed */ #define DB_EQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */ /* Rearm bit */ #define DB_EQ_REARM_SHIFT (29) /* bit 29 */ /* Rearm to interrupt delay encoding */ #define DB_EQ_R2I_DLY_SHIFT (30) /* bits 30 - 31 */ /* Rearm to interrupt (R2I) delay multiplier encoding represents 3 different * values configured in CEV_REARM2IRPT_DLY_MULT_CSR register. This value is * programmed by host driver while ringing an EQ doorbell(EQ_DB) if a delay * between rearming the EQ and next interrupt on this EQ is desired. */ #define R2I_DLY_ENC_0 0 /* No delay */ #define R2I_DLY_ENC_1 1 /* maps to 160us EQ delay */ #define R2I_DLY_ENC_2 2 /* maps to 96us EQ delay */ #define R2I_DLY_ENC_3 3 /* maps to 48us EQ delay */ /********* Compl Q door bell *************/ #define DB_CQ_OFFSET 0x120 #define DB_CQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */ #define DB_CQ_RING_ID_EXT_MASK 0x7C00 /* bits 10-14 */ #define DB_CQ_RING_ID_EXT_MASK_SHIFT (1) /* qid bits 10-14 placing at 11-15 */ /* Number of event entries processed */ #define DB_CQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */ /* Rearm bit */ #define DB_CQ_REARM_SHIFT (29) /* bit 29 */ /********** TX ULP door bell *************/ #define DB_TXULP1_OFFSET 0x60 #define DB_TXULP_RING_ID_MASK 0x7FF /* bits 0 - 10 */ /* Number of tx entries posted */ #define DB_TXULP_NUM_POSTED_SHIFT (16) /* bits 16 - 29 */ #define DB_TXULP_NUM_POSTED_MASK 0x3FFF /* bits 16 - 29 */ /********** RQ(erx) door bell ************/ #define DB_RQ_OFFSET 0x100 #define DB_RQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */ /* Number of rx frags posted */ #define DB_RQ_NUM_POSTED_SHIFT (24) /* bits 24 - 31 */ /********** MCC door bell ************/ #define DB_MCCQ_OFFSET 0x140 #define DB_MCCQ_RING_ID_MASK 0x7FF /* bits 0 - 10 */ /* Number of entries posted */ #define DB_MCCQ_NUM_POSTED_SHIFT (16) /* bits 16 - 29 */ /********** SRIOV VF PCICFG OFFSET ********/ #define SRIOV_VF_PCICFG_OFFSET (4096) /********** FAT TABLE ********/ #define RETRIEVE_FAT 0 #define QUERY_FAT 1 /************* Rx Packet Type Encoding **************/ #define BE_UNICAST_PACKET 0 #define BE_MULTICAST_PACKET 1 #define BE_BROADCAST_PACKET 2 #define BE_RSVD_PACKET 3 /* * BE descriptors: host memory data structures whose formats * are hardwired in BE silicon. */ /* Event Queue Descriptor */ #define EQ_ENTRY_VALID_MASK 0x1 /* bit 0 */ #define EQ_ENTRY_RES_ID_MASK 0xFFFF /* bits 16 - 31 */ #define EQ_ENTRY_RES_ID_SHIFT 16 struct be_eq_entry { u32 evt; }; /* TX Queue Descriptor */ #define ETH_WRB_FRAG_LEN_MASK 0xFFFF struct be_eth_wrb { __le32 frag_pa_hi; /* dword 0 */ __le32 frag_pa_lo; /* dword 1 */ u32 rsvd0; /* dword 2 */ __le32 frag_len; /* dword 3: bits 0 - 15 */ } __packed; /* Pseudo amap definition for eth_hdr_wrb in which each bit of the * actual structure is defined as a byte : used to calculate * offset/shift/mask of each field */ struct amap_eth_hdr_wrb { u8 rsvd0[32]; /* dword 0 */ u8 rsvd1[32]; /* dword 1 */ u8 complete; /* dword 2 */ u8 event; u8 crc; u8 forward; u8 lso6; u8 mgmt; u8 ipcs; u8 udpcs; u8 tcpcs; u8 lso; u8 vlan; u8 gso[2]; u8 num_wrb[5]; u8 lso_mss[14]; u8 len[16]; /* dword 3 */ u8 vlan_tag[16]; } __packed; #define TX_HDR_WRB_COMPL 1 /* word 2 */ #define TX_HDR_WRB_EVT BIT(1) /* word 2 */ #define TX_HDR_WRB_NUM_SHIFT 13 /* word 2: bits 13:17 */ #define TX_HDR_WRB_NUM_MASK 0x1F /* word 2: bits 13:17 */ struct be_eth_hdr_wrb { __le32 dw[4]; }; /********* Tx Compl Status Encoding *********/ #define BE_TX_COMP_HDR_PARSE_ERR 0x2 #define BE_TX_COMP_NDMA_ERR 0x3 #define BE_TX_COMP_ACL_ERR 0x5 #define LANCER_TX_COMP_LSO_ERR 0x1 #define LANCER_TX_COMP_HSW_DROP_MAC_ERR 0x3 #define LANCER_TX_COMP_HSW_DROP_VLAN_ERR 0x5 #define LANCER_TX_COMP_QINQ_ERR 0x7 #define LANCER_TX_COMP_SGE_ERR 0x9 #define LANCER_TX_COMP_PARITY_ERR 0xb #define LANCER_TX_COMP_DMA_ERR 0xd /* TX Compl Queue Descriptor */ /* Pseudo amap definition for eth_tx_compl in which each bit of the * actual structure is defined as a byte: used to calculate * offset/shift/mask of each field */ struct amap_eth_tx_compl { u8 wrb_index[16]; /* dword 0 */ u8 ct[2]; /* dword 0 */ u8 port[2]; /* dword 0 */ u8 rsvd0[8]; /* dword 0 */ u8 status[4]; /* dword 0 */ u8 user_bytes[16]; /* dword 1 */ u8 nwh_bytes[8]; /* dword 1 */ u8 lso; /* dword 1 */ u8 cast_enc[2]; /* dword 1 */ u8 rsvd1[5]; /* dword 1 */ u8 rsvd2[32]; /* dword 2 */ u8 pkts[16]; /* dword 3 */ u8 ringid[11]; /* dword 3 */ u8 hash_val[4]; /* dword 3 */ u8 valid; /* dword 3 */ } __packed; struct be_eth_tx_compl { u32 dw[4]; }; /* RX Queue Descriptor */ struct be_eth_rx_d { u32 fragpa_hi; u32 fragpa_lo; }; /* RX Compl Queue Descriptor */ /* Pseudo amap definition for BE2 and BE3 legacy mode eth_rx_compl in which * each bit of the actual structure is defined as a byte: used to calculate * offset/shift/mask of each field */ struct amap_eth_rx_compl_v0 { u8 vlan_tag[16]; /* dword 0 */ u8 pktsize[14]; /* dword 0 */ u8 port; /* dword 0 */ u8 ip_opt; /* dword 0 */ u8 err; /* dword 1 */ u8 rsshp; /* dword 1 */ u8 ipf; /* dword 1 */ u8 tcpf; /* dword 1 */ u8 udpf; /* dword 1 */ u8 ipcksm; /* dword 1 */ u8 l4_cksm; /* dword 1 */ u8 ip_version; /* dword 1 */ u8 macdst[6]; /* dword 1 */ u8 vtp; /* dword 1 */ u8 ip_frag; /* dword 1 */ u8 fragndx[10]; /* dword 1 */ u8 ct[2]; /* dword 1 */ u8 sw; /* dword 1 */ u8 numfrags[3]; /* dword 1 */ u8 rss_flush; /* dword 2 */ u8 cast_enc[2]; /* dword 2 */ u8 qnq; /* dword 2 */ u8 rss_bank; /* dword 2 */ u8 rsvd1[23]; /* dword 2 */ u8 lro_pkt; /* dword 2 */ u8 rsvd2[2]; /* dword 2 */ u8 valid; /* dword 2 */ u8 rsshash[32]; /* dword 3 */ } __packed; /* Pseudo amap definition for BE3 native mode eth_rx_compl in which * each bit of the actual structure is defined as a byte: used to calculate * offset/shift/mask of each field */ struct amap_eth_rx_compl_v1 { u8 vlan_tag[16]; /* dword 0 */ u8 pktsize[14]; /* dword 0 */ u8 vtp; /* dword 0 */ u8 ip_opt; /* dword 0 */ u8 err; /* dword 1 */ u8 rsshp; /* dword 1 */ u8 ipf; /* dword 1 */ u8 tcpf; /* dword 1 */ u8 udpf; /* dword 1 */ u8 ipcksm; /* dword 1 */ u8 l4_cksm; /* dword 1 */ u8 ip_version; /* dword 1 */ u8 macdst[7]; /* dword 1 */ u8 rsvd0; /* dword 1 */ u8 fragndx[10]; /* dword 1 */ u8 ct[2]; /* dword 1 */ u8 sw; /* dword 1 */ u8 numfrags[3]; /* dword 1 */ u8 rss_flush; /* dword 2 */ u8 cast_enc[2]; /* dword 2 */ u8 qnq; /* dword 2 */ u8 rss_bank; /* dword 2 */ u8 port[2]; /* dword 2 */ u8 vntagp; /* dword 2 */ u8 header_len[8]; /* dword 2 */ u8 header_split[2]; /* dword 2 */ u8 rsvd1[12]; /* dword 2 */ u8 tunneled; u8 valid; /* dword 2 */ u8 rsshash[32]; /* dword 3 */ } __packed; struct be_eth_rx_compl { u32 dw[4]; }; |