162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause */
262306a36Sopenharmony_ci/* Copyright 2016-2018 NXP
362306a36Sopenharmony_ci * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _SJA1105_STATIC_CONFIG_H
662306a36Sopenharmony_ci#define _SJA1105_STATIC_CONFIG_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/packing.h>
962306a36Sopenharmony_ci#include <linux/types.h>
1062306a36Sopenharmony_ci#include <asm/types.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define SJA1105_NUM_PORTS				5
1362306a36Sopenharmony_ci#define SJA1110_NUM_PORTS				11
1462306a36Sopenharmony_ci#define SJA1105_MAX_NUM_PORTS				SJA1110_NUM_PORTS
1562306a36Sopenharmony_ci#define SJA1105_NUM_TC					8
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define SJA1105_SIZE_SPI_MSG_HEADER			4
1862306a36Sopenharmony_ci#define SJA1105_SIZE_SPI_MSG_MAXLEN			(64 * 4)
1962306a36Sopenharmony_ci#define SJA1105_SIZE_DEVICE_ID				4
2062306a36Sopenharmony_ci#define SJA1105_SIZE_TABLE_HEADER			12
2162306a36Sopenharmony_ci#define SJA1105_SIZE_SCHEDULE_ENTRY			8
2262306a36Sopenharmony_ci#define SJA1110_SIZE_SCHEDULE_ENTRY			12
2362306a36Sopenharmony_ci#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	4
2462306a36Sopenharmony_ci#define SJA1110_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	8
2562306a36Sopenharmony_ci#define SJA1105_SIZE_VL_LOOKUP_ENTRY			12
2662306a36Sopenharmony_ci#define SJA1105_SIZE_VL_POLICING_ENTRY			8
2762306a36Sopenharmony_ci#define SJA1105_SIZE_VL_FORWARDING_ENTRY		4
2862306a36Sopenharmony_ci#define SJA1105_SIZE_L2_POLICING_ENTRY			8
2962306a36Sopenharmony_ci#define SJA1105_SIZE_VLAN_LOOKUP_ENTRY			8
3062306a36Sopenharmony_ci#define SJA1110_SIZE_VLAN_LOOKUP_ENTRY			12
3162306a36Sopenharmony_ci#define SJA1105_SIZE_L2_FORWARDING_ENTRY		8
3262306a36Sopenharmony_ci#define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY		12
3362306a36Sopenharmony_ci#define SJA1105_SIZE_RETAGGING_ENTRY			8
3462306a36Sopenharmony_ci#define SJA1105_SIZE_XMII_PARAMS_ENTRY			4
3562306a36Sopenharmony_ci#define SJA1110_SIZE_XMII_PARAMS_ENTRY			8
3662306a36Sopenharmony_ci#define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY		12
3762306a36Sopenharmony_ci#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY	4
3862306a36Sopenharmony_ci#define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY         12
3962306a36Sopenharmony_ci#define SJA1105ET_SIZE_L2_LOOKUP_ENTRY			12
4062306a36Sopenharmony_ci#define SJA1105ET_SIZE_MAC_CONFIG_ENTRY			28
4162306a36Sopenharmony_ci#define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY		4
4262306a36Sopenharmony_ci#define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY		40
4362306a36Sopenharmony_ci#define SJA1105ET_SIZE_AVB_PARAMS_ENTRY			12
4462306a36Sopenharmony_ci#define SJA1105ET_SIZE_CBS_ENTRY			16
4562306a36Sopenharmony_ci#define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY		20
4662306a36Sopenharmony_ci#define SJA1110_SIZE_L2_LOOKUP_ENTRY			24
4762306a36Sopenharmony_ci#define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY		32
4862306a36Sopenharmony_ci#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY		16
4962306a36Sopenharmony_ci#define SJA1110_SIZE_L2_LOOKUP_PARAMS_ENTRY		28
5062306a36Sopenharmony_ci#define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY		44
5162306a36Sopenharmony_ci#define SJA1110_SIZE_GENERAL_PARAMS_ENTRY		56
5262306a36Sopenharmony_ci#define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY		16
5362306a36Sopenharmony_ci#define SJA1105PQRS_SIZE_CBS_ENTRY			20
5462306a36Sopenharmony_ci#define SJA1110_SIZE_PCP_REMAPPING_ENTRY		4
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* UM10944.pdf Page 11, Table 2. Configuration Blocks */
5762306a36Sopenharmony_cienum {
5862306a36Sopenharmony_ci	BLKID_SCHEDULE					= 0x00,
5962306a36Sopenharmony_ci	BLKID_SCHEDULE_ENTRY_POINTS			= 0x01,
6062306a36Sopenharmony_ci	BLKID_VL_LOOKUP					= 0x02,
6162306a36Sopenharmony_ci	BLKID_VL_POLICING				= 0x03,
6262306a36Sopenharmony_ci	BLKID_VL_FORWARDING				= 0x04,
6362306a36Sopenharmony_ci	BLKID_L2_LOOKUP					= 0x05,
6462306a36Sopenharmony_ci	BLKID_L2_POLICING				= 0x06,
6562306a36Sopenharmony_ci	BLKID_VLAN_LOOKUP				= 0x07,
6662306a36Sopenharmony_ci	BLKID_L2_FORWARDING				= 0x08,
6762306a36Sopenharmony_ci	BLKID_MAC_CONFIG				= 0x09,
6862306a36Sopenharmony_ci	BLKID_SCHEDULE_PARAMS				= 0x0A,
6962306a36Sopenharmony_ci	BLKID_SCHEDULE_ENTRY_POINTS_PARAMS		= 0x0B,
7062306a36Sopenharmony_ci	BLKID_VL_FORWARDING_PARAMS			= 0x0C,
7162306a36Sopenharmony_ci	BLKID_L2_LOOKUP_PARAMS				= 0x0D,
7262306a36Sopenharmony_ci	BLKID_L2_FORWARDING_PARAMS			= 0x0E,
7362306a36Sopenharmony_ci	BLKID_AVB_PARAMS				= 0x10,
7462306a36Sopenharmony_ci	BLKID_GENERAL_PARAMS				= 0x11,
7562306a36Sopenharmony_ci	BLKID_RETAGGING					= 0x12,
7662306a36Sopenharmony_ci	BLKID_CBS					= 0x13,
7762306a36Sopenharmony_ci	BLKID_PCP_REMAPPING				= 0x1C,
7862306a36Sopenharmony_ci	BLKID_XMII_PARAMS				= 0x4E,
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cienum sja1105_blk_idx {
8262306a36Sopenharmony_ci	BLK_IDX_SCHEDULE = 0,
8362306a36Sopenharmony_ci	BLK_IDX_SCHEDULE_ENTRY_POINTS,
8462306a36Sopenharmony_ci	BLK_IDX_VL_LOOKUP,
8562306a36Sopenharmony_ci	BLK_IDX_VL_POLICING,
8662306a36Sopenharmony_ci	BLK_IDX_VL_FORWARDING,
8762306a36Sopenharmony_ci	BLK_IDX_L2_LOOKUP,
8862306a36Sopenharmony_ci	BLK_IDX_L2_POLICING,
8962306a36Sopenharmony_ci	BLK_IDX_VLAN_LOOKUP,
9062306a36Sopenharmony_ci	BLK_IDX_L2_FORWARDING,
9162306a36Sopenharmony_ci	BLK_IDX_MAC_CONFIG,
9262306a36Sopenharmony_ci	BLK_IDX_SCHEDULE_PARAMS,
9362306a36Sopenharmony_ci	BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,
9462306a36Sopenharmony_ci	BLK_IDX_VL_FORWARDING_PARAMS,
9562306a36Sopenharmony_ci	BLK_IDX_L2_LOOKUP_PARAMS,
9662306a36Sopenharmony_ci	BLK_IDX_L2_FORWARDING_PARAMS,
9762306a36Sopenharmony_ci	BLK_IDX_AVB_PARAMS,
9862306a36Sopenharmony_ci	BLK_IDX_GENERAL_PARAMS,
9962306a36Sopenharmony_ci	BLK_IDX_RETAGGING,
10062306a36Sopenharmony_ci	BLK_IDX_CBS,
10162306a36Sopenharmony_ci	BLK_IDX_XMII_PARAMS,
10262306a36Sopenharmony_ci	BLK_IDX_PCP_REMAPPING,
10362306a36Sopenharmony_ci	BLK_IDX_MAX,
10462306a36Sopenharmony_ci	/* Fake block indices that are only valid for dynamic access */
10562306a36Sopenharmony_ci	BLK_IDX_MGMT_ROUTE,
10662306a36Sopenharmony_ci	BLK_IDX_MAX_DYN,
10762306a36Sopenharmony_ci	BLK_IDX_INVAL = -1,
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#define SJA1105_MAX_SCHEDULE_COUNT			1024
11162306a36Sopenharmony_ci#define SJA1110_MAX_SCHEDULE_COUNT			4096
11262306a36Sopenharmony_ci#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT		2048
11362306a36Sopenharmony_ci#define SJA1105_MAX_VL_LOOKUP_COUNT			1024
11462306a36Sopenharmony_ci#define SJA1110_MAX_VL_LOOKUP_COUNT			4096
11562306a36Sopenharmony_ci#define SJA1105_MAX_VL_POLICING_COUNT			1024
11662306a36Sopenharmony_ci#define SJA1110_MAX_VL_POLICING_COUNT			4096
11762306a36Sopenharmony_ci#define SJA1105_MAX_VL_FORWARDING_COUNT			1024
11862306a36Sopenharmony_ci#define SJA1110_MAX_VL_FORWARDING_COUNT			4096
11962306a36Sopenharmony_ci#define SJA1105_MAX_L2_LOOKUP_COUNT			1024
12062306a36Sopenharmony_ci#define SJA1105_MAX_L2_POLICING_COUNT			45
12162306a36Sopenharmony_ci#define SJA1110_MAX_L2_POLICING_COUNT			110
12262306a36Sopenharmony_ci#define SJA1105_MAX_VLAN_LOOKUP_COUNT			4096
12362306a36Sopenharmony_ci#define SJA1105_MAX_L2_FORWARDING_COUNT			13
12462306a36Sopenharmony_ci#define SJA1110_MAX_L2_FORWARDING_COUNT			19
12562306a36Sopenharmony_ci#define SJA1105_MAX_MAC_CONFIG_COUNT			5
12662306a36Sopenharmony_ci#define SJA1110_MAX_MAC_CONFIG_COUNT			11
12762306a36Sopenharmony_ci#define SJA1105_MAX_SCHEDULE_PARAMS_COUNT		1
12862306a36Sopenharmony_ci#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT	1
12962306a36Sopenharmony_ci#define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT		1
13062306a36Sopenharmony_ci#define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT		1
13162306a36Sopenharmony_ci#define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT		1
13262306a36Sopenharmony_ci#define SJA1105_MAX_GENERAL_PARAMS_COUNT		1
13362306a36Sopenharmony_ci#define SJA1105_MAX_RETAGGING_COUNT			32
13462306a36Sopenharmony_ci#define SJA1105_MAX_XMII_PARAMS_COUNT			1
13562306a36Sopenharmony_ci#define SJA1105_MAX_AVB_PARAMS_COUNT			1
13662306a36Sopenharmony_ci#define SJA1105ET_MAX_CBS_COUNT				10
13762306a36Sopenharmony_ci#define SJA1105PQRS_MAX_CBS_COUNT			16
13862306a36Sopenharmony_ci#define SJA1110_MAX_CBS_COUNT				80
13962306a36Sopenharmony_ci#define SJA1110_MAX_PCP_REMAPPING_COUNT			11
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#define SJA1105_MAX_FRAME_MEMORY			929
14262306a36Sopenharmony_ci#define SJA1110_MAX_FRAME_MEMORY			1820
14362306a36Sopenharmony_ci#define SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD		19
14462306a36Sopenharmony_ci#define SJA1105_VL_FRAME_MEMORY				100
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci#define SJA1105E_DEVICE_ID				0x9C00000Cull
14762306a36Sopenharmony_ci#define SJA1105T_DEVICE_ID				0x9E00030Eull
14862306a36Sopenharmony_ci#define SJA1105PR_DEVICE_ID				0xAF00030Eull
14962306a36Sopenharmony_ci#define SJA1105QS_DEVICE_ID				0xAE00030Eull
15062306a36Sopenharmony_ci#define SJA1110_DEVICE_ID				0xB700030Full
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci#define SJA1105ET_PART_NO				0x9A83
15362306a36Sopenharmony_ci#define SJA1105P_PART_NO				0x9A84
15462306a36Sopenharmony_ci#define SJA1105Q_PART_NO				0x9A85
15562306a36Sopenharmony_ci#define SJA1105R_PART_NO				0x9A86
15662306a36Sopenharmony_ci#define SJA1105S_PART_NO				0x9A87
15762306a36Sopenharmony_ci#define SJA1110A_PART_NO				0x1110
15862306a36Sopenharmony_ci#define SJA1110B_PART_NO				0x1111
15962306a36Sopenharmony_ci#define SJA1110C_PART_NO				0x1112
16062306a36Sopenharmony_ci#define SJA1110D_PART_NO				0x1113
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci#define SJA1110_ACU			0x1c4400
16362306a36Sopenharmony_ci#define SJA1110_RGU			0x1c6000
16462306a36Sopenharmony_ci#define SJA1110_CGU			0x1c6400
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci#define SJA1110_SPI_ADDR(x)		((x) / 4)
16762306a36Sopenharmony_ci#define SJA1110_ACU_ADDR(x)		(SJA1110_ACU + SJA1110_SPI_ADDR(x))
16862306a36Sopenharmony_ci#define SJA1110_CGU_ADDR(x)		(SJA1110_CGU + SJA1110_SPI_ADDR(x))
16962306a36Sopenharmony_ci#define SJA1110_RGU_ADDR(x)		(SJA1110_RGU + SJA1110_SPI_ADDR(x))
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci#define SJA1105_RSV_ADDR		0xffffffffffffffffull
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cistruct sja1105_schedule_entry {
17462306a36Sopenharmony_ci	u64 winstindex;
17562306a36Sopenharmony_ci	u64 winend;
17662306a36Sopenharmony_ci	u64 winst;
17762306a36Sopenharmony_ci	u64 destports;
17862306a36Sopenharmony_ci	u64 setvalid;
17962306a36Sopenharmony_ci	u64 txen;
18062306a36Sopenharmony_ci	u64 resmedia_en;
18162306a36Sopenharmony_ci	u64 resmedia;
18262306a36Sopenharmony_ci	u64 vlindex;
18362306a36Sopenharmony_ci	u64 delta;
18462306a36Sopenharmony_ci};
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_cistruct sja1105_schedule_params_entry {
18762306a36Sopenharmony_ci	u64 subscheind[8];
18862306a36Sopenharmony_ci};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistruct sja1105_general_params_entry {
19162306a36Sopenharmony_ci	u64 vllupformat;
19262306a36Sopenharmony_ci	u64 mirr_ptacu;
19362306a36Sopenharmony_ci	u64 switchid;
19462306a36Sopenharmony_ci	u64 hostprio;
19562306a36Sopenharmony_ci	u64 mac_fltres1;
19662306a36Sopenharmony_ci	u64 mac_fltres0;
19762306a36Sopenharmony_ci	u64 mac_flt1;
19862306a36Sopenharmony_ci	u64 mac_flt0;
19962306a36Sopenharmony_ci	u64 incl_srcpt1;
20062306a36Sopenharmony_ci	u64 incl_srcpt0;
20162306a36Sopenharmony_ci	u64 send_meta1;
20262306a36Sopenharmony_ci	u64 send_meta0;
20362306a36Sopenharmony_ci	u64 casc_port;
20462306a36Sopenharmony_ci	u64 host_port;
20562306a36Sopenharmony_ci	u64 mirr_port;
20662306a36Sopenharmony_ci	u64 vlmarker;
20762306a36Sopenharmony_ci	u64 vlmask;
20862306a36Sopenharmony_ci	u64 tpid;
20962306a36Sopenharmony_ci	u64 ignore2stf;
21062306a36Sopenharmony_ci	u64 tpid2;
21162306a36Sopenharmony_ci	/* P/Q/R/S only */
21262306a36Sopenharmony_ci	u64 queue_ts;
21362306a36Sopenharmony_ci	u64 egrmirrvid;
21462306a36Sopenharmony_ci	u64 egrmirrpcp;
21562306a36Sopenharmony_ci	u64 egrmirrdei;
21662306a36Sopenharmony_ci	u64 replay_port;
21762306a36Sopenharmony_ci	/* SJA1110 only */
21862306a36Sopenharmony_ci	u64 tte_en;
21962306a36Sopenharmony_ci	u64 tdmaconfigidx;
22062306a36Sopenharmony_ci	u64 header_type;
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cistruct sja1105_schedule_entry_points_entry {
22462306a36Sopenharmony_ci	u64 subschindx;
22562306a36Sopenharmony_ci	u64 delta;
22662306a36Sopenharmony_ci	u64 address;
22762306a36Sopenharmony_ci};
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_cistruct sja1105_schedule_entry_points_params_entry {
23062306a36Sopenharmony_ci	u64 clksrc;
23162306a36Sopenharmony_ci	u64 actsubsch;
23262306a36Sopenharmony_ci};
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_cistruct sja1105_vlan_lookup_entry {
23562306a36Sopenharmony_ci	u64 ving_mirr;
23662306a36Sopenharmony_ci	u64 vegr_mirr;
23762306a36Sopenharmony_ci	u64 vmemb_port;
23862306a36Sopenharmony_ci	u64 vlan_bc;
23962306a36Sopenharmony_ci	u64 tag_port;
24062306a36Sopenharmony_ci	u64 vlanid;
24162306a36Sopenharmony_ci	u64 type_entry; /* SJA1110 only */
24262306a36Sopenharmony_ci};
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_cistruct sja1105_l2_lookup_entry {
24562306a36Sopenharmony_ci	u64 vlanid;
24662306a36Sopenharmony_ci	u64 macaddr;
24762306a36Sopenharmony_ci	u64 destports;
24862306a36Sopenharmony_ci	u64 enfport;
24962306a36Sopenharmony_ci	u64 index;
25062306a36Sopenharmony_ci	/* P/Q/R/S only */
25162306a36Sopenharmony_ci	u64 mask_iotag;
25262306a36Sopenharmony_ci	u64 mask_vlanid;
25362306a36Sopenharmony_ci	u64 mask_macaddr;
25462306a36Sopenharmony_ci	u64 mask_srcport;
25562306a36Sopenharmony_ci	u64 iotag;
25662306a36Sopenharmony_ci	u64 srcport;
25762306a36Sopenharmony_ci	u64 lockeds;
25862306a36Sopenharmony_ci	union {
25962306a36Sopenharmony_ci		/* LOCKEDS=1: Static FDB entries */
26062306a36Sopenharmony_ci		struct {
26162306a36Sopenharmony_ci			/* TSREG is deprecated in SJA1110, TRAP is supported only
26262306a36Sopenharmony_ci			 * in SJA1110.
26362306a36Sopenharmony_ci			 */
26462306a36Sopenharmony_ci			u64 trap;
26562306a36Sopenharmony_ci			u64 tsreg;
26662306a36Sopenharmony_ci			u64 mirrvlan;
26762306a36Sopenharmony_ci			u64 takets;
26862306a36Sopenharmony_ci			u64 mirr;
26962306a36Sopenharmony_ci			u64 retag;
27062306a36Sopenharmony_ci		};
27162306a36Sopenharmony_ci		/* LOCKEDS=0: Dynamically learned FDB entries */
27262306a36Sopenharmony_ci		struct {
27362306a36Sopenharmony_ci			u64 touched;
27462306a36Sopenharmony_ci			u64 age;
27562306a36Sopenharmony_ci		};
27662306a36Sopenharmony_ci	};
27762306a36Sopenharmony_ci};
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cistruct sja1105_l2_lookup_params_entry {
28062306a36Sopenharmony_ci	u64 maxaddrp[SJA1105_MAX_NUM_PORTS]; /* P/Q/R/S only */
28162306a36Sopenharmony_ci	u64 start_dynspc;    /* P/Q/R/S only */
28262306a36Sopenharmony_ci	u64 drpnolearn;      /* P/Q/R/S only */
28362306a36Sopenharmony_ci	u64 use_static;      /* P/Q/R/S only */
28462306a36Sopenharmony_ci	u64 owr_dyn;         /* P/Q/R/S only */
28562306a36Sopenharmony_ci	u64 learn_once;      /* P/Q/R/S only */
28662306a36Sopenharmony_ci	u64 maxage;          /* Shared */
28762306a36Sopenharmony_ci	u64 dyn_tbsz;        /* E/T only */
28862306a36Sopenharmony_ci	u64 poly;            /* E/T only */
28962306a36Sopenharmony_ci	u64 shared_learn;    /* Shared */
29062306a36Sopenharmony_ci	u64 no_enf_hostprt;  /* Shared */
29162306a36Sopenharmony_ci	u64 no_mgmt_learn;   /* Shared */
29262306a36Sopenharmony_ci};
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_cistruct sja1105_l2_forwarding_entry {
29562306a36Sopenharmony_ci	u64 bc_domain;
29662306a36Sopenharmony_ci	u64 reach_port;
29762306a36Sopenharmony_ci	u64 fl_domain;
29862306a36Sopenharmony_ci	/* This is actually max(SJA1105_NUM_TC, SJA1105_MAX_NUM_PORTS) */
29962306a36Sopenharmony_ci	u64 vlan_pmap[SJA1105_MAX_NUM_PORTS];
30062306a36Sopenharmony_ci	bool type_egrpcp2outputq;
30162306a36Sopenharmony_ci};
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_cistruct sja1105_l2_forwarding_params_entry {
30462306a36Sopenharmony_ci	u64 max_dynp;
30562306a36Sopenharmony_ci	u64 part_spc[8];
30662306a36Sopenharmony_ci};
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_cistruct sja1105_l2_policing_entry {
30962306a36Sopenharmony_ci	u64 sharindx;
31062306a36Sopenharmony_ci	u64 smax;
31162306a36Sopenharmony_ci	u64 rate;
31262306a36Sopenharmony_ci	u64 maxlen;
31362306a36Sopenharmony_ci	u64 partition;
31462306a36Sopenharmony_ci};
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_cistruct sja1105_avb_params_entry {
31762306a36Sopenharmony_ci	u64 cas_master;
31862306a36Sopenharmony_ci	u64 destmeta;
31962306a36Sopenharmony_ci	u64 srcmeta;
32062306a36Sopenharmony_ci};
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cistruct sja1105_mac_config_entry {
32362306a36Sopenharmony_ci	u64 top[8];
32462306a36Sopenharmony_ci	u64 base[8];
32562306a36Sopenharmony_ci	u64 enabled[8];
32662306a36Sopenharmony_ci	u64 ifg;
32762306a36Sopenharmony_ci	u64 speed;
32862306a36Sopenharmony_ci	u64 tp_delin;
32962306a36Sopenharmony_ci	u64 tp_delout;
33062306a36Sopenharmony_ci	u64 maxage;
33162306a36Sopenharmony_ci	u64 vlanprio;
33262306a36Sopenharmony_ci	u64 vlanid;
33362306a36Sopenharmony_ci	u64 ing_mirr;
33462306a36Sopenharmony_ci	u64 egr_mirr;
33562306a36Sopenharmony_ci	u64 drpnona664;
33662306a36Sopenharmony_ci	u64 drpdtag;
33762306a36Sopenharmony_ci	u64 drpuntag;
33862306a36Sopenharmony_ci	u64 retag;
33962306a36Sopenharmony_ci	u64 dyn_learn;
34062306a36Sopenharmony_ci	u64 egress;
34162306a36Sopenharmony_ci	u64 ingress;
34262306a36Sopenharmony_ci};
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_cistruct sja1105_retagging_entry {
34562306a36Sopenharmony_ci	u64 egr_port;
34662306a36Sopenharmony_ci	u64 ing_port;
34762306a36Sopenharmony_ci	u64 vlan_ing;
34862306a36Sopenharmony_ci	u64 vlan_egr;
34962306a36Sopenharmony_ci	u64 do_not_learn;
35062306a36Sopenharmony_ci	u64 use_dest_ports;
35162306a36Sopenharmony_ci	u64 destports;
35262306a36Sopenharmony_ci};
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_cistruct sja1105_cbs_entry {
35562306a36Sopenharmony_ci	u64 port; /* Not used for SJA1110 */
35662306a36Sopenharmony_ci	u64 prio; /* Not used for SJA1110 */
35762306a36Sopenharmony_ci	u64 credit_hi;
35862306a36Sopenharmony_ci	u64 credit_lo;
35962306a36Sopenharmony_ci	u64 send_slope;
36062306a36Sopenharmony_ci	u64 idle_slope;
36162306a36Sopenharmony_ci};
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistruct sja1105_xmii_params_entry {
36462306a36Sopenharmony_ci	u64 phy_mac[SJA1105_MAX_NUM_PORTS];
36562306a36Sopenharmony_ci	u64 xmii_mode[SJA1105_MAX_NUM_PORTS];
36662306a36Sopenharmony_ci	/* The SJA1110 insists being a snowflake, and requires SGMII,
36762306a36Sopenharmony_ci	 * 2500base-x and internal MII ports connected to the 100base-TX PHY to
36862306a36Sopenharmony_ci	 * set this bit. We set it unconditionally from the high-level logic,
36962306a36Sopenharmony_ci	 * and only sja1110_xmii_params_entry_packing writes it to the static
37062306a36Sopenharmony_ci	 * config. I have no better name for it than "special".
37162306a36Sopenharmony_ci	 */
37262306a36Sopenharmony_ci	u64 special[SJA1105_MAX_NUM_PORTS];
37362306a36Sopenharmony_ci};
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_cistruct sja1110_pcp_remapping_entry {
37662306a36Sopenharmony_ci	u64 egrpcp[SJA1105_NUM_TC];
37762306a36Sopenharmony_ci};
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_cienum {
38062306a36Sopenharmony_ci	SJA1105_VL_FORMAT_PSFP		= 0,
38162306a36Sopenharmony_ci	SJA1105_VL_FORMAT_ARINC664	= 1,
38262306a36Sopenharmony_ci};
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_cistruct sja1105_vl_lookup_entry {
38562306a36Sopenharmony_ci	u64 format;
38662306a36Sopenharmony_ci	u64 port;
38762306a36Sopenharmony_ci	union {
38862306a36Sopenharmony_ci		/* SJA1105_VL_FORMAT_PSFP */
38962306a36Sopenharmony_ci		struct {
39062306a36Sopenharmony_ci			u64 destports;
39162306a36Sopenharmony_ci			u64 iscritical;
39262306a36Sopenharmony_ci			u64 macaddr;
39362306a36Sopenharmony_ci			u64 vlanid;
39462306a36Sopenharmony_ci			u64 vlanprior;
39562306a36Sopenharmony_ci		};
39662306a36Sopenharmony_ci		/* SJA1105_VL_FORMAT_ARINC664 */
39762306a36Sopenharmony_ci		struct {
39862306a36Sopenharmony_ci			u64 egrmirr;
39962306a36Sopenharmony_ci			u64 ingrmirr;
40062306a36Sopenharmony_ci			u64 vlid;
40162306a36Sopenharmony_ci		};
40262306a36Sopenharmony_ci	};
40362306a36Sopenharmony_ci	/* Not part of hardware structure */
40462306a36Sopenharmony_ci	unsigned long flow_cookie;
40562306a36Sopenharmony_ci};
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_cistruct sja1105_vl_policing_entry {
40862306a36Sopenharmony_ci	u64 type;
40962306a36Sopenharmony_ci	u64 maxlen;
41062306a36Sopenharmony_ci	u64 sharindx;
41162306a36Sopenharmony_ci	u64 bag;
41262306a36Sopenharmony_ci	u64 jitter;
41362306a36Sopenharmony_ci};
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_cistruct sja1105_vl_forwarding_entry {
41662306a36Sopenharmony_ci	u64 type;
41762306a36Sopenharmony_ci	u64 priority;
41862306a36Sopenharmony_ci	u64 partition;
41962306a36Sopenharmony_ci	u64 destports;
42062306a36Sopenharmony_ci};
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_cistruct sja1105_vl_forwarding_params_entry {
42362306a36Sopenharmony_ci	u64 partspc[8];
42462306a36Sopenharmony_ci	u64 debugen;
42562306a36Sopenharmony_ci};
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_cistruct sja1105_table_header {
42862306a36Sopenharmony_ci	u64 block_id;
42962306a36Sopenharmony_ci	u64 len;
43062306a36Sopenharmony_ci	u64 crc;
43162306a36Sopenharmony_ci};
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_cistruct sja1105_table_ops {
43462306a36Sopenharmony_ci	size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
43562306a36Sopenharmony_ci	size_t unpacked_entry_size;
43662306a36Sopenharmony_ci	size_t packed_entry_size;
43762306a36Sopenharmony_ci	size_t max_entry_count;
43862306a36Sopenharmony_ci};
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_cistruct sja1105_table {
44162306a36Sopenharmony_ci	const struct sja1105_table_ops *ops;
44262306a36Sopenharmony_ci	size_t entry_count;
44362306a36Sopenharmony_ci	void *entries;
44462306a36Sopenharmony_ci};
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_cistruct sja1105_static_config {
44762306a36Sopenharmony_ci	u64 device_id;
44862306a36Sopenharmony_ci	struct sja1105_table tables[BLK_IDX_MAX];
44962306a36Sopenharmony_ci};
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ciextern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
45262306a36Sopenharmony_ciextern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
45362306a36Sopenharmony_ciextern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
45462306a36Sopenharmony_ciextern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
45562306a36Sopenharmony_ciextern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
45662306a36Sopenharmony_ciextern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
45762306a36Sopenharmony_ciextern const struct sja1105_table_ops sja1110_table_ops[BLK_IDX_MAX];
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cisize_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
46062306a36Sopenharmony_civoid
46162306a36Sopenharmony_cisja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
46262306a36Sopenharmony_cisize_t
46362306a36Sopenharmony_cisja1105_static_config_get_length(const struct sja1105_static_config *config);
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_citypedef enum {
46662306a36Sopenharmony_ci	SJA1105_CONFIG_OK = 0,
46762306a36Sopenharmony_ci	SJA1105_TTETHERNET_NOT_SUPPORTED,
46862306a36Sopenharmony_ci	SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,
46962306a36Sopenharmony_ci	SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION,
47062306a36Sopenharmony_ci	SJA1105_MISSING_L2_POLICING_TABLE,
47162306a36Sopenharmony_ci	SJA1105_MISSING_L2_FORWARDING_TABLE,
47262306a36Sopenharmony_ci	SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
47362306a36Sopenharmony_ci	SJA1105_MISSING_GENERAL_PARAMS_TABLE,
47462306a36Sopenharmony_ci	SJA1105_MISSING_VLAN_TABLE,
47562306a36Sopenharmony_ci	SJA1105_MISSING_XMII_TABLE,
47662306a36Sopenharmony_ci	SJA1105_MISSING_MAC_TABLE,
47762306a36Sopenharmony_ci	SJA1105_OVERCOMMITTED_FRAME_MEMORY,
47862306a36Sopenharmony_ci} sja1105_config_valid_t;
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ciextern const char *sja1105_static_config_error_msg[];
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_cisja1105_config_valid_t
48362306a36Sopenharmony_cisja1105_static_config_check_valid(const struct sja1105_static_config *config,
48462306a36Sopenharmony_ci				  int max_mem);
48562306a36Sopenharmony_civoid
48662306a36Sopenharmony_cisja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
48762306a36Sopenharmony_ciint sja1105_static_config_init(struct sja1105_static_config *config,
48862306a36Sopenharmony_ci			       const struct sja1105_table_ops *static_ops,
48962306a36Sopenharmony_ci			       u64 device_id);
49062306a36Sopenharmony_civoid sja1105_static_config_free(struct sja1105_static_config *config);
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ciint sja1105_table_delete_entry(struct sja1105_table *table, int i);
49362306a36Sopenharmony_ciint sja1105_table_resize(struct sja1105_table *table, size_t new_count);
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ciu32 sja1105_crc32(const void *buf, size_t len);
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_civoid sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
49862306a36Sopenharmony_civoid sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
49962306a36Sopenharmony_civoid sja1105_packing(void *buf, u64 *val, int start, int end,
50062306a36Sopenharmony_ci		     size_t len, enum packing_op op);
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci/* Common implementations for the static and dynamic configs */
50362306a36Sopenharmony_cisize_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
50462306a36Sopenharmony_ci						enum packing_op op);
50562306a36Sopenharmony_cisize_t sja1110_general_params_entry_packing(void *buf, void *entry_ptr,
50662306a36Sopenharmony_ci					    enum packing_op op);
50762306a36Sopenharmony_cisize_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
50862306a36Sopenharmony_ci						  enum packing_op op);
50962306a36Sopenharmony_cisize_t sja1110_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
51062306a36Sopenharmony_ci					      enum packing_op op);
51162306a36Sopenharmony_cisize_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
51262306a36Sopenharmony_ci					   enum packing_op op);
51362306a36Sopenharmony_cisize_t sja1110_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
51462306a36Sopenharmony_ci					   enum packing_op op);
51562306a36Sopenharmony_cisize_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
51662306a36Sopenharmony_ci					   enum packing_op op);
51762306a36Sopenharmony_cisize_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
51862306a36Sopenharmony_ci					 enum packing_op op);
51962306a36Sopenharmony_cisize_t sja1110_l2_lookup_entry_packing(void *buf, void *entry_ptr,
52062306a36Sopenharmony_ci				       enum packing_op op);
52162306a36Sopenharmony_cisize_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
52262306a36Sopenharmony_ci					 enum packing_op op);
52362306a36Sopenharmony_cisize_t sja1110_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
52462306a36Sopenharmony_ci					 enum packing_op op);
52562306a36Sopenharmony_cisize_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
52662306a36Sopenharmony_ci				       enum packing_op op);
52762306a36Sopenharmony_cisize_t sja1110_retagging_entry_packing(void *buf, void *entry_ptr,
52862306a36Sopenharmony_ci				       enum packing_op op);
52962306a36Sopenharmony_cisize_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
53062306a36Sopenharmony_ci					    enum packing_op op);
53162306a36Sopenharmony_cisize_t sja1110_mac_config_entry_packing(void *buf, void *entry_ptr,
53262306a36Sopenharmony_ci					enum packing_op op);
53362306a36Sopenharmony_cisize_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
53462306a36Sopenharmony_ci					    enum packing_op op);
53562306a36Sopenharmony_cisize_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
53662306a36Sopenharmony_ci				       enum packing_op op);
53762306a36Sopenharmony_cisize_t sja1110_vl_lookup_entry_packing(void *buf, void *entry_ptr,
53862306a36Sopenharmony_ci				       enum packing_op op);
53962306a36Sopenharmony_cisize_t sja1110_vl_policing_entry_packing(void *buf, void *entry_ptr,
54062306a36Sopenharmony_ci					 enum packing_op op);
54162306a36Sopenharmony_cisize_t sja1110_xmii_params_entry_packing(void *buf, void *entry_ptr,
54262306a36Sopenharmony_ci					 enum packing_op op);
54362306a36Sopenharmony_cisize_t sja1110_l2_policing_entry_packing(void *buf, void *entry_ptr,
54462306a36Sopenharmony_ci					 enum packing_op op);
54562306a36Sopenharmony_cisize_t sja1110_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
54662306a36Sopenharmony_ci						  enum packing_op op);
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci#endif
549