summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Diver <diverj@google.com>2023-08-04 09:00:14 +0000
committerJack Diver <diverj@google.com>2023-08-22 09:52:21 +0000
commitea8e91921ea617dcdad9cee5b113cf0089a0eed0 (patch)
treea1bf22283a3d80470350e0f6e27100e2995aefba
parentd5304c2fbb0c4fbc9c4ded32d032d00cbc1cd39c (diff)
downloadgpu-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.c45
-rw-r--r--mali_kbase/mmu/mali_kbase_mmu.h5
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.