summaryrefslogtreecommitdiff
path: root/mali_kbase/arbiter
diff options
context:
space:
mode:
authorSidath Senanayake <sidaths@google.com>2020-10-27 11:38:49 +0000
committerSidath Senanayake <sidaths@google.com>2020-10-27 11:38:49 +0000
commit72f2457ff7355ff0389efe5bc9cec3365362d8c4 (patch)
tree8f5fb993bd2a8eb181c880b180b6401b46f76620 /mali_kbase/arbiter
parentd4ca6eb7268ee2db9deabd1745b505c6e1c162f9 (diff)
downloadgpu-72f2457ff7355ff0389efe5bc9cec3365362d8c4.tar.gz
Mali Valhall DDK r27p0 KMD
Provenance: 7e6f74ec1 (collaborate/EAC/v_r27p0) VX504X08X-BU-00000-r27p0-01eac0 - Android DDK VX504X08X-SW-99006-r27p0-01eac0 - Android Renderscript AOSP parts VX504X08X-BU-60000-r27p0-01eac0 - Android Document Bundle VX504X08X-DC-11001-r27p0-01eac0 - Valhall Android DDK Software Errata Signed-off-by: Sidath Senanayake <sidaths@google.com> Change-Id: Ib59de731b034cc7e2631e35f1b0063b8f6894ecc
Diffstat (limited to 'mali_kbase/arbiter')
-rw-r--r--mali_kbase/arbiter/mali_kbase_arbif.c8
-rw-r--r--mali_kbase/arbiter/mali_kbase_arbiter_pm.c103
2 files changed, 71 insertions, 40 deletions
diff --git a/mali_kbase/arbiter/mali_kbase_arbif.c b/mali_kbase/arbiter/mali_kbase_arbif.c
index d193cb9..ddf1a0c 100644
--- a/mali_kbase/arbiter/mali_kbase_arbif.c
+++ b/mali_kbase/arbiter/mali_kbase_arbif.c
@@ -38,7 +38,7 @@ static void on_gpu_stop(struct device *dev)
{
struct kbase_device *kbdev = dev_get_drvdata(dev);
- KBASE_TLSTREAM_TL_EVENT_ARB_STOP_REQUESTED(kbdev, kbdev);
+ KBASE_TLSTREAM_TL_ARBITER_STOP_REQUESTED(kbdev, kbdev);
kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_STOP_EVT);
}
@@ -46,7 +46,7 @@ static void on_gpu_granted(struct device *dev)
{
struct kbase_device *kbdev = dev_get_drvdata(dev);
- KBASE_TLSTREAM_TL_EVENT_ARB_GRANTED(kbdev, kbdev);
+ KBASE_TLSTREAM_TL_ARBITER_GRANTED(kbdev, kbdev);
kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_GRANTED_EVT);
}
@@ -106,7 +106,7 @@ int kbase_arbif_init(struct kbase_device *kbdev)
err = arb_if->vm_ops.vm_arb_register_dev(arb_if,
kbdev->dev, &ops);
if (err) {
- dev_err(kbdev->dev, "Arbiter registration failed.\n");
+ dev_err(&pdev->dev, "Failed to register with arbiter\n");
module_put(pdev->dev.driver->owner);
return err;
}
@@ -149,7 +149,7 @@ void kbase_arbif_gpu_stopped(struct kbase_device *kbdev, u8 gpu_required)
if (arb_if && arb_if->vm_ops.vm_arb_gpu_stopped) {
dev_dbg(kbdev->dev, "%s\n", __func__);
- KBASE_TLSTREAM_TL_EVENT_ARB_STOPPED(kbdev, kbdev);
+ KBASE_TLSTREAM_TL_ARBITER_STOPPED(kbdev, kbdev);
arb_if->vm_ops.vm_arb_gpu_stopped(arb_if, gpu_required);
}
}
diff --git a/mali_kbase/arbiter/mali_kbase_arbiter_pm.c b/mali_kbase/arbiter/mali_kbase_arbiter_pm.c
index 6c35e16..02b5de2 100644
--- a/mali_kbase/arbiter/mali_kbase_arbiter_pm.c
+++ b/mali_kbase/arbiter/mali_kbase_arbiter_pm.c
@@ -189,6 +189,7 @@ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
err = kbase_arbif_init(kbdev);
if (err) {
+ dev_err(kbdev->dev, "Failed to initialise arbif module\n");
goto arbif_init_fail;
}
if (kbdev->arb.arb_if) {
@@ -214,9 +215,10 @@ void kbase_arbiter_pm_early_term(struct kbase_device *kbdev)
struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
mutex_lock(&arb_vm_state->vm_state_lock);
- if (arb_vm_state->vm_state > KBASE_VM_STATE_STOPPED_GPU_REQUESTED)
+ if (arb_vm_state->vm_state > KBASE_VM_STATE_STOPPED_GPU_REQUESTED) {
+ kbase_pm_set_gpu_lost(kbdev, false);
kbase_arbif_gpu_stopped(kbdev, false);
-
+ }
mutex_unlock(&arb_vm_state->vm_state_lock);
kbase_arbif_destroy(kbdev);
destroy_workqueue(arb_vm_state->vm_arb_wq);
@@ -271,6 +273,7 @@ void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev)
break;
}
+ kbase_pm_set_gpu_lost(kbdev, false);
kbase_arbif_gpu_stopped(kbdev, request_gpu);
}
@@ -291,6 +294,7 @@ static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
&arb_vm_state->vm_resume_work);
break;
case KBASE_VM_STATE_SUSPEND_WAIT_FOR_GRANT:
+ kbase_pm_set_gpu_lost(kbdev, false);
kbase_arbif_gpu_stopped(kbdev, false);
kbase_arbiter_pm_vm_set_state(kbdev, KBASE_VM_STATE_SUSPENDED);
break;
@@ -347,6 +351,7 @@ static void kbase_arbiter_pm_vm_gpu_stop(struct kbase_device *kbdev)
static void kbase_gpu_lost(struct kbase_device *kbdev)
{
struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
+ bool handle_gpu_lost = false;
lockdep_assert_held(&arb_vm_state->vm_state_lock);
@@ -357,31 +362,38 @@ static void kbase_gpu_lost(struct kbase_device *kbdev)
dev_warn(kbdev->dev, "GPU lost in state %s",
kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
kbase_arbiter_pm_vm_gpu_stop(kbdev);
- mutex_unlock(&arb_vm_state->vm_state_lock);
- kbase_pm_handle_gpu_lost(kbdev);
- mutex_lock(&arb_vm_state->vm_state_lock);
+ handle_gpu_lost = true;
break;
case KBASE_VM_STATE_STOPPING_IDLE:
case KBASE_VM_STATE_STOPPING_ACTIVE:
case KBASE_VM_STATE_SUSPEND_PENDING:
- dev_info(kbdev->dev, "GPU lost while stopping");
- mutex_unlock(&arb_vm_state->vm_state_lock);
- kbase_pm_handle_gpu_lost(kbdev);
- mutex_lock(&arb_vm_state->vm_state_lock);
+ dev_dbg(kbdev->dev, "GPU lost while stopping");
+ handle_gpu_lost = true;
break;
case KBASE_VM_STATE_SUSPENDED:
case KBASE_VM_STATE_STOPPED:
case KBASE_VM_STATE_STOPPED_GPU_REQUESTED:
- dev_info(kbdev->dev, "GPU lost while already stopped");
+ dev_dbg(kbdev->dev, "GPU lost while already stopped");
break;
case KBASE_VM_STATE_SUSPEND_WAIT_FOR_GRANT:
- dev_info(kbdev->dev, "GPU lost while waiting to suspend");
+ dev_dbg(kbdev->dev, "GPU lost while waiting to suspend");
kbase_arbiter_pm_vm_set_state(kbdev, KBASE_VM_STATE_SUSPENDED);
break;
default:
break;
}
-
+ if (handle_gpu_lost) {
+ /* Releasing the VM state lock here is safe because
+ * we are guaranteed to be in either STOPPING_IDLE,
+ * STOPPING_ACTIVE or SUSPEND_PENDING at this point.
+ * The only transitions that are valid from here are to
+ * STOPPED, STOPPED_GPU_REQUESTED or SUSPENDED which can
+ * only happen at the completion of the GPU lost handling.
+ */
+ mutex_unlock(&arb_vm_state->vm_state_lock);
+ kbase_pm_handle_gpu_lost(kbdev);
+ mutex_lock(&arb_vm_state->vm_state_lock);
+ }
}
static inline bool kbase_arbiter_pm_vm_os_suspend_ready_state(
@@ -506,7 +518,7 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
kbase_arbiter_pm_vm_gpu_stop(kbdev);
break;
case KBASE_VM_GPU_LOST_EVT:
- dev_info(kbdev->dev, "KBASE_ARBIF_GPU_LOST_EVT!");
+ dev_dbg(kbdev->dev, "KBASE_ARBIF_GPU_LOST_EVT!");
kbase_gpu_lost(kbdev);
break;
case KBASE_VM_OS_SUSPEND_EVENT:
@@ -530,7 +542,7 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
case KBASE_VM_REF_EVENT:
switch (arb_vm_state->vm_state) {
case KBASE_VM_STATE_STARTING:
- KBASE_TLSTREAM_TL_EVENT_ARB_STARTED(kbdev, kbdev);
+ KBASE_TLSTREAM_TL_ARBITER_STARTED(kbdev, kbdev);
/* FALL THROUGH */
case KBASE_VM_STATE_IDLE:
kbase_arbiter_pm_vm_set_state(kbdev,
@@ -547,15 +559,21 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
break;
case KBASE_VM_GPU_INITIALIZED_EVT:
- lockdep_assert_held(&kbdev->pm.lock);
- if (kbdev->pm.active_count > 0) {
- kbase_arbiter_pm_vm_set_state(kbdev,
- KBASE_VM_STATE_ACTIVE);
- kbase_arbif_gpu_active(kbdev);
- } else {
- kbase_arbiter_pm_vm_set_state(kbdev,
- KBASE_VM_STATE_IDLE);
- kbase_arbif_gpu_idle(kbdev);
+ switch (arb_vm_state->vm_state) {
+ case KBASE_VM_STATE_INITIALIZING_WITH_GPU:
+ lockdep_assert_held(&kbdev->pm.lock);
+ if (kbdev->pm.active_count > 0) {
+ kbase_arbiter_pm_vm_set_state(kbdev,
+ KBASE_VM_STATE_ACTIVE);
+ kbase_arbif_gpu_active(kbdev);
+ } else {
+ kbase_arbiter_pm_vm_set_state(kbdev,
+ KBASE_VM_STATE_IDLE);
+ kbase_arbif_gpu_idle(kbdev);
+ }
+ break;
+ default:
+ break;
}
break;
@@ -566,6 +584,8 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
mutex_unlock(&arb_vm_state->vm_state_lock);
}
+KBASE_EXPORT_TEST_API(kbase_arbiter_pm_vm_event);
+
static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev)
{
struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
@@ -592,6 +612,7 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
{
struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
+ int res = 0;
if (kbdev->arb.arb_if) {
mutex_lock(&arb_vm_state->vm_state_lock);
@@ -612,21 +633,31 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
if (suspend_handler !=
KBASE_PM_SUSPEND_HANDLER_NOT_POSSIBLE) {
- if (suspend_handler ==
- KBASE_PM_SUSPEND_HANDLER_VM_GPU_GRANTED
- ||
- kbdev->pm.active_count > 0)
- break;
- mutex_unlock(&arb_vm_state->vm_state_lock);
- mutex_unlock(&kbdev->pm.lock);
- mutex_unlock(&js_devdata->runpool_mutex);
- return 1;
- }
+ /* In case of GPU lost, even if
+ * active_count > 0, we no longer have GPU
+ * access
+ */
+ if (kbase_pm_is_gpu_lost(kbdev))
+ res = 1;
- if (arb_vm_state->vm_state ==
- KBASE_VM_STATE_INITIALIZING_WITH_GPU)
+ switch (suspend_handler) {
+ case KBASE_PM_SUSPEND_HANDLER_DONT_INCREASE:
+ res = 1;
+ break;
+ case KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE:
+ if (kbdev->pm.active_count == 0)
+ res = 1;
+ break;
+ case KBASE_PM_SUSPEND_HANDLER_VM_GPU_GRANTED:
+ break;
+ default:
+ WARN(1, "Unknown suspend_handler\n");
+ res = 1;
+ break;
+ }
break;
+ }
/* Need to synchronously wait for GPU assignment */
arb_vm_state->vm_arb_users_waiting++;
@@ -641,5 +672,5 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
}
mutex_unlock(&arb_vm_state->vm_state_lock);
}
- return 0;
+ return res;
}