brintos

brintos / linux-shallow public Read only

0
0
Text · 15.1 KiB · 6a372d5 Raw
549 lines · c
1/* SPDX-License-Identifier: BSD-3-Clause */2/* Copyright 2016-2018 NXP3 * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>4 */5#ifndef _SJA1105_STATIC_CONFIG_H6#define _SJA1105_STATIC_CONFIG_H7 8#include <linux/packing.h>9#include <linux/types.h>10#include <asm/types.h>11 12#define SJA1105_NUM_PORTS				513#define SJA1110_NUM_PORTS				1114#define SJA1105_MAX_NUM_PORTS				SJA1110_NUM_PORTS15#define SJA1105_NUM_TC					816 17#define SJA1105_SIZE_SPI_MSG_HEADER			418#define SJA1105_SIZE_SPI_MSG_MAXLEN			(64 * 4)19#define SJA1105_SIZE_DEVICE_ID				420#define SJA1105_SIZE_TABLE_HEADER			1221#define SJA1105_SIZE_SCHEDULE_ENTRY			822#define SJA1110_SIZE_SCHEDULE_ENTRY			1223#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	424#define SJA1110_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	825#define SJA1105_SIZE_VL_LOOKUP_ENTRY			1226#define SJA1105_SIZE_VL_POLICING_ENTRY			827#define SJA1105_SIZE_VL_FORWARDING_ENTRY		428#define SJA1105_SIZE_L2_POLICING_ENTRY			829#define SJA1105_SIZE_VLAN_LOOKUP_ENTRY			830#define SJA1110_SIZE_VLAN_LOOKUP_ENTRY			1231#define SJA1105_SIZE_L2_FORWARDING_ENTRY		832#define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY		1233#define SJA1105_SIZE_RETAGGING_ENTRY			834#define SJA1105_SIZE_XMII_PARAMS_ENTRY			435#define SJA1110_SIZE_XMII_PARAMS_ENTRY			836#define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY		1237#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY	438#define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY         1239#define SJA1105ET_SIZE_L2_LOOKUP_ENTRY			1240#define SJA1105ET_SIZE_MAC_CONFIG_ENTRY			2841#define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY		442#define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY		4043#define SJA1105ET_SIZE_AVB_PARAMS_ENTRY			1244#define SJA1105ET_SIZE_CBS_ENTRY			1645#define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY		2046#define SJA1110_SIZE_L2_LOOKUP_ENTRY			2447#define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY		3248#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY		1649#define SJA1110_SIZE_L2_LOOKUP_PARAMS_ENTRY		2850#define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY		4451#define SJA1110_SIZE_GENERAL_PARAMS_ENTRY		5652#define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY		1653#define SJA1105PQRS_SIZE_CBS_ENTRY			2054#define SJA1110_SIZE_PCP_REMAPPING_ENTRY		455 56/* UM10944.pdf Page 11, Table 2. Configuration Blocks */57enum {58	BLKID_SCHEDULE					= 0x00,59	BLKID_SCHEDULE_ENTRY_POINTS			= 0x01,60	BLKID_VL_LOOKUP					= 0x02,61	BLKID_VL_POLICING				= 0x03,62	BLKID_VL_FORWARDING				= 0x04,63	BLKID_L2_LOOKUP					= 0x05,64	BLKID_L2_POLICING				= 0x06,65	BLKID_VLAN_LOOKUP				= 0x07,66	BLKID_L2_FORWARDING				= 0x08,67	BLKID_MAC_CONFIG				= 0x09,68	BLKID_SCHEDULE_PARAMS				= 0x0A,69	BLKID_SCHEDULE_ENTRY_POINTS_PARAMS		= 0x0B,70	BLKID_VL_FORWARDING_PARAMS			= 0x0C,71	BLKID_L2_LOOKUP_PARAMS				= 0x0D,72	BLKID_L2_FORWARDING_PARAMS			= 0x0E,73	BLKID_AVB_PARAMS				= 0x10,74	BLKID_GENERAL_PARAMS				= 0x11,75	BLKID_RETAGGING					= 0x12,76	BLKID_CBS					= 0x13,77	BLKID_PCP_REMAPPING				= 0x1C,78	BLKID_XMII_PARAMS				= 0x4E,79};80 81enum sja1105_blk_idx {82	BLK_IDX_SCHEDULE = 0,83	BLK_IDX_SCHEDULE_ENTRY_POINTS,84	BLK_IDX_VL_LOOKUP,85	BLK_IDX_VL_POLICING,86	BLK_IDX_VL_FORWARDING,87	BLK_IDX_L2_LOOKUP,88	BLK_IDX_L2_POLICING,89	BLK_IDX_VLAN_LOOKUP,90	BLK_IDX_L2_FORWARDING,91	BLK_IDX_MAC_CONFIG,92	BLK_IDX_SCHEDULE_PARAMS,93	BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,94	BLK_IDX_VL_FORWARDING_PARAMS,95	BLK_IDX_L2_LOOKUP_PARAMS,96	BLK_IDX_L2_FORWARDING_PARAMS,97	BLK_IDX_AVB_PARAMS,98	BLK_IDX_GENERAL_PARAMS,99	BLK_IDX_RETAGGING,100	BLK_IDX_CBS,101	BLK_IDX_XMII_PARAMS,102	BLK_IDX_PCP_REMAPPING,103	BLK_IDX_MAX,104	/* Fake block indices that are only valid for dynamic access */105	BLK_IDX_MGMT_ROUTE,106	BLK_IDX_MAX_DYN,107	BLK_IDX_INVAL = -1,108};109 110#define SJA1105_MAX_SCHEDULE_COUNT			1024111#define SJA1110_MAX_SCHEDULE_COUNT			4096112#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT		2048113#define SJA1105_MAX_VL_LOOKUP_COUNT			1024114#define SJA1110_MAX_VL_LOOKUP_COUNT			4096115#define SJA1105_MAX_VL_POLICING_COUNT			1024116#define SJA1110_MAX_VL_POLICING_COUNT			4096117#define SJA1105_MAX_VL_FORWARDING_COUNT			1024118#define SJA1110_MAX_VL_FORWARDING_COUNT			4096119#define SJA1105_MAX_L2_LOOKUP_COUNT			1024120#define SJA1105_MAX_L2_POLICING_COUNT			45121#define SJA1110_MAX_L2_POLICING_COUNT			110122#define SJA1105_MAX_VLAN_LOOKUP_COUNT			4096123#define SJA1105_MAX_L2_FORWARDING_COUNT			13124#define SJA1110_MAX_L2_FORWARDING_COUNT			19125#define SJA1105_MAX_MAC_CONFIG_COUNT			5126#define SJA1110_MAX_MAC_CONFIG_COUNT			11127#define SJA1105_MAX_SCHEDULE_PARAMS_COUNT		1128#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT	1129#define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT		1130#define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT		1131#define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT		1132#define SJA1105_MAX_GENERAL_PARAMS_COUNT		1133#define SJA1105_MAX_RETAGGING_COUNT			32134#define SJA1105_MAX_XMII_PARAMS_COUNT			1135#define SJA1105_MAX_AVB_PARAMS_COUNT			1136#define SJA1105ET_MAX_CBS_COUNT				10137#define SJA1105PQRS_MAX_CBS_COUNT			16138#define SJA1110_MAX_CBS_COUNT				80139#define SJA1110_MAX_PCP_REMAPPING_COUNT			11140 141#define SJA1105_MAX_FRAME_MEMORY			929142#define SJA1110_MAX_FRAME_MEMORY			1820143#define SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD		19144#define SJA1105_VL_FRAME_MEMORY				100145 146#define SJA1105E_DEVICE_ID				0x9C00000Cull147#define SJA1105T_DEVICE_ID				0x9E00030Eull148#define SJA1105PR_DEVICE_ID				0xAF00030Eull149#define SJA1105QS_DEVICE_ID				0xAE00030Eull150#define SJA1110_DEVICE_ID				0xB700030Full151 152#define SJA1105ET_PART_NO				0x9A83153#define SJA1105P_PART_NO				0x9A84154#define SJA1105Q_PART_NO				0x9A85155#define SJA1105R_PART_NO				0x9A86156#define SJA1105S_PART_NO				0x9A87157#define SJA1110A_PART_NO				0x1110158#define SJA1110B_PART_NO				0x1111159#define SJA1110C_PART_NO				0x1112160#define SJA1110D_PART_NO				0x1113161 162#define SJA1110_ACU			0x1c4400163#define SJA1110_RGU			0x1c6000164#define SJA1110_CGU			0x1c6400165 166#define SJA1110_SPI_ADDR(x)		((x) / 4)167#define SJA1110_ACU_ADDR(x)		(SJA1110_ACU + SJA1110_SPI_ADDR(x))168#define SJA1110_CGU_ADDR(x)		(SJA1110_CGU + SJA1110_SPI_ADDR(x))169#define SJA1110_RGU_ADDR(x)		(SJA1110_RGU + SJA1110_SPI_ADDR(x))170 171#define SJA1105_RSV_ADDR		0xffffffffffffffffull172 173struct sja1105_schedule_entry {174	u64 winstindex;175	u64 winend;176	u64 winst;177	u64 destports;178	u64 setvalid;179	u64 txen;180	u64 resmedia_en;181	u64 resmedia;182	u64 vlindex;183	u64 delta;184};185 186struct sja1105_schedule_params_entry {187	u64 subscheind[8];188};189 190struct sja1105_general_params_entry {191	u64 vllupformat;192	u64 mirr_ptacu;193	u64 switchid;194	u64 hostprio;195	u64 mac_fltres1;196	u64 mac_fltres0;197	u64 mac_flt1;198	u64 mac_flt0;199	u64 incl_srcpt1;200	u64 incl_srcpt0;201	u64 send_meta1;202	u64 send_meta0;203	u64 casc_port;204	u64 host_port;205	u64 mirr_port;206	u64 vlmarker;207	u64 vlmask;208	u64 tpid;209	u64 ignore2stf;210	u64 tpid2;211	/* P/Q/R/S only */212	u64 queue_ts;213	u64 egrmirrvid;214	u64 egrmirrpcp;215	u64 egrmirrdei;216	u64 replay_port;217	/* SJA1110 only */218	u64 tte_en;219	u64 tdmaconfigidx;220	u64 header_type;221};222 223struct sja1105_schedule_entry_points_entry {224	u64 subschindx;225	u64 delta;226	u64 address;227};228 229struct sja1105_schedule_entry_points_params_entry {230	u64 clksrc;231	u64 actsubsch;232};233 234struct sja1105_vlan_lookup_entry {235	u64 ving_mirr;236	u64 vegr_mirr;237	u64 vmemb_port;238	u64 vlan_bc;239	u64 tag_port;240	u64 vlanid;241	u64 type_entry; /* SJA1110 only */242};243 244struct sja1105_l2_lookup_entry {245	u64 vlanid;246	u64 macaddr;247	u64 destports;248	u64 enfport;249	u64 index;250	/* P/Q/R/S only */251	u64 mask_iotag;252	u64 mask_vlanid;253	u64 mask_macaddr;254	u64 mask_srcport;255	u64 iotag;256	u64 srcport;257	u64 lockeds;258	union {259		/* LOCKEDS=1: Static FDB entries */260		struct {261			/* TSREG is deprecated in SJA1110, TRAP is supported only262			 * in SJA1110.263			 */264			u64 trap;265			u64 tsreg;266			u64 mirrvlan;267			u64 takets;268			u64 mirr;269			u64 retag;270		};271		/* LOCKEDS=0: Dynamically learned FDB entries */272		struct {273			u64 touched;274			u64 age;275		};276	};277};278 279struct sja1105_l2_lookup_params_entry {280	u64 maxaddrp[SJA1105_MAX_NUM_PORTS]; /* P/Q/R/S only */281	u64 start_dynspc;    /* P/Q/R/S only */282	u64 drpnolearn;      /* P/Q/R/S only */283	u64 use_static;      /* P/Q/R/S only */284	u64 owr_dyn;         /* P/Q/R/S only */285	u64 learn_once;      /* P/Q/R/S only */286	u64 maxage;          /* Shared */287	u64 dyn_tbsz;        /* E/T only */288	u64 poly;            /* E/T only */289	u64 shared_learn;    /* Shared */290	u64 no_enf_hostprt;  /* Shared */291	u64 no_mgmt_learn;   /* Shared */292};293 294struct sja1105_l2_forwarding_entry {295	u64 bc_domain;296	u64 reach_port;297	u64 fl_domain;298	/* This is actually max(SJA1105_NUM_TC, SJA1105_MAX_NUM_PORTS) */299	u64 vlan_pmap[SJA1105_MAX_NUM_PORTS];300	bool type_egrpcp2outputq;301};302 303struct sja1105_l2_forwarding_params_entry {304	u64 max_dynp;305	u64 part_spc[8];306};307 308struct sja1105_l2_policing_entry {309	u64 sharindx;310	u64 smax;311	u64 rate;312	u64 maxlen;313	u64 partition;314};315 316struct sja1105_avb_params_entry {317	u64 cas_master;318	u64 destmeta;319	u64 srcmeta;320};321 322struct sja1105_mac_config_entry {323	u64 top[8];324	u64 base[8];325	u64 enabled[8];326	u64 ifg;327	u64 speed;328	u64 tp_delin;329	u64 tp_delout;330	u64 maxage;331	u64 vlanprio;332	u64 vlanid;333	u64 ing_mirr;334	u64 egr_mirr;335	u64 drpnona664;336	u64 drpdtag;337	u64 drpuntag;338	u64 retag;339	u64 dyn_learn;340	u64 egress;341	u64 ingress;342};343 344struct sja1105_retagging_entry {345	u64 egr_port;346	u64 ing_port;347	u64 vlan_ing;348	u64 vlan_egr;349	u64 do_not_learn;350	u64 use_dest_ports;351	u64 destports;352};353 354struct sja1105_cbs_entry {355	u64 port; /* Not used for SJA1110 */356	u64 prio; /* Not used for SJA1110 */357	u64 credit_hi;358	u64 credit_lo;359	u64 send_slope;360	u64 idle_slope;361};362 363struct sja1105_xmii_params_entry {364	u64 phy_mac[SJA1105_MAX_NUM_PORTS];365	u64 xmii_mode[SJA1105_MAX_NUM_PORTS];366	/* The SJA1110 insists being a snowflake, and requires SGMII,367	 * 2500base-x and internal MII ports connected to the 100base-TX PHY to368	 * set this bit. We set it unconditionally from the high-level logic,369	 * and only sja1110_xmii_params_entry_packing writes it to the static370	 * config. I have no better name for it than "special".371	 */372	u64 special[SJA1105_MAX_NUM_PORTS];373};374 375struct sja1110_pcp_remapping_entry {376	u64 egrpcp[SJA1105_NUM_TC];377};378 379enum {380	SJA1105_VL_FORMAT_PSFP		= 0,381	SJA1105_VL_FORMAT_ARINC664	= 1,382};383 384struct sja1105_vl_lookup_entry {385	u64 format;386	u64 port;387	union {388		/* SJA1105_VL_FORMAT_PSFP */389		struct {390			u64 destports;391			u64 iscritical;392			u64 macaddr;393			u64 vlanid;394			u64 vlanprior;395		};396		/* SJA1105_VL_FORMAT_ARINC664 */397		struct {398			u64 egrmirr;399			u64 ingrmirr;400			u64 vlid;401		};402	};403	/* Not part of hardware structure */404	unsigned long flow_cookie;405};406 407struct sja1105_vl_policing_entry {408	u64 type;409	u64 maxlen;410	u64 sharindx;411	u64 bag;412	u64 jitter;413};414 415struct sja1105_vl_forwarding_entry {416	u64 type;417	u64 priority;418	u64 partition;419	u64 destports;420};421 422struct sja1105_vl_forwarding_params_entry {423	u64 partspc[8];424	u64 debugen;425};426 427struct sja1105_table_header {428	u64 block_id;429	u64 len;430	u64 crc;431};432 433struct sja1105_table_ops {434	size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);435	size_t unpacked_entry_size;436	size_t packed_entry_size;437	size_t max_entry_count;438};439 440struct sja1105_table {441	const struct sja1105_table_ops *ops;442	size_t entry_count;443	void *entries;444};445 446struct sja1105_static_config {447	u64 device_id;448	struct sja1105_table tables[BLK_IDX_MAX];449};450 451extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];452extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];453extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];454extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];455extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];456extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];457extern const struct sja1105_table_ops sja1110_table_ops[BLK_IDX_MAX];458 459size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);460void461sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);462size_t463sja1105_static_config_get_length(const struct sja1105_static_config *config);464 465typedef enum {466	SJA1105_CONFIG_OK = 0,467	SJA1105_TTETHERNET_NOT_SUPPORTED,468	SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,469	SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION,470	SJA1105_MISSING_L2_POLICING_TABLE,471	SJA1105_MISSING_L2_FORWARDING_TABLE,472	SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,473	SJA1105_MISSING_GENERAL_PARAMS_TABLE,474	SJA1105_MISSING_VLAN_TABLE,475	SJA1105_MISSING_XMII_TABLE,476	SJA1105_MISSING_MAC_TABLE,477	SJA1105_OVERCOMMITTED_FRAME_MEMORY,478} sja1105_config_valid_t;479 480extern const char *sja1105_static_config_error_msg[];481 482sja1105_config_valid_t483sja1105_static_config_check_valid(const struct sja1105_static_config *config,484				  int max_mem);485void486sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);487int sja1105_static_config_init(struct sja1105_static_config *config,488			       const struct sja1105_table_ops *static_ops,489			       u64 device_id);490void sja1105_static_config_free(struct sja1105_static_config *config);491 492int sja1105_table_delete_entry(struct sja1105_table *table, int i);493int sja1105_table_resize(struct sja1105_table *table, size_t new_count);494 495u32 sja1105_crc32(const void *buf, size_t len);496 497void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);498void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);499void sja1105_packing(void *buf, u64 *val, int start, int end,500		     size_t len, enum packing_op op);501 502/* Common implementations for the static and dynamic configs */503size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,504						enum packing_op op);505size_t sja1110_general_params_entry_packing(void *buf, void *entry_ptr,506					    enum packing_op op);507size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,508						  enum packing_op op);509size_t sja1110_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,510					      enum packing_op op);511size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,512					   enum packing_op op);513size_t sja1110_l2_forwarding_entry_packing(void *buf, void *entry_ptr,514					   enum packing_op op);515size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,516					   enum packing_op op);517size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,518					 enum packing_op op);519size_t sja1110_l2_lookup_entry_packing(void *buf, void *entry_ptr,520				       enum packing_op op);521size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,522					 enum packing_op op);523size_t sja1110_vlan_lookup_entry_packing(void *buf, void *entry_ptr,524					 enum packing_op op);525size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,526				       enum packing_op op);527size_t sja1110_retagging_entry_packing(void *buf, void *entry_ptr,528				       enum packing_op op);529size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,530					    enum packing_op op);531size_t sja1110_mac_config_entry_packing(void *buf, void *entry_ptr,532					enum packing_op op);533size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,534					    enum packing_op op);535size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,536				       enum packing_op op);537size_t sja1110_vl_lookup_entry_packing(void *buf, void *entry_ptr,538				       enum packing_op op);539size_t sja1110_vl_policing_entry_packing(void *buf, void *entry_ptr,540					 enum packing_op op);541size_t sja1110_xmii_params_entry_packing(void *buf, void *entry_ptr,542					 enum packing_op op);543size_t sja1110_l2_policing_entry_packing(void *buf, void *entry_ptr,544					 enum packing_op op);545size_t sja1110_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,546						  enum packing_op op);547 548#endif549