All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC net-next 0/4] Marvell Prestera add policer support
@ 2021-07-02 18:29 Vadym Kochan
  2021-07-02 18:29 ` [RFC net-next 1/4] net: marvell: prestera: do not fail if FW reply is bigger Vadym Kochan
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Vadym Kochan @ 2021-07-02 18:29 UTC (permalink / raw)
  To: David S. Miller, Jakub Kicinski, netdev, Andrew Lunn, Jiri Pirko,
	Vladimir Oltean, Volodymyr Mytnyk, Serhiy Boiko
  Cc: Vadym Kochan, Taras Chornyi, linux-kernel, Mickey Rachamim, Vadym Kochan

From: Vadym Kochan <vkochan@marvell.com>

Offload action police when keyed to a flower classifier.
Only rate and burst is supported for now. The conform-exceed
drop is assumed as a default value.

Policer support requires FW 3.1 version. Because there are some FW ABI
differences in ACL rule messages between 3.0 and 3.1 so added separate
"_ext" struct version with separate HW helper.

Also added new __tc_classid_to_hwtc() helper which calculates hw tc
without need of netdev but specifying the num of tc instead, because
ingress HW queues are globally and statically per ASIC not per port.

Serhiy Boiko (1):
  net: marvell: prestera: Offload FLOW_ACTION_POLICE

Vadym Kochan (3):
  net: marvell: prestera: do not fail if FW reply is bigger
  net: marvell: prestera: turn FW supported versions into an array
  net: sched: introduce __tc_classid_to_hwtc() helper

 .../ethernet/marvell/prestera/prestera_acl.c  |  14 ++
 .../ethernet/marvell/prestera/prestera_acl.h  |  11 +-
 .../marvell/prestera/prestera_flower.c        |  18 +++
 .../ethernet/marvell/prestera/prestera_hw.c   | 125 +++++++++++++++++-
 .../ethernet/marvell/prestera/prestera_pci.c  |  63 ++++-----
 include/net/sch_generic.h                     |   9 +-
 6 files changed, 197 insertions(+), 43 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [RFC net-next 1/4] net: marvell: prestera: do not fail if FW reply is bigger
  2021-07-02 18:29 [RFC net-next 0/4] Marvell Prestera add policer support Vadym Kochan
@ 2021-07-02 18:29 ` Vadym Kochan
  2021-07-02 18:29 ` [RFC net-next 2/4] net: marvell: prestera: turn FW supported versions into an array Vadym Kochan
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Vadym Kochan @ 2021-07-02 18:29 UTC (permalink / raw)
  To: David S. Miller, Jakub Kicinski, netdev, Andrew Lunn, Jiri Pirko,
	Vladimir Oltean, Volodymyr Mytnyk, Serhiy Boiko
  Cc: Vadym Kochan, Taras Chornyi, linux-kernel, Mickey Rachamim, Vadym Kochan

From: Vadym Kochan <vkochan@marvell.com>

There might be a case when driver talks to the newer FW version
which has extended message packets with extra fields, in that case
lets just copy minimum what we need/can.

Signed-off-by: Vadym Kochan <vkochan@marvell.com>
---
 drivers/net/ethernet/marvell/prestera/prestera_pci.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
index a250d394da38..58642b540322 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
@@ -359,12 +359,7 @@ static int prestera_fw_cmd_send(struct prestera_fw *fw,
 	}
 
 	ret_size = prestera_fw_read(fw, PRESTERA_CMD_RCV_LEN_REG);
-	if (ret_size > out_size) {
-		dev_err(fw->dev.dev, "ret_size (%u) > out_len(%zu)\n",
-			ret_size, out_size);
-		err = -EMSGSIZE;
-		goto cmd_exit;
-	}
+	ret_size = min_t(u32, ret_size, out_size);
 
 	memcpy_fromio(out_msg, fw->cmd_mbox + in_size, ret_size);
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [RFC net-next 2/4] net: marvell: prestera: turn FW supported versions into an array
  2021-07-02 18:29 [RFC net-next 0/4] Marvell Prestera add policer support Vadym Kochan
  2021-07-02 18:29 ` [RFC net-next 1/4] net: marvell: prestera: do not fail if FW reply is bigger Vadym Kochan
@ 2021-07-02 18:29 ` Vadym Kochan
  2021-07-02 18:29 ` [RFC net-next 3/4] net: sched: introduce __tc_classid_to_hwtc() helper Vadym Kochan
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Vadym Kochan @ 2021-07-02 18:29 UTC (permalink / raw)
  To: David S. Miller, Jakub Kicinski, netdev, Andrew Lunn, Jiri Pirko,
	Vladimir Oltean, Volodymyr Mytnyk, Serhiy Boiko
  Cc: Vadym Kochan, Taras Chornyi, linux-kernel, Mickey Rachamim, Vadym Kochan

From: Vadym Kochan <vkochan@marvell.com>

In case of supporting more than 2 FW versions it is more flexible to
have them defined as array.

Signed-off-by: Vadym Kochan <vkochan@marvell.com>
---
 .../ethernet/marvell/prestera/prestera_pci.c  | 55 ++++++++-----------
 1 file changed, 24 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
index 58642b540322..ce4cf51dba5a 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
@@ -14,11 +14,10 @@
 
 #define PRESTERA_MSG_MAX_SIZE 1500
 
-#define PRESTERA_SUPP_FW_MAJ_VER	3
-#define PRESTERA_SUPP_FW_MIN_VER	0
-
-#define PRESTERA_PREV_FW_MAJ_VER	2
-#define PRESTERA_PREV_FW_MIN_VER	0
+static struct prestera_fw_rev prestera_fw_supp[] = {
+	{ 3, 0 },
+	{ 2, 0 }
+};
 
 #define PRESTERA_FW_PATH_FMT	"mrvl/prestera/mvsw_prestera_fw-v%u.%u.img"
 
@@ -629,40 +628,34 @@ static int prestera_fw_hdr_parse(struct prestera_fw *fw)
 
 static int prestera_fw_get(struct prestera_fw *fw)
 {
-	int ver_maj = PRESTERA_SUPP_FW_MAJ_VER;
-	int ver_min = PRESTERA_SUPP_FW_MIN_VER;
 	char fw_path[128];
 	int err;
+	int i;
 
-pick_fw_ver:
-	snprintf(fw_path, sizeof(fw_path), PRESTERA_FW_PATH_FMT,
-		 ver_maj, ver_min);
-
-	err = request_firmware_direct(&fw->bin, fw_path, fw->dev.dev);
-	if (err) {
-		if (ver_maj == PRESTERA_SUPP_FW_MAJ_VER) {
-			ver_maj = PRESTERA_PREV_FW_MAJ_VER;
-			ver_min = PRESTERA_PREV_FW_MIN_VER;
+	for (i = 0; i < ARRAY_SIZE(prestera_fw_supp); i++) {
+		struct prestera_fw_rev *ver = &prestera_fw_supp[i];
 
-			dev_warn(fw->dev.dev,
-				 "missing latest %s firmware, fall-back to previous %u.%u version\n",
-				 fw_path, ver_maj, ver_min);
+		snprintf(fw_path, sizeof(fw_path), PRESTERA_FW_PATH_FMT,
+			 ver->maj, ver->min);
 
-			goto pick_fw_ver;
-		} else {
-			dev_err(fw->dev.dev, "failed to request previous firmware: %s\n",
-				fw_path);
-			return err;
+		err = request_firmware_direct(&fw->bin, fw_path, fw->dev.dev);
+		if (!err) {
+			dev_info(fw->dev.dev, "Loading %s ...", fw_path);
+			fw->rev_supp = *ver;
+			return 0;
 		}
-	}
-
-	dev_info(fw->dev.dev, "Loading %s ...", fw_path);
 
-	fw->rev_supp.maj = ver_maj;
-	fw->rev_supp.min = ver_min;
-	fw->rev_supp.sub = 0;
+		if (i == 0)
+			dev_warn(fw->dev.dev,
+				 "missing latest %s firmware, fall-back to previous version\n",
+				 fw_path);
+		else
+			dev_warn(fw->dev.dev, "failed to request previous firmware: %s\n",
+				 fw_path);
+	}
 
-	return 0;
+	dev_err(fw->dev.dev, "could not find any of the supported firmware versions\n");
+	return -ENOENT;
 }
 
 static void prestera_fw_put(struct prestera_fw *fw)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [RFC net-next 3/4] net: sched: introduce __tc_classid_to_hwtc() helper
  2021-07-02 18:29 [RFC net-next 0/4] Marvell Prestera add policer support Vadym Kochan
  2021-07-02 18:29 ` [RFC net-next 1/4] net: marvell: prestera: do not fail if FW reply is bigger Vadym Kochan
  2021-07-02 18:29 ` [RFC net-next 2/4] net: marvell: prestera: turn FW supported versions into an array Vadym Kochan
@ 2021-07-02 18:29 ` Vadym Kochan
  2021-07-02 18:29 ` [RFC net-next 4/4] net: marvell: prestera: Offload FLOW_ACTION_POLICE Vadym Kochan
  2021-07-02 18:52 ` [RFC net-next 0/4] Marvell Prestera add policer support Andrew Lunn
  4 siblings, 0 replies; 8+ messages in thread
From: Vadym Kochan @ 2021-07-02 18:29 UTC (permalink / raw)
  To: David S. Miller, Jakub Kicinski, netdev, Andrew Lunn, Jiri Pirko,
	Vladimir Oltean, Volodymyr Mytnyk, Serhiy Boiko
  Cc: Vadym Kochan, Taras Chornyi, linux-kernel, Mickey Rachamim, Vadym Kochan

From: Vadym Kochan <vkochan@marvell.com>

There might be a case when the ingress HW queues are globally shared in
ASIC and are not per port (netdev). So add a __tc_classid_to_hwtc()
version which accepts number of tc instead of netdev.

Signed-off-by: Vadym Kochan <vkochan@marvell.com>
---
 include/net/sch_generic.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 9ed33e6840bd..b6e65658b0d8 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -668,11 +668,16 @@ qdisc_class_find(const struct Qdisc_class_hash *hash, u32 id)
 	return NULL;
 }
 
-static inline int tc_classid_to_hwtc(struct net_device *dev, u32 classid)
+static inline int __tc_classid_to_hwtc(u32 tc_num, u32 classid)
 {
 	u32 hwtc = TC_H_MIN(classid) - TC_H_MIN_PRIORITY;
 
-	return (hwtc < netdev_get_num_tc(dev)) ? hwtc : -EINVAL;
+	return (hwtc < tc_num) ? hwtc : -EINVAL;
+}
+
+static inline int tc_classid_to_hwtc(struct net_device *dev, u32 classid)
+{
+	return __tc_classid_to_hwtc(netdev_get_num_tc(dev), classid);
 }
 
 int qdisc_class_hash_init(struct Qdisc_class_hash *);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [RFC net-next 4/4] net: marvell: prestera: Offload FLOW_ACTION_POLICE
  2021-07-02 18:29 [RFC net-next 0/4] Marvell Prestera add policer support Vadym Kochan
                   ` (2 preceding siblings ...)
  2021-07-02 18:29 ` [RFC net-next 3/4] net: sched: introduce __tc_classid_to_hwtc() helper Vadym Kochan
@ 2021-07-02 18:29 ` Vadym Kochan
  2021-07-02 21:19   ` kernel test robot
  2021-07-02 18:52 ` [RFC net-next 0/4] Marvell Prestera add policer support Andrew Lunn
  4 siblings, 1 reply; 8+ messages in thread
From: Vadym Kochan @ 2021-07-02 18:29 UTC (permalink / raw)
  To: David S. Miller, Jakub Kicinski, netdev, Andrew Lunn, Jiri Pirko,
	Vladimir Oltean, Volodymyr Mytnyk, Serhiy Boiko
  Cc: Vadym Kochan, Taras Chornyi, linux-kernel, Mickey Rachamim,
	Volodymyr Mytnyk, Vadym Kochan

From: Serhiy Boiko <serhiy.boiko@plvision.eu>

Offload action police when keyed to a flower classifier.
Only rate and burst is supported for now. The conform-exceed
drop is assumed as a default value.

Policer support requires FW 3.1 version. Still to make a backward
compatibility with ACL of FW 3.0 introduced separate FW msg structs for
ACL calls which have different field layout.

Co-developed-by: Volodymyr Mytnyk <vmytnyk@marvell.com>
Signed-off-by: Volodymyr Mytnyk <vmytnyk@marvell.com>
Signed-off-by: Serhiy Boiko <serhiy.boiko@plvision.eu>
Co-developed-by: Vadym Kochan <vkochan@marvell.com>
Signed-off-by: Vadym Kochan <vkochan@marvell.com>
---
 .../ethernet/marvell/prestera/prestera_acl.c  |  14 ++
 .../ethernet/marvell/prestera/prestera_acl.h  |  11 +-
 .../marvell/prestera/prestera_flower.c        |  18 +++
 .../ethernet/marvell/prestera/prestera_hw.c   | 125 +++++++++++++++++-
 .../ethernet/marvell/prestera/prestera_pci.c  |   1 +
 5 files changed, 165 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.c b/drivers/net/ethernet/marvell/prestera/prestera_acl.c
index 83c75ffb1a1c..9a473f94fab0 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_acl.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.c
@@ -8,6 +8,8 @@
 #include "prestera_acl.h"
 #include "prestera_span.h"
 
+#define PRESTERA_ACL_DEF_HW_TC		3
+
 struct prestera_acl {
 	struct prestera_switch *sw;
 	struct list_head rules;
@@ -29,6 +31,7 @@ struct prestera_acl_rule {
 	u32 priority;
 	u8 n_actions;
 	u8 n_matches;
+	u8 hw_tc;
 	u32 id;
 };
 
@@ -203,6 +206,7 @@ prestera_acl_rule_create(struct prestera_flow_block *block,
 	INIT_LIST_HEAD(&rule->action_list);
 	rule->cookie = cookie;
 	rule->block = block;
+	rule->hw_tc = PRESTERA_ACL_DEF_HW_TC;
 
 	return rule;
 }
@@ -251,6 +255,16 @@ void prestera_acl_rule_priority_set(struct prestera_acl_rule *rule,
 	rule->priority = priority;
 }
 
+u8 prestera_acl_rule_hw_tc_get(struct prestera_acl_rule *rule)
+{
+	return rule->hw_tc;
+}
+
+void prestera_acl_rule_hw_tc_set(struct prestera_acl_rule *rule, u8 hw_tc)
+{
+	rule->hw_tc = hw_tc;
+}
+
 int prestera_acl_rule_match_add(struct prestera_acl_rule *rule,
 				struct prestera_acl_rule_match_entry *entry)
 {
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.h b/drivers/net/ethernet/marvell/prestera/prestera_acl.h
index 39b7869be659..2a2fbae1432a 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_acl.h
+++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.h
@@ -25,7 +25,8 @@ enum prestera_acl_rule_match_entry_type {
 enum prestera_acl_rule_action {
 	PRESTERA_ACL_RULE_ACTION_ACCEPT,
 	PRESTERA_ACL_RULE_ACTION_DROP,
-	PRESTERA_ACL_RULE_ACTION_TRAP
+	PRESTERA_ACL_RULE_ACTION_TRAP,
+	PRESTERA_ACL_RULE_ACTION_POLICE,
 };
 
 struct prestera_switch;
@@ -50,6 +51,12 @@ struct prestera_flow_block {
 struct prestera_acl_rule_action_entry {
 	struct list_head list;
 	enum prestera_acl_rule_action id;
+	union {
+		struct {
+			u64 rate;
+			u64 burst;
+		} police;
+	};
 };
 
 struct prestera_acl_rule_match_entry {
@@ -120,5 +127,7 @@ void prestera_acl_rule_del(struct prestera_switch *sw,
 int prestera_acl_rule_get_stats(struct prestera_switch *sw,
 				struct prestera_acl_rule *rule,
 				u64 *packets, u64 *bytes, u64 *last_use);
+u8 prestera_acl_rule_hw_tc_get(struct prestera_acl_rule *rule);
+void prestera_acl_rule_hw_tc_set(struct prestera_acl_rule *rule, u8 hw_tc);
 
 #endif /* _PRESTERA_ACL_H_ */
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_flower.c b/drivers/net/ethernet/marvell/prestera/prestera_flower.c
index e571ba09ec08..76f30856ac98 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_flower.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_flower.c
@@ -5,6 +5,8 @@
 #include "prestera_acl.h"
 #include "prestera_flower.h"
 
+#define PRESTERA_HW_TC_NUM	8
+
 static int prestera_flower_parse_actions(struct prestera_flow_block *block,
 					 struct prestera_acl_rule *rule,
 					 struct flow_action *flow_action,
@@ -30,6 +32,11 @@ static int prestera_flower_parse_actions(struct prestera_flow_block *block,
 		case FLOW_ACTION_TRAP:
 			a_entry.id = PRESTERA_ACL_RULE_ACTION_TRAP;
 			break;
+		case FLOW_ACTION_POLICE:
+			a_entry.id = PRESTERA_ACL_RULE_ACTION_POLICE;
+			a_entry.police.rate = act->police.rate_bytes_ps;
+			a_entry.police.burst = act->police.burst;
+			break;
 		default:
 			NL_SET_ERR_MSG_MOD(extack, "Unsupported action");
 			pr_err("Unsupported action\n");
@@ -110,6 +117,17 @@ static int prestera_flower_parse(struct prestera_flow_block *block,
 		return -EOPNOTSUPP;
 	}
 
+	if (f->classid) {
+		int hw_tc = __tc_classid_to_hwtc(PRESTERA_HW_TC_NUM, f->classid);
+
+		if (hw_tc < 0) {
+			NL_SET_ERR_MSG_MOD(f->common.extack, "Unsupported HW TC");
+			return hw_tc;
+		}
+
+		prestera_acl_rule_hw_tc_set(rule, hw_tc);
+	}
+
 	prestera_acl_rule_priority_set(rule, f->common.prio);
 
 	if (flow_rule_match_key(f_rule, FLOW_DISSECTOR_KEY_META)) {
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.c b/drivers/net/ethernet/marvell/prestera/prestera_hw.c
index c1297859e471..2d1dfb52aca4 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_hw.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.c
@@ -91,6 +91,7 @@ enum {
 enum {
 	PRESTERA_CMD_SWITCH_ATTR_MAC = 1,
 	PRESTERA_CMD_SWITCH_ATTR_AGEING = 2,
+	PRESTERA_SWITCH_ATTR_TRAP_POLICER = 3,
 };
 
 enum {
@@ -319,6 +320,19 @@ struct prestera_msg_acl_action {
 	u32 id;
 };
 
+struct prestera_msg_acl_action_ext {
+	u32 id;
+	union {
+		struct {
+			u64 rate;
+			u64 burst;
+		} police;
+		struct {
+			u64 res[3];
+		} reserv;
+	} __packed;
+};
+
 struct prestera_msg_acl_match {
 	u32 type;
 	union {
@@ -354,6 +368,16 @@ struct prestera_msg_acl_rule_req {
 	u8 n_matches;
 };
 
+struct prestera_msg_acl_rule_ext_req {
+	struct prestera_msg_cmd cmd;
+	u32 id;
+	u32 priority;
+	u16 ruleset_id;
+	u8 n_actions;
+	u8 n_matches;
+	u8 hw_tc;
+};
+
 struct prestera_msg_acl_rule_resp {
 	struct prestera_msg_ret ret;
 	u32 id;
@@ -908,6 +932,36 @@ static int prestera_hw_acl_actions_put(struct prestera_msg_acl_action *action,
 	return 0;
 }
 
+static int prestera_hw_acl_actions_ext_put(struct prestera_msg_acl_action_ext *action,
+					   struct prestera_acl_rule *rule)
+{
+	struct list_head *a_list = prestera_acl_rule_action_list_get(rule);
+	struct prestera_acl_rule_action_entry *a_entry;
+	int i = 0;
+
+	list_for_each_entry(a_entry, a_list, list) {
+		action[i].id = a_entry->id;
+
+		switch (a_entry->id) {
+		case PRESTERA_ACL_RULE_ACTION_ACCEPT:
+		case PRESTERA_ACL_RULE_ACTION_DROP:
+		case PRESTERA_ACL_RULE_ACTION_TRAP:
+			/* just rule action id, no specific data */
+			break;
+		case PRESTERA_ACL_RULE_ACTION_POLICE:
+			action[i].police.rate = a_entry->police.rate;
+			action[i].police.burst = a_entry->police.burst;
+			break;
+		default:
+			return -EINVAL;
+		}
+
+		i++;
+	}
+
+	return 0;
+}
+
 static int prestera_hw_acl_matches_put(struct prestera_msg_acl_match *match,
 				       struct prestera_acl_rule *rule)
 {
@@ -963,9 +1017,9 @@ static int prestera_hw_acl_matches_put(struct prestera_msg_acl_match *match,
 	return 0;
 }
 
-int prestera_hw_acl_rule_add(struct prestera_switch *sw,
-			     struct prestera_acl_rule *rule,
-			     u32 *rule_id)
+int __prestera_hw_acl_rule_add(struct prestera_switch *sw,
+			       struct prestera_acl_rule *rule,
+			       u32 *rule_id)
 {
 	struct prestera_msg_acl_action *actions;
 	struct prestera_msg_acl_match *matches;
@@ -1017,6 +1071,71 @@ int prestera_hw_acl_rule_add(struct prestera_switch *sw,
 	return err;
 }
 
+int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw,
+				   struct prestera_acl_rule *rule,
+				   u32 *rule_id)
+{
+	struct prestera_msg_acl_action_ext *actions;
+	struct prestera_msg_acl_rule_ext_req *req;
+	struct prestera_msg_acl_match *matches;
+	struct prestera_msg_acl_rule_resp resp;
+	u8 n_actions;
+	u8 n_matches;
+	void *buff;
+	u32 size;
+	int err;
+
+	n_actions = prestera_acl_rule_action_len(rule);
+	n_matches = prestera_acl_rule_match_len(rule);
+
+	size = sizeof(*req) + sizeof(*actions) * n_actions +
+		sizeof(*matches) * n_matches;
+
+	buff = kzalloc(size, GFP_KERNEL);
+	if (!buff)
+		return -ENOMEM;
+
+	req = buff;
+	actions = buff + sizeof(*req);
+	matches = buff + sizeof(*req) + sizeof(*actions) * n_actions;
+
+	/* put acl actions into the message */
+	err = prestera_hw_acl_actions_ext_put(actions, rule);
+	if (err)
+		goto free_buff;
+
+	/* put acl matches into the message */
+	err = prestera_hw_acl_matches_put(matches, rule);
+	if (err)
+		goto free_buff;
+
+	req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule);
+	req->priority = prestera_acl_rule_priority_get(rule);
+	req->n_actions = prestera_acl_rule_action_len(rule);
+	req->n_matches = prestera_acl_rule_match_len(rule);
+	req->hw_tc = prestera_acl_rule_hw_tc_get(rule);
+
+	err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD,
+			       &req->cmd, size, &resp.ret, sizeof(resp));
+	if (err)
+		goto free_buff;
+
+	*rule_id = resp.id;
+free_buff:
+	kfree(buff);
+	return err;
+}
+
+int prestera_hw_acl_rule_add(struct prestera_switch *sw,
+			     struct prestera_acl_rule *rule,
+			     u32 *rule_id)
+{
+	if (sw->dev->fw_rev.maj == 3 && sw->dev->fw_rev.min == 0)
+		return __prestera_hw_acl_rule_add(sw, rule, rule_id);
+
+	return __prestera_hw_acl_rule_ext_add(sw, rule, rule_id);
+};
+
 int prestera_hw_acl_rule_del(struct prestera_switch *sw, u32 rule_id)
 {
 	struct prestera_msg_acl_rule_req req = {
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
index ce4cf51dba5a..f988603af1b6 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c
@@ -15,6 +15,7 @@
 #define PRESTERA_MSG_MAX_SIZE 1500
 
 static struct prestera_fw_rev prestera_fw_supp[] = {
+	{ 3, 1 },
 	{ 3, 0 },
 	{ 2, 0 }
 };
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [RFC net-next 0/4] Marvell Prestera add policer support
  2021-07-02 18:29 [RFC net-next 0/4] Marvell Prestera add policer support Vadym Kochan
                   ` (3 preceding siblings ...)
  2021-07-02 18:29 ` [RFC net-next 4/4] net: marvell: prestera: Offload FLOW_ACTION_POLICE Vadym Kochan
@ 2021-07-02 18:52 ` Andrew Lunn
  2021-07-02 19:16   ` Vadym Kochan
  4 siblings, 1 reply; 8+ messages in thread
From: Andrew Lunn @ 2021-07-02 18:52 UTC (permalink / raw)
  To: Vadym Kochan
  Cc: David S. Miller, Jakub Kicinski, netdev, Jiri Pirko,
	Vladimir Oltean, Volodymyr Mytnyk, Serhiy Boiko, Taras Chornyi,
	linux-kernel, Mickey Rachamim, Vadym Kochan

On Fri, Jul 02, 2021 at 09:29:11PM +0300, Vadym Kochan wrote:
> From: Vadym Kochan <vkochan@marvell.com>
> 
> Offload action police when keyed to a flower classifier.
> Only rate and burst is supported for now. The conform-exceed
> drop is assumed as a default value.
> 
> Policer support requires FW 3.1 version. Because there are some FW ABI
> differences in ACL rule messages between 3.0 and 3.1 so added separate
> "_ext" struct version with separate HW helper.

This driver is less than a year old, and it is on its third ABI break?
It is accumulating more and more cruft as you need to handle old and
new messages. Maybe you should take a harder look into your crystal
ball and try to figure out an ABI which you can use for 12 months or
more? Or just directly address the hardware, and skip the firmware?

      Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC net-next 0/4] Marvell Prestera add policer support
  2021-07-02 18:52 ` [RFC net-next 0/4] Marvell Prestera add policer support Andrew Lunn
@ 2021-07-02 19:16   ` Vadym Kochan
  0 siblings, 0 replies; 8+ messages in thread
From: Vadym Kochan @ 2021-07-02 19:16 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: David S. Miller, Jakub Kicinski, netdev, Jiri Pirko,
	Vladimir Oltean, Volodymyr Mytnyk, Serhiy Boiko, Taras Chornyi,
	linux-kernel, Mickey Rachamim, Vadym Kochan

Hi Andrew,

On Fri, Jul 02, 2021 at 08:52:43PM +0200, Andrew Lunn wrote:
> On Fri, Jul 02, 2021 at 09:29:11PM +0300, Vadym Kochan wrote:
> > From: Vadym Kochan <vkochan@marvell.com>
> > 
> > Offload action police when keyed to a flower classifier.
> > Only rate and burst is supported for now. The conform-exceed
> > drop is assumed as a default value.
> > 
> > Policer support requires FW 3.1 version. Because there are some FW ABI
> > differences in ACL rule messages between 3.0 and 3.1 so added separate
> > "_ext" struct version with separate HW helper.
> 
> This driver is less than a year old, and it is on its third ABI break?
> It is accumulating more and more cruft as you need to handle old and
> new messages. Maybe you should take a harder look into your crystal
> ball and try to figure out an ABI which you can use for 12 months or
> more? Or just directly address the hardware, and skip the firmware?
> 
>       Andrew

I thought (considering the latest discussion about latest FW PULL
REQUEST) it will be not a problem to update FW (and adapt the driver)
quite often during the initial feature bring-up (actually the older
supported FW code will be removed in the driver after some time). If it
is the problem, then probably it makes sense to first add new FW 4.x
with much more features and after add support of these features in the
driver step-by-step.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC net-next 4/4] net: marvell: prestera: Offload FLOW_ACTION_POLICE
  2021-07-02 18:29 ` [RFC net-next 4/4] net: marvell: prestera: Offload FLOW_ACTION_POLICE Vadym Kochan
@ 2021-07-02 21:19   ` kernel test robot
  0 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2021-07-02 21:19 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 5805 bytes --]

Hi Vadym,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Vadym-Kochan/Marvell-Prestera-add-policer-support/20210703-023111
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 5e437416ff66981d8154687cfdf7de50b1d82bfc
config: i386-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://github.com/0day-ci/linux/commit/c73807fd8e0377dde8c6646d906a2dc449e6f48b
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Vadym-Kochan/Marvell-Prestera-add-policer-support/20210703-023111
        git checkout c73807fd8e0377dde8c6646d906a2dc449e6f48b
        # save the attached .config to linux build tree
        make W=1 ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/net/ethernet/marvell/prestera/prestera_hw.c:1020:5: warning: no previous prototype for '__prestera_hw_acl_rule_add' [-Wmissing-prototypes]
    1020 | int __prestera_hw_acl_rule_add(struct prestera_switch *sw,
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/marvell/prestera/prestera_hw.c:1074:5: warning: no previous prototype for '__prestera_hw_acl_rule_ext_add' [-Wmissing-prototypes]
    1074 | int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw,
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Kconfig warnings: (for reference only)
   WARNING: unmet direct dependencies detected for PHY_SPARX5_SERDES
   Depends on (ARCH_SPARX5 || COMPILE_TEST && OF && HAS_IOMEM
   Selected by
   - SPARX5_SWITCH && NETDEVICES && ETHERNET && NET_VENDOR_MICROCHIP && NET_SWITCHDEV && HAS_IOMEM


vim +/__prestera_hw_acl_rule_add +1020 drivers/net/ethernet/marvell/prestera/prestera_hw.c

  1019	
> 1020	int __prestera_hw_acl_rule_add(struct prestera_switch *sw,
  1021				       struct prestera_acl_rule *rule,
  1022				       u32 *rule_id)
  1023	{
  1024		struct prestera_msg_acl_action *actions;
  1025		struct prestera_msg_acl_match *matches;
  1026		struct prestera_msg_acl_rule_resp resp;
  1027		struct prestera_msg_acl_rule_req *req;
  1028		u8 n_actions;
  1029		u8 n_matches;
  1030		void *buff;
  1031		u32 size;
  1032		int err;
  1033	
  1034		n_actions = prestera_acl_rule_action_len(rule);
  1035		n_matches = prestera_acl_rule_match_len(rule);
  1036	
  1037		size = sizeof(*req) + sizeof(*actions) * n_actions +
  1038			sizeof(*matches) * n_matches;
  1039	
  1040		buff = kzalloc(size, GFP_KERNEL);
  1041		if (!buff)
  1042			return -ENOMEM;
  1043	
  1044		req = buff;
  1045		actions = buff + sizeof(*req);
  1046		matches = buff + sizeof(*req) + sizeof(*actions) * n_actions;
  1047	
  1048		/* put acl actions into the message */
  1049		err = prestera_hw_acl_actions_put(actions, rule);
  1050		if (err)
  1051			goto free_buff;
  1052	
  1053		/* put acl matches into the message */
  1054		err = prestera_hw_acl_matches_put(matches, rule);
  1055		if (err)
  1056			goto free_buff;
  1057	
  1058		req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule);
  1059		req->priority = prestera_acl_rule_priority_get(rule);
  1060		req->n_actions = prestera_acl_rule_action_len(rule);
  1061		req->n_matches = prestera_acl_rule_match_len(rule);
  1062	
  1063		err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD,
  1064				       &req->cmd, size, &resp.ret, sizeof(resp));
  1065		if (err)
  1066			goto free_buff;
  1067	
  1068		*rule_id = resp.id;
  1069	free_buff:
  1070		kfree(buff);
  1071		return err;
  1072	}
  1073	
> 1074	int __prestera_hw_acl_rule_ext_add(struct prestera_switch *sw,
  1075					   struct prestera_acl_rule *rule,
  1076					   u32 *rule_id)
  1077	{
  1078		struct prestera_msg_acl_action_ext *actions;
  1079		struct prestera_msg_acl_rule_ext_req *req;
  1080		struct prestera_msg_acl_match *matches;
  1081		struct prestera_msg_acl_rule_resp resp;
  1082		u8 n_actions;
  1083		u8 n_matches;
  1084		void *buff;
  1085		u32 size;
  1086		int err;
  1087	
  1088		n_actions = prestera_acl_rule_action_len(rule);
  1089		n_matches = prestera_acl_rule_match_len(rule);
  1090	
  1091		size = sizeof(*req) + sizeof(*actions) * n_actions +
  1092			sizeof(*matches) * n_matches;
  1093	
  1094		buff = kzalloc(size, GFP_KERNEL);
  1095		if (!buff)
  1096			return -ENOMEM;
  1097	
  1098		req = buff;
  1099		actions = buff + sizeof(*req);
  1100		matches = buff + sizeof(*req) + sizeof(*actions) * n_actions;
  1101	
  1102		/* put acl actions into the message */
  1103		err = prestera_hw_acl_actions_ext_put(actions, rule);
  1104		if (err)
  1105			goto free_buff;
  1106	
  1107		/* put acl matches into the message */
  1108		err = prestera_hw_acl_matches_put(matches, rule);
  1109		if (err)
  1110			goto free_buff;
  1111	
  1112		req->ruleset_id = prestera_acl_rule_ruleset_id_get(rule);
  1113		req->priority = prestera_acl_rule_priority_get(rule);
  1114		req->n_actions = prestera_acl_rule_action_len(rule);
  1115		req->n_matches = prestera_acl_rule_match_len(rule);
  1116		req->hw_tc = prestera_acl_rule_hw_tc_get(rule);
  1117	
  1118		err = prestera_cmd_ret(sw, PRESTERA_CMD_TYPE_ACL_RULE_ADD,
  1119				       &req->cmd, size, &resp.ret, sizeof(resp));
  1120		if (err)
  1121			goto free_buff;
  1122	
  1123		*rule_id = resp.id;
  1124	free_buff:
  1125		kfree(buff);
  1126		return err;
  1127	}
  1128	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 64900 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-07-02 21:19 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-02 18:29 [RFC net-next 0/4] Marvell Prestera add policer support Vadym Kochan
2021-07-02 18:29 ` [RFC net-next 1/4] net: marvell: prestera: do not fail if FW reply is bigger Vadym Kochan
2021-07-02 18:29 ` [RFC net-next 2/4] net: marvell: prestera: turn FW supported versions into an array Vadym Kochan
2021-07-02 18:29 ` [RFC net-next 3/4] net: sched: introduce __tc_classid_to_hwtc() helper Vadym Kochan
2021-07-02 18:29 ` [RFC net-next 4/4] net: marvell: prestera: Offload FLOW_ACTION_POLICE Vadym Kochan
2021-07-02 21:19   ` kernel test robot
2021-07-02 18:52 ` [RFC net-next 0/4] Marvell Prestera add policer support Andrew Lunn
2021-07-02 19:16   ` Vadym Kochan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.