1403f69bbSGerhard Engleder /* SPDX-License-Identifier: GPL-2.0 */ 2403f69bbSGerhard Engleder /* Copyright (C) 2021 Gerhard Engleder <gerhard@engleder-embedded.com> */ 3403f69bbSGerhard Engleder 4403f69bbSGerhard Engleder /* Hardware definition of TSNEP and EtherCAT MAC device */ 5403f69bbSGerhard Engleder 6403f69bbSGerhard Engleder #ifndef _TSNEP_HW_H 7403f69bbSGerhard Engleder #define _TSNEP_HW_H 8403f69bbSGerhard Engleder 9403f69bbSGerhard Engleder #include <linux/types.h> 10403f69bbSGerhard Engleder 11403f69bbSGerhard Engleder /* type */ 12403f69bbSGerhard Engleder #define ECM_TYPE 0x0000 13403f69bbSGerhard Engleder #define ECM_REVISION_MASK 0x000000FF 14403f69bbSGerhard Engleder #define ECM_REVISION_SHIFT 0 15403f69bbSGerhard Engleder #define ECM_VERSION_MASK 0x0000FF00 16403f69bbSGerhard Engleder #define ECM_VERSION_SHIFT 8 17403f69bbSGerhard Engleder #define ECM_QUEUE_COUNT_MASK 0x00070000 18403f69bbSGerhard Engleder #define ECM_QUEUE_COUNT_SHIFT 16 19403f69bbSGerhard Engleder #define ECM_GATE_CONTROL 0x02000000 20403f69bbSGerhard Engleder 21403f69bbSGerhard Engleder /* system time */ 22403f69bbSGerhard Engleder #define ECM_SYSTEM_TIME_LOW 0x0008 23403f69bbSGerhard Engleder #define ECM_SYSTEM_TIME_HIGH 0x000C 24403f69bbSGerhard Engleder 25403f69bbSGerhard Engleder /* clock */ 26403f69bbSGerhard Engleder #define ECM_CLOCK_RATE 0x0010 27403f69bbSGerhard Engleder #define ECM_CLOCK_RATE_OFFSET_MASK 0x7FFFFFFF 28403f69bbSGerhard Engleder #define ECM_CLOCK_RATE_OFFSET_SIGN 0x80000000 29403f69bbSGerhard Engleder 30403f69bbSGerhard Engleder /* interrupt */ 31403f69bbSGerhard Engleder #define ECM_INT_ENABLE 0x0018 32403f69bbSGerhard Engleder #define ECM_INT_ACTIVE 0x001C 33403f69bbSGerhard Engleder #define ECM_INT_ACKNOWLEDGE 0x001C 34403f69bbSGerhard Engleder #define ECM_INT_LINK 0x00000020 35403f69bbSGerhard Engleder #define ECM_INT_TX_0 0x00000100 36403f69bbSGerhard Engleder #define ECM_INT_RX_0 0x00000200 3776203137SGerhard Engleder #define ECM_INT_TXRX_SHIFT 2 38403f69bbSGerhard Engleder #define ECM_INT_ALL 0x7FFFFFFF 39403f69bbSGerhard Engleder #define ECM_INT_DISABLE 0x80000000 40403f69bbSGerhard Engleder 41403f69bbSGerhard Engleder /* reset */ 42403f69bbSGerhard Engleder #define ECM_RESET 0x0020 43403f69bbSGerhard Engleder #define ECM_RESET_COMMON 0x00000001 44403f69bbSGerhard Engleder #define ECM_RESET_CHANNEL 0x00000100 45403f69bbSGerhard Engleder #define ECM_RESET_TXRX 0x00010000 46403f69bbSGerhard Engleder 470abb62b6SGerhard Engleder /* counter */ 480abb62b6SGerhard Engleder #define ECM_COUNTER_LOW 0x0028 490abb62b6SGerhard Engleder #define ECM_COUNTER_HIGH 0x002C 500abb62b6SGerhard Engleder 51*d3dfe8d6SGerhard Engleder /* interrupt delay */ 52*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY 0x0030 53*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_MASK 0xF0 54*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_SHIFT 4 55*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_BASE_US 16 56*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_OFFSET 1 57*d3dfe8d6SGerhard Engleder 58403f69bbSGerhard Engleder /* control and status */ 59403f69bbSGerhard Engleder #define ECM_STATUS 0x0080 60403f69bbSGerhard Engleder #define ECM_LINK_MODE_OFF 0x01000000 61403f69bbSGerhard Engleder #define ECM_LINK_MODE_100 0x02000000 62403f69bbSGerhard Engleder #define ECM_LINK_MODE_1000 0x04000000 63403f69bbSGerhard Engleder #define ECM_NO_LINK 0x01000000 64403f69bbSGerhard Engleder #define ECM_LINK_MODE_MASK 0x06000000 65403f69bbSGerhard Engleder 66403f69bbSGerhard Engleder /* management data */ 67403f69bbSGerhard Engleder #define ECM_MD_CONTROL 0x0084 68403f69bbSGerhard Engleder #define ECM_MD_STATUS 0x0084 69403f69bbSGerhard Engleder #define ECM_MD_PREAMBLE 0x00000001 70403f69bbSGerhard Engleder #define ECM_MD_READ 0x00000004 71403f69bbSGerhard Engleder #define ECM_MD_WRITE 0x00000002 72403f69bbSGerhard Engleder #define ECM_MD_ADDR_MASK 0x000000F8 73403f69bbSGerhard Engleder #define ECM_MD_ADDR_SHIFT 3 74403f69bbSGerhard Engleder #define ECM_MD_PHY_ADDR_MASK 0x00001F00 75403f69bbSGerhard Engleder #define ECM_MD_PHY_ADDR_SHIFT 8 76403f69bbSGerhard Engleder #define ECM_MD_BUSY 0x00000001 77403f69bbSGerhard Engleder #define ECM_MD_DATA_MASK 0xFFFF0000 78403f69bbSGerhard Engleder #define ECM_MD_DATA_SHIFT 16 79403f69bbSGerhard Engleder 80403f69bbSGerhard Engleder /* statistic */ 81403f69bbSGerhard Engleder #define ECM_STAT 0x00B0 82403f69bbSGerhard Engleder #define ECM_STAT_RX_ERR_MASK 0x000000FF 83403f69bbSGerhard Engleder #define ECM_STAT_RX_ERR_SHIFT 0 84403f69bbSGerhard Engleder #define ECM_STAT_INV_FRM_MASK 0x0000FF00 85403f69bbSGerhard Engleder #define ECM_STAT_INV_FRM_SHIFT 8 86403f69bbSGerhard Engleder #define ECM_STAT_FWD_RX_ERR_MASK 0x00FF0000 87403f69bbSGerhard Engleder #define ECM_STAT_FWD_RX_ERR_SHIFT 16 88403f69bbSGerhard Engleder 89403f69bbSGerhard Engleder /* tsnep */ 90403f69bbSGerhard Engleder #define TSNEP_MAC_SIZE 0x4000 91403f69bbSGerhard Engleder #define TSNEP_QUEUE_SIZE 0x1000 92403f69bbSGerhard Engleder #define TSNEP_QUEUE(n) ({ typeof(n) __n = (n); \ 93403f69bbSGerhard Engleder (__n) == 0 ? \ 94403f69bbSGerhard Engleder 0 : \ 95403f69bbSGerhard Engleder TSNEP_MAC_SIZE + TSNEP_QUEUE_SIZE * ((__n) - 1); }) 96403f69bbSGerhard Engleder #define TSNEP_MAX_QUEUES 8 97403f69bbSGerhard Engleder #define TSNEP_MAX_FRAME_SIZE (2 * 1024) /* hardware supports actually 16k */ 98403f69bbSGerhard Engleder #define TSNEP_DESC_SIZE 256 99403f69bbSGerhard Engleder #define TSNEP_DESC_OFFSET 128 100403f69bbSGerhard Engleder 101403f69bbSGerhard Engleder /* tsnep register */ 102403f69bbSGerhard Engleder #define TSNEP_INFO 0x0100 1037d8dd6b5SGerhard Engleder #define TSNEP_INFO_TX_TIME 0x00010000 104403f69bbSGerhard Engleder #define TSNEP_CONTROL 0x0108 105403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_RESET 0x00000001 106403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_ENABLE 0x00000002 107403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_DMA_ERROR 0x00000010 108403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_DESC_ERROR 0x00000020 109403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_RESET 0x00000100 110403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_ENABLE 0x00000200 111403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_DISABLE 0x00000400 112403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_DMA_ERROR 0x00001000 113403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_DESC_ERROR 0x00002000 114403f69bbSGerhard Engleder #define TSNEP_TX_DESC_ADDR_LOW 0x0140 115403f69bbSGerhard Engleder #define TSNEP_TX_DESC_ADDR_HIGH 0x0144 116403f69bbSGerhard Engleder #define TSNEP_RX_DESC_ADDR_LOW 0x0180 117403f69bbSGerhard Engleder #define TSNEP_RX_DESC_ADDR_HIGH 0x0184 118403f69bbSGerhard Engleder #define TSNEP_RESET_OWNER_COUNTER 0x01 119403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC 0x0190 120403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_NO_DESC_MASK 0x000000FF 121403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_NO_DESC_SHIFT 0 122403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL_MASK 0x0000FF00 123403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL_SHIFT 8 124403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW_MASK 0x00FF0000 125403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW_SHIFT 16 126403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_INVALID_FRAME_MASK 0xFF000000 127403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_INVALID_FRAME_SHIFT 24 128403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_NO_DESC 0x0190 129403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL 0x0191 130403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW 0x0192 131403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_INVALID_FRAME 0x0193 132403f69bbSGerhard Engleder #define TSNEP_MAC_ADDRESS_LOW 0x0800 133403f69bbSGerhard Engleder #define TSNEP_MAC_ADDRESS_HIGH 0x0804 134403f69bbSGerhard Engleder #define TSNEP_RX_FILTER 0x0806 135403f69bbSGerhard Engleder #define TSNEP_RX_FILTER_ACCEPT_ALL_MULTICASTS 0x0001 136403f69bbSGerhard Engleder #define TSNEP_RX_FILTER_ACCEPT_ALL_UNICASTS 0x0002 137403f69bbSGerhard Engleder #define TSNEP_GC 0x0808 138403f69bbSGerhard Engleder #define TSNEP_GC_ENABLE_A 0x00000002 139403f69bbSGerhard Engleder #define TSNEP_GC_ENABLE_B 0x00000004 140403f69bbSGerhard Engleder #define TSNEP_GC_DISABLE 0x00000008 141403f69bbSGerhard Engleder #define TSNEP_GC_ENABLE_TIMEOUT 0x00000010 142403f69bbSGerhard Engleder #define TSNEP_GC_ACTIVE_A 0x00000002 143403f69bbSGerhard Engleder #define TSNEP_GC_ACTIVE_B 0x00000004 144403f69bbSGerhard Engleder #define TSNEP_GC_CHANGE_AB 0x00000008 145403f69bbSGerhard Engleder #define TSNEP_GC_TIMEOUT_ACTIVE 0x00000010 146403f69bbSGerhard Engleder #define TSNEP_GC_TIMEOUT_SIGNAL 0x00000020 147403f69bbSGerhard Engleder #define TSNEP_GC_LIST_ERROR 0x00000080 148403f69bbSGerhard Engleder #define TSNEP_GC_OPEN 0x00FF0000 149403f69bbSGerhard Engleder #define TSNEP_GC_OPEN_SHIFT 16 150403f69bbSGerhard Engleder #define TSNEP_GC_NEXT_OPEN 0xFF000000 151403f69bbSGerhard Engleder #define TSNEP_GC_NEXT_OPEN_SHIFT 24 152403f69bbSGerhard Engleder #define TSNEP_GC_TIMEOUT 131072 153403f69bbSGerhard Engleder #define TSNEP_GC_TIME 0x080C 154403f69bbSGerhard Engleder #define TSNEP_GC_CHANGE 0x0810 155403f69bbSGerhard Engleder #define TSNEP_GCL_A 0x2000 156403f69bbSGerhard Engleder #define TSNEP_GCL_B 0x2800 157403f69bbSGerhard Engleder #define TSNEP_GCL_SIZE SZ_2K 158308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN 0x0840 159308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ACTIVE 0x00000001 160308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_QUEUE_MASK 0x00000006 161308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_QUEUE_SHIFT 1 162308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_OFFSET 1 163308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ETHER_TYPE 0x0880 164308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ETHER_TYPE_OFFSET 2 165308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ETHER_TYPE_COUNT 2 166403f69bbSGerhard Engleder 167403f69bbSGerhard Engleder /* tsnep gate control list operation */ 168403f69bbSGerhard Engleder struct tsnep_gcl_operation { 169403f69bbSGerhard Engleder u32 properties; 170403f69bbSGerhard Engleder u32 interval; 171403f69bbSGerhard Engleder }; 172403f69bbSGerhard Engleder 173403f69bbSGerhard Engleder #define TSNEP_GCL_COUNT (TSNEP_GCL_SIZE / sizeof(struct tsnep_gcl_operation)) 174403f69bbSGerhard Engleder #define TSNEP_GCL_MASK 0x000000FF 175403f69bbSGerhard Engleder #define TSNEP_GCL_INSERT 0x20000000 176403f69bbSGerhard Engleder #define TSNEP_GCL_CHANGE 0x40000000 177403f69bbSGerhard Engleder #define TSNEP_GCL_LAST 0x80000000 178403f69bbSGerhard Engleder #define TSNEP_GCL_MIN_INTERVAL 32 179403f69bbSGerhard Engleder 180403f69bbSGerhard Engleder /* tsnep TX/RX descriptor */ 181403f69bbSGerhard Engleder #define TSNEP_DESC_SIZE 256 182403f69bbSGerhard Engleder #define TSNEP_DESC_SIZE_DATA_AFTER 2048 183403f69bbSGerhard Engleder #define TSNEP_DESC_OFFSET 128 184403f69bbSGerhard Engleder #define TSNEP_DESC_OWNER_COUNTER_MASK 0xC0000000 185403f69bbSGerhard Engleder #define TSNEP_DESC_OWNER_COUNTER_SHIFT 30 186403f69bbSGerhard Engleder #define TSNEP_DESC_LENGTH_MASK 0x00003FFF 187403f69bbSGerhard Engleder #define TSNEP_DESC_INTERRUPT_FLAG 0x00040000 188403f69bbSGerhard Engleder #define TSNEP_DESC_EXTENDED_WRITEBACK_FLAG 0x00080000 189403f69bbSGerhard Engleder #define TSNEP_DESC_NO_LINK_FLAG 0x01000000 190403f69bbSGerhard Engleder 191403f69bbSGerhard Engleder /* tsnep TX descriptor */ 192403f69bbSGerhard Engleder struct tsnep_tx_desc { 193403f69bbSGerhard Engleder __le32 properties; 194403f69bbSGerhard Engleder __le32 more_properties; 195403f69bbSGerhard Engleder __le32 reserved[2]; 196403f69bbSGerhard Engleder __le64 next; 197403f69bbSGerhard Engleder __le64 tx; 198403f69bbSGerhard Engleder }; 199403f69bbSGerhard Engleder 200403f69bbSGerhard Engleder #define TSNEP_TX_DESC_OWNER_MASK 0xE0000000 201403f69bbSGerhard Engleder #define TSNEP_TX_DESC_OWNER_USER_FLAG 0x20000000 202403f69bbSGerhard Engleder #define TSNEP_TX_DESC_LAST_FRAGMENT_FLAG 0x00010000 203403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DATA_AFTER_DESC_FLAG 0x00020000 204403f69bbSGerhard Engleder 205403f69bbSGerhard Engleder /* tsnep TX descriptor writeback */ 206403f69bbSGerhard Engleder struct tsnep_tx_desc_wb { 207403f69bbSGerhard Engleder __le32 properties; 2080abb62b6SGerhard Engleder __le32 reserved1; 2090abb62b6SGerhard Engleder __le64 counter; 210403f69bbSGerhard Engleder __le64 timestamp; 211403f69bbSGerhard Engleder __le32 dma_delay; 212403f69bbSGerhard Engleder __le32 reserved2; 213403f69bbSGerhard Engleder }; 214403f69bbSGerhard Engleder 215403f69bbSGerhard Engleder #define TSNEP_TX_DESC_UNDERRUN_ERROR_FLAG 0x00010000 216403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_FIRST_DATA_MASK 0x0000FFFC 217403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_FIRST_DATA_SHIFT 2 218403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_LAST_DATA_MASK 0xFFFC0000 219403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_LAST_DATA_SHIFT 18 220403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_NS 64 221403f69bbSGerhard Engleder 222403f69bbSGerhard Engleder /* tsnep RX descriptor */ 223403f69bbSGerhard Engleder struct tsnep_rx_desc { 224403f69bbSGerhard Engleder __le32 properties; 225403f69bbSGerhard Engleder __le32 reserved[3]; 226403f69bbSGerhard Engleder __le64 next; 227403f69bbSGerhard Engleder __le64 rx; 228403f69bbSGerhard Engleder }; 229403f69bbSGerhard Engleder 230403f69bbSGerhard Engleder #define TSNEP_RX_DESC_BUFFER_SIZE_MASK 0x00003FFC 231403f69bbSGerhard Engleder 232403f69bbSGerhard Engleder /* tsnep RX descriptor writeback */ 233403f69bbSGerhard Engleder struct tsnep_rx_desc_wb { 234403f69bbSGerhard Engleder __le32 properties; 235403f69bbSGerhard Engleder __le32 reserved[7]; 236403f69bbSGerhard Engleder }; 237403f69bbSGerhard Engleder 238403f69bbSGerhard Engleder /* tsnep RX inline meta */ 239403f69bbSGerhard Engleder struct tsnep_rx_inline { 2400abb62b6SGerhard Engleder __le64 counter; 241403f69bbSGerhard Engleder __le64 timestamp; 242403f69bbSGerhard Engleder }; 243403f69bbSGerhard Engleder 244403f69bbSGerhard Engleder #define TSNEP_RX_INLINE_METADATA_SIZE (sizeof(struct tsnep_rx_inline)) 245403f69bbSGerhard Engleder 246403f69bbSGerhard Engleder #endif /* _TSNEP_HW_H */ 247