mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
crypto: hisilicon - support runtime PM for accelerator device
Add runtime PM support for Kunpeng930 accelerator device. Signed-off-by: Weili Qian <qianweili@huawei.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/topology.h>
|
||||
#include <linux/uacce.h>
|
||||
@@ -584,9 +585,14 @@ static ssize_t sec_debug_read(struct file *filp, char __user *buf,
|
||||
{
|
||||
struct sec_debug_file *file = filp->private_data;
|
||||
char tbuf[SEC_DBGFS_VAL_MAX_LEN];
|
||||
struct hisi_qm *qm = file->qm;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
ret = hisi_qm_get_dfx_access(qm);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
spin_lock_irq(&file->lock);
|
||||
|
||||
switch (file->index) {
|
||||
@@ -594,14 +600,19 @@ static ssize_t sec_debug_read(struct file *filp, char __user *buf,
|
||||
val = sec_clear_enable_read(file);
|
||||
break;
|
||||
default:
|
||||
spin_unlock_irq(&file->lock);
|
||||
return -EINVAL;
|
||||
goto err_input;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&file->lock);
|
||||
ret = snprintf(tbuf, SEC_DBGFS_VAL_MAX_LEN, "%u\n", val);
|
||||
|
||||
hisi_qm_put_dfx_access(qm);
|
||||
ret = snprintf(tbuf, SEC_DBGFS_VAL_MAX_LEN, "%u\n", val);
|
||||
return simple_read_from_buffer(buf, count, pos, tbuf, ret);
|
||||
|
||||
err_input:
|
||||
spin_unlock_irq(&file->lock);
|
||||
hisi_qm_put_dfx_access(qm);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static ssize_t sec_debug_write(struct file *filp, const char __user *buf,
|
||||
@@ -609,6 +620,7 @@ static ssize_t sec_debug_write(struct file *filp, const char __user *buf,
|
||||
{
|
||||
struct sec_debug_file *file = filp->private_data;
|
||||
char tbuf[SEC_DBGFS_VAL_MAX_LEN];
|
||||
struct hisi_qm *qm = file->qm;
|
||||
unsigned long val;
|
||||
int len, ret;
|
||||
|
||||
@@ -627,6 +639,10 @@ static ssize_t sec_debug_write(struct file *filp, const char __user *buf,
|
||||
if (kstrtoul(tbuf, 0, &val))
|
||||
return -EFAULT;
|
||||
|
||||
ret = hisi_qm_get_dfx_access(qm);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
spin_lock_irq(&file->lock);
|
||||
|
||||
switch (file->index) {
|
||||
@@ -640,12 +656,11 @@ static ssize_t sec_debug_write(struct file *filp, const char __user *buf,
|
||||
goto err_input;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&file->lock);
|
||||
|
||||
return count;
|
||||
ret = count;
|
||||
|
||||
err_input:
|
||||
spin_unlock_irq(&file->lock);
|
||||
hisi_qm_put_dfx_access(qm);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -703,6 +718,7 @@ static int sec_core_debug_init(struct hisi_qm *qm)
|
||||
regset->regs = sec_dfx_regs;
|
||||
regset->nregs = ARRAY_SIZE(sec_dfx_regs);
|
||||
regset->base = qm->io_base;
|
||||
regset->dev = dev;
|
||||
|
||||
if (qm->pdev->device == SEC_PF_PCI_DEVICE_ID)
|
||||
debugfs_create_file("regs", 0444, tmp_d, regset, &sec_regs_fops);
|
||||
@@ -1013,6 +1029,8 @@ static int sec_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
goto err_alg_unregister;
|
||||
}
|
||||
|
||||
hisi_qm_pm_init(qm);
|
||||
|
||||
return 0;
|
||||
|
||||
err_alg_unregister:
|
||||
@@ -1032,6 +1050,7 @@ static void sec_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct hisi_qm *qm = pci_get_drvdata(pdev);
|
||||
|
||||
hisi_qm_pm_uninit(qm);
|
||||
hisi_qm_wait_task_finish(qm, &sec_devices);
|
||||
if (qm->qp_num >= ctx_q_num)
|
||||
hisi_qm_alg_unregister(qm, &sec_devices);
|
||||
@@ -1051,6 +1070,10 @@ static void sec_remove(struct pci_dev *pdev)
|
||||
sec_qm_uninit(qm);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops sec_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(hisi_qm_suspend, hisi_qm_resume, NULL)
|
||||
};
|
||||
|
||||
static const struct pci_error_handlers sec_err_handler = {
|
||||
.error_detected = hisi_qm_dev_err_detected,
|
||||
.slot_reset = hisi_qm_dev_slot_reset,
|
||||
@@ -1066,6 +1089,7 @@ static struct pci_driver sec_pci_driver = {
|
||||
.err_handler = &sec_err_handler,
|
||||
.sriov_configure = hisi_qm_sriov_configure,
|
||||
.shutdown = hisi_qm_dev_shutdown,
|
||||
.driver.pm = &sec_pm_ops,
|
||||
};
|
||||
|
||||
static void sec_register_debugfs(void)
|
||||
|
||||
Reference in New Issue
Block a user