Skip to content

Commit 58ca006

Browse files
Weili Qianherbertx
authored andcommitted
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 <[email protected]> Signed-off-by: Shukun Tan <[email protected]> Reviewed-by: Zhou Wang <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent d1c72f6 commit 58ca006

File tree

5 files changed

+39
-112
lines changed

5 files changed

+39
-112
lines changed

drivers/crypto/hisilicon/hpre/hpre_main.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -717,19 +717,13 @@ static void hpre_debugfs_exit(struct hpre *hpre)
717717

718718
static int hpre_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
719719
{
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) {
727721
pci_warn(pdev, "HPRE version 1 is not supported!\n");
728722
return -EINVAL;
729723
}
730724

731725
qm->pdev = pdev;
732-
qm->ver = rev_id;
726+
qm->ver = pdev->revision;
733727
qm->sqe_size = HPRE_SQE_SIZE;
734728
qm->dev_name = hpre_name;
735729

drivers/crypto/hisilicon/qm.c

Lines changed: 28 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -737,13 +737,14 @@ static void qm_irq_unregister(struct hisi_qm *qm)
737737

738738
free_irq(pci_irq_vector(pdev, QM_EQ_EVENT_IRQ_VECTOR), qm);
739739

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;
742742

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);
747748
}
748749

749750
static void qm_init_qp_status(struct hisi_qp *qp)
@@ -764,36 +765,26 @@ static void qm_vft_data_cfg(struct hisi_qm *qm, enum vft_type type, u32 base,
764765
if (number > 0) {
765766
switch (type) {
766767
case SQC_VFT:
767-
switch (qm->ver) {
768-
case QM_HW_V1:
768+
if (qm->ver == QM_HW_V1) {
769769
tmp = QM_SQC_VFT_BUF_SIZE |
770770
QM_SQC_VFT_SQC_SIZE |
771771
QM_SQC_VFT_INDEX_NUMBER |
772772
QM_SQC_VFT_VALID |
773773
(u64)base << QM_SQC_VFT_START_SQN_SHIFT;
774-
break;
775-
case QM_HW_V2:
774+
} else {
776775
tmp = (u64)base << QM_SQC_VFT_START_SQN_SHIFT |
777776
QM_SQC_VFT_VALID |
778777
(u64)(number - 1) << QM_SQC_VFT_SQN_SHIFT;
779-
break;
780-
case QM_HW_UNKNOWN:
781-
break;
782778
}
783779
break;
784780
case CQC_VFT:
785-
switch (qm->ver) {
786-
case QM_HW_V1:
781+
if (qm->ver == QM_HW_V1) {
787782
tmp = QM_CQC_VFT_BUF_SIZE |
788783
QM_CQC_VFT_SQC_SIZE |
789784
QM_CQC_VFT_INDEX_NUMBER |
790785
QM_CQC_VFT_VALID;
791-
break;
792-
case QM_HW_V2:
786+
} else {
793787
tmp = QM_CQC_VFT_VALID;
794-
break;
795-
case QM_HW_UNKNOWN:
796-
break;
797788
}
798789
break;
799790
}
@@ -1777,7 +1768,7 @@ static int qm_qp_ctx_cfg(struct hisi_qp *qp, int qp_id, int pasid)
17771768
if (ver == QM_HW_V1) {
17781769
sqc->dw3 = cpu_to_le32(QM_MK_SQC_DW3_V1(0, 0, 0, qm->sqe_size));
17791770
sqc->w8 = cpu_to_le16(QM_Q_DEPTH - 1);
1780-
} else if (ver == QM_HW_V2) {
1771+
} else {
17811772
sqc->dw3 = cpu_to_le32(QM_MK_SQC_DW3_V2(qm->sqe_size));
17821773
sqc->w8 = 0; /* rand_qc */
17831774
}
@@ -1804,7 +1795,7 @@ static int qm_qp_ctx_cfg(struct hisi_qp *qp, int qp_id, int pasid)
18041795
if (ver == QM_HW_V1) {
18051796
cqc->dw3 = cpu_to_le32(QM_MK_CQC_DW3_V1(0, 0, 0, 4));
18061797
cqc->w8 = cpu_to_le16(QM_Q_DEPTH - 1);
1807-
} else if (ver == QM_HW_V2) {
1798+
} else {
18081799
cqc->dw3 = cpu_to_le32(QM_MK_CQC_DW3_V2(4));
18091800
cqc->w8 = 0;
18101801
}
@@ -2020,12 +2011,13 @@ static void hisi_qm_cache_wb(struct hisi_qm *qm)
20202011
{
20212012
unsigned int val;
20222013

2023-
if (qm->ver == QM_HW_V2) {
2024-
writel(0x1, qm->io_base + QM_CACHE_WB_START);
2025-
if (readl_relaxed_poll_timeout(qm->io_base + QM_CACHE_WB_DONE,
2026-
val, val & BIT(0), 10, 1000))
2027-
dev_err(&qm->pdev->dev, "QM writeback sqc cache fail!\n");
2028-
}
2014+
if (qm->ver == QM_HW_V1)
2015+
return;
2016+
2017+
writel(0x1, qm->io_base + QM_CACHE_WB_START);
2018+
if (readl_relaxed_poll_timeout(qm->io_base + QM_CACHE_WB_DONE,
2019+
val, val & BIT(0), 10, 1000))
2020+
dev_err(&qm->pdev->dev, "QM writeback sqc cache fail!\n");
20292021
}
20302022

20312023
static void qm_qp_event_notifier(struct hisi_qp *qp)
@@ -2082,12 +2074,12 @@ static int hisi_qm_uacce_mmap(struct uacce_queue *q,
20822074

20832075
switch (qfr->type) {
20842076
case UACCE_QFRT_MMIO:
2085-
if (qm->ver == QM_HW_V2) {
2086-
if (sz > PAGE_SIZE * (QM_DOORBELL_PAGE_NR +
2087-
QM_DOORBELL_SQ_CQ_BASE_V2 / PAGE_SIZE))
2077+
if (qm->ver == QM_HW_V1) {
2078+
if (sz > PAGE_SIZE * QM_DOORBELL_PAGE_NR)
20882079
return -EINVAL;
20892080
} else {
2090-
if (sz > PAGE_SIZE * QM_DOORBELL_PAGE_NR)
2081+
if (sz > PAGE_SIZE * (QM_DOORBELL_PAGE_NR +
2082+
QM_DOORBELL_SQ_CQ_BASE_V2 / PAGE_SIZE))
20912083
return -EINVAL;
20922084
}
20932085

@@ -2342,16 +2334,10 @@ static void hisi_qm_pre_init(struct hisi_qm *qm)
23422334
{
23432335
struct pci_dev *pdev = qm->pdev;
23442336

2345-
switch (qm->ver) {
2346-
case QM_HW_V1:
2337+
if (qm->ver == QM_HW_V1)
23472338
qm->ops = &qm_hw_ops_v1;
2348-
break;
2349-
case QM_HW_V2:
2339+
else
23502340
qm->ops = &qm_hw_ops_v2;
2351-
break;
2352-
default:
2353-
return;
2354-
}
23552341

23562342
pci_set_drvdata(pdev, qm);
23572343
mutex_init(&qm->mailbox_lock);
@@ -2859,25 +2845,6 @@ static enum acc_err_result qm_hw_error_handle(struct hisi_qm *qm)
28592845
return qm->ops->hw_error_handle(qm);
28602846
}
28612847

2862-
/**
2863-
* hisi_qm_get_hw_version() - Get hardware version of a qm.
2864-
* @pdev: The device which hardware version we want to get.
2865-
*
2866-
* This function gets the hardware version of a qm. Return QM_HW_UNKNOWN
2867-
* if the hardware version is not supported.
2868-
*/
2869-
enum qm_hw_ver hisi_qm_get_hw_version(struct pci_dev *pdev)
2870-
{
2871-
switch (pdev->revision) {
2872-
case QM_HW_V1:
2873-
case QM_HW_V2:
2874-
return pdev->revision;
2875-
default:
2876-
return QM_HW_UNKNOWN;
2877-
}
2878-
}
2879-
EXPORT_SYMBOL_GPL(hisi_qm_get_hw_version);
2880-
28812848
/**
28822849
* hisi_qm_dev_err_init() - Initialize device error configuration.
28832850
* @qm: The qm for which we want to do error initialization.
@@ -3846,7 +3813,7 @@ static int qm_irq_register(struct hisi_qm *qm)
38463813
if (ret)
38473814
return ret;
38483815

3849-
if (qm->ver == QM_HW_V2) {
3816+
if (qm->ver != QM_HW_V1) {
38503817
ret = request_irq(pci_irq_vector(pdev, QM_AEQ_EVENT_IRQ_VECTOR),
38513818
qm_aeq_irq, IRQF_SHARED, qm->dev_name, qm);
38523819
if (ret)
@@ -3942,7 +3909,7 @@ int hisi_qm_init(struct hisi_qm *qm)
39423909
if (ret)
39433910
goto err_free_irq_vectors;
39443911

3945-
if (qm->fun_type == QM_HW_VF && qm->ver == QM_HW_V2) {
3912+
if (qm->fun_type == QM_HW_VF && qm->ver != QM_HW_V1) {
39463913
/* v2 starts to support get vft by mailbox */
39473914
ret = hisi_qm_get_vft(qm, &qm->qp_base, &qm->qp_num);
39483915
if (ret)

drivers/crypto/hisilicon/qm.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ enum qm_hw_ver {
108108
QM_HW_UNKNOWN = -1,
109109
QM_HW_V1 = 0x20,
110110
QM_HW_V2 = 0x21,
111+
QM_HW_V3 = 0x30,
111112
};
112113

113114
enum qm_fun_type {
@@ -287,7 +288,6 @@ static inline int q_num_set(const char *val, const struct kernel_param *kp,
287288
struct pci_dev *pdev = pci_get_device(PCI_VENDOR_ID_HUAWEI,
288289
device, NULL);
289290
u32 n, q_num;
290-
u8 rev_id;
291291
int ret;
292292

293293
if (!val)
@@ -298,17 +298,10 @@ static inline int q_num_set(const char *val, const struct kernel_param *kp,
298298
pr_info("No device found currently, suppose queue number is %d\n",
299299
q_num);
300300
} else {
301-
rev_id = pdev->revision;
302-
switch (rev_id) {
303-
case QM_HW_V1:
301+
if (pdev->revision == QM_HW_V1)
304302
q_num = QM_QNUM_V1;
305-
break;
306-
case QM_HW_V2:
303+
else
307304
q_num = QM_QNUM_V2;
308-
break;
309-
default:
310-
return -EINVAL;
311-
}
312305
}
313306

314307
ret = kstrtou32(val, 10, &n);

drivers/crypto/hisilicon/sec2/sec_main.c

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -728,18 +728,10 @@ static int sec_pf_probe_init(struct sec_dev *sec)
728728
struct hisi_qm *qm = &sec->qm;
729729
int ret;
730730

731-
switch (qm->ver) {
732-
case QM_HW_V1:
731+
if (qm->ver == QM_HW_V1)
733732
qm->ctrl_qp_num = SEC_QUEUE_NUM_V1;
734-
break;
735-
736-
case QM_HW_V2:
733+
else
737734
qm->ctrl_qp_num = SEC_QUEUE_NUM_V2;
738-
break;
739-
740-
default:
741-
return -EINVAL;
742-
}
743735

744736
qm->err_ini = &sec_err_ini;
745737

@@ -755,15 +747,10 @@ static int sec_pf_probe_init(struct sec_dev *sec)
755747

756748
static int sec_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
757749
{
758-
enum qm_hw_ver rev_id;
759750
int ret;
760751

761-
rev_id = hisi_qm_get_hw_version(pdev);
762-
if (rev_id == QM_HW_UNKNOWN)
763-
return -ENODEV;
764-
765752
qm->pdev = pdev;
766-
qm->ver = rev_id;
753+
qm->ver = pdev->revision;
767754
qm->sqe_size = SEC_SQE_SIZE;
768755
qm->dev_name = sec_name;
769756

drivers/crypto/hisilicon/zip/zip_main.c

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -719,18 +719,10 @@ static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip)
719719
hisi_zip->ctrl = ctrl;
720720
ctrl->hisi_zip = hisi_zip;
721721

722-
switch (qm->ver) {
723-
case QM_HW_V1:
722+
if (qm->ver == QM_HW_V1)
724723
qm->ctrl_qp_num = HZIP_QUEUE_NUM_V1;
725-
break;
726-
727-
case QM_HW_V2:
724+
else
728725
qm->ctrl_qp_num = HZIP_QUEUE_NUM_V2;
729-
break;
730-
731-
default:
732-
return -EINVAL;
733-
}
734726

735727
qm->err_ini = &hisi_zip_err_ini;
736728

@@ -743,14 +735,8 @@ static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip)
743735

744736
static int hisi_zip_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
745737
{
746-
enum qm_hw_ver rev_id;
747-
748-
rev_id = hisi_qm_get_hw_version(pdev);
749-
if (rev_id == QM_HW_UNKNOWN)
750-
return -EINVAL;
751-
752738
qm->pdev = pdev;
753-
qm->ver = rev_id;
739+
qm->ver = pdev->revision;
754740
qm->algs = "zlib\ngzip";
755741
qm->sqe_size = HZIP_SQE_SIZE;
756742
qm->dev_name = hisi_zip_name;

0 commit comments

Comments
 (0)