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