hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c
....@@ -1,16 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Huawei HiNIC PCI Express Linux driver
34 * Copyright(c) 2017 Huawei Technologies Co., Ltd
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms and conditions of the GNU General Public License,
7
- * version 2, as published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope it will be useful, but WITHOUT
10
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
- * for more details.
13
- *
145 */
156
167 #include <linux/kernel.h>
....@@ -73,7 +64,7 @@
7364 #define CMDQ_WQE_SIZE 64
7465 #define CMDQ_DEPTH SZ_4K
7566
76
-#define CMDQ_WQ_PAGE_SIZE SZ_4K
67
+#define CMDQ_WQ_PAGE_SIZE SZ_256K
7768
7869 #define WQE_LCMD_SIZE 64
7970 #define WQE_SCMD_SIZE 64
....@@ -410,6 +401,7 @@
410401
411402 spin_unlock_bh(&cmdq->cmdq_lock);
412403
404
+ hinic_dump_ceq_info(cmdq->hwdev);
413405 return -ETIMEDOUT;
414406 }
415407
....@@ -633,6 +625,8 @@
633625 if (!CMDQ_WQE_COMPLETED(be32_to_cpu(ctrl->ctrl_info)))
634626 return -EBUSY;
635627
628
+ dma_rmb();
629
+
636630 errcode = CMDQ_WQE_ERRCODE_GET(be32_to_cpu(status->status_info), VAL);
637631
638632 cmdq_sync_cmd_handler(cmdq, ci, errcode);
....@@ -712,7 +706,7 @@
712706 /* The data in the HW is in Big Endian Format */
713707 wq_first_page_paddr = be64_to_cpu(*wq->block_vaddr);
714708
715
- pfn = CMDQ_PFN(wq_first_page_paddr, wq->wq_page_size);
709
+ pfn = CMDQ_PFN(wq_first_page_paddr, SZ_4K);
716710
717711 ctxt_info->curr_wqe_page_pfn =
718712 HINIC_CMDQ_CTXT_PAGE_INFO_SET(pfn, CURR_WQE_PAGE_PFN) |
....@@ -721,16 +715,19 @@
721715 HINIC_CMDQ_CTXT_PAGE_INFO_SET(1, CEQ_EN) |
722716 HINIC_CMDQ_CTXT_PAGE_INFO_SET(cmdq->wrapped, WRAPPED);
723717
724
- /* block PFN - Read Modify Write */
725
- cmdq_first_block_paddr = cmdq_pages->page_paddr;
718
+ if (wq->num_q_pages != 1) {
719
+ /* block PFN - Read Modify Write */
720
+ cmdq_first_block_paddr = cmdq_pages->page_paddr;
726721
727
- pfn = CMDQ_PFN(cmdq_first_block_paddr, wq->wq_page_size);
722
+ pfn = CMDQ_PFN(cmdq_first_block_paddr, wq->wq_page_size);
723
+ }
728724
729725 ctxt_info->wq_block_pfn =
730726 HINIC_CMDQ_CTXT_BLOCK_INFO_SET(pfn, WQ_BLOCK_PFN) |
731727 HINIC_CMDQ_CTXT_BLOCK_INFO_SET(atomic_read(&wq->cons_idx), CI);
732728
733729 cmdq_ctxt->func_idx = HINIC_HWIF_FUNC_IDX(cmdqs->hwif);
730
+ cmdq_ctxt->ppf_idx = HINIC_HWIF_PPF_IDX(cmdqs->hwif);
734731 cmdq_ctxt->cmdq_type = cmdq->cmdq_type;
735732 }
736733
....@@ -787,7 +784,7 @@
787784 * init_cmdqs_ctxt - write the cmdq ctxt to HW after init all cmdq
788785 * @hwdev: the NIC HW device
789786 * @cmdqs: cmdqs to write the ctxts for
790
- * &db_area: db_area for all the cmdqs
787
+ * @db_area: db_area for all the cmdqs
791788 *
792789 * Return 0 - Success, negative - Failure
793790 **/
....@@ -799,16 +796,10 @@
799796 struct hinic_cmdq_ctxt *cmdq_ctxts;
800797 struct pci_dev *pdev = hwif->pdev;
801798 struct hinic_pfhwdev *pfhwdev;
802
- size_t cmdq_ctxts_size;
803799 int err;
804800
805
- if (!HINIC_IS_PF(hwif) && !HINIC_IS_PPF(hwif)) {
806
- dev_err(&pdev->dev, "Unsupported PCI function type\n");
807
- return -EINVAL;
808
- }
809
-
810
- cmdq_ctxts_size = HINIC_MAX_CMDQ_TYPES * sizeof(*cmdq_ctxts);
811
- cmdq_ctxts = devm_kzalloc(&pdev->dev, cmdq_ctxts_size, GFP_KERNEL);
801
+ cmdq_ctxts = devm_kcalloc(&pdev->dev, HINIC_MAX_CMDQ_TYPES,
802
+ sizeof(*cmdq_ctxts), GFP_KERNEL);
812803 if (!cmdq_ctxts)
813804 return -ENOMEM;
814805
....@@ -816,6 +807,7 @@
816807
817808 cmdq_type = HINIC_CMDQ_SYNC;
818809 for (; cmdq_type < HINIC_MAX_CMDQ_TYPES; cmdq_type++) {
810
+ cmdqs->cmdq[cmdq_type].hwdev = hwdev;
819811 err = init_cmdq(&cmdqs->cmdq[cmdq_type],
820812 &cmdqs->saved_wqs[cmdq_type], cmdq_type,
821813 db_area[cmdq_type]);
....@@ -858,6 +850,25 @@
858850 return err;
859851 }
860852
853
+static int hinic_set_cmdq_depth(struct hinic_hwdev *hwdev, u16 cmdq_depth)
854
+{
855
+ struct hinic_cmd_hw_ioctxt hw_ioctxt = { 0 };
856
+ struct hinic_pfhwdev *pfhwdev;
857
+
858
+ pfhwdev = container_of(hwdev, struct hinic_pfhwdev, hwdev);
859
+
860
+ hw_ioctxt.func_idx = HINIC_HWIF_FUNC_IDX(hwdev->hwif);
861
+ hw_ioctxt.ppf_idx = HINIC_HWIF_PPF_IDX(hwdev->hwif);
862
+
863
+ hw_ioctxt.set_cmdq_depth = HW_IOCTXT_SET_CMDQ_DEPTH_ENABLE;
864
+ hw_ioctxt.cmdq_depth = (u8)ilog2(cmdq_depth);
865
+
866
+ return hinic_msg_to_mgmt(&pfhwdev->pf_to_mgmt, HINIC_MOD_COMM,
867
+ HINIC_COMM_CMD_HWCTXT_SET,
868
+ &hw_ioctxt, sizeof(hw_ioctxt), NULL,
869
+ NULL, HINIC_MGMT_MSG_SYNC);
870
+}
871
+
861872 /**
862873 * hinic_init_cmdqs - init all cmdqs
863874 * @cmdqs: cmdqs to init
....@@ -872,7 +883,6 @@
872883 struct hinic_func_to_io *func_to_io = cmdqs_to_func_to_io(cmdqs);
873884 struct pci_dev *pdev = hwif->pdev;
874885 struct hinic_hwdev *hwdev;
875
- size_t saved_wqs_size;
876886 u16 max_wqe_size;
877887 int err;
878888
....@@ -883,8 +893,8 @@
883893 if (!cmdqs->cmdq_buf_pool)
884894 return -ENOMEM;
885895
886
- saved_wqs_size = HINIC_MAX_CMDQ_TYPES * sizeof(struct hinic_wq);
887
- cmdqs->saved_wqs = devm_kzalloc(&pdev->dev, saved_wqs_size, GFP_KERNEL);
896
+ cmdqs->saved_wqs = devm_kcalloc(&pdev->dev, HINIC_MAX_CMDQ_TYPES,
897
+ sizeof(*cmdqs->saved_wqs), GFP_KERNEL);
888898 if (!cmdqs->saved_wqs) {
889899 err = -ENOMEM;
890900 goto err_saved_wqs;
....@@ -908,8 +918,18 @@
908918
909919 hinic_ceq_register_cb(&func_to_io->ceqs, HINIC_CEQ_CMDQ, cmdqs,
910920 cmdq_ceq_handler);
921
+
922
+ err = hinic_set_cmdq_depth(hwdev, CMDQ_DEPTH);
923
+ if (err) {
924
+ dev_err(&hwif->pdev->dev, "Failed to set cmdq depth\n");
925
+ goto err_set_cmdq_depth;
926
+ }
927
+
911928 return 0;
912929
930
+err_set_cmdq_depth:
931
+ hinic_ceq_unregister_cb(&func_to_io->ceqs, HINIC_CEQ_CMDQ);
932
+ free_cmdq(&cmdqs->cmdq[HINIC_CMDQ_SYNC]);
913933 err_cmdq_ctxt:
914934 hinic_wqs_cmdq_free(&cmdqs->cmdq_pages, cmdqs->saved_wqs,
915935 HINIC_MAX_CMDQ_TYPES);