提交 0068a2ec 编写于 作者: Z zhangwei 提交者: Xie XiuQi

ACC: add qm workqueue support

driver inclusion
category: bugfix
bugzilla: NA
CVE: NA

Feature or Bugfix:Feature
Signed-off-by: NZhangwei <zhangwei375@huawei.com>
Reviewed-by: Nhucheng.hu <hucheng.hu@huawei.com>
Signed-off-by: Nlingmingqiang <lingmingqiang@huawei.com>
Reviewed-by: Nlingmingqiang <lingmingqiang@huawei.com>
Reviewed-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 9a8b5a9e
...@@ -519,7 +519,15 @@ static void qm_poll_qp(struct hisi_qp *qp, struct hisi_qm *qm) ...@@ -519,7 +519,15 @@ static void qm_poll_qp(struct hisi_qp *qp, struct hisi_qm *qm)
} }
} }
static irqreturn_t qm_irq_thread(int irq, void *data) static void qp_work_process(struct work_struct *work)
{
struct hisi_qp *qp;
qp = container_of(work, struct hisi_qp, work);
qm_poll_qp(qp, qp->qm);
}
static irqreturn_t do_qm_irq(int irq, void *data)
{ {
struct hisi_qm *qm = data; struct hisi_qm *qm = data;
struct qm_eqe *eqe = qm->eqe + qm->status.eq_head; struct qm_eqe *eqe = qm->eqe + qm->status.eq_head;
...@@ -529,8 +537,12 @@ static irqreturn_t qm_irq_thread(int irq, void *data) ...@@ -529,8 +537,12 @@ static irqreturn_t qm_irq_thread(int irq, void *data)
while (QM_EQE_PHASE(eqe) == qm->status.eqc_phase) { while (QM_EQE_PHASE(eqe) == qm->status.eqc_phase) {
eqe_num++; eqe_num++;
qp = qm_to_hisi_qp(qm, eqe); qp = qm_to_hisi_qp(qm, eqe);
if (qp) if (qp) {
qm_poll_qp(qp, qm); if (qm->wq)
queue_work(qm->wq, &qp->work);
else
schedule_work(&qp->work);
}
if (qm->status.eq_head == QM_EQ_DEPTH - 1) { if (qm->status.eq_head == QM_EQ_DEPTH - 1) {
qm->status.eqc_phase = !qm->status.eqc_phase; qm->status.eqc_phase = !qm->status.eqc_phase;
...@@ -557,7 +569,7 @@ static irqreturn_t qm_irq(int irq, void *data) ...@@ -557,7 +569,7 @@ static irqreturn_t qm_irq(int irq, void *data)
struct hisi_qm *qm = data; struct hisi_qm *qm = data;
if (readl(qm->io_base + QM_VF_EQ_INT_SOURCE)) if (readl(qm->io_base + QM_VF_EQ_INT_SOURCE))
return IRQ_WAKE_THREAD; return do_qm_irq(irq, data);
dev_err(&qm->pdev->dev, "invalid int source\n"); dev_err(&qm->pdev->dev, "invalid int source\n");
qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0); qm_db(qm, 0, QM_DOORBELL_CMD_EQ, qm->status.eq_head, 0);
...@@ -604,6 +616,11 @@ static irqreturn_t qm_abnormal_irq(int irq, void *data) ...@@ -604,6 +616,11 @@ static irqreturn_t qm_abnormal_irq(int irq, void *data)
struct device *dev = &qm->pdev->dev; struct device *dev = &qm->pdev->dev;
u32 error_status, tmp; u32 error_status, tmp;
if (qm->abnormal_fix) {
qm->abnormal_fix(qm);
return IRQ_HANDLED;
}
/* read err sts */ /* read err sts */
tmp = readl(qm->io_base + QM_ABNORMAL_INT_STATUS); tmp = readl(qm->io_base + QM_ABNORMAL_INT_STATUS);
error_status = qm->msi_mask & tmp; error_status = qm->msi_mask & tmp;
...@@ -627,8 +644,8 @@ static int qm_irq_register(struct hisi_qm *qm) ...@@ -627,8 +644,8 @@ static int qm_irq_register(struct hisi_qm *qm)
struct pci_dev *pdev = qm->pdev; struct pci_dev *pdev = qm->pdev;
int ret; int ret;
ret = request_threaded_irq(pci_irq_vector(pdev, QM_EQ_EVENT_IRQ_VECTOR), ret = request_irq(pci_irq_vector(pdev, QM_EQ_EVENT_IRQ_VECTOR),
qm_irq, qm_irq_thread, IRQF_SHARED, qm_irq, IRQF_SHARED,
qm->dev_name, qm); qm->dev_name, qm);
if (ret) if (ret)
return ret; return ret;
...@@ -1172,6 +1189,7 @@ static struct hisi_qp *hisi_qm_create_qp_lockless(struct hisi_qm *qm, ...@@ -1172,6 +1189,7 @@ static struct hisi_qp *hisi_qm_create_qp_lockless(struct hisi_qm *qm,
qp->qp_id = qp_id; qp->qp_id = qp_id;
qp->alg_type = alg_type; qp->alg_type = alg_type;
qp->c_flag = 1; qp->c_flag = 1;
INIT_WORK(&qp->work, qp_work_process);
init_completion(&qp->completion); init_completion(&qp->completion);
atomic_set(&qp->qp_status.flags, QP_INIT); atomic_set(&qp->qp_status.flags, QP_INIT);
......
...@@ -280,6 +280,9 @@ struct hisi_qm { ...@@ -280,6 +280,9 @@ struct hisi_qm {
void *reserve; void *reserve;
dma_addr_t reserve_dma; dma_addr_t reserve_dma;
#endif #endif
struct workqueue_struct *wq;
/* design for module not support aer, such as rde */
int (*abnormal_fix)(struct hisi_qm *qm);
}; };
struct hisi_qp_status { struct hisi_qp_status {
...@@ -321,6 +324,7 @@ struct hisi_qp { ...@@ -321,6 +324,7 @@ struct hisi_qp {
u16 pasid; u16 pasid;
struct uacce_queue *uacce_q; struct uacce_queue *uacce_q;
#endif #endif
struct work_struct work;
}; };
int hisi_qm_init(struct hisi_qm *qm); int hisi_qm_init(struct hisi_qm *qm);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册