162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/* Microchip Sparx5 Switch driver
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef __SPARX5_TC_H__
862306a36Sopenharmony_ci#define __SPARX5_TC_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <net/flow_offload.h>
1162306a36Sopenharmony_ci#include <net/pkt_cls.h>
1262306a36Sopenharmony_ci#include <linux/netdevice.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/* Controls how PORT_MASK is applied */
1562306a36Sopenharmony_cienum SPX5_PORT_MASK_MODE {
1662306a36Sopenharmony_ci	SPX5_PMM_OR_DSTMASK,
1762306a36Sopenharmony_ci	SPX5_PMM_AND_VLANMASK,
1862306a36Sopenharmony_ci	SPX5_PMM_REPLACE_PGID,
1962306a36Sopenharmony_ci	SPX5_PMM_REPLACE_ALL,
2062306a36Sopenharmony_ci	SPX5_PMM_REDIR_PGID,
2162306a36Sopenharmony_ci	SPX5_PMM_OR_PGID_MASK,
2262306a36Sopenharmony_ci};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* Controls ES0 forwarding  */
2562306a36Sopenharmony_cienum SPX5_FORWARDING_SEL {
2662306a36Sopenharmony_ci	SPX5_FWSEL_NO_ACTION,
2762306a36Sopenharmony_ci	SPX5_FWSEL_COPY_TO_LOOPBACK,
2862306a36Sopenharmony_ci	SPX5_FWSEL_REDIRECT_TO_LOOPBACK,
2962306a36Sopenharmony_ci	SPX5_FWSEL_DISCARD,
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* Controls tag A (outer tagging) */
3362306a36Sopenharmony_cienum SPX5_OUTER_TAG_SEL {
3462306a36Sopenharmony_ci	SPX5_OTAG_PORT,
3562306a36Sopenharmony_ci	SPX5_OTAG_TAG_A,
3662306a36Sopenharmony_ci	SPX5_OTAG_FORCED_PORT,
3762306a36Sopenharmony_ci	SPX5_OTAG_UNTAG,
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* Selects TPID for ES0 tag A */
4162306a36Sopenharmony_cienum SPX5_TPID_A_SEL {
4262306a36Sopenharmony_ci	SPX5_TPID_A_8100,
4362306a36Sopenharmony_ci	SPX5_TPID_A_88A8,
4462306a36Sopenharmony_ci	SPX5_TPID_A_CUST1,
4562306a36Sopenharmony_ci	SPX5_TPID_A_CUST2,
4662306a36Sopenharmony_ci	SPX5_TPID_A_CUST3,
4762306a36Sopenharmony_ci	SPX5_TPID_A_CLASSIFIED,
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/* Selects VID for ES0 tag A */
5162306a36Sopenharmony_cienum SPX5_VID_A_SEL {
5262306a36Sopenharmony_ci	SPX5_VID_A_CLASSIFIED,
5362306a36Sopenharmony_ci	SPX5_VID_A_VAL,
5462306a36Sopenharmony_ci	SPX5_VID_A_IFH,
5562306a36Sopenharmony_ci	SPX5_VID_A_RESERVED,
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* Select PCP source for ES0 tag A */
5962306a36Sopenharmony_cienum SPX5_PCP_A_SEL {
6062306a36Sopenharmony_ci	SPX5_PCP_A_CLASSIFIED,
6162306a36Sopenharmony_ci	SPX5_PCP_A_VAL,
6262306a36Sopenharmony_ci	SPX5_PCP_A_RESERVED,
6362306a36Sopenharmony_ci	SPX5_PCP_A_POPPED,
6462306a36Sopenharmony_ci	SPX5_PCP_A_MAPPED_0,
6562306a36Sopenharmony_ci	SPX5_PCP_A_MAPPED_1,
6662306a36Sopenharmony_ci	SPX5_PCP_A_MAPPED_2,
6762306a36Sopenharmony_ci	SPX5_PCP_A_MAPPED_3,
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* Select DEI source for ES0 tag A */
7162306a36Sopenharmony_cienum SPX5_DEI_A_SEL {
7262306a36Sopenharmony_ci	SPX5_DEI_A_CLASSIFIED,
7362306a36Sopenharmony_ci	SPX5_DEI_A_VAL,
7462306a36Sopenharmony_ci	SPX5_DEI_A_REW,
7562306a36Sopenharmony_ci	SPX5_DEI_A_POPPED,
7662306a36Sopenharmony_ci	SPX5_DEI_A_MAPPED_0,
7762306a36Sopenharmony_ci	SPX5_DEI_A_MAPPED_1,
7862306a36Sopenharmony_ci	SPX5_DEI_A_MAPPED_2,
7962306a36Sopenharmony_ci	SPX5_DEI_A_MAPPED_3,
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/* Controls tag B (inner tagging) */
8362306a36Sopenharmony_cienum SPX5_INNER_TAG_SEL {
8462306a36Sopenharmony_ci	SPX5_ITAG_NO_PUSH,
8562306a36Sopenharmony_ci	SPX5_ITAG_PUSH_B_TAG,
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* Selects TPID for ES0 tag B. */
8962306a36Sopenharmony_cienum SPX5_TPID_B_SEL {
9062306a36Sopenharmony_ci	SPX5_TPID_B_8100,
9162306a36Sopenharmony_ci	SPX5_TPID_B_88A8,
9262306a36Sopenharmony_ci	SPX5_TPID_B_CUST1,
9362306a36Sopenharmony_ci	SPX5_TPID_B_CUST2,
9462306a36Sopenharmony_ci	SPX5_TPID_B_CUST3,
9562306a36Sopenharmony_ci	SPX5_TPID_B_CLASSIFIED,
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ciint sparx5_port_setup_tc(struct net_device *ndev, enum tc_setup_type type,
9962306a36Sopenharmony_ci			 void *type_data);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ciint sparx5_tc_matchall(struct net_device *ndev,
10262306a36Sopenharmony_ci		       struct tc_cls_matchall_offload *tmo,
10362306a36Sopenharmony_ci		       bool ingress);
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ciint sparx5_tc_flower(struct net_device *ndev, struct flow_cls_offload *fco,
10662306a36Sopenharmony_ci		     bool ingress);
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#endif	/* __SPARX5_TC_H__ */
109