Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: BSD-3-Clause */
  2/* Copyright (c) 2016-2018, NXP Semiconductors
  3 * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
  4 */
  5#ifndef _SJA1105_STATIC_CONFIG_H
  6#define _SJA1105_STATIC_CONFIG_H
  7
  8#include <linux/packing.h>
  9#include <linux/types.h>
 10#include <asm/types.h>
 11
 12#define SJA1105_SIZE_DEVICE_ID				4
 13#define SJA1105_SIZE_TABLE_HEADER			12
 14#define SJA1105_SIZE_SCHEDULE_ENTRY			8
 15#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	4
 16#define SJA1105_SIZE_L2_POLICING_ENTRY			8
 17#define SJA1105_SIZE_VLAN_LOOKUP_ENTRY			8
 18#define SJA1105_SIZE_L2_FORWARDING_ENTRY		8
 19#define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY		12
 20#define SJA1105_SIZE_XMII_PARAMS_ENTRY			4
 21#define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY		12
 22#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY	4
 23#define SJA1105ET_SIZE_L2_LOOKUP_ENTRY			12
 24#define SJA1105ET_SIZE_MAC_CONFIG_ENTRY			28
 25#define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY		4
 26#define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY		40
 27#define SJA1105ET_SIZE_AVB_PARAMS_ENTRY			12
 28#define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY		20
 29#define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY		32
 30#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY		16
 31#define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY		44
 32#define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY		16
 33
 34/* UM10944.pdf Page 11, Table 2. Configuration Blocks */
 35enum {
 36	BLKID_SCHEDULE					= 0x00,
 37	BLKID_SCHEDULE_ENTRY_POINTS			= 0x01,
 38	BLKID_L2_LOOKUP					= 0x05,
 39	BLKID_L2_POLICING				= 0x06,
 40	BLKID_VLAN_LOOKUP				= 0x07,
 41	BLKID_L2_FORWARDING				= 0x08,
 42	BLKID_MAC_CONFIG				= 0x09,
 43	BLKID_SCHEDULE_PARAMS				= 0x0A,
 44	BLKID_SCHEDULE_ENTRY_POINTS_PARAMS		= 0x0B,
 45	BLKID_L2_LOOKUP_PARAMS				= 0x0D,
 46	BLKID_L2_FORWARDING_PARAMS			= 0x0E,
 47	BLKID_AVB_PARAMS				= 0x10,
 48	BLKID_GENERAL_PARAMS				= 0x11,
 49	BLKID_XMII_PARAMS				= 0x4E,
 50};
 51
 52enum sja1105_blk_idx {
 53	BLK_IDX_SCHEDULE = 0,
 54	BLK_IDX_SCHEDULE_ENTRY_POINTS,
 55	BLK_IDX_L2_LOOKUP,
 56	BLK_IDX_L2_POLICING,
 57	BLK_IDX_VLAN_LOOKUP,
 58	BLK_IDX_L2_FORWARDING,
 59	BLK_IDX_MAC_CONFIG,
 60	BLK_IDX_SCHEDULE_PARAMS,
 61	BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,
 62	BLK_IDX_L2_LOOKUP_PARAMS,
 63	BLK_IDX_L2_FORWARDING_PARAMS,
 64	BLK_IDX_AVB_PARAMS,
 65	BLK_IDX_GENERAL_PARAMS,
 66	BLK_IDX_XMII_PARAMS,
 67	BLK_IDX_MAX,
 68	/* Fake block indices that are only valid for dynamic access */
 69	BLK_IDX_MGMT_ROUTE,
 70	BLK_IDX_MAX_DYN,
 71	BLK_IDX_INVAL = -1,
 72};
 73
 74#define SJA1105_MAX_SCHEDULE_COUNT			1024
 75#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT		2048
 76#define SJA1105_MAX_L2_LOOKUP_COUNT			1024
 77#define SJA1105_MAX_L2_POLICING_COUNT			45
 78#define SJA1105_MAX_VLAN_LOOKUP_COUNT			4096
 79#define SJA1105_MAX_L2_FORWARDING_COUNT			13
 80#define SJA1105_MAX_MAC_CONFIG_COUNT			5
 81#define SJA1105_MAX_SCHEDULE_PARAMS_COUNT		1
 82#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT	1
 83#define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT		1
 84#define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT		1
 85#define SJA1105_MAX_GENERAL_PARAMS_COUNT		1
 86#define SJA1105_MAX_XMII_PARAMS_COUNT			1
 87#define SJA1105_MAX_AVB_PARAMS_COUNT			1
 88
 89#define SJA1105_MAX_FRAME_MEMORY			929
 90
 91#define SJA1105E_DEVICE_ID				0x9C00000Cull
 92#define SJA1105T_DEVICE_ID				0x9E00030Eull
 93#define SJA1105PR_DEVICE_ID				0xAF00030Eull
 94#define SJA1105QS_DEVICE_ID				0xAE00030Eull
 95
 96#define SJA1105ET_PART_NO				0x9A83
 97#define SJA1105P_PART_NO				0x9A84
 98#define SJA1105Q_PART_NO				0x9A85
 99#define SJA1105R_PART_NO				0x9A86
100#define SJA1105S_PART_NO				0x9A87
101
102struct sja1105_schedule_entry {
103	u64 winstindex;
104	u64 winend;
105	u64 winst;
106	u64 destports;
107	u64 setvalid;
108	u64 txen;
109	u64 resmedia_en;
110	u64 resmedia;
111	u64 vlindex;
112	u64 delta;
113};
114
115struct sja1105_schedule_params_entry {
116	u64 subscheind[8];
117};
118
119struct sja1105_general_params_entry {
120	u64 vllupformat;
121	u64 mirr_ptacu;
122	u64 switchid;
123	u64 hostprio;
124	u64 mac_fltres1;
125	u64 mac_fltres0;
126	u64 mac_flt1;
127	u64 mac_flt0;
128	u64 incl_srcpt1;
129	u64 incl_srcpt0;
130	u64 send_meta1;
131	u64 send_meta0;
132	u64 casc_port;
133	u64 host_port;
134	u64 mirr_port;
135	u64 vlmarker;
136	u64 vlmask;
137	u64 tpid;
138	u64 ignore2stf;
139	u64 tpid2;
140	/* P/Q/R/S only */
141	u64 queue_ts;
142	u64 egrmirrvid;
143	u64 egrmirrpcp;
144	u64 egrmirrdei;
145	u64 replay_port;
146};
147
148struct sja1105_schedule_entry_points_entry {
149	u64 subschindx;
150	u64 delta;
151	u64 address;
152};
153
154struct sja1105_schedule_entry_points_params_entry {
155	u64 clksrc;
156	u64 actsubsch;
157};
158
159struct sja1105_vlan_lookup_entry {
160	u64 ving_mirr;
161	u64 vegr_mirr;
162	u64 vmemb_port;
163	u64 vlan_bc;
164	u64 tag_port;
165	u64 vlanid;
166};
167
168struct sja1105_l2_lookup_entry {
169	u64 vlanid;
170	u64 macaddr;
171	u64 destports;
172	u64 enfport;
173	u64 index;
174	/* P/Q/R/S only */
175	u64 mask_iotag;
176	u64 mask_vlanid;
177	u64 mask_macaddr;
178	u64 iotag;
179	u64 lockeds;
180	union {
181		/* LOCKEDS=1: Static FDB entries */
182		struct {
183			u64 tsreg;
184			u64 mirrvlan;
185			u64 takets;
186			u64 mirr;
187			u64 retag;
188		};
189		/* LOCKEDS=0: Dynamically learned FDB entries */
190		struct {
191			u64 touched;
192			u64 age;
193		};
194	};
195};
196
197struct sja1105_l2_lookup_params_entry {
198	u64 maxaddrp[5];     /* P/Q/R/S only */
199	u64 start_dynspc;    /* P/Q/R/S only */
200	u64 drpnolearn;      /* P/Q/R/S only */
201	u64 use_static;      /* P/Q/R/S only */
202	u64 owr_dyn;         /* P/Q/R/S only */
203	u64 learn_once;      /* P/Q/R/S only */
204	u64 maxage;          /* Shared */
205	u64 dyn_tbsz;        /* E/T only */
206	u64 poly;            /* E/T only */
207	u64 shared_learn;    /* Shared */
208	u64 no_enf_hostprt;  /* Shared */
209	u64 no_mgmt_learn;   /* Shared */
210};
211
212struct sja1105_l2_forwarding_entry {
213	u64 bc_domain;
214	u64 reach_port;
215	u64 fl_domain;
216	u64 vlan_pmap[8];
217};
218
219struct sja1105_l2_forwarding_params_entry {
220	u64 max_dynp;
221	u64 part_spc[8];
222};
223
224struct sja1105_l2_policing_entry {
225	u64 sharindx;
226	u64 smax;
227	u64 rate;
228	u64 maxlen;
229	u64 partition;
230};
231
232struct sja1105_avb_params_entry {
233	u64 destmeta;
234	u64 srcmeta;
235};
236
237struct sja1105_mac_config_entry {
238	u64 top[8];
239	u64 base[8];
240	u64 enabled[8];
241	u64 ifg;
242	u64 speed;
243	u64 tp_delin;
244	u64 tp_delout;
245	u64 maxage;
246	u64 vlanprio;
247	u64 vlanid;
248	u64 ing_mirr;
249	u64 egr_mirr;
250	u64 drpnona664;
251	u64 drpdtag;
252	u64 drpuntag;
253	u64 retag;
254	u64 dyn_learn;
255	u64 egress;
256	u64 ingress;
257};
258
259struct sja1105_xmii_params_entry {
260	u64 phy_mac[5];
261	u64 xmii_mode[5];
262};
263
264struct sja1105_table_header {
265	u64 block_id;
266	u64 len;
267	u64 crc;
268};
269
270struct sja1105_table_ops {
271	size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
272	size_t unpacked_entry_size;
273	size_t packed_entry_size;
274	size_t max_entry_count;
275};
276
277struct sja1105_table {
278	const struct sja1105_table_ops *ops;
279	size_t entry_count;
280	void *entries;
281};
282
283struct sja1105_static_config {
284	u64 device_id;
285	struct sja1105_table tables[BLK_IDX_MAX];
286};
287
288extern struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
289extern struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
290extern struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
291extern struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
292extern struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
293extern struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
294
295size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
296void
297sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
298size_t
299sja1105_static_config_get_length(const struct sja1105_static_config *config);
300
301typedef enum {
302	SJA1105_CONFIG_OK = 0,
303	SJA1105_TTETHERNET_NOT_SUPPORTED,
304	SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,
305	SJA1105_MISSING_L2_POLICING_TABLE,
306	SJA1105_MISSING_L2_FORWARDING_TABLE,
307	SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
308	SJA1105_MISSING_GENERAL_PARAMS_TABLE,
309	SJA1105_MISSING_VLAN_TABLE,
310	SJA1105_MISSING_XMII_TABLE,
311	SJA1105_MISSING_MAC_TABLE,
312	SJA1105_OVERCOMMITTED_FRAME_MEMORY,
313} sja1105_config_valid_t;
314
315extern const char *sja1105_static_config_error_msg[];
316
317sja1105_config_valid_t
318sja1105_static_config_check_valid(const struct sja1105_static_config *config);
319void
320sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
321int sja1105_static_config_init(struct sja1105_static_config *config,
322			       const struct sja1105_table_ops *static_ops,
323			       u64 device_id);
324void sja1105_static_config_free(struct sja1105_static_config *config);
325
326int sja1105_table_delete_entry(struct sja1105_table *table, int i);
327int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
328
329u32 sja1105_crc32(const void *buf, size_t len);
330
331void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
332void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
333void sja1105_packing(void *buf, u64 *val, int start, int end,
334		     size_t len, enum packing_op op);
335
336#endif