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