net: hns3: add command queue trace for hns3
authorHao Lan <lanhao@huawei.com>
Wed, 10 Apr 2024 12:53:51 +0000 (20:53 +0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 13 Apr 2024 01:56:51 +0000 (18:56 -0700)
Add support to dump command queue trace for hns3.

Signed-off-by: Hao Lan <lanhao@huawei.com>
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Link: https://lore.kernel.org/r/20240410125354.2177067-2-shaojijie@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_trace.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_trace.h

index 652d71326231ad729b35ce6d89650f1b03f6d144..11df6fbd641dced7c2e60ed256777ab45b272256 100644 (file)
@@ -470,10 +470,14 @@ static int hclge_comm_cmd_check_result(struct hclge_comm_hw *hw,
 int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
                        int num)
 {
+       bool is_special = hclge_comm_is_special_opcode(le16_to_cpu(desc->opcode));
        struct hclge_comm_cmq_ring *csq = &hw->cmq.csq;
        int ret;
        int ntc;
 
+       if (hw->cmq.ops.trace_cmd_send)
+               hw->cmq.ops.trace_cmd_send(hw, desc, num, is_special);
+
        spin_lock_bh(&hw->cmq.csq.lock);
 
        if (test_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hw->comm_state)) {
@@ -507,6 +511,9 @@ int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
 
        spin_unlock_bh(&hw->cmq.csq.lock);
 
+       if (hw->cmq.ops.trace_cmd_get)
+               hw->cmq.ops.trace_cmd_get(hw, desc, num, is_special);
+
        return ret;
 }
 
@@ -584,6 +591,17 @@ err_csq:
        return ret;
 }
 
+void hclge_comm_cmd_init_ops(struct hclge_comm_hw *hw,
+                            const struct hclge_comm_cmq_ops *ops)
+{
+       struct hclge_comm_cmq *cmdq = &hw->cmq;
+
+       if (ops) {
+               cmdq->ops.trace_cmd_send = ops->trace_cmd_send;
+               cmdq->ops.trace_cmd_get = ops->trace_cmd_get;
+       }
+}
+
 int hclge_comm_cmd_init(struct hnae3_ae_dev *ae_dev, struct hclge_comm_hw *hw,
                        u32 *fw_version, bool is_pf,
                        unsigned long reset_pending)
index 552396518e08add03a365b0ff36c8cde1046523a..e6a087576df6fe6ce6c62f18e13d4f8c5976cc30 100644 (file)
@@ -423,11 +423,22 @@ enum hclge_comm_cmd_status {
        HCLGE_COMM_ERR_CSQ_ERROR        = -3,
 };
 
+struct hclge_comm_hw;
+struct hclge_comm_cmq_ops {
+       void (*trace_cmd_send)(struct hclge_comm_hw *hw,
+                              struct hclge_desc *desc,
+                              int num, bool is_special);
+       void (*trace_cmd_get)(struct hclge_comm_hw *hw,
+                             struct hclge_desc *desc,
+                             int num, bool is_special);
+};
+
 struct hclge_comm_cmq {
        struct hclge_comm_cmq_ring csq;
        struct hclge_comm_cmq_ring crq;
        u16 tx_timeout;
        enum hclge_comm_cmd_status last_status;
+       struct hclge_comm_cmq_ops ops;
 };
 
 struct hclge_comm_hw {
@@ -474,5 +485,6 @@ int hclge_comm_cmd_queue_init(struct pci_dev *pdev, struct hclge_comm_hw *hw);
 int hclge_comm_cmd_init(struct hnae3_ae_dev *ae_dev, struct hclge_comm_hw *hw,
                        u32 *fw_version, bool is_pf,
                        unsigned long reset_pending);
-
+void hclge_comm_cmd_init_ops(struct hclge_comm_hw *hw,
+                            const struct hclge_comm_cmq_ops *ops);
 #endif
index ff6a2ed23ddb6be2c5dd132698d2fd079f5f5827..eb31a7e9c8fc8c6a8809db26658820e386c56938 100644 (file)
@@ -27,6 +27,8 @@
 #include "hclge_devlink.h"
 #include "hclge_comm_cmd.h"
 
+#include "hclge_trace.h"
+
 #define HCLGE_NAME                     "hclge"
 
 #define HCLGE_BUF_SIZE_UNIT    256U
@@ -391,6 +393,48 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
        return hclge_comm_cmd_send(&hw->hw, desc, num);
 }
 
+static void hclge_trace_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
+                                int num, bool is_special)
+{
+       int i;
+
+       trace_hclge_pf_cmd_send(hw, desc, 0, num);
+
+       if (!is_special) {
+               for (i = 1; i < num; i++)
+                       trace_hclge_pf_cmd_send(hw, &desc[i], i, num);
+       } else {
+               for (i = 1; i < num; i++)
+                       trace_hclge_pf_special_cmd_send(hw, (__le32 *)&desc[i],
+                                                       i, num);
+       }
+}
+
+static void hclge_trace_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *desc,
+                               int num, bool is_special)
+{
+       int i;
+
+       if (!HCLGE_COMM_SEND_SYNC(le16_to_cpu(desc->flag)))
+               return;
+
+       trace_hclge_pf_cmd_get(hw, desc, 0, num);
+
+       if (!is_special) {
+               for (i = 1; i < num; i++)
+                       trace_hclge_pf_cmd_get(hw, &desc[i], i, num);
+       } else {
+               for (i = 1; i < num; i++)
+                       trace_hclge_pf_special_cmd_get(hw, (__le32 *)&desc[i],
+                                                      i, num);
+       }
+}
+
+static const struct hclge_comm_cmq_ops hclge_cmq_ops = {
+       .trace_cmd_send = hclge_trace_cmd_send,
+       .trace_cmd_get = hclge_trace_cmd_get,
+};
+
 static int hclge_mac_update_stats_defective(struct hclge_dev *hdev)
 {
 #define HCLGE_MAC_CMD_NUM 21
@@ -11634,6 +11678,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
                goto err_devlink_uninit;
 
        /* Firmware command initialize */
+       hclge_comm_cmd_init_ops(&hdev->hw.hw, &hclge_cmq_ops);
        ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, &hdev->fw_version,
                                  true, hdev->reset_pending);
        if (ret)
index f3cd5a376eca90493395687fc40f9da27715a674..7e47f0c21d888c720e027ae797f75e3bf922ea9e 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/tracepoint.h>
 
+#define PF_DESC_LEN    (sizeof(struct hclge_desc) / sizeof(u32))
 #define PF_GET_MBX_LEN (sizeof(struct hclge_mbx_vf_to_pf_cmd) / sizeof(u32))
 #define PF_SEND_MBX_LEN        (sizeof(struct hclge_mbx_pf_to_vf_cmd) / sizeof(u32))
 
@@ -77,6 +78,99 @@ TRACE_EVENT(hclge_pf_mbx_send,
        )
 );
 
+DECLARE_EVENT_CLASS(hclge_pf_cmd_template,
+                   TP_PROTO(struct hclge_comm_hw *hw,
+                            struct hclge_desc *desc,
+                            int index,
+                            int num),
+                   TP_ARGS(hw, desc, index, num),
+
+                   TP_STRUCT__entry(__field(u16, opcode)
+                       __field(u16, flag)
+                       __field(u16, retval)
+                       __field(u16, rsv)
+                       __field(int, index)
+                       __field(int, num)
+                       __string(pciname, pci_name(hw->cmq.csq.pdev))
+                       __array(u32, data, HCLGE_DESC_DATA_LEN)),
+
+                   TP_fast_assign(int i;
+                       __entry->opcode = le16_to_cpu(desc->opcode);
+                       __entry->flag = le16_to_cpu(desc->flag);
+                       __entry->retval = le16_to_cpu(desc->retval);
+                       __entry->rsv = le16_to_cpu(desc->rsv);
+                       __entry->index = index;
+                       __entry->num = num;
+                       __assign_str(pciname, pci_name(hw->cmq.csq.pdev));
+                       for (i = 0; i < HCLGE_DESC_DATA_LEN; i++)
+                               __entry->data[i] = le32_to_cpu(desc->data[i]);),
+
+                   TP_printk("%s opcode:0x%04x %d-%d flag:0x%04x retval:0x%04x rsv:0x%04x data:%s",
+                             __get_str(pciname), __entry->opcode,
+                             __entry->index, __entry->num,
+                             __entry->flag, __entry->retval, __entry->rsv,
+                             __print_array(__entry->data,
+                                           HCLGE_DESC_DATA_LEN, sizeof(u32)))
+);
+
+DEFINE_EVENT(hclge_pf_cmd_template, hclge_pf_cmd_send,
+            TP_PROTO(struct hclge_comm_hw *hw,
+                     struct hclge_desc *desc,
+                     int index,
+                     int num),
+            TP_ARGS(hw, desc, index, num)
+);
+
+DEFINE_EVENT(hclge_pf_cmd_template, hclge_pf_cmd_get,
+            TP_PROTO(struct hclge_comm_hw *hw,
+                     struct hclge_desc *desc,
+                     int index,
+                     int num),
+            TP_ARGS(hw, desc, index, num)
+);
+
+DECLARE_EVENT_CLASS(hclge_pf_special_cmd_template,
+                   TP_PROTO(struct hclge_comm_hw *hw,
+                            __le32 *data,
+                            int index,
+                            int num),
+                   TP_ARGS(hw, data, index, num),
+
+                   TP_STRUCT__entry(__field(int, index)
+                       __field(int, num)
+                       __string(pciname, pci_name(hw->cmq.csq.pdev))
+                       __array(u32, data, PF_DESC_LEN)),
+
+                   TP_fast_assign(int i;
+                       __entry->index = index;
+                       __entry->num = num;
+                       __assign_str(pciname, pci_name(hw->cmq.csq.pdev));
+                       for (i = 0; i < PF_DESC_LEN; i++)
+                               __entry->data[i] = le32_to_cpu(data[i]);
+               ),
+
+                   TP_printk("%s %d-%d data:%s",
+                             __get_str(pciname),
+                             __entry->index, __entry->num,
+                             __print_array(__entry->data,
+                                           PF_DESC_LEN, sizeof(u32)))
+);
+
+DEFINE_EVENT(hclge_pf_special_cmd_template, hclge_pf_special_cmd_send,
+            TP_PROTO(struct hclge_comm_hw *hw,
+                     __le32 *desc,
+                     int index,
+                     int num),
+            TP_ARGS(hw, desc, index, num));
+
+DEFINE_EVENT(hclge_pf_special_cmd_template, hclge_pf_special_cmd_get,
+            TP_PROTO(struct hclge_comm_hw *hw,
+                     __le32 *desc,
+                     int index,
+                     int num),
+            TP_ARGS(hw, desc, index, num)
+);
+
 #endif /* _HCLGE_TRACE_H_ */
 
 /* This must be outside ifdef _HCLGE_TRACE_H */
index 0aa9beefd1c7ee6c53d9f2623069bae00848e77f..ecc0925553620178a8a0a001956ecf43dc40e537 100644 (file)
@@ -11,6 +11,7 @@
 #include "hnae3.h"
 #include "hclgevf_devlink.h"
 #include "hclge_comm_rss.h"
+#include "hclgevf_trace.h"
 
 #define HCLGEVF_NAME   "hclgevf"
 
@@ -47,6 +48,42 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclge_desc *desc, int num)
        return hclge_comm_cmd_send(&hw->hw, desc, num);
 }
 
+static void hclgevf_trace_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
+                                  int num, bool is_special)
+{
+       int i;
+
+       trace_hclge_vf_cmd_send(hw, desc, 0, num);
+
+       if (is_special)
+               return;
+
+       for (i = 1; i < num; i++)
+               trace_hclge_vf_cmd_send(hw, &desc[i], i, num);
+}
+
+static void hclgevf_trace_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *desc,
+                                 int num, bool is_special)
+{
+       int i;
+
+       if (!HCLGE_COMM_SEND_SYNC(le16_to_cpu(desc->flag)))
+               return;
+
+       trace_hclge_vf_cmd_get(hw, desc, 0, num);
+
+       if (is_special)
+               return;
+
+       for (i = 1; i < num; i++)
+               trace_hclge_vf_cmd_get(hw, &desc[i], i, num);
+}
+
+static const struct hclge_comm_cmq_ops hclgevf_cmq_ops = {
+       .trace_cmd_send = hclgevf_trace_cmd_send,
+       .trace_cmd_get = hclgevf_trace_cmd_get,
+};
+
 void hclgevf_arq_init(struct hclgevf_dev *hdev)
 {
        struct hclge_comm_cmq *cmdq = &hdev->hw.hw.cmq;
@@ -2796,6 +2833,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
        }
 
        hclgevf_arq_init(hdev);
+
        ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw,
                                  &hdev->fw_version, false,
                                  hdev->reset_pending);
@@ -2854,6 +2892,8 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
                goto err_cmd_queue_init;
 
        hclgevf_arq_init(hdev);
+
+       hclge_comm_cmd_init_ops(&hdev->hw.hw, &hclgevf_cmq_ops);
        ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw,
                                  &hdev->fw_version, false,
                                  hdev->reset_pending);
index b259e95dd53c263819af84e280d1aa2133165c59..e2e3a2602b6adf169e48c34337d76b4bd568d546 100644 (file)
@@ -77,6 +77,56 @@ TRACE_EVENT(hclge_vf_mbx_send,
        )
 );
 
+DECLARE_EVENT_CLASS(hclge_vf_cmd_template,
+                   TP_PROTO(struct hclge_comm_hw *hw,
+                            struct hclge_desc *desc,
+                            int index,
+                            int num),
+
+                   TP_ARGS(hw, desc, index, num),
+
+                   TP_STRUCT__entry(__field(u16, opcode)
+                       __field(u16, flag)
+                       __field(u16, retval)
+                       __field(u16, rsv)
+                       __field(int, index)
+                       __field(int, num)
+                       __string(pciname, pci_name(hw->cmq.csq.pdev))
+                       __array(u32, data, HCLGE_DESC_DATA_LEN)),
+
+                   TP_fast_assign(int i;
+                       __entry->opcode = le16_to_cpu(desc->opcode);
+                       __entry->flag = le16_to_cpu(desc->flag);
+                       __entry->retval = le16_to_cpu(desc->retval);
+                       __entry->rsv = le16_to_cpu(desc->rsv);
+                       __entry->index = index;
+                       __entry->num = num;
+                       __assign_str(pciname, pci_name(hw->cmq.csq.pdev));
+                       for (i = 0; i < HCLGE_DESC_DATA_LEN; i++)
+                               __entry->data[i] = le32_to_cpu(desc->data[i]);),
+
+                   TP_printk("%s opcode:0x%04x %d-%d flag:0x%04x retval:0x%04x rsv:0x%04x data:%s",
+                             __get_str(pciname), __entry->opcode,
+                             __entry->index, __entry->num,
+                             __entry->flag, __entry->retval, __entry->rsv,
+                             __print_array(__entry->data,
+                                           HCLGE_DESC_DATA_LEN, sizeof(u32)))
+);
+
+DEFINE_EVENT(hclge_vf_cmd_template, hclge_vf_cmd_send,
+            TP_PROTO(struct hclge_comm_hw *hw,
+                     struct hclge_desc *desc,
+                     int index,
+                     int num),
+            TP_ARGS(hw, desc, index, num));
+
+DEFINE_EVENT(hclge_vf_cmd_template, hclge_vf_cmd_get,
+            TP_PROTO(struct hclge_comm_hw *hw,
+                     struct hclge_desc *desc,
+                     int index,
+                     int num),
+            TP_ARGS(hw, desc, index, num));
+
 #endif /* _HCLGEVF_TRACE_H_ */
 
 /* This must be outside ifdef _HCLGEVF_TRACE_H */