18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause
28c2ecf20Sopenharmony_ci/* Copyright (c) 2016-2018, NXP Semiconductors
38c2ecf20Sopenharmony_ci * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci#include "sja1105_static_config.h"
68c2ecf20Sopenharmony_ci#include <linux/crc32.h>
78c2ecf20Sopenharmony_ci#include <linux/slab.h>
88c2ecf20Sopenharmony_ci#include <linux/string.h>
98c2ecf20Sopenharmony_ci#include <linux/errno.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci/* Convenience wrappers over the generic packing functions. These take into
128c2ecf20Sopenharmony_ci * account the SJA1105 memory layout quirks and provide some level of
138c2ecf20Sopenharmony_ci * programmer protection against incorrect API use. The errors are not expected
148c2ecf20Sopenharmony_ci * to occur durring runtime, therefore printing and swallowing them here is
158c2ecf20Sopenharmony_ci * appropriate instead of clutterring up higher-level code.
168c2ecf20Sopenharmony_ci */
178c2ecf20Sopenharmony_civoid sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len)
188c2ecf20Sopenharmony_ci{
198c2ecf20Sopenharmony_ci	int rc = packing(buf, (u64 *)val, start, end, len,
208c2ecf20Sopenharmony_ci			 PACK, QUIRK_LSW32_IS_FIRST);
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	if (likely(!rc))
238c2ecf20Sopenharmony_ci		return;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	if (rc == -EINVAL) {
268c2ecf20Sopenharmony_ci		pr_err("Start bit (%d) expected to be larger than end (%d)\n",
278c2ecf20Sopenharmony_ci		       start, end);
288c2ecf20Sopenharmony_ci	} else if (rc == -ERANGE) {
298c2ecf20Sopenharmony_ci		if ((start - end + 1) > 64)
308c2ecf20Sopenharmony_ci			pr_err("Field %d-%d too large for 64 bits!\n",
318c2ecf20Sopenharmony_ci			       start, end);
328c2ecf20Sopenharmony_ci		else
338c2ecf20Sopenharmony_ci			pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n",
348c2ecf20Sopenharmony_ci			       *val, start, end);
358c2ecf20Sopenharmony_ci	}
368c2ecf20Sopenharmony_ci	dump_stack();
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_civoid sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len)
408c2ecf20Sopenharmony_ci{
418c2ecf20Sopenharmony_ci	int rc = packing((void *)buf, val, start, end, len,
428c2ecf20Sopenharmony_ci			 UNPACK, QUIRK_LSW32_IS_FIRST);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	if (likely(!rc))
458c2ecf20Sopenharmony_ci		return;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	if (rc == -EINVAL)
488c2ecf20Sopenharmony_ci		pr_err("Start bit (%d) expected to be larger than end (%d)\n",
498c2ecf20Sopenharmony_ci		       start, end);
508c2ecf20Sopenharmony_ci	else if (rc == -ERANGE)
518c2ecf20Sopenharmony_ci		pr_err("Field %d-%d too large for 64 bits!\n",
528c2ecf20Sopenharmony_ci		       start, end);
538c2ecf20Sopenharmony_ci	dump_stack();
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_civoid sja1105_packing(void *buf, u64 *val, int start, int end,
578c2ecf20Sopenharmony_ci		     size_t len, enum packing_op op)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	int rc = packing(buf, val, start, end, len, op, QUIRK_LSW32_IS_FIRST);
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	if (likely(!rc))
628c2ecf20Sopenharmony_ci		return;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	if (rc == -EINVAL) {
658c2ecf20Sopenharmony_ci		pr_err("Start bit (%d) expected to be larger than end (%d)\n",
668c2ecf20Sopenharmony_ci		       start, end);
678c2ecf20Sopenharmony_ci	} else if (rc == -ERANGE) {
688c2ecf20Sopenharmony_ci		if ((start - end + 1) > 64)
698c2ecf20Sopenharmony_ci			pr_err("Field %d-%d too large for 64 bits!\n",
708c2ecf20Sopenharmony_ci			       start, end);
718c2ecf20Sopenharmony_ci		else
728c2ecf20Sopenharmony_ci			pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n",
738c2ecf20Sopenharmony_ci			       *val, start, end);
748c2ecf20Sopenharmony_ci	}
758c2ecf20Sopenharmony_ci	dump_stack();
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci/* Little-endian Ethernet CRC32 of data packed as big-endian u32 words */
798c2ecf20Sopenharmony_ciu32 sja1105_crc32(const void *buf, size_t len)
808c2ecf20Sopenharmony_ci{
818c2ecf20Sopenharmony_ci	unsigned int i;
828c2ecf20Sopenharmony_ci	u64 word;
838c2ecf20Sopenharmony_ci	u32 crc;
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci	/* seed */
868c2ecf20Sopenharmony_ci	crc = ~0;
878c2ecf20Sopenharmony_ci	for (i = 0; i < len; i += 4) {
888c2ecf20Sopenharmony_ci		sja1105_unpack((void *)buf + i, &word, 31, 0, 4);
898c2ecf20Sopenharmony_ci		crc = crc32_le(crc, (u8 *)&word, 4);
908c2ecf20Sopenharmony_ci	}
918c2ecf20Sopenharmony_ci	return ~crc;
928c2ecf20Sopenharmony_ci}
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_cistatic size_t sja1105et_avb_params_entry_packing(void *buf, void *entry_ptr,
958c2ecf20Sopenharmony_ci						 enum packing_op op)
968c2ecf20Sopenharmony_ci{
978c2ecf20Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY;
988c2ecf20Sopenharmony_ci	struct sja1105_avb_params_entry *entry = entry_ptr;
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->destmeta, 95, 48, size, op);
1018c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->srcmeta,  47,  0, size, op);
1028c2ecf20Sopenharmony_ci	return size;
1038c2ecf20Sopenharmony_ci}
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cisize_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
1068c2ecf20Sopenharmony_ci					    enum packing_op op)
1078c2ecf20Sopenharmony_ci{
1088c2ecf20Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY;
1098c2ecf20Sopenharmony_ci	struct sja1105_avb_params_entry *entry = entry_ptr;
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->cas_master, 126, 126, size, op);
1128c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->destmeta,   125,  78, size, op);
1138c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->srcmeta,     77,  30, size, op);
1148c2ecf20Sopenharmony_ci	return size;
1158c2ecf20Sopenharmony_ci}
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_cistatic size_t sja1105et_general_params_entry_packing(void *buf, void *entry_ptr,
1188c2ecf20Sopenharmony_ci						     enum packing_op op)
1198c2ecf20Sopenharmony_ci{
1208c2ecf20Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY;
1218c2ecf20Sopenharmony_ci	struct sja1105_general_params_entry *entry = entry_ptr;
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vllupformat, 319, 319, size, op);
1248c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_ptacu,  318, 318, size, op);
1258c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->switchid,    317, 315, size, op);
1268c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->hostprio,    314, 312, size, op);
1278c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres1, 311, 264, size, op);
1288c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres0, 263, 216, size, op);
1298c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt1,    215, 168, size, op);
1308c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt0,    167, 120, size, op);
1318c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt1, 119, 119, size, op);
1328c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt0, 118, 118, size, op);
1338c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta1,  117, 117, size, op);
1348c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta0,  116, 116, size, op);
1358c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->casc_port,   115, 113, size, op);
1368c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->host_port,   112, 110, size, op);
1378c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_port,   109, 107, size, op);
1388c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlmarker,    106,  75, size, op);
1398c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlmask,       74,  43, size, op);
1408c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tpid,         42,  27, size, op);
1418c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ignore2stf,   26,  26, size, op);
1428c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tpid2,        25,  10, size, op);
1438c2ecf20Sopenharmony_ci	return size;
1448c2ecf20Sopenharmony_ci}
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci/* TPID and TPID2 are intentionally reversed so that semantic
1478c2ecf20Sopenharmony_ci * compatibility with E/T is kept.
1488c2ecf20Sopenharmony_ci */
1498c2ecf20Sopenharmony_cisize_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
1508c2ecf20Sopenharmony_ci						enum packing_op op)
1518c2ecf20Sopenharmony_ci{
1528c2ecf20Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY;
1538c2ecf20Sopenharmony_ci	struct sja1105_general_params_entry *entry = entry_ptr;
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vllupformat, 351, 351, size, op);
1568c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_ptacu,  350, 350, size, op);
1578c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->switchid,    349, 347, size, op);
1588c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->hostprio,    346, 344, size, op);
1598c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres1, 343, 296, size, op);
1608c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_fltres0, 295, 248, size, op);
1618c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt1,    247, 200, size, op);
1628c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mac_flt0,    199, 152, size, op);
1638c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt1, 151, 151, size, op);
1648c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->incl_srcpt0, 150, 150, size, op);
1658c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta1,  149, 149, size, op);
1668c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->send_meta0,  148, 148, size, op);
1678c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->casc_port,   147, 145, size, op);
1688c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->host_port,   144, 142, size, op);
1698c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mirr_port,   141, 139, size, op);
1708c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlmarker,    138, 107, size, op);
1718c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlmask,      106,  75, size, op);
1728c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tpid2,        74,  59, size, op);
1738c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ignore2stf,   58,  58, size, op);
1748c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tpid,         57,  42, size, op);
1758c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->queue_ts,     41,  41, size, op);
1768c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrvid,   40,  29, size, op);
1778c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrpcp,   28,  26, size, op);
1788c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egrmirrdei,   25,  25, size, op);
1798c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->replay_port,  24,  22, size, op);
1808c2ecf20Sopenharmony_ci	return size;
1818c2ecf20Sopenharmony_ci}
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_cistatic size_t
1848c2ecf20Sopenharmony_cisja1105_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
1858c2ecf20Sopenharmony_ci					   enum packing_op op)
1868c2ecf20Sopenharmony_ci{
1878c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY;
1888c2ecf20Sopenharmony_ci	struct sja1105_l2_forwarding_params_entry *entry = entry_ptr;
1898c2ecf20Sopenharmony_ci	int offset, i;
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->max_dynp, 95, 93, size, op);
1928c2ecf20Sopenharmony_ci	for (i = 0, offset = 13; i < 8; i++, offset += 10)
1938c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->part_spc[i],
1948c2ecf20Sopenharmony_ci				offset + 9, offset + 0, size, op);
1958c2ecf20Sopenharmony_ci	return size;
1968c2ecf20Sopenharmony_ci}
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_cisize_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
1998c2ecf20Sopenharmony_ci					   enum packing_op op)
2008c2ecf20Sopenharmony_ci{
2018c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_FORWARDING_ENTRY;
2028c2ecf20Sopenharmony_ci	struct sja1105_l2_forwarding_entry *entry = entry_ptr;
2038c2ecf20Sopenharmony_ci	int offset, i;
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->bc_domain,  63, 59, size, op);
2068c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->reach_port, 58, 54, size, op);
2078c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->fl_domain,  53, 49, size, op);
2088c2ecf20Sopenharmony_ci	for (i = 0, offset = 25; i < 8; i++, offset += 3)
2098c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->vlan_pmap[i],
2108c2ecf20Sopenharmony_ci				offset + 2, offset + 0, size, op);
2118c2ecf20Sopenharmony_ci	return size;
2128c2ecf20Sopenharmony_ci}
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_cistatic size_t
2158c2ecf20Sopenharmony_cisja1105et_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
2168c2ecf20Sopenharmony_ci					 enum packing_op op)
2178c2ecf20Sopenharmony_ci{
2188c2ecf20Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY;
2198c2ecf20Sopenharmony_ci	struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,         31, 17, size, op);
2228c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->dyn_tbsz,       16, 14, size, op);
2238c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->poly,           13,  6, size, op);
2248c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->shared_learn,    5,  5, size, op);
2258c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->no_enf_hostprt,  4,  4, size, op);
2268c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->no_mgmt_learn,   3,  3, size, op);
2278c2ecf20Sopenharmony_ci	return size;
2288c2ecf20Sopenharmony_ci}
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_cisize_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
2318c2ecf20Sopenharmony_ci						  enum packing_op op)
2328c2ecf20Sopenharmony_ci{
2338c2ecf20Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY;
2348c2ecf20Sopenharmony_ci	struct sja1105_l2_lookup_params_entry *entry = entry_ptr;
2358c2ecf20Sopenharmony_ci	int offset, i;
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	for (i = 0, offset = 58; i < 5; i++, offset += 11)
2388c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->maxaddrp[i],
2398c2ecf20Sopenharmony_ci				offset + 10, offset + 0, size, op);
2408c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,         57,  43, size, op);
2418c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->start_dynspc,   42,  33, size, op);
2428c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->drpnolearn,     32,  28, size, op);
2438c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->shared_learn,   27,  27, size, op);
2448c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->no_enf_hostprt, 26,  26, size, op);
2458c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->no_mgmt_learn,  25,  25, size, op);
2468c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->use_static,     24,  24, size, op);
2478c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->owr_dyn,        23,  23, size, op);
2488c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->learn_once,     22,  22, size, op);
2498c2ecf20Sopenharmony_ci	return size;
2508c2ecf20Sopenharmony_ci}
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_cisize_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
2538c2ecf20Sopenharmony_ci					 enum packing_op op)
2548c2ecf20Sopenharmony_ci{
2558c2ecf20Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY;
2568c2ecf20Sopenharmony_ci	struct sja1105_l2_lookup_entry *entry = entry_ptr;
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,    95, 84, size, op);
2598c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->macaddr,   83, 36, size, op);
2608c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->destports, 35, 31, size, op);
2618c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->enfport,   30, 30, size, op);
2628c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->index,     29, 20, size, op);
2638c2ecf20Sopenharmony_ci	return size;
2648c2ecf20Sopenharmony_ci}
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_cisize_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
2678c2ecf20Sopenharmony_ci					   enum packing_op op)
2688c2ecf20Sopenharmony_ci{
2698c2ecf20Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY;
2708c2ecf20Sopenharmony_ci	struct sja1105_l2_lookup_entry *entry = entry_ptr;
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci	if (entry->lockeds) {
2738c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->tsreg,    159, 159, size, op);
2748c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->mirrvlan, 158, 147, size, op);
2758c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->takets,   146, 146, size, op);
2768c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->mirr,     145, 145, size, op);
2778c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->retag,    144, 144, size, op);
2788c2ecf20Sopenharmony_ci	} else {
2798c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->touched,  159, 159, size, op);
2808c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->age,      158, 144, size, op);
2818c2ecf20Sopenharmony_ci	}
2828c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mask_iotag,   143, 143, size, op);
2838c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mask_vlanid,  142, 131, size, op);
2848c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->mask_macaddr, 130,  83, size, op);
2858c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->iotag,         82,  82, size, op);
2868c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,        81,  70, size, op);
2878c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->macaddr,       69,  22, size, op);
2888c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->destports,     21,  17, size, op);
2898c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->enfport,       16,  16, size, op);
2908c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->index,         15,   6, size, op);
2918c2ecf20Sopenharmony_ci	return size;
2928c2ecf20Sopenharmony_ci}
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_cistatic size_t sja1105_l2_policing_entry_packing(void *buf, void *entry_ptr,
2958c2ecf20Sopenharmony_ci						enum packing_op op)
2968c2ecf20Sopenharmony_ci{
2978c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_L2_POLICING_ENTRY;
2988c2ecf20Sopenharmony_ci	struct sja1105_l2_policing_entry *entry = entry_ptr;
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->sharindx,  63, 58, size, op);
3018c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->smax,      57, 42, size, op);
3028c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->rate,      41, 26, size, op);
3038c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->maxlen,    25, 15, size, op);
3048c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->partition, 14, 12, size, op);
3058c2ecf20Sopenharmony_ci	return size;
3068c2ecf20Sopenharmony_ci}
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_cistatic size_t sja1105et_mac_config_entry_packing(void *buf, void *entry_ptr,
3098c2ecf20Sopenharmony_ci						 enum packing_op op)
3108c2ecf20Sopenharmony_ci{
3118c2ecf20Sopenharmony_ci	const size_t size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY;
3128c2ecf20Sopenharmony_ci	struct sja1105_mac_config_entry *entry = entry_ptr;
3138c2ecf20Sopenharmony_ci	int offset, i;
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci	for (i = 0, offset = 72; i < 8; i++, offset += 19) {
3168c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->enabled[i],
3178c2ecf20Sopenharmony_ci				offset +  0, offset +  0, size, op);
3188c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->base[i],
3198c2ecf20Sopenharmony_ci				offset +  9, offset +  1, size, op);
3208c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->top[i],
3218c2ecf20Sopenharmony_ci				offset + 18, offset + 10, size, op);
3228c2ecf20Sopenharmony_ci	}
3238c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ifg,       71, 67, size, op);
3248c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->speed,     66, 65, size, op);
3258c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delin,  64, 49, size, op);
3268c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delout, 48, 33, size, op);
3278c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,    32, 25, size, op);
3288c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlanprio,  24, 22, size, op);
3298c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,    21, 10, size, op);
3308c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ing_mirr,   9,  9, size, op);
3318c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egr_mirr,   8,  8, size, op);
3328c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->drpnona664, 7,  7, size, op);
3338c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->drpdtag,    6,  6, size, op);
3348c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->drpuntag,   5,  5, size, op);
3358c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->retag,      4,  4, size, op);
3368c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->dyn_learn,  3,  3, size, op);
3378c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egress,     2,  2, size, op);
3388c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ingress,    1,  1, size, op);
3398c2ecf20Sopenharmony_ci	return size;
3408c2ecf20Sopenharmony_ci}
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_cisize_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
3438c2ecf20Sopenharmony_ci					    enum packing_op op)
3448c2ecf20Sopenharmony_ci{
3458c2ecf20Sopenharmony_ci	const size_t size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY;
3468c2ecf20Sopenharmony_ci	struct sja1105_mac_config_entry *entry = entry_ptr;
3478c2ecf20Sopenharmony_ci	int offset, i;
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_ci	for (i = 0, offset = 104; i < 8; i++, offset += 19) {
3508c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->enabled[i],
3518c2ecf20Sopenharmony_ci				offset +  0, offset +  0, size, op);
3528c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->base[i],
3538c2ecf20Sopenharmony_ci				offset +  9, offset +  1, size, op);
3548c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->top[i],
3558c2ecf20Sopenharmony_ci				offset + 18, offset + 10, size, op);
3568c2ecf20Sopenharmony_ci	}
3578c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ifg,       103, 99, size, op);
3588c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->speed,      98, 97, size, op);
3598c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delin,   96, 81, size, op);
3608c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tp_delout,  80, 65, size, op);
3618c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->maxage,     64, 57, size, op);
3628c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlanprio,   56, 54, size, op);
3638c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,     53, 42, size, op);
3648c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ing_mirr,   41, 41, size, op);
3658c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egr_mirr,   40, 40, size, op);
3668c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->drpnona664, 39, 39, size, op);
3678c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->drpdtag,    38, 38, size, op);
3688c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->drpuntag,   35, 35, size, op);
3698c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->retag,      34, 34, size, op);
3708c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->dyn_learn,  33, 33, size, op);
3718c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egress,     32, 32, size, op);
3728c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ingress,    31, 31, size, op);
3738c2ecf20Sopenharmony_ci	return size;
3748c2ecf20Sopenharmony_ci}
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_cistatic size_t
3778c2ecf20Sopenharmony_cisja1105_schedule_entry_points_params_entry_packing(void *buf, void *entry_ptr,
3788c2ecf20Sopenharmony_ci						   enum packing_op op)
3798c2ecf20Sopenharmony_ci{
3808c2ecf20Sopenharmony_ci	struct sja1105_schedule_entry_points_params_entry *entry = entry_ptr;
3818c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY;
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->clksrc,    31, 30, size, op);
3848c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->actsubsch, 29, 27, size, op);
3858c2ecf20Sopenharmony_ci	return size;
3868c2ecf20Sopenharmony_ci}
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_cistatic size_t
3898c2ecf20Sopenharmony_cisja1105_schedule_entry_points_entry_packing(void *buf, void *entry_ptr,
3908c2ecf20Sopenharmony_ci					    enum packing_op op)
3918c2ecf20Sopenharmony_ci{
3928c2ecf20Sopenharmony_ci	struct sja1105_schedule_entry_points_entry *entry = entry_ptr;
3938c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY;
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->subschindx, 31, 29, size, op);
3968c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->delta,      28, 11, size, op);
3978c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->address,    10, 1,  size, op);
3988c2ecf20Sopenharmony_ci	return size;
3998c2ecf20Sopenharmony_ci}
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_cistatic size_t sja1105_schedule_params_entry_packing(void *buf, void *entry_ptr,
4028c2ecf20Sopenharmony_ci						    enum packing_op op)
4038c2ecf20Sopenharmony_ci{
4048c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY;
4058c2ecf20Sopenharmony_ci	struct sja1105_schedule_params_entry *entry = entry_ptr;
4068c2ecf20Sopenharmony_ci	int offset, i;
4078c2ecf20Sopenharmony_ci
4088c2ecf20Sopenharmony_ci	for (i = 0, offset = 16; i < 8; i++, offset += 10)
4098c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->subscheind[i],
4108c2ecf20Sopenharmony_ci				offset + 9, offset + 0, size, op);
4118c2ecf20Sopenharmony_ci	return size;
4128c2ecf20Sopenharmony_ci}
4138c2ecf20Sopenharmony_ci
4148c2ecf20Sopenharmony_cistatic size_t sja1105_schedule_entry_packing(void *buf, void *entry_ptr,
4158c2ecf20Sopenharmony_ci					     enum packing_op op)
4168c2ecf20Sopenharmony_ci{
4178c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_SCHEDULE_ENTRY;
4188c2ecf20Sopenharmony_ci	struct sja1105_schedule_entry *entry = entry_ptr;
4198c2ecf20Sopenharmony_ci
4208c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->winstindex,  63, 54, size, op);
4218c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->winend,      53, 53, size, op);
4228c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->winst,       52, 52, size, op);
4238c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->destports,   51, 47, size, op);
4248c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->setvalid,    46, 46, size, op);
4258c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->txen,        45, 45, size, op);
4268c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->resmedia_en, 44, 44, size, op);
4278c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->resmedia,    43, 36, size, op);
4288c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlindex,     35, 26, size, op);
4298c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->delta,       25, 8,  size, op);
4308c2ecf20Sopenharmony_ci	return size;
4318c2ecf20Sopenharmony_ci}
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_cistatic size_t
4348c2ecf20Sopenharmony_cisja1105_vl_forwarding_params_entry_packing(void *buf, void *entry_ptr,
4358c2ecf20Sopenharmony_ci					   enum packing_op op)
4368c2ecf20Sopenharmony_ci{
4378c2ecf20Sopenharmony_ci	struct sja1105_vl_forwarding_params_entry *entry = entry_ptr;
4388c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY;
4398c2ecf20Sopenharmony_ci	int offset, i;
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_ci	for (i = 0, offset = 16; i < 8; i++, offset += 10)
4428c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->partspc[i],
4438c2ecf20Sopenharmony_ci				offset + 9, offset + 0, size, op);
4448c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->debugen, 15, 15, size, op);
4458c2ecf20Sopenharmony_ci	return size;
4468c2ecf20Sopenharmony_ci}
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_cistatic size_t sja1105_vl_forwarding_entry_packing(void *buf, void *entry_ptr,
4498c2ecf20Sopenharmony_ci						  enum packing_op op)
4508c2ecf20Sopenharmony_ci{
4518c2ecf20Sopenharmony_ci	struct sja1105_vl_forwarding_entry *entry = entry_ptr;
4528c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_FORWARDING_ENTRY;
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->type,      31, 31, size, op);
4558c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->priority,  30, 28, size, op);
4568c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->partition, 27, 25, size, op);
4578c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->destports, 24, 20, size, op);
4588c2ecf20Sopenharmony_ci	return size;
4598c2ecf20Sopenharmony_ci}
4608c2ecf20Sopenharmony_ci
4618c2ecf20Sopenharmony_cisize_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
4628c2ecf20Sopenharmony_ci				       enum packing_op op)
4638c2ecf20Sopenharmony_ci{
4648c2ecf20Sopenharmony_ci	struct sja1105_vl_lookup_entry *entry = entry_ptr;
4658c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_LOOKUP_ENTRY;
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	if (entry->format == SJA1105_VL_FORMAT_PSFP) {
4688c2ecf20Sopenharmony_ci		/* Interpreting vllupformat as 0 */
4698c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->destports,
4708c2ecf20Sopenharmony_ci				95, 91, size, op);
4718c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->iscritical,
4728c2ecf20Sopenharmony_ci				90, 90, size, op);
4738c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->macaddr,
4748c2ecf20Sopenharmony_ci				89, 42, size, op);
4758c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->vlanid,
4768c2ecf20Sopenharmony_ci				41, 30, size, op);
4778c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->port,
4788c2ecf20Sopenharmony_ci				29, 27, size, op);
4798c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->vlanprior,
4808c2ecf20Sopenharmony_ci				26, 24, size, op);
4818c2ecf20Sopenharmony_ci	} else {
4828c2ecf20Sopenharmony_ci		/* Interpreting vllupformat as 1 */
4838c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->egrmirr,
4848c2ecf20Sopenharmony_ci				95, 91, size, op);
4858c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->ingrmirr,
4868c2ecf20Sopenharmony_ci				90, 90, size, op);
4878c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->vlid,
4888c2ecf20Sopenharmony_ci				57, 42, size, op);
4898c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->port,
4908c2ecf20Sopenharmony_ci				29, 27, size, op);
4918c2ecf20Sopenharmony_ci	}
4928c2ecf20Sopenharmony_ci	return size;
4938c2ecf20Sopenharmony_ci}
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_cistatic size_t sja1105_vl_policing_entry_packing(void *buf, void *entry_ptr,
4968c2ecf20Sopenharmony_ci						enum packing_op op)
4978c2ecf20Sopenharmony_ci{
4988c2ecf20Sopenharmony_ci	struct sja1105_vl_policing_entry *entry = entry_ptr;
4998c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_VL_POLICING_ENTRY;
5008c2ecf20Sopenharmony_ci
5018c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->type,      63, 63, size, op);
5028c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->maxlen,    62, 52, size, op);
5038c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->sharindx,  51, 42, size, op);
5048c2ecf20Sopenharmony_ci	if (entry->type == 0) {
5058c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->bag,    41, 28, size, op);
5068c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->jitter, 27, 18, size, op);
5078c2ecf20Sopenharmony_ci	}
5088c2ecf20Sopenharmony_ci	return size;
5098c2ecf20Sopenharmony_ci}
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_cisize_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
5128c2ecf20Sopenharmony_ci					 enum packing_op op)
5138c2ecf20Sopenharmony_ci{
5148c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY;
5158c2ecf20Sopenharmony_ci	struct sja1105_vlan_lookup_entry *entry = entry_ptr;
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ving_mirr,  63, 59, size, op);
5188c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vegr_mirr,  58, 54, size, op);
5198c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vmemb_port, 53, 49, size, op);
5208c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_bc,    48, 44, size, op);
5218c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->tag_port,   43, 39, size, op);
5228c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlanid,     38, 27, size, op);
5238c2ecf20Sopenharmony_ci	return size;
5248c2ecf20Sopenharmony_ci}
5258c2ecf20Sopenharmony_ci
5268c2ecf20Sopenharmony_cistatic size_t sja1105_xmii_params_entry_packing(void *buf, void *entry_ptr,
5278c2ecf20Sopenharmony_ci						enum packing_op op)
5288c2ecf20Sopenharmony_ci{
5298c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_XMII_PARAMS_ENTRY;
5308c2ecf20Sopenharmony_ci	struct sja1105_xmii_params_entry *entry = entry_ptr;
5318c2ecf20Sopenharmony_ci	int offset, i;
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci	for (i = 0, offset = 17; i < 5; i++, offset += 3) {
5348c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->xmii_mode[i],
5358c2ecf20Sopenharmony_ci				offset + 1, offset + 0, size, op);
5368c2ecf20Sopenharmony_ci		sja1105_packing(buf, &entry->phy_mac[i],
5378c2ecf20Sopenharmony_ci				offset + 2, offset + 2, size, op);
5388c2ecf20Sopenharmony_ci	}
5398c2ecf20Sopenharmony_ci	return size;
5408c2ecf20Sopenharmony_ci}
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_cisize_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
5438c2ecf20Sopenharmony_ci				       enum packing_op op)
5448c2ecf20Sopenharmony_ci{
5458c2ecf20Sopenharmony_ci	struct sja1105_retagging_entry *entry = entry_ptr;
5468c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_RETAGGING_ENTRY;
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->egr_port,       63, 59, size, op);
5498c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->ing_port,       58, 54, size, op);
5508c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_ing,       53, 42, size, op);
5518c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->vlan_egr,       41, 30, size, op);
5528c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->do_not_learn,   29, 29, size, op);
5538c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->use_dest_ports, 28, 28, size, op);
5548c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->destports,      27, 23, size, op);
5558c2ecf20Sopenharmony_ci	return size;
5568c2ecf20Sopenharmony_ci}
5578c2ecf20Sopenharmony_ci
5588c2ecf20Sopenharmony_cisize_t sja1105_table_header_packing(void *buf, void *entry_ptr,
5598c2ecf20Sopenharmony_ci				    enum packing_op op)
5608c2ecf20Sopenharmony_ci{
5618c2ecf20Sopenharmony_ci	const size_t size = SJA1105_SIZE_TABLE_HEADER;
5628c2ecf20Sopenharmony_ci	struct sja1105_table_header *entry = entry_ptr;
5638c2ecf20Sopenharmony_ci
5648c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->block_id, 31, 24, size, op);
5658c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->len,      55, 32, size, op);
5668c2ecf20Sopenharmony_ci	sja1105_packing(buf, &entry->crc,      95, 64, size, op);
5678c2ecf20Sopenharmony_ci	return size;
5688c2ecf20Sopenharmony_ci}
5698c2ecf20Sopenharmony_ci
5708c2ecf20Sopenharmony_ci/* WARNING: the *hdr pointer is really non-const, because it is
5718c2ecf20Sopenharmony_ci * modifying the CRC of the header for a 2-stage packing operation
5728c2ecf20Sopenharmony_ci */
5738c2ecf20Sopenharmony_civoid
5748c2ecf20Sopenharmony_cisja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr)
5758c2ecf20Sopenharmony_ci{
5768c2ecf20Sopenharmony_ci	/* First pack the table as-is, then calculate the CRC, and
5778c2ecf20Sopenharmony_ci	 * finally put the proper CRC into the packed buffer
5788c2ecf20Sopenharmony_ci	 */
5798c2ecf20Sopenharmony_ci	memset(buf, 0, SJA1105_SIZE_TABLE_HEADER);
5808c2ecf20Sopenharmony_ci	sja1105_table_header_packing(buf, hdr, PACK);
5818c2ecf20Sopenharmony_ci	hdr->crc = sja1105_crc32(buf, SJA1105_SIZE_TABLE_HEADER - 4);
5828c2ecf20Sopenharmony_ci	sja1105_pack(buf + SJA1105_SIZE_TABLE_HEADER - 4, &hdr->crc, 31, 0, 4);
5838c2ecf20Sopenharmony_ci}
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_cistatic void sja1105_table_write_crc(u8 *table_start, u8 *crc_ptr)
5868c2ecf20Sopenharmony_ci{
5878c2ecf20Sopenharmony_ci	u64 computed_crc;
5888c2ecf20Sopenharmony_ci	int len_bytes;
5898c2ecf20Sopenharmony_ci
5908c2ecf20Sopenharmony_ci	len_bytes = (uintptr_t)(crc_ptr - table_start);
5918c2ecf20Sopenharmony_ci	computed_crc = sja1105_crc32(table_start, len_bytes);
5928c2ecf20Sopenharmony_ci	sja1105_pack(crc_ptr, &computed_crc, 31, 0, 4);
5938c2ecf20Sopenharmony_ci}
5948c2ecf20Sopenharmony_ci
5958c2ecf20Sopenharmony_ci/* The block IDs that the switches support are unfortunately sparse, so keep a
5968c2ecf20Sopenharmony_ci * mapping table to "block indices" and translate back and forth so that we
5978c2ecf20Sopenharmony_ci * don't waste useless memory in struct sja1105_static_config.
5988c2ecf20Sopenharmony_ci * Also, since the block id comes from essentially untrusted input (unpacking
5998c2ecf20Sopenharmony_ci * the static config from userspace) it has to be sanitized (range-checked)
6008c2ecf20Sopenharmony_ci * before blindly indexing kernel memory with the blk_idx.
6018c2ecf20Sopenharmony_ci */
6028c2ecf20Sopenharmony_cistatic u64 blk_id_map[BLK_IDX_MAX] = {
6038c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE] = BLKID_SCHEDULE,
6048c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = BLKID_SCHEDULE_ENTRY_POINTS,
6058c2ecf20Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = BLKID_VL_LOOKUP,
6068c2ecf20Sopenharmony_ci	[BLK_IDX_VL_POLICING] = BLKID_VL_POLICING,
6078c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = BLKID_VL_FORWARDING,
6088c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = BLKID_L2_LOOKUP,
6098c2ecf20Sopenharmony_ci	[BLK_IDX_L2_POLICING] = BLKID_L2_POLICING,
6108c2ecf20Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = BLKID_VLAN_LOOKUP,
6118c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = BLKID_L2_FORWARDING,
6128c2ecf20Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = BLKID_MAC_CONFIG,
6138c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = BLKID_SCHEDULE_PARAMS,
6148c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = BLKID_SCHEDULE_ENTRY_POINTS_PARAMS,
6158c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = BLKID_VL_FORWARDING_PARAMS,
6168c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = BLKID_L2_LOOKUP_PARAMS,
6178c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = BLKID_L2_FORWARDING_PARAMS,
6188c2ecf20Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = BLKID_AVB_PARAMS,
6198c2ecf20Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = BLKID_GENERAL_PARAMS,
6208c2ecf20Sopenharmony_ci	[BLK_IDX_RETAGGING] = BLKID_RETAGGING,
6218c2ecf20Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = BLKID_XMII_PARAMS,
6228c2ecf20Sopenharmony_ci};
6238c2ecf20Sopenharmony_ci
6248c2ecf20Sopenharmony_ciconst char *sja1105_static_config_error_msg[] = {
6258c2ecf20Sopenharmony_ci	[SJA1105_CONFIG_OK] = "",
6268c2ecf20Sopenharmony_ci	[SJA1105_TTETHERNET_NOT_SUPPORTED] =
6278c2ecf20Sopenharmony_ci		"schedule-table present, but TTEthernet is "
6288c2ecf20Sopenharmony_ci		"only supported on T and Q/S",
6298c2ecf20Sopenharmony_ci	[SJA1105_INCORRECT_TTETHERNET_CONFIGURATION] =
6308c2ecf20Sopenharmony_ci		"schedule-table present, but one of "
6318c2ecf20Sopenharmony_ci		"schedule-entry-points-table, schedule-parameters-table or "
6328c2ecf20Sopenharmony_ci		"schedule-entry-points-parameters table is empty",
6338c2ecf20Sopenharmony_ci	[SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION] =
6348c2ecf20Sopenharmony_ci		"vl-lookup-table present, but one of vl-policing-table, "
6358c2ecf20Sopenharmony_ci		"vl-forwarding-table or vl-forwarding-parameters-table is empty",
6368c2ecf20Sopenharmony_ci	[SJA1105_MISSING_L2_POLICING_TABLE] =
6378c2ecf20Sopenharmony_ci		"l2-policing-table needs to have at least one entry",
6388c2ecf20Sopenharmony_ci	[SJA1105_MISSING_L2_FORWARDING_TABLE] =
6398c2ecf20Sopenharmony_ci		"l2-forwarding-table is either missing or incomplete",
6408c2ecf20Sopenharmony_ci	[SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE] =
6418c2ecf20Sopenharmony_ci		"l2-forwarding-parameters-table is missing",
6428c2ecf20Sopenharmony_ci	[SJA1105_MISSING_GENERAL_PARAMS_TABLE] =
6438c2ecf20Sopenharmony_ci		"general-parameters-table is missing",
6448c2ecf20Sopenharmony_ci	[SJA1105_MISSING_VLAN_TABLE] =
6458c2ecf20Sopenharmony_ci		"vlan-lookup-table needs to have at least the default untagged VLAN",
6468c2ecf20Sopenharmony_ci	[SJA1105_MISSING_XMII_TABLE] =
6478c2ecf20Sopenharmony_ci		"xmii-table is missing",
6488c2ecf20Sopenharmony_ci	[SJA1105_MISSING_MAC_TABLE] =
6498c2ecf20Sopenharmony_ci		"mac-configuration-table needs to contain an entry for each port",
6508c2ecf20Sopenharmony_ci	[SJA1105_OVERCOMMITTED_FRAME_MEMORY] =
6518c2ecf20Sopenharmony_ci		"Not allowed to overcommit frame memory. L2 memory partitions "
6528c2ecf20Sopenharmony_ci		"and VL memory partitions share the same space. The sum of all "
6538c2ecf20Sopenharmony_ci		"16 memory partitions is not allowed to be larger than 929 "
6548c2ecf20Sopenharmony_ci		"128-byte blocks (or 910 with retagging). Please adjust "
6558c2ecf20Sopenharmony_ci		"l2-forwarding-parameters-table.part_spc and/or "
6568c2ecf20Sopenharmony_ci		"vl-forwarding-parameters-table.partspc.",
6578c2ecf20Sopenharmony_ci};
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_cistatic sja1105_config_valid_t
6608c2ecf20Sopenharmony_cistatic_config_check_memory_size(const struct sja1105_table *tables)
6618c2ecf20Sopenharmony_ci{
6628c2ecf20Sopenharmony_ci	const struct sja1105_l2_forwarding_params_entry *l2_fwd_params;
6638c2ecf20Sopenharmony_ci	const struct sja1105_vl_forwarding_params_entry *vl_fwd_params;
6648c2ecf20Sopenharmony_ci	int i, max_mem, mem = 0;
6658c2ecf20Sopenharmony_ci
6668c2ecf20Sopenharmony_ci	l2_fwd_params = tables[BLK_IDX_L2_FORWARDING_PARAMS].entries;
6678c2ecf20Sopenharmony_ci
6688c2ecf20Sopenharmony_ci	for (i = 0; i < 8; i++)
6698c2ecf20Sopenharmony_ci		mem += l2_fwd_params->part_spc[i];
6708c2ecf20Sopenharmony_ci
6718c2ecf20Sopenharmony_ci	if (tables[BLK_IDX_VL_FORWARDING_PARAMS].entry_count) {
6728c2ecf20Sopenharmony_ci		vl_fwd_params = tables[BLK_IDX_VL_FORWARDING_PARAMS].entries;
6738c2ecf20Sopenharmony_ci		for (i = 0; i < 8; i++)
6748c2ecf20Sopenharmony_ci			mem += vl_fwd_params->partspc[i];
6758c2ecf20Sopenharmony_ci	}
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_ci	if (tables[BLK_IDX_RETAGGING].entry_count)
6788c2ecf20Sopenharmony_ci		max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING;
6798c2ecf20Sopenharmony_ci	else
6808c2ecf20Sopenharmony_ci		max_mem = SJA1105_MAX_FRAME_MEMORY;
6818c2ecf20Sopenharmony_ci
6828c2ecf20Sopenharmony_ci	if (mem > max_mem)
6838c2ecf20Sopenharmony_ci		return SJA1105_OVERCOMMITTED_FRAME_MEMORY;
6848c2ecf20Sopenharmony_ci
6858c2ecf20Sopenharmony_ci	return SJA1105_CONFIG_OK;
6868c2ecf20Sopenharmony_ci}
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_cisja1105_config_valid_t
6898c2ecf20Sopenharmony_cisja1105_static_config_check_valid(const struct sja1105_static_config *config)
6908c2ecf20Sopenharmony_ci{
6918c2ecf20Sopenharmony_ci	const struct sja1105_table *tables = config->tables;
6928c2ecf20Sopenharmony_ci#define IS_FULL(blk_idx) \
6938c2ecf20Sopenharmony_ci	(tables[blk_idx].entry_count == tables[blk_idx].ops->max_entry_count)
6948c2ecf20Sopenharmony_ci
6958c2ecf20Sopenharmony_ci	if (tables[BLK_IDX_SCHEDULE].entry_count) {
6968c2ecf20Sopenharmony_ci		if (config->device_id != SJA1105T_DEVICE_ID &&
6978c2ecf20Sopenharmony_ci		    config->device_id != SJA1105QS_DEVICE_ID)
6988c2ecf20Sopenharmony_ci			return SJA1105_TTETHERNET_NOT_SUPPORTED;
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_ci		if (tables[BLK_IDX_SCHEDULE_ENTRY_POINTS].entry_count == 0)
7018c2ecf20Sopenharmony_ci			return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION;
7028c2ecf20Sopenharmony_ci
7038c2ecf20Sopenharmony_ci		if (!IS_FULL(BLK_IDX_SCHEDULE_PARAMS))
7048c2ecf20Sopenharmony_ci			return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION;
7058c2ecf20Sopenharmony_ci
7068c2ecf20Sopenharmony_ci		if (!IS_FULL(BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS))
7078c2ecf20Sopenharmony_ci			return SJA1105_INCORRECT_TTETHERNET_CONFIGURATION;
7088c2ecf20Sopenharmony_ci	}
7098c2ecf20Sopenharmony_ci	if (tables[BLK_IDX_VL_LOOKUP].entry_count) {
7108c2ecf20Sopenharmony_ci		struct sja1105_vl_lookup_entry *vl_lookup;
7118c2ecf20Sopenharmony_ci		bool has_critical_links = false;
7128c2ecf20Sopenharmony_ci		int i;
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci		vl_lookup = tables[BLK_IDX_VL_LOOKUP].entries;
7158c2ecf20Sopenharmony_ci
7168c2ecf20Sopenharmony_ci		for (i = 0; i < tables[BLK_IDX_VL_LOOKUP].entry_count; i++) {
7178c2ecf20Sopenharmony_ci			if (vl_lookup[i].iscritical) {
7188c2ecf20Sopenharmony_ci				has_critical_links = true;
7198c2ecf20Sopenharmony_ci				break;
7208c2ecf20Sopenharmony_ci			}
7218c2ecf20Sopenharmony_ci		}
7228c2ecf20Sopenharmony_ci
7238c2ecf20Sopenharmony_ci		if (tables[BLK_IDX_VL_POLICING].entry_count == 0 &&
7248c2ecf20Sopenharmony_ci		    has_critical_links)
7258c2ecf20Sopenharmony_ci			return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION;
7268c2ecf20Sopenharmony_ci
7278c2ecf20Sopenharmony_ci		if (tables[BLK_IDX_VL_FORWARDING].entry_count == 0 &&
7288c2ecf20Sopenharmony_ci		    has_critical_links)
7298c2ecf20Sopenharmony_ci			return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION;
7308c2ecf20Sopenharmony_ci
7318c2ecf20Sopenharmony_ci		if (tables[BLK_IDX_VL_FORWARDING_PARAMS].entry_count == 0 &&
7328c2ecf20Sopenharmony_ci		    has_critical_links)
7338c2ecf20Sopenharmony_ci			return SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION;
7348c2ecf20Sopenharmony_ci	}
7358c2ecf20Sopenharmony_ci
7368c2ecf20Sopenharmony_ci	if (tables[BLK_IDX_L2_POLICING].entry_count == 0)
7378c2ecf20Sopenharmony_ci		return SJA1105_MISSING_L2_POLICING_TABLE;
7388c2ecf20Sopenharmony_ci
7398c2ecf20Sopenharmony_ci	if (tables[BLK_IDX_VLAN_LOOKUP].entry_count == 0)
7408c2ecf20Sopenharmony_ci		return SJA1105_MISSING_VLAN_TABLE;
7418c2ecf20Sopenharmony_ci
7428c2ecf20Sopenharmony_ci	if (!IS_FULL(BLK_IDX_L2_FORWARDING))
7438c2ecf20Sopenharmony_ci		return SJA1105_MISSING_L2_FORWARDING_TABLE;
7448c2ecf20Sopenharmony_ci
7458c2ecf20Sopenharmony_ci	if (!IS_FULL(BLK_IDX_MAC_CONFIG))
7468c2ecf20Sopenharmony_ci		return SJA1105_MISSING_MAC_TABLE;
7478c2ecf20Sopenharmony_ci
7488c2ecf20Sopenharmony_ci	if (!IS_FULL(BLK_IDX_L2_FORWARDING_PARAMS))
7498c2ecf20Sopenharmony_ci		return SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE;
7508c2ecf20Sopenharmony_ci
7518c2ecf20Sopenharmony_ci	if (!IS_FULL(BLK_IDX_GENERAL_PARAMS))
7528c2ecf20Sopenharmony_ci		return SJA1105_MISSING_GENERAL_PARAMS_TABLE;
7538c2ecf20Sopenharmony_ci
7548c2ecf20Sopenharmony_ci	if (!IS_FULL(BLK_IDX_XMII_PARAMS))
7558c2ecf20Sopenharmony_ci		return SJA1105_MISSING_XMII_TABLE;
7568c2ecf20Sopenharmony_ci
7578c2ecf20Sopenharmony_ci	return static_config_check_memory_size(tables);
7588c2ecf20Sopenharmony_ci#undef IS_FULL
7598c2ecf20Sopenharmony_ci}
7608c2ecf20Sopenharmony_ci
7618c2ecf20Sopenharmony_civoid
7628c2ecf20Sopenharmony_cisja1105_static_config_pack(void *buf, struct sja1105_static_config *config)
7638c2ecf20Sopenharmony_ci{
7648c2ecf20Sopenharmony_ci	struct sja1105_table_header header = {0};
7658c2ecf20Sopenharmony_ci	enum sja1105_blk_idx i;
7668c2ecf20Sopenharmony_ci	char *p = buf;
7678c2ecf20Sopenharmony_ci	int j;
7688c2ecf20Sopenharmony_ci
7698c2ecf20Sopenharmony_ci	sja1105_pack(p, &config->device_id, 31, 0, 4);
7708c2ecf20Sopenharmony_ci	p += SJA1105_SIZE_DEVICE_ID;
7718c2ecf20Sopenharmony_ci
7728c2ecf20Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++) {
7738c2ecf20Sopenharmony_ci		const struct sja1105_table *table;
7748c2ecf20Sopenharmony_ci		char *table_start;
7758c2ecf20Sopenharmony_ci
7768c2ecf20Sopenharmony_ci		table = &config->tables[i];
7778c2ecf20Sopenharmony_ci		if (!table->entry_count)
7788c2ecf20Sopenharmony_ci			continue;
7798c2ecf20Sopenharmony_ci
7808c2ecf20Sopenharmony_ci		header.block_id = blk_id_map[i];
7818c2ecf20Sopenharmony_ci		header.len = table->entry_count *
7828c2ecf20Sopenharmony_ci			     table->ops->packed_entry_size / 4;
7838c2ecf20Sopenharmony_ci		sja1105_table_header_pack_with_crc(p, &header);
7848c2ecf20Sopenharmony_ci		p += SJA1105_SIZE_TABLE_HEADER;
7858c2ecf20Sopenharmony_ci		table_start = p;
7868c2ecf20Sopenharmony_ci		for (j = 0; j < table->entry_count; j++) {
7878c2ecf20Sopenharmony_ci			u8 *entry_ptr = table->entries;
7888c2ecf20Sopenharmony_ci
7898c2ecf20Sopenharmony_ci			entry_ptr += j * table->ops->unpacked_entry_size;
7908c2ecf20Sopenharmony_ci			memset(p, 0, table->ops->packed_entry_size);
7918c2ecf20Sopenharmony_ci			table->ops->packing(p, entry_ptr, PACK);
7928c2ecf20Sopenharmony_ci			p += table->ops->packed_entry_size;
7938c2ecf20Sopenharmony_ci		}
7948c2ecf20Sopenharmony_ci		sja1105_table_write_crc(table_start, p);
7958c2ecf20Sopenharmony_ci		p += 4;
7968c2ecf20Sopenharmony_ci	}
7978c2ecf20Sopenharmony_ci	/* Final header:
7988c2ecf20Sopenharmony_ci	 * Block ID does not matter
7998c2ecf20Sopenharmony_ci	 * Length of 0 marks that header is final
8008c2ecf20Sopenharmony_ci	 * CRC will be replaced on-the-fly on "config upload"
8018c2ecf20Sopenharmony_ci	 */
8028c2ecf20Sopenharmony_ci	header.block_id = 0;
8038c2ecf20Sopenharmony_ci	header.len = 0;
8048c2ecf20Sopenharmony_ci	header.crc = 0xDEADBEEF;
8058c2ecf20Sopenharmony_ci	memset(p, 0, SJA1105_SIZE_TABLE_HEADER);
8068c2ecf20Sopenharmony_ci	sja1105_table_header_packing(p, &header, PACK);
8078c2ecf20Sopenharmony_ci}
8088c2ecf20Sopenharmony_ci
8098c2ecf20Sopenharmony_cisize_t
8108c2ecf20Sopenharmony_cisja1105_static_config_get_length(const struct sja1105_static_config *config)
8118c2ecf20Sopenharmony_ci{
8128c2ecf20Sopenharmony_ci	unsigned int sum;
8138c2ecf20Sopenharmony_ci	unsigned int header_count;
8148c2ecf20Sopenharmony_ci	enum sja1105_blk_idx i;
8158c2ecf20Sopenharmony_ci
8168c2ecf20Sopenharmony_ci	/* Ending header */
8178c2ecf20Sopenharmony_ci	header_count = 1;
8188c2ecf20Sopenharmony_ci	sum = SJA1105_SIZE_DEVICE_ID;
8198c2ecf20Sopenharmony_ci
8208c2ecf20Sopenharmony_ci	/* Tables (headers and entries) */
8218c2ecf20Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++) {
8228c2ecf20Sopenharmony_ci		const struct sja1105_table *table;
8238c2ecf20Sopenharmony_ci
8248c2ecf20Sopenharmony_ci		table = &config->tables[i];
8258c2ecf20Sopenharmony_ci		if (table->entry_count)
8268c2ecf20Sopenharmony_ci			header_count++;
8278c2ecf20Sopenharmony_ci
8288c2ecf20Sopenharmony_ci		sum += table->ops->packed_entry_size * table->entry_count;
8298c2ecf20Sopenharmony_ci	}
8308c2ecf20Sopenharmony_ci	/* Headers have an additional CRC at the end */
8318c2ecf20Sopenharmony_ci	sum += header_count * (SJA1105_SIZE_TABLE_HEADER + 4);
8328c2ecf20Sopenharmony_ci	/* Last header does not have an extra CRC because there is no data */
8338c2ecf20Sopenharmony_ci	sum -= 4;
8348c2ecf20Sopenharmony_ci
8358c2ecf20Sopenharmony_ci	return sum;
8368c2ecf20Sopenharmony_ci}
8378c2ecf20Sopenharmony_ci
8388c2ecf20Sopenharmony_ci/* Compatibility matrices */
8398c2ecf20Sopenharmony_ci
8408c2ecf20Sopenharmony_ci/* SJA1105E: First generation, no TTEthernet */
8418c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX] = {
8428c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
8438c2ecf20Sopenharmony_ci		.packing = sja1105et_l2_lookup_entry_packing,
8448c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
8458c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY,
8468c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
8478c2ecf20Sopenharmony_ci	},
8488c2ecf20Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
8498c2ecf20Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
8508c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
8518c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
8528c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
8538c2ecf20Sopenharmony_ci	},
8548c2ecf20Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
8558c2ecf20Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
8568c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
8578c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
8588c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
8598c2ecf20Sopenharmony_ci	},
8608c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
8618c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
8628c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
8638c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
8648c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
8658c2ecf20Sopenharmony_ci	},
8668c2ecf20Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
8678c2ecf20Sopenharmony_ci		.packing = sja1105et_mac_config_entry_packing,
8688c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
8698c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
8708c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
8718c2ecf20Sopenharmony_ci	},
8728c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
8738c2ecf20Sopenharmony_ci		.packing = sja1105et_l2_lookup_params_entry_packing,
8748c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
8758c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY,
8768c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
8778c2ecf20Sopenharmony_ci	},
8788c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
8798c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
8808c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
8818c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
8828c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
8838c2ecf20Sopenharmony_ci	},
8848c2ecf20Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
8858c2ecf20Sopenharmony_ci		.packing = sja1105et_avb_params_entry_packing,
8868c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
8878c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY,
8888c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
8898c2ecf20Sopenharmony_ci	},
8908c2ecf20Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
8918c2ecf20Sopenharmony_ci		.packing = sja1105et_general_params_entry_packing,
8928c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
8938c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY,
8948c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
8958c2ecf20Sopenharmony_ci	},
8968c2ecf20Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
8978c2ecf20Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
8988c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
8998c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
9008c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
9018c2ecf20Sopenharmony_ci	},
9028c2ecf20Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
9038c2ecf20Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
9048c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
9058c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
9068c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
9078c2ecf20Sopenharmony_ci	},
9088c2ecf20Sopenharmony_ci};
9098c2ecf20Sopenharmony_ci
9108c2ecf20Sopenharmony_ci/* SJA1105T: First generation, TTEthernet */
9118c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX] = {
9128c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE] = {
9138c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_packing,
9148c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry),
9158c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY,
9168c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_COUNT,
9178c2ecf20Sopenharmony_ci	},
9188c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {
9198c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_points_entry_packing,
9208c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry),
9218c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY,
9228c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT,
9238c2ecf20Sopenharmony_ci	},
9248c2ecf20Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = {
9258c2ecf20Sopenharmony_ci		.packing = sja1105_vl_lookup_entry_packing,
9268c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry),
9278c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY,
9288c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT,
9298c2ecf20Sopenharmony_ci	},
9308c2ecf20Sopenharmony_ci	[BLK_IDX_VL_POLICING] = {
9318c2ecf20Sopenharmony_ci		.packing = sja1105_vl_policing_entry_packing,
9328c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry),
9338c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY,
9348c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_POLICING_COUNT,
9358c2ecf20Sopenharmony_ci	},
9368c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = {
9378c2ecf20Sopenharmony_ci		.packing = sja1105_vl_forwarding_entry_packing,
9388c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry),
9398c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY,
9408c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT,
9418c2ecf20Sopenharmony_ci	},
9428c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
9438c2ecf20Sopenharmony_ci		.packing = sja1105et_l2_lookup_entry_packing,
9448c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
9458c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_ENTRY,
9468c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
9478c2ecf20Sopenharmony_ci	},
9488c2ecf20Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
9498c2ecf20Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
9508c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
9518c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
9528c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
9538c2ecf20Sopenharmony_ci	},
9548c2ecf20Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
9558c2ecf20Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
9568c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
9578c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
9588c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
9598c2ecf20Sopenharmony_ci	},
9608c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
9618c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
9628c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
9638c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
9648c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
9658c2ecf20Sopenharmony_ci	},
9668c2ecf20Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
9678c2ecf20Sopenharmony_ci		.packing = sja1105et_mac_config_entry_packing,
9688c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
9698c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_MAC_CONFIG_ENTRY,
9708c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
9718c2ecf20Sopenharmony_ci	},
9728c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = {
9738c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_params_entry_packing,
9748c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry),
9758c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY,
9768c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT,
9778c2ecf20Sopenharmony_ci	},
9788c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {
9798c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_points_params_entry_packing,
9808c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry),
9818c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY,
9828c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT,
9838c2ecf20Sopenharmony_ci	},
9848c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = {
9858c2ecf20Sopenharmony_ci		.packing = sja1105_vl_forwarding_params_entry_packing,
9868c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry),
9878c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY,
9888c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT,
9898c2ecf20Sopenharmony_ci	},
9908c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
9918c2ecf20Sopenharmony_ci		.packing = sja1105et_l2_lookup_params_entry_packing,
9928c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
9938c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY,
9948c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
9958c2ecf20Sopenharmony_ci	},
9968c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
9978c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
9988c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
9998c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
10008c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
10018c2ecf20Sopenharmony_ci	},
10028c2ecf20Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
10038c2ecf20Sopenharmony_ci		.packing = sja1105et_avb_params_entry_packing,
10048c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
10058c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_AVB_PARAMS_ENTRY,
10068c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
10078c2ecf20Sopenharmony_ci	},
10088c2ecf20Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
10098c2ecf20Sopenharmony_ci		.packing = sja1105et_general_params_entry_packing,
10108c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
10118c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY,
10128c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
10138c2ecf20Sopenharmony_ci	},
10148c2ecf20Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
10158c2ecf20Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
10168c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
10178c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
10188c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
10198c2ecf20Sopenharmony_ci	},
10208c2ecf20Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
10218c2ecf20Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
10228c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
10238c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
10248c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
10258c2ecf20Sopenharmony_ci	},
10268c2ecf20Sopenharmony_ci};
10278c2ecf20Sopenharmony_ci
10288c2ecf20Sopenharmony_ci/* SJA1105P: Second generation, no TTEthernet, no SGMII */
10298c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX] = {
10308c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
10318c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
10328c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
10338c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
10348c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
10358c2ecf20Sopenharmony_ci	},
10368c2ecf20Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
10378c2ecf20Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
10388c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
10398c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
10408c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
10418c2ecf20Sopenharmony_ci	},
10428c2ecf20Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
10438c2ecf20Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
10448c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
10458c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
10468c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
10478c2ecf20Sopenharmony_ci	},
10488c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
10498c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
10508c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
10518c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
10528c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
10538c2ecf20Sopenharmony_ci	},
10548c2ecf20Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
10558c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
10568c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
10578c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
10588c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
10598c2ecf20Sopenharmony_ci	},
10608c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
10618c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
10628c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
10638c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
10648c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
10658c2ecf20Sopenharmony_ci	},
10668c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
10678c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
10688c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
10698c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
10708c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
10718c2ecf20Sopenharmony_ci	},
10728c2ecf20Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
10738c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
10748c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
10758c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
10768c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
10778c2ecf20Sopenharmony_ci	},
10788c2ecf20Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
10798c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
10808c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
10818c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
10828c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
10838c2ecf20Sopenharmony_ci	},
10848c2ecf20Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
10858c2ecf20Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
10868c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
10878c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
10888c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
10898c2ecf20Sopenharmony_ci	},
10908c2ecf20Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
10918c2ecf20Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
10928c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
10938c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
10948c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
10958c2ecf20Sopenharmony_ci	},
10968c2ecf20Sopenharmony_ci};
10978c2ecf20Sopenharmony_ci
10988c2ecf20Sopenharmony_ci/* SJA1105Q: Second generation, TTEthernet, no SGMII */
10998c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX] = {
11008c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE] = {
11018c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_packing,
11028c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry),
11038c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY,
11048c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_COUNT,
11058c2ecf20Sopenharmony_ci	},
11068c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {
11078c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_points_entry_packing,
11088c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry),
11098c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY,
11108c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT,
11118c2ecf20Sopenharmony_ci	},
11128c2ecf20Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = {
11138c2ecf20Sopenharmony_ci		.packing = sja1105_vl_lookup_entry_packing,
11148c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry),
11158c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY,
11168c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT,
11178c2ecf20Sopenharmony_ci	},
11188c2ecf20Sopenharmony_ci	[BLK_IDX_VL_POLICING] = {
11198c2ecf20Sopenharmony_ci		.packing = sja1105_vl_policing_entry_packing,
11208c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry),
11218c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY,
11228c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_POLICING_COUNT,
11238c2ecf20Sopenharmony_ci	},
11248c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = {
11258c2ecf20Sopenharmony_ci		.packing = sja1105_vl_forwarding_entry_packing,
11268c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry),
11278c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY,
11288c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT,
11298c2ecf20Sopenharmony_ci	},
11308c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
11318c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
11328c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
11338c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
11348c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
11358c2ecf20Sopenharmony_ci	},
11368c2ecf20Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
11378c2ecf20Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
11388c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
11398c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
11408c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
11418c2ecf20Sopenharmony_ci	},
11428c2ecf20Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
11438c2ecf20Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
11448c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
11458c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
11468c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
11478c2ecf20Sopenharmony_ci	},
11488c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
11498c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
11508c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
11518c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
11528c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
11538c2ecf20Sopenharmony_ci	},
11548c2ecf20Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
11558c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
11568c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
11578c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
11588c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
11598c2ecf20Sopenharmony_ci	},
11608c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = {
11618c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_params_entry_packing,
11628c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry),
11638c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY,
11648c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT,
11658c2ecf20Sopenharmony_ci	},
11668c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {
11678c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_points_params_entry_packing,
11688c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry),
11698c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY,
11708c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT,
11718c2ecf20Sopenharmony_ci	},
11728c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = {
11738c2ecf20Sopenharmony_ci		.packing = sja1105_vl_forwarding_params_entry_packing,
11748c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry),
11758c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY,
11768c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT,
11778c2ecf20Sopenharmony_ci	},
11788c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
11798c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
11808c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
11818c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
11828c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
11838c2ecf20Sopenharmony_ci	},
11848c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
11858c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
11868c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
11878c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
11888c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
11898c2ecf20Sopenharmony_ci	},
11908c2ecf20Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
11918c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
11928c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
11938c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
11948c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
11958c2ecf20Sopenharmony_ci	},
11968c2ecf20Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
11978c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
11988c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
11998c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
12008c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
12018c2ecf20Sopenharmony_ci	},
12028c2ecf20Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
12038c2ecf20Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
12048c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
12058c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
12068c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
12078c2ecf20Sopenharmony_ci	},
12088c2ecf20Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
12098c2ecf20Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
12108c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
12118c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
12128c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
12138c2ecf20Sopenharmony_ci	},
12148c2ecf20Sopenharmony_ci};
12158c2ecf20Sopenharmony_ci
12168c2ecf20Sopenharmony_ci/* SJA1105R: Second generation, no TTEthernet, SGMII */
12178c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX] = {
12188c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
12198c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
12208c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
12218c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
12228c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
12238c2ecf20Sopenharmony_ci	},
12248c2ecf20Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
12258c2ecf20Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
12268c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
12278c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
12288c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
12298c2ecf20Sopenharmony_ci	},
12308c2ecf20Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
12318c2ecf20Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
12328c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
12338c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
12348c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
12358c2ecf20Sopenharmony_ci	},
12368c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
12378c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
12388c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
12398c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
12408c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
12418c2ecf20Sopenharmony_ci	},
12428c2ecf20Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
12438c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
12448c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
12458c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
12468c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
12478c2ecf20Sopenharmony_ci	},
12488c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
12498c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
12508c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
12518c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
12528c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
12538c2ecf20Sopenharmony_ci	},
12548c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
12558c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
12568c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
12578c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
12588c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
12598c2ecf20Sopenharmony_ci	},
12608c2ecf20Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
12618c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
12628c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
12638c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
12648c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
12658c2ecf20Sopenharmony_ci	},
12668c2ecf20Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
12678c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
12688c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
12698c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
12708c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
12718c2ecf20Sopenharmony_ci	},
12728c2ecf20Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
12738c2ecf20Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
12748c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
12758c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
12768c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
12778c2ecf20Sopenharmony_ci	},
12788c2ecf20Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
12798c2ecf20Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
12808c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
12818c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
12828c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
12838c2ecf20Sopenharmony_ci	},
12848c2ecf20Sopenharmony_ci};
12858c2ecf20Sopenharmony_ci
12868c2ecf20Sopenharmony_ci/* SJA1105S: Second generation, TTEthernet, SGMII */
12878c2ecf20Sopenharmony_ciconst struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX] = {
12888c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE] = {
12898c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_packing,
12908c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry),
12918c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY,
12928c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_COUNT,
12938c2ecf20Sopenharmony_ci	},
12948c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS] = {
12958c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_points_entry_packing,
12968c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_entry),
12978c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY,
12988c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT,
12998c2ecf20Sopenharmony_ci	},
13008c2ecf20Sopenharmony_ci	[BLK_IDX_VL_LOOKUP] = {
13018c2ecf20Sopenharmony_ci		.packing = sja1105_vl_lookup_entry_packing,
13028c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_lookup_entry),
13038c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_LOOKUP_ENTRY,
13048c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_LOOKUP_COUNT,
13058c2ecf20Sopenharmony_ci	},
13068c2ecf20Sopenharmony_ci	[BLK_IDX_VL_POLICING] = {
13078c2ecf20Sopenharmony_ci		.packing = sja1105_vl_policing_entry_packing,
13088c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_policing_entry),
13098c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_POLICING_ENTRY,
13108c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_POLICING_COUNT,
13118c2ecf20Sopenharmony_ci	},
13128c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING] = {
13138c2ecf20Sopenharmony_ci		.packing = sja1105_vl_forwarding_entry_packing,
13148c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_entry),
13158c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_ENTRY,
13168c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_COUNT,
13178c2ecf20Sopenharmony_ci	},
13188c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP] = {
13198c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_entry_packing,
13208c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_entry),
13218c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY,
13228c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_COUNT,
13238c2ecf20Sopenharmony_ci	},
13248c2ecf20Sopenharmony_ci	[BLK_IDX_L2_POLICING] = {
13258c2ecf20Sopenharmony_ci		.packing = sja1105_l2_policing_entry_packing,
13268c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_policing_entry),
13278c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_POLICING_ENTRY,
13288c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_POLICING_COUNT,
13298c2ecf20Sopenharmony_ci	},
13308c2ecf20Sopenharmony_ci	[BLK_IDX_VLAN_LOOKUP] = {
13318c2ecf20Sopenharmony_ci		.packing = sja1105_vlan_lookup_entry_packing,
13328c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vlan_lookup_entry),
13338c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VLAN_LOOKUP_ENTRY,
13348c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VLAN_LOOKUP_COUNT,
13358c2ecf20Sopenharmony_ci	},
13368c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING] = {
13378c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_entry_packing,
13388c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_entry),
13398c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_ENTRY,
13408c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_COUNT,
13418c2ecf20Sopenharmony_ci	},
13428c2ecf20Sopenharmony_ci	[BLK_IDX_MAC_CONFIG] = {
13438c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_mac_config_entry_packing,
13448c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_mac_config_entry),
13458c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY,
13468c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_MAC_CONFIG_COUNT,
13478c2ecf20Sopenharmony_ci	},
13488c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_PARAMS] = {
13498c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_params_entry_packing,
13508c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_params_entry),
13518c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY,
13528c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_PARAMS_COUNT,
13538c2ecf20Sopenharmony_ci	},
13548c2ecf20Sopenharmony_ci	[BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS] = {
13558c2ecf20Sopenharmony_ci		.packing = sja1105_schedule_entry_points_params_entry_packing,
13568c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_schedule_entry_points_params_entry),
13578c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY,
13588c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT,
13598c2ecf20Sopenharmony_ci	},
13608c2ecf20Sopenharmony_ci	[BLK_IDX_VL_FORWARDING_PARAMS] = {
13618c2ecf20Sopenharmony_ci		.packing = sja1105_vl_forwarding_params_entry_packing,
13628c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_vl_forwarding_params_entry),
13638c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY,
13648c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT,
13658c2ecf20Sopenharmony_ci	},
13668c2ecf20Sopenharmony_ci	[BLK_IDX_L2_LOOKUP_PARAMS] = {
13678c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_l2_lookup_params_entry_packing,
13688c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_lookup_params_entry),
13698c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY,
13708c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT,
13718c2ecf20Sopenharmony_ci	},
13728c2ecf20Sopenharmony_ci	[BLK_IDX_L2_FORWARDING_PARAMS] = {
13738c2ecf20Sopenharmony_ci		.packing = sja1105_l2_forwarding_params_entry_packing,
13748c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_l2_forwarding_params_entry),
13758c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY,
13768c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT,
13778c2ecf20Sopenharmony_ci	},
13788c2ecf20Sopenharmony_ci	[BLK_IDX_AVB_PARAMS] = {
13798c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_avb_params_entry_packing,
13808c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_avb_params_entry),
13818c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY,
13828c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_AVB_PARAMS_COUNT,
13838c2ecf20Sopenharmony_ci	},
13848c2ecf20Sopenharmony_ci	[BLK_IDX_GENERAL_PARAMS] = {
13858c2ecf20Sopenharmony_ci		.packing = sja1105pqrs_general_params_entry_packing,
13868c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_general_params_entry),
13878c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY,
13888c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_GENERAL_PARAMS_COUNT,
13898c2ecf20Sopenharmony_ci	},
13908c2ecf20Sopenharmony_ci	[BLK_IDX_RETAGGING] = {
13918c2ecf20Sopenharmony_ci		.packing = sja1105_retagging_entry_packing,
13928c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_retagging_entry),
13938c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_RETAGGING_ENTRY,
13948c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_RETAGGING_COUNT,
13958c2ecf20Sopenharmony_ci	},
13968c2ecf20Sopenharmony_ci	[BLK_IDX_XMII_PARAMS] = {
13978c2ecf20Sopenharmony_ci		.packing = sja1105_xmii_params_entry_packing,
13988c2ecf20Sopenharmony_ci		.unpacked_entry_size = sizeof(struct sja1105_xmii_params_entry),
13998c2ecf20Sopenharmony_ci		.packed_entry_size = SJA1105_SIZE_XMII_PARAMS_ENTRY,
14008c2ecf20Sopenharmony_ci		.max_entry_count = SJA1105_MAX_XMII_PARAMS_COUNT,
14018c2ecf20Sopenharmony_ci	},
14028c2ecf20Sopenharmony_ci};
14038c2ecf20Sopenharmony_ci
14048c2ecf20Sopenharmony_ciint sja1105_static_config_init(struct sja1105_static_config *config,
14058c2ecf20Sopenharmony_ci			       const struct sja1105_table_ops *static_ops,
14068c2ecf20Sopenharmony_ci			       u64 device_id)
14078c2ecf20Sopenharmony_ci{
14088c2ecf20Sopenharmony_ci	enum sja1105_blk_idx i;
14098c2ecf20Sopenharmony_ci
14108c2ecf20Sopenharmony_ci	*config = (struct sja1105_static_config) {0};
14118c2ecf20Sopenharmony_ci
14128c2ecf20Sopenharmony_ci	/* Transfer static_ops array from priv into per-table ops
14138c2ecf20Sopenharmony_ci	 * for handier access
14148c2ecf20Sopenharmony_ci	 */
14158c2ecf20Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++)
14168c2ecf20Sopenharmony_ci		config->tables[i].ops = &static_ops[i];
14178c2ecf20Sopenharmony_ci
14188c2ecf20Sopenharmony_ci	config->device_id = device_id;
14198c2ecf20Sopenharmony_ci	return 0;
14208c2ecf20Sopenharmony_ci}
14218c2ecf20Sopenharmony_ci
14228c2ecf20Sopenharmony_civoid sja1105_static_config_free(struct sja1105_static_config *config)
14238c2ecf20Sopenharmony_ci{
14248c2ecf20Sopenharmony_ci	enum sja1105_blk_idx i;
14258c2ecf20Sopenharmony_ci
14268c2ecf20Sopenharmony_ci	for (i = 0; i < BLK_IDX_MAX; i++) {
14278c2ecf20Sopenharmony_ci		if (config->tables[i].entry_count) {
14288c2ecf20Sopenharmony_ci			kfree(config->tables[i].entries);
14298c2ecf20Sopenharmony_ci			config->tables[i].entry_count = 0;
14308c2ecf20Sopenharmony_ci		}
14318c2ecf20Sopenharmony_ci	}
14328c2ecf20Sopenharmony_ci}
14338c2ecf20Sopenharmony_ci
14348c2ecf20Sopenharmony_ciint sja1105_table_delete_entry(struct sja1105_table *table, int i)
14358c2ecf20Sopenharmony_ci{
14368c2ecf20Sopenharmony_ci	size_t entry_size = table->ops->unpacked_entry_size;
14378c2ecf20Sopenharmony_ci	u8 *entries = table->entries;
14388c2ecf20Sopenharmony_ci
14398c2ecf20Sopenharmony_ci	if (i > table->entry_count)
14408c2ecf20Sopenharmony_ci		return -ERANGE;
14418c2ecf20Sopenharmony_ci
14428c2ecf20Sopenharmony_ci	memmove(entries + i * entry_size, entries + (i + 1) * entry_size,
14438c2ecf20Sopenharmony_ci		(table->entry_count - i) * entry_size);
14448c2ecf20Sopenharmony_ci
14458c2ecf20Sopenharmony_ci	table->entry_count--;
14468c2ecf20Sopenharmony_ci
14478c2ecf20Sopenharmony_ci	return 0;
14488c2ecf20Sopenharmony_ci}
14498c2ecf20Sopenharmony_ci
14508c2ecf20Sopenharmony_ci/* No pointers to table->entries should be kept when this is called. */
14518c2ecf20Sopenharmony_ciint sja1105_table_resize(struct sja1105_table *table, size_t new_count)
14528c2ecf20Sopenharmony_ci{
14538c2ecf20Sopenharmony_ci	size_t entry_size = table->ops->unpacked_entry_size;
14548c2ecf20Sopenharmony_ci	void *new_entries, *old_entries = table->entries;
14558c2ecf20Sopenharmony_ci
14568c2ecf20Sopenharmony_ci	if (new_count > table->ops->max_entry_count)
14578c2ecf20Sopenharmony_ci		return -ERANGE;
14588c2ecf20Sopenharmony_ci
14598c2ecf20Sopenharmony_ci	new_entries = kcalloc(new_count, entry_size, GFP_KERNEL);
14608c2ecf20Sopenharmony_ci	if (!new_entries)
14618c2ecf20Sopenharmony_ci		return -ENOMEM;
14628c2ecf20Sopenharmony_ci
14638c2ecf20Sopenharmony_ci	memcpy(new_entries, old_entries, min(new_count, table->entry_count) *
14648c2ecf20Sopenharmony_ci		entry_size);
14658c2ecf20Sopenharmony_ci
14668c2ecf20Sopenharmony_ci	table->entries = new_entries;
14678c2ecf20Sopenharmony_ci	table->entry_count = new_count;
14688c2ecf20Sopenharmony_ci	kfree(old_entries);
14698c2ecf20Sopenharmony_ci	return 0;
14708c2ecf20Sopenharmony_ci}
1471