summaryrefslogtreecommitdiff
path: root/mali_kbase/mali_kbase_ctx_sched.c
diff options
context:
space:
mode:
authorSidath Senanayake <sidaths@google.com>2021-01-29 15:03:53 +0000
committerSidath Senanayake <sidaths@google.com>2021-01-29 15:03:53 +0000
commit9748305a584b9f1f7705303ce6e33a5e8b923e60 (patch)
treea73788e1d912a3202db3a99018002e0858e9a948 /mali_kbase/mali_kbase_ctx_sched.c
parent201c8bfb4637601363b6e9283f3bdc510711a226 (diff)
downloadgpu-9748305a584b9f1f7705303ce6e33a5e8b923e60.tar.gz
Mali Valhall DDK r29p0 KMD
Provenance: afaca8da1 (collaborate/EAC/v_r29p0) VX504X08X-BU-00000-r29p0-01eac0 - Valhall Android DDK VX504X08X-BU-60000-r29p0-01eac0 - Valhall Android Document Bundle VX504X08X-DC-11001-r29p0-01eac0 - Valhall Android DDK Software Errata VX504X08X-SW-99006-r29p0-01eac0 - Valhall Android Renderscript AOSP parts Signed-off-by: Sidath Senanayake <sidaths@google.com> Change-Id: Ie0904c9223b7ec9311b848a52d3159ac2b07530e
Diffstat (limited to 'mali_kbase/mali_kbase_ctx_sched.c')
-rw-r--r--mali_kbase/mali_kbase_ctx_sched.c68
1 files changed, 62 insertions, 6 deletions
diff --git a/mali_kbase/mali_kbase_ctx_sched.c b/mali_kbase/mali_kbase_ctx_sched.c
index 70b498a..953db9e 100644
--- a/mali_kbase/mali_kbase_ctx_sched.c
+++ b/mali_kbase/mali_kbase_ctx_sched.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
/*
*
* (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
@@ -44,7 +45,8 @@ int kbase_ctx_sched_init(struct kbase_device *kbdev)
int as_present = (1U << kbdev->nr_hw_address_spaces) - 1;
/* These two must be recalculated if nr_hw_address_spaces changes
- * (e.g. for HW workarounds) */
+ * (e.g. for HW workarounds)
+ */
kbdev->nr_user_address_spaces = kbdev->nr_hw_address_spaces;
kbdev->as_free = as_present; /* All ASs initially free */
@@ -259,7 +261,7 @@ struct kbase_context *kbase_ctx_sched_as_to_ctx_refcount(
found_kctx = kbdev->as_to_kctx[as_nr];
- if (found_kctx != NULL)
+ if (!WARN_ON(found_kctx == NULL))
kbase_ctx_sched_retain_ctx_refcount(found_kctx);
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
@@ -273,23 +275,35 @@ struct kbase_context *kbase_ctx_sched_as_to_ctx(struct kbase_device *kbdev,
unsigned long flags;
struct kbase_context *found_kctx;
+ spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+ found_kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as_nr);
+
+ spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+ return found_kctx;
+}
+
+struct kbase_context *kbase_ctx_sched_as_to_ctx_nolock(
+ struct kbase_device *kbdev, size_t as_nr)
+{
+ struct kbase_context *found_kctx;
+
if (WARN_ON(kbdev == NULL))
return NULL;
if (WARN_ON(as_nr >= BASE_MAX_NR_AS))
return NULL;
- spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+ lockdep_assert_held(&kbdev->hwaccess_lock);
found_kctx = kbdev->as_to_kctx[as_nr];
if (found_kctx) {
- if (WARN_ON(atomic_read(&found_kctx->refcount) <= 0))
+ if (atomic_read(&found_kctx->refcount) <= 0)
found_kctx = NULL;
}
- spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
return found_kctx;
}
@@ -351,3 +365,45 @@ void kbase_ctx_sched_release_ctx_lock(struct kbase_context *kctx)
spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, flags);
}
+
+#if MALI_USE_CSF
+bool kbase_ctx_sched_refcount_mmu_flush(struct kbase_context *kctx,
+ bool sync)
+{
+ struct kbase_device *kbdev;
+ bool added_ref = false;
+ unsigned long flags;
+
+ if (WARN_ON(kctx == NULL))
+ return added_ref;
+
+ kbdev = kctx->kbdev;
+
+ if (WARN_ON(kbdev == NULL))
+ return added_ref;
+
+ mutex_lock(&kbdev->mmu_hw_mutex);
+ spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+ added_ref = kbase_ctx_sched_inc_refcount_nolock(kctx);
+
+ WARN_ON(added_ref &&
+ (kctx->mmu_flush_pend_state != KCTX_MMU_FLUSH_NOT_PEND));
+
+ if (!added_ref && (kctx->as_nr != KBASEP_AS_NR_INVALID)) {
+ enum kbase_ctx_mmu_flush_pending_state new_state =
+ sync ? KCTX_MMU_FLUSH_PEND_SYNC :
+ KCTX_MMU_FLUSH_PEND_NO_SYNC;
+
+ WARN_ON(kctx != kbdev->as_to_kctx[kctx->as_nr]);
+
+ if (kctx->mmu_flush_pend_state != KCTX_MMU_FLUSH_PEND_SYNC)
+ kctx->mmu_flush_pend_state = new_state;
+ }
+
+ spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+ mutex_unlock(&kbdev->mmu_hw_mutex);
+
+ return added_ref;
+}
+#endif