| /* SPDX-License-Identifier: GPL-2.0 */ |
| |
| /* Renesas Ethernet-TSN device driver |
| * |
| * Copyright (C) 2022 Renesas Electronics Corporation |
| * Copyright (C) 2023 Niklas Söderlund <niklas.soderlund@ragnatech.se> |
| */ |
| |
| #ifndef __RTSN_H__ |
| #define __RTSN_H__ |
| |
| #include <linux/types.h> |
| |
| #define AXIBMI 0x0000 |
| #define TSNMHD 0x1000 |
| #define RMSO 0x2000 |
| #define RMRO 0x3800 |
| |
| enum rtsn_reg { |
| AXIWC = AXIBMI + 0x0000, |
| AXIRC = AXIBMI + 0x0004, |
| TDPC0 = AXIBMI + 0x0010, |
| TFT = AXIBMI + 0x0090, |
| TATLS0 = AXIBMI + 0x00a0, |
| TATLS1 = AXIBMI + 0x00a4, |
| TATLR = AXIBMI + 0x00a8, |
| RATLS0 = AXIBMI + 0x00b0, |
| RATLS1 = AXIBMI + 0x00b4, |
| RATLR = AXIBMI + 0x00b8, |
| TSA0 = AXIBMI + 0x00c0, |
| TSS0 = AXIBMI + 0x00c4, |
| TRCR0 = AXIBMI + 0x0140, |
| RIDAUAS0 = AXIBMI + 0x0180, |
| RR = AXIBMI + 0x0200, |
| TATS = AXIBMI + 0x0210, |
| TATSR0 = AXIBMI + 0x0214, |
| TATSR1 = AXIBMI + 0x0218, |
| TATSR2 = AXIBMI + 0x021c, |
| RATS = AXIBMI + 0x0220, |
| RATSR0 = AXIBMI + 0x0224, |
| RATSR1 = AXIBMI + 0x0228, |
| RATSR2 = AXIBMI + 0x022c, |
| RIDASM0 = AXIBMI + 0x0240, |
| RIDASAM0 = AXIBMI + 0x0244, |
| RIDACAM0 = AXIBMI + 0x0248, |
| EIS0 = AXIBMI + 0x0300, |
| EIE0 = AXIBMI + 0x0304, |
| EID0 = AXIBMI + 0x0308, |
| EIS1 = AXIBMI + 0x0310, |
| EIE1 = AXIBMI + 0x0314, |
| EID1 = AXIBMI + 0x0318, |
| TCEIS0 = AXIBMI + 0x0340, |
| TCEIE0 = AXIBMI + 0x0344, |
| TCEID0 = AXIBMI + 0x0348, |
| RFSEIS0 = AXIBMI + 0x04c0, |
| RFSEIE0 = AXIBMI + 0x04c4, |
| RFSEID0 = AXIBMI + 0x04c8, |
| RFEIS0 = AXIBMI + 0x0540, |
| RFEIE0 = AXIBMI + 0x0544, |
| RFEID0 = AXIBMI + 0x0548, |
| RCEIS0 = AXIBMI + 0x05c0, |
| RCEIE0 = AXIBMI + 0x05c4, |
| RCEID0 = AXIBMI + 0x05c8, |
| RIDAOIS = AXIBMI + 0x0640, |
| RIDAOIE = AXIBMI + 0x0644, |
| RIDAOID = AXIBMI + 0x0648, |
| TSFEIS = AXIBMI + 0x06c0, |
| TSFEIE = AXIBMI + 0x06c4, |
| TSFEID = AXIBMI + 0x06c8, |
| TSCEIS = AXIBMI + 0x06d0, |
| TSCEIE = AXIBMI + 0x06d4, |
| TSCEID = AXIBMI + 0x06d8, |
| DIS = AXIBMI + 0x0b00, |
| DIE = AXIBMI + 0x0b04, |
| DID = AXIBMI + 0x0b08, |
| TDIS0 = AXIBMI + 0x0b10, |
| TDIE0 = AXIBMI + 0x0b14, |
| TDID0 = AXIBMI + 0x0b18, |
| RDIS0 = AXIBMI + 0x0b90, |
| RDIE0 = AXIBMI + 0x0b94, |
| RDID0 = AXIBMI + 0x0b98, |
| TSDIS = AXIBMI + 0x0c10, |
| TSDIE = AXIBMI + 0x0c14, |
| TSDID = AXIBMI + 0x0c18, |
| GPOUT = AXIBMI + 0x6000, |
| |
| OCR = TSNMHD + 0x0000, |
| OSR = TSNMHD + 0x0004, |
| SWR = TSNMHD + 0x0008, |
| SIS = TSNMHD + 0x000c, |
| GIS = TSNMHD + 0x0010, |
| GIE = TSNMHD + 0x0014, |
| GID = TSNMHD + 0x0018, |
| TIS1 = TSNMHD + 0x0020, |
| TIE1 = TSNMHD + 0x0024, |
| TID1 = TSNMHD + 0x0028, |
| TIS2 = TSNMHD + 0x0030, |
| TIE2 = TSNMHD + 0x0034, |
| TID2 = TSNMHD + 0x0038, |
| RIS = TSNMHD + 0x0040, |
| RIE = TSNMHD + 0x0044, |
| RID = TSNMHD + 0x0048, |
| TGC1 = TSNMHD + 0x0050, |
| TGC2 = TSNMHD + 0x0054, |
| TFS0 = TSNMHD + 0x0060, |
| TCF0 = TSNMHD + 0x0070, |
| TCR1 = TSNMHD + 0x0080, |
| TCR2 = TSNMHD + 0x0084, |
| TCR3 = TSNMHD + 0x0088, |
| TCR4 = TSNMHD + 0x008c, |
| TMS0 = TSNMHD + 0x0090, |
| TSR1 = TSNMHD + 0x00b0, |
| TSR2 = TSNMHD + 0x00b4, |
| TSR3 = TSNMHD + 0x00b8, |
| TSR4 = TSNMHD + 0x00bc, |
| TSR5 = TSNMHD + 0x00c0, |
| RGC = TSNMHD + 0x00d0, |
| RDFCR = TSNMHD + 0x00d4, |
| RCFCR = TSNMHD + 0x00d8, |
| REFCNCR = TSNMHD + 0x00dc, |
| RSR1 = TSNMHD + 0x00e0, |
| RSR2 = TSNMHD + 0x00e4, |
| RSR3 = TSNMHD + 0x00e8, |
| TCIS = TSNMHD + 0x01e0, |
| TCIE = TSNMHD + 0x01e4, |
| TCID = TSNMHD + 0x01e8, |
| TPTPC = TSNMHD + 0x01f0, |
| TTML = TSNMHD + 0x01f4, |
| TTJ = TSNMHD + 0x01f8, |
| TCC = TSNMHD + 0x0200, |
| TCS = TSNMHD + 0x0204, |
| TGS = TSNMHD + 0x020c, |
| TACST0 = TSNMHD + 0x0210, |
| TACST1 = TSNMHD + 0x0214, |
| TACST2 = TSNMHD + 0x0218, |
| TALIT0 = TSNMHD + 0x0220, |
| TALIT1 = TSNMHD + 0x0224, |
| TALIT2 = TSNMHD + 0x0228, |
| TAEN0 = TSNMHD + 0x0230, |
| TAEN1 = TSNMHD + 0x0234, |
| TASFE = TSNMHD + 0x0240, |
| TACLL0 = TSNMHD + 0x0250, |
| TACLL1 = TSNMHD + 0x0254, |
| TACLL2 = TSNMHD + 0x0258, |
| CACC = TSNMHD + 0x0260, |
| CCS = TSNMHD + 0x0264, |
| CAIV0 = TSNMHD + 0x0270, |
| CAUL0 = TSNMHD + 0x0290, |
| TOCST0 = TSNMHD + 0x0300, |
| TOCST1 = TSNMHD + 0x0304, |
| TOCST2 = TSNMHD + 0x0308, |
| TOLIT0 = TSNMHD + 0x0310, |
| TOLIT1 = TSNMHD + 0x0314, |
| TOLIT2 = TSNMHD + 0x0318, |
| TOEN0 = TSNMHD + 0x0320, |
| TOEN1 = TSNMHD + 0x0324, |
| TOSFE = TSNMHD + 0x0330, |
| TCLR0 = TSNMHD + 0x0340, |
| TCLR1 = TSNMHD + 0x0344, |
| TCLR2 = TSNMHD + 0x0348, |
| TSMS = TSNMHD + 0x0350, |
| COCC = TSNMHD + 0x0360, |
| COIV0 = TSNMHD + 0x03b0, |
| COUL0 = TSNMHD + 0x03d0, |
| QSTMACU0 = TSNMHD + 0x0400, |
| QSTMACD0 = TSNMHD + 0x0404, |
| QSTMAMU0 = TSNMHD + 0x0408, |
| QSTMAMD0 = TSNMHD + 0x040c, |
| QSFTVL0 = TSNMHD + 0x0410, |
| QSFTVLM0 = TSNMHD + 0x0414, |
| QSFTMSD0 = TSNMHD + 0x0418, |
| QSFTGMI0 = TSNMHD + 0x041c, |
| QSFTLS = TSNMHD + 0x0600, |
| QSFTLIS = TSNMHD + 0x0604, |
| QSFTLIE = TSNMHD + 0x0608, |
| QSFTLID = TSNMHD + 0x060c, |
| QSMSMC = TSNMHD + 0x0610, |
| QSGTMC = TSNMHD + 0x0614, |
| QSEIS = TSNMHD + 0x0618, |
| QSEIE = TSNMHD + 0x061c, |
| QSEID = TSNMHD + 0x0620, |
| QGACST0 = TSNMHD + 0x0630, |
| QGACST1 = TSNMHD + 0x0634, |
| QGACST2 = TSNMHD + 0x0638, |
| QGALIT1 = TSNMHD + 0x0640, |
| QGALIT2 = TSNMHD + 0x0644, |
| QGAEN0 = TSNMHD + 0x0648, |
| QGAEN1 = TSNMHD + 0x074c, |
| QGIGS = TSNMHD + 0x0650, |
| QGGC = TSNMHD + 0x0654, |
| QGATL0 = TSNMHD + 0x0664, |
| QGATL1 = TSNMHD + 0x0668, |
| QGATL2 = TSNMHD + 0x066c, |
| QGOCST0 = TSNMHD + 0x0670, |
| QGOCST1 = TSNMHD + 0x0674, |
| QGOCST2 = TSNMHD + 0x0678, |
| QGOLIT0 = TSNMHD + 0x067c, |
| QGOLIT1 = TSNMHD + 0x0680, |
| QGOLIT2 = TSNMHD + 0x0684, |
| QGOEN0 = TSNMHD + 0x0688, |
| QGOEN1 = TSNMHD + 0x068c, |
| QGTRO = TSNMHD + 0x0690, |
| QGTR1 = TSNMHD + 0x0694, |
| QGTR2 = TSNMHD + 0x0698, |
| QGFSMS = TSNMHD + 0x069c, |
| QTMIS = TSNMHD + 0x06e0, |
| QTMIE = TSNMHD + 0x06e4, |
| QTMID = TSNMHD + 0x06e8, |
| QMEC = TSNMHD + 0x0700, |
| QMMC = TSNMHD + 0x0704, |
| QRFDC = TSNMHD + 0x0708, |
| QYFDC = TSNMHD + 0x070c, |
| QVTCMC0 = TSNMHD + 0x0710, |
| QMCBSC0 = TSNMHD + 0x0750, |
| QMCIRC0 = TSNMHD + 0x0790, |
| QMEBSC0 = TSNMHD + 0x07d0, |
| QMEIRC0 = TSNMHD + 0x0710, |
| QMCFC = TSNMHD + 0x0850, |
| QMEIS = TSNMHD + 0x0860, |
| QMEIE = TSNMHD + 0x0864, |
| QMEID = TSNMHD + 0x086c, |
| QSMFC0 = TSNMHD + 0x0870, |
| QMSPPC0 = TSNMHD + 0x08b0, |
| QMSRPC0 = TSNMHD + 0x08f0, |
| QGPPC0 = TSNMHD + 0x0930, |
| QGRPC0 = TSNMHD + 0x0950, |
| QMDPC0 = TSNMHD + 0x0970, |
| QMGPC0 = TSNMHD + 0x09b0, |
| QMYPC0 = TSNMHD + 0x09f0, |
| QMRPC0 = TSNMHD + 0x0a30, |
| MQSTMACU = TSNMHD + 0x0a70, |
| MQSTMACD = TSNMHD + 0x0a74, |
| MQSTMAMU = TSNMHD + 0x0a78, |
| MQSTMAMD = TSNMHD + 0x0a7c, |
| MQSFTVL = TSNMHD + 0x0a80, |
| MQSFTVLM = TSNMHD + 0x0a84, |
| MQSFTMSD = TSNMHD + 0x0a88, |
| MQSFTGMI = TSNMHD + 0x0a8c, |
| |
| CFCR0 = RMSO + 0x0800, |
| FMSCR = RMSO + 0x0c10, |
| |
| MMC = RMRO + 0x0000, |
| MPSM = RMRO + 0x0010, |
| MPIC = RMRO + 0x0014, |
| MTFFC = RMRO + 0x0020, |
| MTPFC = RMRO + 0x0024, |
| MTATC0 = RMRO + 0x0040, |
| MRGC = RMRO + 0x0080, |
| MRMAC0 = RMRO + 0x0084, |
| MRMAC1 = RMRO + 0x0088, |
| MRAFC = RMRO + 0x008c, |
| MRSCE = RMRO + 0x0090, |
| MRSCP = RMRO + 0x0094, |
| MRSCC = RMRO + 0x0098, |
| MRFSCE = RMRO + 0x009c, |
| MRFSCP = RMRO + 0x00a0, |
| MTRC = RMRO + 0x00a4, |
| MPFC = RMRO + 0x0100, |
| MLVC = RMRO + 0x0340, |
| MEEEC = RMRO + 0x0350, |
| MLBC = RMRO + 0x0360, |
| MGMR = RMRO + 0x0400, |
| MMPFTCT = RMRO + 0x0410, |
| MAPFTCT = RMRO + 0x0414, |
| MPFRCT = RMRO + 0x0418, |
| MFCICT = RMRO + 0x041c, |
| MEEECT = RMRO + 0x0420, |
| MEIS = RMRO + 0x0500, |
| MEIE = RMRO + 0x0504, |
| MEID = RMRO + 0x0508, |
| MMIS0 = RMRO + 0x0510, |
| MMIE0 = RMRO + 0x0514, |
| MMID0 = RMRO + 0x0518, |
| MMIS1 = RMRO + 0x0520, |
| MMIE1 = RMRO + 0x0524, |
| MMID1 = RMRO + 0x0528, |
| MMIS2 = RMRO + 0x0530, |
| MMIE2 = RMRO + 0x0534, |
| MMID2 = RMRO + 0x0538, |
| MXMS = RMRO + 0x0600, |
| |
| }; |
| |
| /* AXIBMI */ |
| #define RR_RATRR BIT(0) |
| #define RR_TATRR BIT(1) |
| #define RR_RST (RR_RATRR | RR_TATRR) |
| #define RR_RST_COMPLETE 0x03 |
| |
| #define AXIWC_DEFAULT 0xffff |
| #define AXIRC_DEFAULT 0xffff |
| |
| #define TATLS0_TEDE BIT(1) |
| #define TATLS0_TATEN_SHIFT 24 |
| #define TATLS0_TATEN(n) ((n) << TATLS0_TATEN_SHIFT) |
| #define TATLR_TATL BIT(31) |
| |
| #define RATLS0_RETS BIT(2) |
| #define RATLS0_REDE BIT(3) |
| #define RATLS0_RATEN_SHIFT 24 |
| #define RATLS0_RATEN(n) ((n) << RATLS0_RATEN_SHIFT) |
| #define RATLR_RATL BIT(31) |
| |
| #define DIE_DID_TDICX(n) BIT((n)) |
| #define DIE_DID_RDICX(n) BIT((n) + 8) |
| #define TDIE_TDID_TDX(n) BIT(n) |
| #define RDIE_RDID_RDX(n) BIT(n) |
| #define TDIS_TDS(n) BIT(n) |
| #define RDIS_RDS(n) BIT(n) |
| |
| /* MHD */ |
| #define OSR_OPS 0x07 |
| #define SWR_SWR BIT(0) |
| |
| #define TGC1_TQTM_SFM 0xff00 |
| #define TGC1_STTV_DEFAULT 0x03 |
| |
| #define TMS_MFS_MAX 0x2800 |
| |
| /* RMAC System */ |
| #define CFCR_SDID(n) ((n) << 16) |
| #define FMSCR_FMSIE(n) ((n) << 0) |
| |
| /* RMAC */ |
| #define MPIC_PIS_MASK GENMASK(1, 0) |
| #define MPIC_PIS_MII 0 |
| #define MPIC_PIS_RMII 0x01 |
| #define MPIC_PIS_GMII 0x02 |
| #define MPIC_PIS_RGMII 0x03 |
| #define MPIC_LSC_SHIFT 2 |
| #define MPIC_LSC_MASK GENMASK(3, MPIC_LSC_SHIFT) |
| #define MPIC_LSC_10M (0 << MPIC_LSC_SHIFT) |
| #define MPIC_LSC_100M (0x01 << MPIC_LSC_SHIFT) |
| #define MPIC_LSC_1G (0x02 << MPIC_LSC_SHIFT) |
| #define MPIC_PSMCS_SHIFT 16 |
| #define MPIC_PSMCS_MASK GENMASK(21, MPIC_PSMCS_SHIFT) |
| #define MPIC_PSMCS_DEFAULT (0x0a << MPIC_PSMCS_SHIFT) |
| #define MPIC_PSMHT_SHIFT 24 |
| #define MPIC_PSMHT_MASK GENMASK(26, MPIC_PSMHT_SHIFT) |
| #define MPIC_PSMHT_DEFAULT (0x07 << MPIC_PSMHT_SHIFT) |
| |
| #define MLVC_PASE BIT(8) |
| #define MLVC_PSE BIT(16) |
| #define MLVC_PLV BIT(17) |
| |
| #define MPSM_PSME BIT(0) |
| #define MPSM_PSMAD BIT(1) |
| #define MPSM_PDA_SHIFT 3 |
| #define MPSM_PDA_MASK GENMASK(7, 3) |
| #define MPSM_PDA(n) (((n) << MPSM_PDA_SHIFT) & MPSM_PDA_MASK) |
| #define MPSM_PRA_SHIFT 8 |
| #define MPSM_PRA_MASK GENMASK(12, 8) |
| #define MPSM_PRA(n) (((n) << MPSM_PRA_SHIFT) & MPSM_PRA_MASK) |
| #define MPSM_PRD_SHIFT 16 |
| #define MPSM_PRD_SET(n) ((n) << MPSM_PRD_SHIFT) |
| #define MPSM_PRD_GET(n) ((n) >> MPSM_PRD_SHIFT) |
| |
| #define GPOUT_RDM BIT(13) |
| #define GPOUT_TDM BIT(14) |
| |
| /* RTSN */ |
| #define RTSN_INTERVAL_US 1000 |
| #define RTSN_TIMEOUT_US 1000000 |
| |
| #define TX_NUM_CHAINS 1 |
| #define RX_NUM_CHAINS 1 |
| |
| #define TX_CHAIN_SIZE 1024 |
| #define RX_CHAIN_SIZE 1024 |
| |
| #define TX_CHAIN_IDX 0 |
| #define RX_CHAIN_IDX 0 |
| |
| #define TX_CHAIN_ADDR_OFFSET (sizeof(struct rtsn_desc) * TX_CHAIN_IDX) |
| #define RX_CHAIN_ADDR_OFFSET (sizeof(struct rtsn_desc) * RX_CHAIN_IDX) |
| |
| #define PKT_BUF_SZ 1584 |
| #define RTSN_ALIGN 128 |
| |
| enum rtsn_mode { |
| OCR_OPC_DISABLE, |
| OCR_OPC_CONFIG, |
| OCR_OPC_OPERATION, |
| }; |
| |
| /* Descriptors */ |
| enum RX_DS_CC_BIT { |
| RX_DS = 0x0fff, /* Data size */ |
| RX_TR = 0x1000, /* Truncation indication */ |
| RX_EI = 0x2000, /* Error indication */ |
| RX_PS = 0xc000, /* Padding selection */ |
| }; |
| |
| enum TX_FS_TAGL_BIT { |
| TX_DS = 0x0fff, /* Data size */ |
| TX_TAGL = 0xf000, /* Frame tag LSBs */ |
| }; |
| |
| enum DIE_DT { |
| /* HW/SW arbitration */ |
| DT_FEMPTY_IS = 0x10, |
| DT_FEMPTY_IC = 0x20, |
| DT_FEMPTY_ND = 0x30, |
| DT_FEMPTY = 0x40, |
| DT_FEMPTY_START = 0x50, |
| DT_FEMPTY_MID = 0x60, |
| DT_FEMPTY_END = 0x70, |
| |
| /* Frame data */ |
| DT_FSINGLE = 0x80, |
| DT_FSTART = 0x90, |
| DT_FMID = 0xa0, |
| DT_FEND = 0xb0, |
| |
| /* Chain control */ |
| DT_LEMPTY = 0xc0, |
| DT_EEMPTY = 0xd0, |
| DT_LINK = 0xe0, |
| DT_EOS = 0xf0, |
| |
| DT_MASK = 0xf0, |
| D_DIE = 0x08, |
| }; |
| |
| struct rtsn_desc { |
| __le16 info_ds; |
| __u8 info; |
| u8 die_dt; |
| __le32 dptr; |
| } __packed; |
| |
| struct rtsn_ts_desc { |
| __le16 info_ds; |
| __u8 info; |
| u8 die_dt; |
| __le32 dptr; |
| __le32 ts_nsec; |
| __le32 ts_sec; |
| } __packed; |
| |
| struct rtsn_ext_desc { |
| __le16 info_ds; |
| __u8 info; |
| u8 die_dt; |
| __le32 dptr; |
| __le64 info1; |
| } __packed; |
| |
| struct rtsn_ext_ts_desc { |
| __le16 info_ds; |
| __u8 info; |
| u8 die_dt; |
| __le32 dptr; |
| __le64 info1; |
| __le32 ts_nsec; |
| __le32 ts_sec; |
| } __packed; |
| |
| enum EXT_INFO_DS_BIT { |
| TXC = 0x4000, |
| }; |
| |
| #endif |