From 9748305a584b9f1f7705303ce6e33a5e8b923e60 Mon Sep 17 00:00:00 2001 From: Sidath Senanayake Date: Fri, 29 Jan 2021 15:03:53 +0000 Subject: 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 Change-Id: Ie0904c9223b7ec9311b848a52d3159ac2b07530e --- mali_kbase/mali_kbase_ctx_sched.c | 68 +++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 6 deletions(-) (limited to 'mali_kbase/mali_kbase_ctx_sched.c') 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 -- cgit v1.2.3