| From eb9d8ddbc107d02e489681f9dcbf93949e1a99a4 Mon Sep 17 00:00:00 2001 |
| From: Tomeu Vizoso <tomeu.vizoso@collabora.com> |
| Date: Wed, 12 Feb 2020 14:22:36 -0600 |
| Subject: drm/panfrost: Don't try to map on error faults |
| |
| From: Tomeu Vizoso <tomeu.vizoso@collabora.com> |
| |
| commit eb9d8ddbc107d02e489681f9dcbf93949e1a99a4 upstream. |
| |
| If the exception type isn't a translation fault, don't try to map and |
| instead go straight to a terminal fault. |
| |
| Otherwise, we can get flooded by kernel warnings and further faults. |
| |
| Fixes: 187d2929206e ("drm/panfrost: Add support for GPU heap allocations") |
| Signed-off-by: Rob Herring <robh@kernel.org> |
| Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> |
| Reviewed-by: Steven Price <steven.price@arm.com> |
| Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> |
| Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20200212202236.13095-1-robh@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/panfrost/panfrost_mmu.c | 44 +++++++++++++------------------- |
| 1 file changed, 19 insertions(+), 25 deletions(-) |
| |
| --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c |
| +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c |
| @@ -601,33 +601,27 @@ static irqreturn_t panfrost_mmu_irq_hand |
| source_id = (fault_status >> 16); |
| |
| /* Page fault only */ |
| - if ((status & mask) == BIT(i)) { |
| - WARN_ON(exception_type < 0xC1 || exception_type > 0xC4); |
| - |
| + ret = -1; |
| + if ((status & mask) == BIT(i) && (exception_type & 0xF8) == 0xC0) |
| ret = panfrost_mmu_map_fault_addr(pfdev, i, addr); |
| - if (!ret) { |
| - mmu_write(pfdev, MMU_INT_CLEAR, BIT(i)); |
| - status &= ~mask; |
| - continue; |
| - } |
| - } |
| |
| - /* terminal fault, print info about the fault */ |
| - dev_err(pfdev->dev, |
| - "Unhandled Page fault in AS%d at VA 0x%016llX\n" |
| - "Reason: %s\n" |
| - "raw fault status: 0x%X\n" |
| - "decoded fault status: %s\n" |
| - "exception type 0x%X: %s\n" |
| - "access type 0x%X: %s\n" |
| - "source id 0x%X\n", |
| - i, addr, |
| - "TODO", |
| - fault_status, |
| - (fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"), |
| - exception_type, panfrost_exception_name(pfdev, exception_type), |
| - access_type, access_type_name(pfdev, fault_status), |
| - source_id); |
| + if (ret) |
| + /* terminal fault, print info about the fault */ |
| + dev_err(pfdev->dev, |
| + "Unhandled Page fault in AS%d at VA 0x%016llX\n" |
| + "Reason: %s\n" |
| + "raw fault status: 0x%X\n" |
| + "decoded fault status: %s\n" |
| + "exception type 0x%X: %s\n" |
| + "access type 0x%X: %s\n" |
| + "source id 0x%X\n", |
| + i, addr, |
| + "TODO", |
| + fault_status, |
| + (fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"), |
| + exception_type, panfrost_exception_name(pfdev, exception_type), |
| + access_type, access_type_name(pfdev, fault_status), |
| + source_id); |
| |
| mmu_write(pfdev, MMU_INT_CLEAR, mask); |
| |