summaryrefslogtreecommitdiff
path: root/mali_kbase
diff options
context:
space:
mode:
Diffstat (limited to 'mali_kbase')
-rw-r--r--mali_kbase/backend/gpu/mali_kbase_pm_driver.c24
-rw-r--r--mali_kbase/csf/mali_kbase_csf_defs.h2
-rw-r--r--mali_kbase/csf/mali_kbase_csf_reset_gpu.c4
-rw-r--r--mali_kbase/mali_kbase_reset_gpu.h3
4 files changed, 32 insertions, 1 deletions
diff --git a/mali_kbase/backend/gpu/mali_kbase_pm_driver.c b/mali_kbase/backend/gpu/mali_kbase_pm_driver.c
index b046903..2bfc27a 100644
--- a/mali_kbase/backend/gpu/mali_kbase_pm_driver.c
+++ b/mali_kbase/backend/gpu/mali_kbase_pm_driver.c
@@ -2421,8 +2421,22 @@ static void kbase_pm_timed_out(struct kbase_device *kbdev)
dev_err(kbdev->dev, "Power transition timed out unexpectedly\n");
kbase_gpu_timeout_debug_message(kbdev);
dev_err(kbdev->dev, "Sending reset to GPU - all running jobs will be lost\n");
+
+ /* pixel: If either:
+ * 1. L2/MCU power transition timed out, or,
+ * 2. kbase state machine fell out of sync with the hw state,
+ * a soft/hard reset (ie writing to SOFT/HARD_RESET regs) is insufficient to resume
+ * operation.
+ *
+ * Besides, Odin TRM advises against touching SOFT/HARD_RESET
+ * regs if L2_PWRTRANS is 1 to avoid undefined state.
+ *
+ * We have already lost work if we end up here, so send a powercycle to reset the hw,
+ * which is more reliable.
+ */
if (kbase_prepare_to_reset_gpu(kbdev,
- RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
+ RESET_FLAGS_HWC_UNRECOVERABLE_ERROR |
+ RESET_FLAGS_FORCE_PM_HW_RESET))
kbase_reset_gpu(kbdev);
}
@@ -3179,6 +3193,14 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
struct kbasep_reset_timeout_data rtdata;
int ret;
+#if MALI_USE_CSF
+ if (kbdev->csf.reset.force_pm_hw_reset && kbdev->pm.backend.callback_hardware_reset) {
+ dev_err(kbdev->dev, "Power Cycle reset mali");
+ kbdev->csf.reset.force_pm_hw_reset = false;
+ return kbase_pm_hw_reset(kbdev);
+ }
+#endif
+
KBASE_KTRACE_ADD(kbdev, CORE_GPU_SOFT_RESET, NULL, 0);
KBASE_TLSTREAM_JD_GPU_SOFT_RESET(kbdev, kbdev);
diff --git a/mali_kbase/csf/mali_kbase_csf_defs.h b/mali_kbase/csf/mali_kbase_csf_defs.h
index af93fb3..520a41b 100644
--- a/mali_kbase/csf/mali_kbase_csf_defs.h
+++ b/mali_kbase/csf/mali_kbase_csf_defs.h
@@ -828,6 +828,7 @@ struct kbase_csf_context {
* mechanism to check for deadlocks involving reset waits.
* @state: Tracks if the GPU reset is in progress or not.
* The state is represented by enum @kbase_csf_reset_gpu_state.
+ * @force_pm_hw_reset: pixel: Powercycle the GPU instead of attempting a soft/hard reset.
*/
struct kbase_csf_reset_gpu {
struct workqueue_struct *workq;
@@ -835,6 +836,7 @@ struct kbase_csf_reset_gpu {
wait_queue_head_t wait;
struct rw_semaphore sem;
atomic_t state;
+ bool force_pm_hw_reset;
};
/**
diff --git a/mali_kbase/csf/mali_kbase_csf_reset_gpu.c b/mali_kbase/csf/mali_kbase_csf_reset_gpu.c
index 77aa3ce..4d9cc99 100644
--- a/mali_kbase/csf/mali_kbase_csf_reset_gpu.c
+++ b/mali_kbase/csf/mali_kbase_csf_reset_gpu.c
@@ -513,6 +513,9 @@ bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev, unsigned int flags)
/* Some other thread is already resetting the GPU */
return false;
+ if (flags & RESET_FLAGS_FORCE_PM_HW_RESET)
+ kbdev->csf.reset.force_pm_hw_reset = true;
+
return true;
}
KBASE_EXPORT_TEST_API(kbase_prepare_to_reset_gpu);
@@ -631,6 +634,7 @@ int kbase_reset_gpu_init(struct kbase_device *kbdev)
init_waitqueue_head(&kbdev->csf.reset.wait);
init_rwsem(&kbdev->csf.reset.sem);
+ kbdev->csf.reset.force_pm_hw_reset = false;
return 0;
}
diff --git a/mali_kbase/mali_kbase_reset_gpu.h b/mali_kbase/mali_kbase_reset_gpu.h
index ff631e9..a78a75a 100644
--- a/mali_kbase/mali_kbase_reset_gpu.h
+++ b/mali_kbase/mali_kbase_reset_gpu.h
@@ -151,6 +151,9 @@ void kbase_reset_gpu_assert_failed_or_prevented(struct kbase_device *kbdev);
/* This reset should be treated as an unrecoverable error by HW counter logic */
#define RESET_FLAGS_HWC_UNRECOVERABLE_ERROR ((unsigned int)(1 << 0))
+/* pixel: Powercycle the GPU instead of attempting a soft/hard reset (only used on CSF hw). */
+#define RESET_FLAGS_FORCE_PM_HW_RESET ((unsigned int)(1 << 1))
+
/**
* kbase_prepare_to_reset_gpu_locked - Prepare for resetting the GPU.
* @kbdev: Device pointer