/* SPDX-License-Identifier: GPL-2.0 */ /* Renesas Ethernet-TSN device driver * * Copyright (C) 2022 Renesas Electronics Corporation * Copyright (C) 2023 Niklas Söderlund */ #ifndef __RTSN_H__ #define __RTSN_H__ #include #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