Re: [v2,net-next 4/4] net: enetc add tc flower offload flow metering policing action

2020-06-24 Thread David Miller
From: Po Liu 
Date: Wed, 24 Jun 2020 17:36:31 +0800

> From: Po Liu 
> 
> Flow metering entries in IEEE 802.1Qci is an optional function for a
> flow filtering module. Flow metering is two rates two buckets and three
> color marker to policing the frames. This patch only enable one rate one
> bucket and in color blind mode. Flow metering instance are as
> specified in the algorithm in MEF 10.3 and in Bandwidth Profile
> Parameters. They are:
> 
> a) Flow meter instance identifier. An integer value identifying the flow
> meter instance. The patch use the police 'index' as thin value.
> b) Committed Information Rate (CIR), in bits per second. This patch use
> the 'rate_bytes_ps' represent this value.
> c) Committed Burst Size (CBS), in octets. This patch use the 'burst'
> represent this value.
> d) Excess Information Rate (EIR), in bits per second.
> e) Excess Burst Size per Bandwidth Profile Flow (EBS), in octets.
> And plus some other parameters. This patch set EIR/EBS default disable
> and color blind mode.
> 
> v1->v2 changes:
> - Use div_u64() as division replace the '/' report:
> 
> Reported-by: kernel test robot 
> All errors (new ones prefixed by >>):
> 
>ld: drivers/net/ethernet/freescale/enetc/enetc_qos.o: in function 
> `enetc_flowmeter_hw_set':
>>> enetc_qos.c:(.text+0x66): undefined reference to `__udivdi3'
> 
> 
> Signed-off-by: Po Liu 

Applied.


[v2,net-next 4/4] net: enetc add tc flower offload flow metering policing action

2020-06-24 Thread Po Liu
From: Po Liu 

Flow metering entries in IEEE 802.1Qci is an optional function for a
flow filtering module. Flow metering is two rates two buckets and three
color marker to policing the frames. This patch only enable one rate one
bucket and in color blind mode. Flow metering instance are as
specified in the algorithm in MEF 10.3 and in Bandwidth Profile
Parameters. They are:

a) Flow meter instance identifier. An integer value identifying the flow
meter instance. The patch use the police 'index' as thin value.
b) Committed Information Rate (CIR), in bits per second. This patch use
the 'rate_bytes_ps' represent this value.
c) Committed Burst Size (CBS), in octets. This patch use the 'burst'
represent this value.
d) Excess Information Rate (EIR), in bits per second.
e) Excess Burst Size per Bandwidth Profile Flow (EBS), in octets.
And plus some other parameters. This patch set EIR/EBS default disable
and color blind mode.

v1->v2 changes:
- Use div_u64() as division replace the '/' report:

Reported-by: kernel test robot 
All errors (new ones prefixed by >>):

   ld: drivers/net/ethernet/freescale/enetc/enetc_qos.o: in function 
`enetc_flowmeter_hw_set':
>> enetc_qos.c:(.text+0x66): undefined reference to `__udivdi3'


Signed-off-by: Po Liu 
---
 .../net/ethernet/freescale/enetc/enetc_hw.h   |  24 +++
 .../net/ethernet/freescale/enetc/enetc_qos.c  | 160 --
 2 files changed, 172 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h 
b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
index 6314051bc6c1..f00c4382423e 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
@@ -570,6 +570,7 @@ enum bdcr_cmd_class {
BDCR_CMD_STREAM_IDENTIFY,
BDCR_CMD_STREAM_FILTER,
BDCR_CMD_STREAM_GCL,
+   BDCR_CMD_FLOW_METER,
__BDCR_CMD_MAX_LEN,
BDCR_CMD_MAX_LEN = __BDCR_CMD_MAX_LEN - 1,
 };
@@ -736,10 +737,33 @@ struct sgcl_data {
struct sgce sgcl[0];
 };
 
+#define ENETC_CBDR_FMI_MR  BIT(0)
+#define ENETC_CBDR_FMI_MRENBIT(1)
+#define ENETC_CBDR_FMI_DOY BIT(2)
+#defineENETC_CBDR_FMI_CM   BIT(3)
+#define ENETC_CBDR_FMI_CF  BIT(4)
+#define ENETC_CBDR_FMI_NDORBIT(5)
+#define ENETC_CBDR_FMI_OALEN   BIT(6)
+#define ENETC_CBDR_FMI_IRFPP_MASK GENMASK(4, 0)
+
+/* class 10: command 0/1, Flow Meter Instance Set, short Format */
+struct fmi_conf {
+   __le32  cir;
+   __le32  cbs;
+   __le32  eir;
+   __le32  ebs;
+   u8  conf;
+   u8  res1;
+   u8  ir_fpp;
+   u8  res2[4];
+   u8  en;
+};
+
 struct enetc_cbd {
union{
struct sfi_conf sfi_conf;
struct sgi_table sgi_table;
+   struct fmi_conf fmi_conf;
struct {
__le32  addr[2];
union {
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_qos.c 
b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
index 07f98bf7a06b..4f670cbdf186 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_qos.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
@@ -408,10 +408,26 @@ struct enetc_psfp_gate {
struct action_gate_entry entries[0];
 };
 
+/* Only enable the green color frame now
+ * Will add eir and ebs color blind, couple flag etc when
+ * policing action add more offloading parameters
+ */
+struct enetc_psfp_meter {
+   u32 index;
+   u32 cir;
+   u32 cbs;
+   refcount_t refcount;
+   struct hlist_node node;
+};
+
+#define ENETC_PSFP_FLAGS_FMI BIT(0)
+
 struct enetc_stream_filter {
struct enetc_streamid sid;
u32 sfi_index;
u32 sgi_index;
+   u32 flags;
+   u32 fmi_index;
struct flow_stats stats;
struct hlist_node node;
 };
@@ -422,6 +438,7 @@ struct enetc_psfp {
struct hlist_head stream_list;
struct hlist_head psfp_filter_list;
struct hlist_head psfp_gate_list;
+   struct hlist_head psfp_meter_list;
spinlock_t psfp_lock; /* spinlock for the struct enetc_psfp r/w */
 };
 
@@ -842,6 +859,47 @@ static int enetc_streamgate_hw_set(struct enetc_ndev_priv 
*priv,
return err;
 }
 
+static int enetc_flowmeter_hw_set(struct enetc_ndev_priv *priv,
+ struct enetc_psfp_meter *fmi,
+ u8 enable)
+{
+   struct enetc_cbd cbd = { .cmd = 0 };
+   struct fmi_conf *fmi_config;
+   u64 temp = 0;
+
+   cbd.index = cpu_to_le16((u16)fmi->index);
+   cbd.cls = BDCR_CMD_FLOW_METER;
+   cbd.status_flags = 0x80;
+
+   if (!enable)
+   return enetc_send_cmd(priv->si, );
+
+   fmi_config = _conf;
+   fmi_config->en = 0x80;
+
+   if (fmi->cir) {
+   temp = (u64)8000 * fmi->cir;
+   temp = div_u64(temp, 3725);
+   }
+
+   fmi_config->cir =