Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: hisilicon - fix driver compatibility issue with different versions of devices

In order to be compatible with devices of different versions, V1 in the
accelerator driver is now isolated, and other versions are the previous
V2 processing flow.

Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Shukun Tan <tanshukun1@huawei.com>
Reviewed-by: Zhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Weili Qian and committed by
Herbert Xu
58ca0060 d1c72f6e

+39 -112
+2 -8
drivers/crypto/hisilicon/hpre/hpre_main.c
··· 717 717 718 718 static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) 719 719 { 720 - enum qm_hw_ver rev_id; 721 - 722 - rev_id = hisi_qm_get_hw_version(pdev); 723 - if (rev_id < 0) 724 - return -ENODEV; 725 - 726 - if (rev_id == QM_HW_V1) { 720 + if (pdev->revision == QM_HW_V1) { 727 721 pci_warn(pdev, "HPRE version 1 is not supported!\n"); 728 722 return -EINVAL; 729 723 } 730 724 731 725 qm->pdev = pdev; 732 - qm->ver = rev_id; 726 + qm->ver = pdev->revision; 733 727 qm->sqe_size = HPRE_SQE_SIZE; 734 728 qm->dev_name = hpre_name; 735 729
+28 -61
drivers/crypto/hisilicon/qm.c
··· 737 737 738 738 free_irq(pci_irq_vector(pdev, QM_EQ_EVENT_IRQ_VECTOR), qm); 739 739 740 - if (qm->ver == QM_HW_V2) { 741 - free_irq(pci_irq_vector(pdev, QM_AEQ_EVENT_IRQ_VECTOR), qm); 740 + if (qm->ver == QM_HW_V1) 741 + return; 742 742 743 - if (qm->fun_type == QM_HW_PF) 744 - free_irq(pci_irq_vector(pdev, 745 - QM_ABNORMAL_EVENT_IRQ_VECTOR), qm); 746 - } 743 + free_irq(pci_irq_vector(pdev, QM_AEQ_EVENT_IRQ_VECTOR), qm); 744 + 745 + if (qm->fun_type == QM_HW_PF) 746 + free_irq(pci_irq_vector(pdev, 747 + QM_ABNORMAL_EVENT_IRQ_VECTOR), qm); 747 748 } 748 749 749 750 static void qm_init_qp_status(struct hisi_qp *qp) ··· 765 764 if (number > 0) { 766 765 switch (type) { 767 766 case SQC_VFT: 768 - switch (qm->ver) { 769 - case QM_HW_V1: 767 + if (qm->ver == QM_HW_V1) { 770 768 tmp = QM_SQC_VFT_BUF_SIZE | 771 769 QM_SQC_VFT_SQC_SIZE | 772 770 QM_SQC_VFT_INDEX_NUMBER | 773 771 QM_SQC_VFT_VALID | 774 772 (u64)base << QM_SQC_VFT_START_SQN_SHIFT; 775 - break; 776 - case QM_HW_V2: 773 + } else { 777 774 tmp = (u64)base << QM_SQC_VFT_START_SQN_SHIFT | 778 775 QM_SQC_VFT_VALID | 779 776 (u64)(number - 1) << QM_SQC_VFT_SQN_SHIFT; 780 - break; 781 - case QM_HW_UNKNOWN: 782 - break; 783 777 } 784 778 break; 785 779 case CQC_VFT: 786 - switch (qm->ver) { 787 - case QM_HW_V1: 780 + if (qm->ver == QM_HW_V1) { 788 781 tmp = QM_CQC_VFT_BUF_SIZE | 789 782 QM_CQC_VFT_SQC_SIZE | 790 783 QM_CQC_VFT_INDEX_NUMBER | 791 784 QM_CQC_VFT_VALID; 792 - break; 793 - case QM_HW_V2: 785 + } else { 794 786 tmp = QM_CQC_VFT_VALID; 795 - break; 796 - case QM_HW_UNKNOWN: 797 - break; 798 787 } 799 788 break; 800 789 } ··· 1768 1777 if (ver == QM_HW_V1) { 1769 1778 sqc->dw3 = cpu_to_le32(QM_MK_SQC_DW3_V1(0, 0, 0, qm->sqe_size)); 1770 1779 sqc->w8 = cpu_to_le16(QM_Q_DEPTH - 1); 1771 - } else if (ver == QM_HW_V2) { 1780 + } else { 1772 1781 sqc->dw3 = cpu_to_le32(QM_MK_SQC_DW3_V2(qm->sqe_size)); 1773 1782 sqc->w8 = 0; /* rand_qc */ 1774 1783 } ··· 1795 1804 if (ver == QM_HW_V1) { 1796 1805 cqc->dw3 = cpu_to_le32(QM_MK_CQC_DW3_V1(0, 0, 0, 4)); 1797 1806 cqc->w8 = cpu_to_le16(QM_Q_DEPTH - 1); 1798 - } else if (ver == QM_HW_V2) { 1807 + } else { 1799 1808 cqc->dw3 = cpu_to_le32(QM_MK_CQC_DW3_V2(4)); 1800 1809 cqc->w8 = 0; 1801 1810 } ··· 2011 2020 { 2012 2021 unsigned int val; 2013 2022 2014 - if (qm->ver == QM_HW_V2) { 2015 - writel(0x1, qm->io_base + QM_CACHE_WB_START); 2016 - if (readl_relaxed_poll_timeout(qm->io_base + QM_CACHE_WB_DONE, 2017 - val, val & BIT(0), 10, 1000)) 2018 - dev_err(&qm->pdev->dev, "QM writeback sqc cache fail!\n"); 2019 - } 2023 + if (qm->ver == QM_HW_V1) 2024 + return; 2025 + 2026 + writel(0x1, qm->io_base + QM_CACHE_WB_START); 2027 + if (readl_relaxed_poll_timeout(qm->io_base + QM_CACHE_WB_DONE, 2028 + val, val & BIT(0), 10, 1000)) 2029 + dev_err(&qm->pdev->dev, "QM writeback sqc cache fail!\n"); 2020 2030 } 2021 2031 2022 2032 static void qm_qp_event_notifier(struct hisi_qp *qp) ··· 2074 2082 2075 2083 switch (qfr->type) { 2076 2084 case UACCE_QFRT_MMIO: 2077 - if (qm->ver == QM_HW_V2) { 2078 - if (sz > PAGE_SIZE * (QM_DOORBELL_PAGE_NR + 2079 - QM_DOORBELL_SQ_CQ_BASE_V2 / PAGE_SIZE)) 2085 + if (qm->ver == QM_HW_V1) { 2086 + if (sz > PAGE_SIZE * QM_DOORBELL_PAGE_NR) 2080 2087 return -EINVAL; 2081 2088 } else { 2082 - if (sz > PAGE_SIZE * QM_DOORBELL_PAGE_NR) 2089 + if (sz > PAGE_SIZE * (QM_DOORBELL_PAGE_NR + 2090 + QM_DOORBELL_SQ_CQ_BASE_V2 / PAGE_SIZE)) 2083 2091 return -EINVAL; 2084 2092 } 2085 2093 ··· 2334 2342 { 2335 2343 struct pci_dev *pdev = qm->pdev; 2336 2344 2337 - switch (qm->ver) { 2338 - case QM_HW_V1: 2345 + if (qm->ver == QM_HW_V1) 2339 2346 qm->ops = &qm_hw_ops_v1; 2340 - break; 2341 - case QM_HW_V2: 2347 + else 2342 2348 qm->ops = &qm_hw_ops_v2; 2343 - break; 2344 - default: 2345 - return; 2346 - } 2347 2349 2348 2350 pci_set_drvdata(pdev, qm); 2349 2351 mutex_init(&qm->mailbox_lock); ··· 2844 2858 2845 2859 return qm->ops->hw_error_handle(qm); 2846 2860 } 2847 - 2848 - /** 2849 - * hisi_qm_get_hw_version() - Get hardware version of a qm. 2850 - * @pdev: The device which hardware version we want to get. 2851 - * 2852 - * This function gets the hardware version of a qm. Return QM_HW_UNKNOWN 2853 - * if the hardware version is not supported. 2854 - */ 2855 - enum qm_hw_ver hisi_qm_get_hw_version(struct pci_dev *pdev) 2856 - { 2857 - switch (pdev->revision) { 2858 - case QM_HW_V1: 2859 - case QM_HW_V2: 2860 - return pdev->revision; 2861 - default: 2862 - return QM_HW_UNKNOWN; 2863 - } 2864 - } 2865 - EXPORT_SYMBOL_GPL(hisi_qm_get_hw_version); 2866 2861 2867 2862 /** 2868 2863 * hisi_qm_dev_err_init() - Initialize device error configuration. ··· 3813 3846 if (ret) 3814 3847 return ret; 3815 3848 3816 - if (qm->ver == QM_HW_V2) { 3849 + if (qm->ver != QM_HW_V1) { 3817 3850 ret = request_irq(pci_irq_vector(pdev, QM_AEQ_EVENT_IRQ_VECTOR), 3818 3851 qm_aeq_irq, IRQF_SHARED, qm->dev_name, qm); 3819 3852 if (ret) ··· 3909 3942 if (ret) 3910 3943 goto err_free_irq_vectors; 3911 3944 3912 - if (qm->fun_type == QM_HW_VF && qm->ver == QM_HW_V2) { 3945 + if (qm->fun_type == QM_HW_VF && qm->ver != QM_HW_V1) { 3913 3946 /* v2 starts to support get vft by mailbox */ 3914 3947 ret = hisi_qm_get_vft(qm, &qm->qp_base, &qm->qp_num); 3915 3948 if (ret)
+3 -10
drivers/crypto/hisilicon/qm.h
··· 108 108 QM_HW_UNKNOWN = -1, 109 109 QM_HW_V1 = 0x20, 110 110 QM_HW_V2 = 0x21, 111 + QM_HW_V3 = 0x30, 111 112 }; 112 113 113 114 enum qm_fun_type { ··· 288 287 struct pci_dev *pdev = pci_get_device(PCI_VENDOR_ID_HUAWEI, 289 288 device, NULL); 290 289 u32 n, q_num; 291 - u8 rev_id; 292 290 int ret; 293 291 294 292 if (!val) ··· 298 298 pr_info("No device found currently, suppose queue number is %d\n", 299 299 q_num); 300 300 } else { 301 - rev_id = pdev->revision; 302 - switch (rev_id) { 303 - case QM_HW_V1: 301 + if (pdev->revision == QM_HW_V1) 304 302 q_num = QM_QNUM_V1; 305 - break; 306 - case QM_HW_V2: 303 + else 307 304 q_num = QM_QNUM_V2; 308 - break; 309 - default: 310 - return -EINVAL; 311 - } 312 305 } 313 306 314 307 ret = kstrtou32(val, 10, &n);
+3 -16
drivers/crypto/hisilicon/sec2/sec_main.c
··· 728 728 struct hisi_qm *qm = &sec->qm; 729 729 int ret; 730 730 731 - switch (qm->ver) { 732 - case QM_HW_V1: 731 + if (qm->ver == QM_HW_V1) 733 732 qm->ctrl_qp_num = SEC_QUEUE_NUM_V1; 734 - break; 735 - 736 - case QM_HW_V2: 733 + else 737 734 qm->ctrl_qp_num = SEC_QUEUE_NUM_V2; 738 - break; 739 - 740 - default: 741 - return -EINVAL; 742 - } 743 735 744 736 qm->err_ini = &sec_err_ini; 745 737 ··· 747 755 748 756 static int sec_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) 749 757 { 750 - enum qm_hw_ver rev_id; 751 758 int ret; 752 759 753 - rev_id = hisi_qm_get_hw_version(pdev); 754 - if (rev_id == QM_HW_UNKNOWN) 755 - return -ENODEV; 756 - 757 760 qm->pdev = pdev; 758 - qm->ver = rev_id; 761 + qm->ver = pdev->revision; 759 762 qm->sqe_size = SEC_SQE_SIZE; 760 763 qm->dev_name = sec_name; 761 764
+3 -17
drivers/crypto/hisilicon/zip/zip_main.c
··· 719 719 hisi_zip->ctrl = ctrl; 720 720 ctrl->hisi_zip = hisi_zip; 721 721 722 - switch (qm->ver) { 723 - case QM_HW_V1: 722 + if (qm->ver == QM_HW_V1) 724 723 qm->ctrl_qp_num = HZIP_QUEUE_NUM_V1; 725 - break; 726 - 727 - case QM_HW_V2: 724 + else 728 725 qm->ctrl_qp_num = HZIP_QUEUE_NUM_V2; 729 - break; 730 - 731 - default: 732 - return -EINVAL; 733 - } 734 726 735 727 qm->err_ini = &hisi_zip_err_ini; 736 728 ··· 735 743 736 744 static int hisi_zip_qm_init(struct hisi_qm *qm, struct pci_dev *pdev) 737 745 { 738 - enum qm_hw_ver rev_id; 739 - 740 - rev_id = hisi_qm_get_hw_version(pdev); 741 - if (rev_id == QM_HW_UNKNOWN) 742 - return -EINVAL; 743 - 744 746 qm->pdev = pdev; 745 - qm->ver = rev_id; 747 + qm->ver = pdev->revision; 746 748 qm->algs = "zlib\ngzip"; 747 749 qm->sqe_size = HZIP_SQE_SIZE; 748 750 qm->dev_name = hisi_zip_name;