File Index
Files and directories
Sign in
FILE

icssm_switch.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/ti/icssm/icssm_switch.h C
  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 */
~/ Read-only file preview.