1*1ccea77eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2e6ad7673SIyappan Subramanian /* Applied Micro X-Gene SoC Ethernet Driver 3e6ad7673SIyappan Subramanian * 4e6ad7673SIyappan Subramanian * Copyright (c) 2014, Applied Micro Circuits Corporation 5e6ad7673SIyappan Subramanian * Authors: Iyappan Subramanian <isubramanian@apm.com> 6e6ad7673SIyappan Subramanian * Ravi Patel <rapatel@apm.com> 7e6ad7673SIyappan Subramanian * Keyur Chudgar <kchudgar@apm.com> 8e6ad7673SIyappan Subramanian */ 9e6ad7673SIyappan Subramanian 10e6ad7673SIyappan Subramanian #ifndef __XGENE_ENET_HW_H__ 11e6ad7673SIyappan Subramanian #define __XGENE_ENET_HW_H__ 12e6ad7673SIyappan Subramanian 13e6ad7673SIyappan Subramanian #include "xgene_enet_main.h" 14e6ad7673SIyappan Subramanian 15e6ad7673SIyappan Subramanian struct xgene_enet_pdata; 16e6ad7673SIyappan Subramanian struct xgene_enet_stats; 1781cefb81SIyappan Subramanian struct xgene_enet_desc_ring; 18e6ad7673SIyappan Subramanian 19e6ad7673SIyappan Subramanian /* clears and then set bits */ 20e6ad7673SIyappan Subramanian static inline void xgene_set_bits(u32 *dst, u32 val, u32 start, u32 len) 21e6ad7673SIyappan Subramanian { 22e6ad7673SIyappan Subramanian u32 end = start + len - 1; 23e6ad7673SIyappan Subramanian u32 mask = GENMASK(end, start); 24e6ad7673SIyappan Subramanian 25e6ad7673SIyappan Subramanian *dst &= ~mask; 26e6ad7673SIyappan Subramanian *dst |= (val << start) & mask; 27e6ad7673SIyappan Subramanian } 28e6ad7673SIyappan Subramanian 29e6ad7673SIyappan Subramanian static inline u32 xgene_get_bits(u32 val, u32 start, u32 end) 30e6ad7673SIyappan Subramanian { 31e6ad7673SIyappan Subramanian return (val & GENMASK(end, start)) >> start; 32e6ad7673SIyappan Subramanian } 33e6ad7673SIyappan Subramanian 340148d38dSIyappan Subramanian enum xgene_enet_rm { 350148d38dSIyappan Subramanian RM0, 3632f784b5SIyappan Subramanian RM1, 370148d38dSIyappan Subramanian RM3 = 3 380148d38dSIyappan Subramanian }; 390148d38dSIyappan Subramanian 40e6ad7673SIyappan Subramanian #define CSR_RING_ID 0x0008 41e6ad7673SIyappan Subramanian #define OVERWRITE BIT(31) 42e6ad7673SIyappan Subramanian #define IS_BUFFER_POOL BIT(20) 43e6ad7673SIyappan Subramanian #define PREFETCH_BUF_EN BIT(21) 44e6ad7673SIyappan Subramanian #define CSR_RING_ID_BUF 0x000c 45107dec27SIyappan Subramanian #define CSR_PBM_COAL 0x0014 46f126df85SIyappan Subramanian #define CSR_PBM_CTICK0 0x0018 47107dec27SIyappan Subramanian #define CSR_PBM_CTICK1 0x001c 48107dec27SIyappan Subramanian #define CSR_PBM_CTICK2 0x0020 49f126df85SIyappan Subramanian #define CSR_PBM_CTICK3 0x0024 50107dec27SIyappan Subramanian #define CSR_THRESHOLD0_SET1 0x0030 51107dec27SIyappan Subramanian #define CSR_THRESHOLD1_SET1 0x0034 52e6ad7673SIyappan Subramanian #define CSR_RING_NE_INT_MODE 0x017c 53e6ad7673SIyappan Subramanian #define CSR_RING_CONFIG 0x006c 54e6ad7673SIyappan Subramanian #define CSR_RING_WR_BASE 0x0070 55e6ad7673SIyappan Subramanian #define NUM_RING_CONFIG 5 56e6ad7673SIyappan Subramanian #define BUFPOOL_MODE 3 57e6ad7673SIyappan Subramanian #define INC_DEC_CMD_ADDR 0x002c 58e6ad7673SIyappan Subramanian #define UDP_HDR_SIZE 2 59e6ad7673SIyappan Subramanian #define BUF_LEN_CODE_2K 0x5000 60e6ad7673SIyappan Subramanian 61e6ad7673SIyappan Subramanian #define CREATE_MASK(pos, len) GENMASK((pos)+(len)-1, (pos)) 62e6ad7673SIyappan Subramanian #define CREATE_MASK_ULL(pos, len) GENMASK_ULL((pos)+(len)-1, (pos)) 63e6ad7673SIyappan Subramanian 64e6ad7673SIyappan Subramanian /* Empty slot soft signature */ 65e6ad7673SIyappan Subramanian #define EMPTY_SLOT_INDEX 1 66e6ad7673SIyappan Subramanian #define EMPTY_SLOT ~0ULL 67e6ad7673SIyappan Subramanian 68e6ad7673SIyappan Subramanian #define WORK_DESC_SIZE 32 69e6ad7673SIyappan Subramanian #define BUFPOOL_DESC_SIZE 16 70e6ad7673SIyappan Subramanian 71e6ad7673SIyappan Subramanian #define RING_OWNER_MASK GENMASK(9, 6) 72e6ad7673SIyappan Subramanian #define RING_BUFNUM_MASK GENMASK(5, 0) 73e6ad7673SIyappan Subramanian 74e6ad7673SIyappan Subramanian #define SELTHRSH_POS 3 75e6ad7673SIyappan Subramanian #define SELTHRSH_LEN 3 76e6ad7673SIyappan Subramanian #define RINGADDRL_POS 5 77e6ad7673SIyappan Subramanian #define RINGADDRL_LEN 27 78e6ad7673SIyappan Subramanian #define RINGADDRH_POS 0 79e2f2d9a7SIyappan Subramanian #define RINGADDRH_LEN 7 80e6ad7673SIyappan Subramanian #define RINGSIZE_POS 23 81e6ad7673SIyappan Subramanian #define RINGSIZE_LEN 3 82e6ad7673SIyappan Subramanian #define RINGTYPE_POS 19 83e6ad7673SIyappan Subramanian #define RINGTYPE_LEN 2 84e6ad7673SIyappan Subramanian #define RINGMODE_POS 20 85e6ad7673SIyappan Subramanian #define RINGMODE_LEN 3 86e6ad7673SIyappan Subramanian #define RECOMTIMEOUTL_POS 28 87e2f2d9a7SIyappan Subramanian #define RECOMTIMEOUTL_LEN 4 88e6ad7673SIyappan Subramanian #define RECOMTIMEOUTH_POS 0 89e2f2d9a7SIyappan Subramanian #define RECOMTIMEOUTH_LEN 3 90e6ad7673SIyappan Subramanian #define NUMMSGSINQ_POS 1 91e6ad7673SIyappan Subramanian #define NUMMSGSINQ_LEN 16 92e6ad7673SIyappan Subramanian #define ACCEPTLERR BIT(19) 93e6ad7673SIyappan Subramanian #define QCOHERENT BIT(4) 94e6ad7673SIyappan Subramanian #define RECOMBBUF BIT(27) 95e6ad7673SIyappan Subramanian 96ca626454SKeyur Chudgar #define MAC_OFFSET 0x30 979a8c5ddeSIyappan Subramanian #define OFFSET_4 0x04 989a8c5ddeSIyappan Subramanian #define OFFSET_8 0x08 99ca626454SKeyur Chudgar 100e6ad7673SIyappan Subramanian #define BLOCK_ETH_CSR_OFFSET 0x2000 10176f94a9cSIyappan Subramanian #define BLOCK_ETH_CLE_CSR_OFFSET 0x6000 102e6ad7673SIyappan Subramanian #define BLOCK_ETH_RING_IF_OFFSET 0x9000 103bc1b7c13SIyappan Subramanian #define BLOCK_ETH_CLKRST_CSR_OFFSET 0xc000 104e6ad7673SIyappan Subramanian #define BLOCK_ETH_DIAG_CSR_OFFSET 0xD000 105e6ad7673SIyappan Subramanian #define BLOCK_ETH_MAC_OFFSET 0x0000 1062d07d8e4SQuan Nguyen #define BLOCK_ETH_STATS_OFFSET 0x0000 107e6ad7673SIyappan Subramanian #define BLOCK_ETH_MAC_CSR_OFFSET 0x2800 108e6ad7673SIyappan Subramanian 109c3f4465dSIyappan Subramanian #define CLKEN_ADDR 0xc208 110c3f4465dSIyappan Subramanian #define SRST_ADDR 0xc200 111c3f4465dSIyappan Subramanian 112e6ad7673SIyappan Subramanian #define MAC_ADDR_REG_OFFSET 0x00 113e6ad7673SIyappan Subramanian #define MAC_COMMAND_REG_OFFSET 0x04 114e6ad7673SIyappan Subramanian #define MAC_WRITE_REG_OFFSET 0x08 115e6ad7673SIyappan Subramanian #define MAC_READ_REG_OFFSET 0x0c 116e6ad7673SIyappan Subramanian #define MAC_COMMAND_DONE_REG_OFFSET 0x10 117e6ad7673SIyappan Subramanian 1182d07d8e4SQuan Nguyen #define STAT_ADDR_REG_OFFSET 0x14 1192d07d8e4SQuan Nguyen #define STAT_COMMAND_REG_OFFSET 0x18 1202d07d8e4SQuan Nguyen #define STAT_WRITE_REG_OFFSET 0x1c 1212d07d8e4SQuan Nguyen #define STAT_READ_REG_OFFSET 0x20 1222d07d8e4SQuan Nguyen #define STAT_COMMAND_DONE_REG_OFFSET 0x24 1232d07d8e4SQuan Nguyen 1243eb7cb9dSIyappan Subramanian #define PCS_ADDR_REG_OFFSET 0x00 1253eb7cb9dSIyappan Subramanian #define PCS_COMMAND_REG_OFFSET 0x04 1263eb7cb9dSIyappan Subramanian #define PCS_WRITE_REG_OFFSET 0x08 1273eb7cb9dSIyappan Subramanian #define PCS_READ_REG_OFFSET 0x0c 1283eb7cb9dSIyappan Subramanian #define PCS_COMMAND_DONE_REG_OFFSET 0x10 1293eb7cb9dSIyappan Subramanian 130e6ad7673SIyappan Subramanian #define MII_MGMT_CONFIG_ADDR 0x20 131e6ad7673SIyappan Subramanian #define MII_MGMT_COMMAND_ADDR 0x24 132e6ad7673SIyappan Subramanian #define MII_MGMT_ADDRESS_ADDR 0x28 133e6ad7673SIyappan Subramanian #define MII_MGMT_CONTROL_ADDR 0x2c 134e6ad7673SIyappan Subramanian #define MII_MGMT_STATUS_ADDR 0x30 135e6ad7673SIyappan Subramanian #define MII_MGMT_INDICATORS_ADDR 0x34 136e6ad7673SIyappan Subramanian 137e6ad7673SIyappan Subramanian #define BUSY_MASK BIT(0) 138e6ad7673SIyappan Subramanian #define READ_CYCLE_MASK BIT(0) 139e6ad7673SIyappan Subramanian #define PHY_CONTROL_SET(dst, val) xgene_set_bits(dst, val, 0, 16) 140e6ad7673SIyappan Subramanian 141e6ad7673SIyappan Subramanian #define ENET_SPARE_CFG_REG_ADDR 0x0750 142e6ad7673SIyappan Subramanian #define RSIF_CONFIG_REG_ADDR 0x0010 143e6ad7673SIyappan Subramanian #define RSIF_RAM_DBG_REG0_ADDR 0x0048 144e6ad7673SIyappan Subramanian #define RGMII_REG_0_ADDR 0x07e0 145e6ad7673SIyappan Subramanian #define CFG_LINK_AGGR_RESUME_0_ADDR 0x07c8 146e6ad7673SIyappan Subramanian #define DEBUG_REG_ADDR 0x0700 147e6ad7673SIyappan Subramanian #define CFG_BYPASS_ADDR 0x0294 148e6ad7673SIyappan Subramanian #define CLE_BYPASS_REG0_0_ADDR 0x0490 149e6ad7673SIyappan Subramanian #define CLE_BYPASS_REG1_0_ADDR 0x0494 150e6ad7673SIyappan Subramanian #define CFG_RSIF_FPBUFF_TIMEOUT_EN BIT(31) 151e6ad7673SIyappan Subramanian #define RESUME_TX BIT(0) 152e6ad7673SIyappan Subramanian #define CFG_SPEED_1250 BIT(24) 153e6ad7673SIyappan Subramanian #define TX_PORT0 BIT(0) 154e6ad7673SIyappan Subramanian #define CFG_BYPASS_UNISEC_TX BIT(2) 155e6ad7673SIyappan Subramanian #define CFG_BYPASS_UNISEC_RX BIT(1) 156e6ad7673SIyappan Subramanian #define CFG_CLE_BYPASS_EN0 BIT(31) 157e6ad7673SIyappan Subramanian #define CFG_TXCLK_MUXSEL0_SET(dst, val) xgene_set_bits(dst, val, 29, 3) 15816615a4cSIyappan Subramanian #define CFG_RXCLK_MUXSEL0_SET(dst, val) xgene_set_bits(dst, val, 26, 3) 159e6ad7673SIyappan Subramanian 160e6ad7673SIyappan Subramanian #define CFG_CLE_IP_PROTOCOL0_SET(dst, val) xgene_set_bits(dst, val, 16, 2) 161e026e700SQuan Nguyen #define CFG_CLE_IP_HDR_LEN_SET(dst, val) xgene_set_bits(dst, val, 8, 5) 162e6ad7673SIyappan Subramanian #define CFG_CLE_DSTQID0_SET(dst, val) xgene_set_bits(dst, val, 0, 12) 163e6ad7673SIyappan Subramanian #define CFG_CLE_FPSEL0_SET(dst, val) xgene_set_bits(dst, val, 16, 4) 164d6d48969SIyappan Subramanian #define CFG_CLE_NXTFPSEL0_SET(dst, val) xgene_set_bits(dst, val, 20, 4) 165e6ad7673SIyappan Subramanian #define CFG_MACMODE_SET(dst, val) xgene_set_bits(dst, val, 18, 2) 166e6ad7673SIyappan Subramanian #define CFG_WAITASYNCRD_SET(dst, val) xgene_set_bits(dst, val, 0, 16) 167d6d48969SIyappan Subramanian #define CFG_CLE_DSTQID0(val) ((val) & GENMASK(11, 0)) 168d6d48969SIyappan Subramanian #define CFG_CLE_FPSEL0(val) (((val) << 16) & GENMASK(19, 16)) 169bb64fa09SIyappan Subramanian #define CSR_ECM_CFG_0_ADDR 0x0220 170bb64fa09SIyappan Subramanian #define CSR_ECM_CFG_1_ADDR 0x0224 17156090b12SIyappan Subramanian #define CSR_MULTI_DPF0_ADDR 0x0230 17256090b12SIyappan Subramanian #define RXBUF_PAUSE_THRESH 0x0534 17356090b12SIyappan Subramanian #define RXBUF_PAUSE_OFF_THRESH 0x0540 17456090b12SIyappan Subramanian #define DEF_PAUSE_THRES 0x7d 17556090b12SIyappan Subramanian #define DEF_PAUSE_OFF_THRES 0x6d 17656090b12SIyappan Subramanian #define DEF_QUANTA 0x8000 17756090b12SIyappan Subramanian #define NORM_PAUSE_OPCODE 0x0001 178bb64fa09SIyappan Subramanian #define PAUSE_XON_EN BIT(30) 179bb64fa09SIyappan Subramanian #define MULTI_DPF_AUTOCTRL BIT(28) 180d6d48969SIyappan Subramanian #define CFG_CLE_NXTFPSEL0(val) (((val) << 20) & GENMASK(23, 20)) 181e6ad7673SIyappan Subramanian #define ICM_CONFIG0_REG_0_ADDR 0x0400 182e6ad7673SIyappan Subramanian #define ICM_CONFIG2_REG_0_ADDR 0x0410 183ca6d550cSIyappan Subramanian #define ECM_CONFIG0_REG_0_ADDR 0x0500 184ca6d550cSIyappan Subramanian #define ECM_CONFIG0_REG_1_ADDR 0x0504 185ca6d550cSIyappan Subramanian #define ICM_ECM_DROP_COUNT_REG0_ADDR 0x0508 186ca6d550cSIyappan Subramanian #define ICM_ECM_DROP_COUNT_REG1_ADDR 0x050c 187e6ad7673SIyappan Subramanian #define RX_DV_GATE_REG_0_ADDR 0x05fc 188e6ad7673SIyappan Subramanian #define TX_DV_GATE_EN0 BIT(2) 189e6ad7673SIyappan Subramanian #define RX_DV_GATE_EN0 BIT(1) 190e6ad7673SIyappan Subramanian #define RESUME_RX0 BIT(0) 191cb11c062SIyappan Subramanian #define ENET_CFGSSQMIFPRESET_ADDR 0x14 192cb11c062SIyappan Subramanian #define ENET_CFGSSQMIWQRESET_ADDR 0x1c 193e6ad7673SIyappan Subramanian #define ENET_CFGSSQMIWQASSOC_ADDR 0xe0 194e6ad7673SIyappan Subramanian #define ENET_CFGSSQMIFPQASSOC_ADDR 0xdc 195e6ad7673SIyappan Subramanian #define ENET_CFGSSQMIQMLITEFPQASSOC_ADDR 0xf0 196e6ad7673SIyappan Subramanian #define ENET_CFGSSQMIQMLITEWQASSOC_ADDR 0xf4 197e6ad7673SIyappan Subramanian #define ENET_CFG_MEM_RAM_SHUTDOWN_ADDR 0x70 198e6ad7673SIyappan Subramanian #define ENET_BLOCK_MEM_RDY_ADDR 0x74 199e6ad7673SIyappan Subramanian #define MAC_CONFIG_1_ADDR 0x00 200e6ad7673SIyappan Subramanian #define MAC_CONFIG_2_ADDR 0x04 201e6ad7673SIyappan Subramanian #define MAX_FRAME_LEN_ADDR 0x10 202e6ad7673SIyappan Subramanian #define INTERFACE_CONTROL_ADDR 0x38 203e6ad7673SIyappan Subramanian #define STATION_ADDR0_ADDR 0x40 204e6ad7673SIyappan Subramanian #define STATION_ADDR1_ADDR 0x44 205e6ad7673SIyappan Subramanian #define PHY_ADDR_SET(dst, val) xgene_set_bits(dst, val, 8, 5) 206e6ad7673SIyappan Subramanian #define REG_ADDR_SET(dst, val) xgene_set_bits(dst, val, 0, 5) 207e6ad7673SIyappan Subramanian #define ENET_INTERFACE_MODE2_SET(dst, val) xgene_set_bits(dst, val, 8, 2) 208e6ad7673SIyappan Subramanian #define MGMT_CLOCK_SEL_SET(dst, val) xgene_set_bits(dst, val, 0, 3) 209e6ad7673SIyappan Subramanian #define SOFT_RESET1 BIT(31) 210e6ad7673SIyappan Subramanian #define TX_EN BIT(0) 211e6ad7673SIyappan Subramanian #define RX_EN BIT(2) 212bb64fa09SIyappan Subramanian #define TX_FLOW_EN BIT(4) 213bb64fa09SIyappan Subramanian #define RX_FLOW_EN BIT(5) 214e6ad7673SIyappan Subramanian #define ENET_LHD_MODE BIT(25) 215e6ad7673SIyappan Subramanian #define ENET_GHD_MODE BIT(26) 216e6ad7673SIyappan Subramanian #define FULL_DUPLEX2 BIT(0) 217761d4be5SIyappan Subramanian #define PAD_CRC BIT(2) 2184902a922SIyappan Subramanian #define LENGTH_CHK BIT(4) 219e6ad7673SIyappan Subramanian 2202d07d8e4SQuan Nguyen #define TR64_ADDR 0x20 2212d07d8e4SQuan Nguyen #define TR127_ADDR 0x21 2222d07d8e4SQuan Nguyen #define TR255_ADDR 0x22 2232d07d8e4SQuan Nguyen #define TR511_ADDR 0x23 2242d07d8e4SQuan Nguyen #define TR1K_ADDR 0x24 2252d07d8e4SQuan Nguyen #define TRMAX_ADDR 0x25 2262d07d8e4SQuan Nguyen #define TRMGV_ADDR 0x26 2272d07d8e4SQuan Nguyen 2282d07d8e4SQuan Nguyen #define RFCS_ADDR 0x29 2292d07d8e4SQuan Nguyen #define RMCA_ADDR 0x2a 2302d07d8e4SQuan Nguyen #define RBCA_ADDR 0x2b 2312d07d8e4SQuan Nguyen #define RXCF_ADDR 0x2c 2322d07d8e4SQuan Nguyen #define RXPF_ADDR 0x2d 2332d07d8e4SQuan Nguyen #define RXUO_ADDR 0x2e 2342d07d8e4SQuan Nguyen #define RALN_ADDR 0x2f 2352d07d8e4SQuan Nguyen #define RFLR_ADDR 0x30 2362d07d8e4SQuan Nguyen #define RCDE_ADDR 0x31 2372d07d8e4SQuan Nguyen #define RCSE_ADDR 0x32 2382d07d8e4SQuan Nguyen #define RUND_ADDR 0x33 2392d07d8e4SQuan Nguyen #define ROVR_ADDR 0x34 2402d07d8e4SQuan Nguyen #define RFRG_ADDR 0x35 2412d07d8e4SQuan Nguyen #define RJBR_ADDR 0x36 2422d07d8e4SQuan Nguyen #define RDRP_ADDR 0x37 2432d07d8e4SQuan Nguyen 2442d07d8e4SQuan Nguyen #define TMCA_ADDR 0x3a 2452d07d8e4SQuan Nguyen #define TBCA_ADDR 0x3b 2462d07d8e4SQuan Nguyen #define TXPF_ADDR 0x3c 2472d07d8e4SQuan Nguyen #define TDFR_ADDR 0x3d 2482d07d8e4SQuan Nguyen #define TEDF_ADDR 0x3e 2492d07d8e4SQuan Nguyen #define TSCL_ADDR 0x3f 2502d07d8e4SQuan Nguyen #define TMCL_ADDR 0x40 2512d07d8e4SQuan Nguyen #define TLCL_ADDR 0x41 2522d07d8e4SQuan Nguyen #define TXCL_ADDR 0x42 2532d07d8e4SQuan Nguyen #define TNCL_ADDR 0x43 2542d07d8e4SQuan Nguyen #define TPFH_ADDR 0x44 2552d07d8e4SQuan Nguyen #define TDRP_ADDR 0x45 2562d07d8e4SQuan Nguyen #define TJBR_ADDR 0x46 2572d07d8e4SQuan Nguyen #define TFCS_ADDR 0x47 2582d07d8e4SQuan Nguyen #define TXCF_ADDR 0x48 2592d07d8e4SQuan Nguyen #define TOVR_ADDR 0x49 2602d07d8e4SQuan Nguyen #define TUND_ADDR 0x4a 2612d07d8e4SQuan Nguyen #define TFRG_ADDR 0x4b 262ca6d550cSIyappan Subramanian #define DUMP_ADDR 0x27 263ca6d550cSIyappan Subramanian 264ca6d550cSIyappan Subramanian #define ECM_DROP_COUNT(src) xgene_get_bits(src, 0, 15) 265ca6d550cSIyappan Subramanian #define ICM_DROP_COUNT(src) xgene_get_bits(src, 16, 31) 2662d07d8e4SQuan Nguyen 267e6ad7673SIyappan Subramanian #define TSO_IPPROTO_TCP 1 268e6ad7673SIyappan Subramanian 269e6ad7673SIyappan Subramanian #define USERINFO_POS 0 270e6ad7673SIyappan Subramanian #define USERINFO_LEN 32 271e6ad7673SIyappan Subramanian #define FPQNUM_POS 32 272e6ad7673SIyappan Subramanian #define FPQNUM_LEN 12 2733bb502f8SIyappan Subramanian #define ELERR_POS 46 2743bb502f8SIyappan Subramanian #define ELERR_LEN 2 2759b00eb49SIyappan Subramanian #define NV_POS 50 2769b00eb49SIyappan Subramanian #define NV_LEN 1 2779b00eb49SIyappan Subramanian #define LL_POS 51 2789b00eb49SIyappan Subramanian #define LL_LEN 1 279e6ad7673SIyappan Subramanian #define LERR_POS 60 280e6ad7673SIyappan Subramanian #define LERR_LEN 3 281e6ad7673SIyappan Subramanian #define STASH_POS 52 282e6ad7673SIyappan Subramanian #define STASH_LEN 2 283e6ad7673SIyappan Subramanian #define BUFDATALEN_POS 48 2849b00eb49SIyappan Subramanian #define BUFDATALEN_LEN 15 285e6ad7673SIyappan Subramanian #define DATAADDR_POS 0 286e6ad7673SIyappan Subramanian #define DATAADDR_LEN 42 287e6ad7673SIyappan Subramanian #define COHERENT_POS 63 288e6ad7673SIyappan Subramanian #define HENQNUM_POS 48 289e6ad7673SIyappan Subramanian #define HENQNUM_LEN 12 290e6ad7673SIyappan Subramanian #define TYPESEL_POS 44 291e6ad7673SIyappan Subramanian #define TYPESEL_LEN 4 292e6ad7673SIyappan Subramanian #define ETHHDR_POS 12 293e6ad7673SIyappan Subramanian #define ETHHDR_LEN 8 294e6ad7673SIyappan Subramanian #define IC_POS 35 /* Insert CRC */ 295e6ad7673SIyappan Subramanian #define TCPHDR_POS 0 296e6ad7673SIyappan Subramanian #define TCPHDR_LEN 6 297e6ad7673SIyappan Subramanian #define IPHDR_POS 6 298e6ad7673SIyappan Subramanian #define IPHDR_LEN 6 299e3978673SIyappan Subramanian #define MSS_POS 20 300e3978673SIyappan Subramanian #define MSS_LEN 2 301e6ad7673SIyappan Subramanian #define EC_POS 22 /* Enable checksum */ 302e6ad7673SIyappan Subramanian #define EC_LEN 1 3039b00eb49SIyappan Subramanian #define ET_POS 23 /* Enable TSO */ 304e6ad7673SIyappan Subramanian #define IS_POS 24 /* IP protocol select */ 305e6ad7673SIyappan Subramanian #define IS_LEN 1 306e6ad7673SIyappan Subramanian #define TYPE_ETH_WORK_MESSAGE_POS 44 3079b00eb49SIyappan Subramanian #define LL_BYTES_MSB_POS 56 3089b00eb49SIyappan Subramanian #define LL_BYTES_MSB_LEN 8 3099b00eb49SIyappan Subramanian #define LL_BYTES_LSB_POS 48 3109b00eb49SIyappan Subramanian #define LL_BYTES_LSB_LEN 12 3119b00eb49SIyappan Subramanian #define LL_LEN_POS 48 3129b00eb49SIyappan Subramanian #define LL_LEN_LEN 8 3139b00eb49SIyappan Subramanian #define DATALEN_MASK GENMASK(11, 0) 3149b00eb49SIyappan Subramanian 3159b00eb49SIyappan Subramanian #define LAST_BUFFER (0x7800ULL << BUFDATALEN_POS) 316e6ad7673SIyappan Subramanian 317e3978673SIyappan Subramanian #define TSO_MSS0_POS 0 318e3978673SIyappan Subramanian #define TSO_MSS0_LEN 14 319e3978673SIyappan Subramanian #define TSO_MSS1_POS 16 320e3978673SIyappan Subramanian #define TSO_MSS1_LEN 14 321e3978673SIyappan Subramanian 322e6ad7673SIyappan Subramanian struct xgene_enet_raw_desc { 323e6ad7673SIyappan Subramanian __le64 m0; 324e6ad7673SIyappan Subramanian __le64 m1; 325e6ad7673SIyappan Subramanian __le64 m2; 326e6ad7673SIyappan Subramanian __le64 m3; 327e6ad7673SIyappan Subramanian }; 328e6ad7673SIyappan Subramanian 329e6ad7673SIyappan Subramanian struct xgene_enet_raw_desc16 { 330e6ad7673SIyappan Subramanian __le64 m0; 331e6ad7673SIyappan Subramanian __le64 m1; 332e6ad7673SIyappan Subramanian }; 333e6ad7673SIyappan Subramanian 334e6ad7673SIyappan Subramanian static inline void xgene_enet_mark_desc_slot_empty(void *desc_slot_ptr) 335e6ad7673SIyappan Subramanian { 336e6ad7673SIyappan Subramanian __le64 *desc_slot = desc_slot_ptr; 337e6ad7673SIyappan Subramanian 338e6ad7673SIyappan Subramanian desc_slot[EMPTY_SLOT_INDEX] = cpu_to_le64(EMPTY_SLOT); 339e6ad7673SIyappan Subramanian } 340e6ad7673SIyappan Subramanian 341e6ad7673SIyappan Subramanian static inline bool xgene_enet_is_desc_slot_empty(void *desc_slot_ptr) 342e6ad7673SIyappan Subramanian { 343e6ad7673SIyappan Subramanian __le64 *desc_slot = desc_slot_ptr; 344e6ad7673SIyappan Subramanian 345e6ad7673SIyappan Subramanian return (desc_slot[EMPTY_SLOT_INDEX] == cpu_to_le64(EMPTY_SLOT)); 346e6ad7673SIyappan Subramanian } 347e6ad7673SIyappan Subramanian 348e6ad7673SIyappan Subramanian enum xgene_enet_ring_cfgsize { 349e6ad7673SIyappan Subramanian RING_CFGSIZE_512B, 350e6ad7673SIyappan Subramanian RING_CFGSIZE_2KB, 351e6ad7673SIyappan Subramanian RING_CFGSIZE_16KB, 352e6ad7673SIyappan Subramanian RING_CFGSIZE_64KB, 353e6ad7673SIyappan Subramanian RING_CFGSIZE_512KB, 354e6ad7673SIyappan Subramanian RING_CFGSIZE_INVALID 355e6ad7673SIyappan Subramanian }; 356e6ad7673SIyappan Subramanian 357e6ad7673SIyappan Subramanian enum xgene_enet_ring_type { 358e6ad7673SIyappan Subramanian RING_DISABLED, 359e6ad7673SIyappan Subramanian RING_REGULAR, 360e6ad7673SIyappan Subramanian RING_BUFPOOL 361e6ad7673SIyappan Subramanian }; 362e6ad7673SIyappan Subramanian 363e6ad7673SIyappan Subramanian enum xgene_ring_owner { 364e6ad7673SIyappan Subramanian RING_OWNER_ETH0, 365ed9b7da0SIyappan Subramanian RING_OWNER_ETH1, 366e6ad7673SIyappan Subramanian RING_OWNER_CPU = 15, 367e6ad7673SIyappan Subramanian RING_OWNER_INVALID 368e6ad7673SIyappan Subramanian }; 369e6ad7673SIyappan Subramanian 370e6ad7673SIyappan Subramanian enum xgene_enet_ring_bufnum { 371e6ad7673SIyappan Subramanian RING_BUFNUM_REGULAR = 0x0, 372e6ad7673SIyappan Subramanian RING_BUFNUM_BUFPOOL = 0x20, 373e6ad7673SIyappan Subramanian RING_BUFNUM_INVALID 374e6ad7673SIyappan Subramanian }; 375e6ad7673SIyappan Subramanian 376e6ad7673SIyappan Subramanian enum xgene_enet_err_code { 377e6ad7673SIyappan Subramanian HBF_READ_DATA = 3, 378e6ad7673SIyappan Subramanian HBF_LL_READ = 4, 379e6ad7673SIyappan Subramanian BAD_WORK_MSG = 6, 380e6ad7673SIyappan Subramanian BUFPOOL_TIMEOUT = 15, 381e6ad7673SIyappan Subramanian INGRESS_CRC = 16, 382e6ad7673SIyappan Subramanian INGRESS_CHECKSUM = 17, 383e6ad7673SIyappan Subramanian INGRESS_TRUNC_FRAME = 18, 384e6ad7673SIyappan Subramanian INGRESS_PKT_LEN = 19, 385e6ad7673SIyappan Subramanian INGRESS_PKT_UNDER = 20, 386e6ad7673SIyappan Subramanian INGRESS_FIFO_OVERRUN = 21, 387e6ad7673SIyappan Subramanian INGRESS_CHECKSUM_COMPUTE = 26, 388e6ad7673SIyappan Subramanian ERR_CODE_INVALID 389e6ad7673SIyappan Subramanian }; 390e6ad7673SIyappan Subramanian 391e6ad7673SIyappan Subramanian static inline enum xgene_ring_owner xgene_enet_ring_owner(u16 id) 392e6ad7673SIyappan Subramanian { 393e6ad7673SIyappan Subramanian return (id & RING_OWNER_MASK) >> 6; 394e6ad7673SIyappan Subramanian } 395e6ad7673SIyappan Subramanian 396e6ad7673SIyappan Subramanian static inline u8 xgene_enet_ring_bufnum(u16 id) 397e6ad7673SIyappan Subramanian { 398e6ad7673SIyappan Subramanian return id & RING_BUFNUM_MASK; 399e6ad7673SIyappan Subramanian } 400e6ad7673SIyappan Subramanian 401e6ad7673SIyappan Subramanian static inline bool xgene_enet_is_bufpool(u16 id) 402e6ad7673SIyappan Subramanian { 403e6ad7673SIyappan Subramanian return ((id & RING_BUFNUM_MASK) >= 0x20) ? true : false; 404e6ad7673SIyappan Subramanian } 405e6ad7673SIyappan Subramanian 4062c839337SIyappan Subramanian static inline u8 xgene_enet_get_fpsel(u16 id) 4072c839337SIyappan Subramanian { 4082c839337SIyappan Subramanian if (xgene_enet_is_bufpool(id)) 4092c839337SIyappan Subramanian return xgene_enet_ring_bufnum(id) - RING_BUFNUM_BUFPOOL; 4102c839337SIyappan Subramanian 4112c839337SIyappan Subramanian return 0; 4122c839337SIyappan Subramanian } 4132c839337SIyappan Subramanian 414e6ad7673SIyappan Subramanian static inline u16 xgene_enet_get_numslots(u16 id, u32 size) 415e6ad7673SIyappan Subramanian { 416e6ad7673SIyappan Subramanian bool is_bufpool = xgene_enet_is_bufpool(id); 417e6ad7673SIyappan Subramanian 418e6ad7673SIyappan Subramanian return (is_bufpool) ? size / BUFPOOL_DESC_SIZE : 419e6ad7673SIyappan Subramanian size / WORK_DESC_SIZE; 420e6ad7673SIyappan Subramanian } 421e6ad7673SIyappan Subramanian 422e6ad7673SIyappan Subramanian void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring, 423e6ad7673SIyappan Subramanian enum xgene_enet_err_code status); 424e6ad7673SIyappan Subramanian int xgene_enet_mdio_config(struct xgene_enet_pdata *pdata); 425e6ad7673SIyappan Subramanian void xgene_enet_mdio_remove(struct xgene_enet_pdata *pdata); 426c3f4465dSIyappan Subramanian bool xgene_ring_mgr_init(struct xgene_enet_pdata *p); 4278089a96fSIyappan Subramanian int xgene_enet_phy_connect(struct net_device *ndev); 4288089a96fSIyappan Subramanian void xgene_enet_phy_disconnect(struct xgene_enet_pdata *pdata); 429ae1aed95SIyappan Subramanian u32 xgene_enet_rd_mac(struct xgene_enet_pdata *pdata, u32 rd_addr); 430ae1aed95SIyappan Subramanian void xgene_enet_wr_mac(struct xgene_enet_pdata *pdata, u32 wr_addr, 431ae1aed95SIyappan Subramanian u32 wr_data); 4322d07d8e4SQuan Nguyen u32 xgene_enet_rd_stat(struct xgene_enet_pdata *pdata, u32 rd_addr); 433e6ad7673SIyappan Subramanian 4343cdb7309SJulia Lawall extern const struct xgene_mac_ops xgene_gmac_ops; 4353cdb7309SJulia Lawall extern const struct xgene_port_ops xgene_gport_ops; 43681cefb81SIyappan Subramanian extern struct xgene_ring_ops xgene_ring1_ops; 437d0eb7458SIyappan Subramanian 438e6ad7673SIyappan Subramanian #endif /* __XGENE_ENET_HW_H__ */ 439