mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
video: rockchip: mpp: mask mmu irq before reg dump
Change-Id: I54c9b01296c7ae21e164dd8a2c3635b7eb4d2dd5 Signed-off-by: Chandler Chen <chandler.chen@rock-chips.com>
This commit is contained in:
@@ -445,6 +445,13 @@ static int mpp_iommu_handle(struct iommu_domain *iommu,
|
||||
{
|
||||
struct mpp_dev *mpp = (struct mpp_dev *)arg;
|
||||
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
* Until the pagefault task finish by hw timeout.
|
||||
*/
|
||||
if (mpp)
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
|
||||
dev_err(iommu_dev, "fault addr 0x%08lx status %x arg %p\n",
|
||||
iova, status, arg);
|
||||
|
||||
@@ -461,12 +468,6 @@ static int mpp_iommu_handle(struct iommu_domain *iommu,
|
||||
else
|
||||
mpp_task_dump_hw_reg(mpp);
|
||||
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
* Until the pagefault task finish by hw timeout.
|
||||
*/
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -966,6 +966,14 @@ static int rkvdec2_link_iommu_fault_handle(struct iommu_domain *iommu,
|
||||
struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
|
||||
struct mpp_task *mpp_task = NULL, *n;
|
||||
struct mpp_taskqueue *queue;
|
||||
u32 dump_mem_region = 0;
|
||||
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
* Until the pagefault task finish by hw timeout.
|
||||
*/
|
||||
if (mpp)
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
|
||||
dev_err(iommu_dev, "fault addr 0x%08lx status %x arg %p\n",
|
||||
iova, status, arg);
|
||||
@@ -982,17 +990,15 @@ static int rkvdec2_link_iommu_fault_handle(struct iommu_domain *iommu,
|
||||
u32 irq_status = tb_reg[info->tb_reg_int];
|
||||
|
||||
if (!irq_status) {
|
||||
mpp_task_dump_mem_region(mpp, mpp_task);
|
||||
dump_mem_region = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dump_mem_region)
|
||||
mpp_task_dump_mem_region(mpp, mpp_task);
|
||||
mpp_task_dump_hw_reg(mpp);
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
* Until the pagefault task finish by hw timeout.
|
||||
*/
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
|
||||
dec->mmu_fault = 1;
|
||||
|
||||
return 0;
|
||||
@@ -1791,15 +1797,15 @@ int rkvdec2_soft_ccu_iommu_fault_handle(struct iommu_domain *iommu,
|
||||
dev_err(iommu_dev, "iommu fault, but no dev match\n");
|
||||
return 0;
|
||||
}
|
||||
mpp_task = mpp->cur_task;
|
||||
if (mpp_task)
|
||||
mpp_task_dump_mem_region(mpp, mpp_task);
|
||||
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
* Until the pagefault task finish by hw timeout.
|
||||
*/
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
mpp_task = mpp->cur_task;
|
||||
if (mpp_task)
|
||||
mpp_task_dump_mem_region(mpp, mpp_task);
|
||||
|
||||
atomic_inc(&mpp->queue->reset_request);
|
||||
kthread_queue_work(&mpp->queue->worker, &mpp->work);
|
||||
|
||||
|
||||
@@ -2729,12 +2729,6 @@ static int rkvenc2_iommu_fault_handle(struct iommu_domain *iommu,
|
||||
}
|
||||
}
|
||||
}
|
||||
mpp_task = mpp->cur_task;
|
||||
dev_info(mpp->dev, "core %d page fault found dchs %08x\n",
|
||||
mpp->core_id, mpp_read_relaxed(&enc->mpp, DCHS_REG_OFFSET));
|
||||
|
||||
if (mpp_task)
|
||||
mpp_task_dump_mem_region(mpp, mpp_task);
|
||||
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
@@ -2742,6 +2736,13 @@ static int rkvenc2_iommu_fault_handle(struct iommu_domain *iommu,
|
||||
*/
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
|
||||
mpp_task = mpp->cur_task;
|
||||
dev_info(mpp->dev, "core %d page fault found dchs %08x\n",
|
||||
mpp->core_id, mpp_read_relaxed(&enc->mpp, DCHS_REG_OFFSET));
|
||||
|
||||
if (mpp_task)
|
||||
mpp_task_dump_mem_region(mpp, mpp_task);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -891,9 +891,6 @@ static int vepu2_iommu_fault_handle(struct iommu_domain *iommu, struct device *i
|
||||
struct vepu_dev *enc = to_vepu_dev(mpp);
|
||||
struct vepu_ccu *ccu = enc->ccu;
|
||||
|
||||
dev_err(iommu_dev, "fault addr 0x%08lx status %x arg %p\n",
|
||||
iova, status, arg);
|
||||
|
||||
if (ccu) {
|
||||
int i;
|
||||
struct mpp_dev *core;
|
||||
@@ -907,6 +904,16 @@ static int vepu2_iommu_fault_handle(struct iommu_domain *iommu, struct device *i
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
* Until the pagefault task finish by hw timeout.
|
||||
*/
|
||||
if (mpp)
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
|
||||
dev_err(iommu_dev, "fault addr 0x%08lx status %x arg %p\n",
|
||||
iova, status, arg);
|
||||
|
||||
if (!mpp) {
|
||||
dev_err(iommu_dev, "pagefault without device to handle\n");
|
||||
return 0;
|
||||
@@ -916,11 +923,6 @@ static int vepu2_iommu_fault_handle(struct iommu_domain *iommu, struct device *i
|
||||
mpp_task_dump_mem_region(mpp, mpp_task);
|
||||
|
||||
mpp_task_dump_hw_reg(mpp);
|
||||
/*
|
||||
* Mask iommu irq, in order for iommu not repeatedly trigger pagefault.
|
||||
* Until the pagefault task finish by hw timeout.
|
||||
*/
|
||||
rockchip_iommu_mask_irq(mpp->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user