提交 4851f36a 编写于 作者: J Jian Shen 提交者: Zheng Zengkai

net: hns3: add support for forwarding packet to queues of specified TC when flow director rule hit

mainline inclusion
from mainline-v5.11-rc1
commit 0f993fe2
category: feature
bugzilla: 173966
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0f993fe2b89db2342833856cc0597a309f278e55

----------------------------------------------------------------------

For some new device, it supports forwarding packet to queues
of specified TC when flow director rule hit. So extend the
command handle to support it.
Signed-off-by: NJian Shen <shenjian15@huawei.com>
Signed-off-by: NHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Reviewed-by: NYongxin Li <liyongxin1@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 46961be3
...@@ -359,6 +359,8 @@ static void hclge_parse_capability(struct hclge_dev *hdev, ...@@ -359,6 +359,8 @@ static void hclge_parse_capability(struct hclge_dev *hdev,
set_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps); set_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, ae_dev->caps);
if (hnae3_get_bit(caps, HCLGE_CAP_UDP_TUNNEL_CSUM_B)) if (hnae3_get_bit(caps, HCLGE_CAP_UDP_TUNNEL_CSUM_B))
set_bit(HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B, ae_dev->caps); set_bit(HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B, ae_dev->caps);
if (hnae3_get_bit(caps, HCLGE_CAP_FD_FORWARD_TC_B))
set_bit(HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B, ae_dev->caps);
} }
static enum hclge_cmd_status static enum hclge_cmd_status
......
...@@ -1051,6 +1051,9 @@ struct hclge_fd_tcam_config_3_cmd { ...@@ -1051,6 +1051,9 @@ struct hclge_fd_tcam_config_3_cmd {
#define HCLGE_FD_AD_WR_RULE_ID_B 0 #define HCLGE_FD_AD_WR_RULE_ID_B 0
#define HCLGE_FD_AD_RULE_ID_S 1 #define HCLGE_FD_AD_RULE_ID_S 1
#define HCLGE_FD_AD_RULE_ID_M GENMASK(12, 1) #define HCLGE_FD_AD_RULE_ID_M GENMASK(12, 1)
#define HCLGE_FD_AD_TC_OVRD_B 16
#define HCLGE_FD_AD_TC_SIZE_S 17
#define HCLGE_FD_AD_TC_SIZE_M GENMASK(20, 17)
struct hclge_fd_ad_config_cmd { struct hclge_fd_ad_config_cmd {
u8 stage; u8 stage;
......
...@@ -5102,6 +5102,7 @@ static int hclge_fd_tcam_config(struct hclge_dev *hdev, u8 stage, bool sel_x, ...@@ -5102,6 +5102,7 @@ static int hclge_fd_tcam_config(struct hclge_dev *hdev, u8 stage, bool sel_x,
static int hclge_fd_ad_config(struct hclge_dev *hdev, u8 stage, int loc, static int hclge_fd_ad_config(struct hclge_dev *hdev, u8 stage, int loc,
struct hclge_fd_ad_data *action) struct hclge_fd_ad_data *action)
{ {
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
struct hclge_fd_ad_config_cmd *req; struct hclge_fd_ad_config_cmd *req;
struct hclge_desc desc; struct hclge_desc desc;
u64 ad_data = 0; u64 ad_data = 0;
...@@ -5117,6 +5118,12 @@ static int hclge_fd_ad_config(struct hclge_dev *hdev, u8 stage, int loc, ...@@ -5117,6 +5118,12 @@ static int hclge_fd_ad_config(struct hclge_dev *hdev, u8 stage, int loc,
action->write_rule_id_to_bd); action->write_rule_id_to_bd);
hnae3_set_field(ad_data, HCLGE_FD_AD_RULE_ID_M, HCLGE_FD_AD_RULE_ID_S, hnae3_set_field(ad_data, HCLGE_FD_AD_RULE_ID_M, HCLGE_FD_AD_RULE_ID_S,
action->rule_id); action->rule_id);
if (test_bit(HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B, ae_dev->caps)) {
hnae3_set_bit(ad_data, HCLGE_FD_AD_TC_OVRD_B,
action->override_tc);
hnae3_set_field(ad_data, HCLGE_FD_AD_TC_SIZE_M,
HCLGE_FD_AD_TC_SIZE_S, (u32)action->tc_size);
}
ad_data <<= 32; ad_data <<= 32;
hnae3_set_bit(ad_data, HCLGE_FD_AD_DROP_B, action->drop_packet); hnae3_set_bit(ad_data, HCLGE_FD_AD_DROP_B, action->drop_packet);
hnae3_set_bit(ad_data, HCLGE_FD_AD_DIRECT_QID_B, hnae3_set_bit(ad_data, HCLGE_FD_AD_DIRECT_QID_B,
...@@ -5360,16 +5367,22 @@ static int hclge_config_key(struct hclge_dev *hdev, u8 stage, ...@@ -5360,16 +5367,22 @@ static int hclge_config_key(struct hclge_dev *hdev, u8 stage,
static int hclge_config_action(struct hclge_dev *hdev, u8 stage, static int hclge_config_action(struct hclge_dev *hdev, u8 stage,
struct hclge_fd_rule *rule) struct hclge_fd_rule *rule)
{ {
struct hclge_vport *vport = hdev->vport;
struct hnae3_knic_private_info *kinfo = &vport->nic.kinfo;
struct hclge_fd_ad_data ad_data; struct hclge_fd_ad_data ad_data;
memset(&ad_data, 0, sizeof(struct hclge_fd_ad_data));
ad_data.ad_id = rule->location; ad_data.ad_id = rule->location;
if (rule->action == HCLGE_FD_ACTION_DROP_PACKET) { if (rule->action == HCLGE_FD_ACTION_DROP_PACKET) {
ad_data.drop_packet = true; ad_data.drop_packet = true;
ad_data.forward_to_direct_queue = false; } else if (rule->action == HCLGE_FD_ACTION_SELECT_TC) {
ad_data.queue_id = 0; ad_data.override_tc = true;
ad_data.queue_id =
kinfo->tc_info.tqp_offset[rule->tc];
ad_data.tc_size =
ilog2(kinfo->tc_info.tqp_count[rule->tc]);
} else { } else {
ad_data.drop_packet = false;
ad_data.forward_to_direct_queue = true; ad_data.forward_to_direct_queue = true;
ad_data.queue_id = rule->queue_id; ad_data.queue_id = rule->queue_id;
} }
...@@ -5940,7 +5953,7 @@ static int hclge_add_fd_entry(struct hnae3_handle *handle, ...@@ -5940,7 +5953,7 @@ static int hclge_add_fd_entry(struct hnae3_handle *handle,
return -EINVAL; return -EINVAL;
} }
action = HCLGE_FD_ACTION_ACCEPT_PACKET; action = HCLGE_FD_ACTION_SELECT_QUEUE;
q_index = ring; q_index = ring;
} }
......
...@@ -574,8 +574,9 @@ enum HCLGE_FD_PACKET_TYPE { ...@@ -574,8 +574,9 @@ enum HCLGE_FD_PACKET_TYPE {
}; };
enum HCLGE_FD_ACTION { enum HCLGE_FD_ACTION {
HCLGE_FD_ACTION_ACCEPT_PACKET, HCLGE_FD_ACTION_SELECT_QUEUE,
HCLGE_FD_ACTION_DROP_PACKET, HCLGE_FD_ACTION_DROP_PACKET,
HCLGE_FD_ACTION_SELECT_TC,
}; };
struct hclge_fd_key_cfg { struct hclge_fd_key_cfg {
...@@ -621,6 +622,7 @@ struct hclge_fd_rule { ...@@ -621,6 +622,7 @@ struct hclge_fd_rule {
u32 unused_tuple; u32 unused_tuple;
u32 flow_type; u32 flow_type;
u8 action; u8 action;
u8 tc;
u16 vf_id; u16 vf_id;
u16 queue_id; u16 queue_id;
u16 location; u16 location;
...@@ -639,6 +641,8 @@ struct hclge_fd_ad_data { ...@@ -639,6 +641,8 @@ struct hclge_fd_ad_data {
u8 write_rule_id_to_bd; u8 write_rule_id_to_bd;
u8 next_input_key; u8 next_input_key;
u16 rule_id; u16 rule_id;
u16 tc_size;
u8 override_tc;
}; };
enum HCLGE_MAC_NODE_STATE { enum HCLGE_MAC_NODE_STATE {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册