Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
   1// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
   2/* Copyright 2019 NXP */
   3
   4#include "enetc.h"
   5
   6#include <net/pkt_sched.h>
   7#include <linux/math64.h>
   8#include <linux/refcount.h>
   9#include <net/pkt_cls.h>
  10#include <net/tc_act/tc_gate.h>
  11
  12static u16 enetc_get_max_gcl_len(struct enetc_hw *hw)
  13{
  14	return enetc_rd(hw, ENETC_PTGCAPR) & ENETC_PTGCAPR_MAX_GCL_LEN_MASK;
  15}
  16
  17void enetc_sched_speed_set(struct enetc_ndev_priv *priv, int speed)
  18{
  19	struct enetc_hw *hw = &priv->si->hw;
  20	u32 old_speed = priv->speed;
  21	u32 pspeed, tmp;
  22
  23	if (speed == old_speed)
  24		return;
  25
  26	switch (speed) {
  27	case SPEED_1000:
  28		pspeed = ENETC_PMR_PSPEED_1000M;
  29		break;
  30	case SPEED_2500:
  31		pspeed = ENETC_PMR_PSPEED_2500M;
  32		break;
  33	case SPEED_100:
  34		pspeed = ENETC_PMR_PSPEED_100M;
  35		break;
  36	case SPEED_10:
  37	default:
  38		pspeed = ENETC_PMR_PSPEED_10M;
  39	}
  40
  41	priv->speed = speed;
  42	tmp = enetc_port_rd(hw, ENETC_PMR);
  43	enetc_port_wr(hw, ENETC_PMR, (tmp & ~ENETC_PMR_PSPEED_MASK) | pspeed);
  44}
  45
  46static int enetc_setup_taprio(struct enetc_ndev_priv *priv,
  47			      struct tc_taprio_qopt_offload *admin_conf)
  48{
  49	struct enetc_hw *hw = &priv->si->hw;
  50	struct enetc_cbd cbd = {.cmd = 0};
  51	struct tgs_gcl_conf *gcl_config;
  52	struct tgs_gcl_data *gcl_data;
  53	dma_addr_t dma;
  54	struct gce *gce;
  55	u16 data_size;
  56	u16 gcl_len;
  57	void *tmp;
  58	u32 tge;
  59	int err;
  60	int i;
  61
  62	/* TSD and Qbv are mutually exclusive in hardware */
  63	for (i = 0; i < priv->num_tx_rings; i++)
  64		if (priv->tx_ring[i]->tsd_enable)
  65			return -EBUSY;
  66
  67	if (admin_conf->num_entries > enetc_get_max_gcl_len(hw))
  68		return -EINVAL;
  69
  70	if (admin_conf->cycle_time > U32_MAX ||
  71	    admin_conf->cycle_time_extension > U32_MAX)
  72		return -EINVAL;
  73
  74	/* Configure the (administrative) gate control list using the
  75	 * control BD descriptor.
  76	 */
  77	gcl_config = &cbd.gcl_conf;
  78	gcl_len = admin_conf->num_entries;
  79
  80	data_size = struct_size(gcl_data, entry, gcl_len);
  81	tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
  82				       &dma, (void *)&gcl_data);
  83	if (!tmp)
  84		return -ENOMEM;
  85
  86	gce = (struct gce *)(gcl_data + 1);
  87
  88	/* Set all gates open as default */
  89	gcl_config->atc = 0xff;
  90	gcl_config->acl_len = cpu_to_le16(gcl_len);
  91
  92	gcl_data->btl = cpu_to_le32(lower_32_bits(admin_conf->base_time));
  93	gcl_data->bth = cpu_to_le32(upper_32_bits(admin_conf->base_time));
  94	gcl_data->ct = cpu_to_le32(admin_conf->cycle_time);
  95	gcl_data->cte = cpu_to_le32(admin_conf->cycle_time_extension);
  96
  97	for (i = 0; i < gcl_len; i++) {
  98		struct tc_taprio_sched_entry *temp_entry;
  99		struct gce *temp_gce = gce + i;
 100
 101		temp_entry = &admin_conf->entries[i];
 102
 103		temp_gce->gate = (u8)temp_entry->gate_mask;
 104		temp_gce->period = cpu_to_le32(temp_entry->interval);
 105	}
 106
 107	cbd.status_flags = 0;
 108
 109	cbd.cls = BDCR_CMD_PORT_GCL;
 110	cbd.status_flags = 0;
 111
 112	tge = enetc_rd(hw, ENETC_PTGCR);
 113	enetc_wr(hw, ENETC_PTGCR, tge | ENETC_PTGCR_TGE);
 114
 115	err = enetc_send_cmd(priv->si, &cbd);
 116	if (err)
 117		enetc_wr(hw, ENETC_PTGCR, tge & ~ENETC_PTGCR_TGE);
 118
 119	enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
 120
 121	if (err)
 122		return err;
 123
 124	enetc_set_ptcmsdur(hw, admin_conf->max_sdu);
 125	priv->active_offloads |= ENETC_F_QBV;
 126
 127	return 0;
 128}
 129
 130static void enetc_reset_taprio_stats(struct enetc_ndev_priv *priv)
 131{
 132	int i;
 133
 134	for (i = 0; i < priv->num_tx_rings; i++)
 135		priv->tx_ring[i]->stats.win_drop = 0;
 136}
 137
 138static void enetc_reset_taprio(struct enetc_ndev_priv *priv)
 139{
 140	struct enetc_hw *hw = &priv->si->hw;
 141	u32 val;
 142
 143	val = enetc_rd(hw, ENETC_PTGCR);
 144	enetc_wr(hw, ENETC_PTGCR, val & ~ENETC_PTGCR_TGE);
 145	enetc_reset_ptcmsdur(hw);
 146
 147	priv->active_offloads &= ~ENETC_F_QBV;
 148}
 149
 150static void enetc_taprio_destroy(struct net_device *ndev)
 151{
 152	struct enetc_ndev_priv *priv = netdev_priv(ndev);
 153
 154	enetc_reset_taprio(priv);
 155	enetc_reset_tc_mqprio(ndev);
 156	enetc_reset_taprio_stats(priv);
 157}
 158
 159static void enetc_taprio_stats(struct net_device *ndev,
 160			       struct tc_taprio_qopt_stats *stats)
 161{
 162	struct enetc_ndev_priv *priv = netdev_priv(ndev);
 163	u64 window_drops = 0;
 164	int i;
 165
 166	for (i = 0; i < priv->num_tx_rings; i++)
 167		window_drops += priv->tx_ring[i]->stats.win_drop;
 168
 169	stats->window_drops = window_drops;
 170}
 171
 172static void enetc_taprio_queue_stats(struct net_device *ndev,
 173				     struct tc_taprio_qopt_queue_stats *queue_stats)
 174{
 175	struct tc_taprio_qopt_stats *stats = &queue_stats->stats;
 176	struct enetc_ndev_priv *priv = netdev_priv(ndev);
 177	int queue = queue_stats->queue;
 178
 179	stats->window_drops = priv->tx_ring[queue]->stats.win_drop;
 180}
 181
 182static int enetc_taprio_replace(struct net_device *ndev,
 183				struct tc_taprio_qopt_offload *offload)
 184{
 185	struct enetc_ndev_priv *priv = netdev_priv(ndev);
 186	int err;
 187
 188	err = enetc_setup_tc_mqprio(ndev, &offload->mqprio);
 189	if (err)
 190		return err;
 191
 192	err = enetc_setup_taprio(priv, offload);
 193	if (err)
 194		enetc_reset_tc_mqprio(ndev);
 195
 196	return err;
 197}
 198
 199int enetc_setup_tc_taprio(struct net_device *ndev, void *type_data)
 200{
 201	struct tc_taprio_qopt_offload *offload = type_data;
 202	int err = 0;
 203
 204	switch (offload->cmd) {
 205	case TAPRIO_CMD_REPLACE:
 206		err = enetc_taprio_replace(ndev, offload);
 207		break;
 208	case TAPRIO_CMD_DESTROY:
 209		enetc_taprio_destroy(ndev);
 210		break;
 211	case TAPRIO_CMD_STATS:
 212		enetc_taprio_stats(ndev, &offload->stats);
 213		break;
 214	case TAPRIO_CMD_QUEUE_STATS:
 215		enetc_taprio_queue_stats(ndev, &offload->queue_stats);
 216		break;
 217	default:
 218		err = -EOPNOTSUPP;
 219	}
 220
 221	return err;
 222}
 223
 224static u32 enetc_get_cbs_enable(struct enetc_hw *hw, u8 tc)
 225{
 226	return enetc_port_rd(hw, ENETC_PTCCBSR0(tc)) & ENETC_CBSE;
 227}
 228
 229static u8 enetc_get_cbs_bw(struct enetc_hw *hw, u8 tc)
 230{
 231	return enetc_port_rd(hw, ENETC_PTCCBSR0(tc)) & ENETC_CBS_BW_MASK;
 232}
 233
 234int enetc_setup_tc_cbs(struct net_device *ndev, void *type_data)
 235{
 236	struct enetc_ndev_priv *priv = netdev_priv(ndev);
 237	struct tc_cbs_qopt_offload *cbs = type_data;
 238	u32 port_transmit_rate = priv->speed;
 239	u8 tc_nums = netdev_get_num_tc(ndev);
 240	struct enetc_hw *hw = &priv->si->hw;
 241	u32 hi_credit_bit, hi_credit_reg;
 242	u32 max_interference_size;
 243	u32 port_frame_max_size;
 244	u8 tc = cbs->queue;
 245	u8 prio_top, prio_next;
 246	int bw_sum = 0;
 247	u8 bw;
 248
 249	prio_top = tc_nums - 1;
 250	prio_next = tc_nums - 2;
 251
 252	/* Support highest prio and second prio tc in cbs mode */
 253	if (tc != prio_top && tc != prio_next)
 254		return -EOPNOTSUPP;
 255
 256	if (!cbs->enable) {
 257		/* Make sure the other TC that are numerically
 258		 * lower than this TC have been disabled.
 259		 */
 260		if (tc == prio_top &&
 261		    enetc_get_cbs_enable(hw, prio_next)) {
 262			dev_err(&ndev->dev,
 263				"Disable TC%d before disable TC%d\n",
 264				prio_next, tc);
 265			return -EINVAL;
 266		}
 267
 268		enetc_port_wr(hw, ENETC_PTCCBSR1(tc), 0);
 269		enetc_port_wr(hw, ENETC_PTCCBSR0(tc), 0);
 270
 271		return 0;
 272	}
 273
 274	if (cbs->idleslope - cbs->sendslope != port_transmit_rate * 1000L ||
 275	    cbs->idleslope < 0 || cbs->sendslope > 0)
 276		return -EOPNOTSUPP;
 277
 278	port_frame_max_size = ndev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
 279
 280	bw = cbs->idleslope / (port_transmit_rate * 10UL);
 281
 282	/* Make sure the other TC that are numerically
 283	 * higher than this TC have been enabled.
 284	 */
 285	if (tc == prio_next) {
 286		if (!enetc_get_cbs_enable(hw, prio_top)) {
 287			dev_err(&ndev->dev,
 288				"Enable TC%d first before enable TC%d\n",
 289				prio_top, prio_next);
 290			return -EINVAL;
 291		}
 292		bw_sum += enetc_get_cbs_bw(hw, prio_top);
 293	}
 294
 295	if (bw_sum + bw >= 100) {
 296		dev_err(&ndev->dev,
 297			"The sum of all CBS Bandwidth can't exceed 100\n");
 298		return -EINVAL;
 299	}
 300
 301	enetc_port_rd(hw, ENETC_PTCMSDUR(tc));
 302
 303	/* For top prio TC, the max_interfrence_size is maxSizedFrame.
 304	 *
 305	 * For next prio TC, the max_interfrence_size is calculated as below:
 306	 *
 307	 *      max_interference_size = M0 + Ma + Ra * M0 / (R0 - Ra)
 308	 *
 309	 *	- RA: idleSlope for AVB Class A
 310	 *	- R0: port transmit rate
 311	 *	- M0: maximum sized frame for the port
 312	 *	- MA: maximum sized frame for AVB Class A
 313	 */
 314
 315	if (tc == prio_top) {
 316		max_interference_size = port_frame_max_size * 8;
 317	} else {
 318		u32 m0, ma, r0, ra;
 319
 320		m0 = port_frame_max_size * 8;
 321		ma = enetc_port_rd(hw, ENETC_PTCMSDUR(prio_top)) * 8;
 322		ra = enetc_get_cbs_bw(hw, prio_top) *
 323			port_transmit_rate * 10000ULL;
 324		r0 = port_transmit_rate * 1000000ULL;
 325		max_interference_size = m0 + ma +
 326			(u32)div_u64((u64)ra * m0, r0 - ra);
 327	}
 328
 329	/* hiCredit bits calculate by:
 330	 *
 331	 * maxSizedFrame * (idleSlope/portTxRate)
 332	 */
 333	hi_credit_bit = max_interference_size * bw / 100;
 334
 335	/* hiCredit bits to hiCredit register need to calculated as:
 336	 *
 337	 * (enetClockFrequency / portTransmitRate) * 100
 338	 */
 339	hi_credit_reg = (u32)div_u64((ENETC_CLK * 100ULL) * hi_credit_bit,
 340				     port_transmit_rate * 1000000ULL);
 341
 342	enetc_port_wr(hw, ENETC_PTCCBSR1(tc), hi_credit_reg);
 343
 344	/* Set bw register and enable this traffic class */
 345	enetc_port_wr(hw, ENETC_PTCCBSR0(tc), bw | ENETC_CBSE);
 346
 347	return 0;
 348}
 349
 350int enetc_setup_tc_txtime(struct net_device *ndev, void *type_data)
 351{
 352	struct enetc_ndev_priv *priv = netdev_priv(ndev);
 353	struct tc_etf_qopt_offload *qopt = type_data;
 354	u8 tc_nums = netdev_get_num_tc(ndev);
 355	struct enetc_hw *hw = &priv->si->hw;
 356	int tc;
 357
 358	if (!tc_nums)
 359		return -EOPNOTSUPP;
 360
 361	tc = qopt->queue;
 362
 363	if (tc < 0 || tc >= priv->num_tx_rings)
 364		return -EINVAL;
 365
 366	/* TSD and Qbv are mutually exclusive in hardware */
 367	if (enetc_rd(hw, ENETC_PTGCR) & ENETC_PTGCR_TGE)
 368		return -EBUSY;
 369
 370	priv->tx_ring[tc]->tsd_enable = qopt->enable;
 371	enetc_port_wr(hw, ENETC_PTCTSDR(tc), qopt->enable ? ENETC_TSDE : 0);
 372
 373	return 0;
 374}
 375
 376enum streamid_type {
 377	STREAMID_TYPE_RESERVED = 0,
 378	STREAMID_TYPE_NULL,
 379	STREAMID_TYPE_SMAC,
 380};
 381
 382enum streamid_vlan_tagged {
 383	STREAMID_VLAN_RESERVED = 0,
 384	STREAMID_VLAN_TAGGED,
 385	STREAMID_VLAN_UNTAGGED,
 386	STREAMID_VLAN_ALL,
 387};
 388
 389#define ENETC_PSFP_WILDCARD -1
 390#define HANDLE_OFFSET 100
 391
 392enum forward_type {
 393	FILTER_ACTION_TYPE_PSFP = BIT(0),
 394	FILTER_ACTION_TYPE_ACL = BIT(1),
 395	FILTER_ACTION_TYPE_BOTH = GENMASK(1, 0),
 396};
 397
 398/* This is for limit output type for input actions */
 399struct actions_fwd {
 400	u64 actions;
 401	u64 keys;	/* include the must needed keys */
 402	enum forward_type output;
 403};
 404
 405struct psfp_streamfilter_counters {
 406	u64 matching_frames_count;
 407	u64 passing_frames_count;
 408	u64 not_passing_frames_count;
 409	u64 passing_sdu_count;
 410	u64 not_passing_sdu_count;
 411	u64 red_frames_count;
 412};
 413
 414struct enetc_streamid {
 415	u32 index;
 416	union {
 417		u8 src_mac[6];
 418		u8 dst_mac[6];
 419	};
 420	u8 filtertype;
 421	u16 vid;
 422	u8 tagged;
 423	s32 handle;
 424};
 425
 426struct enetc_psfp_filter {
 427	u32 index;
 428	s32 handle;
 429	s8 prio;
 430	u32 maxsdu;
 431	u32 gate_id;
 432	s32 meter_id;
 433	refcount_t refcount;
 434	struct hlist_node node;
 435};
 436
 437struct enetc_psfp_gate {
 438	u32 index;
 439	s8 init_ipv;
 440	u64 basetime;
 441	u64 cycletime;
 442	u64 cycletimext;
 443	u32 num_entries;
 444	refcount_t refcount;
 445	struct hlist_node node;
 446	struct action_gate_entry entries[] __counted_by(num_entries);
 447};
 448
 449/* Only enable the green color frame now
 450 * Will add eir and ebs color blind, couple flag etc when
 451 * policing action add more offloading parameters
 452 */
 453struct enetc_psfp_meter {
 454	u32 index;
 455	u32 cir;
 456	u32 cbs;
 457	refcount_t refcount;
 458	struct hlist_node node;
 459};
 460
 461#define ENETC_PSFP_FLAGS_FMI BIT(0)
 462
 463struct enetc_stream_filter {
 464	struct enetc_streamid sid;
 465	u32 sfi_index;
 466	u32 sgi_index;
 467	u32 flags;
 468	u32 fmi_index;
 469	struct flow_stats stats;
 470	struct hlist_node node;
 471};
 472
 473struct enetc_psfp {
 474	unsigned long dev_bitmap;
 475	unsigned long *psfp_sfi_bitmap;
 476	struct hlist_head stream_list;
 477	struct hlist_head psfp_filter_list;
 478	struct hlist_head psfp_gate_list;
 479	struct hlist_head psfp_meter_list;
 480	spinlock_t psfp_lock; /* spinlock for the struct enetc_psfp r/w */
 481};
 482
 483static struct actions_fwd enetc_act_fwd[] = {
 484	{
 485		BIT(FLOW_ACTION_GATE),
 486		BIT_ULL(FLOW_DISSECTOR_KEY_ETH_ADDRS),
 487		FILTER_ACTION_TYPE_PSFP
 488	},
 489	{
 490		BIT(FLOW_ACTION_POLICE) |
 491		BIT(FLOW_ACTION_GATE),
 492		BIT_ULL(FLOW_DISSECTOR_KEY_ETH_ADDRS),
 493		FILTER_ACTION_TYPE_PSFP
 494	},
 495	/* example for ACL actions */
 496	{
 497		BIT(FLOW_ACTION_DROP),
 498		0,
 499		FILTER_ACTION_TYPE_ACL
 500	}
 501};
 502
 503static struct enetc_psfp epsfp = {
 504	.dev_bitmap = 0,
 505	.psfp_sfi_bitmap = NULL,
 506};
 507
 508static LIST_HEAD(enetc_block_cb_list);
 509
 510/* Stream Identity Entry Set Descriptor */
 511static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
 512				 struct enetc_streamid *sid,
 513				 u8 enable)
 514{
 515	struct enetc_cbd cbd = {.cmd = 0};
 516	struct streamid_data *si_data;
 517	struct streamid_conf *si_conf;
 518	dma_addr_t dma;
 519	u16 data_size;
 520	void *tmp;
 521	int port;
 522	int err;
 523
 524	port = enetc_pf_to_port(priv->si->pdev);
 525	if (port < 0)
 526		return -EINVAL;
 527
 528	if (sid->index >= priv->psfp_cap.max_streamid)
 529		return -EINVAL;
 530
 531	if (sid->filtertype != STREAMID_TYPE_NULL &&
 532	    sid->filtertype != STREAMID_TYPE_SMAC)
 533		return -EOPNOTSUPP;
 534
 535	/* Disable operation before enable */
 536	cbd.index = cpu_to_le16((u16)sid->index);
 537	cbd.cls = BDCR_CMD_STREAM_IDENTIFY;
 538	cbd.status_flags = 0;
 539
 540	data_size = sizeof(struct streamid_data);
 541	tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
 542				       &dma, (void *)&si_data);
 543	if (!tmp)
 544		return -ENOMEM;
 545
 546	eth_broadcast_addr(si_data->dmac);
 547	si_data->vid_vidm_tg = (ENETC_CBDR_SID_VID_MASK
 548			       + ((0x3 << 14) | ENETC_CBDR_SID_VIDM));
 549
 550	si_conf = &cbd.sid_set;
 551	/* Only one port supported for one entry, set itself */
 552	si_conf->iports = cpu_to_le32(1 << port);
 553	si_conf->id_type = 1;
 554	si_conf->oui[2] = 0x0;
 555	si_conf->oui[1] = 0x80;
 556	si_conf->oui[0] = 0xC2;
 557
 558	err = enetc_send_cmd(priv->si, &cbd);
 559	if (err)
 560		goto out;
 561
 562	if (!enable)
 563		goto out;
 564
 565	/* Enable the entry overwrite again incase space flushed by hardware */
 566	cbd.status_flags = 0;
 567
 568	si_conf->en = 0x80;
 569	si_conf->stream_handle = cpu_to_le32(sid->handle);
 570	si_conf->iports = cpu_to_le32(1 << port);
 571	si_conf->id_type = sid->filtertype;
 572	si_conf->oui[2] = 0x0;
 573	si_conf->oui[1] = 0x80;
 574	si_conf->oui[0] = 0xC2;
 575
 576	memset(si_data, 0, data_size);
 577
 578	/* VIDM default to be 1.
 579	 * VID Match. If set (b1) then the VID must match, otherwise
 580	 * any VID is considered a match. VIDM setting is only used
 581	 * when TG is set to b01.
 582	 */
 583	if (si_conf->id_type == STREAMID_TYPE_NULL) {
 584		ether_addr_copy(si_data->dmac, sid->dst_mac);
 585		si_data->vid_vidm_tg = (sid->vid & ENETC_CBDR_SID_VID_MASK) +
 586				       ((((u16)(sid->tagged) & 0x3) << 14)
 587				       | ENETC_CBDR_SID_VIDM);
 588	} else if (si_conf->id_type == STREAMID_TYPE_SMAC) {
 589		ether_addr_copy(si_data->smac, sid->src_mac);
 590		si_data->vid_vidm_tg = (sid->vid & ENETC_CBDR_SID_VID_MASK) +
 591				       ((((u16)(sid->tagged) & 0x3) << 14)
 592				       | ENETC_CBDR_SID_VIDM);
 593	}
 594
 595	err = enetc_send_cmd(priv->si, &cbd);
 596out:
 597	enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
 598
 599	return err;
 600}
 601
 602/* Stream Filter Instance Set Descriptor */
 603static int enetc_streamfilter_hw_set(struct enetc_ndev_priv *priv,
 604				     struct enetc_psfp_filter *sfi,
 605				     u8 enable)
 606{
 607	struct enetc_cbd cbd = {.cmd = 0};
 608	struct sfi_conf *sfi_config;
 609	int port;
 610
 611	port = enetc_pf_to_port(priv->si->pdev);
 612	if (port < 0)
 613		return -EINVAL;
 614
 615	cbd.index = cpu_to_le16(sfi->index);
 616	cbd.cls = BDCR_CMD_STREAM_FILTER;
 617	cbd.status_flags = 0x80;
 618	cbd.length = cpu_to_le16(1);
 619
 620	sfi_config = &cbd.sfi_conf;
 621	if (!enable)
 622		goto exit;
 623
 624	sfi_config->en = 0x80;
 625
 626	if (sfi->handle >= 0) {
 627		sfi_config->stream_handle =
 628			cpu_to_le32(sfi->handle);
 629		sfi_config->sthm |= 0x80;
 630	}
 631
 632	sfi_config->sg_inst_table_index = cpu_to_le16(sfi->gate_id);
 633	sfi_config->input_ports = cpu_to_le32(1 << port);
 634
 635	/* The priority value which may be matched against the
 636	 * frame’s priority value to determine a match for this entry.
 637	 */
 638	if (sfi->prio >= 0)
 639		sfi_config->multi |= (sfi->prio & 0x7) | 0x8;
 640
 641	/* Filter Type. Identifies the contents of the MSDU/FM_INST_INDEX
 642	 * field as being either an MSDU value or an index into the Flow
 643	 * Meter Instance table.
 644	 */
 645	if (sfi->maxsdu) {
 646		sfi_config->msdu =
 647		cpu_to_le16(sfi->maxsdu);
 648		sfi_config->multi |= 0x40;
 649	}
 650
 651	if (sfi->meter_id >= 0) {
 652		sfi_config->fm_inst_table_index = cpu_to_le16(sfi->meter_id);
 653		sfi_config->multi |= 0x80;
 654	}
 655
 656exit:
 657	return enetc_send_cmd(priv->si, &cbd);
 658}
 659
 660static int enetc_streamcounter_hw_get(struct enetc_ndev_priv *priv,
 661				      u32 index,
 662				      struct psfp_streamfilter_counters *cnt)
 663{
 664	struct enetc_cbd cbd = { .cmd = 2 };
 665	struct sfi_counter_data *data_buf;
 666	dma_addr_t dma;
 667	u16 data_size;
 668	void *tmp;
 669	int err;
 670
 671	cbd.index = cpu_to_le16((u16)index);
 672	cbd.cmd = 2;
 673	cbd.cls = BDCR_CMD_STREAM_FILTER;
 674	cbd.status_flags = 0;
 675
 676	data_size = sizeof(struct sfi_counter_data);
 677
 678	tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
 679				       &dma, (void *)&data_buf);
 680	if (!tmp)
 681		return -ENOMEM;
 682
 683	err = enetc_send_cmd(priv->si, &cbd);
 684	if (err)
 685		goto exit;
 686
 687	cnt->matching_frames_count = ((u64)data_buf->matchh << 32) +
 688				     data_buf->matchl;
 689
 690	cnt->not_passing_sdu_count = ((u64)data_buf->msdu_droph << 32) +
 691				     data_buf->msdu_dropl;
 692
 693	cnt->passing_sdu_count = cnt->matching_frames_count
 694				- cnt->not_passing_sdu_count;
 695
 696	cnt->not_passing_frames_count =
 697				((u64)data_buf->stream_gate_droph << 32) +
 698				data_buf->stream_gate_dropl;
 699
 700	cnt->passing_frames_count = cnt->matching_frames_count -
 701				    cnt->not_passing_sdu_count -
 702				    cnt->not_passing_frames_count;
 703
 704	cnt->red_frames_count =	((u64)data_buf->flow_meter_droph << 32)	+
 705				data_buf->flow_meter_dropl;
 706
 707exit:
 708	enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
 709
 710	return err;
 711}
 712
 713static u64 get_ptp_now(struct enetc_hw *hw)
 714{
 715	u64 now_lo, now_hi, now;
 716
 717	now_lo = enetc_rd(hw, ENETC_SICTR0);
 718	now_hi = enetc_rd(hw, ENETC_SICTR1);
 719	now = now_lo | now_hi << 32;
 720
 721	return now;
 722}
 723
 724static int get_start_ns(u64 now, u64 cycle, u64 *start)
 725{
 726	u64 n;
 727
 728	if (!cycle)
 729		return -EFAULT;
 730
 731	n = div64_u64(now, cycle);
 732
 733	*start = (n + 1) * cycle;
 734
 735	return 0;
 736}
 737
 738/* Stream Gate Instance Set Descriptor */
 739static int enetc_streamgate_hw_set(struct enetc_ndev_priv *priv,
 740				   struct enetc_psfp_gate *sgi,
 741				   u8 enable)
 742{
 743	struct enetc_cbd cbd = { .cmd = 0 };
 744	struct sgi_table *sgi_config;
 745	struct sgcl_conf *sgcl_config;
 746	struct sgcl_data *sgcl_data;
 747	struct sgce *sgce;
 748	dma_addr_t dma;
 749	u16 data_size;
 750	int err, i;
 751	void *tmp;
 752	u64 now;
 753
 754	cbd.index = cpu_to_le16(sgi->index);
 755	cbd.cmd = 0;
 756	cbd.cls = BDCR_CMD_STREAM_GCL;
 757	cbd.status_flags = 0x80;
 758
 759	/* disable */
 760	if (!enable)
 761		return enetc_send_cmd(priv->si, &cbd);
 762
 763	if (!sgi->num_entries)
 764		return 0;
 765
 766	if (sgi->num_entries > priv->psfp_cap.max_psfp_gatelist ||
 767	    !sgi->cycletime)
 768		return -EINVAL;
 769
 770	/* enable */
 771	sgi_config = &cbd.sgi_table;
 772
 773	/* Keep open before gate list start */
 774	sgi_config->ocgtst = 0x80;
 775
 776	sgi_config->oipv = (sgi->init_ipv < 0) ?
 777				0x0 : ((sgi->init_ipv & 0x7) | 0x8);
 778
 779	sgi_config->en = 0x80;
 780
 781	/* Basic config */
 782	err = enetc_send_cmd(priv->si, &cbd);
 783	if (err)
 784		return -EINVAL;
 785
 786	memset(&cbd, 0, sizeof(cbd));
 787
 788	cbd.index = cpu_to_le16(sgi->index);
 789	cbd.cmd = 1;
 790	cbd.cls = BDCR_CMD_STREAM_GCL;
 791	cbd.status_flags = 0;
 792
 793	sgcl_config = &cbd.sgcl_conf;
 794
 795	sgcl_config->acl_len = (sgi->num_entries - 1) & 0x3;
 796
 797	data_size = struct_size(sgcl_data, sgcl, sgi->num_entries);
 798	tmp = enetc_cbd_alloc_data_mem(priv->si, &cbd, data_size,
 799				       &dma, (void *)&sgcl_data);
 800	if (!tmp)
 801		return -ENOMEM;
 802
 803	sgce = &sgcl_data->sgcl[0];
 804
 805	sgcl_config->agtst = 0x80;
 806
 807	sgcl_data->ct = sgi->cycletime;
 808	sgcl_data->cte = sgi->cycletimext;
 809
 810	if (sgi->init_ipv >= 0)
 811		sgcl_config->aipv = (sgi->init_ipv & 0x7) | 0x8;
 812
 813	for (i = 0; i < sgi->num_entries; i++) {
 814		struct action_gate_entry *from = &sgi->entries[i];
 815		struct sgce *to = &sgce[i];
 816
 817		if (from->gate_state)
 818			to->multi |= 0x10;
 819
 820		if (from->ipv >= 0)
 821			to->multi |= ((from->ipv & 0x7) << 5) | 0x08;
 822
 823		if (from->maxoctets >= 0) {
 824			to->multi |= 0x01;
 825			to->msdu[0] = from->maxoctets & 0xFF;
 826			to->msdu[1] = (from->maxoctets >> 8) & 0xFF;
 827			to->msdu[2] = (from->maxoctets >> 16) & 0xFF;
 828		}
 829
 830		to->interval = from->interval;
 831	}
 832
 833	/* If basetime is less than now, calculate start time */
 834	now = get_ptp_now(&priv->si->hw);
 835
 836	if (sgi->basetime < now) {
 837		u64 start;
 838
 839		err = get_start_ns(now, sgi->cycletime, &start);
 840		if (err)
 841			goto exit;
 842		sgcl_data->btl = lower_32_bits(start);
 843		sgcl_data->bth = upper_32_bits(start);
 844	} else {
 845		u32 hi, lo;
 846
 847		hi = upper_32_bits(sgi->basetime);
 848		lo = lower_32_bits(sgi->basetime);
 849		sgcl_data->bth = hi;
 850		sgcl_data->btl = lo;
 851	}
 852
 853	err = enetc_send_cmd(priv->si, &cbd);
 854
 855exit:
 856	enetc_cbd_free_data_mem(priv->si, data_size, tmp, &dma);
 857	return err;
 858}
 859
 860static int enetc_flowmeter_hw_set(struct enetc_ndev_priv *priv,
 861				  struct enetc_psfp_meter *fmi,
 862				  u8 enable)
 863{
 864	struct enetc_cbd cbd = { .cmd = 0 };
 865	struct fmi_conf *fmi_config;
 866	u64 temp = 0;
 867
 868	cbd.index = cpu_to_le16((u16)fmi->index);
 869	cbd.cls = BDCR_CMD_FLOW_METER;
 870	cbd.status_flags = 0x80;
 871
 872	if (!enable)
 873		return enetc_send_cmd(priv->si, &cbd);
 874
 875	fmi_config = &cbd.fmi_conf;
 876	fmi_config->en = 0x80;
 877
 878	if (fmi->cir) {
 879		temp = (u64)8000 * fmi->cir;
 880		temp = div_u64(temp, 3725);
 881	}
 882
 883	fmi_config->cir = cpu_to_le32((u32)temp);
 884	fmi_config->cbs = cpu_to_le32(fmi->cbs);
 885
 886	/* Default for eir ebs disable */
 887	fmi_config->eir = 0;
 888	fmi_config->ebs = 0;
 889
 890	/* Default:
 891	 * mark red disable
 892	 * drop on yellow disable
 893	 * color mode disable
 894	 * couple flag disable
 895	 */
 896	fmi_config->conf = 0;
 897
 898	return enetc_send_cmd(priv->si, &cbd);
 899}
 900
 901static struct enetc_stream_filter *enetc_get_stream_by_index(u32 index)
 902{
 903	struct enetc_stream_filter *f;
 904
 905	hlist_for_each_entry(f, &epsfp.stream_list, node)
 906		if (f->sid.index == index)
 907			return f;
 908
 909	return NULL;
 910}
 911
 912static struct enetc_psfp_gate *enetc_get_gate_by_index(u32 index)
 913{
 914	struct enetc_psfp_gate *g;
 915
 916	hlist_for_each_entry(g, &epsfp.psfp_gate_list, node)
 917		if (g->index == index)
 918			return g;
 919
 920	return NULL;
 921}
 922
 923static struct enetc_psfp_filter *enetc_get_filter_by_index(u32 index)
 924{
 925	struct enetc_psfp_filter *s;
 926
 927	hlist_for_each_entry(s, &epsfp.psfp_filter_list, node)
 928		if (s->index == index)
 929			return s;
 930
 931	return NULL;
 932}
 933
 934static struct enetc_psfp_meter *enetc_get_meter_by_index(u32 index)
 935{
 936	struct enetc_psfp_meter *m;
 937
 938	hlist_for_each_entry(m, &epsfp.psfp_meter_list, node)
 939		if (m->index == index)
 940			return m;
 941
 942	return NULL;
 943}
 944
 945static struct enetc_psfp_filter
 946	*enetc_psfp_check_sfi(struct enetc_psfp_filter *sfi)
 947{
 948	struct enetc_psfp_filter *s;
 949
 950	hlist_for_each_entry(s, &epsfp.psfp_filter_list, node)
 951		if (s->gate_id == sfi->gate_id &&
 952		    s->prio == sfi->prio &&
 953		    s->maxsdu == sfi->maxsdu &&
 954		    s->meter_id == sfi->meter_id)
 955			return s;
 956
 957	return NULL;
 958}
 959
 960static int enetc_get_free_index(struct enetc_ndev_priv *priv)
 961{
 962	u32 max_size = priv->psfp_cap.max_psfp_filter;
 963	unsigned long index;
 964
 965	index = find_first_zero_bit(epsfp.psfp_sfi_bitmap, max_size);
 966	if (index == max_size)
 967		return -1;
 968
 969	return index;
 970}
 971
 972static void stream_filter_unref(struct enetc_ndev_priv *priv, u32 index)
 973{
 974	struct enetc_psfp_filter *sfi;
 975	u8 z;
 976
 977	sfi = enetc_get_filter_by_index(index);
 978	WARN_ON(!sfi);
 979	z = refcount_dec_and_test(&sfi->refcount);
 980
 981	if (z) {
 982		enetc_streamfilter_hw_set(priv, sfi, false);
 983		hlist_del(&sfi->node);
 984		kfree(sfi);
 985		clear_bit(index, epsfp.psfp_sfi_bitmap);
 986	}
 987}
 988
 989static void stream_gate_unref(struct enetc_ndev_priv *priv, u32 index)
 990{
 991	struct enetc_psfp_gate *sgi;
 992	u8 z;
 993
 994	sgi = enetc_get_gate_by_index(index);
 995	WARN_ON(!sgi);
 996	z = refcount_dec_and_test(&sgi->refcount);
 997	if (z) {
 998		enetc_streamgate_hw_set(priv, sgi, false);
 999		hlist_del(&sgi->node);
1000		kfree(sgi);
1001	}
1002}
1003
1004static void flow_meter_unref(struct enetc_ndev_priv *priv, u32 index)
1005{
1006	struct enetc_psfp_meter *fmi;
1007	u8 z;
1008
1009	fmi = enetc_get_meter_by_index(index);
1010	WARN_ON(!fmi);
1011	z = refcount_dec_and_test(&fmi->refcount);
1012	if (z) {
1013		enetc_flowmeter_hw_set(priv, fmi, false);
1014		hlist_del(&fmi->node);
1015		kfree(fmi);
1016	}
1017}
1018
1019static void remove_one_chain(struct enetc_ndev_priv *priv,
1020			     struct enetc_stream_filter *filter)
1021{
1022	if (filter->flags & ENETC_PSFP_FLAGS_FMI)
1023		flow_meter_unref(priv, filter->fmi_index);
1024
1025	stream_gate_unref(priv, filter->sgi_index);
1026	stream_filter_unref(priv, filter->sfi_index);
1027
1028	hlist_del(&filter->node);
1029	kfree(filter);
1030}
1031
1032static int enetc_psfp_hw_set(struct enetc_ndev_priv *priv,
1033			     struct enetc_streamid *sid,
1034			     struct enetc_psfp_filter *sfi,
1035			     struct enetc_psfp_gate *sgi,
1036			     struct enetc_psfp_meter *fmi)
1037{
1038	int err;
1039
1040	err = enetc_streamid_hw_set(priv, sid, true);
1041	if (err)
1042		return err;
1043
1044	if (sfi) {
1045		err = enetc_streamfilter_hw_set(priv, sfi, true);
1046		if (err)
1047			goto revert_sid;
1048	}
1049
1050	err = enetc_streamgate_hw_set(priv, sgi, true);
1051	if (err)
1052		goto revert_sfi;
1053
1054	if (fmi) {
1055		err = enetc_flowmeter_hw_set(priv, fmi, true);
1056		if (err)
1057			goto revert_sgi;
1058	}
1059
1060	return 0;
1061
1062revert_sgi:
1063	enetc_streamgate_hw_set(priv, sgi, false);
1064revert_sfi:
1065	if (sfi)
1066		enetc_streamfilter_hw_set(priv, sfi, false);
1067revert_sid:
1068	enetc_streamid_hw_set(priv, sid, false);
1069	return err;
1070}
1071
1072static struct actions_fwd *
1073enetc_check_flow_actions(u64 acts, unsigned long long inputkeys)
1074{
1075	int i;
1076
1077	for (i = 0; i < ARRAY_SIZE(enetc_act_fwd); i++)
1078		if (acts == enetc_act_fwd[i].actions &&
1079		    inputkeys & enetc_act_fwd[i].keys)
1080			return &enetc_act_fwd[i];
1081
1082	return NULL;
1083}
1084
1085static int enetc_psfp_policer_validate(const struct flow_action *action,
1086				       const struct flow_action_entry *act,
1087				       struct netlink_ext_ack *extack)
1088{
1089	if (act->police.exceed.act_id != FLOW_ACTION_DROP) {
1090		NL_SET_ERR_MSG_MOD(extack,
1091				   "Offload not supported when exceed action is not drop");
1092		return -EOPNOTSUPP;
1093	}
1094
1095	if (act->police.notexceed.act_id != FLOW_ACTION_PIPE &&
1096	    act->police.notexceed.act_id != FLOW_ACTION_ACCEPT) {
1097		NL_SET_ERR_MSG_MOD(extack,
1098				   "Offload not supported when conform action is not pipe or ok");
1099		return -EOPNOTSUPP;
1100	}
1101
1102	if (act->police.notexceed.act_id == FLOW_ACTION_ACCEPT &&
1103	    !flow_action_is_last_entry(action, act)) {
1104		NL_SET_ERR_MSG_MOD(extack,
1105				   "Offload not supported when conform action is ok, but action is not last");
1106		return -EOPNOTSUPP;
1107	}
1108
1109	if (act->police.peakrate_bytes_ps ||
1110	    act->police.avrate || act->police.overhead) {
1111		NL_SET_ERR_MSG_MOD(extack,
1112				   "Offload not supported when peakrate/avrate/overhead is configured");
1113		return -EOPNOTSUPP;
1114	}
1115
1116	if (act->police.rate_pkt_ps) {
1117		NL_SET_ERR_MSG_MOD(extack,
1118				   "QoS offload not support packets per second");
1119		return -EOPNOTSUPP;
1120	}
1121
1122	return 0;
1123}
1124
1125static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv,
1126				      struct flow_cls_offload *f)
1127{
1128	struct flow_action_entry *entryg = NULL, *entryp = NULL;
1129	struct flow_rule *rule = flow_cls_offload_flow_rule(f);
1130	struct netlink_ext_ack *extack = f->common.extack;
1131	struct enetc_stream_filter *filter, *old_filter;
1132	struct enetc_psfp_meter *fmi = NULL, *old_fmi;
1133	struct enetc_psfp_filter *sfi, *old_sfi;
1134	struct enetc_psfp_gate *sgi, *old_sgi;
1135	struct flow_action_entry *entry;
1136	struct action_gate_entry *e;
1137	u8 sfi_overwrite = 0;
1138	int entries_size;
1139	int i, err;
1140
1141	if (f->common.chain_index >= priv->psfp_cap.max_streamid) {
1142		NL_SET_ERR_MSG_MOD(extack, "No Stream identify resource!");
1143		return -ENOSPC;
1144	}
1145
1146	flow_action_for_each(i, entry, &rule->action)
1147		if (entry->id == FLOW_ACTION_GATE)
1148			entryg = entry;
1149		else if (entry->id == FLOW_ACTION_POLICE)
1150			entryp = entry;
1151
1152	/* Not support without gate action */
1153	if (!entryg)
1154		return -EINVAL;
1155
1156	filter = kzalloc(sizeof(*filter), GFP_KERNEL);
1157	if (!filter)
1158		return -ENOMEM;
1159
1160	filter->sid.index = f->common.chain_index;
1161
1162	if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
1163		struct flow_match_eth_addrs match;
1164
1165		flow_rule_match_eth_addrs(rule, &match);
1166
1167		if (!is_zero_ether_addr(match.mask->dst) &&
1168		    !is_zero_ether_addr(match.mask->src)) {
1169			NL_SET_ERR_MSG_MOD(extack,
1170					   "Cannot match on both source and destination MAC");
1171			err = -EINVAL;
1172			goto free_filter;
1173		}
1174
1175		if (!is_zero_ether_addr(match.mask->dst)) {
1176			if (!is_broadcast_ether_addr(match.mask->dst)) {
1177				NL_SET_ERR_MSG_MOD(extack,
1178						   "Masked matching on destination MAC not supported");
1179				err = -EINVAL;
1180				goto free_filter;
1181			}
1182			ether_addr_copy(filter->sid.dst_mac, match.key->dst);
1183			filter->sid.filtertype = STREAMID_TYPE_NULL;
1184		}
1185
1186		if (!is_zero_ether_addr(match.mask->src)) {
1187			if (!is_broadcast_ether_addr(match.mask->src)) {
1188				NL_SET_ERR_MSG_MOD(extack,
1189						   "Masked matching on source MAC not supported");
1190				err = -EINVAL;
1191				goto free_filter;
1192			}
1193			ether_addr_copy(filter->sid.src_mac, match.key->src);
1194			filter->sid.filtertype = STREAMID_TYPE_SMAC;
1195		}
1196	} else {
1197		NL_SET_ERR_MSG_MOD(extack, "Unsupported, must include ETH_ADDRS");
1198		err = -EINVAL;
1199		goto free_filter;
1200	}
1201
1202	if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_VLAN)) {
1203		struct flow_match_vlan match;
1204
1205		flow_rule_match_vlan(rule, &match);
1206		if (match.mask->vlan_priority) {
1207			if (match.mask->vlan_priority !=
1208			    (VLAN_PRIO_MASK >> VLAN_PRIO_SHIFT)) {
1209				NL_SET_ERR_MSG_MOD(extack, "Only full mask is supported for VLAN priority");
1210				err = -EINVAL;
1211				goto free_filter;
1212			}
1213		}
1214
1215		if (match.mask->vlan_id) {
1216			if (match.mask->vlan_id != VLAN_VID_MASK) {
1217				NL_SET_ERR_MSG_MOD(extack, "Only full mask is supported for VLAN id");
1218				err = -EINVAL;
1219				goto free_filter;
1220			}
1221
1222			filter->sid.vid = match.key->vlan_id;
1223			if (!filter->sid.vid)
1224				filter->sid.tagged = STREAMID_VLAN_UNTAGGED;
1225			else
1226				filter->sid.tagged = STREAMID_VLAN_TAGGED;
1227		}
1228	} else {
1229		filter->sid.tagged = STREAMID_VLAN_ALL;
1230	}
1231
1232	/* parsing gate action */
1233	if (entryg->hw_index >= priv->psfp_cap.max_psfp_gate) {
1234		NL_SET_ERR_MSG_MOD(extack, "No Stream Gate resource!");
1235		err = -ENOSPC;
1236		goto free_filter;
1237	}
1238
1239	if (entryg->gate.num_entries >= priv->psfp_cap.max_psfp_gatelist) {
1240		NL_SET_ERR_MSG_MOD(extack, "No Stream Gate resource!");
1241		err = -ENOSPC;
1242		goto free_filter;
1243	}
1244
1245	entries_size = struct_size(sgi, entries, entryg->gate.num_entries);
1246	sgi = kzalloc(entries_size, GFP_KERNEL);
1247	if (!sgi) {
1248		err = -ENOMEM;
1249		goto free_filter;
1250	}
1251
1252	refcount_set(&sgi->refcount, 1);
1253	sgi->index = entryg->hw_index;
1254	sgi->init_ipv = entryg->gate.prio;
1255	sgi->basetime = entryg->gate.basetime;
1256	sgi->cycletime = entryg->gate.cycletime;
1257	sgi->num_entries = entryg->gate.num_entries;
1258
1259	e = sgi->entries;
1260	for (i = 0; i < entryg->gate.num_entries; i++) {
1261		e[i].gate_state = entryg->gate.entries[i].gate_state;
1262		e[i].interval = entryg->gate.entries[i].interval;
1263		e[i].ipv = entryg->gate.entries[i].ipv;
1264		e[i].maxoctets = entryg->gate.entries[i].maxoctets;
1265	}
1266
1267	filter->sgi_index = sgi->index;
1268
1269	sfi = kzalloc(sizeof(*sfi), GFP_KERNEL);
1270	if (!sfi) {
1271		err = -ENOMEM;
1272		goto free_gate;
1273	}
1274
1275	refcount_set(&sfi->refcount, 1);
1276	sfi->gate_id = sgi->index;
1277	sfi->meter_id = ENETC_PSFP_WILDCARD;
1278
1279	/* Flow meter and max frame size */
1280	if (entryp) {
1281		err = enetc_psfp_policer_validate(&rule->action, entryp, extack);
1282		if (err)
1283			goto free_sfi;
1284
1285		if (entryp->police.burst) {
1286			fmi = kzalloc(sizeof(*fmi), GFP_KERNEL);
1287			if (!fmi) {
1288				err = -ENOMEM;
1289				goto free_sfi;
1290			}
1291			refcount_set(&fmi->refcount, 1);
1292			fmi->cir = entryp->police.rate_bytes_ps;
1293			fmi->cbs = entryp->police.burst;
1294			fmi->index = entryp->hw_index;
1295			filter->flags |= ENETC_PSFP_FLAGS_FMI;
1296			filter->fmi_index = fmi->index;
1297			sfi->meter_id = fmi->index;
1298		}
1299
1300		if (entryp->police.mtu)
1301			sfi->maxsdu = entryp->police.mtu;
1302	}
1303
1304	/* prio ref the filter prio */
1305	if (f->common.prio && f->common.prio <= BIT(3))
1306		sfi->prio = f->common.prio - 1;
1307	else
1308		sfi->prio = ENETC_PSFP_WILDCARD;
1309
1310	old_sfi = enetc_psfp_check_sfi(sfi);
1311	if (!old_sfi) {
1312		int index;
1313
1314		index = enetc_get_free_index(priv);
1315		if (index < 0) {
1316			NL_SET_ERR_MSG_MOD(extack, "No Stream Filter resource!");
1317			err = -ENOSPC;
1318			goto free_fmi;
1319		}
1320
1321		sfi->index = index;
1322		sfi->handle = index + HANDLE_OFFSET;
1323		/* Update the stream filter handle also */
1324		filter->sid.handle = sfi->handle;
1325		filter->sfi_index = sfi->index;
1326		sfi_overwrite = 0;
1327	} else {
1328		filter->sfi_index = old_sfi->index;
1329		filter->sid.handle = old_sfi->handle;
1330		sfi_overwrite = 1;
1331	}
1332
1333	err = enetc_psfp_hw_set(priv, &filter->sid,
1334				sfi_overwrite ? NULL : sfi, sgi, fmi);
1335	if (err)
1336		goto free_fmi;
1337
1338	spin_lock(&epsfp.psfp_lock);
1339	if (filter->flags & ENETC_PSFP_FLAGS_FMI) {
1340		old_fmi = enetc_get_meter_by_index(filter->fmi_index);
1341		if (old_fmi) {
1342			fmi->refcount = old_fmi->refcount;
1343			refcount_set(&fmi->refcount,
1344				     refcount_read(&old_fmi->refcount) + 1);
1345			hlist_del(&old_fmi->node);
1346			kfree(old_fmi);
1347		}
1348		hlist_add_head(&fmi->node, &epsfp.psfp_meter_list);
1349	}
1350
1351	/* Remove the old node if exist and update with a new node */
1352	old_sgi = enetc_get_gate_by_index(filter->sgi_index);
1353	if (old_sgi) {
1354		refcount_set(&sgi->refcount,
1355			     refcount_read(&old_sgi->refcount) + 1);
1356		hlist_del(&old_sgi->node);
1357		kfree(old_sgi);
1358	}
1359
1360	hlist_add_head(&sgi->node, &epsfp.psfp_gate_list);
1361
1362	if (!old_sfi) {
1363		hlist_add_head(&sfi->node, &epsfp.psfp_filter_list);
1364		set_bit(sfi->index, epsfp.psfp_sfi_bitmap);
1365	} else {
1366		kfree(sfi);
1367		refcount_inc(&old_sfi->refcount);
1368	}
1369
1370	old_filter = enetc_get_stream_by_index(filter->sid.index);
1371	if (old_filter)
1372		remove_one_chain(priv, old_filter);
1373
1374	filter->stats.lastused = jiffies;
1375	hlist_add_head(&filter->node, &epsfp.stream_list);
1376
1377	spin_unlock(&epsfp.psfp_lock);
1378
1379	return 0;
1380
1381free_fmi:
1382	kfree(fmi);
1383free_sfi:
1384	kfree(sfi);
1385free_gate:
1386	kfree(sgi);
1387free_filter:
1388	kfree(filter);
1389
1390	return err;
1391}
1392
1393static int enetc_config_clsflower(struct enetc_ndev_priv *priv,
1394				  struct flow_cls_offload *cls_flower)
1395{
1396	struct flow_rule *rule = flow_cls_offload_flow_rule(cls_flower);
1397	struct netlink_ext_ack *extack = cls_flower->common.extack;
1398	struct flow_dissector *dissector = rule->match.dissector;
1399	struct flow_action *action = &rule->action;
1400	struct flow_action_entry *entry;
1401	struct actions_fwd *fwd;
1402	u64 actions = 0;
1403	int i, err;
1404
1405	if (!flow_action_has_entries(action)) {
1406		NL_SET_ERR_MSG_MOD(extack, "At least one action is needed");
1407		return -EINVAL;
1408	}
1409
1410	flow_action_for_each(i, entry, action)
1411		actions |= BIT(entry->id);
1412
1413	fwd = enetc_check_flow_actions(actions, dissector->used_keys);
1414	if (!fwd) {
1415		NL_SET_ERR_MSG_MOD(extack, "Unsupported filter type!");
1416		return -EOPNOTSUPP;
1417	}
1418
1419	if (fwd->output & FILTER_ACTION_TYPE_PSFP) {
1420		err = enetc_psfp_parse_clsflower(priv, cls_flower);
1421		if (err) {
1422			NL_SET_ERR_MSG_MOD(extack, "Invalid PSFP inputs");
1423			return err;
1424		}
1425	} else {
1426		NL_SET_ERR_MSG_MOD(extack, "Unsupported actions");
1427		return -EOPNOTSUPP;
1428	}
1429
1430	return 0;
1431}
1432
1433static int enetc_psfp_destroy_clsflower(struct enetc_ndev_priv *priv,
1434					struct flow_cls_offload *f)
1435{
1436	struct enetc_stream_filter *filter;
1437	struct netlink_ext_ack *extack = f->common.extack;
1438	int err;
1439
1440	if (f->common.chain_index >= priv->psfp_cap.max_streamid) {
1441		NL_SET_ERR_MSG_MOD(extack, "No Stream identify resource!");
1442		return -ENOSPC;
1443	}
1444
1445	filter = enetc_get_stream_by_index(f->common.chain_index);
1446	if (!filter)
1447		return -EINVAL;
1448
1449	err = enetc_streamid_hw_set(priv, &filter->sid, false);
1450	if (err)
1451		return err;
1452
1453	remove_one_chain(priv, filter);
1454
1455	return 0;
1456}
1457
1458static int enetc_destroy_clsflower(struct enetc_ndev_priv *priv,
1459				   struct flow_cls_offload *f)
1460{
1461	return enetc_psfp_destroy_clsflower(priv, f);
1462}
1463
1464static int enetc_psfp_get_stats(struct enetc_ndev_priv *priv,
1465				struct flow_cls_offload *f)
1466{
1467	struct psfp_streamfilter_counters counters = {};
1468	struct enetc_stream_filter *filter;
1469	struct flow_stats stats = {};
1470	int err;
1471
1472	filter = enetc_get_stream_by_index(f->common.chain_index);
1473	if (!filter)
1474		return -EINVAL;
1475
1476	err = enetc_streamcounter_hw_get(priv, filter->sfi_index, &counters);
1477	if (err)
1478		return -EINVAL;
1479
1480	spin_lock(&epsfp.psfp_lock);
1481	stats.pkts = counters.matching_frames_count +
1482		     counters.not_passing_sdu_count -
1483		     filter->stats.pkts;
1484	stats.drops = counters.not_passing_frames_count +
1485		      counters.not_passing_sdu_count +
1486		      counters.red_frames_count -
1487		      filter->stats.drops;
1488	stats.lastused = filter->stats.lastused;
1489	filter->stats.pkts += stats.pkts;
1490	filter->stats.drops += stats.drops;
1491	spin_unlock(&epsfp.psfp_lock);
1492
1493	flow_stats_update(&f->stats, 0x0, stats.pkts, stats.drops,
1494			  stats.lastused, FLOW_ACTION_HW_STATS_DELAYED);
1495
1496	return 0;
1497}
1498
1499static int enetc_setup_tc_cls_flower(struct enetc_ndev_priv *priv,
1500				     struct flow_cls_offload *cls_flower)
1501{
1502	switch (cls_flower->command) {
1503	case FLOW_CLS_REPLACE:
1504		return enetc_config_clsflower(priv, cls_flower);
1505	case FLOW_CLS_DESTROY:
1506		return enetc_destroy_clsflower(priv, cls_flower);
1507	case FLOW_CLS_STATS:
1508		return enetc_psfp_get_stats(priv, cls_flower);
1509	default:
1510		return -EOPNOTSUPP;
1511	}
1512}
1513
1514static inline void clean_psfp_sfi_bitmap(void)
1515{
1516	bitmap_free(epsfp.psfp_sfi_bitmap);
1517	epsfp.psfp_sfi_bitmap = NULL;
1518}
1519
1520static void clean_stream_list(void)
1521{
1522	struct enetc_stream_filter *s;
1523	struct hlist_node *tmp;
1524
1525	hlist_for_each_entry_safe(s, tmp, &epsfp.stream_list, node) {
1526		hlist_del(&s->node);
1527		kfree(s);
1528	}
1529}
1530
1531static void clean_sfi_list(void)
1532{
1533	struct enetc_psfp_filter *sfi;
1534	struct hlist_node *tmp;
1535
1536	hlist_for_each_entry_safe(sfi, tmp, &epsfp.psfp_filter_list, node) {
1537		hlist_del(&sfi->node);
1538		kfree(sfi);
1539	}
1540}
1541
1542static void clean_sgi_list(void)
1543{
1544	struct enetc_psfp_gate *sgi;
1545	struct hlist_node *tmp;
1546
1547	hlist_for_each_entry_safe(sgi, tmp, &epsfp.psfp_gate_list, node) {
1548		hlist_del(&sgi->node);
1549		kfree(sgi);
1550	}
1551}
1552
1553static void clean_psfp_all(void)
1554{
1555	/* Disable all list nodes and free all memory */
1556	clean_sfi_list();
1557	clean_sgi_list();
1558	clean_stream_list();
1559	epsfp.dev_bitmap = 0;
1560	clean_psfp_sfi_bitmap();
1561}
1562
1563int enetc_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
1564			    void *cb_priv)
1565{
1566	struct net_device *ndev = cb_priv;
1567
1568	if (!tc_can_offload(ndev))
1569		return -EOPNOTSUPP;
1570
1571	switch (type) {
1572	case TC_SETUP_CLSFLOWER:
1573		return enetc_setup_tc_cls_flower(netdev_priv(ndev), type_data);
1574	default:
1575		return -EOPNOTSUPP;
1576	}
1577}
1578
1579int enetc_set_psfp(struct net_device *ndev, bool en)
1580{
1581	struct enetc_ndev_priv *priv = netdev_priv(ndev);
1582	int err;
1583
1584	if (en) {
1585		err = enetc_psfp_enable(priv);
1586		if (err)
1587			return err;
1588
1589		priv->active_offloads |= ENETC_F_QCI;
1590		return 0;
1591	}
1592
1593	err = enetc_psfp_disable(priv);
1594	if (err)
1595		return err;
1596
1597	priv->active_offloads &= ~ENETC_F_QCI;
1598
1599	return 0;
1600}
1601
1602int enetc_psfp_init(struct enetc_ndev_priv *priv)
1603{
1604	if (epsfp.psfp_sfi_bitmap)
1605		return 0;
1606
1607	epsfp.psfp_sfi_bitmap = bitmap_zalloc(priv->psfp_cap.max_psfp_filter,
1608					      GFP_KERNEL);
1609	if (!epsfp.psfp_sfi_bitmap)
1610		return -ENOMEM;
1611
1612	spin_lock_init(&epsfp.psfp_lock);
1613
1614	if (list_empty(&enetc_block_cb_list))
1615		epsfp.dev_bitmap = 0;
1616
1617	return 0;
1618}
1619
1620int enetc_psfp_clean(struct enetc_ndev_priv *priv)
1621{
1622	if (!list_empty(&enetc_block_cb_list))
1623		return -EBUSY;
1624
1625	clean_psfp_all();
1626
1627	return 0;
1628}
1629
1630int enetc_setup_tc_psfp(struct net_device *ndev, void *type_data)
1631{
1632	struct enetc_ndev_priv *priv = netdev_priv(ndev);
1633	struct flow_block_offload *f = type_data;
1634	int port, err;
1635
1636	err = flow_block_cb_setup_simple(f, &enetc_block_cb_list,
1637					 enetc_setup_tc_block_cb,
1638					 ndev, ndev, true);
1639	if (err)
1640		return err;
1641
1642	switch (f->command) {
1643	case FLOW_BLOCK_BIND:
1644		port = enetc_pf_to_port(priv->si->pdev);
1645		if (port < 0)
1646			return -EINVAL;
1647
1648		set_bit(port, &epsfp.dev_bitmap);
1649		break;
1650	case FLOW_BLOCK_UNBIND:
1651		port = enetc_pf_to_port(priv->si->pdev);
1652		if (port < 0)
1653			return -EINVAL;
1654
1655		clear_bit(port, &epsfp.dev_bitmap);
1656		if (!epsfp.dev_bitmap)
1657			clean_psfp_all();
1658		break;
1659	}
1660
1661	return 0;
1662}
1663
1664int enetc_qos_query_caps(struct net_device *ndev, void *type_data)
1665{
1666	struct enetc_ndev_priv *priv = netdev_priv(ndev);
1667	struct tc_query_caps_base *base = type_data;
1668	struct enetc_si *si = priv->si;
1669
1670	switch (base->type) {
1671	case TC_SETUP_QDISC_MQPRIO: {
1672		struct tc_mqprio_caps *caps = base->caps;
1673
1674		caps->validate_queue_counts = true;
1675
1676		return 0;
1677	}
1678	case TC_SETUP_QDISC_TAPRIO: {
1679		struct tc_taprio_caps *caps = base->caps;
1680
1681		if (si->hw_features & ENETC_SI_F_QBV)
1682			caps->supports_queue_max_sdu = true;
1683
1684		return 0;
1685	}
1686	default:
1687		return -EOPNOTSUPP;
1688	}
1689}