forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c
....@@ -1,7 +1,7 @@
11 // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
22 /*
33 *
4
- * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
4
+ * (C) COPYRIGHT 2019-2023 ARM Limited. All rights reserved.
55 *
66 * This program is free software and is provided to you under the terms of the
77 * GNU General Public License version 2 as published by the Free Software
....@@ -88,12 +88,11 @@
8888 * context's address space, when the page fault occurs for
8989 * MCU's address space.
9090 */
91
- if (!queue_work(as->pf_wq, &as->work_pagefault))
92
- kbase_ctx_sched_release_ctx(kctx);
93
- else {
91
+ if (!queue_work(as->pf_wq, &as->work_pagefault)) {
9492 dev_dbg(kbdev->dev,
95
- "Page fault is already pending for as %u\n",
96
- as_nr);
93
+ "Page fault is already pending for as %u", as_nr);
94
+ kbase_ctx_sched_release_ctx(kctx);
95
+ } else {
9796 atomic_inc(&kbdev->faults_pending);
9897 }
9998 }
....@@ -122,6 +121,8 @@
122121 access_type, kbase_gpu_access_type_name(fault->status),
123122 source_id);
124123
124
+ kbase_debug_csf_fault_notify(kbdev, NULL, DF_GPU_PAGE_FAULT);
125
+
125126 /* Report MMU fault for all address spaces (except MCU_AS_NR) */
126127 for (as_no = 1; as_no < kbdev->nr_hw_address_spaces; as_no++)
127128 submit_work_pagefault(kbdev, as_no, fault);
....@@ -130,6 +131,7 @@
130131 if (kbase_prepare_to_reset_gpu(kbdev,
131132 RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
132133 kbase_reset_gpu(kbdev);
134
+
133135 }
134136 KBASE_EXPORT_TEST_API(kbase_mmu_report_mcu_as_fault_and_reset);
135137
....@@ -148,17 +150,18 @@
148150 "true" : "false";
149151 int as_no = as->number;
150152 unsigned long flags;
153
+ const uintptr_t fault_addr = fault->addr;
151154
152155 /* terminal fault, print info about the fault */
153156 dev_err(kbdev->dev,
154
- "GPU bus fault in AS%d at VA 0x%016llX\n"
155
- "VA_VALID: %s\n"
157
+ "GPU bus fault in AS%d at PA %pK\n"
158
+ "PA_VALID: %s\n"
156159 "raw fault status: 0x%X\n"
157160 "exception type 0x%X: %s\n"
158161 "access type 0x%X: %s\n"
159162 "source id 0x%X\n"
160163 "pid: %d\n",
161
- as_no, fault->addr,
164
+ as_no, (void *)fault_addr,
162165 addr_valid,
163166 status,
164167 exception_type, kbase_gpu_exception_name(exception_type),
....@@ -187,6 +190,7 @@
187190 kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
188191 GPU_COMMAND_CLEAR_FAULT);
189192 spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
193
+
190194 }
191195
192196 /*
....@@ -248,6 +252,7 @@
248252 mutex_unlock(&kbdev->mmu_hw_mutex);
249253 /* AS transaction end */
250254
255
+ kbase_debug_csf_fault_notify(kbdev, kctx, DF_GPU_PAGE_FAULT);
251256 /* Switching to UNMAPPED mode above would have enabled the firmware to
252257 * recover from the fault (if the memory access was made by firmware)
253258 * and it can then respond to CSG termination requests to be sent now.
....@@ -261,6 +266,7 @@
261266 KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED);
262267 kbase_mmu_hw_enable_fault(kbdev, as,
263268 KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED);
269
+
264270 }
265271
266272 /**
....@@ -482,8 +488,6 @@
482488 kbase_csf_ctx_handle_fault(kctx, fault);
483489 kbase_ctx_sched_release_ctx_lock(kctx);
484490
485
- atomic_dec(&kbdev->faults_pending);
486
-
487491 /* A work for GPU fault is complete.
488492 * Till reaching here, no further GPU fault will be reported.
489493 * Now clear the GPU fault to allow next GPU fault interrupt report.
....@@ -492,6 +496,8 @@
492496 kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
493497 GPU_COMMAND_CLEAR_FAULT);
494498 spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
499
+
500
+ atomic_dec(&kbdev->faults_pending);
495501 }
496502
497503 /**
....@@ -546,14 +552,15 @@
546552 }
547553 KBASE_EXPORT_TEST_API(kbase_mmu_gpu_fault_interrupt);
548554
549
-int kbase_mmu_as_init(struct kbase_device *kbdev, int i)
555
+int kbase_mmu_as_init(struct kbase_device *kbdev, unsigned int i)
550556 {
551557 kbdev->as[i].number = i;
552558 kbdev->as[i].bf_data.addr = 0ULL;
553559 kbdev->as[i].pf_data.addr = 0ULL;
554560 kbdev->as[i].gf_data.addr = 0ULL;
561
+ kbdev->as[i].is_unresponsive = false;
555562
556
- kbdev->as[i].pf_wq = alloc_workqueue("mali_mmu%d", 0, 1, i);
563
+ kbdev->as[i].pf_wq = alloc_workqueue("mali_mmu%d", WQ_UNBOUND, 1, i);
557564 if (!kbdev->as[i].pf_wq)
558565 return -ENOMEM;
559566