162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
262306a36Sopenharmony_ci/* Microsemi Ocelot Switch driver
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (c) 2019 Microsemi Corporation
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef _MSCC_OCELOT_POLICE_H_
862306a36Sopenharmony_ci#define _MSCC_OCELOT_POLICE_H_
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "ocelot.h"
1162306a36Sopenharmony_ci#include <net/flow_offload.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cienum mscc_qos_rate_mode {
1462306a36Sopenharmony_ci	MSCC_QOS_RATE_MODE_DISABLED, /* Policer/shaper disabled */
1562306a36Sopenharmony_ci	MSCC_QOS_RATE_MODE_LINE, /* Measure line rate in kbps incl. IPG */
1662306a36Sopenharmony_ci	MSCC_QOS_RATE_MODE_DATA, /* Measures data rate in kbps excl. IPG */
1762306a36Sopenharmony_ci	MSCC_QOS_RATE_MODE_FRAME, /* Measures frame rate in fps */
1862306a36Sopenharmony_ci	__MSCC_QOS_RATE_MODE_END,
1962306a36Sopenharmony_ci	NUM_MSCC_QOS_RATE_MODE = __MSCC_QOS_RATE_MODE_END,
2062306a36Sopenharmony_ci	MSCC_QOS_RATE_MODE_MAX = __MSCC_QOS_RATE_MODE_END - 1,
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct qos_policer_conf {
2462306a36Sopenharmony_ci	enum mscc_qos_rate_mode mode;
2562306a36Sopenharmony_ci	bool dlb; /* Enable DLB (dual leaky bucket mode */
2662306a36Sopenharmony_ci	bool cf;  /* Coupling flag (ignored in SLB mode) */
2762306a36Sopenharmony_ci	u32  cir; /* CIR in kbps/fps (ignored in SLB mode) */
2862306a36Sopenharmony_ci	u32  cbs; /* CBS in bytes/frames (ignored in SLB mode) */
2962306a36Sopenharmony_ci	u32  pir; /* PIR in kbps/fps */
3062306a36Sopenharmony_ci	u32  pbs; /* PBS in bytes/frames */
3162306a36Sopenharmony_ci	u8   ipg; /* Size of IPG when MSCC_QOS_RATE_MODE_LINE is chosen */
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciint qos_policer_conf_set(struct ocelot *ocelot, u32 pol_ix,
3562306a36Sopenharmony_ci			 struct qos_policer_conf *conf);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ciint ocelot_policer_validate(const struct flow_action *action,
3862306a36Sopenharmony_ci			    const struct flow_action_entry *a,
3962306a36Sopenharmony_ci			    struct netlink_ext_ack *extack);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#endif /* _MSCC_OCELOT_POLICE_H_ */
42