]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
crypto: hisilicon - re-enable address prefetch after device resuming
authorChenghai Huang <huangchenghai2@huawei.com>
Thu, 21 Aug 2025 01:38:05 +0000 (09:38 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 30 Aug 2025 07:43:26 +0000 (15:43 +0800)
When the device resumes from a suspended state, it will revert to its
initial state and requires re-enabling. Currently, the address prefetch
function is not re-enabled after device resuming. Move the address prefetch
enable to the initialization process. In this way, the address prefetch
can be enabled when the device resumes by calling the initialization
process.

Fixes: 607c191b371d ("crypto: hisilicon - support runtime PM for accelerator device")
Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/hpre/hpre_main.c
drivers/crypto/hisilicon/qm.c
drivers/crypto/hisilicon/sec2/sec_main.c
drivers/crypto/hisilicon/zip/zip_main.c

index f5b47e5ff48a4210bc34e2bfb3f389ff5bb5dc26..34f84978180f04b0549efc7b0c8f6acf7efe50f2 100644 (file)
@@ -721,6 +721,7 @@ static int hpre_set_user_domain_and_cache(struct hisi_qm *qm)
 
        /* Config data buffer pasid needed by Kunpeng 920 */
        hpre_config_pasid(qm);
+       hpre_open_sva_prefetch(qm);
 
        hpre_enable_clock_gate(qm);
 
@@ -1450,8 +1451,6 @@ static int hpre_pf_probe_init(struct hpre *hpre)
        if (ret)
                return ret;
 
-       hpre_open_sva_prefetch(qm);
-
        hisi_qm_dev_err_init(qm);
        ret = hpre_show_last_regs_init(qm);
        if (ret)
index 2e4ee7ecfdfbb695d2b61c51fade7dabd6c46333..a5cc0ccd94f1f25be1133e38c65d44c3568db412 100644 (file)
@@ -4447,9 +4447,6 @@ static void qm_restart_prepare(struct hisi_qm *qm)
 {
        u32 value;
 
-       if (qm->err_ini->open_sva_prefetch)
-               qm->err_ini->open_sva_prefetch(qm);
-
        if (qm->ver >= QM_HW_V3)
                return;
 
index 72cf48d1f3ab8690147afbae28dccd0509560d0b..ddb20f380b546bedfd771cdb091e761bd3439042 100644 (file)
@@ -464,6 +464,45 @@ static void sec_set_endian(struct hisi_qm *qm)
        writel_relaxed(reg, qm->io_base + SEC_CONTROL_REG);
 }
 
+static void sec_close_sva_prefetch(struct hisi_qm *qm)
+{
+       u32 val;
+       int ret;
+
+       if (!test_bit(QM_SUPPORT_SVA_PREFETCH, &qm->caps))
+               return;
+
+       val = readl_relaxed(qm->io_base + SEC_PREFETCH_CFG);
+       val |= SEC_PREFETCH_DISABLE;
+       writel(val, qm->io_base + SEC_PREFETCH_CFG);
+
+       ret = readl_relaxed_poll_timeout(qm->io_base + SEC_SVA_TRANS,
+                                        val, !(val & SEC_SVA_DISABLE_READY),
+                                        SEC_DELAY_10_US, SEC_POLL_TIMEOUT_US);
+       if (ret)
+               pci_err(qm->pdev, "failed to close sva prefetch\n");
+}
+
+static void sec_open_sva_prefetch(struct hisi_qm *qm)
+{
+       u32 val;
+       int ret;
+
+       if (!test_bit(QM_SUPPORT_SVA_PREFETCH, &qm->caps))
+               return;
+
+       /* Enable prefetch */
+       val = readl_relaxed(qm->io_base + SEC_PREFETCH_CFG);
+       val &= SEC_PREFETCH_ENABLE;
+       writel(val, qm->io_base + SEC_PREFETCH_CFG);
+
+       ret = readl_relaxed_poll_timeout(qm->io_base + SEC_PREFETCH_CFG,
+                                        val, !(val & SEC_PREFETCH_DISABLE),
+                                        SEC_DELAY_10_US, SEC_POLL_TIMEOUT_US);
+       if (ret)
+               pci_err(qm->pdev, "failed to open sva prefetch\n");
+}
+
 static void sec_engine_sva_config(struct hisi_qm *qm)
 {
        u32 reg;
@@ -497,45 +536,7 @@ static void sec_engine_sva_config(struct hisi_qm *qm)
                writel_relaxed(reg, qm->io_base +
                                SEC_INTERFACE_USER_CTRL1_REG);
        }
-}
-
-static void sec_open_sva_prefetch(struct hisi_qm *qm)
-{
-       u32 val;
-       int ret;
-
-       if (!test_bit(QM_SUPPORT_SVA_PREFETCH, &qm->caps))
-               return;
-
-       /* Enable prefetch */
-       val = readl_relaxed(qm->io_base + SEC_PREFETCH_CFG);
-       val &= SEC_PREFETCH_ENABLE;
-       writel(val, qm->io_base + SEC_PREFETCH_CFG);
-
-       ret = readl_relaxed_poll_timeout(qm->io_base + SEC_PREFETCH_CFG,
-                                        val, !(val & SEC_PREFETCH_DISABLE),
-                                        SEC_DELAY_10_US, SEC_POLL_TIMEOUT_US);
-       if (ret)
-               pci_err(qm->pdev, "failed to open sva prefetch\n");
-}
-
-static void sec_close_sva_prefetch(struct hisi_qm *qm)
-{
-       u32 val;
-       int ret;
-
-       if (!test_bit(QM_SUPPORT_SVA_PREFETCH, &qm->caps))
-               return;
-
-       val = readl_relaxed(qm->io_base + SEC_PREFETCH_CFG);
-       val |= SEC_PREFETCH_DISABLE;
-       writel(val, qm->io_base + SEC_PREFETCH_CFG);
-
-       ret = readl_relaxed_poll_timeout(qm->io_base + SEC_SVA_TRANS,
-                                        val, !(val & SEC_SVA_DISABLE_READY),
-                                        SEC_DELAY_10_US, SEC_POLL_TIMEOUT_US);
-       if (ret)
-               pci_err(qm->pdev, "failed to close sva prefetch\n");
+       sec_open_sva_prefetch(qm);
 }
 
 static void sec_enable_clock_gate(struct hisi_qm *qm)
@@ -1152,7 +1153,6 @@ static int sec_pf_probe_init(struct sec_dev *sec)
        if (ret)
                return ret;
 
-       sec_open_sva_prefetch(qm);
        hisi_qm_dev_err_init(qm);
        sec_debug_regs_clear(qm);
        ret = sec_show_last_regs_init(qm);
index fb7b19927dd321872b65f70154837b90262e61be..480fa590664a88a350b0c4f1be40ac31d20c4317 100644 (file)
@@ -557,6 +557,7 @@ static int hisi_zip_set_user_domain_and_cache(struct hisi_qm *qm)
                writel(AXUSER_BASE, base + HZIP_DATA_WUSER_32_63);
                writel(AXUSER_BASE, base + HZIP_SGL_RUSER_32_63);
        }
+       hisi_zip_open_sva_prefetch(qm);
 
        /* let's open all compression/decompression cores */
 
@@ -572,6 +573,7 @@ static int hisi_zip_set_user_domain_and_cache(struct hisi_qm *qm)
               CQC_CACHE_WB_ENABLE | FIELD_PREP(SQC_CACHE_WB_THRD, 1) |
               FIELD_PREP(CQC_CACHE_WB_THRD, 1), base + QM_CACHE_CTL);
 
+       hisi_zip_set_high_perf(qm);
        hisi_zip_enable_clock_gate(qm);
 
        return hisi_dae_set_user_domain(qm);
@@ -1243,9 +1245,6 @@ static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip)
        if (ret)
                return ret;
 
-       hisi_zip_set_high_perf(qm);
-
-       hisi_zip_open_sva_prefetch(qm);
        hisi_qm_dev_err_init(qm);
        hisi_zip_debug_regs_clear(qm);