diff options
author | Sidath Senanayake <sidaths@google.com> | 2021-01-29 15:03:53 +0000 |
---|---|---|
committer | Sidath Senanayake <sidaths@google.com> | 2021-01-29 15:03:53 +0000 |
commit | 9748305a584b9f1f7705303ce6e33a5e8b923e60 (patch) | |
tree | a73788e1d912a3202db3a99018002e0858e9a948 /mali_kbase/mali_kbase_ctx_sched.c | |
parent | 201c8bfb4637601363b6e9283f3bdc510711a226 (diff) | |
download | gpu-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.c | 68 |
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 |