| /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ | |
| /* | |
| * rtase is the Linux device driver released for Realtek Automotive Switch | |
| * controllers with PCI-Express interface. | |
| * | |
| * Copyright(c) 2024 Realtek Semiconductor Corp. | |
| */ | |
| #ifndef RTASE_H | |
| #define RTASE_H | |
| #define RTASE_HW_VER_MASK 0x7C800000 | |
| #define RTASE_HW_VER_906X_7XA 0x00800000 | |
| #define RTASE_HW_VER_906X_7XC 0x04000000 | |
| #define RTASE_HW_VER_907XD_V1 0x04800000 | |
| #define RTASE_HW_VER_907XD_VA 0x08000000 | |
| #define RTASE_RX_DMA_BURST_256 4 | |
| #define RTASE_TX_DMA_BURST_UNLIMITED 7 | |
| #define RTASE_RX_BUF_SIZE (PAGE_SIZE - \ | |
| SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) | |
| #define RTASE_MAX_JUMBO_SIZE (RTASE_RX_BUF_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN) | |
| /* 3 means InterFrameGap = the shortest one */ | |
| #define RTASE_INTERFRAMEGAP 0x03 | |
| #define RTASE_REGS_SIZE 256 | |
| #define RTASE_PCI_REGS_SIZE 0x100 | |
| #define RTASE_MULTICAST_FILTER_MASK GENMASK(30, 26) | |
| #define RTASE_VLAN_FILTER_ENTRY_NUM 32 | |
| #define RTASE_NUM_TX_QUEUE 8 | |
| #define RTASE_NUM_RX_QUEUE 4 | |
| #define RTASE_TXQ_CTRL 1 | |
| #define RTASE_FUNC_TXQ_NUM 1 | |
| #define RTASE_FUNC_RXQ_NUM 1 | |
| #define RTASE_INTERRUPT_NUM 1 | |
| #define RTASE_MITI_TIME_COUNT_MASK GENMASK(3, 0) | |
| #define RTASE_MITI_TIME_UNIT_MASK GENMASK(7, 4) | |
| #define RTASE_MITI_DEFAULT_TIME 128 | |
| #define RTASE_MITI_MAX_TIME 491520 | |
| #define RTASE_MITI_PKT_NUM_COUNT_MASK GENMASK(11, 8) | |
| #define RTASE_MITI_PKT_NUM_UNIT_MASK GENMASK(13, 12) | |
| #define RTASE_MITI_DEFAULT_PKT_NUM 64 | |
| #define RTASE_MITI_MAX_PKT_NUM_IDX 3 | |
| #define RTASE_MITI_MAX_PKT_NUM_UNIT 16 | |
| #define RTASE_MITI_MAX_PKT_NUM 240 | |
| #define RTASE_MITI_COUNT_BIT_NUM 4 | |
| #define RTASE_NUM_MSIX 4 | |
| #define RTASE_DWORD_MOD 16 | |
| /*****************************************************************************/ | |
| enum rtase_registers { | |
| RTASE_MAC0 = 0x0000, | |
| RTASE_MAC4 = 0x0004, | |
| RTASE_MAR0 = 0x0008, | |
| RTASE_MAR1 = 0x000C, | |
| RTASE_DTCCR0 = 0x0010, | |
| RTASE_DTCCR4 = 0x0014, | |
| #define RTASE_COUNTER_RESET BIT(0) | |
| #define RTASE_COUNTER_DUMP BIT(3) | |
| RTASE_FCR = 0x0018, | |
| #define RTASE_FCR_RXQ_MASK GENMASK(5, 4) | |
| RTASE_LBK_CTRL = 0x001A, | |
| #define RTASE_LBK_ATLD BIT(1) | |
| #define RTASE_LBK_CLR BIT(0) | |
| RTASE_TX_DESC_ADDR0 = 0x0020, | |
| RTASE_TX_DESC_ADDR4 = 0x0024, | |
| RTASE_TX_DESC_COMMAND = 0x0028, | |
| #define RTASE_TX_DESC_CMD_CS BIT(15) | |
| #define RTASE_TX_DESC_CMD_WE BIT(14) | |
| RTASE_BOOT_CTL = 0x6004, | |
| RTASE_CLKSW_SET = 0x6018, | |
| RTASE_CHIP_CMD = 0x0037, | |
| #define RTASE_STOP_REQ BIT(7) | |
| #define RTASE_STOP_REQ_DONE BIT(6) | |
| #define RTASE_RE BIT(3) | |
| #define RTASE_TE BIT(2) | |
| RTASE_IMR0 = 0x0038, | |
| RTASE_ISR0 = 0x003C, | |
| #define RTASE_TOK7 BIT(30) | |
| #define RTASE_TOK6 BIT(28) | |
| #define RTASE_TOK5 BIT(26) | |
| #define RTASE_TOK4 BIT(24) | |
| #define RTASE_FOVW BIT(6) | |
| #define RTASE_RDU BIT(4) | |
| #define RTASE_TOK BIT(2) | |
| #define RTASE_ROK BIT(0) | |
| RTASE_IMR1 = 0x0800, | |
| RTASE_ISR1 = 0x0802, | |
| #define RTASE_Q_TOK BIT(4) | |
| #define RTASE_Q_RDU BIT(1) | |
| #define RTASE_Q_ROK BIT(0) | |
| RTASE_EPHY_ISR = 0x6014, | |
| RTASE_EPHY_IMR = 0x6016, | |
| RTASE_TX_CONFIG_0 = 0x0040, | |
| #define RTASE_TX_INTER_FRAME_GAP_MASK GENMASK(25, 24) | |
| /* DMA burst value (0-7) is shift this many bits */ | |
| #define RTASE_TX_DMA_MASK GENMASK(10, 8) | |
| RTASE_RX_CONFIG_0 = 0x0044, | |
| #define RTASE_RX_SINGLE_FETCH BIT(14) | |
| #define RTASE_RX_SINGLE_TAG BIT(13) | |
| #define RTASE_RX_MX_DMA_MASK GENMASK(10, 8) | |
| #define RTASE_ACPT_FLOW BIT(7) | |
| #define RTASE_ACCEPT_ERR BIT(5) | |
| #define RTASE_ACCEPT_RUNT BIT(4) | |
| #define RTASE_ACCEPT_BROADCAST BIT(3) | |
| #define RTASE_ACCEPT_MULTICAST BIT(2) | |
| #define RTASE_ACCEPT_MYPHYS BIT(1) | |
| #define RTASE_ACCEPT_ALLPHYS BIT(0) | |
| #define RTASE_ACCEPT_MASK (RTASE_ACPT_FLOW | RTASE_ACCEPT_ERR | \ | |
| RTASE_ACCEPT_RUNT | RTASE_ACCEPT_BROADCAST | \ | |
| RTASE_ACCEPT_MULTICAST | RTASE_ACCEPT_MYPHYS | \ | |
| RTASE_ACCEPT_ALLPHYS) | |
| RTASE_RX_CONFIG_1 = 0x0046, | |
| #define RTASE_RX_MAX_FETCH_DESC_MASK GENMASK(15, 11) | |
| #define RTASE_RX_NEW_DESC_FORMAT_EN BIT(8) | |
| #define RTASE_OUTER_VLAN_DETAG_EN BIT(7) | |
| #define RTASE_INNER_VLAN_DETAG_EN BIT(6) | |
| #define RTASE_PCIE_NEW_FLOW BIT(2) | |
| #define RTASE_PCIE_RELOAD_EN BIT(0) | |
| RTASE_EEM = 0x0050, | |
| #define RTASE_EEM_UNLOCK 0xC0 | |
| RTASE_TDFNR = 0x0057, | |
| RTASE_TPPOLL = 0x0090, | |
| RTASE_PDR = 0x00B0, | |
| RTASE_FIFOR = 0x00D3, | |
| #define RTASE_TX_FIFO_EMPTY BIT(5) | |
| #define RTASE_RX_FIFO_EMPTY BIT(4) | |
| RTASE_RMS = 0x00DA, | |
| RTASE_CPLUS_CMD = 0x00E0, | |
| #define RTASE_FORCE_RXFLOW_EN BIT(11) | |
| #define RTASE_FORCE_TXFLOW_EN BIT(10) | |
| #define RTASE_RX_CHKSUM BIT(5) | |
| RTASE_GPHY_STD_00 = 0x6024, | |
| #define RTASE_RXFLOW_EN BIT(7) | |
| #define RTASE_TXFLOW_EN BIT(6) | |
| RTASE_Q0_RX_DESC_ADDR0 = 0x00E4, | |
| RTASE_Q0_RX_DESC_ADDR4 = 0x00E8, | |
| RTASE_Q1_RX_DESC_ADDR0 = 0x4000, | |
| RTASE_Q1_RX_DESC_ADDR4 = 0x4004, | |
| RTASE_MTPS = 0x00EC, | |
| #define RTASE_TAG_NUM_SEL_MASK GENMASK(10, 8) | |
| RTASE_MISC = 0x00F2, | |
| #define RTASE_RX_DV_GATE_EN BIT(3) | |
| RTASE_TFUN_CTRL = 0x0400, | |
| #define RTASE_TX_NEW_DESC_FORMAT_EN BIT(0) | |
| RTASE_TX_CONFIG_1 = 0x203E, | |
| #define RTASE_TC_MODE_MASK GENMASK(11, 10) | |
| RTASE_TOKSEL = 0x2046, | |
| RTASE_TXQCRDT_0 = 0x2500, | |
| RTASE_RFIFONFULL = 0x4406, | |
| RTASE_INT_MITI_TX = 0x0A00, | |
| RTASE_INT_MITI_RX = 0x0A80, | |
| RTASE_VLAN_ENTRY_0 = 0xAC80, | |
| }; | |
| enum rtase_desc_status_bit { | |
| RTASE_DESC_OWN = BIT(31), /* Descriptor is owned by NIC */ | |
| RTASE_RING_END = BIT(30), /* End of descriptor ring */ | |
| }; | |
| enum rtase_sw_flag_content { | |
| RTASE_SWF_MSI_ENABLED = BIT(1), | |
| RTASE_SWF_MSIX_ENABLED = BIT(2), | |
| }; | |
| enum rtase_parse_result { | |
| RTASE_PARSE_OK, | |
| RTASE_PARSE_SKIP, | |
| RTASE_PARSE_DROP, | |
| }; | |
| #define RSVD_MASK 0x3FFFC000 | |
| struct rtase_tx_desc { | |
| __le32 opts1; | |
| __le32 opts2; | |
| __le64 addr; | |
| __le32 opts3; | |
| __le32 reserved1; | |
| __le32 reserved2; | |
| __le32 reserved3; | |
| } __packed; | |
| /*------ offset 0 of tx descriptor ------*/ | |
| #define RTASE_TX_FIRST_FRAG BIT(29) /* Tx First segment of a packet */ | |
| #define RTASE_TX_LAST_FRAG BIT(28) /* Tx Final segment of a packet */ | |
| #define RTASE_GIANT_SEND_V4 BIT(26) /* TCP Giant Send Offload V4 (GSOv4) */ | |
| #define RTASE_GIANT_SEND_V6 BIT(25) /* TCP Giant Send Offload V6 (GSOv6) */ | |
| #define RTASE_TX_VLAN_TAG BIT(17) /* Add VLAN tag */ | |
| /*------ offset 4 of tx descriptor ------*/ | |
| #define RTASE_TX_UDPCS_C BIT(31) /* Calculate UDP/IP checksum */ | |
| #define RTASE_TX_TCPCS_C BIT(30) /* Calculate TCP/IP checksum */ | |
| #define RTASE_TX_IPCS_C BIT(29) /* Calculate IP checksum */ | |
| #define RTASE_TX_IPV6F_C BIT(28) /* Indicate it is an IPv6 packet */ | |
| union rtase_rx_desc { | |
| struct { | |
| __le64 header_buf_addr; | |
| __le32 reserved1; | |
| __le32 opts_header_len; | |
| __le64 addr; | |
| __le32 reserved2; | |
| __le32 opts1; | |
| } __packed desc_cmd; | |
| struct { | |
| __le32 reserved1; | |
| __le32 reserved2; | |
| __le32 rss; | |
| __le32 opts4; | |
| __le32 reserved3; | |
| __le32 opts3; | |
| __le32 opts2; | |
| __le32 opts1; | |
| } __packed desc_status; | |
| } __packed; | |
| /*------ offset 28 of rx descriptor ------*/ | |
| #define RTASE_RX_FIRST_FRAG BIT(25) /* Rx First segment of a packet */ | |
| #define RTASE_RX_LAST_FRAG BIT(24) /* Rx Final segment of a packet */ | |
| #define RTASE_RX_RES BIT(20) | |
| #define RTASE_RX_RUNT BIT(19) | |
| #define RTASE_RX_RWT BIT(18) | |
| #define RTASE_RX_CRC BIT(17) | |
| #define RTASE_RX_V6F BIT(31) | |
| #define RTASE_RX_V4F BIT(30) | |
| #define RTASE_RX_UDPT BIT(29) | |
| #define RTASE_RX_TCPT BIT(28) | |
| #define RTASE_RX_IPF BIT(26) /* IP checksum failed */ | |
| #define RTASE_RX_UDPF BIT(25) /* UDP/IP checksum failed */ | |
| #define RTASE_RX_TCPF BIT(24) /* TCP/IP checksum failed */ | |
| #define RTASE_RX_VLAN_TAG BIT(16) /* VLAN tag available */ | |
| #define RTASE_NUM_DESC 1024 | |
| #define RTASE_TX_BUDGET_DEFAULT 256 | |
| #define RTASE_TX_RING_DESC_SIZE (RTASE_NUM_DESC * sizeof(struct rtase_tx_desc)) | |
| #define RTASE_RX_RING_DESC_SIZE (RTASE_NUM_DESC * sizeof(union rtase_rx_desc)) | |
| #define RTASE_TX_STOP_THRS (MAX_SKB_FRAGS + 1) | |
| #define RTASE_TX_START_THRS (2 * RTASE_TX_STOP_THRS) | |
| #define RTASE_VLAN_TAG_MASK GENMASK(15, 0) | |
| #define RTASE_RX_PKT_SIZE_MASK GENMASK(13, 0) | |
| /* txqos hardware definitions */ | |
| #define RTASE_1T_CLOCK 64 | |
| #define RTASE_1T_POWER 10000000 | |
| #define RTASE_IDLESLOPE_INT_SHIFT 25 | |
| #define RTASE_IDLESLOPE_INT_MASK GENMASK(31, 25) | |
| #define RTASE_IVEC_NAME_SIZE (IFNAMSIZ + 10) | |
| struct rtase_int_vector { | |
| struct rtase_private *tp; | |
| unsigned int irq; | |
| char name[RTASE_IVEC_NAME_SIZE]; | |
| u16 index; | |
| u16 imr_addr; | |
| u16 isr_addr; | |
| u32 imr; | |
| struct list_head ring_list; | |
| struct napi_struct napi; | |
| int (*poll)(struct napi_struct *napi, int budget); | |
| }; | |
| struct rtase_ring { | |
| struct rtase_int_vector *ivec; | |
| void *desc; | |
| dma_addr_t phy_addr; | |
| u32 cur_idx; | |
| u32 dirty_idx; | |
| u16 index; | |
| u8 type; | |
| struct sk_buff *skbuff[RTASE_NUM_DESC]; | |
| void *data_buf[RTASE_NUM_DESC]; | |
| union { | |
| u32 len[RTASE_NUM_DESC]; | |
| dma_addr_t data_phy_addr[RTASE_NUM_DESC]; | |
| } mis; | |
| struct list_head ring_entry; | |
| int (*ring_handler)(struct rtase_ring *ring, int budget); | |
| u64 alloc_fail; | |
| }; | |
| struct rtase_txqos { | |
| int hicredit; | |
| int locredit; | |
| int idleslope; | |
| int sendslope; | |
| }; | |
| struct rtase_stats { | |
| u64 tx_dropped; | |
| u64 rx_dropped; | |
| u64 multicast; | |
| u64 rx_errors; | |
| u64 rx_length_errors; | |
| u64 rx_crc_errors; | |
| }; | |
| struct rtase_private { | |
| void __iomem *mmio_addr; | |
| u32 sw_flag; | |
| struct pci_dev *pdev; | |
| struct net_device *dev; | |
| u32 rx_buf_sz; | |
| struct page_pool *page_pool; | |
| struct rtase_ring tx_ring[RTASE_NUM_TX_QUEUE]; | |
| struct rtase_txqos tx_qos[RTASE_NUM_TX_QUEUE]; | |
| struct rtase_ring rx_ring[RTASE_NUM_RX_QUEUE]; | |
| struct rtase_counters *tally_vaddr; | |
| dma_addr_t tally_paddr; | |
| u32 vlan_filter_ctrl; | |
| u16 vlan_filter_vid[RTASE_VLAN_FILTER_ENTRY_NUM]; | |
| struct msix_entry msix_entry[RTASE_NUM_MSIX]; | |
| struct rtase_int_vector int_vector[RTASE_NUM_MSIX]; | |
| struct rtase_stats stats; | |
| u16 tx_queue_ctrl; | |
| u16 func_tx_queue_num; | |
| u16 func_rx_queue_num; | |
| u16 int_nums; | |
| u16 tx_int_mit; | |
| u16 rx_int_mit; | |
| u32 hw_ver; | |
| }; | |
| #define RTASE_LSO_64K 64000 | |
| #define RTASE_NIC_MAX_PHYS_BUF_COUNT_LSO2 (16 * 4) | |
| #define RTASE_TCPHO_MASK GENMASK(24, 18) | |
| #define RTASE_MSS_MASK GENMASK(28, 18) | |
| #define RTASE_MIN_PAD_LEN 47 | |
| #endif /* RTASE_H */ |