xref: /linux/drivers/net/ethernet/ti/icssm/icssm_switch.h (revision 55a42f78ffd386e01a5404419f8c5ded7db70a21)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 /* Copyright (C) 2015-2021 Texas Instruments Incorporated - https://www.ti.com
4  */
5 
6 #ifndef __ICSS_SWITCH_H
7 #define __ICSS_SWITCH_H
8 
9 /* Basic Switch Parameters
10  * Used to auto compute offset addresses on L3 OCMC RAM. Do not modify these
11  * without changing firmware accordingly
12  */
13 #define SWITCH_BUFFER_SIZE	(64 * 1024)	/* L3 buffer */
14 #define ICSS_BLOCK_SIZE		32		/* data bytes per BD */
15 #define BD_SIZE			4		/* byte buffer descriptor */
16 #define NUM_QUEUES		4		/* Queues on Port 0/1/2 */
17 
18 #define PORT_LINK_MASK		0x1
19 #define PORT_IS_HD_MASK		0x2
20 
21 /* Physical Port queue size (number of BDs). Same for both ports */
22 #define QUEUE_1_SIZE		97	/* Network Management high */
23 #define QUEUE_2_SIZE		97	/* Network Management low */
24 #define QUEUE_3_SIZE		97	/* Protocol specific */
25 #define QUEUE_4_SIZE		97	/* NRT (IP,ARP, ICMP) */
26 
27 /* Host queue size (number of BDs). Each BD points to data buffer of 32 bytes.
28  * HOST PORT QUEUES can buffer up to 4 full sized frames per queue
29  */
30 #define	HOST_QUEUE_1_SIZE	194	/* Protocol and VLAN priority 7 & 6 */
31 #define HOST_QUEUE_2_SIZE	194	/* Protocol mid */
32 #define HOST_QUEUE_3_SIZE	194	/* Protocol low */
33 #define HOST_QUEUE_4_SIZE	194	/* NRT (IP, ARP, ICMP) */
34 
35 #define COL_QUEUE_SIZE		0
36 
37 /* NRT Buffer descriptor definition
38  * Each buffer descriptor points to a max 32 byte block and has 32 bit in size
39  * to have atomic operation.
40  * PRU can address bytewise into memory.
41  * Definition of 32 bit descriptor is as follows
42  *
43  * Bits		Name			Meaning
44  * =============================================================================
45  * 0..7		Index		points to index in buffer queue, max 256 x 32
46  *				byte blocks can be addressed
47  * 6		LookupSuccess	For switch, FDB lookup was successful (source
48  *				MAC address found in FDB).
49  *				For RED, NodeTable lookup was successful.
50  * 7		Flood		Packet should be flooded (destination MAC
51  *				address found in FDB). For switch only.
52  * 8..12	Block_length	number of valid bytes in this specific block.
53  *				Will be <=32 bytes on last block of packet
54  * 13		More		"More" bit indicating that there are more blocks
55  * 14		Shadow		indicates that "index" is pointing into shadow
56  *				buffer
57  * 15		TimeStamp	indicates that this packet has time stamp in
58  *				separate buffer - only needed if PTP runs on
59  *				host
60  * 16..17	Port		different meaning for ingress and egress,
61  *				Ingress: Port = 0 indicates phy port 1 and
62  *				Port = 1 indicates phy port 2.
63  *				Egress: 0 sends on phy port 1 and 1 sends on
64  *				phy port 2. Port = 2 goes over MAC table
65  *				look-up
66  * 18..28	Length		11 bit of total packet length which is put into
67  *				first BD only so that host access only one BD
68  * 29		VlanTag		indicates that packet has Length/Type field of
69  *				0x08100 with VLAN tag in following byte
70  * 30		Broadcast	indicates that packet goes out on both physical
71  *				ports,	there will be two bd but only one buffer
72  * 31		Error		indicates there was an error in the packet
73  */
74 #define PRUETH_BD_START_FLAG_MASK	BIT(0)
75 #define PRUETH_BD_START_FLAG_SHIFT	0
76 
77 #define PRUETH_BD_HSR_FRAME_MASK	BIT(4)
78 #define PRUETH_BD_HSR_FRAME_SHIFT	4
79 
80 #define PRUETH_BD_SUP_HSR_FRAME_MASK	BIT(5)
81 #define PRUETH_BD_SUP_HSR_FRAME_SHIFT	5
82 
83 #define PRUETH_BD_LOOKUP_SUCCESS_MASK	BIT(6)
84 #define PRUETH_BD_LOOKUP_SUCCESS_SHIFT	6
85 
86 #define PRUETH_BD_SW_FLOOD_MASK		BIT(7)
87 #define PRUETH_BD_SW_FLOOD_SHIFT	7
88 
89 #define	PRUETH_BD_SHADOW_MASK		BIT(14)
90 #define	PRUETH_BD_SHADOW_SHIFT		14
91 
92 #define PRUETH_BD_TIMESTAMP_MASK	BIT(15)
93 #define PRUETH_BD_TIMESTAMP_SHIFT	15
94 
95 #define PRUETH_BD_PORT_MASK		GENMASK(17, 16)
96 #define PRUETH_BD_PORT_SHIFT		16
97 
98 #define PRUETH_BD_LENGTH_MASK		GENMASK(28, 18)
99 #define PRUETH_BD_LENGTH_SHIFT		18
100 
101 #define PRUETH_BD_BROADCAST_MASK	BIT(30)
102 #define PRUETH_BD_BROADCAST_SHIFT	30
103 
104 #define PRUETH_BD_ERROR_MASK		BIT(31)
105 #define PRUETH_BD_ERROR_SHIFT		31
106 
107 /* The following offsets indicate which sections of the memory are used
108  * for EMAC internal tasks
109  */
110 #define DRAM_START_OFFSET		0x1E98
111 #define SRAM_START_OFFSET		0x400
112 
113 /* General Purpose Statistics
114  * These are present on both PRU0 and PRU1 DRAM
115  */
116 /* base statistics offset */
117 #define STATISTICS_OFFSET	0x1F00
118 #define STAT_SIZE		0x98
119 
120 /* Offset for storing
121  * 1. Storm Prevention Params
122  * 2. PHY Speed Offset
123  * 3. Port Status Offset
124  * These are present on both PRU0 and PRU1
125  */
126 /* 4 bytes */
127 #define STORM_PREVENTION_OFFSET_BC	(STATISTICS_OFFSET + STAT_SIZE)
128 /* 4 bytes */
129 #define PHY_SPEED_OFFSET		(STATISTICS_OFFSET + STAT_SIZE + 4)
130 /* 1 byte */
131 #define PORT_STATUS_OFFSET		(STATISTICS_OFFSET + STAT_SIZE + 8)
132 /* 1 byte */
133 #define COLLISION_COUNTER		(STATISTICS_OFFSET + STAT_SIZE + 9)
134 /* 4 bytes */
135 #define RX_PKT_SIZE_OFFSET		(STATISTICS_OFFSET + STAT_SIZE + 10)
136 /* 4 bytes */
137 #define PORT_CONTROL_ADDR		(STATISTICS_OFFSET + STAT_SIZE + 14)
138 /* 6 bytes */
139 #define PORT_MAC_ADDR			(STATISTICS_OFFSET + STAT_SIZE + 18)
140 /* 1 byte */
141 #define RX_INT_STATUS_OFFSET		(STATISTICS_OFFSET + STAT_SIZE + 24)
142 /* 4 bytes */
143 #define STORM_PREVENTION_OFFSET_MC	(STATISTICS_OFFSET + STAT_SIZE + 25)
144 /* 4 bytes */
145 #define STORM_PREVENTION_OFFSET_UC	(STATISTICS_OFFSET + STAT_SIZE + 29)
146 /* 4 bytes ? */
147 #define STP_INVALID_STATE_OFFSET	(STATISTICS_OFFSET + STAT_SIZE + 33)
148 
149 /* DRAM Offsets for EMAC
150  * Present on Both DRAM0 and DRAM1
151  */
152 
153 /* 4 queue descriptors for port tx = 32 bytes */
154 #define TX_CONTEXT_Q1_OFFSET_ADDR	(PORT_QUEUE_DESC_OFFSET + 32)
155 #define PORT_QUEUE_DESC_OFFSET	(ICSS_EMAC_TTS_CYC_TX_SOF + 8)
156 
157 /* EMAC Time Triggered Send Offsets */
158 #define ICSS_EMAC_TTS_CYC_TX_SOF	(ICSS_EMAC_TTS_PREV_TX_SOF + 8)
159 #define ICSS_EMAC_TTS_PREV_TX_SOF	\
160 	(ICSS_EMAC_TTS_MISSED_CYCLE_CNT_OFFSET	+ 4)
161 #define ICSS_EMAC_TTS_MISSED_CYCLE_CNT_OFFSET	(ICSS_EMAC_TTS_STATUS_OFFSET \
162 						 + 4)
163 #define ICSS_EMAC_TTS_STATUS_OFFSET	(ICSS_EMAC_TTS_CFG_TIME_OFFSET + 4)
164 #define ICSS_EMAC_TTS_CFG_TIME_OFFSET	(ICSS_EMAC_TTS_CYCLE_PERIOD_OFFSET + 4)
165 #define ICSS_EMAC_TTS_CYCLE_PERIOD_OFFSET	\
166 	(ICSS_EMAC_TTS_CYCLE_START_OFFSET + 8)
167 #define ICSS_EMAC_TTS_CYCLE_START_OFFSET	ICSS_EMAC_TTS_BASE_OFFSET
168 #define ICSS_EMAC_TTS_BASE_OFFSET	DRAM_START_OFFSET
169 
170 /* Shared RAM offsets for EMAC */
171 
172 /* Queue Descriptors */
173 
174 /* 4 queue descriptors for port 0 (host receive). 32 bytes */
175 #define HOST_QUEUE_DESC_OFFSET		(HOST_QUEUE_SIZE_ADDR + 16)
176 
177 /* table offset for queue size:
178  * 3 ports * 4 Queues * 1 byte offset = 12 bytes
179  */
180 #define HOST_QUEUE_SIZE_ADDR		(HOST_QUEUE_OFFSET_ADDR + 8)
181 /* table offset for queue:
182  * 4 Queues * 2 byte offset = 8 bytes
183  */
184 #define HOST_QUEUE_OFFSET_ADDR		(HOST_QUEUE_DESCRIPTOR_OFFSET_ADDR + 8)
185 /* table offset for Host queue descriptors:
186  * 1 ports * 4 Queues * 2 byte offset = 8 bytes
187  */
188 #define HOST_QUEUE_DESCRIPTOR_OFFSET_ADDR	(HOST_Q4_RX_CONTEXT_OFFSET + 8)
189 
190 /* Host Port Rx Context */
191 #define HOST_Q4_RX_CONTEXT_OFFSET	(HOST_Q3_RX_CONTEXT_OFFSET + 8)
192 #define HOST_Q3_RX_CONTEXT_OFFSET	(HOST_Q2_RX_CONTEXT_OFFSET + 8)
193 #define HOST_Q2_RX_CONTEXT_OFFSET	(HOST_Q1_RX_CONTEXT_OFFSET + 8)
194 #define HOST_Q1_RX_CONTEXT_OFFSET	(EMAC_PROMISCUOUS_MODE_OFFSET + 4)
195 
196 /* Promiscuous mode control */
197 #define EMAC_P1_PROMISCUOUS_BIT		BIT(0)
198 #define EMAC_P2_PROMISCUOUS_BIT		BIT(1)
199 #define EMAC_PROMISCUOUS_MODE_OFFSET	(EMAC_RESERVED + 4)
200 #define EMAC_RESERVED			EOF_48K_BUFFER_BD
201 
202 /* allow for max 48k buffer which spans the descriptors up to 0x1800 6kB */
203 #define EOF_48K_BUFFER_BD	(P0_BUFFER_DESC_OFFSET + HOST_BD_SIZE + \
204 				 PORT_BD_SIZE)
205 
206 #define HOST_BD_SIZE		((HOST_QUEUE_1_SIZE +	\
207 				  HOST_QUEUE_2_SIZE + HOST_QUEUE_3_SIZE + \
208 				  HOST_QUEUE_4_SIZE) * BD_SIZE)
209 #define PORT_BD_SIZE		((QUEUE_1_SIZE + QUEUE_2_SIZE +	\
210 				  QUEUE_3_SIZE + QUEUE_4_SIZE) * 2 * BD_SIZE)
211 
212 #define END_OF_BD_POOL		(P2_Q4_BD_OFFSET + QUEUE_4_SIZE * BD_SIZE)
213 #define P2_Q4_BD_OFFSET		(P2_Q3_BD_OFFSET + QUEUE_3_SIZE * BD_SIZE)
214 #define P2_Q3_BD_OFFSET		(P2_Q2_BD_OFFSET + QUEUE_2_SIZE * BD_SIZE)
215 #define P2_Q2_BD_OFFSET		(P2_Q1_BD_OFFSET + QUEUE_1_SIZE * BD_SIZE)
216 #define P2_Q1_BD_OFFSET		(P1_Q4_BD_OFFSET + QUEUE_4_SIZE * BD_SIZE)
217 #define P1_Q4_BD_OFFSET		(P1_Q3_BD_OFFSET + QUEUE_3_SIZE * BD_SIZE)
218 #define P1_Q3_BD_OFFSET		(P1_Q2_BD_OFFSET + QUEUE_2_SIZE * BD_SIZE)
219 #define P1_Q2_BD_OFFSET		(P1_Q1_BD_OFFSET + QUEUE_1_SIZE * BD_SIZE)
220 #define P1_Q1_BD_OFFSET		(P0_Q4_BD_OFFSET + HOST_QUEUE_4_SIZE * BD_SIZE)
221 #define P0_Q4_BD_OFFSET		(P0_Q3_BD_OFFSET + HOST_QUEUE_3_SIZE * BD_SIZE)
222 #define P0_Q3_BD_OFFSET		(P0_Q2_BD_OFFSET + HOST_QUEUE_2_SIZE * BD_SIZE)
223 #define P0_Q2_BD_OFFSET		(P0_Q1_BD_OFFSET + HOST_QUEUE_1_SIZE * BD_SIZE)
224 #define P0_Q1_BD_OFFSET		P0_BUFFER_DESC_OFFSET
225 #define P0_BUFFER_DESC_OFFSET	SRAM_START_OFFSET
226 
227 /* Memory Usage of L3 OCMC RAM */
228 
229 /* L3 64KB Memory - mainly buffer Pool */
230 #define END_OF_BUFFER_POOL	(P2_Q4_BUFFER_OFFSET + QUEUE_4_SIZE *	\
231 				 ICSS_BLOCK_SIZE)
232 #define P2_Q4_BUFFER_OFFSET	(P2_Q3_BUFFER_OFFSET + QUEUE_3_SIZE *	\
233 				 ICSS_BLOCK_SIZE)
234 #define P2_Q3_BUFFER_OFFSET	(P2_Q2_BUFFER_OFFSET + QUEUE_2_SIZE *	\
235 				 ICSS_BLOCK_SIZE)
236 #define P2_Q2_BUFFER_OFFSET	(P2_Q1_BUFFER_OFFSET + QUEUE_1_SIZE *	\
237 				 ICSS_BLOCK_SIZE)
238 #define P2_Q1_BUFFER_OFFSET	(P1_Q4_BUFFER_OFFSET + QUEUE_4_SIZE *	\
239 				 ICSS_BLOCK_SIZE)
240 #define P1_Q4_BUFFER_OFFSET	(P1_Q3_BUFFER_OFFSET + QUEUE_3_SIZE *	\
241 				 ICSS_BLOCK_SIZE)
242 #define P1_Q3_BUFFER_OFFSET	(P1_Q2_BUFFER_OFFSET + QUEUE_2_SIZE *	\
243 				 ICSS_BLOCK_SIZE)
244 #define P1_Q2_BUFFER_OFFSET	(P1_Q1_BUFFER_OFFSET + QUEUE_1_SIZE *	\
245 				 ICSS_BLOCK_SIZE)
246 #define P1_Q1_BUFFER_OFFSET	(P0_Q4_BUFFER_OFFSET + HOST_QUEUE_4_SIZE * \
247 				 ICSS_BLOCK_SIZE)
248 #define P0_Q4_BUFFER_OFFSET	(P0_Q3_BUFFER_OFFSET + HOST_QUEUE_3_SIZE * \
249 				 ICSS_BLOCK_SIZE)
250 #define P0_Q3_BUFFER_OFFSET	(P0_Q2_BUFFER_OFFSET + HOST_QUEUE_2_SIZE * \
251 				 ICSS_BLOCK_SIZE)
252 #define P0_Q2_BUFFER_OFFSET	(P0_Q1_BUFFER_OFFSET + HOST_QUEUE_1_SIZE * \
253 				 ICSS_BLOCK_SIZE)
254 #define P0_COL_BUFFER_OFFSET	0xEE00
255 #define P0_Q1_BUFFER_OFFSET	0x0000
256 
257 #endif /* __ICSS_SWITCH_H */
258