1 /* SPDX-License-Identifier: (GPL-2.0 or MIT) */ 2 /* 3 * DSA driver for: 4 * Hirschmann Hellcreek TSN switch. 5 * 6 * Copyright (C) 2019,2020 Linutronix GmbH 7 * Author Kurt Kanzenbach <kurt@linutronix.de> 8 */ 9 10 #ifndef _HELLCREEK_H_ 11 #define _HELLCREEK_H_ 12 13 #include <linux/bitmap.h> 14 #include <linux/bitops.h> 15 #include <linux/device.h> 16 #include <linux/kernel.h> 17 #include <linux/mutex.h> 18 #include <linux/platform_data/hirschmann-hellcreek.h> 19 #include <linux/ptp_clock_kernel.h> 20 #include <linux/timecounter.h> 21 #include <net/dsa.h> 22 23 /* Ports: 24 * - 0: CPU 25 * - 1: Tunnel 26 * - 2: TSN front port 1 27 * - 3: TSN front port 2 28 * - ... 29 */ 30 #define CPU_PORT 0 31 #define TUNNEL_PORT 1 32 33 #define HELLCREEK_VLAN_NO_MEMBER 0x0 34 #define HELLCREEK_VLAN_UNTAGGED_MEMBER 0x1 35 #define HELLCREEK_VLAN_TAGGED_MEMBER 0x3 36 #define HELLCREEK_NUM_EGRESS_QUEUES 8 37 38 /* Register definitions */ 39 #define HR_MODID_C (0 * 2) 40 #define HR_REL_L_C (1 * 2) 41 #define HR_REL_H_C (2 * 2) 42 #define HR_BLD_L_C (3 * 2) 43 #define HR_BLD_H_C (4 * 2) 44 #define HR_CTRL_C (5 * 2) 45 #define HR_CTRL_C_READY BIT(14) 46 #define HR_CTRL_C_TRANSITION BIT(13) 47 #define HR_CTRL_C_ENABLE BIT(0) 48 49 #define HR_PSEL (0xa6 * 2) 50 #define HR_PSEL_PTWSEL_SHIFT 4 51 #define HR_PSEL_PTWSEL_MASK GENMASK(5, 4) 52 #define HR_PSEL_PRTCWSEL_SHIFT 0 53 #define HR_PSEL_PRTCWSEL_MASK GENMASK(2, 0) 54 55 #define HR_PTCFG (0xa7 * 2) 56 #define HR_PTCFG_MLIMIT_EN BIT(13) 57 #define HR_PTCFG_UMC_FLT BIT(10) 58 #define HR_PTCFG_UUC_FLT BIT(9) 59 #define HR_PTCFG_UNTRUST BIT(8) 60 #define HR_PTCFG_TAG_REQUIRED BIT(7) 61 #define HR_PTCFG_PPRIO_SHIFT 4 62 #define HR_PTCFG_PPRIO_MASK GENMASK(6, 4) 63 #define HR_PTCFG_INGRESSFLT BIT(3) 64 #define HR_PTCFG_BLOCKED BIT(2) 65 #define HR_PTCFG_LEARNING_EN BIT(1) 66 #define HR_PTCFG_ADMIN_EN BIT(0) 67 68 #define HR_PRTCCFG (0xa8 * 2) 69 #define HR_PRTCCFG_PCP_TC_MAP_SHIFT 0 70 #define HR_PRTCCFG_PCP_TC_MAP_MASK GENMASK(2, 0) 71 72 #define HR_CSEL (0x8d * 2) 73 #define HR_CSEL_SHIFT 0 74 #define HR_CSEL_MASK GENMASK(7, 0) 75 #define HR_CRDL (0x8e * 2) 76 #define HR_CRDH (0x8f * 2) 77 78 #define HR_SWTRC_CFG (0x90 * 2) 79 #define HR_SWTRC0 (0x91 * 2) 80 #define HR_SWTRC1 (0x92 * 2) 81 #define HR_PFREE (0x93 * 2) 82 #define HR_MFREE (0x94 * 2) 83 84 #define HR_FDBAGE (0x97 * 2) 85 #define HR_FDBMAX (0x98 * 2) 86 #define HR_FDBRDL (0x99 * 2) 87 #define HR_FDBRDM (0x9a * 2) 88 #define HR_FDBRDH (0x9b * 2) 89 90 #define HR_FDBMDRD (0x9c * 2) 91 #define HR_FDBMDRD_PORTMASK_SHIFT 0 92 #define HR_FDBMDRD_PORTMASK_MASK GENMASK(3, 0) 93 #define HR_FDBMDRD_AGE_SHIFT 4 94 #define HR_FDBMDRD_AGE_MASK GENMASK(7, 4) 95 #define HR_FDBMDRD_OBT BIT(8) 96 #define HR_FDBMDRD_PASS_BLOCKED BIT(9) 97 #define HR_FDBMDRD_STATIC BIT(11) 98 #define HR_FDBMDRD_REPRIO_TC_SHIFT 12 99 #define HR_FDBMDRD_REPRIO_TC_MASK GENMASK(14, 12) 100 #define HR_FDBMDRD_REPRIO_EN BIT(15) 101 102 #define HR_FDBWDL (0x9d * 2) 103 #define HR_FDBWDM (0x9e * 2) 104 #define HR_FDBWDH (0x9f * 2) 105 #define HR_FDBWRM0 (0xa0 * 2) 106 #define HR_FDBWRM0_PORTMASK_SHIFT 0 107 #define HR_FDBWRM0_PORTMASK_MASK GENMASK(3, 0) 108 #define HR_FDBWRM0_OBT BIT(8) 109 #define HR_FDBWRM0_PASS_BLOCKED BIT(9) 110 #define HR_FDBWRM0_REPRIO_TC_SHIFT 12 111 #define HR_FDBWRM0_REPRIO_TC_MASK GENMASK(14, 12) 112 #define HR_FDBWRM0_REPRIO_EN BIT(15) 113 #define HR_FDBWRM1 (0xa1 * 2) 114 115 #define HR_FDBWRCMD (0xa2 * 2) 116 #define HR_FDBWRCMD_FDBDEL BIT(9) 117 118 #define HR_SWCFG (0xa3 * 2) 119 #define HR_SWCFG_GM_STATEMD BIT(15) 120 #define HR_SWCFG_LAS_MODE_SHIFT 12 121 #define HR_SWCFG_LAS_MODE_MASK GENMASK(13, 12) 122 #define HR_SWCFG_LAS_OFF (0x00) 123 #define HR_SWCFG_LAS_ON (0x01) 124 #define HR_SWCFG_LAS_STATIC (0x10) 125 #define HR_SWCFG_CT_EN BIT(11) 126 #define HR_SWCFG_VLAN_UNAWARE BIT(10) 127 #define HR_SWCFG_ALWAYS_OBT BIT(9) 128 #define HR_SWCFG_FDBAGE_EN BIT(5) 129 #define HR_SWCFG_FDBLRN_EN BIT(4) 130 131 #define HR_SWSTAT (0xa4 * 2) 132 #define HR_SWSTAT_FAIL BIT(4) 133 #define HR_SWSTAT_BUSY BIT(0) 134 135 #define HR_SWCMD (0xa5 * 2) 136 #define HW_SWCMD_FLUSH BIT(0) 137 138 #define HR_VIDCFG (0xaa * 2) 139 #define HR_VIDCFG_VID_SHIFT 0 140 #define HR_VIDCFG_VID_MASK GENMASK(11, 0) 141 #define HR_VIDCFG_PVID BIT(12) 142 143 #define HR_VIDMBRCFG (0xab * 2) 144 #define HR_VIDMBRCFG_P0MBR_SHIFT 0 145 #define HR_VIDMBRCFG_P0MBR_MASK GENMASK(1, 0) 146 #define HR_VIDMBRCFG_P1MBR_SHIFT 2 147 #define HR_VIDMBRCFG_P1MBR_MASK GENMASK(3, 2) 148 #define HR_VIDMBRCFG_P2MBR_SHIFT 4 149 #define HR_VIDMBRCFG_P2MBR_MASK GENMASK(5, 4) 150 #define HR_VIDMBRCFG_P3MBR_SHIFT 6 151 #define HR_VIDMBRCFG_P3MBR_MASK GENMASK(7, 6) 152 153 #define HR_FEABITS0 (0xac * 2) 154 #define HR_FEABITS0_FDBBINS_SHIFT 4 155 #define HR_FEABITS0_FDBBINS_MASK GENMASK(7, 4) 156 #define HR_FEABITS0_PCNT_SHIFT 8 157 #define HR_FEABITS0_PCNT_MASK GENMASK(11, 8) 158 #define HR_FEABITS0_MCNT_SHIFT 12 159 #define HR_FEABITS0_MCNT_MASK GENMASK(15, 12) 160 161 #define TR_QTRACK (0xb1 * 2) 162 #define TR_TGDVER (0xb3 * 2) 163 #define TR_TGDVER_REV_MIN_MASK GENMASK(7, 0) 164 #define TR_TGDVER_REV_MIN_SHIFT 0 165 #define TR_TGDVER_REV_MAJ_MASK GENMASK(15, 8) 166 #define TR_TGDVER_REV_MAJ_SHIFT 8 167 #define TR_TGDSEL (0xb4 * 2) 168 #define TR_TGDSEL_TDGSEL_MASK GENMASK(1, 0) 169 #define TR_TGDSEL_TDGSEL_SHIFT 0 170 #define TR_TGDCTRL (0xb5 * 2) 171 #define TR_TGDCTRL_GATE_EN BIT(0) 172 #define TR_TGDCTRL_CYC_SNAP BIT(4) 173 #define TR_TGDCTRL_SNAP_EST BIT(5) 174 #define TR_TGDCTRL_ADMINGATESTATES_MASK GENMASK(15, 8) 175 #define TR_TGDCTRL_ADMINGATESTATES_SHIFT 8 176 #define TR_TGDSTAT0 (0xb6 * 2) 177 #define TR_TGDSTAT1 (0xb7 * 2) 178 #define TR_ESTWRL (0xb8 * 2) 179 #define TR_ESTWRH (0xb9 * 2) 180 #define TR_ESTCMD (0xba * 2) 181 #define TR_ESTCMD_ESTSEC_MASK GENMASK(2, 0) 182 #define TR_ESTCMD_ESTSEC_SHIFT 0 183 #define TR_ESTCMD_ESTARM BIT(4) 184 #define TR_ESTCMD_ESTSWCFG BIT(5) 185 #define TR_EETWRL (0xbb * 2) 186 #define TR_EETWRH (0xbc * 2) 187 #define TR_EETCMD (0xbd * 2) 188 #define TR_EETCMD_EETSEC_MASK GEMASK(2, 0) 189 #define TR_EETCMD_EETSEC_SHIFT 0 190 #define TR_EETCMD_EETARM BIT(4) 191 #define TR_CTWRL (0xbe * 2) 192 #define TR_CTWRH (0xbf * 2) 193 #define TR_LCNSL (0xc1 * 2) 194 #define TR_LCNSH (0xc2 * 2) 195 #define TR_LCS (0xc3 * 2) 196 #define TR_GCLDAT (0xc4 * 2) 197 #define TR_GCLDAT_GCLWRGATES_MASK GENMASK(7, 0) 198 #define TR_GCLDAT_GCLWRGATES_SHIFT 0 199 #define TR_GCLDAT_GCLWRLAST BIT(8) 200 #define TR_GCLDAT_GCLOVRI BIT(9) 201 #define TR_GCLTIL (0xc5 * 2) 202 #define TR_GCLTIH (0xc6 * 2) 203 #define TR_GCLCMD (0xc7 * 2) 204 #define TR_GCLCMD_GCLWRADR_MASK GENMASK(7, 0) 205 #define TR_GCLCMD_GCLWRADR_SHIFT 0 206 #define TR_GCLCMD_INIT_GATE_STATES_MASK GENMASK(15, 8) 207 #define TR_GCLCMD_INIT_GATE_STATES_SHIFT 8 208 209 struct hellcreek_counter { 210 u8 offset; 211 const char *name; 212 }; 213 214 struct hellcreek; 215 216 struct hellcreek_port { 217 struct hellcreek *hellcreek; 218 unsigned long *vlan_dev_bitmap; 219 int port; 220 u16 ptcfg; /* ptcfg shadow */ 221 u64 *counter_values; 222 }; 223 224 struct hellcreek_fdb_entry { 225 size_t idx; 226 unsigned char mac[ETH_ALEN]; 227 u8 portmask; 228 u8 age; 229 u8 is_obt; 230 u8 pass_blocked; 231 u8 is_static; 232 u8 reprio_tc; 233 u8 reprio_en; 234 }; 235 236 struct hellcreek { 237 const struct hellcreek_platform_data *pdata; 238 struct device *dev; 239 struct dsa_switch *ds; 240 struct hellcreek_port *ports; 241 struct mutex reg_lock; /* Switch IP register lock */ 242 struct mutex vlan_lock; /* VLAN bitmaps lock */ 243 void __iomem *base; 244 u16 swcfg; /* swcfg shadow */ 245 u8 *vidmbrcfg; /* vidmbrcfg shadow */ 246 size_t fdb_entries; 247 }; 248 249 #endif /* _HELLCREEK_H_ */ 250