diff options
author | Jack Diver <diverj@google.com> | 2023-08-04 09:00:14 +0000 |
---|---|---|
committer | Jack Diver <diverj@google.com> | 2023-08-22 09:52:21 +0000 |
commit | ea8e91921ea617dcdad9cee5b113cf0089a0eed0 (patch) | |
tree | a1bf22283a3d80470350e0f6e27100e2995aefba | |
parent | d5304c2fbb0c4fbc9c4ded32d032d00cbc1cd39c (diff) | |
download | gpu-ea8e91921ea617dcdad9cee5b113cf0089a0eed0.tar.gz |
mali_kbase: refactor kbase_mmu_update_pages
Refactor kbase_mmu_update_pages, extracting flush/invalidate into new
function.
Expose no-flush variant.
Test: Build, boot
Bug: 294167925
Signed-off-by: Jack Diver <diverj@google.com>
(cherry picked from https://partner-android-review.googlesource.com/q/commit:b36ce28e0779c27e57dad90d98c5e202eb654013)
Merged-In: I4d1fce75d6ccf352ee54935138d6c92cdc609049
Change-Id: I4d1fce75d6ccf352ee54935138d6c92cdc609049
-rw-r--r-- | mali_kbase/mmu/mali_kbase_mmu.c | 45 | ||||
-rw-r--r-- | mali_kbase/mmu/mali_kbase_mmu.h | 5 |
2 files changed, 30 insertions, 20 deletions
diff --git a/mali_kbase/mmu/mali_kbase_mmu.c b/mali_kbase/mmu/mali_kbase_mmu.c index c689a63..ccbd9c3 100644 --- a/mali_kbase/mmu/mali_kbase_mmu.c +++ b/mali_kbase/mmu/mali_kbase_mmu.c @@ -348,10 +348,6 @@ static void kbase_mmu_sync_pgd(struct kbase_device *kbdev, struct kbase_context * a 4kB physical page. */ -static int kbase_mmu_update_pages_no_flush(struct kbase_device *kbdev, struct kbase_mmu_table *mmut, - u64 vpfn, struct tagged_addr *phys, size_t nr, - unsigned long flags, int group_id, u64 *dirty_pgds); - /** * kbase_mmu_update_and_free_parent_pgds() - Update number of valid entries and * free memory of the page directories @@ -3131,7 +3127,7 @@ KBASE_EXPORT_TEST_API(kbase_mmu_teardown_pages); * Return: 0 if the attributes data in page table entries were updated * successfully, otherwise an error code. */ -static int kbase_mmu_update_pages_no_flush(struct kbase_device *kbdev, struct kbase_mmu_table *mmut, +int kbase_mmu_update_pages_no_flush(struct kbase_device *kbdev, struct kbase_mmu_table *mmut, u64 vpfn, struct tagged_addr *phys, size_t nr, unsigned long flags, int const group_id, u64 *dirty_pgds) { @@ -3237,9 +3233,30 @@ static int kbase_mmu_update_pages_common(struct kbase_device *kbdev, struct kbas unsigned long flags, int const group_id) { int err; - struct kbase_mmu_hw_op_param op_param; u64 dirty_pgds = 0; struct kbase_mmu_table *mmut; + +#if !MALI_USE_CSF + if (unlikely(kctx == NULL)) + return -EINVAL; + + mmut = &kctx->mmu; +#else + mmut = kctx ? &kctx->mmu : &kbdev->csf.mcu_mmu; +#endif + + err = kbase_mmu_update_pages_no_flush(kbdev, mmut, vpfn, phys, nr, flags, group_id, + &dirty_pgds); + + kbase_mmu_flush_invalidate_update_pages(kbdev, kctx, vpfn, nr, dirty_pgds); + + return err; +} + +void kbase_mmu_flush_invalidate_update_pages(struct kbase_device *kbdev, struct kbase_context *kctx, u64 vpfn, + size_t nr, u64 dirty_pgds) +{ + struct kbase_mmu_hw_op_param op_param; /* Calls to this function are inherently asynchronous, with respect to * MMU operations. */ @@ -3248,23 +3265,13 @@ static int kbase_mmu_update_pages_common(struct kbase_device *kbdev, struct kbas #if !MALI_USE_CSF if (unlikely(kctx == NULL)) - return -EINVAL; + return; as_nr = kctx->as_nr; - mmut = &kctx->mmu; #else - if (kctx) { - mmut = &kctx->mmu; - as_nr = kctx->as_nr; - } else { - mmut = &kbdev->csf.mcu_mmu; - as_nr = MCU_AS_NR; - } + as_nr = kctx ? kctx->as_nr : MCU_AS_NR; #endif - err = kbase_mmu_update_pages_no_flush(kbdev, mmut, vpfn, phys, nr, flags, group_id, - &dirty_pgds); - op_param = (const struct kbase_mmu_hw_op_param){ .vpfn = vpfn, .nr = nr, @@ -3278,8 +3285,6 @@ static int kbase_mmu_update_pages_common(struct kbase_device *kbdev, struct kbas mmu_flush_invalidate_on_gpu_ctrl(kbdev, kctx, as_nr, &op_param); else mmu_flush_invalidate(kbdev, kctx, as_nr, &op_param); - - return err; } int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, struct tagged_addr *phys, diff --git a/mali_kbase/mmu/mali_kbase_mmu.h b/mali_kbase/mmu/mali_kbase_mmu.h index 49b42e0..861a5f4 100644 --- a/mali_kbase/mmu/mali_kbase_mmu.h +++ b/mali_kbase/mmu/mali_kbase_mmu.h @@ -289,6 +289,11 @@ int kbase_mmu_migrate_page(struct tagged_addr old_phys, struct tagged_addr new_p void kbase_mmu_flush_pa_range(struct kbase_device *kbdev, struct kbase_context *kctx, phys_addr_t phys, size_t size, enum kbase_mmu_op_type flush_op); +void kbase_mmu_flush_invalidate_update_pages(struct kbase_device *kbdev, struct kbase_context *kctx, u64 vpfn, + size_t nr, u64 dirty_pgds); +int kbase_mmu_update_pages_no_flush(struct kbase_device *kbdev, struct kbase_mmu_table *mmut, + u64 vpfn, struct tagged_addr *phys, size_t nr, + unsigned long flags, int group_id, u64 *dirty_pgds); /** * kbase_mmu_bus_fault_interrupt - Process a bus fault interrupt. |