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_VL_LOOKUP_ENTRY			12
 17#define SJA1105_SIZE_VL_POLICING_ENTRY			8
 18#define SJA1105_SIZE_VL_FORWARDING_ENTRY		4
 19#define SJA1105_SIZE_L2_POLICING_ENTRY			8
 20#define SJA1105_SIZE_VLAN_LOOKUP_ENTRY			8
 21#define SJA1105_SIZE_L2_FORWARDING_ENTRY		8
 22#define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY		12
 23#define SJA1105_SIZE_RETAGGING_ENTRY			8
 24#define SJA1105_SIZE_XMII_PARAMS_ENTRY			4
 25#define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY		12
 26#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY	4
 27#define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY         12
 28#define SJA1105ET_SIZE_L2_LOOKUP_ENTRY			12
 29#define SJA1105ET_SIZE_MAC_CONFIG_ENTRY			28
 30#define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY		4
 31#define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY		40
 32#define SJA1105ET_SIZE_AVB_PARAMS_ENTRY			12
 33#define SJA1105ET_SIZE_CBS_ENTRY			16
 34#define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY		20
 35#define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY		32
 36#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY		16
 37#define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY		44
 38#define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY		16
 39#define SJA1105PQRS_SIZE_CBS_ENTRY			20
 40
 41/* UM10944.pdf Page 11, Table 2. Configuration Blocks */
 42enum {
 43	BLKID_SCHEDULE					= 0x00,
 44	BLKID_SCHEDULE_ENTRY_POINTS			= 0x01,
 45	BLKID_VL_LOOKUP					= 0x02,
 46	BLKID_VL_POLICING				= 0x03,
 47	BLKID_VL_FORWARDING				= 0x04,
 48	BLKID_L2_LOOKUP					= 0x05,
 49	BLKID_L2_POLICING				= 0x06,
 50	BLKID_VLAN_LOOKUP				= 0x07,
 51	BLKID_L2_FORWARDING				= 0x08,
 52	BLKID_MAC_CONFIG				= 0x09,
 53	BLKID_SCHEDULE_PARAMS				= 0x0A,
 54	BLKID_SCHEDULE_ENTRY_POINTS_PARAMS		= 0x0B,
 55	BLKID_VL_FORWARDING_PARAMS			= 0x0C,
 56	BLKID_L2_LOOKUP_PARAMS				= 0x0D,
 57	BLKID_L2_FORWARDING_PARAMS			= 0x0E,
 58	BLKID_AVB_PARAMS				= 0x10,
 59	BLKID_GENERAL_PARAMS				= 0x11,
 60	BLKID_RETAGGING					= 0x12,
 61	BLKID_CBS					= 0x13,
 62	BLKID_XMII_PARAMS				= 0x4E,
 63};
 64
 65enum sja1105_blk_idx {
 66	BLK_IDX_SCHEDULE = 0,
 67	BLK_IDX_SCHEDULE_ENTRY_POINTS,
 68	BLK_IDX_VL_LOOKUP,
 69	BLK_IDX_VL_POLICING,
 70	BLK_IDX_VL_FORWARDING,
 71	BLK_IDX_L2_LOOKUP,
 72	BLK_IDX_L2_POLICING,
 73	BLK_IDX_VLAN_LOOKUP,
 74	BLK_IDX_L2_FORWARDING,
 75	BLK_IDX_MAC_CONFIG,
 76	BLK_IDX_SCHEDULE_PARAMS,
 77	BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,
 78	BLK_IDX_VL_FORWARDING_PARAMS,
 79	BLK_IDX_L2_LOOKUP_PARAMS,
 80	BLK_IDX_L2_FORWARDING_PARAMS,
 81	BLK_IDX_AVB_PARAMS,
 82	BLK_IDX_GENERAL_PARAMS,
 83	BLK_IDX_RETAGGING,
 84	BLK_IDX_CBS,
 85	BLK_IDX_XMII_PARAMS,
 86	BLK_IDX_MAX,
 87	/* Fake block indices that are only valid for dynamic access */
 88	BLK_IDX_MGMT_ROUTE,
 89	BLK_IDX_MAX_DYN,
 90	BLK_IDX_INVAL = -1,
 91};
 92
 93#define SJA1105_MAX_SCHEDULE_COUNT			1024
 94#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT		2048
 95#define SJA1105_MAX_VL_LOOKUP_COUNT			1024
 96#define SJA1105_MAX_VL_POLICING_COUNT			1024
 97#define SJA1105_MAX_VL_FORWARDING_COUNT			1024
 98#define SJA1105_MAX_L2_LOOKUP_COUNT			1024
 99#define SJA1105_MAX_L2_POLICING_COUNT			45
100#define SJA1105_MAX_VLAN_LOOKUP_COUNT			4096
101#define SJA1105_MAX_L2_FORWARDING_COUNT			13
102#define SJA1105_MAX_MAC_CONFIG_COUNT			5
103#define SJA1105_MAX_SCHEDULE_PARAMS_COUNT		1
104#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT	1
105#define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT		1
106#define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT		1
107#define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT		1
108#define SJA1105_MAX_GENERAL_PARAMS_COUNT		1
109#define SJA1105_MAX_RETAGGING_COUNT			32
110#define SJA1105_MAX_XMII_PARAMS_COUNT			1
111#define SJA1105_MAX_AVB_PARAMS_COUNT			1
112#define SJA1105ET_MAX_CBS_COUNT				10
113#define SJA1105PQRS_MAX_CBS_COUNT			16
114
115#define SJA1105_MAX_FRAME_MEMORY			929
116#define SJA1105_MAX_FRAME_MEMORY_RETAGGING		910
117#define SJA1105_VL_FRAME_MEMORY				100
118
119#define SJA1105E_DEVICE_ID				0x9C00000Cull
120#define SJA1105T_DEVICE_ID				0x9E00030Eull
121#define SJA1105PR_DEVICE_ID				0xAF00030Eull
122#define SJA1105QS_DEVICE_ID				0xAE00030Eull
123
124#define SJA1105ET_PART_NO				0x9A83
125#define SJA1105P_PART_NO				0x9A84
126#define SJA1105Q_PART_NO				0x9A85
127#define SJA1105R_PART_NO				0x9A86
128#define SJA1105S_PART_NO				0x9A87
129
130struct sja1105_schedule_entry {
131	u64 winstindex;
132	u64 winend;
133	u64 winst;
134	u64 destports;
135	u64 setvalid;
136	u64 txen;
137	u64 resmedia_en;
138	u64 resmedia;
139	u64 vlindex;
140	u64 delta;
141};
142
143struct sja1105_schedule_params_entry {
144	u64 subscheind[8];
145};
146
147struct sja1105_general_params_entry {
148	u64 vllupformat;
149	u64 mirr_ptacu;
150	u64 switchid;
151	u64 hostprio;
152	u64 mac_fltres1;
153	u64 mac_fltres0;
154	u64 mac_flt1;
155	u64 mac_flt0;
156	u64 incl_srcpt1;
157	u64 incl_srcpt0;
158	u64 send_meta1;
159	u64 send_meta0;
160	u64 casc_port;
161	u64 host_port;
162	u64 mirr_port;
163	u64 vlmarker;
164	u64 vlmask;
165	u64 tpid;
166	u64 ignore2stf;
167	u64 tpid2;
168	/* P/Q/R/S only */
169	u64 queue_ts;
170	u64 egrmirrvid;
171	u64 egrmirrpcp;
172	u64 egrmirrdei;
173	u64 replay_port;
174};
175
176struct sja1105_schedule_entry_points_entry {
177	u64 subschindx;
178	u64 delta;
179	u64 address;
180};
181
182struct sja1105_schedule_entry_points_params_entry {
183	u64 clksrc;
184	u64 actsubsch;
185};
186
187struct sja1105_vlan_lookup_entry {
188	u64 ving_mirr;
189	u64 vegr_mirr;
190	u64 vmemb_port;
191	u64 vlan_bc;
192	u64 tag_port;
193	u64 vlanid;
194};
195
196struct sja1105_l2_lookup_entry {
197	u64 vlanid;
198	u64 macaddr;
199	u64 destports;
200	u64 enfport;
201	u64 index;
202	/* P/Q/R/S only */
203	u64 mask_iotag;
204	u64 mask_vlanid;
205	u64 mask_macaddr;
206	u64 iotag;
207	u64 lockeds;
208	union {
209		/* LOCKEDS=1: Static FDB entries */
210		struct {
211			u64 tsreg;
212			u64 mirrvlan;
213			u64 takets;
214			u64 mirr;
215			u64 retag;
216		};
217		/* LOCKEDS=0: Dynamically learned FDB entries */
218		struct {
219			u64 touched;
220			u64 age;
221		};
222	};
223};
224
225struct sja1105_l2_lookup_params_entry {
226	u64 maxaddrp[5];     /* P/Q/R/S only */
227	u64 start_dynspc;    /* P/Q/R/S only */
228	u64 drpnolearn;      /* P/Q/R/S only */
229	u64 use_static;      /* P/Q/R/S only */
230	u64 owr_dyn;         /* P/Q/R/S only */
231	u64 learn_once;      /* P/Q/R/S only */
232	u64 maxage;          /* Shared */
233	u64 dyn_tbsz;        /* E/T only */
234	u64 poly;            /* E/T only */
235	u64 shared_learn;    /* Shared */
236	u64 no_enf_hostprt;  /* Shared */
237	u64 no_mgmt_learn;   /* Shared */
238};
239
240struct sja1105_l2_forwarding_entry {
241	u64 bc_domain;
242	u64 reach_port;
243	u64 fl_domain;
244	u64 vlan_pmap[8];
245};
246
247struct sja1105_l2_forwarding_params_entry {
248	u64 max_dynp;
249	u64 part_spc[8];
250};
251
252struct sja1105_l2_policing_entry {
253	u64 sharindx;
254	u64 smax;
255	u64 rate;
256	u64 maxlen;
257	u64 partition;
258};
259
260struct sja1105_avb_params_entry {
261	u64 cas_master;
262	u64 destmeta;
263	u64 srcmeta;
264};
265
266struct sja1105_mac_config_entry {
267	u64 top[8];
268	u64 base[8];
269	u64 enabled[8];
270	u64 ifg;
271	u64 speed;
272	u64 tp_delin;
273	u64 tp_delout;
274	u64 maxage;
275	u64 vlanprio;
276	u64 vlanid;
277	u64 ing_mirr;
278	u64 egr_mirr;
279	u64 drpnona664;
280	u64 drpdtag;
281	u64 drpuntag;
282	u64 retag;
283	u64 dyn_learn;
284	u64 egress;
285	u64 ingress;
286};
287
288struct sja1105_retagging_entry {
289	u64 egr_port;
290	u64 ing_port;
291	u64 vlan_ing;
292	u64 vlan_egr;
293	u64 do_not_learn;
294	u64 use_dest_ports;
295	u64 destports;
296};
297
298struct sja1105_cbs_entry {
299	u64 port;
300	u64 prio;
301	u64 credit_hi;
302	u64 credit_lo;
303	u64 send_slope;
304	u64 idle_slope;
305};
306
307struct sja1105_xmii_params_entry {
308	u64 phy_mac[5];
309	u64 xmii_mode[5];
310};
311
312enum {
313	SJA1105_VL_FORMAT_PSFP		= 0,
314	SJA1105_VL_FORMAT_ARINC664	= 1,
315};
316
317struct sja1105_vl_lookup_entry {
318	u64 format;
319	u64 port;
320	union {
321		/* SJA1105_VL_FORMAT_PSFP */
322		struct {
323			u64 destports;
324			u64 iscritical;
325			u64 macaddr;
326			u64 vlanid;
327			u64 vlanprior;
328		};
329		/* SJA1105_VL_FORMAT_ARINC664 */
330		struct {
331			u64 egrmirr;
332			u64 ingrmirr;
333			u64 vlid;
334		};
335	};
336	/* Not part of hardware structure */
337	unsigned long flow_cookie;
338};
339
340struct sja1105_vl_policing_entry {
341	u64 type;
342	u64 maxlen;
343	u64 sharindx;
344	u64 bag;
345	u64 jitter;
346};
347
348struct sja1105_vl_forwarding_entry {
349	u64 type;
350	u64 priority;
351	u64 partition;
352	u64 destports;
353};
354
355struct sja1105_vl_forwarding_params_entry {
356	u64 partspc[8];
357	u64 debugen;
358};
359
360struct sja1105_table_header {
361	u64 block_id;
362	u64 len;
363	u64 crc;
364};
365
366struct sja1105_table_ops {
367	size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
368	size_t unpacked_entry_size;
369	size_t packed_entry_size;
370	size_t max_entry_count;
371};
372
373struct sja1105_table {
374	const struct sja1105_table_ops *ops;
375	size_t entry_count;
376	void *entries;
377};
378
379struct sja1105_static_config {
380	u64 device_id;
381	struct sja1105_table tables[BLK_IDX_MAX];
382};
383
384extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
385extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
386extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
387extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
388extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
389extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
390
391size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
392void
393sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
394size_t
395sja1105_static_config_get_length(const struct sja1105_static_config *config);
396
397typedef enum {
398	SJA1105_CONFIG_OK = 0,
399	SJA1105_TTETHERNET_NOT_SUPPORTED,
400	SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,
401	SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION,
402	SJA1105_MISSING_L2_POLICING_TABLE,
403	SJA1105_MISSING_L2_FORWARDING_TABLE,
404	SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
405	SJA1105_MISSING_GENERAL_PARAMS_TABLE,
406	SJA1105_MISSING_VLAN_TABLE,
407	SJA1105_MISSING_XMII_TABLE,
408	SJA1105_MISSING_MAC_TABLE,
409	SJA1105_OVERCOMMITTED_FRAME_MEMORY,
410} sja1105_config_valid_t;
411
412extern const char *sja1105_static_config_error_msg[];
413
414sja1105_config_valid_t
415sja1105_static_config_check_valid(const struct sja1105_static_config *config);
416void
417sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
418int sja1105_static_config_init(struct sja1105_static_config *config,
419			       const struct sja1105_table_ops *static_ops,
420			       u64 device_id);
421void sja1105_static_config_free(struct sja1105_static_config *config);
422
423int sja1105_table_delete_entry(struct sja1105_table *table, int i);
424int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
425
426u32 sja1105_crc32(const void *buf, size_t len);
427
428void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
429void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
430void sja1105_packing(void *buf, u64 *val, int start, int end,
431		     size_t len, enum packing_op op);
432
433/* Common implementations for the static and dynamic configs */
434size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
435						enum packing_op op);
436size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
437						  enum packing_op op);
438size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
439					   enum packing_op op);
440size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
441					   enum packing_op op);
442size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
443					 enum packing_op op);
444size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
445					 enum packing_op op);
446size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
447				       enum packing_op op);
448size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
449					    enum packing_op op);
450size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
451					    enum packing_op op);
452size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
453				       enum packing_op op);
454
455#endif