Commit d8b7f8f2 authored by Weili Qian's avatar Weili Qian Committed by Zheng Zengkai
Browse files

crypto: hisilicon/qm - add functions for releasing resources

mainline inclusion
from mainline-master
commit bf081d6f
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5MK7S
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bf081d6fa8e9



----------------------------------------------------------------------

The resources allocated by hisi_qm_memory_init() are released by
hisi_qm_uninit(). Add hisi_qm_memory_uninit() to release resources,
no functional change.

Signed-off-by: default avatarWeili Qian <qianweili@huawei.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>

conficts:
	drivers/crypto/hisilicon/qm.c

Signed-off-by: default avatarJiangshui Yang <yangjiangshui@h-partners.com>
Reviewed-by: default avatarXiu Jianfeng <xiujianfeng@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 07e594c8
Loading
Loading
Loading
Loading
+34 −30
Original line number Diff line number Diff line
@@ -3585,24 +3585,6 @@ static int hisi_qp_memory_init(struct hisi_qm *qm, size_t dma_size, int id)
	return 0;
}

static void hisi_qm_set_state(struct hisi_qm *qm, enum vf_state state)
{
	/* set vf driver state */
	if (qm->ver > QM_HW_V2)
		writel(state, qm->io_base + QM_VF_STATE);
}

static void qm_last_regs_uninit(struct hisi_qm *qm)
{
	struct qm_debug *debug = &qm->debug;

	if (qm->fun_type == QM_HW_VF || !debug->qm_last_words)
		return;

	kfree(debug->qm_last_words);
	debug->qm_last_words = NULL;
}

static void hisi_qm_pre_init(struct hisi_qm *qm)
{
	struct pci_dev *pdev = qm->pdev;
@@ -3673,6 +3655,39 @@ static void hisi_qm_pci_uninit(struct hisi_qm *qm)
	pci_disable_device(pdev);
}

static void hisi_qm_set_state(struct hisi_qm *qm, enum vf_state state)
{
	/* set vf driver state */
	if (qm->ver > QM_HW_V2)
		writel(state, qm->io_base + QM_VF_STATE);
}

static void qm_last_regs_uninit(struct hisi_qm *qm)
{
	struct qm_debug *debug = &qm->debug;

	if (qm->fun_type == QM_HW_VF || !debug->qm_last_words)
		return;

	kfree(debug->qm_last_words);
	debug->qm_last_words = NULL;
}

static void hisi_qm_memory_uninit(struct hisi_qm *qm)
{
	struct device *dev = &qm->pdev->dev;

	hisi_qp_memory_uninit(qm, qm->qp_num);
	if (qm->qdma.va) {
		hisi_qm_cache_wb(qm);
		dma_free_coherent(dev, qm->qdma.size,
					qm->qdma.va, qm->qdma.dma);
	}

	idr_destroy(&qm->qp_idr);
	kfree(qm->factor);
}

/**
 * hisi_qm_uninit() - Uninitialize qm.
 * @qm: The qm needed uninit.
@@ -3681,13 +3696,9 @@ static void hisi_qm_pci_uninit(struct hisi_qm *qm)
 */
void hisi_qm_uninit(struct hisi_qm *qm)
{
	struct pci_dev *pdev = qm->pdev;
	struct device *dev = &pdev->dev;

	qm_last_regs_uninit(qm);

	qm_cmd_uninit(qm);
	kfree(qm->factor);
	down_write(&qm->qps_lock);

	if (!qm_avail_state(qm, QM_CLOSE)) {
@@ -3695,14 +3706,7 @@ void hisi_qm_uninit(struct hisi_qm *qm)
		return;
	}

	hisi_qp_memory_uninit(qm, qm->qp_num);
	idr_destroy(&qm->qp_idr);

	if (qm->qdma.va) {
		hisi_qm_cache_wb(qm);
		dma_free_coherent(dev, qm->qdma.size,
				  qm->qdma.va, qm->qdma.dma);
	}
	hisi_qm_memory_uninit(qm);
	hisi_qm_set_state(qm, VF_NOT_READY);
	up_write(&qm->qps_lock);